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:
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:
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.

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.

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_._

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!
-
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 ↩︎
-
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:
-
De nombreux podcats gratuits: il n’y a qu’à taper english learn dans le champ de recherche sous iTunes et une longue liste va s’afficher. Personnellement j’aime beaucoup English as second language podcast_ _qui propose 2 podcasts par semaine avec 2 formule: l’_English Cafe _(sujets à propos de la vie aux Etats-Unis) et un podcast traitant d’un sujet en particulier (talking about prices, going into the military, etc.). Il est également facile de trouver des podcasts pour améliorer son vocabulaire ou sa grammaire… Really usefull!
-
Afin de lier l’utile à l’agréable, je trouve sympa de faire des mots croisés en anglais. Et on peut en trouver pour tous les niveaux sur le net! Par exemple, comme mon niveau est moyen pour l’anglais courant, en ce moment je consulte ce site: http://www.crosswordsite.com/usbeginner.shtml
-
Enfin pour apprendre une langue, le plus important est de la parler! Et à ce sujet j’ai reçu un mail hier concernant Polyglot. Polyglot est une communauté ayant pour but de rassembler ses membres et de simplement faire converser tout le monde, autour d’un verre, dans n’importe quelle langue parlée par les membres de cette communauté. Le premier rassemblement des membres suisses à lieu aujourd’hui à Genève! J’espère vraiment que cette idée va se poursuivre.
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é:
- Avoir du plaisir! Programmer parce qu’on aime ça. Et le faire avec suffisamment d’envie pour pouvoir le faire encore dix après.
- Avoir un échange avec d’autres programmeurs. Lire le code d’autres développeurs . Et aujourd’hui avec la multitude de projets open sources (qui a dit Java?) il n’y a pas d’excuse pour trouver du code écrit par des professionnels.
- Coder, coder, coder et encore coder! En effet, n’oublions pas que c’est en forgeant que l’on devient forgeron.
- Obtenir un titre universitaire permettra de postuler sur des emplois demandant un papier et permettra également d’avoir une compréhension plus profonde du sujet. Cependant l’expérience ne s’acquiert ni en lisant des livres, ni en assistant à des cours. Il est donc possible de devenir un programmeur professionnel en ayant uniquement une formation de base et en développant ses compétences par la pratique. L’expérience de Peter Norvig nous apprend que l’un des meilleures programmeurs qu’il ait eu l’occasion d’embaucher était de niveau pré-universitaire (l’un des créateurs de netscape entre autre).
- Travailler avec d’autres programmeurs
- Travailler sur des projets _après _d’autres programmeurs.
- Apprendre au moins une demi douzaine de langages. Un supportant l’abstraction de class (Java, Python..), un supportant l’abstraction fonctionnelle (Lisp, Haskel), un supportant l’abstraction syntactique (Lisp), un supportant les spécifications déclaratives (C++ templates), un supportant les coroutines (Scheme) et enfin un supportant le parallélisme (Sisal).
- Prendre part dans l’effort de standardisation d’un langage. Même dans un contexte local, sur un projet personnel par exemple.
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
-
Tout programmeur doit avoir un affichage double écran
-
Tout programmeur doit avoir une station performante
-
Tout programmeur doit se procurer lui-même sa souris et son clavier personnels
-
Tout programmeur doit avoir une chaise confortable
-
Tout programmeur doit avoir une connexion rapide à Internet
-
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.