J’ai lu pour vous : Programmation concurrente en JAVA

programConcurrente

de Brian Goetz

Je viens de boucler l’un des livres les plus techniques que j’ai lu récemment : « Programmation concurrente en JAVA ».

Livre très intéressant s’il en est, il n’en reste pas moins difficile d’accès. Il est placé dans la collection « Référence » de l’éditeur et ne se contente donc pas d’effleurer le sujet. Ce livre s’adresse donc aux personnes ayant déjà une bonne connaissance de JAVA et des notions de programmation concurrente.

Autant le dire tout de suite, j’ai deux avis sur ce livre. D’un côté je l’ai trouvé parfois indigeste, c’est rare que je mette autant de temps pour lire un livre d’ailleurs, mais d’un autre côté je l’ai trouvé très intéressant et utile.

Indigeste, déjà car le sujet est complexe. Le RER n’est pas le lieu le plus propice pour lire certains chapitres ^^ De plus le style employé est assez lourd, je ne sais pas si ça vient de la traduction ou de la version originale.

Intéressant cependant car JAVA 5 apporte vraiment un grand nombre de nouveauté, certaines que j’ai même appris en lisant ce livre. D’ailleurs pour ne rien cacher, j’ai même mieux compris comment utiliser certains éléments qui existaient déjà en JAVA 4.

Utile enfin car j’ai récemment mis à profit ces nouvelles connaissances sur un sujet complexe qui nécessitait de bien connaître les problématiques de concurrence d’accès. Les premiers chapitres qui portent sur les concepts sont très intéressants. On lit différemment un programme par la suite et on porte beaucoup plus attention à certains détails qui passaient avant inaperçu.

Bref, malgré son style un peu déroutant parfois, je recommande vivement la lecture de ce livre. Que vous fassiez du client lourd ou du client léger, vous n’échapperez pas à l’utilisation des Threads alors prenez les bons réflexes le plus rapidement possible.

 

 

 


Nouveau forum dédié à Play sur developpez.com


Vous vous rappelez de Play! ? J’en avais parlé dans un précédent billet. Toujours très actif, les versions 1.0.1 et 1.0.2 sont sortis depuis la dernière fois.

Mais de façon plus notable, la communauté commence à s’organiser autour de ce framework avec un repository séparé pour les modules qui commence à prendre forme et surtout, l’objet de mon billet, une section dédiée sur les forums de developpez.com !

Bien évidemment vous avez toujours la possibilité de passer par le groupe de discussion google surtout que Guillaume Bort est très réactif dessus.

 

 

Sortie d’un plugin Jira : jira-order-plugin

J’avais déjà parlé de Jira et des possibilités de personnalisation dans un précédent article. Ici plus exactement.

Cette fois-ci c’est un nouveau plugin que je sors des cartons, Jira order plugin, une fille d’attente pour gérer des fiches par ordre de priorité.

 

Principe de fonctionnement

Pour résumer, le principe de ce plugin est assez simple, il permet de créer une file d’attente des fiches à traiter.

Mais pourquoi une file d’attente alors qu’on a déjà une priorité sur les fiches me direz-vous ? Ne vous est-il jamais arrivé d’avoir 200 fiches ouvertes dans votre projet avec 20 fiches à traiter d’urgence sans parler du reste ? Ok et dans ce cas là quelle est votre stratégie ? Traiter toutes les demandes urgentes d’un coup ? Les traiter dans un ordre aléatoire ?

Parfois on voit des managers qui vont de nouveau reprioriser leur fiches urgentes avec des priorités « urgentes ++ » en créant donc un nouveau stade d’urgence. Bon super, et après, on créé un « urgente +++ », « plus urgente tu meurs » etc… L’autre idée c’est de définir leur ordre de traitement de façon linéaire à travers une file d’attente.

Mais bon, pas envie de gérer sans arrêt les ajouts dans la file d’attente, dans ce cas le plugin va calculer automatiquement la position d’une nouvelle fiche entrée dans le système à partir de sa priorité et de sa date de création. Et voilà, vous avez les grandes lignes directrices de ce plugin :

  • file d’attente des fiches à traiter
  • calcul de la position initiale des fiches dans la file à partir de leur priorité et de la date de création
  • recalcul de la position des fiches dans la file après un déplacement ou un changement d’état

Concrètement la visualisation de cette file d’attente utilise le navigateur de fiches :

issueorder

On remarquera sur l’image la colonne « Issue ordering » qui représente notre Custom field configuré pour apparaître dans le navigateur de fiches.

Et sous le capot, ça marche comment ?

Plus complexe que le précédent plugin, cette fois-ci il s’agit :

  • d’un custom field
  • d’un listener qui écoute les changements d’états des fiches
  • d’un service qui réordonne les fiches régulièrement
  • d’une action webwork combiné avec Jquery pour un réarrangement manuel de l’ordre des fiches

Jquery

Parmi les éléments techniques intéressants ici je citerais notamment l’utilisation de Jquery pour la partie Drag and drop qui permet de repositionner les fiches manuellement.

Dans le template Velocity j’utilise un bout de code Jquery pour chaque valeur de champ

$('#rankHkn${index}').draggable({ axis: 'y', cursor: 'crosshair', opacity: 0.35, revert: true });
$('.droppable').droppable({drop: function ( event, ui) {displayMessageOrderField(ui.draggable.attr("id"),this); }});

Et voilà, en deux lignes à peine j’obtiens la possibilité de faire du Drag and Drop sans être vraiment expert JavaScript moi-même ^^

On notera que ${index} est interprété par Velocity lors de la création de la page, alors que $(‘.droppable’) n’ayant pas été interprété par Velocity, il apparaît tel quel dans la page HTML et sera donc utilisé comme sélecteur CSS par JQuery. L’utilisation du $ dans les templates Velocity pour deux choses distinctes peut amener bien des surprises si on n’y fait pas gaffe.

Un petit brin d’ergonomie, évitez l’attente

Vous vous souvenez, plus haut j’ai écrit que les fiches étaient automatiquement placés dans la file d’attente lors de leur création en fonction de certains critères. Ok mais du coup ca implique un calcul. Rapide sur une petite instance, ce calcul peut facilement prendre du temps sur une instance Jira avec un grand nombre de fiches. Et ce temps on veut éviter de l’infliger à l’utilisateur qui voulait juste créer une fiche, lui.

Toute l’astuce a donc été ici d’utiliser un design pattern assez simple, le producteur consommateur :

  • le producteur c’est l’utilisateur, à la création d’une fiche (ou sa modif) il empile l’action dans une file d’évènement
  • le consommateur c’est un service Jira qui dépile cette file pour traiter les évènements

Du coup, pas d’attente pour l’utilisateur car l’ajout dans la pile est rapide. Le défaut c’est par contre d’avoir une actualisation de la position dans la file d’attente plus lente, après le passage du service uniquement.

Et côté implémentation en Java, rien de mieux que l’utilisation d’une BlockingQueue qui permet de gérer correctement la concurrence d’accès à l’ajout et la lecture dans la pile.

Où trouver tout ça

Bon, si le plugin vous intéresse, vous pouvez le trouver sur le plugins exchange ou sur sa page Confluence.

Et si le code vous intéresse, celui-ci est accessible via svn ici.

 

Luke, que la force soit avec toi !

Vous connaissez Lucene ? Non ? Dans ce cas je vous invite fortement à découvrir cette API utilisé dans de nombreux projets passant de Jira à LinkedIn. Cette API de recherche full-text permet de maintenir des index textuels très puissants. Sa récente intégration avec Hibernate devrait d’ailleurs la populariser encore plus.

Et parmi les outils autour de Lucene, je vous invite à découvrir Luke, et que la force soit avec vous (je sais elle était assez facile celle là…).

« Mais Luke c’est quoi au juste ? »

Luke c’est tout simplement un outils de visualisation des index Lucene.

« Et ça sert à quoi ? »

Hum, si vous avez déjà bossé avec des bases de données, et j’imagine que c’est le cas, vous avez surement eu le besoin de visualiser votre base de données sans passer par votre application. Vous avez utilisé des Toad, PhpMyAdmin, Sybase central etc… Eh bien Luke c’est l’équivalent pour un index Lucene.

« Ok, et çà se trouve où ? Ça se présente comment ? »

Deux sites sont disponibles :

Personnellement j’aime bien l’ancien site car il y a un lien jnlp ce qui permet de lancer Luke en ligne via Java Webstart directement.

Prenons un exemple, je lance le logiciel. Une fois lancé j’ai la possibilité de choisir un répertoire où se trouve un index Lucene (ici un index créé par Jira) :

ouverturefichier

Une fois ouvert j’ai à disposition un ensemble d’outils bien pratique : vue générale, parcours des documents, recherche Lucene etc…

ouverturefichier browse

Le reste je vous le laisse découvrir, c’est simple mais bien pratique lorsqu’on travaille avec Lucene.

 

Intégration GWT-maven-spring-hibernate-spring security-smartGWT

Ca y est, l’article que j’avais démarré sur GWT et son intégration avec Spring, maven, SmartGwt et Hibernate est enfin sorti dans sa version finale. Il s’en est fallu du temps mais désormais vous pouvez le lire dans son intégralité sur developpez.com, sur cette page plus exactement.

Pour le résumer en quelques lignes, si vous vous êtes retrouvé dans ma situation et que vous avez tenté une première approche rapide de GWT, vous avez sans doute eu du mal à démarrer une vraie application. Attention je ne parle pas d’une application « à la Hello World ! », je parle d’une application un peu plus complète, avec un build automatisé, avec une gestion de la sécurité, une couche de persistence etc…

Ayant été dans ce cas de figure, j’ai décidé de m’atteler à un article un peu plus complet qui regrouperait justement toutes les petites briques qui m’a manqué.

Donc en gros ça parle de quoi :

  • de Spring, pour avoir une bonne glue
  • de Hibernate, pour la couche persistance
  • de SmartGWT, pour avoir une interface qui fouette un peu
  • de Maven, pour être capable de lier tout ça ensemble

Et pour vous donner un avant goût, voici le plan :


I. Introduction
II. Création du projet
 II-A. Plugin eclipse
 II-B. Plugin maven
III. Séparation des projets
 III-A. Inclusion de source externe dans le module GWT
 III-B. Le mode noServer
 III-C. Le lancement de la partie serveur dans cargo
IV. Partie cliente
 IV-A. Wrapper or not wrapper
 IV-B. Comparatif
 IV-C. SmartGWT
V. Spring
 V-A. Installation des dépendances
 V-B. Chargement de l'application context
 V-C. Stratégies d'intégration
VI. GWT-SL
 VI-A. Présentation
 VI-B. Modification du pom
 VI-C. Ajout de la servlet de dispatch
 VI-D. Création d'un service RPC
 VI-E. Exportation du service
VII. Spring-security
 VII-A. Introduction
 VII-B. Mise en oeuvre
 VII-C. Le service d'authentification
 VII-D. Le contexte Spring
 VII-E. La partie cliente
 VII-F. Sécuriser vos appels RPC
VIII. Hibernate
 VIII-A. Problématique
 VIII-B. Modèle
 VIII-C. Configuration spring
 VIII-D. Résultat
IX. Conclusion
 IX-A. Remerciements
 IX-B. Références

 

 

 

Obtenir une ceinture noire en Java, ça vous tente ?

Au hasard de mes pérégrinations sur le web, je suis tombé sur un site assez amusant et assez bien foutu pour tester son niveau en Java : Java Blackbelt.

Ce site propose en effet de passer des certifications sous forme de ceintures de couleur, comme dans les arts martiaux. Ah, il ne m’en fallait pas plus pour m’attirer ^^ Ayant fait quelques arts martiaux et aimant l’apprentissage par le jeu, je me suis inscrit histoire de tester.

Eh bien chapeau, ce site est bien foutu, enrichie par les membres et relativement riche par rapport aux domaines abordées : notions de java de base, collections, io, reflexion, regexp, mais aussi spring, ant, maven etc…

Au final c’est un grand nombre de questionnaires et d’une difficulté progressive qui vous donnera du fil à retordre.

Personnellement en 3 questionnaires je suis à peine arrivé ceinture jaune Embarassed. Bon enfin à ma décharge, un exam prend 15 minutes et les enchainer tous dans la même journée faut avoir du temps à perdre. Mais j’y reviendrais !

Bref, si vous avez envie

  • de vous tester
  • de vous entrainer pour de futurs tests techniques lors de vos entretiens d’embauche (pour ceux qui ont la malchance de tomber là-dessus…)
  • de frimer

Go on !

 

Substance, une librairie « hype » pour Swing

Mon dernier billet sur Swing pouvait paraître pessimiste puisque je parlais de cette API comme d’une API complexe et qui avait mal évolué avec notamment peu de frameworks autour.
« Peu » ne veut pas pour autant dire « aucun » et c’est justement l’occasion d’aborder Substance, une librairie bien sympathique créé par Kirill Grouchnikov.

A mon sens c’est l’une des librairies qui a le plus profité de la période 2006-2007 et des avancées matérialisées dans Aerith. Romain Guy, l’un des leaders sur Aerith, fait d’ailleurs partie des contributeurs de Substance pour ces précieux conseils.
Les effets de fading, les animations sur les boutons, les tables à couleurs alternées etc… voici des choses facilement abordables avec cette librairie. Attention, comme je l’évoquais dans mon billet « Swing or not Swing, that is the question« , il ne s’agit pas de nouvelles fonctionnalités de Swing mais de fonctionnalités existantes pour lesquelles la librairie propose des outils afin d’en faciliter l’usage.

Par exemple pour utiliser le fading lors de la surbrillange des éléments d’une liste :

JList list = ...; // create the list
FadeConfigurationManager.getInstance().allowFades(FadeKind.ROLLOVER, list);
FadeConfigurationManager.getInstance().allowFades(FadeKind.SELECTION, list);

Nettement plus simple que de le coder soi-même…

Pour voir un apercu de ce que cela peut donner une application est disponible via Java Webstart. Attention, à utiliser avec Java 6, c’est le prix de la modernité 😉

Je vous invite à jouer avec les options générales et notamment à cocher les options suivantes :

  • Focus loop
  • Icon glow
  • Icon rollover
  • Button press
  • Global fade events

Et observez le résultat sur les boutons à icône, tout simplement bluffant…

A cela ajoutez la prévisualisation des fenêtres minimisées, la notion de skin custom… et vous avez un framework que je ne saurais que trop vous conseiller.

Aperçu :

(attention, il est difficile de capturer l’essence d’une animation sur une image fixe, je vous invite à l’essayer par vous-mêmes)

Apercu de l’animation sur un bouton Prévisualisation d’une fenêtre minimisée
button preview

 

Swing or not Swing, that is the question

Peut-on faire un client lourd en Java ?

Ayant bossé en Java je me suis heurté à Swing comme on peut se heurter à un mur. Ouch, quand on vient du Web on déguste fort avec Java et son API pour client lourd.  Pour autant, la techno est elle valable ou non, et que vaut-elle par rapport à J2EE ?

Swing avant 2007

Avant 2007 Sun a clairement focalisé son attention sur J2EE ce qui leur a permis de gagner en popularité. Le nombre de frameworks existant et la richesse des librairies proposées lui ont permis de s’assoir durablement comme « langage pour faire du Web ».

Seulement voilà, à côté de ça J2SE, la partie réservée aux postes de travail, a par contre était délaissé. Pourquoi ? Selon James Gosling, la faute au conflit qui opposait alors Sun et Windows sur le déploiement de la JVM Windows sur les postes par défaut. Sun n’aurait pas souhaité s’investir dans J2SE tant que Windows proposerait sa JVM.

De l’avis du créateur de Java : « Aujourd’hui, Java sur le poste client n’est pas à la hauteur » et ce constat est facile à confirmer :

  • aucun framework Swing de réelle envergure : pas de JSF, Struts, Wicket, Tapestry etc… si on compare a J2EE
  • peu de librairies de composants : Swingx reste experimental.
  • un système de look and feel trop complexe, pour preuve le peu de boites capable de créer le leur en comparaison avec le nombre capable de créer des CSS

La difficulté de Swing, notamment la maitrise de la gestion événementielle et de l’EDT n’en font pas une partie de plaisir et au final ce n’est pas étonnant de trouver essentiellement des librairies payantes (Jide par exemple qui est très bon) alors qu’on peut en trouver gratuitement à foison en J2EE.

Swing depuis 2007

Mais voila, depuis 2007 Sun semble vouloir revenir sur J2SE :
– James Gosling, créateur de Java met en avant JavaFx
Swingx tente d’apporter du neuf avec objectif d’être intégré en Java 1.5
Aerith déjà présenté en 2006 devient open source , et oui, effectivement c’est une IHM qui déchire pas mal
– Romain Guy qui s’était fait connaitre sur Aerith publie avec Chett Haase un très bon bouquin : Filthy rich clients

Soyons honnête toutefois, le bouquin filthyrichclients s’il démontre qu’on peut faire du très bon travail avec Swing met aussi en évidence que ça ne s’adresse pas à tout le monde. Certaines notions comme le double buffering, les problématiques d’accélération matérielle, les notions de Composite ou de transformation d’images sont très techniques et mettent en oeuvre des notions mathématiques qui ne s’adressent pas à monsieur tout le monde. Qui n’a pas galéré des heures sur des problèmes de glitch graphique, de pixels gris etc…  ?

Et aujourd’hui ?

Et aujourd’hui 2009, cela me parait toujours moins rose.

  • JavaFx peine à décoller et son API n’est pas toujours pas stable (compatibilité 1.1 et 1.2 qui laisse à désirer). A côté de ça, ses concurrents directs comme Flex sont en plein boom avec notamment un sdk qui vient de sortir sur Eclipse
  • aucun framework n’a émergé pour cacher la complexité des concepts nés dans Aerith
  • Swingx est tellement peu mis à jour qu’il continue toujours à cibler Java 1.5, version en fin de support depuis cette année…

Pourquoi ce manque d’investissement de Sun depuis 2 ans ? Le rachat d’Oracle n’y serait pas étranger ou bien est-ce simplement que 2 ans reste un délai très court ? Nous verrons bien.

Mais personnellement j’ai tendance à être sceptique d’autant que la grande force de J2SE qui était la richesse de ses widgets et la réactivité de son interface est désormais sévèrement concurrencé par les interfaces Web. GWT ou JSF avec IceFaces apportent désormais la même richesse aux webapps et pour un cout nettement moindre.

En conclusion, je ne dénigre pas Swing et je pense que sa chance de survie va reposer comme beaucoup d’autres technologies sur la capacité à la communauté à proposer des outils, des composants, des best practices afin de cacher la complexité du langage. Mais à l’heure actuelle, si on me donne le choix, je partirais pour ma part sur du J2EE classique.

Créer des fichiers Excel avec des caractères Chinois en Java

Créer des fichiers Excel avec des caractères Chinois

Dans la lignée du post précédent, pourquoi ne pas continuer à parler de la Chine et aborder le sujet des exports de fichiers au format Excel.

Je vais aborder ici l’utilisation de POI et les problèmes que vous pourriez rencontrer avec des jeux de caractères exotiques.

 

Sur l’application sur laquelle je travaillais nous avions un module de transformation de fichiers CSV vers Excel.

L’implémentation de transformation repose sur POI, c’est une librairie assez simple et bien foutu pour créer des fichiers Excel.

L’algo est simple, je parcours la liste des valeurs et je crée des cellules au fur et à mesure en se basant sur un code de ce type (ici il s’agit d’une cellule au format texte) :

// row est une ligne excel créé précédemment, indexCol l'indice de colonne sur la ligne
HSSFCell cell = row.createCell(indexCol);
HSSFCellStyle textCellStyle = workbook.createCellStyle();
textCellStyle.setDataFormat(format.getFormat("General"));
cell.setCellStyle(textCellStyle);
cell.setCellValue(_value);

Seulement voila, avec cet algo on obtient un résultat un peu étrange lorsque nos données sont en Chinois :

exportbadchinese

Et je vous garantis, ce n’est pas du Chinois (même si l’un dans l’autre, je ne comprends aucun des deux…).

Solution

En fait il est nécessaire de rajouter cette petite indication à POI pour que ça se passe bien :

cell.setEncoding(HSSFCell.ENCODING_UTF_16);

Cette fois on obtient bien du Chinois dans notre fichier :

excelok

 

Astuce

J’en profite pour une petite astuce qui mérite d’être noté pour la partie purement CSV. Vous le savez sans doute, si vous utilisez un fichier csv avec l’extension xls vous pouvez aussi l’ouvrir dans Excel et celui-ci s’occupe de tout pour l’afficher comme un document « classique ».
Si vous utilisez un encodage ISO-latin1 pour vos fichiers textes sur vos postes Windows avec des caractères qui correspondent à ce charset, aucun souci, vous obtiendrez le résultat voulu.
Là où ça se corse, c’est quand vous passez en encodage UTF-8 avec des caractères Chinois. Pour le coup Excel ne sera plus capable de reconnaitre correctement votre encodage (pour l’anecdote, OpenOffice y arrive lui).

En fait il faut penser à rajouter un BOM en début de fichier pour qu’Excel ouvre correctement le fichier.

Pour cela, il suffit d’insérer le BOM en début de flux :

OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream(csv), FILE_ENCODING);
osw.write(0xFEFF);
....

 

Java : Travailller sur des ResourceBundle en Chinois

Travailller sur des ResourceBundle en Chinois

Au hasard de mes visites sur developpez.com je suis tombé sur le lien suivant :

http://blog.developpez.com/wichtounet/p8236/programmation/spring/utiliser-des-fichiers-utf-8-pour-l-inter/

Je viens récemment de travailler sur le portage de notre application en Chinois et bosser sur des fichiers de traduction en conservant les encodages a justement été un de nos problèmes et nous n’avons pas choisi la même solution. Du coup je fais partager ^^

Effectivement la solution de witchounet fonctionne, elle consiste à utiliser des ResourceBundle en UTF-8 directement. Il reste cependant la problématique de l’édition de ces fichiers, de l’échappement des caractères etc… Du coup pour les ResourceBundle Java on s’est plutôt orienté vers un plugin Eclipse : http://sourceforge.net/projects/eclipse-rbe/

Comment ça marche ?

Il s’agit ni plus ni moins d’un éditeur de ResourceBundle permettant d’afficher les clés du bundle associés aux traductions dans les différentes langues. Ses atouts majeurs :

  • échappement des caractères
  • encodage en unicode  (exemple : u8FDEu63A5u6D88u606Fu670Du52A1u5668u5931u8D25)
  • mise en évidence des traductions manquantes
  • création assistée d’un nouveau bundle avec les bons codes ISO pour la langue et le pays
  • vue en arbre ou vue plate

overview nouveau

Astuce

Allez quand même, pour la forme, une petite astuce qui nous a bien servi en début de projet lorsque les fichiers nous arrivaient dans des encodages exotiques.
Java est plutot bien fourni en utilitaire et il propose notamment un outils de conversion vers ascii : native2ascii

Petit exemple :

native2ascii -encoding GB2312 ResourceBundleHelper_zh.properties ResourceBundleHelper_zh.properties-NEW

Ca vous permet de retransformer vos fichiers envoyés par vos collègues Chinois en ascii. Et c’est bien pratique.