Philippe vient de publier la suite de son cours sur Spring. Cette fois il s'attaque à la partie AOP.
Vous mourrez d'envie de connaître la suite de ce tuto? C'est ici.
samedi 21 novembre 2009
mercredi 18 novembre 2009
Java 7 : le retour des closures!
Juste un message rapide pour vous dire que Sun a annoncé aujourd'hui à Devoxx l'ajout des closures au JDK 7.
Il y a quelques mois, on avait justement annoncé l'abandon des closures pour le prochain JDK, aucun consensus n'ayant été trouvé suite aux différentes propositions de la communauté.
Finalement, c'est sur la proposition FCM 0.5 que la prochaine spécification du langage devrait se baser. Suivez ce lien pour voir en quoi les closures pourront simplifier votre code Java.
Allez je lance un petit troll juste pour le fun, que restera t-il alors à C# pour concurrencer Java?
Il y a quelques mois, on avait justement annoncé l'abandon des closures pour le prochain JDK, aucun consensus n'ayant été trouvé suite aux différentes propositions de la communauté.
Finalement, c'est sur la proposition FCM 0.5 que la prochaine spécification du langage devrait se baser. Suivez ce lien pour voir en quoi les closures pourront simplifier votre code Java.
Certains projets morts suite à l'annonce du retrait des closures dans Java vont pouvoir renaître, comme JAQUE, un Microsoft LINQ like pour Java, justement basé sur le principe des closures.
Décalée à fin 2010, la release finale du JDK pourrait intégrer d'autres modifications syntaxiques comme le support du multi catch.
Allez je lance un petit troll juste pour le fun, que restera t-il alors à C# pour concurrencer Java?
jeudi 12 novembre 2009
Initiation à Spring
Si vous entendez souvent parler de Spring mais n'avez jamais osé poser la question "à quoi ça sert?", ce tuto publié sur K33g.org, le site dédié à découverte par la simplicité et à la programmation par l'exemple, devrait vous intéresser.
Dans cette introduction vous découvrirez ce qu'est un conteneur léger et pourquoi il est utile d'avoir recourt à ce genre d'outil.
Lire le billet
Dans cette introduction vous découvrirez ce qu'est un conteneur léger et pourquoi il est utile d'avoir recourt à ce genre d'outil.
Lire le billet
samedi 7 novembre 2009
Hibernate Search : Introduction
Les fonctions de recherche de données sont omniprésentes dans les applications de gestion.
Le code ci dessus permet de récupérer une liste d'appartements en basant la recherche sur l'adresse, le nom du propriétaire, ainsi que sur le mot clé "Victor".
Dans notre culture informatique, nous utilisons le plus souvent des reqûetes SQL (avec ou sans outil de mapping) pour répondre à ce genre de besoins. Mais lorsque l'on désire obtenir des recherches aussi flexibles que des requêtes "à la Google", cette solution n'est pas forcément la plus adaptée. Pourtant les bases de données relationnelles sont bien utiles pour stocker les données d'applications de gestion classiques.
Nous allons voir ensemble qu'Hibernate Search apporte une solution très intéressante à ce problème. Basé sur Lucene, ce framework permet de bénéficier de recherches avec tolérence aux fautes ou de recherches sémantiques en se basant sur des dictionnaires de synonymes, le tout étant lié au modèle d'entités JPA de l'application.
Il est même possible de l'utiliser pour effectuer des recherche par approximation phonétique!
Au lieu de rechercher dans la base de données, le framework cherche dans des objets appelés documents Lucene. Hibernate Search enregistre les entrées de la base à chaque insertion, modification ou suppression d'entités Hibernate dans ces documents Lucene afin de maintenir ses indexes à jour.
Deux modes de fonctionnement sont possibles :
- le mode synchrone : mise a jour de l'index à chaque commit de transaction
- le mode asynchrone : deux indexes, un index de lecture pour les recherches et un index d'écriture pour les mises a jour lors des commit, copie de l'index d'écriture sur l'index de lecture à intervalle régulier
Le deuxième procédé a l'avantage de ne pas impacter les performances des recherches à chaque transaction avec une mise à jour de l'index.
Cependant il a l'inconvénient de ne pas proposer des résultats de recherche aussi frais et à jour que le premier procédé. Une mise à jour immédiate de l' index de lecture à la demande est cependant possible.
Voyons un peu de code :
pour demander à Lucene d'indéxer une entité, on lui rajoute l'annotation @Indexed
@Entity
@Indexed
public class Appartement{
@ManyToOne
private Proprietaire proprietaire;
@Field(index=Index.TOKENIZED)
private String adresse;
}
@Field signifie que le champ sera indexé, Tokinzed implique que le champ doit être analysé syntaxiquement en utilisant un découpage par mots. Le champ description de notre classe Appartement peut en effet contenir plusieurs mots.Pour faire une requête, on dispose d'un objet de type FullTextEntityManager auquel il est possible de passer des requêtes Lucene.
String[] fields = new String[]{"adresse", "proprietaire.nom"};
//Définition de l'analyseur
MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new StandardAnalyzer());
//Définition du critère de recherche
org.apache.lucene.search.Query query = parser.parse("Victor");
javax.persistence.Query persistenceQuery = fullTextEntityManager.createFullTextQuery(query, Appartement.class);
//récupération des résultats
List<Appartement> appartements = persistenceQuery.getResultList();
Le code ci dessus permet de récupérer une liste d'appartements en basant la recherche sur l'adresse, le nom du propriétaire, ainsi que sur le mot clé "Victor".
Les appartements récupérés seront par exemple ceux qui se situent dans la rue Victor Hugo ou qui ont pour propriétaire Victor Dupont.
Cette requête étant tolérante aux fautes, ces résultats apparaitront aussi si vous tapez par exemple "Cictor" au lieu de "Victor"!
A noter que Lucene n'effectuera cette recherche par approximation que si la recherche exacte ne renvoie aucun résultat.
L'analyseur par défaut StandardAnalyzer est utilisé dans cet exemple. Il est toutefois possible de créer son propre analyseur pour ajouter des synonymes, ignorer certains mots communs (le, de...) , définir la sensibilité à la casse, le nombre de caractères éronnés autorisés pour la tolérance aux fautes de frappe ou encore des règles de recherche phonétique... Nous verrons ces fonctionnalités dans la dernière partie de ce tutoriel.
Et voilà, nous avons terminé cette première partie, la prochaine fois nous verrons comment intégrer des fonctions Hibernate Search dans une application de gestion d'agence immobilière (ultra simplifiée bien sûr) créée à l'aide du CRUD Generator de NetBeans.
Et vous dans vos applications, avez vous ressenti les limitations des recherches SQL? Pensez vous qu'une solution basée sur Lucene puisse améliorer la situation?
lundi 2 novembre 2009
Naissance du site K33G.org
Après avoir publié quelques tutos sur Coffee Bean, Philippe Charrière vient de lancer son site web : K33G.org
Le principe de ce site : présenter des techno le plus simplement possible, avec des tutoriels à l'appui. Un très bon article sur GWT vient d'ailleurs d'être publié.
De mon côté je continuerai à publier les articles de Philippe via la section "Ma sélection d'articles", dans la partie droite du blog.
NB: à noter que Philippe est également l'auteur du tout nouveau logo de Coffee Bean!
Le principe de ce site : présenter des techno le plus simplement possible, avec des tutoriels à l'appui. Un très bon article sur GWT vient d'ailleurs d'être publié.
De mon côté je continuerai à publier les articles de Philippe via la section "Ma sélection d'articles", dans la partie droite du blog.
NB: à noter que Philippe est également l'auteur du tout nouveau logo de Coffee Bean!
Inscription à :
Messages (Atom)