Recherche

Coder's IO

Débuggage : mode d’emploi

 

Voici un pointeur vers un article que je trouve assez original : Débogage en Java/JavaEE

Même si cela peut paraître évident pour des vétérans du développement en java, l’article peut être vraiment intéressant pour les petits juniors qui débarquent sur des projets informatique de la vraie vie :).

Je sais que la notion de débogage dans le développement est un sujet à point de vue divergent.
Je pense que le débogage est une bonne chose et c’est comme toutes les bonnes choses, il ne faut pas en abuser.

Dans tous les cas cet article fait un point sur les différentes techniques et donnera sûrement des billes à celui qui débute et qui se retrouve sur application 5 ou 6 ans d’ages.

Cet article ne s’adressera pas sûrement au plus senior d’entre nous, mais une lecture rapide ne peut jamais faire de mal 😉

Bonne lecture!

#java   #debug   #javaEE  

Agnes Crepet : rédact’ chef du Java Magazine d’Oracle

  

Après avoir été élue Java Championne, Oracle a invité +agnes crepet  à devenir, pour un numéro, la rédactrice en chef du journal digital : Java Magazine.

La mission qui lui a été confiée était de proposer différentes thématiques qui mettent en avant la richesse de la communauté Java dans le monde.

L’article présente 13 points décrivant la manière de s’investir dans la communauté  :

    – Rejoindre un JUG,
    – Présenter un sujet à JavaOne
    – Devenir JUG leader
    – etc.

Dans un article au format questions & réponses, Agnes Crepet répond aux questions de Kevin Farnham.

D’autres sujets sont également abordés dans le magazine comme la place de Java dans la robotique ou un article sur la Lambda.

Pour y accéder, suivez le lien en bas de l’article. Il faudra vous inscrire pour accéder au journal.

Bonne lecture!

Guava : Gestion de cache

 

Nous avons tous été confrontés à un moment donné à des problématiques mettant en jeu la mise en place d’une gestion de cache.

Lorsque l’on est jeune et plein de fougue, on se lance dans sa propre implémentation. Avec l’expérience, on se dit que la problématique a sûrement été adressée par ailleurs et qu’il est sûrement possible de trouver une implém' qui fait ça très bien.. 

Aujourd’hui, le choix est assez large lorsqu’il est question de gestionnaire de cache.

Étant particulièrement fan de l’api guava, je vous propose un pointeur vers un article très intéressant présentant le gestionnaire de cache de Guava.

Les auteurs de l'article sont : +Charles BLONDE et +Nicolas Jozwiak 

Dans cet article, vous trouverez les différentes stratégies d’utilisation de ce cache ainsi que des tips.

Bonne lecture !

#java #guava #gestionnaire #cache

Devoxx France 2013

 

Pour ceux qui auront la chance de participer au grand évènement rassemblant toute la communauté des développeurs, il va falloir faire des choix !
En effet, le programme des 3 jours pour Devoxx France 2013 est en ligne.

Plusieurs thèmes vont être abordés lors de ces trois jours.
Cette année encore, la première journée est consacrée à des sessions longues permettant d’approfondir un sujet. Les deux jours suivants seront consacrés à des sessions plus courtes. Autant dire que le rythme sera soutenu.

Maintenant que le programme est en ligne, il va falloir se construire un agenda. Très franchement ça ne va pas être évident.
Pour ceux qui auraient du mal à trancher, qu’ils se rassurent, comme l’année dernière, un abonnement à Parleys est offert avec l’achat d'un pass (Conférence, Université ou Combi).
Cet accès à la plate-forme en ligne permettra après coup de voir et revoir l’ensemble des conférences présentées pendant les 3 jours (toutes ne seront pas forcément disponibles en ligne).

Suivez le lien, et construisez votre programme !

  #java #devoxx #programme

Java au quotidien épisode 7 : à l’écoute du futur

 

L’interface Future fournit un contrat permettant de travailler de manière asynchrone sur des ressources qui peuvent prendre du temps à répondre.
Elle permet de lancer le traitement sur la ressource et de récupérer le résultat plus tard.
L’inconvénient est que nous ne savons pas à l’avance quand est-ce que le résultat sera disponible (oui c’est un peu le principe d’un traitement asynchrone 😉 ).

L’API guava propose une extension de cette interface en fournissant des fonctionnalités bien pratiques.
En effet, elle permet de mettre en œuvre le principe de callback comme on le ferait naturellement lors d’un appel ajax en javascript. 
C’est à dire qu'au moment où l’on lance le traitement asynchrone, on va décrire le code à exécuter lorsque le traitement sera terminé.

L’interface se nomme ListenableFuture. Elle permet d’ajouter à l’instance un listener au travers d’un objet  de type Runnable et un objet de type Executor.
Au moment où le résultat sera prêt, alors l’objet Runnable sera lancé à l’aide de l’Executor.
La signature de méthode proposée par l’interface pour ajouter un listener est la suivante : 

addListener(Runnable, Executor)

Il est également possible d’utiliser la classe utilitaire Futures pour ajouter des callbacks à instance de Future courante. 
Pour cela, il faut utiliser la méthode suivante : 

Futures.addCallback(ListenableFuture<V>, FutureCallback<V>, Executor)

C’est dans ce cas de figure que nous pouvons retrouver l’analogie avec l’appel ajax dont nous parlions tout à l’heure. En effet l’interface définissant le callback (FutureCallback) définit deux méthodes similaires : 

onSuccess(V)
onFailure(Throwable)

Le comportement est assez clair, en cas de succès du traitement, c’est la première méthode qui est appelée, en cas d’erreur ce sera la deuxième.
L’API propose également une gestion des exceptions remontées en cas d’erreur. Cette fonctionnalité est implémentée au travers de l’interface suivante : 

CheckedFuture<V, X extends Exception>

Nous avons rapidement les possibilités offertes par cette interface.
En suivant le lien contenu dans le post, vous trouverez des exemples de d’application (transformation asynchrone notamment).

#java #guava #future #ListenableFuture

Démarrer avec Scala

 

Récemment, j’ai décidé de me lancer dans l’apprentissage d’un nouveau langage. 
Je me suis orienté vers le langage Scala. 

Démarrer avec un nouveau langage n’est pas toujours facile. Même si les concepts peuvent être proches entre les différents langages de programmation, il existe des spécificités qui font qu’un langage est agréable à utiliser. 

C’est d’ailleurs aussi le coté un peu frustrant de démarrer d’une page blanche. Il faut tout réapprendre.
Donc pour bien démarrer, selon moi, deux choses sont essentielles : 
– Avoir de bonnes ressources documentaires,
– Avoir un objectif de réalisation.

Les ressources sont essentielles car elles permettent de pouvoir avancer sans trop buter sur les mots du langage.

L’objectif permet de travailler avec un cas d’application concret. Il permet d’utiliser ce nouvel outil avec de vraies contraintes et de vrais besoins. C’est toujours plus intéressant que de taper des commandes à l’enfilade dans la console.

Pour ce qui est de l’objectif, j’ai trouvé !
J’ai développé un petit site basé sur Play! permettant d’obtenir quelques stats sur la page google+ Java – ʕ๏̮๏ʔ. A l’époque, je l’avais codé en Java, en m’aidant de Guava. L’idée sera de le réécrire complètement toujours sur une base Play! mais en Scala.

Concernant les ressources, j’ai trouvé quelques pointeurs intéressants que je vais partager avec vous… 🙂

Le premier lien, même si c’est assez évident, est la Scala Doc officielle : 
http://www.scala-lang.org/api/current/index.html

Le second lien est un document, traduit en français, présentant le langage au travers de différents exemples. La version originale a été écrite par Martin Odersky
http://www.scala-lang.org/docu/files/ScalaByExample-fr_FR.pdf

Le troisième lien est un lien vers le site officiel agrégeant la documentation Scala : 
http://docs.scala-lang.org/index.html

Le quatrième lien est un article très complet (en français) sur le langage : 
http://www.siteduzero.com/informatique/tutoriels/apprenez-la-programmation-avec-scala

Et enfin, le cinquième et dernier lien pointant vers un cheatsheets Scala : 
http://docs.scala-lang.org/cheatsheets/

En tout cas, les quelques heures que j’ai pu consacrer à ce langage ont été un pur bonheur, autant au niveau de la syntaxe très concise que de l’approche fonctionnelle (entre autres).
Aussi, les différents contextes d’utilisation (application, console, scripting) offrent beaucoup de possibilités dans la vie quotidienne d’un développeur.

J'espère que ces pointeurs vous permettront d’aborder le langage dans de bonnes conditions !
 La liste étant loin d’être exhaustive, n’hésitez pas à la compléter au travers des commentaires.

#java #scala #ressource #doc

Java au (futur) quotidien : Stream

 

La nouvelle version du JDK vient avec son lot de nouveautés.
Une des plus importantes est l'ajout des lambda expressions. 

Des évolutions significatives ont aussi été introduites autour de l'API Collections.
Ces évolutions fournissent une approche fonctionnelle de la manipulation d'ensembles de données. 

La question de la refonte de l'API Collections au sein du JDK s'est posée au moment de la version 8 de java.
Une des solutions aurait été de la refondre intégralement. 
Une autre option a été choisie en enrichissant les interfaces Collection, List, Iterable de nouvelles méthodes et en ajoutant de nouvelles interfaces comme l'interface Stream.

Un point important est le choix d'internaliser le mécanisme d'itération sur un ensemble de données.
Aujourd'hui, pour itérer sur une collection, nous n'avons pas d'autres choix que de le faire de manière séquentielle et selon l'ordre défini par la collection à parcourir.
En règle générale, c'est à l'aide d'une structure forEach, comme celle présentée ci-dessous, que l'on parcourt une collection : 

for(Object o : objects){
/do something/
}

D'autres alternatives existent à l'aide d'api externe comme Guava, LambdaJ , commons-collections

Dans la version 8, le mécanisme d'itération a été internalisé. Ci-dessous un exemple de comment serait codé le parcours d'une liste : 

objects.stream().forEach(/do something/);

Dans cet exemple, objects est une collection d'objets. Stream() est l'une des méthodes venant enrichir l'API existante.

Cette internalisation permet de déléguer la gestion de l'itération à l'API. De cette manière, il est possible de mettre en place des mécanismes permettant d'optimiser ou rationnaliser les traitements. par exemple : 

– mise en place de la parallélisation,
– exécution paresseuse de traitement,
– le chainage des appels,
– etc.

Du fait de cette internalisation, il est possible de chaîner les traitements que l'on souhaite appliquer à une collection.

Soit le use case suivant:
Sur une collection de personne, je souhaite appliquer un traitement particulier sur toutes les personnes ayant pour métier pompier. 

personnes.stream().filter(p -> p.metier==POMPIER)
 .forEach(p -> /do something/);

L'exemple est ici très simple, mais l'on peut faire des choses plus compliquées et ceci de manière très explicite et concise. Vous trouverez dans l'article en lien d'autres exemples.

Lors de l'utilisation des lambda expressions, celles-ci sont traduites en instance d'interface à une méthode. Le JDK propose un jeu d'interface utilisé par les expressions lambda, ci-dessous un exemple de ces interfaces : 

-Predicate : permet de filtrer selon une condition
-Block : permet d'appliquer un block de code.
-Function : permet de transformer un élément de la liste.

Parallélisation
Cette nouvelle version propose une fonctionnalité intéressante qui permet de se démarquer de l'approche séquentielle que l'on connait bien dans la version actuelle.
Cette fonctionnalité est la parallélisation des traitements appliqués sur une collection.

De plus, la mise en œuvre est très simple et transparente : 

personnes.stream().parallel().filter(p -> p.metier==POMPIER)
 .forEach(p -> /do something/);

Comme nous pouvons le voir sur l'exemple ci-dessus, il suffit d'appeler la méthode parallel() lors du chainage des traitements.
Ce mécanisme se base sur le projet fork/join. L'idée est de subdiviser l'ensemble des données en sous-ensembles et de traiter ces sous-ensembles.

Gestion des références null
L'équipe a décidé de ne pas gérer nativement les éléments null d'une collection. Cette gestion est laissée à la main du développeur. 
Il est vrai qu'avec cette nouvelle syntaxe, il est possible de rapidement les traiter en appliquant une fonction filter() au début du chainage des traitements.

Une autre particularité de l'interface Stream est qu'elle définit des ensembles de données non bornées. En effet, une collection standard correspond à un ensemble d'une taille finie.
Cette notion est importante et doit être bien gardée à l'esprit.

Nous avons fait un tour d'horizon des possibilités qui seront offertes avec Java 8 dans le domaine de la manipulation de collections. Nous avons vu ici les grandes lignes des possibilités offertes par l'interface Stream (couplée aux expressions lambdas).

Des perspectives vraiment séduisantes ! 

#java #stream #lambda #java8 #fonctionnelle

Weak Reference

 

En Java la gestion de la mémoire est complètement transparente pour le développeur.
En théorie, il n’est pas nécessaire de faire une action particulière pour libérer des objets dont on sait qu’ils ne sont plus référencés.

Néanmoins, il existe quelques possibilités (qui relèvent de bonnes ou mauvaises pratiques) pour maîtriser cette gestion de la mémoire.

Par exemple, il est possible d’appeler explicitement le garbage collector pour qu’il collecte et nettoie les objets en mémoire.
Pour être précis, l'appel au garbage collector pour réalisé ce nettoyage n'est qu'un ordre envoyé, on ne maîtrise pas le moment précis ou les objets seront détruit de manière effective.
Une autre possibilité demandant une certaine connaissance du fonctionnement de la JVM peut être mise en œuvre. Il s’agit des weak references.
Concrètement les weak references décrivent le poids des références entre les objets. Plus la référence est forte (Strong) plus elle empêchera le garbage collector d’agir sur les objets dépendants, en revanche, plus la référence est légère (Phantom), moins elle mettra d’obstacle vis à vis du garbage collector.

Il existe 4 types de weak référence (par ordre de force)

– Strong référence (celle que l’on utilise quotidiennement)
– Soft référence,
– Weak référence,
– Phantom référence.

Chaque référence listée ci-dessus hérite de la classe Reference.

Il est assez rare d’avoir recours à cette gestion de la mémoire. Mais je pense qu’il est important d’avoir cette connaissance dans sa culture générale de développeur.

Pour bien comprendre ce mécanisme, l’auteur de l’article, en pièce jointe à ce post, nous donne des cas d’utilisation concrets afin de mieux cerner le sujet.

#java #weak #reference #gc

Java au quotidien épisode 5 : Collection de multi

 

L’api Guava propose depuis la version 2.0 deux types de collection que l’on ne trouve pas nativement dans le JDK.

Il s’agit des interfaces MultiSet et MultiMap.

Ces deux types apportent des solutions à des problématiques que l’on peut rencontrer assez couramment dans notre quotidien de développeur. 

Multiset

On peut lui ajouter plusieurs éléments (même identiques). Contrairement au Set classique, chaque élément sera référencé dans la collection. 
Pour l’instant rien d’exceptionnel par rapport à une collection classique. La valeur ajoutée de MultiSet est de fournir des fonctionnalités comme :
 – compter le nombre de fois qu’un élément se trouve dans la collection
– extraire un sous-ensemble représentant chaque type stocké dans la collection (distinct),
– possibilité d’ajouter massivement un nombre d'occurrences d’un type,
– etc…

Il existe plusieurs implémentions : 

– HashMultiset
-TreeMultiset
– LinkedHashMultiset
– ConcurrentHashMultiset
– ImmutableMultiset

Multimap

Ce type permet d'indexer sous une clef une collection d’éléments. Contrairement à la Map classique, ou une clef référence une valeur.

Avec les classes du JDK, cette fonctionnalité pourrait être codée de la manière suivante :
Map<K, List<V>>

L’interface Multimap fournit les fonctionnalités suivantes : 

– ajout d’une valeur associée à une clef
– ajout d’une liste de valeurs associée à une clef
– suppression d’une occurrence associée à une clef
– suppression de tous les éléments associés à une clef, et la clef elle même.
– etc…

Nous venons de voir un très bref aperçu des possibilités proposées par ces deux types.

Je vous propose de consulter le pointeur attaché à ce post pour approfondir le sujet.

#java #Guava #Collection   #multiset #multibag

Propulsé par WordPress.com.

Retour en haut ↑

Concevoir un site comme celui-ci avec WordPress.com
Commencer