La première édition de Devoxx France s’est terminée depuis quelques jours, voici donc un bref retour d’expérience ainsi que les réponses au concours que nous avions organisé.
L’organisation était au top. Les gilets rouges ont bien pris en main l’organisation globale, et malgré la jeunesse de l’évènement, aucun aléa n’est venu perturbé ces 3 journées. Les sessions étaient très variées, et certaines demandaient un niveau technique assez élevé. D’autres au contraire permettaient de découvrir des sujets qui ne sont pas forcément connus des développeurs Java comme par exemple la session d’Alexandre Bertails sur la théorie des langages.
D’un point de vue personnel, j’ai adoré cette première édition. On sentait que l’expérience de Stephan Janssen a permis à Devoxx France de paraître déjà rodé. J’ai pu assisté à de nombreuses sessions très intéressantes et enrichissantes comme celle de Pablo Lopez présentant Hadoop pour gérer les 7Go de logs produites chez son client. J’en ai malheureusement loupé d’autres. Vivement que les sessions soient sur Parleys. Devoxx a vraiment été une cure technique revigorante de part la diversité des sujets et la maîtrise technique des speakers.
D’autre part, en jouant chez divers sponsors j’ai pu gagner un Samsung Galaxy Tab et un Kindle ! Un petit bonus qui a contribué à passer un excellent moment.
Application In Fine Devoxx France
Nous avions mis à disposition des utilisateurs Android une application permettant de gérer son planning pendant les 3 jours de Devoxx France. Les retours des utilisateurs ont été très bons et peu de bugs ont été recensés.
Lors du deuxième jour, le planning a pu indiquer des salles qui ne correspondaient pas à la réalité. Ceci est en fait dû une désynchronisation entre l’application et l’API du site Devoxx. L’API REST ne renvoyait pas les bonnes salles ce qui a pu en gêner certains. Le troisième jour, tout est rentré dans l’ordre et l’API renvoyait les données exactes.
Comme nous l’avons annoncé avant Devoxx France, nous mettons en open source le code de cette application. Le code source est en licence Apache 2 et est disponible sur mon GitHub.
Cette application est censée se connecter à un serveur qui renvoie des données JSON qui ont un format spécifiques. Cette partie peut être adaptée facilement pour récupérer les données renvoyées par le serveur devoxx.
Concours In Fine avec un Mac Book Air à la clé
En tant que sponsor, nous organisions un concours de code. Le gagnant pouvait emporter un Mac Book Air. Le principe était simple : modifier 6 morceaux de code en sept minutes trente.
La difficulté venait du fait que le code était édité dans un navigateur web et pas dans un IDE ! A chaque modification de code, une compilation automatique était envoyée à un serveur permettant de valider la réponse du candidat.
Les réponses aux questions ne nécessitaient pas de connaître les API du JDK par coeur, seules le nom des classes et leur constructeur étaient utiles. Les questions et réponses sont données un peu plus loin dans ce post.
Nicolas De Loof a emporté haut la main le concours en étant le seul à donner les 6 bonnes réponses dans le temps imparti. Les autres participants n’ont pas démérité, mais le fait de coder dans un navigateur a dû en déconcerter plus d’un.
Questions du concours
Chaque question comprend un énoncé, une partie de code éditable par l’utilisateur ainsi que du code non éditable. Les imports se font automatiquement.
Question 1
Comment faire en sorte que myMap puisse garder l’ordre d’insertion
// Début de la partie éditable Map<String, Integer> myMap = new HashMap<String, Integer>(); // Fin de la partie éditable myMap.put("val2", 2); myMap.put("val1", 1); myMap.put("val3", 4); Iterator<Integer> i = myMap.values().iterator(); assert(result = i.next() == 2 && i.next() == 1 && i.next() == 4);
Réponse 1
Il faut une certaine connaissance des collections Java. TreeMap n’est pas utilisable ici car il réordonne les entréés à chaque insertion.
Map<String, Integer> myMap = new LinkedHashMap<String, Integer>();
Question 2
Le test est valide lorsque myVar vaut 66666
// Début de la partie éditable long myVar = 5432l; // Fin de la partie éditable myVar += 12345; assert(myVar == 66666);
Réponse 2
Il fallait mettre un 1 au lieu du l minuscule. Cette question est une référence à Josh Bloch.
long myVar = 54321;
Question 3
Ecrivez une méthode qui calcule la factorielle d’un nombre n . Si n est négatif alors on retourne Double.NaN
// Début de la partie éditable double fact(int n) { return 0; } // Fin de la partie éditable
Réponse 3
Faire une fonction récursive était la manière la plus évidente et la plus naturelle.
double fact(int n) { if (n == 0) return 1; else if (n == 1) return 1; else if (n < 0) return Double.NaN; return n * fact(n-1); }
Question 4
Ecrivez la méthode getDayOfWeek qui prend en entrée le nombre de jour depuis le 1 Janvier 1970 ( ce jour était un jeudi ) et qui retourne le jour correspondant.
public final static int SUNDAY = 1; public final static int MONDAY = 2; public final static int TUESDAY = 3; public final static int WEDNESDAY = 4; public final static int THURSDAY = 5; public final static int FRIDAY = 6; public final static int SATURDAY = 7; // Début de la partie éditable int getDayOfWeek(int day) { return 0; } // Fin de la partie éditable
Réponse 4
Cette question probablement était probablement la plus difficile. Ceux qui ont essayé de trouver une formule qui marche sur une ligne avec un modulo ont tous échoué. D’autres ont essayé d’utiliser la classe Calendar, mais sans auto-complétion et sans connaissance de l’API ils ont échoué également. La solution la plus simple est celle ci-dessous.
int getDayOfWeek(int day) { int moduloDay = day % 7; switch(moduloDay){ case 0 : return THURSDAY; case 1 : return FRIDAY; case 2 : return SATURDAY; case 3 : return SUNDAY; case 4 : return MONDAY; case 5 : return TUESDAY; default : return WEDNESDAY; } }
Question 5
Modifiez le code pour que le resultat de la soustraction soit égal à 0.9
void substract() { // Début du code éditable BigDecimal a = new BigDecimal(2.00); BigDecimal b = new BigDecimal(1.10); // Fin du code éditable assert(a.subtract(b).doubleValue() == 0.9); }
Réponse 5
Un énoncé et une réponse simple encore une fois. Il fallait connaître les spécifités de ce constructeur. En initialisant un BigDecimal avec un double, la valeur initialisée est une valeur approchante au paramètre. En utilisant un paramètre de type String, alors c’est la valeur exacte qui est utilisée.
BigDecimal a = new BigDecimal("2.00"); BigDecimal b = new BigDecimal("1.10");
Question 6
Comment accède-t’on dans la méthode getSuperVal à l’attribut val de la classe B ?
class B { int val = 2; A a = new A(); class A { final public int val = 3; int getSuperVal() { // Début du code éditable return ; // Fin du code éditable } } }
Réponse 6
Syntaxe peu utilisée, mais encore une fois cette réponse était simple à donner dans un navigateur sans auto-complétion.
return B.this.val;
Question 7
NB : Cette question a remplacé 6 la question le dernier jour de Devoxx France.
Comment faire en sorte que myMap ait une taille de 3 ? La Map ne doit contenir que des clés “test”.
// Début du code éditable Map<String, Integer> myMap = new HashMap<String, Integer>(); // Fin du code éditable myMap.put(new String("test"), 1); myMap.put(new String("test"), 2); myMap.put("test", 3); int size = myMap.size(); assert(size == 3);
Réponse 7
Encore une fois il fallait un peu connaître les classes qui composent l’API Collection.
Map<String, Integer> myMap = new IdentityHashMap<String, Integer>();
Merci à tous ceux qui sont venus nous voir sur le stand, on a passé de bon moments. A l’année prochaine !