10 mars 2010

Fonzie s'invite dans Javac

http://www.wikio.fr



Julien Viet m'a suggéré une évolution sur Fonzie : Utilise le processeur d'annotations (APT) de JavaC à la place du compilo AspectJ.

AspectJ fait très bien l'affaire pour Fonzie mais apporte de nombreuses contraintes :
  • la compilation n'est pas des plus véloces,
  • l'environnement de dev AJDT est particulièrement gourmand,
  • le plugin AspectJ doit être configuré dans le build Maven.
Rien de bloquant, mais un ensemble de petites choses qui rendent Fonzie "moins" attractif qu'il le mérite (AMHA).

L'idée de Julien est de détourner APT pour s'intégrer directement dans la compilation JavaC, ce qui est possible depuis Java6 avec une API standard. En utilisant des API internes de javac (com.sum.tools*) on peut faire plus que transformer les annotations en fichiers de ressources ou en nouveau code Java -- l'objectif initial d'APT. On peut aller directement modifier le code source qui va être compilé - sa représentation AST plus précisément - sans toucher pour autant au fichier source.

Lombok utilise ce principe pour ajouter des getter/setter (entre autre) dans les beans. Plus besoin de polluer le code .java avec ces méthodes sans valeur, qui seront bel et bien présentes dans le code compilé.

Ca, c'est la théorie.

Reste à mettre en oeuvre. Même avec l'aide du code source de Julien (chromattic, reflext) et de Lombok, la manipulation des ces API internes est délicate, et leur code source n'est pas proposé dans le SRC.ZIP qui accompagne le JDK. Il y a heureusement google et OpenJDK pour retrouver ces sources, mais bien peu d'infos sur comment utiliser ces APIs.

Toujours est-il qu'un premier jet bien modeste - mais faut bien commencer par quelque chose - est en place. Sur la base de ce code source :
@Entity
public class User
{
public native void persist();
}
Pour un projet utilisant le JDK6 pour compiler, et sans rien faire sauf ajouter Fonzie-0.4-SNAPSHOT en dépendance, le fichier .class décompilé donne ceci :
@Entity
public class User
{
public void persist()
{
Fonzie.instance();
}
}
Pour ce premier jet, le code introduit dans la méthode n'est pas passionnant, mais au moins le squelette est en place. Reste à construire via l'AST le code d'invocation Fonzie qui va bien -- et ça, ça va être tout de suite plus toochy.

Wait & See ...

Libellés : ,

05 mars 2010

IE9 ... ça donne envie (presque)

http://www.wikio.fr



Microsoft publie le positionnement de IE9 sur le blog MSDN

Pas de lange de bois (pour une fois ?) : IE8 est nettement plus lent que ses concurrents, pour ceux qui ne l'auraient pas encore remarqué, et c'est un frein à l'adoption des "applis RIA". IE9 mise donc sur un moteur JS tout beau tout neuf qui devrait rattraper le retard pris sur les challengers. Le billet nous présente IE9 "today" comme comparable aux dernières versions des navigateurs, sans les dépasser, et ne nous sort même pas la promesse d'une version finale encore meilleure - ça nous change du discours habituel.

Autre info clé : MS prend en considération les nouveaux standards du web (HTML5, CSS3), "détail" sur lequel IE s'est jusqu'ici assis sans regrets. Une nouvelle fois, on ne nous promet rien mais on affiche déjà un 32% de réussite au test Acid3, ce qui laisse lire entre les lignes qu'un score plus élevé est envisagé pour la version finale. On a même droit à un bel exemple de bords arrondis, oh comme c'est joli.

Dernier point, IE9 fera appel à Direct2D pour son rendu graphique, ce qui boostera ses performances d'affichage. La première question qui me vient à l'esprit est de savoir COMMENT il est possible que les versions précédentes d'IE ne reposent pas sur cette API de base de Windows, pour un navigateur qui ne vise aucune autre plateforme. Autant je comprend que Mozilla ou WebKit tarde à s'y mettre vu que la couche graphique doit être portable, autant pour MS ça me semble inconcevable.

A ce rythme on va apprendre que Windows Media Player 12 va utiliser DirectShow et consommer 50% de CPU en moins - ce qui expliquerait des choses soit dit en passant :)


Libellés :

19 février 2010

Actu Maven … suite

http://www.wikio.fr

Après avoir pesté toute la journée d’hier sur Eclipse, je viens de penser à une piste pour résoudre mon problème :

J’ai utilisé dans mon POM le pseudo-plugin org.maven.ide.eclipse::lifecycle-mapping que proposait m2eclipse 0.9.9 pour activer la compilation incrémentale. En conservant ce plugin activé, m2eclipse 0.10 ne prend plus en charge la configuration d’Eclipse et je me retrouve donc avec mes soucis de WTP pas configuré et de target/generated-sources absents.

En virant ce plugin, m2eclipse 0.10 retrouve son mode nominal et la configuration se passe donc “comme dans le manuel”.

mea culpa donc, je suis un bête gars qui a essayé les pré-version et a cru que la compatibilité serait au rendez-vous, mais quel boulet celui-là.

J’ai tout de même posté sur le sujet sur user@m2eclipse.codehaus.org,  en espérant que ça puisse servir à d’autres.

Libellés :

18 février 2010

Actu Maven

http://www.wikio.fr

L’actu Maven du mois de février est chargé :

Le plugin Maven-Release passe (enfin) en 2.0, vous pouvez donc profiter d’un mécanisme très complet et bien ficelé de gestion des releases sans reposer sur un statut “beta”, ce qui pouvait en effrayer quelques-un.

fini les m2eclipse-0.9.9-dev, avec la sortie officielle de m2e 0.10.0

Non ce n’est pas un erreur, il ne s’agit pas d’une 1.0.0 de m2eclipse, celle qui aurait annoncé enfin l’intégration efficace de Maven dans Eclipse. C’est plutôt une milestone de ce que sera cette intégration .. un jour.

Sans compter que Sonatype a choisi de mettre de côté l’intégration SVN, WTP ou AJDT faute de ressources pour les supporter efficacement, et préfère ce concentrer sur le noyau. Si le principe semble assez logique (on ne peut pas courir plusieurs lièvres à la fois) les utilisateurs vont vite être déçus de voir qu’il ont attendu 8 mois (la précédente version stable 0.9.8) pour ne toujours pas avoir un résultat complètement fonctionnel.

Pour ma part, la configuration de WTP ne marche tout simplement pas, alors qu’elle fonctionnait avec une 0.9.9 récente (?). Aux questions sur ce sujet la réponse est systématiquement, “nos efforts se concentrent sur le code, on verra le reste après”.

Je ne leur jetterais pas la pierre, car en tant que mainteneur de l’intégration m2eclipse / eclipse-checkstyle je me rend compte que le développement de plugin Eclispe est un art délicat et que j’y suis bien malhabile. Reste qu’on a pas fini de se plaindre de la piètre intégration du couple Eclipse + Maven comme environnement de développement. Wait & See, encore et toujours…

Boostez votre environnement de dev

http://www.wikio.fr

Julien Dubois a lancé le débat sur son blog en présentant ses astuces pour un build plus réactif. Entre autres idées, il utilise un disque SSD pour espace de travail.

Je ne suis pas du tout convaincu par cette option, vu que ce type de disque n’est pas très tolérant aux écritures multiples. Je pense que, si les perfs peuvent être meilleures sur le coup, la durée de vie de la bête risque d’en prendre un coup.

Une autre option que je suis en train d’expérimenter, suite à la même analyse venant de Julien -- l’autre Julien, celui du BreizhJug ;)

Comme mon PC est sous Windows XP 32bits je ne peux pas profiter à 100% de mes deux barettes de RAM de 2Go. Windows ne voit que 3Go adressables. Même le mode “PAE” n’y a rien changé. Cependant, il existe des RamDisk comme Gavotte RAMdisk qui savent contourner ce problème et récupérer cet espace perdu. Un RamDisk de 1Go, bien assez pour mettre mon workspace.

mvn clean install -Dmaven.test.skip=true

sur le HD “classique” :

[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 48 seconds

sur le RamDisk :

[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30 seconds

 

Reste à voir ce que ça donne sous Eclipse …

Autres pistes à creuser :

  • Tuer cette saloperie de process MacAffee
  • Utiliser JRebel (des licences offertes au BreizhJUG !)
  • Utiliser un disque SSD pour le repository maven (moins sujet aux écritures)
  • Se payer un PC (voir un Mac ?) plus adapté aux devs !

Update (pour ceux qui ont la flemme de lire les commentaires)

Placer le workspace en ramdisk booste un peu les perfs, mais pas autant que de placer le repository Maven ! Il faut dire que nos outils passent leur temps à charger des libs en tout genre. En plus, c’est un moyen simple pour faire du ménage dans le repo – à condition d’avoir un repo manager qui fournit les artefacts via le réseau local :)

Ca pourrait être pas mal non plus de mettre l’OS en ramdisk :p

04 février 2010

L'art délicat de la compatibilité ascendante

http://www.wikio.fr

JavaEE 6 est sorti (oui je sais, ça fait déjà deux mois) et JPA 2.0 avec. Il est donc tentant de passer à Hibernate 3.5 (Beta 4 actuellement) et à Spring 3.0.0 ... sensé être JavaEE 6 compliant

Là où ça se complique, c'est que JPA 2.0 définit (entre autre) de nouvelles méthodes dans l'interface PersistenceUnitInfo, référençant des enums propres à JPA2. Et Spring, pour faire sa cuisine interne, utilise un décorateur autour de cette interface (faut dire, c'est fait pour !)

Le décorateur de Spring doit rester compatible JPA1. Le simple fait d'importer les enums JPA2 casserait cette compatibilité. Résultat: Spring 3.0.0 n'est pas compatible avec Hibernate 3.5-Beta3 et plus :'(

Rassurez-vous, Spring 3.0.1 va corriger le problème, via un proxy construit à la volée si JPA2 est détecté et je vous passe les détails, mais avouez que c'est ballot de se coltiner ce genre de problème sur un changement d'API.

Qu'est ce qu'il aurait fallu faire ?

Peut être définir une nouvelle interface PersistenceUnitInfo2 pour étendre PersistenceUnitInfo ? Pas très joli mais au moins la compatibilité aurait été plus facile à gérer pour les développeurs de middlewares.

Erreur de jeunesse ? Pensez-vous ! On a déjà eu le coup avec javax.sql.Connection lors de l'introduction des Savepoint de JDBC 3. Le build de commons-dbcp doit se tapper une mise en commentaire d'une partie du code pour produire la version JDBC 2, et a du remettre ça avec JDBC 4 !

08 janvier 2010

Oracle XE

http://www.wikio.fr

J’utilise Oracle eXpress pour les développement. Dans l’esprit “une base par développeur”, cette édition allégée (faut le dire vite) d’Oracle est bien pratique. Le dialecte SQL propre à la base est ainsi testé en phase de développement.

Pour l’intégration continue, j’installe la base sur un système Ubuntu dans une VM, et c’est là que ça se complique … oracleXE n’étant dispo qu’en version 32 bits dans le dépot debian d’oss.Oracle.com

Voici donc pour info la procédure à suivre :

1- installer Ubuntu server 64 (sans blague ?)

2- ajouter le paquet open-ssh. La console VMWare est pas terrible, alors qu’un putty permet de faire des copier/coller à la souris ;) -- se loguer en ssh pour la suite

3- ajouter les paquet bc et libc6-i386

$ sudo apt-get install bc libc6-i386

4- créer un gros swap, nécessaire pour OracleXE

$ sudo dd if=/dev/zero of=/swpfs1 bs=1M count=1000
$ sudo mkswap /swpfs1
$ sudo swapon /swpfs1

5- télécharger les binaires d’oracleXE et de sa dépendance libaio en version i386

$wget -c http://oss.oracle.com/debian/dists/unstable/main/binary-i386/libaio_0.3.104-1_i386.deb http://oss.oracle.com/debian/dists/unstable/non-free/binary-i386/oracle-xe-universal_10.2.0.1-1.1_i386.deb

6- installer tout ça, en demandant à Ubuntu de ne pas tenir compte du conflit d’architecture 64/x86

$ sudo dpkg -i --force-architecture libaio_0.3.104-1_i386.deb
$ sudo dpkg -i --force-architecture oracle-xe-universal_10.2.0.1-1.1_i386.deb

7- configurer OracleXE. Je vous déconseille de changer la conf par défaut, chez moi le choix d’un port autre que 8080 fait que l’appli d’admin Oracle est injoignable. On changera ça après coup

$ sudo /etc/init.d/oracle-xe configure

8- un petit vi pour mettre à jour votre ~/.bashrc

ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_HOME
export ORACLE_SID=XE

9- on va maintenant changer la conf de l’appli d’admin d’OracleXE, sans quoi on ne peut pas y accéder – seul localhost est autorisé, et sur notre ubuntu server, y’a pas de navigateur puisque y’a pas d’environnement graphique ! sqlplus est dispo sous /usr/lib/oracle/…./server/bin

$ sqlplus /nolog

CONNECT SYS/password AS SYSDBA


EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);



EXEC DBMS_XDB.SETHTTPPORT(‘8081’);



 



et voilà ! :)

18 décembre 2009

Juggers !

http://www.wikio.fr

Au printemps dernier j’ai proposé à des collègues de “jouer” avec Google App Engine for Java en développant une application pour gérer l’inscription au BreizhJug. Comme beaucoup nous utilisons JugEvents et comme beaucoup nous trouvons cette appli très moche, sans parler de ses plantages réguliers.

Nous sommes partis sur un truc bien trop gros pour nos petites épaules et ça a donc fait plouf en moins de deux.

La conférence de Didier Girard m’a donné envie de repartir sur ce développement, en utilisant une approche plus pragmatique et plus économique :

Les soirées BreizhJUG sont déclarées dans un Google Calendar public. Lieu, date et sujet y sont indiquées, la description servant à définir le(s) speaker(s) – première ligne – et le sujet du jour. L’intérêt ? L’appli Juggers n’a plus à gérer la saisie des événements et les droits d’accès !

L’application utilise gwt-gdata pour accéder à ce Calendar, et récupère donc une liste d’objets structurés, de manière (presque) aussi simple qu’un appel GWT-RPC.

L’inscription elle même n’est pas développée, peut être dans un premier temps sur la base d’une simple Google Form. L’idée est de progresser par tout petits pas, histoire de ne pas finir le bec dans l’eau.

J’en profite pour expérimenter uiBinder, et comme je commence tout juste un projet Wicket je ne peux pas m’empêcher de faire un parallèle : uibinder c’est la facilité de Wicket + la force de GWT, de la bombe atomique ! J’ai ainsi maquetté un widget sympa en HTML/CSS, et je peux le convertir rapidement en widget GWT utilisable partout.

L'appli est également rendue plus sexy grâce à gwt-Fx, en quelque sorte un portage de scriptaculous en GWT (pas juste un wrapper). La dernière version est vraiment bien et très souple d’utilisation.

Vous voulez-voir ce que ça donne ? http://www.juggers.org/ – attention, ce n’est ni une béta ni même une alpha, c’est un early prototype snapshot ;)

NB : ne cherchez pas, ça rend rien de bon sous Internet Explorer. Qui aurait l’idée d’utiliser ce truc de toute façon ?

Libellés : , ,

12 décembre 2009

Idées cadeaux

http://www.wikio.fr

Pour noël, une idée cadeau amusante : offrez google chrome à vos amis !

Google Chrome est le navigateur massivement adopté par les geeks et autres développeurs technophiles, mais encore peu connu du grand public – un peu comme l’était FireFox à ses débuts.

Pour étendre les parts de marché de ce navigateur, rien de mieux que le bouche à oreille, c’est donc ce que propose http://www.givechrome.com. Une bonne façon de passer un petit mot de “bonnes fêtes” à belle maman pour les fêtes sans dépenser un centime ;)

Vu que pour ma part j’utilise déjà Chrome, je vous suggère une autre idée cadeau : je n’ai toujours pas de MacBook :)

Libellés :

10 décembre 2009

do you speack concurrency ?

http://www.wikio.fr

Nous sommes toute une génération de développeur qui a été bercée par la course au Méga-Hertz, et si nous constatons un plafond les vieux réflexes perdurent. Face à un programme trop lent, la solution reste le “plus gros” processeur.

Seulement, l’offre des fondeurs de puces est explicite : n’espérez plus de GHz supplémentaire – à la place, on vous propose des cœurs en plus.

La conférence de Brian Goetz à Devoxx ainsi que son livre “Programmation Java Concurrente” sont basés sur ce constat. Fini le Free Lunch sur la puissance CPU. Pour faire plus rapide il va falloir apprendre à penser et à parler parallélisme, concurrence et synchronisation, des sujets particulièrement pointus et mal connus.

scc-h-wafer_low Pas encore convaincu ? Intel annonce avoir dans ses labs un processeur à 48 coeurs ! Vers 2012, un serveur haut de gamme se basera sur ce type de puce, et votre PC portable entrée de gamme en 2020 aussi. Croyez-vous vraiment que vos logiciels sauront en profiter ? Votre super batch d’import de données tire t-il profit d’une architecture à 48 coeurs, ou ressemble t-il plus à un bête programme séquentiel, comme décrit dans votre document de spécification ?

Les traitements lourds comme les encodeurs vidéo, traitement d’image et autres manipulations massive de données ont déjà franchi le pas, mais que penser des milliers d’autres softs, … à commencer par ceux que nous développons nous même !

Aujourd’hui, les mots incontournables sur un CV sont Spring, Hibernate ou Scrum (encore que ça devienne de plus en plus banal). Qui sera le premier à mettre en avant (à bon escient) “Parallélisme” pour sortir du lot ?

06 décembre 2009

un petit tour au ParisJUG

http://www.wikio.fr

Antonio Goncalves vient lundi animer la session BreizhJug en présentant JEE6

JavaEE6-done_small

 

Pour lui rendre la politesse, je viendrais le lendemain faire un tour au ParisJUG, en tant que simple spectateur, pour un match JEE6 vs Spring3.

563030719 La session sera filmé et retransmise sur NT1 dans Catch Attack :)

L’occasion de participer à une séance dédicace pour souligner la forte présence francophone dans le monde de l’opensource : Antonio pour son livre sur JEE6, Julien Dubois pour Spring par la pratique, Emmanuel Bernard pour Hibernate Search in Action, et Arnaud Héritier accompagné de votre serviteur pour Apache Maven. Pour avoir les liens je vous suggère de passer par le blog d’Arnaud qui a déjà fait le boulot et m’économise ainsi de nombreux copier/coller.

… enfin, à condition de ne pas être bloqués par la grève SNCF qui s’annonce :-/

Libellés : , , ,

A propos de l'auteur

  • Je m'appelle nicolas deloof
  • J'habite à Livré sur changeon, (35), France
  • Architecte Java, j'assure un rôle de veille technologique et d'expertise technique sur les sujets JEE et Web 2.0.
Mon profil complet
J'ecoute les Cast Codeurs

Archives

Publié avec Blogger
& 3C