Recherche

Coder's IO

Tag

Java

Parlons sans détour, Parlons cache

 

Lors d'un précédent article je vous avais parlé d'un podcast technique : Une tasse de thé : Quelques minutes de technique logicielle animé par +Eric Lefevre-Ardant 
Pour rappel, le principe de ce podcast est d'aborder des sujets techniques de manière assez synthétique avec un invité expert sur le sujet.

Dernièrement, le 27 octobre 2013, un épisode sur les patterns du cache a été publié. L'invité est +Mathilde Rigabert Lemée. Elle travaille actuellement chez Terracotta L'enregistrement a eu lieu pendant la conférence SoftShake.
Les problématiques de cache sont transverses à toutes les plateformes.

Mathilde présente les différentes stratégies de cache que l'on peut mettre en oeuvre sur une application, comme :
– Cache Aside
– Cache as system of Record,
– TTL,
– TTR.

Les premières stratégies sont expliquées de manière assez générale. En revanche, elle donne une explication plus détaillée sur les stratégies de type : 
– Read-Through,
– Write-Through,
– Write-Behind,
– Refresh-Ahead.

Elle donne aussi des conseils sur les choix de mise en oeuvre de la bonne stratégie. Elle explique qu'il n'y a pas de stratégie permettant de répondre à toutes les problématiques. 
Comme tous les outils, chacun répond à une problématique précise. 

Le format des épisodes est assez court néanmoins il donne une bonne vision et les connaissances minimales permettant d'approfondir la question sur les problématiques de cache.

Sur le lien attaché au post, vous retrouverez tous les pointeurs permettant d'approfondir les différentes stratégies, ainsi que l'épisode au format MP3.

Bonne écoute! 

#Java #cache #pattern
 

IntelliJ 13

 

Plus qu'un mois avant la sortie de la nouvelle version d'Intellij.

Il était possible de la tester cette année en mode early preview access.

Pour ceux qui n'auraient jamais utilisé cet outil, je ne peux que vous recommander de faire l'essai. Sans vouloir reprendre un vieil adage : "l'essayer, c'est l'adopter !" .

Comme à chaque nouvelle release, les nouveautés vont impacter plusieurs parties de l'IDE. Sur le lien attaché au post, vous trouverez une liste quasi exhaustive des nouvelles fonctionnalités. 

Parmi les nouveautés, celle que l'on remarquera est l'intégration d'Android Studio. En effet, Google a désigné officiellement l'IDE de Jetbrain comme l'outil de référence pour le développement sous Android. Ils ont décidé d'investir dans ce sens. 
Auparavant, Eclipse était la plateforme de référence.
 
Google a également choisi de proposer le même niveau de fonctionnalité entre la version communautaire et ultimate.
Pour l'avoir testé sur la version early preview access, Android studio est vraiment très bien.

Je vous propose une petite synthèse des fonctionnalités les plus intéressantes, selon moi.

– Nouveau mode destiné aux présentations en public
– Une nouvelle interface de ligne de commande permettant d'exécuter des commandes SSH
– Possibilité d'affiner les scopes de recherche comme les chaines de caractères ou les commentaires.
– Un nouvel outil de recherche permettant de rechercher dans tous les scopes confondus.
– Intégration d'un grand nombre d'outils liés au Web.
– Support complet de JavaEE 7

En suivant le lien, vous trouverez tous les détails.

#java #idea #intellij #v13

La plateforme Spring IO

 

Annoncée à SpringOne, la plateforme Spring IO est lancée. 

L'objectif de cette plateforme est de fournir aux développeurs un socle technique solide permettant de bâtir des applications modernes. 
La plateforme Spring IO se divise en deux parties distinctes : 
– Spring fondation
– Sprint Domaine-spécifique runtime environnement (DSRs)

Ce socle de fondation (IO fondation) contient les différents modules techniques que l'on connaît bien chez Spring. En voici une liste (non exaustive) : 

– Spring Data,
– Spring Intégration,
– Spring Batch,
– Spring Social,
– Spring WebService,
– etc.

Au-dessus vient la couche d'exécution (IO Execution) composée des trois modules suivants : 

– Spring XD
– Spring Boot
– Grails.

Le module qui propose un réel intérêt dans la vie de tous les jours pour un développeur Spring, c'est Spring Boot.
Il permet de démarrer (très) rapidement et simplement un projet. La simplification vient du fait qu'il gère à notre place la cohérence des versions de dépendences utilisées pour le projet.

Pour mieux comprendre la puissance fournie par l'outil, je vous propose un exemple mettant en oeuvre un serveur HTTP répondant le traditionnel 'Hello world' .

Même si l'exemple est simple, il met en avant la simplicité proposée par la plateforme. L'exemple est tiré du site de référence.

Nous avons besoin d'un pom.xml et d'un fichier java possédant une méthode main ainsi que certaines annotations.

 *pom.xml :*
 
   <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>0.0.1-SNAPSHOT</version>

<!– Inherit defaults from Spring Boot –>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>0.5.0.M4</version>
</parent>

<!– Add typical dependencies for a web application –>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

<!– Package as an executable JAR –>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

<!– Allow access to Spring milestones and snapshots –>
<!– (you don't need this if you are using anything after 0.5.0.M2) –>
<repositories>
<repository>
<id>spring-snapshots</id>
<url>http://repo.springsource.org/snapshot</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<url>http://repo.springsource.org/milestone</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>http://repo.springsource.org/snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>http://repo.springsource.org/milestone</url>
</pluginRepository>
</pluginRepositories>
</project>

Fichier Java

  import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;

@Controller
@EnableAutoConfiguration
public class MyController {

@RequestMapping("/")
@ResponseBody
String home() {
return "Hello World!";
}

public static void main(String[] args) throws Exception {
SpringApplication.run(MyController.class, args);
}
}

Une fois le projet Maven créé, il suffit de lancer la commande suivante : 

  mvn package
  
pour générer le jar exécutable et ensuite lancer la commande suite : 

  java -jar target/myproject-0.0.1-SNAPSHOT.jar
  
pour lancer notre serveur. Une fois le serveur lancé, aller dans votre browser préféré et taper l'adresse suivante : 

  http://localhost:8080/

Vous devriez voir le résultat suivant dans votre navigateur: 

  Hello world!.
  

Concrètement, ce (petit) projet s'appuie sur le module Spring MVC
On peut remarquer que dans le descripteur maven on ne référence pas explicite la version du module utilisé. Celle-ci est définie par le pom parent. 

On s'apercoit également, au travers de cet exemple, que très simplement nous avons pu exploiter la puissance de spring sans écrire une seule ligne de configuration xml. 

En effet, l'ensemble de la plateforme se base sur le principe de convention par-dessus la configuration. Cela veut dire que si l'on respecte les conventions adoptées par l'outil, alors un certain de nombre de choses est pris en charge automatique.

Aujourd'hui la plateforme n'en est pas encore à une version majeur, néanmoins, celle-ci est déjà largement opérationnelle.

Sur le site du projet, on peut trouver une multitude de 'getting started' se basant sur plusieurs scénarii différents. A partir de ces projets et selon nos besoins on peut mettre en place un projet en '2 temps, 3 mouvements'.

Je ne vous ai présenté qu'un survol assez général, je vous recommande le site de référence. Il est très bien fait et permet une prise en main de l'outil très facilement.

#java #spring.io #springBoot
 

Jongo

 

Dernièrement je suis allé à la conférence Codeur en Seine. "Juste en passant, c'est une très bonne conférence je vous la recommande."

J'ai assisté à un talk sur MongoDb donné par +Katia Aresti 
Le principe était de présenter à grosses mailles l'outil et de faire un retour d'expérience d'un projet de la vraie vie.
Une présentation très intéressante.

Durant la présentation, Katia a parlé du projet Jongo. C'est un projet qui a pour objectif de développer un driver Java pour MongoDB.

Actuellement, il existe un driver nommé Morphia qui se base sur une syntaxe à la JPA. Étant donné la nature de la base, il est vrai que l'approche JPA n'est finalement pas très adaptée.

Il existe déjà un driver Java proposé par l'éditeur de MongoDB. Globalement, le driver est bien, mais la syntaxe n'est pas toujours intuitive et risque de perdre le développeur à l'aise dans la console.

Et il y a Jongo. 
Jongo vient combler un manque dans l'écosystème : celui de fournir une api permettant d'écrire des requêtes de la même manière que celle utilisée dans la console.

On peut quasiment copier les requêtes rédigées dans la console et les coller dans notre code Java : 

Dans la console :
db.friends.find({age: {$gt: 18}})

Dans le code Java
friends.find("{age: {$gt: 18}}").as(Friend.class)

Et pour vraiment voir l'avantage, ci-dessous la même requête redigée avec le driver Java :
friends.find(new BasicDBObject("age",new BasicDBObject("$gt",18)))

(les exemples ci-dessus sont tirés du site du projet)

La documentation du projet est très claire et pragmatique, ce qui permet un démarrage rapide avec l'API.

Je vous invite à jeter un coup d’œil sur le site pour vous faire une idée plus précise.

#Java #jongo #driver #mongoDB

Java ou Scala?

 

Bien que cette page traite principalement du langage Java, ce soir je vous propose d'élargir le champ en parlant d'un langage faisant partie de l'écosystème de Java : Scala (Nous restons malgré tout dans la JVM 😉 )

Je vous propose donc un pointeur vers un article, faisant un état des lieux des idées reçues sur les points différenciateurs entre Java et Scala. 

Un point à noter, l'article date de mars 2012. Même si celui-ci a été publié il y a plus d'un an, certains points sont toujours d'actualité.

Cet article tente de garder un regard objectif sur les idées reçues (ou fondées) sur le sujet.

L'auteur, +Julio Faerman, aborde un à un les points principaux en comparant les deux langages.

Voici les principaux points abordés : 
– la différence de productivité,
– Concision du code,
– Complexité du langage,
– Gestion de la concurrence,
– Extensibilité,
– Interopérabilité,
– etc…

Pour les javaistes puristes en cours de questionnement sur l'apprentissage d'un nouveau langage, l'article en lien de ce post pourra apporter des éléments de réponse.

#java   #scala #versus

Avatar

 

Lors de la dernière édition de la conférence JavaOne, Oracle annonçait la release du projet open source : Avatar
C'est lors de l'édition 2011 que le projet avait été annoncé.

Aujourd'hui, l'ensemble des applications Web définissent une architecture SPA (Single Page Application). Dans ce type d'application, l'ensemble de la logique est déportée du serveur vers le client, où l'on retrouve l'ensemble des composants modèle, vue et contrôleur. Pour aider à l'implémentation, il existe une multitude de frameworks (Angular.js, Backbone.js, …)

Ce type d'architecture requiert une connaissance avancée de Javascript.

L'idée du projet Avatar est de proposer un framework basé, entre autres, sur Javascript côté serveur et HTML5 coté client. 

C'est-à-dire que toute la stack technique côté serveur est basée sur Javascript (un schéma très clair est disponible ici : https://avatar.java.net/docs/overview.html). 
Cette couche a pour objectif de fournir des services basés sur un protocole 'standard' (REST et Websoket).

La partie cliente sera basée principalement sur HTML5 et propose un découplage net entre la vue et la couche de service.
Le framework facilite la conception et la réalisation d'application de type SPA.
Un point original : La documentation du projet indique que les développeurs ont seulement besoin de faire des copier/coller à partir d'exemples, et ensuite adapter le code pour bâtir une application.  

L'utilisation de Javascript n'est pas là pour remplacer Java, mais plutôt comme une nouvelle possibilité dans les choix d'implémentation côté serveur.
Il est naturellement possible d'utiliser conjointement les deux langages (cas d'une ancienne API écrite en Java, par exemple).

Les pré requis techniques : 
– un conteneur compatible avec la spec JavaEE 7, 
– un runtime Java 8

L'interprétation du Javascript côté serveur sera assurée par le runtime issu du projet Nashorn.

Le projet est sous licence open source et le code est disponible sur github.
La documentation du projet est bien faite et permet une prise en main aisée de l'outil.

Avatar permet à Oracle d'intégrer dans son socle technique qu'est la stack JavaEE, la possibilité d'implémenter facilement des applications aux architectures contemporaines.

Je me souviens que lors d'un épisode du podcast des castcodeurs, Antonio Goncalvez exprimait le regret de l'absence d'un outil tel que Avatar dans la stack JavaEE… visiblement son vœu a été exaucé. 🙂

#java #javaEE7 #Avatar

Typeof

 

Typeof est l'API qui a été développée avec pour objectif d’éliminer (ou de limiter) l’utilisation de l’opérateur instanceof et du downcasting
Il est bien connu que l’usage de cet opérateur relève d’une mauvaise pratique tout comme le principe de downcasting. 

Cette API a été développée à l’origine dans le cadre d’un projet afin de limiter l’utilisation des deux éléments décriés ci-dessus.
L’auteur, +Tomasz Nurkiewicz , a implémenté cette API sous forme d’un DSL. 
Les propriétés mises en avant sont :

– plus de downcasting explicite,
– limitation de l’utilisation de l’opérateur instanceof,
– une syntaxe plus claire et facile à utiliser,
– utilisation du typage fort de Java,
– permet de travailler avec tout type de classe.

Voici un exemple de la syntaxe  : 

int result = whenTypeOf(obj).
   is(String.class).thenReturn(String::length).
   is(Date.class).thenReturn(d -> (int) d.getTime()).
   is(Number.class).thenReturn(Number::intValue).
   is(TimeZone.class).thenReturn(tz -> tz.getRawOffset() / 1000).
   is(MyType.class).thenReturn(7).
   get();

Pour les Javaistes/Scalaistes, on retrouve des bribes du pattern matching .

Un des avantages du DSL est de prévenir de toute utilisation incorrecte au moment de la compilation (gain de temps). Vous pourrez trouver des exemples sur le lien attaché à ce post ainsi que des détails sur l’implémentation de typeof.

Les sources, très légères (peu de classes) sont disponibles sur github.

#java #instanceOf #DSL #API

Javolution

Certains domaines fonctionnels nécessitent d'avoir du traitement en temps réel, comme le domaine bancaire, le domaine du jeu, l'aviation, etc.

On peut retrouver dans tous ces domaines le langage Java. Malheureusement, il souffre de certains maux qui ont un impact directement sur les temps de réponse.
Bien entendu, ces problématiques de temps de réponse sont vraiment liés à ces domaines fonctionnels très exigeants.

L'origine de ces problèmes est liée en général aux points suivants :

– Garbage collector, lorsqu'il "stoppe le monde" ,
– des temps de réponse liés au JIT,
– l'initialisation des classes,
– dans le cadre des collections, le redimensionnement interne.
– etc

Je le répète, les points soulevés ci-dessus sont critiques dans certains domaines fonctionnels exigeants.

Face à ces problématiques, IBM et Sun ont développé respectivement IBM Websphere Real Time et Sun Mackinac. Ces deux solutions sont payantes. En face, Jean-Marie Dautelle a développé une librairie gratuite nommée : Javolution.

L'objectif de cette librairie est de permettre des temps d'exécution beaucoup plus rapides et prévisibles.
Les points suivants vous donnent une idée des possibilités de Javolution.

Elle permet :
– d'exploiter plusieurs coeurs sur un processeur.
– de réduire les temps d'exécution à l'aide d'un jeu d'annotations
– l'intégration native avec un écosystème OSGi.
– collections : support de Map-Reduce, parallélisme, views (~Stream dans Java8).
– manipulation des collections.
– etc…

Cette liste n'est pas exhaustive. L'ensemble des fonctionnalités est décrit dans le lien attaché à ce post.

Il est intéressant de souligner la légèreté du jar de la librairie : ~400Ko
Javolution supporte Maven, et est disponible sur les repositories publiques.

L'ayant découvert que très récemment au travers d'une discussion technique, Je n'ai pas eu le temps de la mettre en oeuvre. je vous recommande de parcourir le site ainsi que l'ensemble des liens disponibles sur le site attaché à l'article.

#java #real #time #api

Java8 : JDeps

 

Dans la prochaine version du JDK, la version 8, un outil sera présent, appelé JDeps. Il aura pour but de fournir une analyse des dépendances statiques d'un projet.

JDeps permet de voir les packages dont dépend la cible analysée (un fichier .class, un répertoire ou une archive .jar)

Voici un exemple tiré de lien attaché à ce post : 

$./bin/jdeps demo/jfc/Notepad/Notepad.jar
<unnamed> (demo/jfc/Notepad/Notepad.jar)
     -> java.awt
     -> java.awt.event
     -> java.beans
     -> java.io
     -> java.lang
     -> java.net
     -> java.util
     -> java.util.logging
     -> javax.swing
     -> javax.swing.border
     -> javax.swing.event
     -> javax.swing.text
     -> javax.swing.tree
     -> javax.swing.undo
 
Dans cet exemple, JDeps décrit l'ensemble des packages utilisé dans le projet Notepad.jar

Plusieurs options sont disponibles comme la possibilité de définir la profondeur de la transitivité (–depth).

Pour en savoir plus, vous trouverez d'autres exemples en suivant le lien attaché à ce post.

#java   #dependance   #java8   

Propulsé par WordPress.com.

Retour en haut ↑

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