Valentin Jacquemin

Le maître de Garamond

Je parlerai bientôt des différends bouquins que j’ai pu lire ces derniers temps mais là il me faut absolument faire mention du livre que je viens de terminer: Le maître de Garamond.

Je voulais particulièrement parler de deux choses concernant cette oeuvre d’Anne Cuneo.. Mais il y a trop à dire, je vais me focaliser déjà sur la première.

L’usage de la mémoire… Internet va-t’il nous rendre stupide?

Oudin, tel est le nom d’un personnage de l’histoire. Ancien saltimbanque, il se lie avec un imprimeur grâce à Garamond, le narrateur de l’histoire. Oudin possède plusieurs caractéristiques particulières mais l’une d’elles est des plus étonnante et m’a fait réfléchir. Il est capable dans l’histoire de réciter des contes, des conversations, des tirades, des événements de mémoire avec infiniment de détails. Je dis que cela m’a fait réfléchir mais Antoine Augereau le maître de Garamond fait cette réflection avant moi lorsqu’il dit:

C’est parce que nous venons d’un monde où l’imprimerie n’existait pas encore… Nous étions forcés d’exercer notre mémoire. Maintenant, pour vous, c’est la belle vie. On imprime les choses, et puis on peut les laisser s’estomper. On n’a plus qu’à consulter les livres…. Plus il y aura de livres, moins il y aura d’Oudin.

Qu’est-ce que dirait ce Maître Augereau maintenant! Nous avons accès à tellement d’information grâce aux livres mais surtout grâce à Internet! J’ai d’ailleurs déjà vu sur le net certains avancer qu’il n’y a même plus besoin de livre pour apprendre tant Internet nous donne accès à tout ce qu’on veut (mais bon le confort n’y est pas encore…). Au vu du contraste entre les capacités d’Oudin mises en avant dans ce roman et les capacités de mémoire de chacun aujourd’hui (enfin dans cette assertion je ne peux que me baser sur ma propre mémoire ;) ) on peut facilement arriver à ce genre de questions: exerçons-nous donc encore notre mémoire, ou du moins l’utilisons-nous efficacement? Arrivera-t-il un jour où les livres ou Internet nous auront rendus incapables d’user de cette mémoire? C’est un raisonnement assez paradoxale mais encore aujourd’hui j’ai pu lire un article intéressant à ce sujet dans la tribune de Genève: Le Web nous rend-il incapables de lire? Cet article fait mention d’un essai publié récemment ayant pour titre «Google nous rend-il bêtes?» («__Is Google Making Us Stupid»). L’article nous informe par exemple comment Platon avait le même genre d’idée que Maître Augereau mais lui à propos de l’écriture:

garamond-tg3

A mon avis certains sont assez répulsifs au changement. Internet c’est vrai peut très bien changer nos habitudes de lecture mais est-ce pour autant que l’on deviendrait moins intelligent? Comme toute nouveauté, il faut savoir s’en servir et à mon avis Internet n’est qu’un nouvel outil à disposition de tous les curieux de la planète! L’article se veut d’ailleurs rassurant de par sa conclusion:

garamond-tg4

N.B.: Quelques astuces pour améliorer sa mémoire et en savoir plus sur le sujet: cliquez ici.

Building GWT Comet based web app using Grizzly Comet

J’ai parlé il y a quelque temps des difficultés de Java à fournir la possibilité de mettre en place une architecture web riche… JavaOne étant terminé, on retrouve maintenant ici et là les différentes présentations disponibles sur le net et concernant ce sujet d’actualité, l’une d’elles semble être particulièrement intéressante. J’ai nommé: Writing Real-Time Web Applications, Using Google Web Toolkit and Comet. Il est possible de retrouver les slides de la présentations en cliquant sur ce lien. La présenation se base sur l’utilisation de l’outil de google GWT et du serveur de Sun GlassFish couplé à Grizzly Comet. Enjoy!

Package java.lang.reflect

Après avoir substantiellement passé en revu le package java.lang, je vais me porter sur java.lang.reflect durant ce post. Comme son nom l’indique, nous retrouvons dans ce package tout l’attirail nécessaire pour jouer avec la reflection. Autrement dit, en ciblant un objet donné, nous pourrons découvrir chacun de ses membres.

A quoi ça sert ?

Concrètement, la reflection trouve son utilité par exemple dans les éditeurs de développement (IDE). Comme l’image ci-dessous le montre, ces outils nous permettent de découvrir la structure d’une classe mais aussi où est-ce qu’elle se trouve dans la hierarchie objet. Ceci souvent au moyen d’un arbre et ce que ce soit en cours de développement mais encore, de manière avantageuse, en cours de débugage.

eclipse_refl

Il existe d’autres utilisations à la reflection comme par exemple dans les processus de sérialisation, dans l’utilisation d’objets métiers distribués (EJB), les containers web et d’inversion de contrôle etc. Mais dans la pratique comment font donc ces IDE pour nous décrire la structure de nos objets? C’est ce que nous allons découvrir maintenant avec la suite de cet article.

Les classes de bases

En plus des classes se trouvant dans ce package, il nous faudra également faire appel à une classe étant dans le package java.lang: Class. Je n’en avais pas encore parlé, voici donc le moment venu… Class représente une classe (ou une interface) tournant dans la machine virtuelle. Les objets Class sont créés automatiquement par la JVM au moyen du ClassLoader (faisant aussi parti du package java.lang) au chargement. Il nous faut en premier lieu utiliser cette classe avant de pouvoir profiter du contenu de java.lang.reflect: Class lClazz = Class.forName(className); Suite à l’exécution de cette ligne de code nous pouvons être certains qu’un objet Class correspondant est créé. En effet, le ClassLoader ne va pas charger toutes les classes de la librairie (ouf!) mais uniquement celles qui sont utilisées dans l’application.

reflect

Comme exemple j’ai créé une petite application1 listant tous les membres d’une classe entrée par l’utilisateur.

Comme vous pouvez le constater dans les sources après avoir l’objet Class tout est accessible grâce aux classes Constructor, Field, Method et Modifiers de l’API java.lang.reflect. A noter que grâce à la reflection, il est possible de contourner les modificateurs d’accès! Pour davantage d’informations, je vous invite à lire Accès privé… pas tant que ça.

Voilà pour les bases de la reflection. Maintenant un peu plus intéressant, découvrons l’utilisation des Proxy et leur importance au sein d’un certain framework.

Proxy

La classe Proxy offre la possibilité de créer des proxy dynamiques. Autrement dit, elle permet d’ajouter une couche entre un objet target et son créateur. Pourquoi rajouter une couche direz-vous… Eh bien pour le découvrir entrons dans les entrailles du framework Spring2. L’un des modules de Spring permet de faire de la programmation par aspect (AOP pour Aspect Oriented Programming) ce qui offre la possibilité de créer des classes avec une meilleure granularité. Voici par exemple la configuration XML permettant d’afficher un message sur la console avant l’appel de certaines méthodes:

<bean id="kwikEMart" 
    class="org.springframework.aop.framework.ProxyFactoryBean">
    <!-- interface interface implémentée par l'objet _target_ -->
    <property name="proxyInterfaces">
        <value>org.poxd.store.KwikEMArt</value>
    </property> 
    <property name="interceptorNames"> 
        <list> 
            <value>welcomeAdvice</value> 
        </list> 
    </property> 
    <property name="target">
        <ref="kwikEMartTarget"/>
    </property>
</bean> `

Nous n’avons ici qu’une partie du travail à effectuer mais il y a ce qu’il nous faut. Ce bout de code XML permet à Spring de créer un ProxyFactoryBean. Cette classe offre la possibilité d’ajouter des interceptors dans le workflow de votre application. Dans notre cas, le bean correspondant à welcomeAdvice sera appelé (suivant une règle définie ailleurs) par exemple avant l’invocation de la méthode start de notre application pour afficher un message de bienvenue_._

proxy

A la base nous avons toujours notre classe ne contenant aucun appel à welcomAdvice. C’est Spring qui va rajouter cet appel avant de poursuivre avec la classe que nous avons développé au départ. Pour ce faire, Spring utilise un Proxy. L’image ci-contre démontre bien le fonctionnement. Avant que le proxy invoke l’objet target il peut faire n’importe quelle opération (dans notre cas appeler welcomeAdvice)! Et de notre côté, l’architecture n’est pas touchée, nos classes ont un focus bien défini.

Voilà en pour ce qui concerne le package java.lang.ref. En attendant que je me penche sur une partie du JDK, les commentaires sont les bienvenus!


  1. Vous pouvez retrouver le code source en cliquant ici – code de démo, entrez dans le champ texte par exemple org.poxd.Reflect ou n’importe quelle classe du JDK ↩︎

  2. Pour une description de ce framework, consultez la section About du site www.springframework.org ↩︎

Apprendre l'anglais

Les cours d’anglais sont peut-être éloignés et vous avez envie de vous y replonger?

J’ai le privilège actuellement de suivre un cours d’anglais par téléphone. Mon employeur a la bonté de m’offrir cette prestation en partenariat avec goFluent. Je dois dire qu’avoir des conversations uniquement en anglais fait progresser, c’est réellement utile. Malheureusement tout le monde n’a pas un employeur aussi sympa et non plus les moyens de s’offrir un telle prestation…

Il existe cependant sur la toile plusieurs ressources extrêmement utiles pour s’améliorer:

Voilà trois moyens offerts gratuitement par Internet pour apprendre l’anglais. Pas belle la vie? Vous connaissez d’autres bon plans? N’hésitez pas à laisser un commentaire.

Je suis un intello!

Avant de me croire prétentieux, qu’est-ce qu’un intello? Peut-être que la définition qui suit ne convient pas à ce terme quoiqu’il en soit je l’aime beaucoup:

Être intello ça veut dire aimer s’instruire, être curieux, attentif, admirer, s’émouvoir, essayer de comprendre comment tout ça tient debout et tenter de se coucher un peu moins con que la veille ((Extrait tiré du livre Ensemble c’est tout d’Anna Gavalda)).

Cette définition fait abstraction de la notion d’intelligence. Tout le monde peut faire preuve de curiosité c’est l’une des seules justices de ce monde, par contre curiosité n’est pas égale à intelligence et malheureusement (ou heureusement peu importe) chacun ne naît pas avec le même capital et les mêmes possibilités.

Mais lorsqu’à l’école un bambin balançait “oh l’intello” il ne voulait pas dire “oh mais comme il est curieux mon camarade”… Mais bien plutôt “celui-là il me gonfle il sait tout!” Dans ce sens la définition ci-dessus n’est peut-être pas adéquate mais qu’elle se rapporte à intello ou n’importe quelle autre expression, je voulais la partager car je l’apprécie beaucoup.

Teach Yourself Programming in ten years

Je suis retombé récemment sur cet article extrêmement intéressant: Teach yourself programming in ten years. Passé l’introduction, Peter Norvig expose plusieurs points qui selon lui sont la recette du succès pour devenir un bon programmeur. Peter Norvig est actuellement Directeur de Recherche chez Google US, il est donc légitime de faire confiance en ses dire. Les voici en résumé:

J’ai pris la liberté de ne pas mentionner tous les points mentionnés dans l’article. Mais rien qu’avec cette liste, il y aura certainement toujours quelque chose à faire, à améliorer. C’est aussi cela qui est passionnant avec l’informatique. Se dire que l’on n’aura jamais fait le tour du sujet, qu’il sera toujours possible d’en apprendre et de nourrir abondamment sa curiosité… Ca ca me plait!

Une aide bienvenue pour se certifier SCWCD

Une seconde édition du livre Head First Servlets and JSP est sortie!

Si vous êtes à la recherche d’une aide adéquate pour obtenir le niveau de la certification SCWCD, ce livre est parfait! Cette seconde édition couvre la spécification 5 de Java Entreprise alors que la précédente portait sur la version 1.4. Par contre pour ceux qui sont déjà certifié sur la version 4 je ne pense pas qu’il y ait un grand intérêt à la passer du fait que les ajouts ont surtout été fait au niveau du langage et moins sur les specs Servlet/JSP.

Faisant partie de la série Head First (existe aussi en français sous le nom Tête la Première - cet ouvrage n’est pas traduit), la lecture est non seulement facile, elle aide énormément à la mémorisation et à la compréhension. Les auteurs se sont en effet mis au courant des dernières avancées en recherche cognitive et on peut dire que c’est sacrément efficace!

Et si vous êtes curieux n’hésitez pas à jeter un oeil aux autres livres de la série qui abordent des sujets plus intéressant les uns que les autres!

Package java.lang

La bibliotheque Java est vaste, tres vaste. Sans conteste cela lui procure une grande richesse puisque de ce fait il est possible de quasiment tout faire avec. Il devient cependant de plus en plus difficile de s’y retrouver a mesure que le langage evolue. Ces evolutions sont bien regulees par le Java Community Process mais n’empeche que les fonctionnalites sont toujours plus nombreuses!

Je vais tenter par une serie de plusieurs articles de parcourir quelques-uns des packages de Java afin de montrer les differentes classes disponibles. Bien sur ce ne sera qu’un survol mais toujours utile, que l’on decouvre le langage ou que l’on ait davantage l’habitude d’utiliser Java (enfin j’espere).

Pour bien commencer, prenons les choses par le debut: java.lang. Ce package est automatiquement importe lorsque l’on developpe en Java. Toutes les classes presentes dans ce package sont tres souvent utilisees dans les programmes et le compilateur nous facilite la vie en faisant lui-meme le lien lorsqu’il en rencontre une utilisation.

Wrapper types

On retrouve ainsi la definition des types de Java (Boolean, Byte, Character… et le venerable Object sans qui rien ne serait possible). On les nomme generalement _Wrapper types _pour faire ressortir que ce n’est que la correspondance des types natifs (ou primitifs) qui sont utilises lorsque l’on fait par exemple:

int theResponse = 42;

Lorsque l’on code sur Java a partir de la version 5, une fonctionnalite existante peut faire completement oublier ce concept: l’autoboxing. En effet, precedemment le code suivant ne compilait pas:

Integer laReponseATteVosQuestion = 42;

Threading

Tous les outils de concurrences ne se trouvent pas dans ce package. Cependant, le socle de base de la programmation multi-threading est integre dans java.lang. On y trouve la classe de base: java.lang.Thread mais aussi par exemple java.lang.ThreadLocal qui est utilisee afin d’implementer le pattern Thread Local Session.

On peut tres bien n’utiliser que la classe Thread pour les besoins concurrents. Nous verrons cependant lorsque nous aborderons le package java.util.concurrent qu’il existe plusieurs outils supplementaires qui facilitent la vie du developpeur lorsqu’il met le pied dans le monde du multi- threading.

Acces systeme

Enfin, plusieurs classes de ce package permettent de faire appel au systeme sur lequel tourne Java.

La classe System contient uniquement des membres statiques permettant par exemple de recuperer le flux de sortie de Java (le flux utilise pour afficher des donnees a l’ecran, la console), le temps actuel en millisecondes ou en nanosecondes, recuperer une variable d’environnement, enregistrer une propriete systeme, charger une classe ou une librairie dynamiquement ou encore enregistrer un SecurityManager personnalise.

La classe Runtime est elle davantage liee au “systeme” de Java. Il est ainsi possible de l’utiliser afin de recuperer la memoire disponible dans la machine virtuelle, lancer le Garbage Collector (aussi possible depuis la classe System qui fait en fait une redirection sur la classe Runtime) et enfin avant de mentionner la derniere classe, Runtime permet d’executer un nouveau processus systeme…

La classe Process liee donc a Runtime mais aussi a ProcessBuilder represente un processus natif. Une utilisation de ce genre de classe peut bien evidemment limiter la portabilite de l’application; il faut par consequent bien reflechir quant a son utilisation.

Par exemple, pour une application graphique permettant d’executer des imports de donnees sur une base Oracle il existe l’outil bien connu Sql Loader qui permet de charger les donner en ligne de commande. Il sera possible d’appeler directement depuis le code Java l’executable d’Oracle de cette maniere:

Process p = new ProcessBuilder("sqlldr", 
                    "userid=root control=control.ctl").start();

Ensuite les flux de sortie, d’entree et d’erreur sont disponibles et doivent etre recuperes afin de pouvoir communiquer avec le processus lance.

Autour de tout cela je n’ai pas pris le temps de parler de l’ensemble d’exceptions et d’erreurs se trouvant dans le package mais comme je l’ai dit dans l’introduction, ce n’est et ne sera qu’un aperçu!

La charte des droits du programmeur

  1. Tout programmeur doit avoir un affichage double écran

  2. Tout programmeur doit avoir une station performante

  3. Tout programmeur doit se procurer lui-même sa souris et son clavier personnels

  4. Tout programmeur doit avoir une chaise confortable

  5. Tout programmeur doit avoir une connexion rapide à Internet

  6. Tout programmeur doit avoir un environnement de travail calme.

Dans ma courte expérience professionnelle, tout ce que je peux dire c’est qu’en Suisse on est bien traité! Un commentaire intéressant sur l’original de cette charte: “mettre des écouteurs, parfois même sans aucune musique (Andre Torrez)” permet simplement de remplir les conditions de l’article numéro 6 de la charte ;) … Ayant travaillé à Lyon durant 3 mois, les conditions m’ont amené à tenter l’expérience avec succès! [source : coding horror]

Lectures #4

Cela fait un bout de temps que je n’ai plus parlé de mes lectures. Je ne vais pas les mentionner toutes mais il y en a une ou deux qui en valent la peine.

Le juge d’Egypte (Christian Jacq)

Les histoires narrées par Christian Jacq sont rarement décevantes. On y retrouve une fois de plus pour son compte grâce aux multiples péripéties rencontrées par Pazair, petit juge provincial. Le personnage est armé de forts sentiments de justice et d’intégrité; bien sûr ce ne sera pas du goût de tout le monde.L’intrigue tourne autour d’un mystérieux vol ayant lieu dans l’une des grandes pyramides. Et ce n’est évidemment qu’à la toute fin que ce jeu de piste s’achève. C’est une lecture captivante et vraiment agréable. On est mené à travers l’Egypte entier, on se trouve immergé dans l’ambiance de cette civilisation quelque peu mythique.

Le bouc émissaire (Daphné Du Maurier)

La seule critique pour cet ouvrage est très favorable.Personnellement, la seule oeuvre que j’avais lu de Daphné Du Maurier auparavant était_ l’Auberge de la Jamaïque_ et il est clair que le résultat n’est pas le même.L’histoire est plus lente et m’a personnellement moins captivé. D’ailleurs j’ai l’impression que si je me lance à expliquer en quelques mots l’histoire j’en dirai déjà beaucoup trop si des candidats à cette lecture passent par là. C’est dire si c’est lent ;) Au delà de cela on retrouve tout de même la belle et agréable écriture de l’auteure avec des personnages très bien décris.J’ai aussi pu lire Cyrano de Bergerac récemment (eh oui je ne l’avais pas encore lu) et force est de constater que c’est un chef d’oeuvre! Un réel hommage à la langue française. C’était un véritable plaisir de me plonger dans ce bouquin, cela ne m’étonnerais pas que je le relise un jour.Pour finir, je déconseille la lecture de J’irai cracher sur vos tombes de Boris Vian. C’est trop cru (voir repoussant) à mon goût.