lundi 9 septembre 2013

Les URLs Java du JDK

Pour ceux qui réalisent des applications JAVA utilisant des services WEB les premières étapes de leur projet commencent classiquement par le choix de la librairie HTTP à utiliser. Ce choix n'est jamais anodin et dépend de beaucoup de choses :

  • contexte d'utilisation
  • passif technique de l'entreprise dans laquelle le projet sera réalisé
  • ce que l'on attend de la librairie : 
    • facilité d'utilisation
    • couverture et respect de la norme HTTP
    • pipelining
    • ...
Je ne vais pas ici faire de comparatifs des différentes librairies existantes : pour l'instant je n'ai surtout utilisé que celle d'apache. Par contre, il est des cas où l'on aimerait pouvoir se passer d'une dépendance à une librairie tierce. Or, depuis longtemps java intègre des possibilités de pouvoir faire des requêtes HTTP sans trop d'effort. Par contre, ce framework n'est pas trop bien documenté. Peut-être n'ai je pas frappé aux bonnes portes ; mais à l'époque ou j'ai du jouer avec les classes standards de Java j'ai eu du mal à trouver une bonne documentation. C'est pourquoi je me suis dis que j'allais présenter dans ce billet les quelques leçons que j'ai tiré de mon expérience.

Créer une connection au site distant (URLConnection)

Tout commence par la création d'une instance de la classe java.net.URL à partir de laquelle on pourra créer un object URLConnection représentant la connection applicative. Exemple de code :
URL url = new URL("http://www.google.fr");
URLConnection openConnection = url.openConnection();

Lorsque l'URL est une URL HTTP l'objet URLConnection retourné sera en fait une instance HttpURLConnection. Il est important de noter, c'est clairement indiqué dans la javadoc qu'une instance d'HttpURLConnection ne servira à réaliser qu'une seule requête HTTP : "Each HttpURLConnection instance is used to make a single request but the underlying network connection to the HTTP server may be transparently shared by other instances".

Une simple requête GET

Le code


URL url = new URL("http://www.google.fr");
            HttpURLConnection openConnection= (HttpURLConnection) url.openConnection();
             
            openConnection.setRequestMethod("GET");
            openConnection.setDoOutput(false);
            openConnection.connect();
            final int responseCode = openConnection.getResponseCode();
            
            if (responseCode >= 200 && responseCode<300)  {
                int contentLength = openConnection.getContentLength();
                String headerField = openConnection.getHeaderField("Transfer-Encoding");
                byte[] ba;
                
                try (InputStream is = openConnection.getInputStream()) {
                    if (headerField!=null && headerField.contains("chunked")) {
                        ba = readChunkedStream(is);
                    } else {
                        ba = readStream(contentLength, is);
                    }
                }
            }
            else if (responseCode >= 400)  {
                int contentLength = openConnection.getContentLength();
                String headerField = openConnection.getHeaderField("Transfer-Encoding");
                byte[] ba;
                
                try (InputStream is = openConnection.getErrorStream()) {
                    if (headerField!=null && headerField.contains("chunked")) {
                        ba = readChunkedStream(is);
                    } else {
                        ba = readStream(contentLength, is);
                    }
                }
                String st = new String(ba);
                System.out.println("error page :"+st);
            }

Les explications

Le code qui précède montre comment faire un simple GET. Lorsque l'on fait un GET sur une ressource HTTP on n'envoie pas de contenu au serveur ; c'est pourquoi avant la connection http est paramétrée ainsi :
            openConnection.setDoOutput(false);
De manière générale, le paramétrage est à faire avant l'appel à la méthode connect() qui va non seulement établir la connexion physique mais aussi faire l'appel GET. En effet, on peut dès cet appel récupérer le code retour obtenu du serveur suite à cet appel.
Le point clé dans cet exemple est que en fonction du code retour le contenu éventuellement retourné par le serveur n'est pas consommé de la même façon :

  • on utilise openConnection.getInputStream en cas de code retour de type 20x.
  • si un code retour de classe 4xx ou 5xx est retourné il faut utiliser la méthode getErrorStream pour lire l'éventuel contenu retourné par le serveur.
Une autre chose à retenir est que les ressources prises par la connection doivent être libérées ; pour cela il faut absolument fermer le flux duquel la réponse va être lue (celui retourné soit par la méthode  getInputStream ou celui retourné par la méthode getErrorStream). Si cela est fait, de manière transparente la connexion réelle sous-jacente (le socket) pourra être réutilisé pour une autre requête ; ce qui est très pratique pour obtenir de meilleures performances.

dimanche 25 août 2013

Les dossiers Dresden

Dans ce billet, je vais vous parler non pas d'un seul livre mais de cinq. J'ai en effet commencé à lire le premier tome des aventures de Harry Dresden ne sachant pas trop à quoi m'attendre et au final j'ai lu dans la foulée les 5 tomes de ses aventures.

Un magicien parmi nous

Pour vous situer le contexte, Harry Dresden est un magicien qui loue, à tous, ses services et pour toutes sortes d'activités pour lesquelles ses talents magiques pourraient s'avérer utiles. Cela va de libérer quelqu'un d'un méchant sort, en passant par retrouver un disparu,  ou combattre un loup garou ... Il est, à sa connaissance, le seul magicien à exercer ouvertement son activité au vu et au su de tous : les autres magiciens préfèrent exercer dans l'ombre et le jalousent un peu. Pour compléter ses fins de mois difficiles Harry est aussi le conseiller de la police de Chicago et plus particulièrement du Bureau des enquêtes spéciales. Ce bureau est dirigé par Karrin Murphy qui fait appel à son ami Dresden lorsque le surnaturel est impliqué.

Des enquêtes et de l'action

Si je devais décrire le genre littéraire des dossiers Dresden je dirais que ce sont des livres d'investigation dans un monde où la frontière avec le surnaturel est assez poreuse. Dans chacun des 5 livres la partie enquête n'est en effet pas négligée, Dresden est un véritable détective du surnaturel. Le lecteur trouvera aussi son compte pour ce qui est de l'action et du suspens, et cela pour chacun des 5 tomes.

Les 5 livres

Franchement, je les ai tous aimé ! Du coup, je ne vais pas attribuer de note individuelle mais je vais donner une note globale.
  • Avis de tempête
  • Lune fauve
  • Tombeau ouvert
  • Fée d'hiver
  • Suaire froid
Ma note : 16/20

samedi 15 juin 2013

Marie Pavlenko, La fille sortilège

J'en parlais ici, Marie Pavlenko a écrit un livre avant de nous livrer le 3 ème tome des aventures de Saskia.
L'histoire se passe dans une cité état - la cité des six - tenue par 6 clans : celui des planteurs, celui des sourciers, des dresseurs, façonniers, couteliers et guérisseurs. Bien que la cité soit en plein milieu du désert les clans vivent dans une grande prospérité car ils maitrisent chacun un type de magie adapté à leur spécialité.
Chaque année les jeunes de chaque clan peuvent, lors d'une cérémonie, demander à changer de clan mais en s'exposant au bannissement si le clan dans lequel ils veulent aller les refuse. C'est ce qui est arrivé à Érine qui du coup vit désormais en marge, chez les orklas, communauté survivant autour des clans dans un grand dénuement. Cette jeune héroïne au caractère bien trempé va se retrouver bien malgré elle au coeur d'un complot opposant certains clans ; des dissensions apparaissent en effet entre les ceux-ci car certains constatent que la magie semble se tarir ...
Ce roman, d'un peu moins de 300 pages, se laisse tellement bien lire qu'en trois jours - trois nuits en fait - il m'a laissé le dévorer. Je m'attendais à beaucoup de chose, sachant déjà que cette auteur était talentueuse, mais ce livre et le monde qu'il décrit m'ont véritablement séduit : et pourtant je ne suis pas un garçon facile. L'univers ainsi créé est suffisamment riche pour accrocher rapidement notre imaginaire et le livre quant à lui tellement bien écris qu'on s'y sent plongé sans le moindre effort. Que dire d'autre à part que j'espère que l'on disposera d'une suite ; je veux des nouvelles d'Érine !

dimanche 9 juin 2013

Le Livre de Saskia

Je rédige ce billet plusieurs mois après avoir lu les deux premiers tomes du  'livre de Saskia'. Mais ne pas leur consacrer une place sur mon blog me parait inconcevable tant j'ai trouvé l'histoire de Saskia intéressante. Je fais maintenant parti des personnes qui attendent avec impatience la sortie du troisième volume. Mais il faudra patienter car Marie Pavlenko a entre temps écrit un autre livre, 'La fille sortilège'. Livre que je suis justement en train de lire ces jours-ci ; j'en toucherai sans doute un mot ici. Mais revenons à Saskia en dévoilant de quoi l'histoire est faite.
Celle-ci se déroule dans un monde semblable au notre. Saskia est une ado qui nous ressemble ; du moins jusqu'au jour ou elle apprend qu'elle n'est pas vraiment de l'espèce humaine. Elle est en fait une 'enkidar' : créature à apparence humaine munie d'ailes qui apparaissent lors de "l'éveil"aux alentours de 18 ans. Deux catégories d'enkidar co-existent sur terre. La première est celle des faucheurs qui 'respirent' l'âme des personnes juste avant leur mort et récoltent ainsi leurs souvenirs. La deuxième est celle des gardiens dont le but est de sauver les gens en péril. Où Saskia va-t-elle se situer ? Evidemment elle préfèrerait être une gardienne, les faucheurs semblent trop morbides. Mais certains enkidar voient en elle le 'troisième Enkidar' : un enkidar à la fois gardien et faucheur. Une telle personne serait capable de rapprocher les deux factions, plus ou moins ennemies depuis toujours. C'est pourquoi Saskia est en danger, car la paix n'arrange jamais ceux qui profitent de la guerre.

les terres de cristal

Ce dernier volume de la trilogie c'est avéré aussi bon que les deux autres (voir mon billet sur le premier tome). Arrivé à la fin, on est presque triste de devoir quitter les trois compères que Gabriel Katz a si bien su nous faire aimer. Mais qu'on se le dise, à la fin de ce tome le lecteur aura enfin la réponse à la plupart des questions qu'il aura pu se poser. Je dis la plupart car, si j'ai cru comprendre que le 'puits des mémoires' est une trilogie, je pense qu'il pourrait quand même y avoir une suite : toutes les portes ne sont, en tous les cas, pas fermées ; mais ceci n'est que mon interprétation.
Dans 'les terres de cristal' le personnage que nous allons découvrir est Nils qui n'a, rappelons le, appris sa véritable identité qu'à la fin du tome 2. Avec ses deux comparses, il va petit à petit reprendre sa vie en main et essayer de se venger de ceux qui leur ont dérobé leurs souvenirs.
Si Nils est sans doute le plus dangereux du trio je trouve que c'est aussi le plus comique : son côté droit et direct le rend, en fait, assez marrant - sauf pour les victimes de sa franchise.
Pour conclure, pour ceux qui aiment la 'fantasy' je conseille vivement d'acheter 'le puits des mémoires' qui leur fera passer un bon moment. Quant à moi, je vais suivre de très prêt ce que fait Gabriel Katz en espérant bientôt entendre parler d'une nouvelle oeuvre.

vendredi 31 mai 2013

Cavalier vert


Des apparences trompeuses

Cavalier vert est le premier tome d’un cycle actuellement composé de 4 livres et écrit par «Kristen Britain». J’ai commencé par acheter le premier des 4 volumes moyennement convaincu par le résumé que j’avais pu en lire. Une fois la lecture commencé, c’est bien simple, je n’ai pas pu m'arrêter. Puis du premier tome je suis passé au deuxième et à l’heure où j’écris ce billet j'ai terminé le quatrième ( et je ne sais donc pas encore si celui-ci sera le dernier ou non ). Bref, je vais essayer de vous convaincre que ‘Cavalier vert’ est vraiment une bonne lecture.

L’histoire du premier volume

Une jeune femme - Karigan - fuit son école dont elle risque d’être bannie car trop rebelle ; elle veut plaider sa cause auprès de son père avant que celui-ci n’apprenne la nouvelle d’un autre. Sur son chemin elle rencontre un cavalier vert, messager du roi, mortellement blessé. Celui-ci, avant de trépasser lui confie une missive à destination de son souverain et lui demande de l'amener à destination sans l’ouvrir. Pour cela, et juste avant de mourir, il lui lègue son cheval, sa cape de cavalier vert et surtout la broche qui se trouve dessus.
Investie d’une grande responsabilité, traquée par des tueurs et qui plus est totalement livrée à elle même Karigan va tout d’un coup se retrouver plongée dans le monde des adultes. Comme les petits problèmes de disciple de son école paraissent soudainement futiles ! Pendant son périple, notre jeune amie va découvrir petit à petit que les anodins cadeaux du cavalier décédé F'ryan Coblebay s’avèrent plus utiles que prévu : sa monture bien que laide est d’une intelligence déconcertante et lui sauvera la vie plus d’une fois, et la broche lui procure des pouvoirs magiques qui en autres choses lui permettent de se rendre presque invisible. Et, encore plus étrange, il semblerait que bien que décédé le cavalier vert soit encore là pour l’aider dans les moments les plus difficiles.
Les tueurs aux trousses de Karigan veulent à tout pris s’emparer de sa lettre qui semble mettre en danger leur plans. Le chef de ces derniers, Élétien renégat, est doté d’immenses pouvoirs magiques et dont l’un des buts, outre la capture de Karigan, est de détruire le mur magique protégeant la contrée de notre héroïne du voile noir. Ce territoire est majoritairement envahie d’une forêt lugubre où végétaux et animaux sont hostiles car contaminés par une antique magie noire.

mercredi 22 mai 2013

Mac OS X Spotlight

Un mac trop lent

Développant tous les jours sur mon mac j'ai constaté de gros problèmes de lenteur lorsque je faisais de grosses opérations sur mon file-system.
On le sait tous un disque qui fait beaucoup de lecture / écriture cela ralentit forcément nos machines ; mais ce qui empire le problème c'est quand spotlight se lance pendant ce temps là.

Pilotage de spotlight

En fait spotlight est piloté par launchd. Du coup il suffit de :

Arrêt de spotlight

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist

Relancer Spotlight

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist

Reconstruire les indexes

Pour cela, dans l'onglet confidentialité des préférences de spotlight ajoutez votre disque dur. Cela aura pour conséquence de tout désindexer. Puis, supprimez le ; spotlight reconstruira ensuite tous ses indexes.

dimanche 12 mai 2013

The name of the wind

Cette série ( 2 tomes pour l'instant et le troisième est en gestation ) a été écrite par Patrick Rothfuss et je dois bien avouer qu'elle m'a proprement enthousiasmé.
L'histoire est celle d'un jeune homme très brillant, Kvothe,  issu d'une communauté de gens du spectacle itinérants. Sa grande intelligence lui ouvrira les portes de l'Université dans laquelle il pourra venir apprendre sciences, magie, alchimie,... Son but premier est d'y élever son niveau dans tous ces domaines pour en apprendre suffisamment sur l'assassinat de ses parents : ceux ci ont en effet été tués au début de l'histoire par des êtres mythiques que tous pensent être seulement du domaine de la légende. Kvothe, témoin miraculé de cette histoire gardera pour lui ce qui c'est passé ; sachant que de toute façon personne ne le croira.
Pour parvenir à son but Kvothe devra réussir ses études beaucoup plus vite que les autres car, orphelin, il ne dispose d'aucune ressource et l'Université n'est pas gratuite, loin s'en faut.
Magie, aventure, le tout couplé avec une narration très agréable, tout cela fait que j'ai trouvé le premier livre captivant. La suite "the wise man's fear" est de la même veine. Vivement le tome trois !