BreizhCamp 2013, FastConnect était là !

Comme je l’avais annoncé précédemment, nous étions présents les 13 et 14 juin au BreizhCamp 2013, LA conférence de l’Ouest :)

Il faut avouer que cette année la concurrence est rude :). Et oui, après avoir vu notre beau stand de l’édition 2012 (nous étions le seul sponsor à avoir un stand :)), tous les autres sponsors ont sorti leur artillerie lourde cette année.

Mais grâce à nos démos de MuleStudio, JRules et de notre portail de déploiement « votre custom PaaS dans votre Cloud » (basé sur Cloudify, entre autres, et développé par le Centre d’Expertise Cloud — contactez nous si vous voulez voir une démo :)), qui a été le point d’orgue de la 1ère journée (tout s’est très bien déroulé — à l’exception du petit effet démo avec PowerPoint qui s’est figé :(), nous n’avons pas peur de dire qu’il y avait du monde à notre stand :)

La 2ème journée a été tout aussi intense avec les démos en continu (et après le CI, nous avons mis en place le Continous Demo :)) et un très bon moment de détente avec beaucoup de participants à notre jeu FastDraw, dessinez c’est gagné, version geek où il y avait de nombreux lots à gagner :)

Bref, ce fut une expérience enrichissante… et un événement très bien organisé ! Merci à l’équipe organisatrice du BreizhCamp !

Et je tiens également à remercier l’équipe FastConnect Rennes, en particulier Matthieu, Antoine, Yoann et Violaine, pour leur implication et préparation. Bien entendu, les démos ne seraient pas aussi intéressantes sans les experts du CE Cloud : spécial dédicace donc à Gauvain, Mathias, Noureddine (et j’en oublie d’autres… et je m’en excuse). Et pour finir, un grand merci à Laure, notre chargée de recrutement préférée, qui s’est aventurée en terre bretonne pour l’occasion et qui m’a appris un nouveau mot : kakémono :)

20130614_132814 IMG_1452 IMG_1455 IMG_1464 IMG_1469

Rendez vous au Devoxx France 2013

Si vous êtes un peu geek (ça doit être le cas, car vous êtes sur notre blog :)) et si vous surfez sur le web pendant votre temps de travail (?? :) ), vous savez certainement que le Devoxx France aura lieu le 27 mars prochain. Et comme pour la 1ère édition, FastConnect fait de nouveau parti des sponsors de cet événement.

Et une fois de plus, nos consultants se plient en 4 (ou en 2 .. ça dépend de l’agilité de chacun :)) pour vous préparer une petite surprise ici.

Donc rendez vous sur notre stand ou sur cette page à partir du 27 mars.

On vous attend ! Comment ? Vous n’y allez pas ? Oh .. vous allez nous manquer :(…. Mais rassurez-vous, vous pouvez toujours venir nous voir sur notre stand au BreizhCamp 2013, une conférence chez les bretons pour les bretons et les non bretons dont FastConnect est également sponsor.

A bientôt…

Embedding Tomcat 7 for unit tests

Recently (in fact, few months ago), I have had to develop a small REST service exposing some methods that could be invoked remotely by a REST client (using GET and POST methods). The service contract was so simple that I took less time to write the service class by using Jersey that declaring all the Spring dependencies in the project pom.xml or creating a new application with the Play! framework.

As a not fully agile developer, I didn’t write the tests before starting the service (oh !! you don’t respect the TDD ? no ! I don’t — unless for this time — :)). So after finishing the few lines of code of my service (<500 lines), came the time to test my service.

Then I was wondering myself how could make quickly an integration test in my JUnit test case inside my IDE, before creating a new Jenkins Job (yes ! this time I’ve heard about the CI :)). Below some of them :

  • Servlet Unit test
  • using Arquilian
  • starting manually an external servlet container
  • starting a container with Cargo
  • using an embedded server started during the test setup phase (@Before for instance)
  • etc…

As a lazzy developer as usual, I opted for the simpliest choice (for me) : using an embedded Tomcat server.

First, I added the following line (dependencies management) in my project pom.xml. Yes! here the project is a Maven based project.


<properties>
	<tomcat-version>7.0.26</tomcat-version>
</properties>
...
<!-- TEST -->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-core</artifactId>
			<version>${tomcat-version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-logging-juli</artifactId>
			<version>${tomcat-version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<version>${tomcat-version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-jasper</artifactId>
			<version>${tomcat-version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-jasper-el</artifactId>
			<version>${tomcat-version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-jsp-api</artifactId>
			<version>${tomcat-version}</version>
			<scope>test</scope>
		</dependency>

And then, here comes the code… :)

Please note that there are so many different ways to achieve the same goal, therefore my following code is provided  for the example purpose only. Of course, you can write your classes by using your own style :)

First, I wrapped the Tomcat inside a Runnable that will be started during the test init phase

//import are removed
public class EmbeddedServer implements Runnable {

	private Tomcat	tomcat;
	private Thread	serverThread;

	public EmbeddedServer(int port, String contextPath) throws ServletException {
		tomcat = new Tomcat();
		tomcat.setPort(port);
		tomcat.setBaseDir("target/tomcat");
		tomcat.addWebapp(contextPath, new File("src/main/webapp").getAbsolutePath());
		serverThread = new Thread(this);

	}

	public void start() {
		serverThread.start();
	}

	public void run() {
		try {
			tomcat.start();
		} catch (LifecycleException e) {
			throw new RuntimeException(e);
		}
		tomcat.getServer().await();
	}

	public void stop() {
		try {
			tomcat.stop();
			tomcat.destroy();
			deleteDirectory(new File("target/tomcat/"));
		} catch (LifecycleException e) {
			throw new RuntimeException(e);
		}
	}

	void deleteDirectory(File path) {
		if (path == null) return;
		if (path.exists()) {
			for (File f : path.listFiles()) {
				if (f.isDirectory()) {
					deleteDirectory(f);
					f.delete();
				} else {
					f.delete();
				}
			}
			path.delete();
		}
	}

Finally run my JUnit tests where my client could request my REST service that has been previously deployed on the embedded Tomcat instance

public class MyAppDeployedOnLocalTest {

	@Before
	// or @BeforeClass
	public void startServer() throws ServletException {
		embeddedServer = new EmbeddedServer(9090, "/myservice");
		embeddedServer.start();

	}

	@After
	// or @AfterClass
	public void stopServer() {
		embeddedServer.stop();
	}

	public void test_send_request_without_parameters (){
            Client client = ...
            Reply reply = client.sendRequest();
            assertTrue (reply.isOk());
    }
}

And ..voilà ! :)

FastConnect Inside : le vendredi du connaisseur

Pour notre session de juillet du « Vendredi du connaisseur » (session technique où chacun parle d’un sujet/problématique qu’il a rencontré pendant le mois), nous avons choisi de faire simple : pizza pour tous & prez en freestyle.

Finalement au menu, nous avons eu droit à :

  • une introduction résumée de la formation MongoDB que Mael & Florian ont suivie le mois dernier dans les locaux de FastConnect à Issy (en partenariat avec 10gen)
  • une petite présentation sur la gestion de la mémoire par la JVM et le pourquoi du classique « java.lang.OutOfMemoryError: PermGen space » par Arnaud
  • un survol sur le fonctionnement du SSO & intégration CAS accompagné d’une démo qui marche :) par Marc

Sans oublier les 6 pizzas (de 2 personnes) : Ananas, Cap Horn, Bolognaise, Catalane, Los Angeles et Orientale ;)

Rendez vous à la prochaine session …

Équipe FastConnect Rennes

Java : quizz #4

Il y a quelques temps, une de mes connaissances (qui a délaissé le Java au profit du C embarqué) m’a montré quelques lignes de son code en Java et m’a demandé que va-t-il se passer à l’exécution ?

(Ci-dessous le code, que j’ai fortement allégé et gardé le nécessaire pour notre quizz :))

public class Quizz4 {

	public void handle(Object obj) {
		System.out.println("Handle object : "+obj);
	}
	
	public void handle(String string) {
		System.out.println("Handle string : "+ string);
	}

	public static void main(String[] args) {

		Quizz4 quizz4 = new Quizz4();
		Object obj = null;
		quizz4.handle(null);
		quizz4.handle(obj);
		obj = new String ("my string");
		quizz4.handle(obj);
		quizz4.handle(obj.toString());
	}

}

Bien entendu, ici je simule certains traitements par un simple d’affichage à la console. Et donc, questions pour vous : à votre avis, si on exécute le code (la méthode main) :

A. le code ne se compile pas.
B. le code s’exécute correctement. Dans ce cas, que verrait on affiché à la console ? Et pourquoi ?
C. le code s’exécute correctement, mais on ne peut pas prédire son comportement. Et pourquoi ?

21 juin 11 – Soirée GigaSpaces au NoSQL User Group

GigaSpaces XAP ! Ce nom vous dit quelque chose ? Certainement car c’est ce que vous allez apprendre si vous êtes inscrit(e) à la session de formation publique GigaSpaces XAP.

Mais si vous n’êtes pas (encore) inscrit(e) à la formation et vous voulez savoir de quoi il s’agit ? Je vous invite alors à venir à la soirée GigaSpaces au NoSQL User Group qui sera assurée par Gauvain, le directeur de notre département Conseil et Solutions.

Ci-dessous les coordonnées de l’événement :

Lieu : OCTO Technology, 50 Avenue des champs Elysees, 75008 PARIS
Date : 21 juin 2011 – 19h
Pas d’inscription  nécessaire



Venez nombreux !

Java : quizz #3

Bonjour,

Il y a quelques jours, Jo (le nom a été changé pour préserver son anonymat :)), un développeur qui a été contraint par son manager d’écrire du code (qui doit utiliser les generics) permettant d’abstraire le code de la nouvelle application et celui du l’ancienne (basée sur une vieille techno maison). On lui a imposé le pattern suivant :

1. soit l’interface commune :

public interface Service<T>
{
  T process (Command command);
}

2. la nouvelle implémentation (de l’application new generation) :

public class NewGenerationService<Result> implements Service<Result>
{
   public Result process (Command...command){....}
}

3. cependant le code basé sur le legacy system ne retourne pas de résultat. De ce fait Jo ne sait pas comment écrire son service

public class LegacySystemService implements Service<??>
{
  public ?? process (Command...command){...}
}

Et bien, que pouvez-vous dire à Jo ici ?

A. Pauvre Jo, fais grève car c’est impossible à faire ce que  ton manager voulait faire !

B. Eh Jo, cherche dans la javadoc et tu trouveras la réponse ! (Dans ce cas, que peut-on mettre à la place des <??> ?)

C. Je te comprends Jo, car c’est trop compliqué pour moi aussi :(

Réponse : Jo pourra d’abord utiliser la classe « java.lang.Void » pour son implémentation legacy, puis étudier le commentaire de Cyril :)

public class LegacySystemService implements Service<Void>
{
   public Void process (Command...command){.... return null;}
}

Java : quizz #2

Question : que se passera-t-il avec le code ci-dessous ?

List suits = ...;
List ranks = ...;
List sortedDeck = new ArrayList();

for (Iterator i = suits.iterator(); i.hasNext(); )
    for (Iterator j = ranks.iterator(); j.hasNext(); )
        sortedDeck.add(new Card(i.next(), j.next()));

A : rien, le code s'exécute correctement
B : le code ne se compile pas
C : le code ne s'exécute pas
D : une exception sera levée pendant l'execution

=== Réponse : on peut compiler et executer le code sans problème. 
Cependant à l'execution si la liste "suits" ne contient pas assez d'éléments 
pour les 2 boucles imbriquées, on aura alors une NoSuchElementException car
la méthode "i.next()" de la liste "suits" sera appelée "trop" de fois (on sera arrivé
à la fin de la liste "suits" avant celle de la liste "ranks")

Java : petit quizz #1

Bonjour,

Depuis quelques temps, je propose à la mailing liste (interne) quelques petits Quizz dont la 1ère personne qui a trouvé la bonne réponse a droit à un petit chocolat. Et bien, à partir d’aujourd’hui, nous avons décidé de mettre ces Quizz sur notre blog afin de permettre à d’autres passionnés d’avoir la possibilité de fêter Pâques avant tout le monde :)

Et comme tout évènement/lancement/campagne publicitaire, afin d’attirer le maximum de monde sur notre blog, je ne vais vous proposer qu’une seule question qui est la suivante :

Quelles sont les situations où un thread peut entrer dans l’état « d’attente »  (waiting state) ?

(si possible donner la liste exhaustive)

A vos claviers… chocolat ! :)

 

==== Je remets ci-dessous la réponse du quizz

Effectivement la méthode “Object.wait()” est une des manières pour faire entrer un thread en “waiting state”. Ci-dessous les autres cas possibles :

1. en utilisant la méthode “Thread.sleep()”(sans timeout)
2. en essayant d’acquérir un “lock” (pour la synchronisation) ou LockSupport.park()
3. en attente d’une ressource I/O bloquante
4. en utilisant la méthode “Thread.join()” (sans timeout)

Pour plus d’information, vous pouvez consulter les pages suivantes :

http://download.oracle.com/javase/7/docs/api/java/lang/Thread.State.html#WAITING

http://download.oracle.com/javase/tutorial/essential/concurrency/index.html