Sur la route d'Oxiane digressions diverses

LeBlog OXiane

27 août
2012

6 heures de Silverstone 2012 : Bonne course pour Olivier Lombard, malchance pour l’équipage

Cette fois, c’est le début du troisième tiers de la course britannique qui a été fatal à l’Oreca-Nissan 03 #23, à laquelle la réussite se refuse une nouvelle fois.

« Nos essais libres se sont bien passés. Je me suis concentré sur le travail à faire pour régler la voiture. Il y avait beaucoup à gagner et c’est ce qui a été fait », assure Olivier. « Car en course, la voiture était assez rapide. Franck Mailleux a logiquement été chargé de signer le temps en qualification. Nous utilisions les pneus durs, et son 6e chrono des LMP2 était le maximum que nous pouvions faire, les autres semblant tous être en pneus “soft“. Au warm-up, nous avons roulé tous les trois à tour de rôle. Le début de course s’est bien passé, Franck remontant un moment jusqu’à la 3e place. Un peu plus tard, malheureusement, une GT l’a touché à l’arrière et l’a mis en tête-à-queue. Ce qui l’a obligé à anticiper son deuxième relais et nous a fait perdre quelques places. Quand je suis reparti après 1h20 de course, nous étions à un tour de la tête. J’ai fait deux bons relais, même si je suis resté un peu trop longtemps derrière la Lola Status. Cela m’a pris la première moitié de mon premier relais pour réussir à le dépasser. Nous étions 8e ou 9e de la catégorie lorsque j’ai passé le volant à Jordan Tresson. Hélas, à la fin de son deuxième relais, une crevaison a provoqué sa sortie de piste définitive… »

Pour l’Oreca-Nissan #23, c’était l’abandon, le deuxième après Sebring, avec le triste privilège d’être le second des très rares retraits de la course. Une issue bien décevante, dès le 136e des 194 tours couverts, quand on voit que les autre pilotes de Signatech-Nissan, avec la #26, ont brillamment réussi à terminer sur la troisième marche du podium, à moins de 20“ des vainqueurs. Souhaitons maintenant à la #23 de revoir un drapeau à damier, et si possible en bonne place, aux prochaines 6 Heures de Sao Paulo le 15 septembre.

Vous pouvez retrouver Olivier Lombard :

-      Sur son compte Twitter – @OLombardPilote

-      Sur sa page Facebook – Olivier Lombard / Pilote

-      Sur son site internet – Olivier Lombard site officiel

©Vision Sport Agency

 

Jean-Louis Rousselin

jlrousselin

26 août
2012

Dans les starting block pour l’ESUG 2012

 Arrivés en début de soirée avec Gaëtan à Gand, nous nous préparons doucement pour la difficile semaine qui s’annonce ;-)

C’est que cette année,  la 20ème édition des conférences ESUG (European Smalltalk User Group) se passe en Belgique. Il risque d’y avoir du challenge en soirée.

La modération sera quand même de mise car il n’est pas question d’être dans un état second pendant les présentations qui s’annoncent aussi passionnantes que variées (Manu, si tu nous lis, je penserai à toi mercredi matin !)

Ce sera notamment pour nous l’occasion de faire le point sur l’état actuel et les perspectives de Smalltalk.

Bien entendu, on vous tiendras au courant avec Gaëtan (enfin, on essaiera)

Jean-Francois Lefevre

jflefevre

19 juil
2012

Les missions de formations nécessitent parfois de long déplacements …

Il faut parfois se déplacer à l’autre bout du monde pour répondre aux besoins de formations de ses clients. En effet, après 3 semaines de formations sur Java and co, c’est en direct de Nouméa en Nouvelle Calédonie  que je vous donne un petit aperçu du rude hiver local …

Emmanuel Pavaux

epavaux

17 juil
2012

Java 8 : Le Projet Lambda

Lambda expressionLa loi de Moore se traduit aujourd’hui, non par la puissance des processeurs, mais par la multiplication de leurs nombres. On vit depuis un peu plus d’une décennie l’ère des processeurs multi-cœur. Exploiter le mieux possible cette puissance de calcul – par la parallélisation des processus – reste un enjeu majeur de l’ingénierie logicielle. Actuellement des API existent en Java mais leur caractère relève d’un vrai jardin du diable. La complexité de leur implémentation, couplée à la sphère de l’interblocage, limite leur utilisation dans les programmes informatiques. Alors que la plus part des problématiques de parallélisation apparaissent au cours du développement, vu la profondeur du gap qui existe entre un programme classique (séquentiel) et un programme parallèle, le choix de paralléliser (ou non) doit être pris en compte depuis la phase la conception.

Brian Goetz est architecte Java chez Oracle et l’auteur de « Programmation concurrente en Java ». Dans les premières pages de son livre il donne des chiffres intéressants sur le nombre de bugs dévoilés sur des applications, conçues pour des architectures traditionnelles, lors de leur premier déploiement sur une architecture parallèle. En effet, même si nos programmes ne prennent pas en charge cette problématique de la parallélisation, on s’appuie régulièrement sur des librairies qui font du multithreading, surtout dans le développement web.

Le Projet Lambda

Un petit clin d’œil à Stéphane qui a consacré un billet sur le futur de Java, il y a déjà deux ans, avec une illustration en PHP. ;)

L’objectif principal du projet lambda est, en s’appuyant sur la puissance de la programmation fonctionnelle, de prendre le taureau par les cornes en rendant la construction de programmes parallèles aussi simple que possible et donner par la même occasion une syntaxe plus funky. A cet effet, tous les composants de l’écosystème Java, le noyau du langage, la machine virtuelle et les librairies de base, sont appelés à évoluer.

La programmation fonctionnelle

Tout comme la programmation impérative, la programmation objet, la programmation logique et les systèmes multi-agent, la programmation fonctionnelle est un autre paradigme de programmation. A l’origine elle est fondée sur la notion mathématique de fonction ; une application qui associe à chaque élément d’un ensemble A dit Ensemble de Départ au plus un élément d’un ensemble B dit Ensemble d’Arrivée.

Ceci n’est pas une fonction :

int i = 0 ;
int f ( int j ) {
i = i + j ;
return i ;
}

La valeur de f(j) ne dépend pas seulement de j, mais aussi de i. Pour une même valeur de j on peut avoir deux résultats différents de f(j). Donc f n’est pas une fonction. Voici les conditions qu’elle doit satisfaire pour en être une :

  1. f ne doit dépendre d’aucune variable en dehors de son contexte
  2. Aucune variable de f ne peut être modifiée en dehors de son contexte
  3. Aucune variable de f ne peut conserver son état

Et tout ça pour en venir où ? En fait une des tâches du compilateur consiste à chercher les dépendances entre les différentes instructions afin de paralléliser celles qui ne présentent pas de dépendance. La syntaxe fonctionnelle introduit moins de dépendances – les fonctions sont dites closes- et donne suffisamment d’informations au compilateur pour lui faciliter l’optimisation du code.

Les lambda expressions

Longtemps cantonnés dans les laboratoires de recherche et réservée aux universitaires, les Lambda expressions (techniquement aussi appelés « closure ») sont enfin disponibles en Java. En réalité ceci n’a rien de révolutionnaire, tous les langages concurrents de Java, C#, Scala et Groovy (et smalltalk depuis plus de 30 ans) permettent d’utiliser les Lambda expressions. Au début c’était attendu pour Java 7 avec le projet Coin mais leur intégration a dû être reportée pour des contraintes de délai. Le projet est actuellement en cours de finalisation et la première release est prévue pour début 2013.

De quoi s’agit-il exactement ? Les Lamba expressions sont des fonctions anonymes qui sont à la base de la programmation fonctionnelle. Elles ont la même structure qu’une méthode ; une liste d’arguments, un type de retour, un corps et les exceptions à lever.

(type parameter) -> function_body

Quelques exemples de lambda expression :

(int x) -> x + 1 ;
(int x, int y) -> x + y ;
(int x, int y) -> { System.out.println(" Résulat : " + (x+y)); }
() -> { System.out.println("I am a lambda expression"); }

Les types des paramètres ne sont pas obligatoires, ils peuvent être obtenus par inférence, déduits en fonction du contexte.

Exemple :

(x) -> x + 1 ;
(x, y) -> x + y ;
(x, y) -> { System.out.println(" Résulat : " + (x+y)); }

Les expressions lambda peuvent être stockée dans des variables, passées en paramètre ou retournée par des méthodes.
Exemple:

X = () -> {while (true) { System.out.println("Hello"); }}
new Thread(X).start();

Les classes anonymes de Java

Brian Goetz rappelle que des structures dont le fonctionnement se rapproche des closures existent déjà en Java, les fameuses classes anonymes, avec toutefois une légère différence sur la capture des variables déclarées avec final. Couramment utilisés pour le traitement des évènements des IHM, elles sont à l’origine de sucre syntaxique assez inélégant.

Exemple :

button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
//…
}
}

Ce qui pourrait s’écrire avec les expressions lambda :

button.addActionListener(e -> {…})

Les lambda expression et les collections Java

Les lambda expressions permettront également de simplifier la manipulation des collections à travers les trois opérations d’agrégation incontournables de la programmation fonctionnelle, le map, le filter et reduce (ou fold). En PF ce sont des fonctions d’ordre supérieure, elles prennent en paramètre une fonction et une collection, et peuvent retourner une fonction. En POO, ce seront de nouvelles méthodes de la classe Collections.

Exemple :
Map : Applique sur les éléments d’une collection une fonction et retourne une liste.

List counts = new ArrayList();
for(int i=1;i <= 10; i++){
  counts.add(i);
}
aList = counts.map(i -> (i*2));

Filter : Applique sur les éléments d’une collection un prédicat et retourne une collection composée des éléments qui vérifient le prédicat.

List filteredList = …
for ( Integer i : counts){
if ( i % 2 == 0 ){
filteredList.add(i);
}
}
aList = counts.filter(i -> i%2 == 0);

Reduce : Applique sur deux éléments consécutifs d’une collection une fonction qui retourne une valeur. On peut l’utiliser pour faire la somme des éléments d’une liste, trouver le plus grand élément d’une liste comme dans cet exemple, …

int max = 0;
for ( Integer i : counts){
if ( i > max ){
max = i;
}
}
max = counts.reduce(0, (x,y)-> x>y);

Conclusion

J’ai essayé de montrer à travers ce billet l’intérêt du projet Lambda dans le contexte actuel de l’ingénierie logicielle et de faire découvrir à travers des exemples jusqu’à niveau la syntaxe du langage va évoluer, on peut par exemple prévoir la disparition des classes anonymes. Dans un prochain billet je parlerai d’autres aspects du projet, notamment les VEM et les SAM.

Références

Brian Goetz : http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html
M.V. Aponte : Introduction à la programmation fonctionnelle avec Ocaml
Urs Peter and Sander van den Berg : www.infoq.com/articles/java-8-vs-scala
Blog Oxiane2010/12/01 les lambda fonctions en php ou comment en arriver à discuter du futur de java (épisode 1)

ydabo

4 juil
2012

Atelier RIA : “Développement d’applications RIA avec le Google Web Toolkit”

Ce mercredi 27 Juin, Oxiane Méditerranée a réalisé une présentation de GWT en partenariat avec la CCI de Montpellier et NOVAE LR.
NOVAE LR est une association pour le développement des TIC en Languedoc Roussillon.

Le but de cet atelier était de présenter l‘approche RIA proposée par Google avec son toolkit pour le web.
La grande force de GWT est de développer en Java des composants Javascript permettant une ergonomie riche des applications web.

Cette approche apporte de nombreux avantages : utilisation des outils de la plateforme Java, une optimisation poussée du Javascript, la performance et la scalabilité, unefacilité d’apprentissage du framework et une productivité importante des développements.

Différents sujets ont pu être abordés avec notamment un panorama des outils intéressants de GWT : UIBinder, GWT Designer, Speed Tracer ou les nombreuses bibliothèques … et la présentation de quelques notions avancées de GWT comme le code splitting, les modes d’échanges vers la partie serveur ou encore la gestion native de Javascript par JSNI.

Emmanuel Pavaux

epavaux