Skip to content

Category archive for: Programmation

Sikuli : faire des macros avec des captures d’écran

Voici un outil impressionnant et utile : SIKULI.

Sikuli est un outil de création de script d’automatisation et de test d’IHMs basé sur des captures d’écran.

Sikuli automatise tout ce que vous pouvez voir à l’écran sans utiliser d’API interne du système.
Vous pouvez contrôler une page web, une application Windows/Linux/OS X ou encore une appli iphone ou android via VNC.

Le plus simple pour bien comprendre est de regarder une démo :

Sikuli est un projet de recherche open source développé au User Interface Design Group du MIT Computer Science and Artificial Intelligence Laboratory (CSAIL) .

[Project SIKULI ]

Le futur de Java (Devoxx 2010)

Le débat « The Future of Java Discussion Panel » est disponible gratuitement chez parleys.com.

Je vous encourage à la regarder si vous voulez en savoir plus sur les dessous de la gestion de Java par Oracle.

De plus, l’excellent Joshua Bloch est présent, ce qui n’enlève rien.

PS: L’incrustation vidéo ne fonctionne pas toujours bien, voici le lien direct

Jongler avec les backslashes dans les regexps Java

Un des gros problèmes lorsqu’on utilise des regexp en Java est que le backslash doit être quadruplé.

En effet, pour représenter un backslash dans une String, il faut le doubler (échappement). De plus, ce caractère doit aussi être échappé dans une regexp ce qui nous amène à un total de 4 backslashes au lieu d’un.

Il existe cependant une méthode qui peut grandement vous simplifier la tâche :

Pattern.quote(String)

Cette méthode se charge d’échapper tous les caractères spéciaux liés aux regexps. Par exemple, pour séparer une chaîne contenant des « – » :

String[] result = "a-b-c-d".split(Pattern.quote("-"));

Dans le cas des backslashes, il faut toujours les doubler dans la chaîne mais ça reste plus compréhensible.

Google Guava : trier des éléments à champs nullables

Voici un problème auquel j’ai été confronté plus d’une fois : trier en java des éléments en fonction d’un de ses attributs … qui peut être null.

La méthode classique pour faire ça : le bon vieux comparateur, mais qui devient vite compliqué avec les test de nullité :

Comparator<MonBean> byLibelle = new Comparator<MonBean>() {
      public int compare(final MonBean b1, final MonBean b2) {
        if (b1.getLibelle() == null) {
          // null des deux côté
          if (b2.getLibelle() == null) {
            return 0;
          } else {
            // b2 non null, donc supérieur
            return -1;
          }
        } else {
          if (b2.getLibelle() == null) {
            // b2 null, b1 est donc supérieur
            return 1;
          } 
        }       
        return b1.getLibelle().compareTo(b2.getLibelle());
      }
   };
Collections.sort(myList, byLibelle);

Bon, c’est un peu bourrin, moche, mais ça fonctionne.

Voici une autre solution beaucoup plus élégante utilisant la classe Ordering de Guava :

    Comparator<MonBean> byLibelle = new Comparator<MonBean>() {
	  public int compare(final MonBean b1, final MonBean b2) {
		return Ordering.natural().
                      nullsFirst().
                      compare(b1.getLibelle(), 
                                     b2.getLibelle());
	  }    	
	};
    Collections.sort(myList, byLibelle);

Ici, Ordering.natural().nullsFirst() retourne une instance de la classe Ordering effectuant un classement par ordre naturel avec les éléments nulls en premier. Simple non ?

Ce qu’il faut retenir, c’est qu’Ordering est un Comparator aux hormones permettant d’effectuer des tris multiples, d’appliquer une fonction sur les éléments avant le tri, etc …

[ Ordering, Javadoc ]

Google Guava : la classe MapMaker

Parmi les bibliothèques Guava fournies par Google (si vous ne connaissez pas, je vous les recommande), la classe MapMaker mérite toute votre attention, elle permet de construire des ConcurrentMaps dont le comportement est fortement paramétrable.

Voici un exemple issu de la javadoc :

 ConcurrentMap<Key, Graph> graphs = new MapMaker()
       .concurrencyLevel(32)
       .softKeys()
       .weakValues()
       .expiration(30, TimeUnit.MINUTES)
       .makeComputingMap(
           new Function<Key, Graph>() {
             public Graph apply(Key key) {
               return createExpensiveGraph(key);
             }
           });

Parmi les fonctionnalités intéressantes de cette classe, on peut noter les possibilités:

  • utiliser des SoftReference ou WeakReference comme clé ou valeur de la map
  • de faire expirer des éléments de la map après un délai déterminé
  • de mettre en place un Listener de suppression des éléments
  • de générer les éléments de la map à la demande via une fonction de calcul (makeComputingMap)

Puissant et utile ! :)

[ Slides de présentation de Guava ]
[ Les bibliothèques Google Guava ]
[ MapMaker (JavaDoc) ]