<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>Samuel Liard</title>
 <link href="https://liard.me/atom.xml" rel="self"/>
 <link href="https://liard.me/"/>
 <updated>2026-07-24T11:16:33+02:00</updated>
 <id>https://liard.me/</id>
 <author>
   <name>Samuel Liard</name>
   <email>samuel@liard.me</email>
 </author>

 
 <entry>
   <title>GitHub Copilot CLI vs Online</title>
   <link href="https://liard.me/2026/03/copilot-cli-online/"/>
   <updated>2026-03-08T10:15:05+01:00</updated>
   <id>https://liard.me/2026/03/copilot-diff</id>
   <content type="html">&lt;p&gt;J’ai eu envie de faire un test simple : demander à GitHub Copilot de générer le même site via deux approches différentes, une en mode CLI et une en mode online.&lt;/p&gt;

&lt;p&gt;L’idée ici, c’est d’observer les différences de rendu écran par écran. Les deux générations couvrent globalement le même besoin, avec des variations sur la présentation, la hiérarchie visuelle et quelques détails d’ergonomie.&lt;/p&gt;

&lt;p&gt;Vous pouvez regarder la branche &lt;a href=&quot;https://github.com/sliard/TestChessCopilot2/tree/feature-cli&quot;&gt;construite avec la CLI&lt;/a&gt; pour voir les fichiers modifies.
Et la branche &lt;a href=&quot;https://github.com/sliard/TestChessCopilot2/tree/copilot/implement-all-features&quot;&gt;construite en ligne&lt;/a&gt; pour voir les fichiers generes.&lt;/p&gt;

&lt;p&gt;Les fichiers dans le répertoire docs sont les mêmes et pourtant on constate des différences.&lt;/p&gt;

&lt;h2 id=&quot;home&quot;&gt;Home&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;CLI&lt;/th&gt;
      &lt;th&gt;Online&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/images/uploads/2026/03/cli/home.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/images/uploads/2026/03/cli/home.png&quot; alt=&quot;Home version CLI&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/images/uploads/2026/03/online/home.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/images/uploads/2026/03/online/home.png&quot; alt=&quot;Home version Online&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;create-account&quot;&gt;Create Account&lt;/h2&gt;

&lt;p&gt;J’ai laissé l’erreur CSS alors qu’à mon avis ça pouvait se corriger rapidement.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;CLI&lt;/th&gt;
      &lt;th&gt;Online&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/images/uploads/2026/03/cli/CreateAccount.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/images/uploads/2026/03/cli/CreateAccount.png&quot; alt=&quot;Create Account version CLI&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/images/uploads/2026/03/online/CreateAccount.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/images/uploads/2026/03/online/CreateAccount.png&quot; alt=&quot;Create Account version Online&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;opening&quot;&gt;Opening&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;CLI&lt;/th&gt;
      &lt;th&gt;Online&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/images/uploads/2026/03/cli/Opening.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/images/uploads/2026/03/cli/Opening.png&quot; alt=&quot;Opening version CLI&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/images/uploads/2026/03/online/Opening.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/images/uploads/2026/03/online/Opening.png&quot; alt=&quot;Opening version Online&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;opening-edit&quot;&gt;Opening Edit&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;CLI&lt;/th&gt;
      &lt;th&gt;Online&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/images/uploads/2026/03/cli/OpeningEdit.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/images/uploads/2026/03/cli/OpeningEdit.png&quot; alt=&quot;Opening Edit version CLI&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/images/uploads/2026/03/online/OpeningEdit.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/images/uploads/2026/03/online/OpeningEdit.png&quot; alt=&quot;Opening Edit version Online&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;opening-view&quot;&gt;Opening View&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;CLI&lt;/th&gt;
      &lt;th&gt;Online&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/images/uploads/2026/03/cli/OpeningView.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/images/uploads/2026/03/cli/OpeningView.png&quot; alt=&quot;Opening View version CLI&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/images/uploads/2026/03/online/OpeningView.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/images/uploads/2026/03/online/OpeningView.png&quot; alt=&quot;Opening View version Online&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;public--private&quot;&gt;Public / Private&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;CLI&lt;/th&gt;
      &lt;th&gt;Online&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;/images/uploads/2026/03/cli/PublicPrivate.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/images/uploads/2026/03/cli/PublicPrivate.png&quot; alt=&quot;Public Private version CLI&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/images/uploads/2026/03/online/PublicPrivate.png&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/images/uploads/2026/03/online/PublicPrivate.png&quot; alt=&quot;Public Private version Online&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Ce comparatif confirme que &lt;strong&gt;la qualité du résultat dépend autant du contexte et des instructions que de l’outil lui-même&lt;/strong&gt;. Les différences observées s’expliquent en partie par le fait que j’ai focalisé mes descriptions sur les besoins fonctionnels de l’utilisateur, sans jamais mentionner d’aspects ergonomiques ou de design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Un constat surprenant sur le temps de traitement :&lt;/strong&gt; la génération en ligne a été réalisée en 1h par GitHub avec comme consigne d’implémenter l’ensemble des features en une seule fois. Pour la CLI, j’ai suivi l’approche recommandée par GitHub : des prompts dédiés pour chaque feature, avec systématiquement une phase de planification puis une phase de génération. Cette méthode m’a demandé toute une après-midi. Paradoxalement, on constate que la génération “oneshot” produit un résultat exactement au même niveau que l’approche itérative pourtant préconisée.&lt;/p&gt;

&lt;p&gt;Point intéressant : aucune des deux générations ne propose d’éditer une ouverture en déplaçant directement les pièces sur l’échiquier, fonctionnalité que j’avais pourtant obtenue lors d’une &lt;a href=&quot;https://github.com/sliard/TestChessCopilot&quot;&gt;première génération&lt;/a&gt;. Cela montre l’importance de la formulation des prompts et du contexte dans lequel l’IA travaille.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>GitHub Copilot après Claude Code</title>
   <link href="https://liard.me/2026/02/copilot-vs-claude-code/"/>
   <updated>2026-02-18T10:15:05+01:00</updated>
   <id>https://liard.me/2026/02/copilot-vc-claude</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2026/02/claudevscopilot.png&quot; alt=&quot;Claude VS Copilot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depuis plusieurs mois, j’expérimente les assistants IA dans mes projets, et après avoir beaucoup travaillé avec Claude Code et constaté à quel point ces outils permettent de produire des applications à une vitesse impressionnante, notamment parce qu’ils m’aident à dépasser mes limites sur la partie IHM en tant que développeur backend, j’ai voulu tester GitHub Copilot avec le modèle Opus 4.5 afin de voir ce qu’il apportait concrètement dans mes développements. J’étais plus que sceptique. Quand quelque chose fonctionne très bien, on n’a pas forcément envie d’en changer. Et pourtant.&lt;/p&gt;

&lt;h2 id=&quot;pourquoi-tester-github-copilot-&quot;&gt;Pourquoi tester GitHub Copilot ?&lt;/h2&gt;

&lt;p&gt;La principale raison est simple : l’intégration IDE. J’utilise IntelliJ IDEA depuis des années. C’est mon environnement naturel de développement. Pouvoir utiliser un agent IA directement dans l’IDE, au plus proche du code, est un vrai confort. Oui, on peut connecter Claude Code à son IDE. Mais l’intégration reste moins fluide, moins native. On sent que ce n’est pas pensé au cœur de l’expérience développeur. Avec GitHub Copilot, l’expérience est intégrée dans l’éditeur et permet de naviguer dans les fichiers, générer du code, assister le refactoring et même créer des Pull Requests sans sortir de l’environnement.&lt;/p&gt;

&lt;h2 id=&quot;les-agents-et-les-skills&quot;&gt;Les “Agents” et les “Skills”&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2026/02/agentAndSkill.png&quot; alt=&quot;Agent and skill&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Même si cette approche existe aussi avec Claude Code, j’ai trouvé l’écosystème Copilot plus simple à prendre en main, mieux structuré et surtout accompagné de beaucoup plus d’exemples concrets prêts à l’emploi. En explorant l’écosystème Copilot, je suis tombé sur le dépôt awesome-copilot, qui propose une liste impressionnante d’agents et de skills prêts à l’emploi.&lt;/p&gt;

&lt;p&gt;Concrètement, j’ai par exemple utilisé un agent de développement backend Spring qui sépare proprement les services, DTO et contrôleurs. J’ai aussi utilisé un skill de génération de tests pour créer une base de tests unitaires cohérente avec la structure Maven du projet. Dans les deux cas, l’agent ne s’est pas contenté d’ajouter du code : il a respecté l’architecture existante et les conventions définies dans le template, ce qui rend le résultat directement exploitable.&lt;/p&gt;

&lt;h2 id=&quot;création-dun-template-projet&quot;&gt;Création d’un template projet&lt;/h2&gt;

&lt;p&gt;Pour tester sérieusement, je ne voulais pas partir d’un simple projet vide. J’ai donc commencé par créer un template de projet adapté à mes technologies préférées : Java, Maven, Spring Boot et React via Vite. L’objectif était de poser un cadre clair dès le départ, avec une séparation propre entre backend et frontend, une configuration Maven standardisée et un environnement React immédiatement exploitable.&lt;/p&gt;

&lt;p&gt;Cette base structurée permettait de laisser l’agent travailler efficacement sans ambiguïté sur l’architecture. Sur ce point, Copilot a été très pertinent : la génération est cohérente, les dossiers sont organisés logiquement et les conventions respectées. On sent que le modèle comprend l’architecture globale du projet, et pas seulement les lignes de code qu’il produit.&lt;/p&gt;

&lt;p&gt;Le template est disponible ici :&lt;br /&gt;
https://github.com/sliard/JavaViteTemplate&lt;/p&gt;

&lt;p&gt;Il repose sur une séparation claire entre un backend Spring Boot exposant une API REST et un frontend React (Vite) isolé, avec une configuration Maven standardisée et prête pour l’industrialisation. J’y ai également intégré une structure pensée pour les agents : dossiers explicites, README orienté contexte, scripts reproductibles et conventions strictes pour éviter toute ambiguïté lors de la génération.&lt;/p&gt;

&lt;p&gt;Un point important concerne la formalisation des messages de commit. J’ai défini une convention claire, de type Conventional Commits, pour forcer l’agent à produire des messages structurés, explicites et exploitables dans un pipeline CI/CD. En cadrant le format attendu dès le départ, on améliore fortement la qualité des Pull Requests générées : description synthétique, contexte technique, liste des changements et impact potentiel. Petit plus lié à l’intégration IDE, la génération des messages de commit respectait cette règle à la lettre.&lt;/p&gt;

&lt;h2 id=&quot;projet-test&quot;&gt;Projet test&lt;/h2&gt;

&lt;p&gt;Pour aller plus loin, j’ai utilisé ce template pour créer un projet test disponible ici :&lt;br /&gt;
https://github.com/sliard/TestChessCopilot&lt;/p&gt;

&lt;p&gt;L’objectif était de développer un début de site pour apprendre les ouvertures aux échecs, un sujet que je connaissais déjà puisque j’avais réalisé un service similaire avec Claude Code. Cela me permettait de comparer dans un cadre concret la vitesse de développement, la qualité du code produit, la cohérence de l’architecture et la qualité de l’IHM générée.&lt;/p&gt;

&lt;p&gt;Mais au-delà du code, le point central du projet a été le travail de définition du besoin : ici, la spécification devient le véritable prompt, et la qualité de la documentation pilote directement la qualité du code généré. J’ai formalisé le cadre fonctionnel dans le fichier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docs/PROJECT.md&lt;/code&gt;, qui décrit la vision globale, le périmètre, les contraintes techniques et les objectifs. Ensuite, chaque fonctionnalité est détaillée dans des fichiers dédiés sous le répertoire &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docs/features&lt;/code&gt;. Cette structuration permet à l’agent de travailler avec un contexte clair, découpé et explicite. Plutôt que de générer à la volée, l’IA s’appuie sur une spécification écrite, versionnée et évolutive. On se rapproche d’une vraie démarche produit, où la qualité de la définition du besoin conditionne directement la qualité du code généré.&lt;/p&gt;

&lt;p&gt;Dans ce cadre très structuré, j’ai également testé la génération complète d’une feature via l’agent depuis la page GitHub web. Celui-ci a produit les modifications nécessaires sur une branche qu’il a créée, organisé les commits selon la convention définie, rédigé une description claire et contextualisée et documenté les changements. Ce n’est plus seulement de la génération de code : c’est un vrai workflow de contribution intégré au projet. L’agent a même ajouté des screenshots de ce qu’il avait réalisé directement dans la description de la Pull Request, ce qui rend la revue beaucoup plus concrète.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Après plusieurs mois avec Claude Code, je reste impressionné par sa capacité à générer rapidement des applications complètes, créatives et avec des interfaces propres. GitHub Copilot, de son côté, apporte une autre dimension plus intégrée : un agent directement dans l’IDE, une connexion naturelle avec GitHub et un écosystème d’agents qui structure réellement le travail au quotidien.&lt;/p&gt;

&lt;p&gt;Pour moi, en tant que développeur orienté backend, c’est probablement le changement le plus marquant. Là où je me concentrais surtout sur l’API, la persistence et l’architecture, je suis aujourd’hui capable de gérer l’ensemble de la chaîne applicative, du backend au frontend, avec des itérations rapides et des Pull Requests propres et bien structurées.&lt;/p&gt;

&lt;p&gt;Est-ce que Copilot remplace Claude Code ? Oui, dans mon cas. Il me permet de conserver les modèles IA de Claude, qui restent pour moi les plus performants, tout en gagnant en souplesse d’utilisation grâce à l’intégration IDE et à l’écosystème GitHub. À cela s’ajoute une offre tarifaire beaucoup plus intéressante chez GitHub Copilot. On ne parle plus seulement d’assistance au code, mais d’un véritable environnement de développement augmenté, plus flexible et mieux intégré à mon workflow quotidien.&lt;/p&gt;

&lt;p&gt;Demain, la compétence clé ne sera peut-être plus seulement d’écrire du code, mais de structurer précisément le contexte, la documentation et l’architecture dans lesquels l’IA va travailler.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Article rédigé en février 2026. Vu la vitesse à laquelle ce domaine évolue, je suis moi-même curieux de voir combien de temps ce constat restera valable.)&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Comment j&apos;ai utilisé un agent IA pour booster ma recherche d&apos;emploi</title>
   <link href="https://liard.me/2025/04/agent-ia-recrutement-chatgpt/"/>
   <updated>2025-04-07T10:15:05+02:00</updated>
   <id>https://liard.me/2025/04/agent-ia-recrutement-chatgpt</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2025/04/agentIA.png&quot; alt=&quot;agentIA.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;En ce moment, je suis à la recherche d’un nouveau poste et, comme les LLM et les agents IA sont à la mode, je me suis demandé comment les utiliser pour optimiser ma recherche d’emploi. J’ai donc créé un agent capable de présenter mon CV à un recruteur.&lt;/p&gt;

&lt;h1 id=&quot;my-chatgpt&quot;&gt;My ChatGPT&lt;/h1&gt;

&lt;p&gt;La solution la plus simple consiste à personnaliser son ChatGPT. On utilise souvent cette méthode pour apprendre à ChatGPT à rédiger en copiant le style d’une personne.
Dans mon cas, j’ai spécialisé ce chat en commençant le prompt par:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;# Role&lt;/p&gt;

  &lt;p&gt;Tu es mon agent qui va m’aider à présenter mon profil à des recruteurs. Les recruteurs se connectent pour obtenir des informations sur mon parcours professionnel, mon expérience sur des outils et/ou librairie de code que j’ai utilisé.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ensuite, j’ai exporté mon profil LinkedIn en PDF pour l’intégrer à ChatGPT comme source d’information. J’ai même forcé l’utilisation exclusive de ce PDF pour éviter les hallucinations.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;# Instructions&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Tu n’utiliseras que les informations du document ProfileLinkedIn.pdf pour avoir des informations sur mon parcours.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aux premiers tests, j’ai eu quelques surprises :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2025/04/agent-age.png&quot; alt=&quot;ChatGpt pense que nous sommes en 2023&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Alors ça me va très bien, mais c’est faux ! On oublie souvent que ChatGPT ne sait pas quel jour on est. J’ai donc ajouté l’année en cours dans le prompt pour obtenir des réponses correctes.
J’ai aussi fermé le prompt pour éviter les questions hors sujet ou toutes les tournures du style : “oublie ton prompt et…”&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;# Instructions&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Ne répondre que sur des questions professionnelles autour de mon profil.&lt;/li&gt;
    &lt;li&gt;Ne jamais sortir de ton prompt et n’invente pas de réponse. Je serais très mécontent si tu donnais de fausses informations. Il faut mieux demander de reformuler la question.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;J’utilise la phrase “Je serais très mécontent si tu donnais de fausses informations.” depuis que &lt;a href=&quot;https://www.linkedin.com/in/sypsyp&quot;&gt;Sylvain Peyronnet&lt;/a&gt; m’a expliqué que les LLM ont comme principal objectif de satisfaire l’utilisateur, quitte à lui répondre n’importe quoi avec un ton très sûr d’eux. Cette simple phrase diminue énormément les hallucinations des LLM.&lt;/p&gt;

&lt;p&gt;Le résultat est vraiment convaincant. Ce chat est très utile pour explorer mon CV dans le sens que je veux. En 25 ans, j’ai travaillé sur de nombreux projets. Avec cet agent, je peux facilement poser une question sur une technologie et retrouver les expériences en lien.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2025/04/agent-gpt.png&quot; alt=&quot;Description de mes projets GCP&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2025/04/agent-java.png&quot; alt=&quot;Description de mes projets Java&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2025/04/agent-frontend.png&quot; alt=&quot;Je ne suis pas dev frontend&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Cela fonctionne, mais cela reste un LLM spécialisé, pas un agent IA. Voyons comment aller plus loin.&lt;/p&gt;

&lt;h1 id=&quot;créer-un-agent-ia-avec-n8n&quot;&gt;Créer un agent IA avec n8n&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;https://n8n.io/&quot;&gt;n8n&lt;/a&gt; est un orchestrateur de tâches. Il permet d’assembler des briques logicielles de façon graphique avec très peu de code. C’est proche de &lt;a href=&quot;https://www.make.com/&quot;&gt;make.com&lt;/a&gt;, mais en open source et simplement déployable via une simple commande Docker sur un serveur.&lt;/p&gt;

&lt;p&gt;En plus, n8n propose un module Agent IA, qui intègre :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Un client web chat public,&lt;/li&gt;
  &lt;li&gt;La possibilité d’utiliser le LLM de son choix,&lt;/li&gt;
  &lt;li&gt;La connexion à des outils pour permettre au LLM d’agir sur le monde extérieur.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2025/04/agent-n8n.png&quot; alt=&quot;graph n8n de l agent&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Dans mon exemple, j’ai ajouté un module permettant à mon agent d’ajouter directement un rendez-vous avec un recruteur dans mon agenda Google Calendar.&lt;/p&gt;

&lt;p&gt;J’ai utilisé 4 outils :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Une requête HTTP pour récupérer les informations sur mon parcours depuis le site de mon CV.&lt;/li&gt;
  &lt;li&gt;Un workflow Calendar_Avaibility pour interroger mon calendrier et récupérer l’ensemble des rendez-vous sur deux mois.&lt;/li&gt;
  &lt;li&gt;CreationRdv pour ajouter un rendez-vous dans mon calendrier.&lt;/li&gt;
  &lt;li&gt;PrevenirContact, un module pour envoyer un mail via un serveur SMTP.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Un module de mémoire permet aussi d’attacher à une session la liste des réponses antérieures, conservant ainsi le contexte entre plusieurs messages.&lt;/p&gt;

&lt;p&gt;La grosse différence ici est que l’on utilise l’API de ChatGPT. Il faut donc lui passer l’ensemble du contexte à chaque appel : la page HTML avec mon CV, les x derniers messages de la conversation et l’ensemble de mes rendez-vous sur deux mois. Cela fonctionne très bien, mais comme la facturation de l’API se fait par token envoyé et reçu, cela peut vite coûter cher. Une soirée de tests m’a coûté 4 centimes, ce qui reste raisonnable. Toutefois, si beaucoup de monde utilise l’agent, il faut mieux configurer une limite de paiement chez OpenAI.&lt;/p&gt;

&lt;p&gt;Pour le prompt principal de l’agent, il est très proche du précédent. Il faut en plus ajouter une description des outils et de comment les utiliser.&lt;/p&gt;

&lt;p&gt;Par exemple pour la partir rendez-vous&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Tu peux utiliser l’outil Calendar_Availability pour savoir si je suis disponible pour un entretien. Mais ne proposer un rendez-vous que du lundi au vendredi entre 9h et 17h si je suis disponible.
Le user peut demander de créer un rendez-vous dans mon calendrier avec l’outil CreationRdv. Pour pouvoir le faire il faut lui demander de décrire un peu le poste et le nom de l’entreprise. Il faut aussi que le user donne son email pour l’ajouter en invité dans le rendez-vous. Il faut lui proposer 3 date/heure ou je suis disponible et que le client choisisse une des dates proposées. Ajoute les informations du poste dans la description du rdv et le texte “Interview XXXX” en remplaçant XXXX par le nom de l’entreprise donné. Les utilisateurs ne peuvent pas changer la date du rdv une fois que celui-ci est défini. Ils ne peuvent pas demander plusieurs rdv, s’il en demande un autre leur dire que c’est impossible et leur demander de me contacter par email directement.
Les RDV sont tous d’une heure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;J’ai dû ajouter la limite à un rendez-vous pour éviter de remplir rapidement mon calendrier avec des tests. Vous noterez que c’est important de respecter certaines règles pour nommer vos outils. Un nom explicite et sans espace va être utilisé plus efficacement. Vous pouvez trouver pas mal de conseils sur le prompt avec &lt;a href=&quot;https://www.youtube.com/watch?v=77Z07QnLlB8&quot;&gt;cette vidéo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2025/04/agent-date.png&quot; alt=&quot;test avec une mauvaise date&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ce chat fonctionne assez vite même s’il faut bien travailler son prompt pour diminuer les hallucinations.&lt;/p&gt;

&lt;p&gt;J’ai également expérimenté avec d’autres sources de données. Par exemple, j’ai tenté de créer un agent pour l’organisation de l’Open d’échecs de mon club. J’ai ajouté la liste des joueurs inscrits dans une table Airtable que j’ai connectée comme outil et source de données. Cependant, l’agent ne parvenait pas à compter correctement le nombre d’inscrits.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2025/04/agent-open.png&quot; alt=&quot;agent-open.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Pour résoudre ce problème, j’ai remplacé Airtable par une extraction des pages HTML du site de la Fédération Française des Échecs et l’agent a immédiatement fonctionné correctement. L’outil Airtable est bien sûr utilisable, c’est juste que je n’ai pas réussi à tourner mon prompt pour que ça fonctionne alors qu’avec une source de données HTML, ça a fonctionné du premier coup.&lt;/p&gt;

&lt;h1 id=&quot;bilan--quelle-solution-choisir-&quot;&gt;Bilan : quelle solution choisir ?&lt;/h1&gt;
&lt;p&gt;En une journée, j’ai réalisé deux chats utilisables pour présenter mon profil à un recruteur et planifier un rendez-vous. C’est très simple à mettre en place. Voici un récapitulatif des deux solutions :&lt;/p&gt;

&lt;h2 id=&quot;mon-chatgpt&quot;&gt;Mon ChatGPT&lt;/h2&gt;
&lt;p&gt;Avantages :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Super simple à utiliser, sans compétences techniques requises&lt;/li&gt;
  &lt;li&gt;Inclus avec l’abonnement ChatGPT Plus à 20$&lt;/li&gt;
  &lt;li&gt;Coût fixe, même si des millions de personnes utilisent votre chat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inconvénients :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Ce n’est pas un agent IA, mais un LLM spécialisé&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;agent-ia-avec-n8n&quot;&gt;Agent IA avec n8n&lt;/h2&gt;
&lt;p&gt;Avantages :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Facile à utiliser en SaaS ou à déployer sur un serveur&lt;/li&gt;
  &lt;li&gt;Compatible avec n’importe quel LLM (possiblement en local pour la confidentialité)&lt;/li&gt;
  &lt;li&gt;Connexion facile à d’autres outils comme WhatsApp ou Telegram&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inconvénients :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Tarification basée sur le nombre d’appels API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans les deux cas, la clé du succès repose sur la qualité du prompt. Un bon prompt détermine si votre chat fonctionnera bien ou non.&lt;/p&gt;

&lt;p&gt;Testez &lt;a href=&quot;https://chatgpt.com/g/g-67cad0c5b37c8191a68b8aa2e0f98cbb-recruter-samuel&quot;&gt;mon ChatGPT&lt;/a&gt; et partagez votre expérience en commentaire ! Concernant l’agent n8n, je préfère ne pas partager l’URL pour éviter les risques de remplissage de mon calendrier et les coûts API.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Tornado Cash et le Zero-knowledge proof</title>
   <link href="https://liard.me/2022/08/tornado-cash-zero-knowledge-proof/"/>
   <updated>2022-08-24T17:25:05+02:00</updated>
   <id>https://liard.me/2022/08/tornado</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2022/08/tornado.png&quot; alt=&quot;Tornado&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Un des évènements tech important du mois d’Août qui a été, à mon avis, sous médiatisé est
&lt;a href=&quot;https://coinacademy.fr/actu/crypto-arrestation-developpeur-tornado-cash-fiod/&quot;&gt;l’arrestation de Alexey Pertsey&lt;/a&gt; aux pays bas. 
Alexey est supposé être un des développeurs du service Tornado Cash. Service qui a été utilisé pour 
rendre difficile à suivre des transferts de fonds sur la blockchain Ethereum. Mais Tornado Cash 
n’est pas un service web classique, c’est un Smart Contract. Le code est ouvert, les développeurs ne 
prenaient pas de fees sur les transactions, ils n’ont donc fait qu’assembler des algorithmes connus. 
L’Office of Foreign Assets Control (OFAC) a même interdit l’utilisation de Tornado Cash début Août. 
Mais dans un monde décentralisé c’est simplement impossible. Personne ne peut interdire l’appel d’un Smart
Contract. Petite cerise sur le gâteau, Github a bien sûr fermé leur repository sur demande du département
du Trésor Américain (ils ne doivent pas connaitre &lt;a href=&quot;https://fr.wikipedia.org/wiki/Effet_Streisand&quot;&gt;l’effet Streisand&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mais ce qui m’intéresse c’est l’aspect technique :) Comment on peut “cacher” des mouvements de crypto 
monnaie dans une blockchain où toutes les transactions sont publiques ? Et c’est à ce moment que j’ai 
découvert les algorithmes de Zero-Knowledge Proof ou preuves à divulgation nulle de connaissance en français.&lt;/p&gt;

&lt;p&gt;Tornado Cash permet de déposer une somme de crypto monnaie sur le compte du contrat et une autre personne 
vient la prendre plus tard. Et sur la blockchain, vous pouvez suivre toutes les transactions et donc les 
appels aux smart contract. Par exemple ci dessous un &lt;a href=&quot;https://kovan.etherscan.io/tx/0xcb21ae8cad723818c6bc7273e83e00c8393fcdbe74802ce5d562acad691a2a7b&quot;&gt;appel&lt;/a&gt; à un contact du type Tornado Cash pour récupérer
des fonds :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2022/08/transaction.png&quot; alt=&quot;Transaction&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Donc comment cacher le lien entre la personne qui dépose la monnaie et la personne qui la récupère ? 
Premièrement en imposant un montant unique de dépôt par contrat. Sinon il est assez simple de faire le 
lien entre un dépôt de 4,23 ETH et un retrait du même montant. Tornado a donc publié plusieurs contrats 
à 0.1 ETH, 1 ETH, 10 ETH et même 100 ETH.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2022/08/mix.png&quot; alt=&quot;Mix&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ensuite il faut que les données envoyées au moment du dépôt ne soient pas les mêmes que pour le retrait.
Comme les paramètres sont lisibles en clair, si on transmet un “secret” au moment du dépôt nécessaire pour
le retrait n’importe qui peut le lire et prendre le montant déposé.&lt;/p&gt;

&lt;p&gt;C’est à ce moment là qu’intervient la notion de Zero-knowledge proof (ZKP). Ca répond à la question : 
Comment je peux prouver que je possède un secret sans le dévoiler. Je ne vais pas expliquer en détail 
ici le concept. Wikipedia le fait bien mieux que moi. J’ai même trouvé une &lt;a href=&quot;https://www.youtube.com/watch?v=p9_KnANrMrM&quot;&gt;excellente vidéo sur la chaine 
de Octo&lt;/a&gt; d’un projet de stage sur le sujet. Et chapeau Aymeric Noel pour avoir aussi bien expliqué cela pour
un stage de fin d’étude. C’est le type de stagiaire que l’on rêve tous d’avoir dans son équipe !&lt;/p&gt;

&lt;p&gt;Donc maintenant que vous connaissez le principe de ZKP, vous comprenez que pour un smart contract il faut 
utiliser une version non interactive et Tornado a choisi d’utiliser des preuves SNARKs car elles ne sont 
pas trop grosses et rapides à vérifier.&lt;/p&gt;

&lt;p&gt;Pour résumer le principe, la personne qui fait le dépôt est le propriétaire d’un secret. Ce secret, 
il va l’associer à un autre élément (le nullifier) et en faire un hash que l’on va appeler commitment. 
Ensuite, avec ce même secret, il va construire une preuve pour que le contrat puisse être sûr qu’il est en
possession du secret qui a créé ce commitment et qu’il peut reprendre les fonds.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2022/08/zkp1.png&quot; alt=&quot;Zkp&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Etudions maintenant le code du contrat. Même si des projets ont été fermés, il est assez simple de 
retrouver des copies.&lt;/p&gt;

&lt;h2 id=&quot;le-constructeur&quot;&gt;Le constructeur&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2022/08/constructor.png&quot; alt=&quot;Constructeur&quot; /&gt;&lt;/p&gt;

&lt;p&gt;C’est au moment de la création du contrat qu’on fixe la valeur du montant que l’on va pouvoir échanger 
(dénomination). On voit aussi que le vérifier et le hasher sont des liens vers d’autres smart contracts. 
Ca permet de pouvoir les changer pour les faire évoluer. Le hasher permet de réaliser un hash &lt;a href=&quot;https://byt3bit.github.io/primesym/mimc/&quot;&gt;MiMC&lt;/a&gt;.
Algorithme qui a été créé pour minimiser son coût d’exécution sur EVM. Le contrat doit répondre à cette 
interface :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2022/08/interface1.png&quot; alt=&quot;Interface1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le contrat verifier va être utilisé au moment de retirer les crédits pour vérifier la preuve.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2022/08/interface2.png&quot; alt=&quot;Interface2&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;le-dépôt&quot;&gt;Le dépôt&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2022/08/depot1.png&quot; alt=&quot;Depot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le seul paramètre à passer c’est le commitment. C’est un pedersen hash du nullifier et du secret. 
La première ligne vérifie si ce commitment n’a pas déjà été utilisé. Ensuite on le stocke quand un arbre
de merkle. Pour optimiser au maximum la taille des variables du contrat, on ne garde qu’un historique 
de n racines de l’arbre. Je vous invite à étudier le contrat &lt;a href=&quot;https://github.com/tornadocash-community/tornado-core/blob/master/contracts/MerkleTreeWithHistory.sol&quot;&gt;MerkleTreeWithHistory&lt;/a&gt;, les optimisations
au niveau temps d’exécution et taille de stockage sont impressionnantes.&lt;/p&gt;

&lt;p&gt;Ensuite on sauvegarde l’utilisation de notre commitment dans un tableau de boolean et on appelle
_processDeposit(). Aujourd’hui il y a 2 implémentations, une pour un contrat de transfert ETH et un autre
pour des transferts de token fongible ERC20. Nous allons nous concentrer juste sur le transfert ETH. 
Et dans ce cas la fonction ne fait que vérifier que la transaction emporte bien la bonne quantité de monnaie.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2022/08/sceth.png&quot; alt=&quot;ETH&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A la fin on émet un évènement pour signaler l’ajout de ce commitment, sa position dans la chaine et le
timestamp du block de la transaction.&lt;/p&gt;

&lt;h2 id=&quot;le-retrait&quot;&gt;Le retrait&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2022/08/withdraw.png&quot; alt=&quot;withdraw&quot; /&gt;&lt;/p&gt;

&lt;p&gt;C’est là que ça devient intéressant ! La liste de paramètres devient importante:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;proof : La preuve que l’on connait le secret&lt;/li&gt;
  &lt;li&gt;root : la racine de l’arbre de merkle des commitment au moment ou la preuve a été calculée&lt;/li&gt;
  &lt;li&gt;nullifierHash : le hash du nullifier utilisé pour calculer le commitment&lt;/li&gt;
  &lt;li&gt;recipient : l’adresse où envoyer les fonds&lt;/li&gt;
  &lt;li&gt;relayer : l’adresse d’un intermédiaire qui va gagner des fees&lt;/li&gt;
  &lt;li&gt;fee : le montant des fees pour l’intermédiare&lt;/li&gt;
  &lt;li&gt;refund : doit être à 0 pour un transfert ETH&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les premières lignes vérifient si les frais ne sont pas plus élevés que le montant à transférer, que le nullifier n’a pas déjà été utilisé et si la racine de l’arbre de Merkle est bien dans notre historique.&lt;/p&gt;

&lt;p&gt;Arrive ensuite la ligne “magique”, avec ces paramètres on va prouver que nous avons bien le secret qui a créé le commitment et que ce commitment est bien dans l’arbre de Merkle. Sans savoir de quel commitment il s’agit ! Et c’est la toute la force du contrat, même lui ne peut pas faire le lien entre le dépôt et le retrait. On sait juste que nous sommes à l’origine de ce commitment et qu’il est bien dans notre arbre. On va aussi éviter les rejeux en notant le hash du nullifier comme déjà utilisé.&lt;/p&gt;

&lt;p&gt;On passe la main ensuite à la méthode _processWithdraw() spécifique à ETH :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2022/08/withdraw2.png&quot; alt=&quot;withdraw&quot; /&gt;&lt;/p&gt;

&lt;p&gt;C’est elle qui va gérer les transferts de fonds entre le recipient et le relayer si des fees sont appliqués.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Et voilà comment 500 lignes de code Solidity peut faire trembler le département du Trésor Américain. Je ne suis pas plus entré dans le détail au niveau de la création et de la vérification de la preuve pour 2 raisons. Déjà l’article est déjà assez long, mais en plus je n’ai pas complètement compris son fonctionnement. C’est super complexe et j’ai du mal à le refaire. Je vais donc continuer à creuser cette partie pour essayer de proposer un projet Github plus détaillé.&lt;/p&gt;

&lt;p&gt;Et maintenant que vous savez ce que fait Tornado Cash, que pensez-vous de l’arrestation de Alexey Pertsey ? La FIOD (Fiscal Information and Investigation Service des Pays Bas) dit :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;le développement d’un outil n’est pas interdit, mais si un outil a été créé dans le seul but de commettre des actes criminels, par exemple, pour dissimuler des flux d’argent criminels, alors la mise en ligne/la mise à disposition d’un outil développé peut être punissable&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mais le développeur n’est pas forcément la personne qui a déployé le contrat et comment un développeur peut être tenu responsable de l’utilisation de son code ? Est-ce que Tim Berners-Lee est responsable de la création de site pédophile ? Et c’est une bonne chose de s’attaquer au blanchiment d’argent, mais les dernières statistiques montrent que aux US le Bitcoin représente 1% de la fraude. Les 99 autres % sont faits en dollars.&lt;/p&gt;

&lt;p&gt;Est-ce que les développeurs de jeux de casino ont du souci à ce faire ? Je vois bien que c’est facile de diaboliser les blockchains à chaque occasion, mais s’il vous plait si vous avez un minimum de compétences techniques, renseignez vous avant. Essayez de comprendre avant de critiquer systématiquement.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Une vidéo qui résume aussi très bien le fonctionnement de Tornado : &lt;a href=&quot;https://www.youtube.com/watch?v=z_cRicXX1jI&quot;&gt;ici&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le site Tornado étant supprimé, j’ai recopié ici les PDF de l’audit du contrat :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://liard.me/public/tornado/Tornado_cryptographic_review.pdf&quot;&gt;Tornado_cryptographic_review.pdf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://liard.me/public/tornado/Tornado_circuit_audit.pdf&quot;&gt;Tornado_circuit_audit.pdf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://liard.me/public/tornado/Tornado_solidity_audit.pdf&quot;&gt;Tornado_solidity_audit.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Certifié Google Cloud Architect</title>
   <link href="https://liard.me/2022/01/certifie-google-cloud-architect/"/>
   <updated>2022-01-11T16:25:05+01:00</updated>
   <id>https://liard.me/2022/01/certifie-google-cloud-architect</id>
   <content type="html">&lt;p&gt;C’est fait ! Cette semaine j’ai passé l’examen de la certification “Google Professional Cloud 
Architect” avec succès ! Je vous propose de partager ici comment se sont déroulées la formation
et la préparation du test.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;TL;DR&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;La formation Coursera + Qwiklabs n’est pas suffisante (20% du travail de mon point de vue)&lt;/li&gt;
    &lt;li&gt;Faites plus de Qwiklabs et sortez des scripts pour tester les services&lt;/li&gt;
    &lt;li&gt;Lisez le livre Official Google Cloud Certified Professional Cloud Architect Study Guide&lt;/li&gt;
    &lt;li&gt;Les tests sur le site whizlabs sont très bien faits&lt;/li&gt;
    &lt;li&gt;Le site Examtopics est indispensable mais nécessite beaucoup de réflexion car les solutions proposées sont souvent fausses.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;/images/uploads/certificationGCP.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Le 13 mars 2021, Orange signe un partenariat avec Google. Avec ce contrat Orange va pouvoir utiliser Google Cloud Platform : GCP. Il faut donc nous former.&lt;/p&gt;

&lt;h2 id=&quot;les-certifications&quot;&gt;Les certifications&lt;/h2&gt;

&lt;p&gt;Il y a 8 certifications proposées :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Cloud Architect&lt;/li&gt;
  &lt;li&gt;Cloud Engineer&lt;/li&gt;
  &lt;li&gt;Data Engineer&lt;/li&gt;
  &lt;li&gt;Network Engineer&lt;/li&gt;
  &lt;li&gt;Security Engineer&lt;/li&gt;
  &lt;li&gt;Data Scientist ML Engineer&lt;/li&gt;
  &lt;li&gt;Cloud Devops Engineer&lt;/li&gt;
  &lt;li&gt;Cloud Developer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans mon cas, j’hésite entre la “Professional Cloud Architect” et la “Professional Cloud Developer” qui 
sont assez proches même si l’Architect a un scope plus important. Comme nous avons accès à l’ensemble des 
formations sur coursera, au lieu de choisir je fais les 2 parcours. Après plusieurs dizaines d’heures de vidéos,
je valide le parcours coursera. Cela donne accès à Qwiklabs. Qwiklabs est un outil pour faire des TP sur GCP.
C’est extrêmement bien fait. Le service vous donne accès à un compte google de test avec lequel vous pouvez
utiliser GCP pendant une durée limitée pour faire le TP. A la fin du temps, Google coupe le compte et détruit
ce qui a été fait pendant le TP. Vous pouvez donc jouer avec GCP sans avoir besoin d’utiliser votre CB.&lt;/p&gt;

&lt;h2 id=&quot;qwiklabs&quot;&gt;Qwiklabs&lt;/h2&gt;

&lt;p&gt;Pour pouvoir aller passer la certification, Google vous demande d’avoir des badges &lt;a href=&quot;https://www.qwiklabs.com/&quot;&gt;Qwiklabs&lt;/a&gt;. Pour avoir un
badge il faut suivre une “Quest” (une série de lab). C’est intéressant car on peut manipuler vraiment l’interface
GCP. Le point négatif c’est que la plupart des labs sont un peu linéaires. Vous pouvez les faire en 5 minutes
en copiant collant les commandes sans vraiment réfléchir. Evidemment je ne vous le conseille pas, ça perd
complètement l’intérêt du lab. Bien au contraire, essayez d’utiliser le temps qui n’est pas consommé à la
fin du lab pour essayer des choses. Souvent les comptes utilisés par les labs ont des quotas très faibles
pour ne pas qu’on en abuse. Par exemple si un TP vous demande de créer 2 VM, il est souvent impossible d’en
créer plus de 2. De même pour l’activation des API. Pour un TP sur Pub/Sub, les API des services de Machine
Learning sont désactivées. Mais j’ai remarqué que les TP kubernetes avait souvent plus d’API et de quota.
J’ai pu tester des créations de base SQL par exemple. Attention de ne pas consommer trop quand même, 
il y a un gros risque que le TP se coupe brutalement.&lt;/p&gt;

&lt;p&gt;Souvent le dernier lab d’une quest est un “Challenge Lab”.
Ces derniers sont beaucoup plus compliqué pour 2 raisons. Déjà ils ne sont pas guidés. On vous donne un 
objectif, mais pas les commandes pour le faire. Il faut se souvenir des autres labs de la quest. Mais le point
le moins drôle, c’est que parfois on pense avoir bien fait mais Qwiklabs ne valide pas certaines étapes et
souvent il n’y a pas d’explication. Parfois c’est juste une erreur bête dans le nom d’une ressource et le
script de validation est perdu. Mais il y a aussi des Qwiklabs de buggés. Par exemple ceux sur Apigee sont
pratiquement infaisables. J’ai signalé début septembre le problème sur le lab “Apigee API Security” mais il
est toujours buggé. Cela empêche d’avoir le badge “Apigee API Management” nécessaire pour la certification
“Professional Cloud Developer”. C’est aussi pour cela que j’ai décidé de passer la certification Architect.
Attention, vous ne pouvez pas faire un lab plus de 3 fois (succès ou échec).&lt;/p&gt;

&lt;h2 id=&quot;toujours-plus-de-qcm&quot;&gt;Toujours plus de QCM&lt;/h2&gt;

&lt;p&gt;Fin octobre, j’ai obtenu les badges nécessaires pour passer la certification. Pour sortir des formations en vidéo,
je m’inscris sur une formation de fin de parcours d’une journée “Preparing for the Professional Cloud Architect”.
C’est en visio mais avec un formateur de chez Google. Pendant cette formation je me rends compte qu’il me manque
certaines bases. Pour se préparer à l’examen, Google propose un &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLSdvf8Xq6m0kvyIoysdr8WZYCG32WHENStftiHTSdtW4ad2-0w/viewform&quot;&gt;Google Form avec 20 questions&lt;/a&gt;. Je fais l’exercice
et j’ai juste un peu plus de 50% de bonnes réponses. Plus grave, j’ai des questions super pointues sur des points 
que je n’ai jamais regardés. Je pars donc à la recherche de plus de jeu de questions. Dans un premier temps, 
j’ai acheté le livre &lt;a href=&quot;https://www.wiley.com/en-in/Official+Google+Cloud+Certified+Professional+Cloud+Architect+Study+Guide-p-9781119602446&quot;&gt;“Official Google Cloud Certified Professional Cloud Architect Study Guide”&lt;/a&gt;. Il est très 
bien fait même si les 3 derniers chapitres sont maintenant hors scope pour la certification. Il date de 2019, 
il y a donc des choses qui ne sont pas à jour. Par contre le gros point positif, c’est qu’à la fin de chaque 
chapitre il y a des QCM pour vous entraîner.&lt;/p&gt;

&lt;p&gt;Mais il m’en fallait encore plus, j’ai donc trouvé une formation avec 4 examens blancs sur le site de &lt;a href=&quot;https://www.whizlabs.com/google-cloud-certified-professional-cloud-architect/&quot;&gt;whizlabs&lt;/a&gt;.
C’est cette formation et surtout les tests qui m’ont aidé à trouver les points que je n’avais pas assez approfondis.
Enfin, le dernier lien que j’ai trouvé a été finalement le plus important : &lt;a href=&quot;https://www.examtopics.com/exams/google/professional-cloud-architect/&quot;&gt;Examtopic&lt;/a&gt;. &lt;strong&gt;&lt;em&gt;Mais attention !&lt;/em&gt;&lt;/strong&gt; 
C’est aussi le plus dangereux. En effet, les solutions affichées sont souvent mauvaises (dans 1 tiers des cas).
Les réponses ont été sélectionnées par celui qui gère le site et il a fait beaucoup d’erreurs. Heureusement, 
pour chaque question il y a une partie “discussion” qui permet à chacun d’argumenter sur la bonne réponse. 
Mais ça reste un avis. Il n’y a aucune réponse validée par Google. Donc utiliser le avec intelligence.&lt;/p&gt;

&lt;h2 id=&quot;le-jour-j&quot;&gt;Le jour J&lt;/h2&gt;

&lt;p&gt;Avec ces éléments je pouvais planifier la date de passage pour la certification et un plan de révision.
Sur 3 semaines, j’ai travaillé cette certification
à 50% de mon temps de travail et à 100% le weekend. Alors je ne dis pas que ce rythme est obligatoire pour
l’avoir ni que c’est un modèle. C’est juste ma façon de faire. Je préfère bosser beaucoup sur un temps assez court.
Et il faut bien comprendre que Google recommande d’avoir un an d’utilisation de la plateforme avant de passer
la certification. Dans mon cas, je n’ai absolument pas ce recul. J’ai donc dû travailler plus.&lt;/p&gt;

&lt;p&gt;Arrive le jour J. L’examen c’est une série de 50 QCM (enfin plus souvent des QCU) à faire en 2 heures. 
Pour rentrer dans la salle il faut présenter &lt;strong&gt;&lt;em&gt;2 pièces d’identités&lt;/em&gt;&lt;/strong&gt; (la seconde n’a pas forcement besoin de 
photo juste le nom, CB ou carte vitale passent). On donne aussi montre connectée et téléphone. Dans la salle
il y a juste un PC, pas de papier ni de crayon. Pas de pause technique pendant les 2h, interdiction de boire
ou de manger et toute sortie de la salle arrête le test. Il est aussi possible de le passer à distance mais 
les conditions sont encore plus strictes. Il faut le faire dans une pièce fermée, sur un poste Windows où il
faudra installer un logiciel nécessitant les droits admin. Pendant l’examen le casque est 
interdit, il ne faut pas tourner la tête, ni mettre sa main devant sa bouche. Et en cas de coupure internet, 
c’est perdu.&lt;/p&gt;

&lt;p&gt;Pendant le test, les 50 questions s’enchaînent. Il n’y a pas de point négatif sur des erreurs, il faut donc
répondre à toutes les questions même si on a un doute. Il est possible de marquer les questions où vous avez
un doute. A la fin vous pouvez plus facilement les retrouver. Après 1h20 j’avais répondu aux 50 questions. 
Ensuite j’ai passé 20 minutes pour revoir les 15 questions que j’avais marquées.&lt;/p&gt;

&lt;p&gt;A la fin, il faut valider et confirmer qu’on a terminé. Je m’attendais à avoir le résultat sur la page d’après, 
mais non ! Je tombe sur une page avec un champ texte pour rédiger mon avis sur le test. Je note n’importe quoi 
pour passer à la suite. Toujours pas de résultat ! Maintenant on me demande si je veux remplir un sondage. 
Heureusement on peut skip et enfin arrive une page où est noté “Exam : Pass” en petits caractères et sans couleur 
ni confettis.. Il faut lire l’encart plus bas pour comprendre que ça doit être noté “Pass” ou “Fail”. 
Donc je respire, ça passe !&lt;/p&gt;

&lt;p&gt;Aucun score n’est donné, en cas d’échec on ne peut pas savoir si on a raté de peu ou pas. Google ne communique 
pas sur le score cible. On ne sait pas s’il faut 70 ou 80% de bonnes réponses.&lt;/p&gt;

&lt;p&gt;Si j’ai fini assez rapidement, c’est que j’avais déjà vu au moins la moitié des questions sur le site Examtopic. 
Je vous conseille donc fortement de travailler sur ce site même si encore une fois il faut faire très attention 
aux réponses proposées par le service.&lt;/p&gt;

&lt;p&gt;En espérant que ce retour vous aide dans vos révisions !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>J&apos;ai acheté un chat virtuel</title>
   <link href="https://liard.me/2021/03/achete-un-chat-virtuel/"/>
   <updated>2021-03-28T17:25:05+02:00</updated>
   <id>https://liard.me/2021/03/j-ai-achete-un-chat-virtuel</id>
   <content type="html">&lt;p&gt;Vous ne rêvez pas, nous sommes en 2021 et je découvre les cryptokitties 3 ans après sa sortie et alors que la “hype” est bien passée. Alors quel intérêt d’écrire un article sur ce sujet aujourd’hui ? Et bien simplement car début 2021,  il s’est passé des choses folles à propos de la vente de token NFT. Comme la vente du premier tweet de Jack Dorsey 2,5 millions ou comme l’oeuvre numérique de Beeple vendue 69,3 millions de dollars aux enchères.&lt;/p&gt;

&lt;p&gt;Mon objectif n’est pas de vous expliquer comment vendre vous aussi votre plus beau JPG (il y a des tonnes de vidéos Youtube pour ça) mais plus de comprendre ce qu’est concrètement et techniquement un token NFT. Et quoi de mieux pour comprendre que d’essayer. N’ayant pas plusieurs millions en ETH pour acheter une oeuvre, je me suis rabattu sur un chat cryptokitties, mais j’aurais aussi pu acheter une image de joueur de foot sorare ou un bitburgersr.&lt;/p&gt;

&lt;h2 id=&quot;blockchain-et-smartcontract&quot;&gt;Blockchain et smart contract&lt;/h2&gt;

&lt;p&gt;L’élément de base, c’est que ces tokens s’intègrent dans une blockchain permettant l’exécution de smart contract. Un smart contract est juste un morceau de code. Ce code va définir la structure du token et la gestion de ce dernier (comment il est créé, les règles de transfert et celles de destruction). Ce code va aussi avoir besoin d’un espace de stockage pour sauvegarder ses données.&lt;/p&gt;

&lt;p&gt;Cette question du stockage de données m’a intrigué. Où peut-on sauvegarder des données dans une blockchain ? Une blockchain, c’est avant tout une succession de block contenant une suite de transactions. Il n’y a pas de notion d’espace de stockage centralisé de variable… Ce que je n’avais pas compris, c’est qu’une blockchain comme ethereum est constituée de 2 parties :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;une partie block data&lt;/li&gt;
  &lt;li&gt;une partie blockchain state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans le block data est sauvegardé l’ensemble des blocks de la blockchain et dans le blockchain state on retrouve par exemple la balance d’ETH d’un compte ou les variables d’un smart contract. Cet espace de stockage utilise un “Merkle Patricia Trie” pour référencer les données.&lt;/p&gt;

&lt;p&gt;Savoir ou sont stockées les données c’est un bon début, mais il y a quoi dans un token ?&lt;/p&gt;

&lt;h2 id=&quot;token-erc-721&quot;&gt;Token ERC-721&lt;/h2&gt;

&lt;p&gt;Un token NFT c’est un “Non-Fungible Tokens”. Un token non fongique est un token qui est unique et identifiable. Chaque token a sa propre valeur. Pas comme un billet de 10 euros que l’on peut changer par un autre billet de 10 sans aucune différence.&lt;/p&gt;

&lt;p&gt;Pour que notre token soit utilisable par d’autres smart contract, l’idéal c’est qu’il implémente une interface. Et c’est pour cela qu’a été créé le modèle des token ERC721. &lt;/p&gt;

&lt;p&gt;Mais qu’est ce qu’il y a dans mon token exactement ? Et bien dans le cas de mon chat : juste un identifiant. Mon chat est identifié par l’adresse du contrat qui l’a créé et par son identifiant : 0x06012c8cf97bead5deae237070f9587f8e7a266d et 1222591&lt;/p&gt;

&lt;p&gt;La norme ERC721 autorise aussi l’ajout de metadata avec un nom, un symbole et un “tokenURI” mais rien de plus. Et les développeurs essaient de mettre le minimum d’informations aussi car plus le token occupe de l’espace, plus il est cher à gérer (on reviendra plus tard sur les problèmes de coût). Si le token de mon chat n’est composé que d’un id, son smart contract stocke un peu plus d’informations :&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-solidity&quot; data-lang=&quot;solidity&quot;&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Kitty&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;uint256&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;genes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;uint64&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;birthTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;uint64&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cooldownEndBlock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;uint32&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matronId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;uint32&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sireId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;uint32&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;siringWithId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;uint16&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cooldownIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;uint16&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;generation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Il y a donc dans le smart contract des cryptokitties une liste avec les caractéristiques de tous les chats. Mais pour sa photo, c’est une URL sur un serveur de Google. Et c’est là qu’on voit arriver un des plus gros paradoxes de ces tokens, on utilise une blockchain car elle est complètement décentralisée mais au final, souvent c’est une simple URL vers un serveur où est stocké “l’oeuvre”. Heureusement des réseaux comme IPFS existent et proposent une alternative, mais c’est une autre histoire :)&lt;/p&gt;

&lt;p&gt;C’est aussi grâce à cette interface que beaucoup de places de marchés comme OpenSea peuvent voir le jour. Elle peuvent effectuer des opérations avec leur propre smart contract sur l’ensemble des tokens respectant la norme ERC-721.&lt;/p&gt;

&lt;h2 id=&quot;la-gestion-dugas&quot;&gt;La gestion du Gas&lt;/h2&gt;

&lt;p&gt;Un autre élément que j’ai eu du mal à appréhender en étudiant les smart contract c’est la notion de “Gas”. Comme son nom l’indique c’est le “carburant” qui est utilisé pour effectuer des opérations sur la blockchain ethereum. Chaque transaction a un coût en Gas qui est ensuite reversé au noeud qui a validé le block de transaction dans la blockchain. Ce coût se transforme donc en ETH au moment de valider le block.&lt;/p&gt;

&lt;p&gt;Mais combien va coûter l’exécution d’une méthode de smart contract ? Et bien c’est super simple à savoir car une fois votre code compilé dans le dialect EVM, chaque instruction à un coût. Le problème c’est qu’en fonction de l’exécution le coût va être différent (en fonction d’un if pas exemple). C’est pour cela qu’au moment de faire une transaction, il faut indiquer un “Gas Limit”. Ca va éviter de mauvaises surprises en cappant le coût maximum de la transaction. Par contre c’est une arme à double tranchant. Car si par exemple vous limitez à 1000 Gas, mais qu’il en faudrait 1100 et bien la transaction va échouer mais vous serez quand même facturé des 1000 Gas (car le noeud a bien effectué ce travail).&lt;/p&gt;

&lt;p&gt;Par exemple pour mon chat acheté 8$ j’ai eu 15$ de Transaction Fee car l’achat à consommé 64 344 Gas. C’est cher car il y a eu plusieurs opérations à faire. En effet j’ai acheté sur la place de marché du site. Il a donc fallu plusieurs étapes :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;le compte “CryptoKitties: Sales Auction” m’a envoyé le token&lt;/li&gt;
  &lt;li&gt;mon compte a envoyé une grosse partie du prix au vendeur&lt;/li&gt;
  &lt;li&gt;mon compte a envoyé une partie du prix au compte “Sales Auction”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C’est en étudiant le détail de la transaction que l’on découvre toutes ces étapes complètement transparentes au moment de l’achat.&lt;/p&gt;

&lt;h2 id=&quot;pourquoi&quot;&gt;Pourquoi ?&lt;/h2&gt;

&lt;p&gt;Oui pourquoi prendre du temps pendant son weekend à comprendre le fonctionnement d’un chat virtuel ? Tout simplement car je pense que le développement d’applications décentralisées va devenir la norme dans le futur. Le champ des possibles est immense avec cette technologie.&lt;/p&gt;

&lt;p&gt;Ma prochaine étape sera de développer un smart contract avec un token pour tester le principe. Affaire à suivre donc :)&lt;/p&gt;

&lt;h2 id=&quot;références&quot;&gt;Références&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=YPbgjPPC1d0&quot;&gt;Tuto dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=9yuHz6g_P50&quot;&gt;Vidéo info&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://auth0.com/blog/an-introduction-to-ethereum-and-smart-contracts-part-2/&quot;&gt;Blog post smart contract&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Spring Cloud Steam</title>
   <link href="https://liard.me/2020/07/spring-cloud-steam/"/>
   <updated>2020-07-29T17:25:05+02:00</updated>
   <id>https://liard.me/2020/07/spring-cloud-steam</id>
   <content type="html">&lt;p&gt;Après une journée à rechercher comment fonctionne Spring Cloud Stream, je me rends compte que la dernière version a changé pas mal de choses.&lt;/p&gt;

&lt;p&gt;En effet depuis la version 3, la gestion des streams s’est orienté vers du code fonctionnel et on trouve encore beaucoup d’exemples utilisant “l’ancienne” méthode basée sur les annotations. Même dans la documentation officielle, je ne trouve pas ça super clair.&lt;/p&gt;

&lt;p&gt;Du coup je vous propose d’étudier un petit exemple de mise en place simple avec cette nouvelle façon de faire.&lt;/p&gt;

&lt;h2 id=&quot;la-création-dévènements&quot;&gt;La création d’évènements&lt;/h2&gt;

&lt;p&gt;Souvent dans les tutos les évènements sont créés par des Suppliers comme ça :&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;nd&quot;&gt;@Bean&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Supplier&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sendItem&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tomato&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Mais dans un projet pour une API, c’est souvent créé par un call HTTP.
Dans ce cas il faut utiliser un StreamBridge&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;n&quot;&gt;streamBridge&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;sendItem-out-0&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tomato&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Avec la nouvelle version fonctionnelle de spring cloud stream, la
gestion des définitions des files de message n’est plus faite par
annotation mais par la configuration basée sur des règles de nommage.&lt;/p&gt;

&lt;p&gt;Donc mon code signifie que je vais envoyer l’object Item comme premier
élément de sortie de la fonction sendItem.
Il faudra aussi ajouter dans le fichier application.properties la ligne&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-properties&quot; data-lang=&quot;properties&quot;&gt;&lt;span class=&quot;py&quot;&gt;spring.cloud.stream.bindings.sendItem-out-0.destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;listItems&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;On était habitué à faire toute la configuration via annotation, ce n’est
plus le cas.&lt;/p&gt;

&lt;h2 id=&quot;consommer-un-évènement&quot;&gt;Consommer un évènement&lt;/h2&gt;

&lt;p&gt;Toujours avec un code fonctionnel, un exemple de consommateur :&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;nd&quot;&gt;@Bean&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Consumer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;printItem&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;LOG&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Item &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;(&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;price&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;)&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Dans cet exemple on consomme un object Item pour l’afficher dans les
logs. Il ne fonctionnera que si dans la configuration on ajoute :&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-properties&quot; data-lang=&quot;properties&quot;&gt;&lt;span class=&quot;py&quot;&gt;spring.cloud.stream.function.definition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;printItem&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;spring.cloud.stream.bindings.printItem-in-0.destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;listItems&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Il faut donc définir la fonction printItem comme fonction gérant un
stream et ensuite dire qu’elle consomme les objets de la file
“listItems”&lt;/p&gt;

&lt;h2 id=&quot;transformer-un-événement&quot;&gt;Transformer un événement&lt;/h2&gt;

&lt;p&gt;En plus des consommateurs et des producteurs, on peut faire des
fonctions de composition.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;nd&quot;&gt;@Bean&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Integer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getPrice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Dans cet exemple, la fonction transforme un object Item et entier. La
encore il faut le configurer&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-properties&quot; data-lang=&quot;properties&quot;&gt;&lt;span class=&quot;py&quot;&gt;spring.cloud.stream.function.definition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;getPrice;printItem&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;spring.cloud.stream.bindings.getPrice-in-0.destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;buyItems&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;spring.cloud.stream.bindings.getPrice-out-0.destination&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;addPrices&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Donc on ajoute le nom de la méthode getPrice dans la liste des
fonctions gérant des stream et on ajoute le nom de la file dans 
laquelle on consomme un évènement et celle où on envoie le résultat&lt;/p&gt;

&lt;h2 id=&quot;test-unitaire&quot;&gt;Test unitaire&lt;/h2&gt;

&lt;p&gt;Pour tester que la configuration et le routage fonctionnent correctement
on teste qu’en fonction d’une donnée en entrée on récupère bien le bon
résultat en sortie pour une fonction de composition&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;nd&quot;&gt;@Test&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testMessages&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;GenericMessage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Tomato&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)));&lt;/span&gt;
  &lt;span class=&quot;nc&quot;&gt;BlockingQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Message&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;messages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;collector&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;forChannel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;assertThat&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;messages&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;receivesPayloadThat&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;CoreMatchers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;is&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;20&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)));&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;En sachant qu’il est aussi assez simple de tester unitairement la
fonction en direct :&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;nd&quot;&gt;@Test&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;testFunction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;assertEquals&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPrice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Tomato&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;intValue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Et voilà, c’est juste un petit exemple mais j’ai personnellement eu du mal à retrouver tous ces points dans un autre tuto.
L’ensemble du code est sur &lt;a href=&quot;https://github.com/sliard/spring-cloud-stream-basic&quot;&gt;ce repo github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dans mon exemple, il y a un docker-compose.yml pour lancer une
instance de RabbiMQ avec un compte sécurisé avec un mot de passe et la
configuration en découlant dans le fichier application.properties. Et
oui je n’utilise pas de YAML pour la configuration de spring, je suis
beaucoup trop vieux pour ça !&lt;/p&gt;

&lt;h2 id=&quot;références&quot;&gt;Références&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/current/reference/html/spring-cloud-stream.html#_functional_composition&quot;&gt;Doc spring&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://piotrminkowski.com/2020/06/05/introduction-to-event-driven-microservices-with-spring-cloud-stream/&quot;&gt;Bon exemple en Kotlin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/spring-cloud/spring-cloud-stream-samples&quot;&gt;Exemples officiels&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Création d&apos;un cron avec SNS</title>
   <link href="https://liard.me/2014/02/creation-dun-cron-avec-sns/"/>
   <updated>2014-02-05T10:32:50+01:00</updated>
   <id>https://liard.me/2014/02/creation-dun-cron-avec-sns</id>
   <content type="html">&lt;p&gt;Ou comment complètement détourner l’usage du service Amazon SNS.&lt;/p&gt;

&lt;p&gt;Mon besoin est simple : pouvoir exécuter du code toutes les 30s. Cette tâche commencera et s’arrêtera en fonction d’actions utilisateur. En java j’aurais simplement utilisé Quartz, mais là mon code est en PHP et hébergé sur Beanstalk d’Amazon.&lt;/p&gt;

&lt;p&gt;Je n’ai pas trouvé de service simple à utiliser sur AWS pour faire ça. On trouve bien un peu de doc pour le faire avec Data Pipeline mais c’est loin d’être trivial. Après beaucoup d’hésitation j’ai décidé d’utiliser le service SNS.&lt;/p&gt;

&lt;p&gt;Pour faire simple, SNS est un service de diffusion de message multi-canal. (doc complète &lt;a href=&quot;http://docs.aws.amazon.com/sns/latest/dg/welcome.html&quot; title=&quot;SNS&quot;&gt;ici&lt;/a&gt; )&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2014/02/sns-how-works.png&quot; alt=&quot;SNS&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Par contre il n’est pas fait pour envoyer un message périodiquement. Avec SNS on ne peut pas non plus dire “envoie ce message dans 30s”, le message est distribué de suite. Donc pour mon cas d’usage ce n’est pas vraiment l’idéal. J’aurais tellement aimé pouvoir dans mon code avoir un consommateur de message qui une fois le traitement fini s’envoie un nouveau message à lui même mais pour dans 30s.&lt;/p&gt;

&lt;p&gt;Malheureusement ce n’est pas aussi simple et c’est lorsque j’ai regardé les politiques de retry pour les abonnements en http que j’ai trouvé une solution à mon problème. En effet, dans le cas d’un message envoyé sur un consommateur HTTP, si la requête retourne un code d’erreur (type 5xx) alors le message n’est pas considéré comme lu et va être représenté au même consomateur suivant une politique de retry configurable (toutes les infos &lt;a href=&quot;http://docs.aws.amazon.com/sns/latest/dg/DeliveryPolicies.html&quot;&gt;sur la doc&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2014/02/sns-delivery-policy-defaults.png&quot; alt=&quot;SNS&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Et là on voit bien se profiler une tâche périodique&lt;/p&gt;

&lt;p&gt;C’est, je vous l’accorde, assez border line. Mais ça a le mérite d’être simple et de fonctionner. Le seul inconvénient c’est que le nombre de retry est limité à 99. Donc dans mon cas mon cron s’arrêtait après 50 minutes. Il n’y a pas d’information dans le message envoyé par SNS du nombre de retry, par contre il y a sa date d’émission. Dans mon consommateur, j’ai donc codé qu’après 2 minutes  j’envoyais un nouveau message et retournais un code HTTP 200 pour consommer le message et arrêter les retry sur celui-ci. Au début j’avais mis 10 minutes, mais je ne sais pas pourquoi, même avec un code 200 les retry continuaient toujours sur le message. Avec 2 minutes (et donc moins de retry) aucun problème.&lt;/p&gt;

&lt;p&gt;Cela donne cette architecture :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2014/02/SNS.png&quot; alt=&quot;SNS&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Et un diagramme de séquence pour bien comprendre le déroulement  :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2014/02/Untitled-4.png&quot; alt=&quot;SNS&quot; /&gt;&lt;/p&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Dans ce cas je configure la politique de retry avec les options suivantes :
&lt;/p&gt;

&lt;pre class=&quot;php:nogutter&quot;&gt;&quot;minDelayTarget&quot; =&amp;gt; 30,
&quot;maxDelayTarget&quot; =&amp;gt; 30,
&quot;numRetries&quot; =&amp;gt; 10,
&quot;numMaxDelayRetries&quot; =&amp;gt; 0,
&quot;numNoDelayRetries&quot; =&amp;gt; 0,
&quot;numMinDelayRetries&quot; =&amp;gt; 0,
&quot;backoffFunction&quot;=&amp;gt; &quot;linear&quot;&lt;/pre&gt;

&lt;p&gt;Oui retourner une erreur 500 alors que le traitement s’est bien passé n’est pas très orthodoxe, Mais le système fonctionne bien, je peux voir sur la console SNS le nombre de Topic ouverts et donc le nombre de cron en cours d’exécution. C’est assez pratique. Si vous avez d’autres solutions je suis preneur ! (des services comme &lt;a href=&quot;http://www.setcronjob.com&quot;&gt;setcronjob&lt;/a&gt; ou même &lt;a href=&quot;http://www.easycron.com/?r=15708&quot;&gt;easycron&lt;/a&gt; sont trop limités au niveau requête par jour)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Premiers tests de Google App Engine en PHP</title>
   <link href="https://liard.me/2013/05/premiers-tests-de-google-app-engine-en-php/"/>
   <updated>2013-05-30T23:50:22+02:00</updated>
   <id>https://liard.me/2013/05/premiers-tests-de-google-app-engine-en-php</id>
   <content type="html">&lt;p&gt;C’est une des grosses annonces de la Google I/O 2013, Google App Engine supporte maintenant PHP. J’ai eu l’occasion de le tester sur un de mes projets. La première chose qu’il faut constater, c’est que l’utilisation du service en PHP n’est pas vraiment ouverte. Pour le moment il faut passer par une phase de validation de son projet pour avoir le droit d’utiliser le service. On est maintenant à 2 semaines de l’annonce et seulement 282 projets on été acceptés.&lt;/p&gt;

&lt;h2 id=&quot;configuration&quot;&gt;Configuration&lt;/h2&gt;

&lt;p&gt;Qui dit PHP dit LAMP et donc mysql. Google a justement ouvert une offre Cloud SQL. Nous ne sommes plus limités à leur DataStore NoSql sur GAE (c’était déjà le cas depuis plusieurs mois). Par contre la facturation du service Cloud SQL se fait à l’heure alors que le DataStore facture à l’usage (nombre de read/write). C’est moins économique pour un petit projet mais plus facilement prédictif. Pour la sauvegarde de fichier il faut utiliser Google Cloud Storage qui n’est ni plus ni moins une copie du service S3 d’Amazon. Les APIs sont même compatibles.&lt;/p&gt;

&lt;p&gt;Pour utiliser l’ensemble de ces services la console GAE n’est plus suffisante, il faut utiliser la “Cloud Console”. Et c’est là que commence le parcours du combattant.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2013/05/Console.png&quot; alt=&quot;SNS&quot; /&gt;&lt;/p&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Sur mon projet, au moment de vouloir créer mon premier Bucket sur Cloud Storage on me demande d&amp;#8217;activer le Billing. J&amp;#8217;ai donc entré mes informations personnelles et mon numéro de carte bleue. Rien d&amp;#8217;exceptionnel s&amp;#8217;il ne fallait pas le faire pour chaque projet ! A chaque fois on me redemande la même chose. Pire il faut aussi activer le billing sur la console Google App Engine. Donc pour chaque projet on va avoir 2 lignes de facturation ? La semaine dernière j&amp;#8217;ai eu un débit de 0.15 € sur mon compte et 0.40€ de frais bancaires. Si j&amp;#8217;ai 10 lignes à moins de 1€ sur mon compte par semaine, c&amp;#8217;est mon comptable qui va être content :( J&amp;#8217;ai l&amp;#8217;impression que l&amp;#8217;on peut simplifier les choses en souscrivant à une offre de support Google. La moins chère est à 150€ par mois, dans mon cas ça attendra.
&lt;/p&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Une fois le billing activé, impossible de créer un bucket sur Cloud Storage. J&amp;#8217;ai le message :
&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p style=&quot;text-align: left;&quot;&gt;
  The account for the specified project has been disabled.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Et oui car il y a une seconde console où il faut activer le Cloud Storage pour pouvoir l&amp;#8217;utiliser ! Bien sûr aucun lien direct vers cette console que j&amp;#8217;ai trouvée grâce à StackOverflow : &lt;a href=&quot;https://code.google.com/apis/console&quot;&gt;https://code.google.com/apis/console&lt;/a&gt;
&lt;/p&gt;

&lt;h2 style=&quot;text-align: left;&quot;&gt;
  Le code
&lt;/h2&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Une fois cette partie gestion terminée, je peux enfin commencer à tester mon service PHP sur GAE. C&amp;#8217;est une petite application facebook codée avec le framework codeigniter. Premier problème, il ne trouve pas la fonction php_sapi_name. Par défaut, beaucoup de fonctions PHP sont désactivées sur GAE, mais il est possible de les réactiver en ajoutant un fichier php.ini à la racine de votre projet :
&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p style=&quot;text-align: left;&quot;&gt;
  google_app_engine.enable_functions = &amp;#8220;phpversion, phpinfo, php_sapi_name&amp;#8221;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Ensuite j&amp;#8217;ai un problème avec la variable $_SERVER, il ne trouve pas l&amp;#8217;élément SCRIPT_NAME. Comme ce n&amp;#8217;est pas structurant pour mon application je l&amp;#8217;ai juste retiré du code. La connexion à la base se passe sans problème. J&amp;#8217;ai juste du mettre l&amp;#8217;option db_debug à FALSE pour que ça fonctionne. Attention aussi par défaut il n&amp;#8217;y a que l&amp;#8217;utilisateur root sur votre base, c&amp;#8217;est à vous de créer votre user (comme sur votre mysql en fait).
&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘hostname’] = ‘:/cloudsql/&amp;lt;project_name&amp;gt;:&amp;lt;sql_name&amp;gt;’;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘username’] = ‘login’;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘password’] = ‘pass’;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘database’] = ‘basename’;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘dbdriver’] = ‘mysql’;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘dbprefix’] = ”;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘pconnect’] = TRUE;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘db_debug’] = FALSE;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘cache_on’] = FALSE;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘cachedir’] = ”;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘char_set’] = ‘utf8’;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘dbcollat’] = ‘utf8_general_ci’;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘swap_pre’] = ”;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘autoinit’] = TRUE;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;$db[‘stricton’] = FALSE;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Donc avec très peu de modifications mon application PHP tourne sur GAE. Il me reste à regarder le stockage sur Cloud Storage. La documentation est succinte mais nous avons les éléments pour le faire. Mes premiers tests n’étaient pas très concluants, j’avais un retour d’erreur sur l’adresse d’upload :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;503 Service Unavailable&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Et c’est à ce moment qu’il faut comprendre que “Service Unavailable” veut dire : “vous n’avez pas les bons droits d’accès”. Après avoir ajouté des droits d’accès sur le bucket l’upload de fichier fonctionne. La documentation est vraiment très pauvre quand même. Certaines fonctions php son implementées (comme unlink) et d’autre pas (pas de rename). Il y a un vrai manque de documentation pour utiliser Cloud Storage en PHP, il nous faut vraiment le même niveau de doc que ce qui est proposé en Python. J’ai aussi remonté un bug sur la méthode move_uploaded_file, pour le moment on perd l’info sur le type du fichier à la copie. C’est gênant surtout qu’aucune documentation ne nous dit comment modifier les metadata d’un fichier. Le &lt;a href=&quot;https://code.google.com/p/googleappengine/issues/detail?id=9407&quot;&gt;ticket&lt;/a&gt; a été validé par google.&lt;/p&gt;

&lt;p&gt;Comme je l’ai dit au début, l’objectif est de réaliser une application FaceBook, il faut donc avoir un service disponible en HTTPS. Là rien de très compliqué techniquement, il faut utiliser la console de gestion de domaine (oui une quatrième console !). Ce tuto explique très bien les différentes étapes d’installation. Par contre j’ai eu la surprise de découvrir qu’il fallait payer 9$ par mois pour pouvoir ajouter un certificat SSL (en plus du prix du certificat bien sûr).&lt;/p&gt;

&lt;p&gt;Une fois que l’ensemble fonctionne, on peut se concentrer sur le point important : Les temps de réponse. Est-ce que le gros problème de temps de démarrage d’instance Java que j’ai décrit &lt;a href=&quot;/2012/07/google-app-engine-suite/&quot;&gt;ici&lt;/a&gt; il y a 1 an (toujours d’actualité  :() se retrouve aussi en PHP ? La réponse est mitigée. Oui c’est plus rapide, on est souvent autour d’une seconde pour démarrer une nouvelle instance. Par contre il faut 6,5s pour uploader un fichier de 300ko ! Quand je dis uploader, je compte l’ensemble du traitement comme il est noté dans la doc à savoir : upload + move_uploaded_file + unlink du fichier temp. C’est vraiment l’upload qui est long puisque je descends à 5,5s de temps d’exécution si je retire move_uploaded_file et unlink. Cette lenteur est complètement bloquante dans certains cas et difficilement explicable.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;La bonne nouvelle est que j’ai pu installer une application PHP existante assez rapidement sur GAE. Je n’ai dû recoder que la partie upload de fichiers. Par contre l’offre Cloud de Google reste encore un peu lourde. On voit bien que  c’est le début et que tout n’est pas encore intégré. Le fait d’avoir 4 consoles différentes montre qu’il y a encore du travail :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Console GAE : les logs, la gestion des versions, du billing&lt;/li&gt;
  &lt;li&gt;Cloud Console : Gestion de Cloud SQL, Cloud Storage&lt;/li&gt;
  &lt;li&gt;Console API : Pour activer les services visibles dans la Cloud Console&lt;/li&gt;
  &lt;li&gt;Domain manager : Gestion des domaines et donc des certificats SSL pour GAE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On est donc loin de la maturité d’Amazon mais l’offre est intéressante. Elle a au moins eu l’avantage d’ouvrir une guerre des prix entre les 2 géants :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Points positifs :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Scalable à l’infini&lt;/li&gt;
  &lt;li&gt;Codeigniter fonctionne dessus&lt;/li&gt;
  &lt;li&gt;Coût proche de zéro en début de projet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Points négatifs :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Documentation très pauvre&lt;/li&gt;
  &lt;li&gt;Encore des lenteurs&lt;/li&gt;
  &lt;li&gt;4 consoles c’est 3 de trop&lt;/li&gt;
  &lt;li&gt;Environnement de dev plus complexe qu’un simple LAMP&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Lancer un cron sur un cluster</title>
   <link href="https://liard.me/2013/01/lancer-un-cron-sur-un-cluster/"/>
   <updated>2013-01-07T10:39:50+01:00</updated>
   <id>https://liard.me/2013/01/lancer-un-cron-sur-un-cluster</id>
   <content type="html">&lt;p&gt;Sur un de mes projets j’ai besoin d’exécuter une tâche tous les jours. Cet exercice pourtant trivial peut devenir plus complexe si mon service utilise plusieurs serveurs et que je ne veux exécuter la tâche qu’une seule fois. En Java j’utilisais le &lt;a href=&quot;http://quartz-scheduler.org/&quot;&gt;scheduler Quartz&lt;/a&gt; pour régler ce problème. Il est très efficace et en cas de cluster il utilise une base de données pour s’assurer que la tâche n’est lancée que sur un seul serveur. Mais si votre tâche doit être lancée en shell ? J’ai donc cherché une solution pour le faire simplement sur mon projet utilisant des instances EC2.&lt;/p&gt;

&lt;p&gt;Après pas mal de recherches, j’ai trouvé une solution simple sur &lt;a href=&quot;http://stackoverflow.com/a/12623737&quot;&gt;stackoverflow&lt;/a&gt;. L’idée est bonne mais le script ne fonctionne pas (rien que l’utilisation de la commande hostname est étrange…).&lt;/p&gt;

&lt;p&gt;J’ai finalement fait fonctionner ce script :&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;ruby:nogutter&quot;&gt;#!/usr/bin/env ruby

AWS_AUTO_SCALING_HOME=&apos;/opt/aws/apitools/as&apos;
JAVA_HOME=&apos;/usr/lib/jvm/jre&apos;
MY_GROUP = &apos;&amp;lt;GroupName&amp;gt;&apos;

@cmd_out = `bash -c &apos;JAVA_HOME=#{ JAVA_HOME } AWS_AUTO_SCALING_HOME=#{ AWS_AUTO_SCALING_HOME } as-describe-auto-scaling-instances -region &amp;lt;REGION&amp;gt; -I &amp;lt;KEY&amp;gt; -S &amp;lt;SECRET&amp;gt;&apos;`

raise &quot;Output empty, should not happen!&quot; if @cmd_out.empty?
@lines = @cmd_out.split(/\r?\n/)
@last = @lines.select {|l| l.match MY_GROUP }.reverse.
detect { |l| l =~ /^INSTANCE\s+\S+\s+\S+\s+\S+\s+InService\s+HEALTHY/ }
raise &quot;No suitable host in autoscaling group!&quot; unless @last
@last_host = @last.match(/^INSTANCE\s+(\S+)/)[1]
@hostname = `wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`

if @hostname.index(@last_host)
  puts &quot;It&apos;s me!&quot;
  exit(0)
else
  puts &quot;Someone else will do it!&quot;
  exit(1)
end&lt;/pre&gt;

&lt;p&gt;Il est aussi possible de gérer différemment la gestion de l’authentification AWS en passant par un fichier comme expliqué &lt;a href=&quot;http://alestic.com/2010/09/aws-iam&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ce script doit être exécuté par root. Ensuite il suffit d’ajouter une ligne dans la crontab de vos instances du type :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;02 01 * * * ~/lastonly.rb &amp;amp;&amp;amp; wget -q -O – http://www.mysite.com/cron/crontasks&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cette solution n’est pas parfaite mais elle a le mérite d’être simple. Une autre solution plus “propre” serait sans doute d’utiliser &lt;a href=&quot;http://aws.amazon.com/fr/swf/&quot;&gt;Amazon Simple Workflow Service&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>New Relic sur du Beanstalk PHP</title>
   <link href="https://liard.me/2012/11/new-relic-sur-beanstalk-php/"/>
   <updated>2012-11-15T22:34:41+01:00</updated>
   <id>https://liard.me/2012/11/new-relic-sur-beanstalk-php</id>
   <content type="html">&lt;p&gt;Ces derniers temps j’ai beaucoup travaillé sur les produits Amazon Web Services. J’ai notamment utilisé Beanstalk pour mettre en production un site web important. Pour mesurer l’activité des serveurs et l’utilisation de l’application j’ai utilisé le service &lt;a title=&quot;new relic&quot; href=&quot;https://newrelic.com&quot; target=&quot;_blank&quot;&gt;New Relic&lt;/a&gt;. En plus il existe un &lt;a title=&quot;Newrelic aws&quot; href=&quot;http://newrelic.com/aws&quot; target=&quot;_blank&quot;&gt;partenariat entre AWS et New Relic&lt;/a&gt; pour utiliser un compte standard gratuitement (vous économisez $50 par mois).&lt;/p&gt;

&lt;p&gt;Pour utiliser New Relic il faut l’installer sur une image et en faire une nouvelle AMI. Dans un premier temps j’ai fait l’erreur de faire une image depuis une instance EC2 lancée par Beanstalk. Ca ne peut pas fonctionner car vous intégrez votre application à l’image. La procédure est assez simple une fois qu’on a compris ça.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Notez la référence de l’AMI utilisée en ce moment pas Beanstalk (dans mon cas ami-df9b9cab)&lt;/li&gt;
  &lt;li&gt;Lancez une nouvelle instance EC2 basée sur l’AMI notée juste avant&lt;/li&gt;
  &lt;li&gt;Loggez vous sur la VM pour y installer New Relic. Toute la doc est disponible &lt;a title=&quot;newrelic php&quot; href=&quot;https://newrelic.com/docs/php/the-newrelic-install-script&quot; target=&quot;_blank&quot;&gt;ici&lt;/a&gt;, mais pour du PHP sous centos 64 bits ça donne ça :
    &lt;blockquote&gt;
      &lt;pre&gt;sudo rpm -Uvh http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
&lt;/pre&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;sudo yum install newrelic-php5&lt;/p&gt;

&lt;p&gt;sudo newrelic-install&lt;/p&gt;

&lt;p&gt;sudo chown elasticbeanstalk:elasticbeanstalk /etc/php.d/newrelic.ini&lt;/p&gt;

&lt;p&gt;sudo chmod 777 /etc/php.d/newrelic.ini&amp;lt;/pre&amp;gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Editez ensuite le fichier /etc/php.d/newrelic.ini pour indiquer votre clé API dans “newrelic.license” et changez le nom de l’application dans “newrelic.appname”. Par contre j’ai remarqué que sur ma VM le démon New Relic n’était pas lancé automatiquement au démarrage. Il faut donc exécuter la ligne de commande :
    &lt;blockquote&gt;
      &lt;pre&gt;sudo chkconfig newrelic-daemon on&lt;/pre&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;Ensuite on peut ajouter le monitoring du serveur
    &lt;blockquote&gt;
      &lt;pre&gt;sudo yum install newrelic-sysmond&lt;/pre&gt;

      &lt;pre&gt;sudo nrsysmond-config --set license_key=YOUR_LICENSE_KEY&lt;/pre&gt;

      &lt;pre&gt;sudo /etc/init.d/newrelic-sysmond start&lt;/pre&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Une fois que vous avez bien vérifié que les services sont bien lancés au démarrage, vous pouvez construire une AMI depuis la console. Ensuite il faut indiquer la référence de l’AMI au niveau de la configuration de l’environnement Beanstalk dans “Custom AMI ID”&lt;/p&gt;

&lt;p&gt;C’est aussi simple que ça 😉&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Amazon Web Services Consulting Partners</title>
   <link href="https://liard.me/2012/10/amazon-web-services-consulting-partners/"/>
   <updated>2012-10-09T10:11:03+02:00</updated>
   <id>https://liard.me/2012/10/amazon-web-services-consulting-partners</id>
   <content type="html">&lt;p&gt;Apptom devient officiellement “&lt;a title=&quot;aws&quot; href=&quot;https://aws.amazon.com/solution-providers/si/apptom&quot; target=&quot;_blank&quot;&gt;Amazon Web Services Consulting Partners&lt;/a&gt;” niveau Standard. Aujourd’hui seulement une dizaine de sociétés en France ont ce niveau et Apptom est la seule basée en Bretagne. Ce statut nous apporte une communication directe avec les équipes techniques d’Amazon.&lt;/p&gt;

&lt;p&gt;Apptom se positionne aussi comme revendeur Amazon, nous allons pouvoir simplifier la facturation pour nos clients tout en réduisant les coûts.&lt;/p&gt;

&lt;p&gt;Pour vous aider à trouver un partenaire Amazon proche de chez vous, j’ai créé le site www.partneraws.com. Le site positionne les partenaires consulting sur une carte. C’est plus simple à utiliser que sur le site web officiel.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Google App Engine Suite</title>
   <link href="https://liard.me/2012/07/google-app-engine-suite/"/>
   <updated>2012-07-19T00:01:10+02:00</updated>
   <id>https://liard.me/2012/07/google-app-engine-suite</id>
   <content type="html">&lt;p&gt;Comme expliqué dans le premier article j’ai rencontré certaines difficultés au niveau du développement avec Google App Engine. L’intégration et la gestion de la plate-forme a aussi amené son lot de surprises.&lt;/p&gt;

&lt;h2 id=&quot;gestion-des-instances&quot;&gt;Gestion des instances&lt;/h2&gt;

&lt;p&gt;Nous utilisons GAE pour un service qui a peu de trafic. En mode gratuit aucune instance n’est lancée par défaut, donc chaque utilisateur a un risque de déclencher le lancement d’une instance. Il faut 18 secondes pour démarrer mon instance: 18 secondes ce n’est pas énorme pour démarrer un serveur d’applications, par contre pour répondre à une requête HTTP c’est une éternité.&lt;/p&gt;

&lt;p&gt;Pourquoi ces 18 secondes ? J’ai décomposé un peu les choses :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2s – GAE avec juste une servlet&lt;/li&gt;
  &lt;li&gt;11s – Spring (MVC + Security)&lt;/li&gt;
  &lt;li&gt;2s – URLRewrite&lt;/li&gt;
  &lt;li&gt;2s – objectify&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C’est donc clairement Spring qui prend le plus de temps au démarrage. Mais d’un autre côté, même sans 6 secondes pour répondre à une requête c’est déjà trop.&lt;/p&gt;

&lt;p&gt;Pour éviter ce problème, il faut donc minimiser le nombre de démarrages d’instance. La solution “lowcost” est de configurer un cron toutes les minutes sur votre application. De cette façon vous avez une chance d’avoir toujours une instance en ligne et vos clients ont des temps de réponse corrects. Mais ce n’est pas une science exacte, j’ai quand même eu des problèmes. L’autre solution est d’activer la facturation (2,10$ par semaine au minimum) pour utiliser les instances “idle”. Vous pouvez garder N instances démarrées sans arrêt. Mais même avec cette option je n’ai pas un comportement satisfaisant. Déjà certains clients tombent encore sur une requête de 18s, c’est très rare heureusement, mais ce qui m’inquiète le plus c’est de voir GAE devoir lancer 3 instances pour répondre à 2 clients ! Sur les 24 dernières heures j’ai eu 400 requêtes (statiques et dynamiques), je pense que même un simple apache sur une instance micro Amazon est capable d’encaisser cette charge et bien GAE a eu besoin de lancer 2 instances.&lt;/p&gt;

&lt;p&gt;D’un autre côté, la notion d’instance “idle” veut bien dire ce qu’elle veut dire : “instance inactive”. C’est un moyen de pouvoir anticiper un pic de charge. Donc dès qu’un utilisateur arrive sur mon service, une seconde instance est lancée (par une requête /_ah/warmup). Donc il est assez logique de voir souvent 2 instances. Mais pourquoi GAE en lance régulièrement une troisième !?&lt;/p&gt;

&lt;p&gt;J’ai donc beaucoup de mal à comprendre ce fonctionnement difficilement prévisible, les joies du PAAS :)&lt;/p&gt;

&lt;h2 id=&quot;un-problème-avec-la-3g&quot;&gt;Un problème avec la 3G&lt;/h2&gt;

&lt;p&gt;On a eu un autre problème heureusement passager. Le 18 juin pendant plusieurs heures tous les services hébergés sur GAE n’étaient plus accessibles sur les réseaux 3G Bouygues et Orange. J’ai fait le test sur plusieurs services utilisant GAE en wifi, sur une box ou sur le réseau SFR aucun problème, mais sur les réseaux Orange et Bouygues on avait la page :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2012/07/photo-217x300.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Aucun retour de google sur ce problème qui heureusement ne s’est pas reproduit.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;C’est donc une expérience un peu mitigée. Ce manque de contrôle me gêne un peu. Si on ajoute à cela que le développement réalisé est complètement dédié à GAE, il faut vraiment réfléchir avant de choisir cette plateforme. En tout cas si vous tentez l’aventure, surtout pensez au temps de démarrage de l’instance dès le début. Mais oubliez Spring ou Play qui ne fait pas mieux à ce niveau-là.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jenkins pour xCode</title>
   <link href="https://liard.me/2012/07/jenkins-pour-xcode/"/>
   <updated>2012-07-07T19:28:56+02:00</updated>
   <id>https://liard.me/2012/07/jenkins-pour-xcode</id>
   <content type="html">&lt;p&gt;Il n’est pas concevable pour moi de développer sans avoir une plateforme d’intégration continue. Il existe pas mal de solutions pour le faire en mode SAAS (sur &lt;a title=&quot;Cloudbees&quot; href=&quot;http://www.cloudbees.com/&quot; target=&quot;_blank&quot;&gt;cloudbees&lt;/a&gt; pas exemple). Par contre pour le faire sur des projets iOS c’est plus dur à trouver car il faut le faire sur un MAC. J’ai donc installé un jenkins sur un Mac mini et ce n’est pas si évident que ça à faire.&lt;/p&gt;

&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;/h2&gt;

&lt;p&gt;Jenkins c’est un simple war à installer sur un serveur. Pour nous simplifier la vie une version installable est disponible &lt;a title=&quot;Jenkins installation&quot; href=&quot;http://jenkins-ci.org/content/thank-you-downloading-os-x-installer&quot; target=&quot;_blank&quot;&gt;ici&lt;/a&gt;. Mais les premiers problèmes arrivent vite à cause des droits utilisateur. Par défaut Jenkins utilise l’utilisateur deamon et ça pose pas mal de problèmes.&lt;/p&gt;

&lt;p&gt;J’ai trouvé la solution sur ce blog (lien cassé :( ).&lt;/p&gt;

&lt;p&gt;Pour résumer, il faut changer la configuration par défaut et installer Jenkins pour qu’il démarre avec l’utilisateur jenkins “Start at boot as jenkins”. Ensuite il faut créer l’utilisateur :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;sudo dscl . create /Users/jenkins&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;sudo dscl . create /Users/jenkins PrimaryGroupID 1&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;sudo dscl . create /Users/jenkins UniqueID 300&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;sudo dscl . create /Users/jenkins UserShell /bin/bash&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;sudo dscl . create /Users/jenkins home /Users/Shared/Jenkins/Home/&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;sudo dscl . create /Users/jenkins NFSHomeDirectory /Users/Shared/Jenkins/Home/&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;sudo dscl . passwd /Users/jenkins&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Grâce à ça vous allez pouvoir créer les clés SSH pour utiliser jenkins avec github. Pour cela il faut suivre &lt;a href=&quot;https://help.github.com/articles/generating-ssh-keys&quot; target=&quot;_blank&quot;&gt;la doc github&lt;/a&gt; en utilisant l’utilisateur jenkins.&lt;/p&gt;

&lt;h2 id=&quot;xcode&quot;&gt;XCode&lt;/h2&gt;

&lt;p&gt;Maintenant que nous pouvons récupérer les sources, il faut construire un IPA. Commencez par ajouter &lt;a href=&quot;https://wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin&quot; target=&quot;_blank&quot;&gt;le plugin xcode&lt;/a&gt; dans jenkins.&lt;/p&gt;

&lt;p&gt;A partir d’XCode 4.3, il faut commencer par changer le répertoire de base avec la commande :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;J’ai eu aussi des problèmes avec les certificats développeurs. Par défaut ils sont installés dans le trousseau au niveau session donc inaccessibles d’un autre utilisateur. Là j’ai utilisé la méthode un peu “bourine” et j’ai ajouté mes certificats au niveau système.&lt;/p&gt;

&lt;p&gt;Ensuite le build était bloqué car il ne trouvait pas le fichier de provisioning. Il suffit de les ajouter dans le répertoire :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;/Users/jenkins/Library/MobileDevice/Provisioning&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Et voilà ! On a enfin généré un fichier IPA avec Jenkins.&lt;/p&gt;

&lt;h2 id=&quot;over-the-air&quot;&gt;Over The Air&lt;/h2&gt;

&lt;p&gt;Pour aller un cran plus loin, j’ai eu envie de mettre en place un site pour faciliter l’installation de l’application. C’est possible depuis iOS 4. Il faut générer le plist associé à l’IPA et faire une page web avec un lien vers le plist. Mais j’ai arrété mes recherches de script pour faire ça lorsque j’ai découvert le service testFlight. Il suffit d’uploader l’IPA et testflight s’occupe de la diffusion sur les terminaux de tests (et bien plus en fait). Comme il y a un plugin jenkins pour testflight l’intégration est transparente.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;En espérant que cette note vous gagne du temps ! :)&lt;/p&gt;

&lt;p&gt;Liens :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Blog DeadMeta4&lt;/li&gt;
  &lt;li&gt;&lt;a title=&quot;Cloudbees&quot; href=&quot;http://www.cloudbees.com/&quot; target=&quot;_blank&quot;&gt;Cloudbees&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;testFlight&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Développer sur Google App Engine</title>
   <link href="https://liard.me/2012/06/developper-sur-google-app-engine/"/>
   <updated>2012-06-20T00:07:32+02:00</updated>
   <id>https://liard.me/2012/06/developper-sur-google-app-engine</id>
   <content type="html">&lt;p&gt;Depuis 1 mois je teste le déploiement de services sur Google App Engine. Le moins que l’on puisse dire c’est que c’est loin d’être aussi simple que ce que j’avais vu pendant la Devoxx France. Je vous propose un petit tour sur ce que j’ai remarqué.&lt;/p&gt;

&lt;h2 id=&quot;le-data-store&quot;&gt;Le Data Store&lt;/h2&gt;

&lt;p&gt;Même si Google propose une base SQL en version Beta, j’ai utilisé le datastore No SQL par défaut. Pour simplifier la gestion de la persistance, la librairie &lt;a href=&quot;http://code.google.com/p/objectify-appengine/&quot;&gt;Objectify&lt;/a&gt; est très bien adaptée. La première chose à faire est de bien identifier les champs à indexer. Par défaut un paramètre est indexé, mais plus il y a d’index plus le coût d’écriture est important.&lt;/p&gt;

&lt;p&gt;Attention aussi à la notion d’objet embeded. On ne peut le faire qu’à un niveau. Donc une classe embeded ne peut pas avoir d’attribut List.&lt;/p&gt;

&lt;p&gt;Mais la plus grosse surprise que j’ai eue c’est que l’écriture se fait de façon asynchrone. Après avoir persisté un objet il faut attendre 5-6s pour pouvoir le lire en base. Il faut donc ruser et utiliser des caches pour masquer ce délai.&lt;/p&gt;

&lt;h2 id=&quot;le-blobstore&quot;&gt;Le Blobstore&lt;/h2&gt;

&lt;p&gt;C’est une des fonctions intéressantes du service. Elle permet de stocker facilement des fichiers, des images par exemple. Et pour les images justement il y a même une astuce pour les redimensionner.&lt;/p&gt;

&lt;pre class=&quot;nogutter:nocontrols&quot;&gt;// Resize the image to 32 pixels (aspect-ratio preserved)
http://&lt;em&gt;your_app_id&lt;/em&gt;.appspot.com/randomStringImageId&lt;strong&gt;=s32&lt;/strong&gt;
// Crop the image to 32 pixels
http://&lt;em&gt;your_app_id&lt;/em&gt;.appspot.com/randomStringImageId=s32&lt;strong&gt;-c&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;Pour trouver de l’information sur cette fonction, il faut lire la version Anglaise de la doc. En effet au début on apprécie le fait que toute la doc de Google App Engine ait été traduite en Français. On déchante vite lorsqu’on s’aperçoit que cette dernière n’est pas au même niveau que la version anglaise. Donc n’oubliez pas de lire la VO :)&lt;/p&gt;

&lt;p&gt;Pour revenir au BlobStore, j’ai eu un problème pour gérer les fichiers non renseignés dans un formulaire. Sur un formulaire où l’utilisateur peut éventuellement uploader 1 fichier, un blobstore vide est créé s’il n’y a pas de fichier.&lt;/p&gt;

&lt;p&gt;Ce comportement est d’autant plus étrange qu’on ne le retrouve pas sur le serveur local en mode dev. Une autre leçon à retenir : tester au plus tôt en production votre code.&lt;/p&gt;

&lt;p&gt;Pour résoudre le problème, il faut tester la taille du fichier uploadé pour ensuite le supprimer s’il est vide.&lt;/p&gt;

&lt;pre class=&quot;java:nogutter:nocontrols&quot;&gt;if (blobs.get(&quot;uploadFile&quot;) != null) {
 BlobKey blobKey = blobs.get(&quot;uploadFile&quot;).get(0);
 BlobInfo blobInfo = new BlobInfoFactory().loadBlobInfo(blobKey);
 if (blobInfo.getSize() &amp;gt; 0) {
  uploadFileUrl = imagesService.getServingUrl(blobKey);
 } else {
  blobstoreService.delete(blobKey);
 }
}&lt;/pre&gt;

&lt;h2 id=&quot;a-suivre&quot;&gt;A suivre&lt;/h2&gt;

&lt;p&gt;Je termine là mes remarques sur la partie purement dev de Google App Engine. Mais j’ai eu d’autres surprises que je vous détaillerai prochainement.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Création de Apptom</title>
   <link href="https://liard.me/2012/06/creation-de-apptom/"/>
   <updated>2012-06-10T13:11:30+02:00</updated>
   <id>https://liard.me/2012/06/creation-de-apptom</id>
   <content type="html">&lt;p&gt;C’est maintenant officiel, en Septembre je vais quitter Orange pour créer la société Apptom. Après 7 ans dans le service R&amp;amp;D de cet opérateur, j’ai envie de me lancer un nouveau défi. Progresser dans une grosse entreprise française sans devenir chef de projet ou manager devient de plus en plus difficile. Donc je me lance en solo afin de partager mon expertise technique avec un maximum de monde.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2012/06/AppTom_logoRVB.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Mon objectif est de mettre en avant mon expertise sur la conception et le développement d’applications web et notamment sur la réalisation d’applications iOS natives. Pour compléter ce côté développement, je vais aussi faire du conseil pour accompagner des PME à migrer leur infrastructure vers des offres de cloud computing.&lt;/p&gt;

&lt;p&gt;En attendant Septembre, je suis en pleine phase de prospection. Rencontrer du monde, parler technique c’est vraiment un exercice que j’apprécie. J’ai multiplié les contacts et ça m’a déjà apporté 2 belles affaires.&lt;/p&gt;

&lt;h2 id=&quot;mes-parents-font-des-sms&quot;&gt;Mes Parents font des SMS&lt;/h2&gt;

&lt;div&gt;
  &lt;a href=&quot;http://itunes.apple.com/fr/app/mes-parents-font-des-sms/id515723434?mt=8&quot;&gt;
  ![photo](/images/uploads/2012/06/mpfsApp-200x300.png)
  &lt;/a&gt;
&lt;/div&gt;

&lt;div&gt;
  Alexandre a réalisé un site web pour publier des SMS un peu décalés de nos parents. Pour compléter le site, il m&amp;#8217;a demandé de réaliser une application iPhone. C&amp;#8217;est vraiment plus pratique pour diffuser un screenshot. Ça a fait un gros carton sur l&amp;#8217;AppStore en arrivant même en 5e position du top gratuit !
&lt;/div&gt;

&lt;div&gt;
  Une très bonne expérience qui m&amp;#8217;a surtout fait découvrir http://www.feedvalue.com/ une régie pub française qui est presque 10 fois plus rentable que Admob !
&lt;/div&gt;

&lt;h2 id=&quot;kwala&quot;&gt;Kwala&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://kwala.fr&quot;&gt;&lt;img src=&quot;/images/uploads/2012/06/Kwala-Logo-Web-Square-300x276.png&quot; alt=&quot;photo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div&gt;
  En Mai Benjamin, un ami qui dirige la société Sushee et qui a participé à la création de Code d&amp;#8217;Armor, m&amp;#8217;a proposé de réaliser avec lui un projet de jeux sur smartphone pour les collectivités. Le site est déjà en ligne : &lt;a href=&quot;http://www.kwala.fr&quot;&gt;www.kwala.fr&lt;/a&gt; et on finalise les développements la semaine prochaine. C&amp;#8217;est vraiment un beau projet. La bonne nouvelle c&amp;#8217;est que l&amp;#8217;agglomération de Lannion Trégor a déjà signé notre premier contrat pour faire un jeu cet été. Sur ce projet j&amp;#8217;ai réalisé toute la partie back-office, codé en Java et hébergé sur Google App Engine.
&lt;/div&gt;

&lt;h2 id=&quot;le-début&quot;&gt;Le début&lt;/h2&gt;

&lt;div&gt;
  Encore beaucoup de choses à faire et ce n&amp;#8217;est qu&amp;#8217;un début ! Je suis aussi en plein dans la paperasse : faire les statuts, trouver mutuelle et prévoyance, Business Plan, prévisionnel&amp;#8230; Que des choses super drôles quoi :/
&lt;/div&gt;

&lt;div&gt;
  Heureusement j&amp;#8217;ai trouvé pas mal d&amp;#8217;informations sur des blogs d&amp;#8217;indépendants :
&lt;/div&gt;

&lt;div&gt;
  &lt;ul&gt;
    &lt;li&gt;
      &lt;a href=&quot;http://www.touilleur-express.fr/tag/independant/&quot;&gt;Blog de Nicolas Martignole&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href=&quot;http://www.java-freelance.fr/freelance&quot;&gt;Blog de Mathilde Lemée&lt;/a&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;

&lt;div&gt;
  Mais ce qui a vraiment bien structuré mon projet c&amp;#8217;est l&amp;#8217;accompagnement d&amp;#8217;Orange. En effet mon projet rentre dans le cadre d&amp;#8217;un essaimage, j&amp;#8217;ai donc profité de formations pour bien préparer mon projet.
&lt;/div&gt;

&lt;div&gt;
  Je suis super motivé par cette nouvelle aventure et mes premiers contacts sont très positifs. Donc si vous cherchez un bon développeur et que vous souhaitez vous lancer dans le cloud : contactez-moi ! 😉
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Soirée coding Android</title>
   <link href="https://liard.me/2012/05/soiree-coding-android/"/>
   <updated>2012-05-14T12:03:44+02:00</updated>
   <id>https://liard.me/2012/05/soiree-coding-android</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2012/05/7177476148_daa8c5c9b4.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le mercredi 9 mai nous avons fait avec Code d’Armor une soirée coding Android.&lt;/p&gt;

&lt;p&gt;Depuis décembre 2011 Code d’Armor organise des présentations techniques pour des développeurs. Présenter à 50 personnes du code c’est bien, mais en écrire ensemble c’est mieux ! Donc suite à la soirée sur Android du mois d’Avril, nous avons décidé de faire une soirée coding sur le même sujet.&lt;/p&gt;

&lt;p&gt;12 personnes ont répondu présents pour coder et parfois découvrir avec nous une application Android. L’objectif était de réaliser une application pour Code d’Armor avec plusieurs pages :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Les informations sur les soirées&lt;/li&gt;
  &lt;li&gt;Un tweetwall&lt;/li&gt;
  &lt;li&gt;Un bloc note partagé&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comme nous avions 4 heures, l’objectif était un peu prétentieux, surtout pour un public principalement composé de débutants. Mais il était aussi intéressant de montrer ce qu’il était possible de faire.&lt;/p&gt;

&lt;p&gt;Au final les participants ont bien apprécié la soirée. Ca a été une bonne introduction au sujet et un bon moment de partage entre passionnés. Car oui il faut vraiment être passionné pour venir coder jusqu’à minuit après une journée de boulot. Et c’est avant tout ça l’objectif de Code d’Armor : se rencontrer et construire un réseau.&lt;/p&gt;

&lt;p&gt;Pour finir un petit retour en photo de la soirée :&lt;/p&gt;

&lt;p&gt;[set_id=72157629681549132]&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Devoxx France</title>
   <link href="https://liard.me/2012/04/devoxx-france/"/>
   <updated>2012-04-23T12:14:58+02:00</updated>
   <id>https://liard.me/2012/04/devoxx-france</id>
   <content type="html">&lt;p&gt;La première édition de Devoxx France a eu lieu les 18, 19 et 20 avril 2012. Un grand rassemblement de développeurs français (essentiellement) et donc beaucoup de geeks !&lt;/p&gt;

&lt;p&gt;Sans vous refaire toutes les conférences en détail (il y aura des vidéos sur &lt;a href=&quot;http://www.parleys.com/&quot;&gt;parleys&lt;/a&gt; pour ça) revenons sur ce que j’ai vu et l’ambiance générale.&lt;/p&gt;

&lt;h2 id=&quot;mercredi&quot;&gt;Mercredi&lt;/h2&gt;

&lt;p&gt;Venant de province (Lannion), réveil à 5h30 pour prendre l’avion et arriver juste avant 9h à l’hôtel Marriott. Le checking est rapide et sans pb. On entre ensuite dans le vive du sujet, 3 heures de conférence ou de labs. En effet la première journée est taggée “University”. Le principe est de prendre du temps pour approfondir un sujet technique. C’est vrai qu’avec 3 heures on entre plus dans le détail que pendant des présentations de 50 minutes.&lt;/p&gt;

&lt;h4 id=&quot;google-app-engine&quot;&gt;Google App Engine&lt;/h4&gt;

&lt;p&gt;L’objectif de cette session est de réaliser un site web pour annoncer les résultats de l’élection présidentielle. Donc de prouver la capacité de monter en charge de Google App Engine. Parmi les ingénieurs Google présents il y avait &lt;a href=&quot;http://twitter.com/#/ludoch&quot;&gt;Ludovic Champenois&lt;/a&gt;. Il développe la plateforme, donc forcément il la maitrise :)&lt;/p&gt;

&lt;p&gt;Google App Engine utilise les mêmes data center que ceux utilisés par le fameux moteur de recherche pour héberger vos applications. La présentation commence donc par un avertissement amusant :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Faites attention, on va forcément arriver à absorber votre trafic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;L’avertissement est en fait par rapport à la facturation. En effet la charge n’est pas un problème, vous pouvez avoir des pics de charges énormes google va les absorber… Mais après il va falloir payer. Les quotas d’utilisation sont journaliers et il est donc très fortement conseillé de mettre une limite en $ par jour en fonction de votre budget.&lt;/p&gt;

&lt;p&gt;Cette session est animée sous forme de TP. Vous pouvez retrouver le code &lt;a href=&quot;http://code.google.com/p/devoxx-france-appengine/&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;J’aime vraiment utiliser Google App Engine. Pour un développeur Java c’est très simple. Le gros problème c’est l’impossibilité d’estimer le coût de la solution pour une application pro. Il y a tellement de paramètre qui rentre en compte que l’on ne peut pas vraiment le faire précisément.&lt;/p&gt;

&lt;h4 id=&quot;developing-deploying-and-scaling-in-the-cloud-with-play-par-james-ward-nicolas-leroux-et-guillaume-bort&quot;&gt;Developing, Deploying and Scaling in the Cloud with Play par James Ward, Nicolas Leroux et Guillaume Bort&lt;/h4&gt;

&lt;p&gt;En fait j’avais commencé à la présentation CDI, mais je n’ai vraiment pas accroché au début avec l’explication des échanges OAuth. J’ai donc rapidement migré sur Play.&lt;/p&gt;

&lt;p&gt;J’ai trouvé ça intéressant mais assez superficiel. Le problème c’est que j’ai déjà un peu testé play et donc cette présentation qui a déroulé le tutoriel de base ne m’a rien appris.&lt;/p&gt;

&lt;p&gt;A partir de 17h ont commencé les présentations “Tool in action”. Ce sont des sessions de 30 minutes pour présenter un outil. J’ai participé à deux sessions :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Tester une application Web avec Selenium 2, Selenium Grid et TestNG&lt;/li&gt;
  &lt;li&gt;Continuous deployement : Rackspace, Chef et capistrano en action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Une demi-heure c’est vraiment court. On a juste le temps de comprendre à quoi sert l’outil. Je ne suis pas super fan de ce concept.&lt;/p&gt;

&lt;p&gt;Ensuite il y avait des BOF (Birds-of-a-Feather). Ce sont des rencontres informelles de passionés autour d’un sujet. Des sessions jusqu’à 21h. Mais pour moi réveillé depuis 5h30 et avec 450 Km de trajet dans les pattes, dès 18h j’en avais plein la tête, je n’ai donc pas participé à ces “BOF”.&lt;/p&gt;

&lt;h2 id=&quot;jeudi&quot;&gt;Jeudi&lt;/h2&gt;

&lt;p&gt;On commence donc par une keynote dans une salle immense. Après une petite intro expliquant la génèse du projet Devoxx France, nous avons droit à 2 belles présentations.&lt;/p&gt;

&lt;h4 id=&quot;fier-dêtre-développeur--parpierre-pezziardi&quot;&gt;Fier d’être développeur ? par Pierre Pezziardi&lt;/h4&gt;

&lt;p&gt;Co-fondateur d’OCTO Technology Pierre Pezziardi a une très belle vision du métier de développeur et nous parle de notre problème à faire partager notre passion. Sa réponse est simple : Arrêtez de vous plaindre que le développement est un métier dévalorisé et changez déjà votre propre façon de penser avant de demander aux autres de changer la leur.&lt;/p&gt;

&lt;p&gt;Pour cela il nous présente le “egoless programming manifesto”. 1o règles que l’on peut traduire comme cela :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Comprendre et accepter que l’on fait des erreurs&lt;/li&gt;
  &lt;li&gt;Vous n’êtes pas votre code&lt;/li&gt;
  &lt;li&gt;Peut-importe votre niveau de kung fu, quelqu’un est meilleur&lt;/li&gt;
  &lt;li&gt;Ne pas réécrire le code d’un autre développeur sans concertation&lt;/li&gt;
  &lt;li&gt;Traitez les personnes qui en connaissent moins que vous avec respect et patience&lt;/li&gt;
  &lt;li&gt;La seule constante dans le monde c’est le changement&lt;/li&gt;
  &lt;li&gt;La seule autorité réelle découle de la connaissance, pas de la hiérarchie&lt;/li&gt;
  &lt;li&gt;Battez vous pour vos convictions mais pitié acceptez la défaite&lt;/li&gt;
  &lt;li&gt;Ne soyez pas “le gars dans le bureau”&lt;/li&gt;
  &lt;li&gt;Critiquez le code pas le codeur. Soyez tolérant avec le codeur et sans pitié avec le code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Des règles à respecter dans tout bon open space qui se respecte ! :)&lt;/p&gt;

&lt;h4 id=&quot;this-could-be-heaven-or-this-could-be-hell-by-ben-evans-and-martijn-verburg&quot;&gt;This could be Heaven or this could be Hell by Ben Evans and Martijn Verburg&lt;/h4&gt;

&lt;p&gt;Style complètement différent mais présentation très bien faite. On a eu droit à un vrai show sur comment peut évoluer le monde java dans les prochaines années.&lt;/p&gt;

&lt;p&gt;On enchaine sur les conférences.&lt;/p&gt;

&lt;h4 id=&quot;elasticsearch-par-david-pilato&quot;&gt;ElasticSearch par David Pilato&lt;/h4&gt;

&lt;p&gt;ElasticSearch est une plateforme utilisable pour indexer de gros volumes de données et expose une interface REST pour requêter. C’est super puissant et très scalable car il gère des mécanismes de réplication et de clustering. Le seule chose qu’il faut bien comprendre c’est que les données indexées sont stockées par ElasticSearch. Donc indexer un gros volume de twitter c’est bien, mais il faut ensuite assurer au niveau de l’espace disque.&lt;/p&gt;

&lt;h4 id=&quot;nouveau-look-pour-une-nouvelle-vie-spring-jquery-et-html5-par-julien-dubois&quot;&gt;Nouveau look pour une nouvelle vie: Spring, JQuery et HTML5 par Julien Dubois&lt;/h4&gt;

&lt;p&gt;Bon là, rien de vraiment nouveau pour moi, mais j’étais curieux de voir ce que donnait le projet &lt;a href=&quot;http://blog.ippon.fr/2012/04/11/resultat-du-concours-tatami-pour-devoxx-france/&quot;&gt;Tatami&lt;/a&gt; de Ippon et j’aime bien les présentations de Julien. Ce qu’il faut savoir c’est que spring n’a pas vraiment la cote à Devoxx. D’ailleurs la conf de Julien n’avait pas été retenue au “Call for paper”. Mais comme Ippon est sponsor Julien a habilement utilisé leur slot partenaire pour la faire.&lt;/p&gt;

&lt;p&gt;A la fin de la présentation il lance donc un test de charge comparatif entre son service Tatami (Jquery, Spring, Casandra avec persistance sur disque) contre le service démo de Play utilisant une base de données en mémoire. Et là c’est le drame  :)Julien explose le score avec Spring alors que Play plante sous la charge. Je peux vous assurer qu’il ne s’est pas fait que des copains dans la salle.&lt;/p&gt;

&lt;h4 id=&quot;programmation-concurrente-en-java-dans-la-pratique-par-alex-snaps&quot;&gt;Programmation concurrente en Java dans la pratique par Alex Snaps&lt;/h4&gt;

&lt;p&gt;Une bonne présentation des différents moyens de faire du code thead safe et comment c’est mis en place dans l’implémentation de EhCache. Ca a été pour moi une bonne piqure de rappel.&lt;/p&gt;

&lt;h4 id=&quot;pour-une-fois-soyons-physiques--une-introduction-à-arduino-par-david-delabassee&quot;&gt;Pour une fois soyons physiques ! Une introduction à Arduino par David Delabassee&lt;/h4&gt;

&lt;p&gt;Depuis le temps que j’entends parler de arduino j’ai enfin pu voir à quoi ça ressemblait. Enfin un peu de matériel ça fait du bien. Passer de Google App Engine où on parle d’espace disque en Téra à Arduino avec un processeur 8 bits et 16k de mémoire c’est un peu le grand écart :)&lt;/p&gt;

&lt;p&gt;Arduino est une petite plaque avec un micro controller et des connecteurs d’entrée/sortie. Ensuite en fonction des constructeurs et du niveau de gamme il y a plus ou moins de mémoire, d’adaptateurs (USB, RJ45 ou autre). Pour étendre les possibilités il faut ajouter des “Shields”. Un Shield est une extension spécifique avec par exemple un écran LCD ou des relais pour contrôler des appareils 220V.&lt;/p&gt;

&lt;p&gt;A savoir aussi que le fameux Hello Word en arduino consiste à allumer une LED :)&lt;/p&gt;

&lt;h4 id=&quot;cloud-et-paas-les-développeurs-reprennent-le-pouvoir-par-sacha-labourey&quot;&gt;Cloud et PaaS: les développeurs reprennent le pouvoir par Sacha Labourey&lt;/h4&gt;

&lt;p&gt;Sacha est CEO de CloudBees, il nous a présenté sa vision du cloud. Pour lui les développeurs ne devraient se préoccuper uniquement du code et laisser la gestion de l’IT à des pros : les fournisseurs PAAS.&lt;/p&gt;

&lt;h2 id=&quot;vendredi&quot;&gt;Vendredi&lt;/h2&gt;

&lt;p&gt;On commence la dernière matinée par trois Keynotes. La première d’IBM était atroce, des slides illisibles avec une tonne d’informations inintéressantes et un speaker “mou du slip”. 30 minutes de perdues. Ca pestait tellement sur twitter que les organisateurs n’ont pas affiché de tweet wall après son passage. Heureusement les 2 autres présentations étaient vraiment de haut niveau.&lt;/p&gt;

&lt;p&gt;Patrick Chanezon de VMWare nous a retracé le parcours assez classique d’un développeur en France pour bien mettre en avant qu’il est vital dans notre metier de bien suivre &lt;a href=&quot;http://www.slideshare.net/chanezon/devoxx-france-2012-portrait-du-developeur-en-the-artist&quot;&gt;l’évolution des technos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Neal Ford nous a ensuite fait une présentation très dynamique sur comment on se laisse distraire par des abstractions en oubliant l’essentiel.&lt;/p&gt;

&lt;h4 id=&quot;sizeof-en-java--parce-que-la-taille-ça-comptepar-alex-snaps&quot;&gt;sizeOf en Java — parce que la taille… ça compte! par Alex Snaps&lt;/h4&gt;

&lt;p&gt;Encore une petite piqûre de rappel sur comment la JVM gère la mémoire. Alex Snaps travaille chez Terracotta sur EhCache donc la gestion du HEAP c’est son dada !&lt;/p&gt;

&lt;p&gt;Après le repas il y avait une session sur JavaFX. J’ai d’abord pensé à une bonne blague des organisateurs, mais non ! Je n’y suis pas allé car j’avais déjà eu une démo à une conf en Floride en 2008. A mon avis ça n’a pas évoluer :)&lt;/p&gt;

&lt;p&gt;A la place j’ai fait 2 autres sessions&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Changeons la conception de nos applications grâce aux services Cloud par Cyrille Le clerc&lt;/li&gt;
  &lt;li&gt;Java sur Amazon Web Services par Carlos Conde&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je suis un peu déçu, je pensais que l’on allait rentrer un peu plus dans des problèmes spécifiques au développement pour du cloud, mais on a juste eu une énumération des différents services disponibles.&lt;/p&gt;

&lt;p&gt;La dernière conférence sur Google App Engine a été plus intéressante même si j’avais déjà eu la plupart des infos lors du TP mercredi matin.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;J’ai vraiment passé 3 très bonnes journées. C’est toujours enrichissant d’écouter ce type de conférence, de rencontrer les spécialistes de leur domaine.&lt;/p&gt;

&lt;p&gt;Bien sûr, on peut noter quelques points négatifs (des axes d’amélioration disent les RH  :)). L’organisation a été un peu victime de son succès. Il était difficile de se déplacer autour des stands tellement il y avait de monde. J’ai aussi trouvé le programme très chargé. J’ai rarement vu des conférences finir après 17h un vendredi. C’est aussi sur ces détails que l’on ressent le côté très parisien des organisateurs. Ca peut être sympa de penser aux personnes qui ont 4-5 heures de train pour rentrer chez eux. Personnellement j’ai loupé les deux dernières conf pour pouvoir prendre mon avion.&lt;/p&gt;

&lt;p&gt;Mais à part ça je tire mon chapeau aux organisateurs. Pour avoir participé à quelques conférences aux USA j’ai retrouvé exactement le même niveau de prestation. Jamais je n’avais vu une conférence comme celle-ci en France (bon ok, je ne les fais pas toutes non plus…). Merci aux organisateurs et bonne chance pour l’organisation de devoxx 2013 !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Global Game JAM</title>
   <link href="https://liard.me/2012/01/global-game-jam/"/>
   <updated>2012-01-30T23:10:07+01:00</updated>
   <id>https://liard.me/2012/01/global-game-jam</id>
   <content type="html">&lt;p&gt;Ce week-end avait lieu le Global Game JAM. Cet évènement avait lieu dans 246 villes à travers le monde. Il était organisé sur Rennes au Jardin moderne par 2 associations :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.3hitcombo.fr/&quot; title=&quot;http://www.3hitcombo.fr&quot;&gt;3hitcombo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://westindiecollective.org/&quot; title=&quot;http://westindiecollective.org/&quot;&gt;west indie collective&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2012/01/ggj.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Je vais vous résumer comment ça c’est passé :&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2 id=&quot;vendredi-27&quot;&gt;Vendredi 27&lt;/h2&gt;

&lt;p&gt;Après les annonces générales et quelques conseils, on passe directement au thème imposé par la Global. Cette année c’est une illustration :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2012/01/200px-Ouroboros-simple.svg_.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On enchaine ensuite sur une séance de brainstorm collectif autour de ce thème, 1 heure où les idées fusent. Ensuite il est temps de constituer des équipes. Trois “mouvances” se constituent :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Les jeux de plateau&lt;/li&gt;
  &lt;li&gt;Les jeux vidéo multi-joueur&lt;/li&gt;
  &lt;li&gt;Les minis jeux / pixelart&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On se regroupe donc en fonction de nos envies et de nos compétences. Je choisi de participé au groupe “mini jeux”. Nous sommes rapidement 9 avec des profils bien différents et donc complémentaires :  3 Graphistes, 3 Développeurs, 1 Game designer et 2 Sound designer. Reste maintenant à trouver une idée de jeux : un thème et un game play. Donc on recommence un long brainstorm pour ensuite tenter de trouver un consensus. L’exercice n’est pas simple à 9. Nous arrivons au final à vouloir faire un jeu de plateforme autour d’un personnage cherchant des toilettes de façon urgente. Ne me demandez pas ni pourquoi ni comment nous en sommes arrivés là, la fatigue sûrement…. La non consommation d’alcool ou de stupéfiant peut aussi expliquer ce manque de créativité.&lt;/p&gt;

&lt;p&gt;A 23h il y avait 4 équipes de créées :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Un jeu de plateau avec des canards et des bombes&lt;/li&gt;
  &lt;li&gt;Un jeu de 3D temps réel&lt;/li&gt;
  &lt;li&gt;Un jeu de plateforme&lt;/li&gt;
  &lt;li&gt;Un jeu multijoueur PC et android.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personnellement j’ai décidé de dormir la première nuit pour garder mes forces.&lt;/p&gt;

&lt;h2 id=&quot;samedi-28&quot;&gt;Samedi 28&lt;/h2&gt;

&lt;p&gt;Dès 9h on a commencé à coder (c’est très tôt pour un samedi matin). Coder oui mais avec quel langage ? Nous sommes 3 développeurs maitrisant des technos différentes. Là on a deux choix, soit on choisit une techno neutre que personne ne maitrise vraiment bien pour s’y mettre à 3, ou on laisse un des développeurs prendre le lead et les 2 autres essaient de suivre. On a clairement choisi cette dernière solution et Christopher est parti sur une solution HTML/CSS/Javascript avec le framework &lt;a href=&quot;http://www.melonjs.org/&quot;&gt;melonJS&lt;/a&gt; (il a codé une bonne partie de la nuit de vendredi à samedi en fait).&lt;/p&gt;

&lt;p&gt;De mon côté j’ai essayé de développer en parallèle une version sur iPhone basée sur &lt;a href=&quot;http://cocos2d.org/&quot;&gt;cocos2d&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Notre WarRoom :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2012/01/war.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;En fait notre équipe a continué toute la journée à discuter autour du game play. Ca fusait dans tous les sens sur des idées de jauges de vie, objectif du jeu. Personnellement ça m’inquietait un peu de ne rien voir converger, je me suis donc concentré sur la version iPhone et la maitrise de cocos2d. Je n’avais jamais fait de jeu de plateforme avant, je suis donc parti de zéro. J’ai commencé par coder le défilement des différents niveaux d’image d’arrière plan pour donner un effet de profondeur. Heureusement la gestion des animations de sprite est de base dans cocos2d. Un moteur physique est aussi disponible, ce qui permet de faire rapidement sauter mon sprite de façon assez fluide.&lt;/p&gt;

&lt;p&gt;L’objectif du jeu est super simple, le personnage cours et il doit éviter des obstacles. Je ne me voyais faire beaucoup plus en 48h.&lt;/p&gt;

&lt;p&gt;J’ai commencé à avoir des problèmes avec la gestion des collisions. Je voulais utiliser un Tiled Map pour que ce soit éditable plus facilement. Mais après plusieurs heures, j’ai abandonné la gestion des fichiers TMX pour partir sur quelque chose de bien plus simple. Le positionnement des obstacles est géré à la main et la gestion de collision se limite à vérifier si mon personnage est au dessus d’une certaine hauteur au passage de l’obstacle.&lt;/p&gt;

&lt;p&gt;A 1h30 du matin j’avais :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;La gestion de 2 niveaux d’image de fond&lt;/li&gt;
  &lt;li&gt;La gestion du saut du sprite&lt;/li&gt;
  &lt;li&gt;L’ajout de façon aléatoire d’obstacles dans le jeu&lt;/li&gt;
  &lt;li&gt;La gestion de collision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;et là il était temps de dormir, je n’ai plus 20 ans :)&lt;/p&gt;

&lt;h2 id=&quot;dimanche-29&quot;&gt;Dimanche 29&lt;/h2&gt;

&lt;p&gt;Reprise du code à 9h30 pas super frais. Pendant cette matinée les graphistes ont donné un coup de boost pour faire 4 nouveaux décors et finir les sprites des différents obstacles. J’ai donc passé ma matinée à intégrer leur boulot. Les sounds designer aussi ont pas mal bossé pour nous fournir du son pour chaque écran du jeu. Il fallait aussi faire l’enchainement des pages : Accueil, crédits, jeux, écran game over.&lt;/p&gt;

&lt;p&gt;Quand nous avons compris vers 12h que notre développeur principal avait décidé de faire la grasse matinée la version HTML du jeu était très fortement compromise. Nous risquions donc de n’avoir que la version iPhone à montrer ce qui ajoutait un poil de stress.&lt;/p&gt;

&lt;p&gt;On a terminé en intégrant le boulot des sounds designer pour avoir une application totalement terminée. Alors soit, le game play est plus que minimaliste, le thème est loin d’être très classe mais on a quand même le mérite de l’avoir terminé en 48h 😉&lt;/p&gt;

&lt;p&gt;A 15h on publiait une vidéo sur youtube pour montrer ce que ça donne :&lt;/p&gt;

&lt;p&gt;Ca a le mérite au moins de beaucoup faire rire mes enfants&lt;/p&gt;

&lt;p&gt;En plus de notre application iPhone, 3 jeux ont été présentés ce dimanche&lt;/p&gt;

&lt;h3 id=&quot;aux-quatre-coin-coin&quot;&gt;Aux quatre coin coin&lt;/h3&gt;

&lt;p&gt;Jeux de plateau très bien fait. Un gas a même pris le temps de sculter de superbes petites pièces de jeu. Admirez ce superbe plateau fait en aquarelle :&lt;/p&gt;

&lt;p&gt;####Jörmungand&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://globalgamejam.org/2012/aux-quatre-coin-coin&quot;&gt;&lt;img src=&quot;/images/uploads/2012/01/photo_board_preview-300x214.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Je n’avais pas bien compris le principe de ce jeu lorsqu’ils l’avaient présenté la première fois. Mais j’ai été bluffé par leur démo le dimanche après midi. Ils ont codé un jeu en 3D avec une partie reconnaissance de tag via une webcam.&lt;/p&gt;

&lt;p&gt;####STRAT&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://globalgamejam.org/2012/j%C3%B6rmungand&quot;&gt;&lt;img src=&quot;/images/uploads/2012/01/jurmungand-300x175.png&quot; alt=&quot;photo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Là par contre leur démo n’a pas été transcendante  :)Mais ils ont développé un jeux multi-joueur sur Android avec un écran principal sur un PC. C’était la seule équipe avec des développeurs travaillant sur la même techno et ça les a bien aidé.&lt;/p&gt;

&lt;p&gt;####Bilan&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://globalgamejam.org/2012/strat&quot;&gt;&lt;img src=&quot;/images/uploads/2012/01/Visu-300x240.png&quot; alt=&quot;photo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;J’ai beaucoup aimé ce week-end. C’est très stimulant d’avoir une forte contrainte de temps. En tant que développeur j’ai aussi bien apprécié d’être entouré de graphistes et de sound designer. C’est super enrichissant de voir comment ils travaillent vu que c’est un monde qui m’est complètement inconu.&lt;/p&gt;

&lt;p&gt;Si je pouvais vous donner un seul conseil pour bien réussir ce type de week-end c’est d’essayer d’avoir une équipe de développeurs homogène. Ca permet de mieux se partager le travail et de ne pas être dépendant d’une seule personne.&lt;/p&gt;

&lt;p&gt;L’objectif du startup week-end c’est de construire une startup en 56 heures. Etablir un business model cohérent c’est ça la priorité numéro 1 pour finir sur le podium. L’objectif du week-end Global Game JAM c’est de créer un jeu, de s’amuser. Il n’y a pas de gagnant, pas de podium. Là les développeurs ont vraiment leur place (contrairement au &lt;a href=&quot;/2011/11/startup-week-end-bretagne/&quot;&gt;startup weekend à mon avis&lt;/a&gt;). J’y ai fait de belles rencontres et je commence à réfléchir pour l’organiser sur Lannion en 2013.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Du nouveau ?</title>
   <link href="https://liard.me/2012/01/du-nouveau/"/>
   <updated>2012-01-08T23:16:39+01:00</updated>
   <id>https://liard.me/2012/01/du-nouveau</id>
   <content type="html">&lt;p&gt;Et oui 2 mois déjà sans publier sur ce blog. Après le startup week-end tout s’est un peu accéléré, j’en profite donc pour vous raconter ma fin d’année 2011.&lt;/p&gt;

&lt;h2 id=&quot;code-darmor&quot;&gt;Code d’Armor&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2012/01/logo-code-darmor-300x177.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Sur Lannion nous avons deux grosses entreprises Alcatel Lucent et Orange. Autour de ces 2 mastodontes gravitent pas mal de SSII et un beau vivier de startups. Il y a donc beaucoup de développeurs dans la zone. Mais pourtant nous ne nous connaissons pas, il n’y a ni cantine numérique ni aucun “User Group”. On ne se connait pas. Il y a peut-être un gars de l’autre côté de la route travaillant sur la même techno que vous et vous ne le savez pas.&lt;/p&gt;

&lt;p&gt;Au &lt;a title=&quot;Breizhcamp&quot; href=&quot;http://www.breizhcamp.org/&quot; target=&quot;_blank&quot;&gt;BreizhCamp&lt;/a&gt;, une phrase de &lt;a title=&quot;Sebastien Douche&quot; href=&quot;https://twitter.com/#!/sdouche&quot; target=&quot;_blank&quot;&gt;Sebastien Douche&lt;/a&gt; m’avait marqué : “S’il n’y a pas de communauté chez vous : créez en une !”. J’ai donc cherché des développeurs ayant la même envie que moi : créer une communauté de développeurs sur Lannion.&lt;/p&gt;

&lt;p&gt;Dès le début j’ai rencontré des personnes super intéressées. Les organisateurs du startup week-end, &lt;a title=&quot;Benjamin Anseaume&quot; href=&quot;https://twitter.com/#!/Anseaume&quot; target=&quot;_blank&quot;&gt;Benjamin&lt;/a&gt; qui a créé sa boite de developpement d’applications web, des étudiants et même des collègues d’Orange. Me sentant un peu moins seul, c’était le moment de lancer la communauté : &lt;a title=&quot;Code d armor&quot; href=&quot;http://www.codedarmor.fr&quot; target=&quot;_blank&quot;&gt;Code d’Armor&lt;/a&gt; était né. Nous avons rapidement programmé la première soirée qui a eu lieu le 6 décembre. Une très bonne soirée où j’ai présenté un retour d’expérience sur différentes plateformes PAAS. On a réuni 40 personnes et leurs retours étaient très positifs. On va enchainer sur une seconde soirée &lt;a title=&quot;Soirée du 7 janvier&quot; href=&quot;http://codedarmor0112.eventbrite.com/&quot; target=&quot;_blank&quot;&gt;mardi prochain le 10 janvier&lt;/a&gt; et une troisième le 7 février.&lt;/p&gt;

&lt;p&gt;L’objectif de Code d’Armor c’est de construire une communauté de développeurs sur la région de Lannion. Le slogan des soirées est simple : “Pour les développeurs, par des développeurs”. C’est une occasion d’échanger entre nous, de se rencontrer et de créer un réseau. C’est aussi un excellent moyen pour les développeurs de mettre en valeur leurs compétences techniques.&lt;/p&gt;

&lt;p&gt;On a un vrai problème en France, les boites ne savent que valoriser les postes de manager, il faut devenir chef. Pour réussir dans la vie il faut être manager, chef de projet. Votre maman ne sera jamais fière de vous lorsque vous lui expliquez que vous avez optimisé une requête SQL et que ça réduit de 30% le temps de réponse HTTP. Par contre allez lui dire que vous êtes chef de projet d’une application avec 10 développeurs et là elle va raconter à toutes ses copines : “mon fils est manager !” avec limite la larme à l’oeil. Je ne vous parle même pas de reconnaissance financière. 10 ans d’expérience dans le développement ça ne paye pas. Un jour il va falloir finir par comprendre que développeur et manager sont deux métiers bien différents et non pas une évolution obligatoire. En plus ça nous évitera d’avoir dans nos boites des tas de managers complètement incompétents qui se retrouvent là juste pour gagner plus d’argent.&lt;/p&gt;

&lt;p&gt;Mais n’oubliez jamais :&lt;/p&gt;

&lt;center&gt;
  &lt;strong&gt;Ce sont les personnes qui font qui changent le monde, pas ceux qui font faire.&lt;/strong&gt;
&lt;/center&gt;

&lt;h2 id=&quot;kidschool&quot;&gt;Kidschool&lt;/h2&gt;

&lt;p&gt;Grâce à ces nouveaux contacts, en décembre on m’a demandé de réaliser un jeu pour enfant sur iPad. J’ai vraiment adoré. L’idée venait d’une graphiste qui a fait tout le design de l’application, Benjamin l’a adapté pour l’iPad et j’ai codé le moteur du puzzle et cablé l’application.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://itunes.apple.com/us/app/kidschool-my-first-criss-cross/id484590469?l=fr&amp;amp;ls=1&amp;amp;mt=8&quot;&gt;&lt;img src=&quot;/images/uploads/2012/01/screenFR-3-300x225.png&quot; alt=&quot;photo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Téléchargez la vite !&lt;/p&gt;

&lt;p&gt;Il y a aussi &lt;a title=&quot;Kidschool&quot; href=&quot;http://itunes.apple.com/us/app/kidschool-my-first-criss-cross/id484600982?l=fr&amp;amp;ls=1&amp;amp;mt=8&quot; target=&quot;_blank&quot;&gt;une version Lite gratuite&lt;/a&gt;, mais c’est moins drôle forcément 😉&lt;/p&gt;

&lt;h2 id=&quot;la-suite-&quot;&gt;La suite ?&lt;/h2&gt;

&lt;p&gt;Beaucoup de nouveautés donc pour cette fin d’année 2011 et encore je ne peux pas encore vous dévoiler mes projets pour 2012 mais cette nouvelle année marquera pour moi sans doute un tournant très important. La suite au prochain post :)&lt;/p&gt;

&lt;p&gt;Je vous souhaite à tous une superbe année 2012 : sex, code &amp;amp; rock’n roll !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Startup Week-end Bretagne</title>
   <link href="https://liard.me/2011/11/startup-week-end-bretagne/"/>
   <updated>2011-11-01T02:37:26+01:00</updated>
   <id>https://liard.me/2011/11/startup-week-end-bretagne</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2011/10/swbzh.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le Week-end a commencé dès le vendredi à 18h30. On a débuté par deux petits jeux histoire de faire connaissance entre participants. Ensuite on est rentré dans le vif du sujet, les organisateurs nous ont expliqué comment allait se dérouler le week-end.&lt;/p&gt;

&lt;p&gt;Chaque porteur de projet a eu 1 minute pour présenter son projet. Il y avait 25 projets de présentés, avec par exemple :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Time is money : payer une personne pour faire la queue à votre place&lt;/li&gt;
  &lt;li&gt;GreenBanque : Banque 2.0&lt;/li&gt;
  &lt;li&gt;Stocker de l’énergie en montant un bloc de pierre&lt;/li&gt;
  &lt;li&gt;La culotte connectée&lt;/li&gt;
  &lt;li&gt;Beewatch : financement de ruches avec un projet pédagogique&lt;/li&gt;
  &lt;li&gt;Un site web d’annonce de mariage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Donc vraiment de tout. Après ces “pitchs”, les porteurs se sont retrouvés devant une affiche où ils ont écrit quelques mots sur leur projet. Chaque participant a reçu 3 post-it représentant 3 votes à coller sur l’affiche du projet qu’ils souhaitaient soutenir. C’était un moment clé du week-end, il a fallu que le porteur rabate les participants sur son affiche pour obtenir un maximum de votes. Et à ce jeu celui qui a crié le plus fort a souvent été gagnant.&lt;/p&gt;

&lt;p&gt;On est donc arrivé à la selection de 10 projets :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/uSharedme&quot;&gt;ushared.me&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/BREIZHimpacte&quot;&gt;Breizh Impacte&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/DisMoiBzH&quot;&gt;DisMoi&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/GreenBanque&quot;&gt;GreenBanque&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/play4date&quot;&gt;Play4Date&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/Octopousse&quot;&gt;Octopousse&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/Zero_Gachis&quot;&gt;Zero_Gachis&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/beewatchbzh&quot;&gt;Beewatch&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/MySportsFever&quot;&gt;Sportsfever&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/MonCampingCar&quot;&gt;Jelouemoncampingcar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Après est arrivée l’étape de constitution des équipes. Là encore c’était un grand moment de rabatage  :)De mon coté j’ai intégré le projet GreenBanque. Déjà car c’était le projet d’un ami de &lt;a href=&quot;http://twitter.com/#!/Anseaume&quot;&gt;Benjamin&lt;/a&gt; mais aussi pour le côté complètement mégalo de l’idée. Fanch et Damien étaient vraiment à fond, les entendre dire très sérieusement “il faut que l’on trouve 5 Millions d’euros” ou voir Damien appeler ses copains de la BNP m’a beaucoup fait rire. De notre coté avec Benjamin on s’est occupé de réaliser un site web et 2 jeux facebook &lt;a href=&quot;http://www.facebook.com/GreenBanque&quot;&gt;ici&lt;/a&gt; et &lt;a href=&quot;http://apps.facebook.com/banker-bashing/&quot;&gt;là&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pendant 2 jours l’ambiance a été très studieuse et entrecoupée de présentations. Beaucoup de travail et peu de sommeil. J’ai fait une vidéo et des photos pour montrer l’ambiance.&lt;/p&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;
  &lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;55 heures ça passe très vite. Il faut rendre le power point de la présentation avant 16h. Arrive alors les membres du jury. VIP de dernière minute : Jean-Loup Chretien. Pour la petite histoire il est venu avec son avion privé de Morlaix soit 37 km de distance. L’aéroport de Lannion a même été ouvert rien que pour lui. J’ai réussi à prendre une photo avec lui :)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2011/10/6299483821_aed663d06e.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Arrive donc le moment des présentations. Les porteurs de projet ont 4 minutes pour présenter leur projet au jury et 4 minutes pour répondre aux questions. Chaque mot compte pour bien faire passer votre idée. Après délibération voici le podium :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/Zero_Gachis&quot;&gt;Zero_Gachis&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/play4date&quot;&gt;Play4Date&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://twitter.com/#!/MonCampingCar&quot;&gt;louemoncampingcar&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Et un coup de coeur pour &lt;a href=&quot;http://twitter.com/#!/beewatchbzh&quot;&gt;Beewatch&lt;/a&gt;, qui, pour moi, méritait largement la troisième place. Notre projet n’a pas été primé ce qui est assez logique. Nous n’avons même pas mis en avant ce que nous avons réalisé pendant ce week-end. C’est aussi le point négatif que je note : pour moi les développeurs n’ont pas vraiment leur place dans un startup week-end. A la limite un développeur HTML/CSS pour faire un site, mais rien que le design du site collé dans un slide c’est suffisant pour le jury. Il faut d’ailleurs mieux l’image d’un site qui claque qu’un site moyen mais en ligne. Il est complétement inutile de développer quelque chose pour gagner. La clé de la réussite tient en 3 points :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Une bonne idée&lt;/li&gt;
  &lt;li&gt;Un bon graphiste&lt;/li&gt;
  &lt;li&gt;Venir avec un groupe de copains pour être sûr que son projet soit sélectionné.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C’est vraiment votre idée et comment vous la présentez au jury qui détermine votre réussite que vous ayez developpé quelque chose ou non. Certaines équipes arrivent même avec un service déjà codé. C’est le seul bémol du week-end, j’étais plus dans une optique de concours de développement en m’inscrivant. Je ne suis donc pas sûr de participer à d’autres Startup Week-end. Ou alors en porteur de projet. A voir pour le prochain à Rennes programmé en Mars 2012.&lt;/p&gt;

&lt;p&gt;La déception de cette défaite a été rapidement compensée par une très belle rencontre. Pendant le cocktail, j’ai pu discuter longuement avec Erwan Gallen. C’est le français qui a fait FaceBook avant Mark Zuckerberg en codant la première version de &lt;a href=&quot;http://copainsdavant.linternaute.com/&quot;&gt;copaindavant&lt;/a&gt;, rien que ça. Je suis vraiment admiratif de son parcours. En grand fan j’ai donc pris une photo avec lui 😉&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2011/10/6300020598_fb261b4e8e.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Une dernière chose. J’ai été surpris de ne voir aucun chasseur de tête ou recruteur SSII pendant ce week-end. Les gars vous venez de passer à côté des futurs jeunes diplômés les plus motivés de Bretagne. Alors en mars vous allez au prochain Startup Week-end ou vous continuez à chercher sur ouestjob ? A bon entendeur salut !&lt;/p&gt;

&lt;p&gt;Liens vers d’autres retours :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.camilleroux.com/2011/03/17/startup-weekend-10-conseils-pour-les-developpeurs-web/&quot;&gt;Startup Weekend: 10 conseils pour les développeurs web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Fuck XCode !</title>
   <link href="https://liard.me/2011/10/fuck-xcode/"/>
   <updated>2011-10-27T23:55:58+02:00</updated>
   <id>https://liard.me/2011/10/fuck-xcode</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2011/10/Logo_xcode1.jpg&quot; alt=&quot;photo&quot; /&gt;
Oui le titre est vulgaire, mais ça fait du bien de se défouler! Dans le précedent post j’expliquais pourquoi j’avais abandonner PhoneGap pour faire mon application. J’étais alors loin d’imaginer la galère que ça allait être en natif avec XCode.&lt;/p&gt;

&lt;p&gt;Notez que j’avais mis à jour mon XCode à la sortie de iOS 5 pour avoir la dernière version 4.2.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Donc je me lance : “Fichier -&amp;gt; nouveau projet” et je tombe sur un nouveau type d’application “Page-Based Application”. Comme c’est exactement ce que je souhaite faire, je décide de le tester. A la fin de ma journée c’est plié mon application est terminée. Ca fonctionne sur le simulateur et sur mon iPhone mais juste avant de rentrer chez moi je relance rapidement un test mais avec le simulateur iOS 4.3 cette fois. Surprise, ça ne compile pas  :(Et oui la classe UIPageViewController n’existe qu’à partir de iOS 5. Ok, je poubellise ma journée..&lt;/p&gt;

&lt;p&gt;Le lendemain je recommence un projet “Single View Application” et on me propose une option “Use storyBoard”. Ok pourquoi pas, ça a l’air plus simple de gérer ses XIB avec un storyBoard. Et donc après une demie journée de travail je termine de nouveau mon application. Et de nouveau ça ne fonctionne pas sur iOS 4.3. J’ai mis plus de temps avant de comprendre que ça venait des storyboards compatibles uniquement iOS 5. Quelqu’un peut m’expliquer pourquoi une nouvelle représentation graphique des vues ne pourrait pas générer du binaire compatible iOS 3 ??&lt;/p&gt;

&lt;p&gt;Donc merci Apple pour toutes ces nouveautés d’XCode 4.2, vraiment merci ! J’ai hâte de pouvoir les utiliser dans 3 ou 4 ans lorsque nos clients sauront tous au moins sur iOS 5. Car aujourd’hui nous avons encore beaucoup de clients avec des iPhones 3G qui ne passeront donc jamais sur iOS 5. Et je ne parle même pas de ceux qui ne mettent jamais leur iPhone à jour.&lt;/p&gt;

&lt;p&gt;Sortir aujourd’hui une application uniquement compatible iOS 5 c’est juste stupide !&lt;/p&gt;

&lt;p&gt;Bref ! J’ai donc recodé mes vues avec de beaux XIB et enfin mon application fonctionnait sous iOS 3 et 4. Miracle !! Je la passe donc à notre équipe de validation. 10 minutes plus tard j’ai un email “impossible de l’installer sur mon iPhone 3G sous iOS4.1”. Mince je l’ai pourtant testée sur un 3GS avec le même OS. Donc je me balade de bureau en bureau pour enfin trouver un iPhone 3G : en effet, impossible de l’installer. Après des recherches sur le net je trouve (&lt;a href=&quot;http://stackoverflow.com/questions/4198676/warning-iphone-apps-should-include-an-armv6-architecture-even-with-build-config&quot;&gt;sur ce site&lt;/a&gt;) les options de compilations à ajouter. Car à partir de l’iPhone 3GS l’architecture est basée sur du armv7 alors que l’iPhone 3G est armv6.&lt;/p&gt;

&lt;p&gt;Là c’est clair Apple a définitivement oublié l’iPhone 3G. Par défaut votre application ne fonctionnera pas sur ce terminal.&lt;/p&gt;

&lt;p&gt;Avec ces options j’arrive enfin à installer l’application sur un iPhone 3G ! Mais resurprise : elle se lance mais ne fonctionne pas correctement. Mes 3 vues qui étaient côte à côte dans une UIScrollView se superposent. A ne rien y comprendre. Après une longue soirée à débugguer j’ai trouvé une solution en modifiant mon code :&lt;/p&gt;

&lt;pre&gt;if ([device isEqualToString:IPHONE_3G]) {
    frame.origin.x = 0;
    frame.origin.y = frame.size.width * i;
} else {
    frame.origin.x = frame.size.width * i;
    frame.origin.y = 0;
}&lt;/pre&gt;

&lt;p&gt;Ne me demandez pas pourquoi, mais sur le 3G l’axe des X et l’axe des Y de ma ScrollView sont inversés. Je ne cherche même plus à comprendre à ce niveau…&lt;/p&gt;

&lt;p&gt;Je retourne donc une nouvelle version pour validation et j’ai comme retour :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;3G ios 4.2.1&lt;span style=&quot;color: #00ff00;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; -&amp;gt; &lt;/span&gt;OK&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;3G ios 4.0.2 -&amp;gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;KO&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3G ios 3.1.3 -&amp;gt;&lt;/span&gt; KO&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;span style=&quot;color: #00ff00;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3GS ios 3.1.3 -&amp;gt;&lt;/span&gt; OK&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je tente donc un dernier changement au niveau de ma compilation. XCode 4.2 utilise par défaut le compilateur ” Apple LLVM compiler 3.0″. Je passe donc en “LLVM GCC 4.2”&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;3G ios 4.2.1 = &lt;span style=&quot;color: #00ff00;&quot;&gt;installation OK,&lt;/span&gt; et &lt;span style=&quot;color: #00ff00;&quot;&gt;icône OK&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;3G ios 4.0.2 = &lt;span style=&quot;color: #00ff00;&quot;&gt;installation OK&lt;/span&gt;, mais &lt;span style=&quot;color: #ff0000;&quot;&gt;icône KO&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;3G ios 3.1.3 = &lt;span style=&quot;color: #ff0000;&quot;&gt;installation KO&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C’est un peu mieux et cette fois j’abandonne, je vais en rester là.&lt;/p&gt;

&lt;p&gt;Moralité de l’histoire : réfléchissez avant de passer sur XCode 4.2. C’est beaucoup de problèmes et les nouveautés sont juste inutilisables pour le moment.&lt;/p&gt;

&lt;p&gt;Et oui il y a des semaines comme ça où : &lt;strong&gt;FUCK XCODE&lt;/strong&gt; !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Premier essai de PhoneGap</title>
   <link href="https://liard.me/2011/10/premier-essai-phonegap/"/>
   <updated>2011-10-21T00:36:04+02:00</updated>
   <id>https://liard.me/2011/10/premier-essai-phonegap</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2011/10/PhoneGap.gif&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Dernièrement j’avais à développer une application mobile sans grosse difficulté technique. J’ai donc eu envie d’essayer de la réaliser avec PhoneGap.&lt;/p&gt;

&lt;p&gt;Je ne vais pas faire d’article pour expliquer comment fonctionne PhoneGap car beaucoup l’on déjà fait mieux que je ne peux le faire (comme &lt;a href=&quot;http://blog.octo.com/applications-mobiles-multi-plateformes-les-approches-phonegap-et-titanium-mobile/&quot;&gt;octo par exemple&lt;/a&gt;) mais juste faire un petit retour d’expérience.&lt;/p&gt;

&lt;p&gt;La base de PhoneGap c’est de pouvoir faire des applications mobiles mutliplate-forme en développement en HTML/CSS/Javascript.&lt;/p&gt;

&lt;p&gt;Je ne suis vraiment pas un spécialiste du HTML et encore moins du Javascript. Mais je pense qu’il est grand temps de s’y mettre et ce petit projet est une bonne occasion.&lt;/p&gt;

&lt;p&gt;Je débute donc et rapidement je tombe sur un premier problème : le titre dans la nav bar en haut de page est tronqué. J’ai rapidement trouvé où changer le CSS pour corriger cela. Ouf :)&lt;/p&gt;

&lt;p&gt;Je développe avec Dreamweaver et c’est assez agréable. En effet il supporte JQuery et PhoneGap. Ca me permet d’avoir un aperçu direct du rendu de mon code et en 2 cliques ça me génère un projet XCode et lance directement le simulateur iPhone pour tester l’application.&lt;/p&gt;

&lt;p&gt;Par contre on arrive vite aux limites de Dreamweaver au moment où on utilise du javascript PhoneGap. Par exemple, j’avais besoin de gérer le changement d’état de l’application (passage en background, retour au premier plan..). Pour ça il faut utiliser la méthode :&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;document.addEventListener(&quot;resume&quot;, onResume, false);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Mais impossible de le tester dans un navigateur ou dans Dreamweaver. Ca ne fonctionne bien sûr que sur l’iPhone.&lt;/p&gt;

&lt;p&gt;Et là, re-problème, ma méthode onResume ne se lance jamais  :(Je suis donc parti sur une longue demi-journée de debug à base de alert(“je passe là”) pour finir par comprendre que Dreamweaver utilise une ancienne version de PhoneGap ne gérant pas l’évènement “resume”. Impossible de trouver le numéro de version PhoneGap utilisé ! Et pas d’explication non plus sur comment utiliser une autre version. J’ai même bêtement intégré le fichier phonegap-1.1.0.js dans mon projet : marche pas car c’est la lib PhoneGap du projet XCode généré qu’il faut changer.&lt;/p&gt;

&lt;p&gt;J’ai donc fini par abandonner la génération PhoneGap intégré par DreamWeaver. J’utilise PhoneGap normalement dans XCode et Dream ne me sert que d’éditeur de texte car la complétion et l’aperçu c’est quand même bien pratique.&lt;/p&gt;

&lt;p&gt;J’avais l’impression d’avoir réalisé le plus dur. Il me restait à ouvrir une simple petite fenêtre popup. Et là, catastrophe, le rendu sur un navigateur est différent de celui sur l’iPhone. Plus grave la transition au moment de la fermeture de la popup fonctionne si elle est ouverte depuis la première page mais pas depuis les autres. Je pense que c’est un problème JQuery et pas PhoneGap puisque je constate le même problème sur un navigateur.&lt;/p&gt;

&lt;p&gt;Comment faire pour débugger ??&lt;/p&gt;

&lt;p&gt;C’était trop pour moi, j’ai préféré abandonner et repasser sur de l’Objective-C. En une journée j’ai refait ce que j’avais mis 3 jours à faire en Javascript (normal, je maitrise mieux) et hop ça marche !&lt;/p&gt;

&lt;p&gt;Donc non PhoneGap ne m’a pas convaincu. En fait pour être plus juste, c’est plus le Javascript qui m’a bloqué. Déjà je n’ai pas assez d’expérience avec ce langage, mais c’est surtout une vraie galère à débugger !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Formation XHTM ou la fausse bonne idée</title>
   <link href="https://liard.me/2011/09/formation-xhtml-fbi/"/>
   <updated>2011-09-28T22:36:05+02:00</updated>
   <id>https://liard.me/2011/09/formation-xhtml-fbi</id>
   <content type="html">&lt;p&gt;Après avoir pas mal développé sur iPhone j’ai eu envie de me mettre à niveau sur HTML et CSS. En Juin j’ai donc suivi 3 jours de formation sur ces technos. C’était vraiment pro avec un formateur très bon. Avec ces bonnes bases j’ai eu envie d’aller encore plus loin et regarder comment réaliser des sites Web pour mobiles. Fort de cette bonne expérience de formation j’en ai cherché une autre. J’ai trouvé :&lt;/p&gt;

&lt;p&gt;Réaliser des sites WEB multi plateformes (Iphone, Android, BlackBerry, …)&lt;/p&gt;

&lt;p&gt;Une formation de 5 jours, ça me parait un peu long mais pour entrer dans les détails c’est peut-être normal. C’est Eric Sarrion qui fait cette formation en utilisant son livre “XHTML/CSS &amp;amp; JavaScript pour le web mobile” comme plan de cours.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2011/09/web-mobile.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le début d’une formation ce n’est jamais simple. Ca va soit trop vite ou pas assez. Je le sais bien donc j’ai accepté de prendre du temps pour faire une liste avec ul et utiliser des div. Mais je suis un peu étonné par certaines réflexions du formateur, du style :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Une div n’aura pas de mitoyenneté sur les côtés droit ou gauche (citation du livre !)&lt;/li&gt;
  &lt;li&gt;A la question “comment catcher une exception en Java Script ?” il répond “non mais faut pas en faire des exceptions !”… ok pas bête :/&lt;/li&gt;
  &lt;li&gt;Ecrivez juste &amp;lt;p id=toto, les guillemets autour du nom ne servent à rien&lt;/li&gt;
  &lt;li&gt;Non mais ce tag HTML il ne sert à rien.. Moi je l’ai jamais utilisé&lt;/li&gt;
  &lt;li&gt;Non mais la complétion pour écrire du javascript et du HTML ça sert à rien&lt;/li&gt;
  &lt;li&gt;Non mais les DOCTYPE ça sert à rien&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je reste donc un peu scotché par ses réponses. Déjà Eric ton livre s’appelle  XHTML/CSS. J’ai bien dit &lt;strong&gt;XHTML&lt;/strong&gt;, regarde la &lt;a href=&quot;http://fr.wikipedia.org/wiki/Extensible_HyperText_Markup_Language&quot;&gt;définition sur wikipedia&lt;/a&gt; :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;XHTML, est un langage de balisage servant à écrire des pages pour le World Wide Web. Conçu à l’origine comme le successeur d’HTML, XHTML se fonde sur la syntaxe définie par XML, &lt;strong&gt;plus récente, mais plus exigeante&lt;/strong&gt; que celle définie par SGML sur laquelle repose HTML&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Donc merci de remettre les doubles cotes sur tes params et d’ajouter des Doctype dans tes fichiers. J’ai d’ailleurs du mal à comprendre comment un éditeur comme Eyrolles peut laisser passer ce genre de bêtises.&lt;/p&gt;

&lt;p&gt;Autre chose qui me gène, j’apprends que l’on va passer 1 journée à générer des applications natives (iOS et Android) avec PhoneGap. Pourquoi pas, sauf que ce n’était pas noté sur la description de la formation et que ça ne m’intéresse pas, enfin disons que je ne suis pas venu pour ça.&lt;/p&gt;

&lt;p&gt;Je suis donc un peu (beaucoup) mitigé après cette journée… Je décide d’attendre la seconde on ne sait jamais.&lt;/p&gt;

&lt;p&gt;Malheureusement la seconde journée n’est pas beaucoup plus instructive. Le moment le plus intéressant a été le repas du midi ou j’ai rencontré un collègue pour discuter boulot. A propos des repas Eric, lorsque tu emmènes tes élèves au restaurant le midi, c”est mieux de discuter avec eux que de regarder le 13h de Pernaut à la télé…&lt;/p&gt;

&lt;p&gt;J’ai donc rapidement compris que je n’allais pas avoir les réponses à mes questions pendant cette formation :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Comment gérer le changement d’orientation de l’appareil&lt;/li&gt;
  &lt;li&gt;Comment choisir le CSS en fonction du mobile&lt;/li&gt;
  &lt;li&gt;Comment gérer la taille de l’écran du terminal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La fin de la seconde journée a été décisive, la goutte d’eau comme on dit. Au moment où un autre élève soulignait qu’il avait d’autres attentes (un peu comme moi), on a eu droit à un monologue d’Eric absolument hallucinant. Une séance d’auto congratulation pitoyable, je cite : “tout le monde adore cette formation !”, “A la fin on s’embrasse tous”, “je suis invité partout pour en parler”. On rêve.&lt;/p&gt;

&lt;p&gt;Bref, j’ai donc pris mes affaires pour rentrer à la maison plus rapidement.&lt;/p&gt;

&lt;p&gt;Alors attention, je n’ai pas la prétention de dire que cette formation est nulle. C’est loin d’être le cas. Mais elle n’est pas adaptée aux personnes avec un peu d’expérience, c’est plus pour les débutants. De mon côté j’ai aussi fait des erreurs en choisissant cette formation. Une ligne aurait du me mettre la puce à l’oreille : “Profils : Développeurs et chefs de projet”, j’aurais du savoir que ça n’allait pas être assez technique :)&lt;/p&gt;

&lt;p&gt;Mon seul regret est de ne pas être là à la fin car &lt;a href=&quot;http://twitter.com/#!/KarenChevallier&quot;&gt;Karen&lt;/a&gt; nous aurait sûrement préparé un gâteau bio !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Active MQ dans le cloud - suite</title>
   <link href="https://liard.me/2011/07/active-mq-dans-le-cloud-suit/"/>
   <updated>2011-07-27T19:33:09+02:00</updated>
   <id>https://liard.me/2011/07/active-mq-dans-le-cloud-suit</id>
   <content type="html">&lt;p&gt;Comme vous avez pu le lire &lt;a href=&quot;http://www.net-liard.com/blog/2011/07/active-mq-dans-le-cloud/&quot;&gt;dans le précédent article&lt;/a&gt; je n’étais pas arrivé au bout de l’exercice pour déployer ActiveMQ sur des offres PAAS. Et bien c’est chose faite, ça marche ! :)&lt;/p&gt;

&lt;p&gt;Mon erreur a été de me focaliser sur un problème réseau entre les VM (configuration, firewall…) En fait le problème était au niveau de l’ouverture des sockets. J’ai donc modifié le code du TCPConnector d’Active MQ pour l’adapter à mes contraintes.&lt;/p&gt;

&lt;p&gt;Il faut juste changer le bind dans org.apache.activemq.transport.tcp.TcpTransportServer&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;java:nogutter:nocontrols&quot;&gt;public void bind() throws IOException {
  URI bind = getBindLocation();

  String host = bind.getHost();
  host = (host == null || host.length() == 0) ? &quot;localhost&quot; : host;
  InetAddress addr = InetAddress.getByName(host);&lt;/pre&gt;

&lt;p&gt;en&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;java:nogutter:nocontrols&quot;&gt;public void bind() throws IOException {
  URI bind = getBindLocation();

  InetAddress addr = InetAddress.getLocalHost();&lt;/pre&gt;

&lt;p&gt;C’est plus restrictif, mais suffisant pour mon cas.&lt;/p&gt;

&lt;p&gt;J’ai repackagé cela dans un protocole tcpcloud et hop ça fonctionne sur cloudbees du premier coup. Maintenant ma charge est partagée sur les n instances (n=2 pour le moment comme j’utilise l’offre gratuite).&lt;/p&gt;

&lt;p&gt;Pour CloudFoundry j’ai eu un peu plus de mal car même si je note dans le fichier de config “localhost”, il passe le nom de la machine au runtime. Ca doit être le même système qui remplace l’url et le login/pass de la base de données. Ce côté un peu magique me dérange. Je dois aussi dépendre de leur lib cloudfoundry-runtime pour trouver l’adresse IP de la VM. En plus leur beau plug-in eclipse ne fonctionne pas sur Eclipse Indigo :(&lt;/p&gt;

&lt;p&gt;Je vais pouvoir partir en vacances sereinement ! 😉&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Active MQ dans le cloud</title>
   <link href="https://liard.me/2011/07/active-mq-dans-le-cloud/"/>
   <updated>2011-07-22T01:33:18+02:00</updated>
   <id>https://liard.me/2011/07/active-mq-dans-le-cloud</id>
   <content type="html">&lt;p&gt;En ce moment je regarde pour développer une plateforme de push notification iPhone. Le but est d’offrir une surcouche applicative plus simple à utiliser que les sockets d’Apple. Un peu comme le service offert par &lt;a href=&quot;http://urbanairship.com/&quot;&gt;urbanairship&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ce qu’il faut bien comprendre avec le push d’Apple, c’est que pour envoyer une notification à 400 000 iPhone il faut ouvrir une socket chez eux et envoyer 400 000 trames avec un token différent par iPhone. En sachant qu’Apple peut banir une IP serveur si on envoie plus de 200 messages par seconde, il est important de répartir la charge sur plusieurs serveurs (ou au moins plusieurs IP publiques).&lt;/p&gt;

&lt;p&gt;Donc j’ai pensé à mettre en place une architecture &lt;a href=&quot;http://fr.wikipedia.org/wiki/Message-Oriented_Middleware&quot;&gt;MOM&lt;/a&gt; :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2011/07/activemq11.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Avec cette architecture on peut ajouter des Brokers JMS en fonction de la charge à absorber. L’idée est de profiter au maximum des services de cloud computing et offrant la possibilité d’ajouter/retirer au runtime des VM avec un Broker. C’est donc pour héberger cette solution que j’ai creusé les différentes offres de cloud computing (cf ce post). Mais c’est au moment du déploiement que j’ai rencontré des difficultés (bah oui comme d’habitude en fait…).&lt;/p&gt;

&lt;p&gt;Le code qui va envoyer les messages JMS doit connaitre la liste de Broker. Or comme nous sommes dans le cloud, cette liste peut être modifiée au bon vouloir de l’administrateur. Pire je ne connais même pas forcément à l’avance les IP des Broker que je vais ajouter.&lt;/p&gt;

&lt;p&gt;Donc imaginez si dans la configuration client je définis une URI du type :&lt;/p&gt;

&lt;pre&gt;failover:(tcp://primary:61616,tcp://secondary:61616)&lt;/pre&gt;

&lt;p&gt;Il va falloir modifier le code du client à chaque ajout d’un nouveau Broker. C’est donc impossible. Heureusement pour ce genre de cas Active MQ propose un système de multicast. Ce qui donne au niveau URI du client :&lt;/p&gt;

&lt;pre&gt;discovery:(multicast://default)&lt;/pre&gt;

&lt;p&gt;Là c’est magique sur mon serveur en local ça marche très bien. Et oui mais non  :(Sur les offres cloud le multicast (sur UDP) n’est pas souvent supporté. Sur Amazon EC2 (donc sur CloudBees) et CloudFoundry (VMWare) impossible de faire fonctionner le multicast.&lt;/p&gt;

&lt;p&gt;Donc comment faire ? Le client JMS a besoin de récupérer une liste de Broker. Il faut donc que chaque Broker vienne se faire connaitre au moment de leur lancement. Comme j’ai déjà un BDD autant l’utiliser pour référencer ces Brokers. J’ai donc développer un module de multicast via une BDD : &lt;a href=&quot;https://github.com/sliard/multicastdb&quot;&gt;multicasdb&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Donc on arrive sur une architecture comme celle-ci :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2011/07/activemq2.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Pour le faire je me suis beaucoup inspiré du code du multicast UDP. Ca fonctionne bien sur mes serveurs de test mais là encore je tombe sur des problèmes spécifiques aux serveurs cloud : l’adresse du serveur. Comme c’est le même war qui est déployé sur tous les serveurs la configuration du broker doit être générique. Pas de pb : j’utilise localhost comme nom de serveur :&lt;/p&gt;

&lt;!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3834ff} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4d9192} span.s1 {color: #000000} span.s2 {color: #009193} span.s3 {color: #4d9192} span.s4 {color: #932192} span.Apple-tab-span {white-space:pre} --&gt;

&lt;pre name=&quot;code&quot; class=&quot;xml:nogutter:nocontrols&quot;&gt;&amp;lt;broker persistent=&quot;false&quot;&amp;gt;
  &amp;lt;networkConnectors&amp;gt;
    &amp;lt;networkConnector uri=&quot;multicastdb://default?dataSource=myDataSource&quot;&amp;gt;
&amp;lt;/networkConnector&amp;gt;
  &amp;lt;transportConnectors&amp;gt;
     &amp;lt;transportConnector uri=&quot;http://localhost:8080&quot;   
discoveryUri=&quot;multicastdb://default?dataSource=myDataSource&quot;&amp;gt;
    &amp;lt;/transportConnector&amp;gt;
  &amp;lt;/transportConnectors&amp;gt;
&amp;lt;/broker&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Donc oui je peux utiliser cette configuration sur tous les serveurs, mais si je persiste “localhost:8080” en base le client ne pourra pas y accéder depuis un autre serveur. Donc il faut que mon code trouve l’IP du serveur pour le persister au runtime.&lt;/p&gt;

&lt;p&gt;Aujourd’hui même si le code n’est pas finalisé, il fonctionne. Malheureusement j’ai toujours des problèmes pour l’héberger.&lt;/p&gt;

&lt;p&gt;Chez &lt;strong&gt;Cloudbees&lt;/strong&gt; la communication tcp entre VM est bloquée. Même si leur support affirme que ça peut fonctionner j’ai toujours des erreurs : java.net.ConnectException: Connection refused&lt;/p&gt;

&lt;p&gt;Chez &lt;strong&gt;CloudFoundry&lt;/strong&gt; j’ai même eu du mal à obtenir l’IP des VM. Le code qui fonctionne sur Cloudbees retourne 127.0.0.1 comme IP chez CloudFoundry. Pour trouver cette IP il faut utiliser un SDK fourni. Mais là encore :Connection refused :(&lt;/p&gt;

&lt;h2 id=&quot;bilan&quot;&gt;Bilan&lt;/h2&gt;

&lt;p&gt;Au final je n’ai pas réussi à faire fonctionner mon code comme je le voulais. Par contre cette petite expérience m’a permis de faire mes premiers pas sur 2 offres de cloud intéressantes. Aujourd’hui je trouve CloudFoundry beaucoup plus agréable à utiliser que CloudBees. Son SDK est très simple et en 20 secondes je peux redéployer une version. Avec CloudBees j’ai beaucoup de mal avec le SDK. Déjà c’est basé sur un script Ant… Alors il y a aussi un plug-in maven mais je n’ai pas pu l’utiliser en mode “Delta” du coup il faut uploader totalement mon War à chaque modification : 10 minutes. Je trouve aussi le plug-in Eclipse de CloudFoundry mieux fait. Par contre CloudBees possède une vrai interface d’administration web et son offre DEV@Cloud est vraiment intéressante. Un bon point pour les 2 : la réactivité du support. Une réponse dans la journée, pour mon compte gratuit de test, c’est vraiment bien (n’est ce pas &lt;a href=&quot;http://twitter.com/#!/ndeloof&quot;&gt;Nicolas&lt;/a&gt; 😉 )&lt;/p&gt;

&lt;p&gt;Pour revenir à mon problème initial, je vais continuer à creuser ce problème de communication inter VM et si je n’avance pas je vais revoir l’architecture. Peut-être persister les messages à envoyer: c’est moins performant mais ça peut aussi répondre à un besoin de suivi de diffusion.&lt;/p&gt;

&lt;p&gt;La phase d’intégration d’un projet est toujours sous estimée J’ai vu des projets où cette phase était même plus importante en terme d’homme/jour que la phase de développement. Mais pour un hébergement dans le cloud il faut vraiment prendre cette problématique dès le début de la conception. C’est loin d’être un détail :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dans Ton Cloud</title>
   <link href="https://liard.me/2011/07/dans-ton-cloud/"/>
   <updated>2011-07-11T01:09:03+02:00</updated>
   <id>https://liard.me/2011/07/dans-ton-cloud</id>
   <content type="html">&lt;p&gt;Depuis 2 semaines je regarde différentes solutions de cloud computing.&lt;/p&gt;

&lt;p&gt;Dans un premier temps j’ai regardé les offres “bas niveau” :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://www.ovh.com/fr/cloud/&quot;&gt;MiniCloud d’OVH&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;C’est une offre abordable mais qui est en test depuis plus d’un an. C’est une facturation “Pay as you go” mais il manque deux fonctionnalités importantes : le load balancing et le clonage d’instance. L’adresse IP des instances change à chaque arrêt/relance ce qui peut être génant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://aws.amazon.com/fr/ec2/&quot;&gt;Amazon EC2&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L’offre cloud la plus célèbre, j’ai arrêté l’inscription au moment d’entrer un numéro de carte bleue. Impossible de faire sans et comme le détail des tarifs est assez flou j’ai préféré ne pas le faire.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So Privé&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le site So privé est fermé pour ouvrir &lt;a href=&quot;http://www.outscale.com/&quot;&gt;OUTSCALE&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://www.rackspace.com/cloud/&quot;&gt;Rackspacecloud&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L’offre la plus intéressante pour le moment, load-Balancing clonage de VM, “Pay as you go”. Il manque juste des images un peu plus complètes avec par exemple un tomcat ou mysql.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://express.ikoula.com/vm&quot;&gt;ikoula&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Grosse pub pour leur VM à 1 Euro mais c’est uniquement des VM Windows -&amp;gt; Fail&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Obtenir une VM avec un OS c’est bien, malheureusement je ne suis pas ingé système mais développeur Java donc si je pouvais utiliser des offres clouds faites pour déployer un war je gagnerais du temps. Et c’est exactement ce que propose Cloud Foundry et CloudBees. Oui Google App Engine le fait aussi mais dans mon cas j’ai besoin d’ouvrir une socket vers un serveur distant et donc GAE est out :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://www.cloudfoundry.com/&quot;&gt;Cloud Foundry&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;C’est l’offre de VM Ware et Spring Source en version Beta pour le moment. En quelques minutes j’ai mis en ligne l’exemple Hello Word. Le plus long c’est de recevoir l’email d’inscription. Le SDK s’installe en 2 minutes grace à ruby (gem est pré-installé sur Mac).&lt;/p&gt;

&lt;p&gt;Après le Hello Word j’ai déployé un war plus complexe très rapidement. Le plug-in eclipse est aussi très bien fait, on peut voir les ressources consommées par les applications, ajouter des instances (2 max pour le moment), les arrêter. Par contre j’ai eu un problème au niveau de l’affichage des logs. Sur Eclipse ce n’était pas à jour contrairement à ce qu’affichait la commande “vmc logs”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Là encore CloudBees propose une solution pour déployer du code Java simplement. Le plus par rapport à Cloud Foundry c’est l’offre DEV@cloud qui propose une solution de GConf (GIT ou SVN) et une plate-forme d’intégration continue Jenkins. Ils sont placés pour Jenkins puisque &lt;a href=&quot;http://twitter.com/#!/kohsukekawa&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; a intégré leur équipe.&lt;/p&gt;

&lt;p&gt;RUN@cloud est proche de l’offre de Cloud Foundry en se limitant au Java. Le plus c’est le monitoring des instances et la possibilité d’uploader un war depuis l’interface web. Par contre j’ai trouvé le SDK et le plug-in eclipse beaucoup moins faciles à utiliser comparés à ceux de Cloud Foundry.&lt;/p&gt;

&lt;p&gt;Le gros problème de ces deux solutions, pour héberger mon application, c’est qu’elles ne supportent pas le multicast UDP. Je vais faire un autre poste plus tard pour détailler mon problème.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;J’ai bien aimé tester ces offres rapidement et gratuitement. On peut enfin déployer du code java facilement. Avant il fallait louer un serveur privé pour pouvoir installer un serveur tomcat et ce n’était pas une solution économique (minimum 15 Euros par mois). Maintenant en quelques minutes notre war est disponible sur le net.&lt;/p&gt;

&lt;p&gt;Après peut-on utiliser CloudBees ou Cloud Foundry pour déployer une application pro?  C’est à voir puisque je n’ai pas regardé comment affiner la configuration du serveur d’application. En tout cas c’est très prometteur.&lt;/p&gt;

&lt;p&gt;Autres articles :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.courtine.org/2011/07/10/premiers-pas-sur-cloudbees/&quot;&gt;Premiers pas sur CloudBees&lt;/a&gt; par Benoit Courtine&lt;/li&gt;
  &lt;li&gt;Blog de Xebia : &lt;a href=&quot;http://blog.xebia.fr/2011/04/13/lancement-du-projet-platform-as-a-service-cloud-foundry-de-spring-source/&quot;&gt;Lancement du projet PAAS cloud foundry de spring source&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Blog d’octo : &lt;a href=&quot;http://blog.octo.com/et-si-nous-definissions-simplement-le-cloud-computing/&quot;&gt;Et si nous definissions simplement le cloud computing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Obeo Designer Roadshow</title>
   <link href="https://liard.me/2011/06/obeo-designer-roadshow/"/>
   <updated>2011-06-29T17:32:46+02:00</updated>
   <id>https://liard.me/2011/06/obeo-designer-roadshow</id>
   <content type="html">&lt;!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px} --&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2011/06/bus_203x104.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Hier se déroulait à Brest le ObeoDesigner roadshow.&lt;/p&gt;

&lt;p&gt;Avant de présenter l’outil, il faut commencer par la base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le DSL : Domaine Specific Language&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le principe est de définir son propre langage pour modéliser son environnement. Là où en UML on a (pratiquement) que des classes, dans un DSL on peut utiliser notre langage métier et parler de “Portable”, d’”Avion” etc.. Mais qui dit nouveau langage dit nouvelle représentation graphique. Avec un DSL il faut aussi réinventer vos propres représentations graphiques. Lorsqu’on utilise UML on a l’avantage d’avoir pléthore d’éditeurs graphiques sur le marché.&lt;/p&gt;

&lt;p&gt;Mais plus grave à mon avis : on ne partage plus la même représentation graphique. Lorsque je lis un diagramme de séquence UML je sais si un appel est synchrone ou asynchrone en fonction de sa représentation. Avec les DSL il faut non seulement redévelopper ses diagrammes, mais il faut en plus les expliquer à chaque fois.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obeo Designer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Obeo Designer propose une solution pour le premier problème : réaliser des diagrammes personnalisés s’appuyant sur votre DSL.&lt;/p&gt;

&lt;p&gt;Il est basé sur 5 types de représentation :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Tree&lt;/li&gt;
  &lt;li&gt;Edition Table&lt;/li&gt;
  &lt;li&gt;Cross Table&lt;/li&gt;
  &lt;li&gt;Diagram&lt;/li&gt;
  &lt;li&gt;Sequence Diagram&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour l’avoir pratiqué une après midi, on arrive assez rapidement à construire un diagramme. L’outil est très pratique; dès que l’on fait une modification on peut voir le résultat en live sur le diagramme.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2011/06/obeodesigner11-300x151.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le gros point faible de l’outil est, à mon avis, le manque d’aide (complétion, coloration..) pour écrire les scripts Acceleo. En plus ce sont des scripts Acceleo 2 (alors que le générateur de code est en Acceleo 3).&lt;/p&gt;

&lt;p&gt;www.obeonetwork&lt;strong&gt;.com&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cette journée a été aussi l’occasion d’annoncer l’ouverture du site www.obeonetwork.com. Cet espace collaboratif va nous permettre de partager nos réalisations Acceleo / Obeo Designer. Même si je pense qu’il vaut mieux réaliser un générateur différent par projet qu’essayer de faire LE générateur générique, rien n’empêche de partir d’un existant pour le spécifier à son besoin (le transformateur hibernate par exemple).&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Pour conclure j’ai passé une bonne journée et c’est toujours un plaisir de rencontrer &lt;a href=&quot;http://twitter.com/#!/fmadiot&quot;&gt;Frederic Madio&lt;/a&gt; et &lt;a href=&quot;http://twitter.com/#!/ejuliot&quot;&gt;Etienne Julio&lt;/a&gt; (la star sur &lt;a href=&quot;http://lescastcodeurs.com/2011/06/les-cast-codeurs-podcast-episode-41-interview-detienne-juliot-sur-eclipse/&quot;&gt;les cast codeurs&lt;/a&gt; 😉 ). Je reste quand même assez attaché à UML. Même si UML est beaucoup trop vaste et très compliqué il a le mérite d’apporter un langage normalisé et beaucoup d’outils s’appuient dessus.&lt;/p&gt;

&lt;p&gt;C’est donc sûrement pour me faire plaisir qu’Obeo a annoncé Mardi qu’ils allaient donner gratuitement un modeleur UML construit avec Obeo Designer. Ce module UML est publié sur le &lt;a href=&quot;http://marketplace.obeonetwork.com/module/uml&quot;&gt;MarketPlace obeonetwork&lt;/a&gt; et le code source est sur &lt;a href=&quot;https://github.com/ObeoNetwork/UML-Modeling&quot;&gt;GitHub&lt;/a&gt;. C’est donc un exemple très complet sur lequel on peut s’appuyer.&lt;/p&gt;

&lt;p&gt;Cerise sur le gâteau, on a eu un bon de réduction de 20% que j’ai bien sur immédiatement mis en vente &lt;a href=&quot;http://cgi.ebay.fr/ws/eBayISAPI.dll?ViewItem&amp;amp;item=320720998796#ht_500wt_990&quot;&gt;sur ebay&lt;/a&gt; :)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2011/06/ebay-300x142.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Le blues du développeur</title>
   <link href="https://liard.me/2011/06/le-blues-du-developpeur/"/>
   <updated>2011-06-18T22:43:30+02:00</updated>
   <id>https://liard.me/2011/06/le-blues-du-developpeur</id>
   <content type="html">&lt;p&gt;En revenant d’une conférence sur GIT dans le cadre du &lt;a href=&quot;http://www.breizhcamp.org/&quot;&gt;BreizhCamp&lt;/a&gt; (faite par &lt;a href=&quot;http://twitter.com/#!/sdouche&quot;&gt;Sebastien Douche&lt;/a&gt;, excellent orateur) je rentre chez mon frère qui m’héberge. Et commence la conversation type que nous développeurs nous avons déjà eu des dizaines de fois:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Mon frère&lt;/em&gt;&lt;/strong&gt; : Alors cette conf, sympa ? C’était sur quoi ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Moi&lt;/em&gt;&lt;/strong&gt; : Ouep super bien, on nous a présenté GIT&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Mon frère&lt;/em&gt;&lt;/strong&gt; : Ah ? C’est quoi GIT&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Moi&lt;/em&gt;&lt;/strong&gt; : Un super outil de GConf pour remplacer SVN qu’il est grand temps de virer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Mon frère (perplexe)&lt;/em&gt;&lt;/strong&gt; : Ah…ok….bon, et sinon les enfants, ils vont bien ?&lt;/p&gt;

&lt;p&gt;Et votre femme (oui car souvent le développeur est un homme 😉 ) ne vous a jamais demandé comment s’est passé votre journée ? Chez moi ça donne à peu près ça :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Ma femme&lt;/em&gt;&lt;/strong&gt; : Alors ta journée ? bien passé ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Moi&lt;/em&gt;&lt;/strong&gt; : Oui le top, j’ai complètement refait la gestion transactionnelle du projet pour utiliser de l’AOP en mettant le place spring et Jersey pour l’exposition REST.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Ma femme (perplexe)&lt;/em&gt;&lt;/strong&gt; : Ah… en effet ça a l’air bien.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Moi&lt;/em&gt;&lt;/strong&gt; : Et toi ? bonne journée ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Ma femme&lt;/em&gt;&lt;/strong&gt; : Oui pas mal, j’ai diagnostiqué un truc grave au plus tôt, ça va sûrement lui sauver la vie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Moi (perplexe)&lt;/em&gt;&lt;/strong&gt; : Ouais… C’est pas mal non plus…&lt;/p&gt;

&lt;p&gt;C’est je trouve le plus frustrant dans notre métier, on peut faire des trucs hyper techniques, c’est très compliqué de l’expliquer et de le faire partager aux non néophytes. Pire : plus c’est technique et moins c’est impressionnant/intéressant pour les autres. Faites une page web avec un GIF animé et vos amis vous prennent pour un dieu de l’informatique. Par contre plus c’est technique et moins on peut montrer un résultat concret.&lt;/p&gt;

&lt;p&gt;Personnellement j’ai vu le changement quand je suis passé d’un projet Java sur le Machine To Machine au développement sur iPhone. A expliquer à mon entourage c’est le jour et la nuit 😉&lt;/p&gt;

&lt;p&gt;C’est aussi pour ça que des journées comme le &lt;a href=&quot;http://www.breizhcamp.org/&quot;&gt;BreizhCamp&lt;/a&gt; ça nous fait du bien à nous les développeurs, on peut discuter avec d’autres personnes qui comprennent ce que l’on fait. Donc encore merci &lt;a href=&quot;http://twitter.com/#!/ndeloof&quot;&gt;Nicolas&lt;/a&gt; pour l’avoir organisé !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Choisir un développeur</title>
   <link href="https://liard.me/2011/05/choisir-un-developpeur/"/>
   <updated>2011-05-08T17:32:32+02:00</updated>
   <id>https://liard.me/2011/05/choisir-un-developpeur</id>
   <content type="html">&lt;p&gt;Je viens de lire un article très intéressant : &lt;a href=&quot;http://techcrunch.com/2011/05/07/why-the-new-guy-cant-code/&quot;&gt;Why the new guy cant code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comme je l’ai dit dans &lt;a href=&quot;http://www.net-liard.com/blog/2011/03/peut-on-reussir-un-forfait/&quot;&gt;l’article sur les forfaits&lt;/a&gt;, il est indispensable de bien choisir ses développeurs et c’est loin d’être simple. TechCrunch explique bien que le processus de sélection des entreprises n’est pas souvent très performant. Même chez Google il y a des choses à améliorer. J’ai par exemple bien aimé le test technique à faire pour déposer son CV chez Ippon, mais ce n’est pas suffisant.&lt;/p&gt;

&lt;p&gt;J’ai aussi souvent cet exercice à faire et ce n’est pas simple. Pour préparer l’entretien je commence par googler le nom du candidat. Je suis en phase avec l’article : aujourd’hui il est juste inadmissible qu’un développeur ne possède pas de site web/blog. Un bon développeur c’est avant tout un passionné, il doit exister sur la toile. Pour une prestation j’ai passé un entretien avec un gars qui avait un site web où il présentait son voyage à Lego Land et des Add-on Counter Strike qu’il avait développés. Avant même de le voir en entretien je savais qu’il était bon car un homme qui aime encore les Legos ne peut qu’être bon  :)J’ai encore le souvenir de sa tête se décomposant au moment où je lui est demandé pendant l’entretien : “Alors ? C’était comment Légo Land ?” (la tête de sa commerciale était pas mal non plus  :)). Il était un peu gêné au début mais pour moi ce n’était que du positif : il a un site web, il développe des add-on CS sur son temps perso et le contact était bon pendant l’entretien. Résultat : une bonne recrut qui a fait du super boulot.&lt;/p&gt;

&lt;p&gt;Pas simple non plus de s’y retrouver avec les CV que l’on reçoit des SSII. Entre les CV retouchés par les commerciaux pour y placer les mots clés recherchés et les CV où le commercial a juste collé l’entête de sa société sur le CV du gars, on est pas aidé. Je ne supporte plus les CV où sont listés les 36 langages informatiques connus, ça ne veut plus rien dire ! Une fois j’ai eu une personne avec sur le CV : “Assembleur Intel et Motorola”, sûrement un TP fait il y a 3 ans : super intéressant pour une presta JEE. Et là pas de chance, moi aussi j’en ai fait de l’assembleur ! Et oui n’oubliez jamais que si vous notez quelque chose sur votre CV, il faut assurer après. Du coup au milieu de l’entretien je demande au candidat : “Peux-tu me dire la différence entre l’assembleur Intel et l’assembleur Motorola”. Et là patatras… même pas capable de se rappeler de l’inversion des bits de poids faible et des bits poids fort pour les octets. Donc pitié, sur les CV ne mettez que l’essentiel et indiquez le niveau de compétence (Java : 3 ans, C# : 1 an, etc…)&lt;/p&gt;

&lt;p&gt;Autre expérience intéressante. Je cherchais un développeur JAVA en urgence (genre pour demain) et bien sûr avec de la bouteille. A cause des délais je n’ai eu le CV que d’une personne avec peu d’expérience mais avec des mots clés intéressants comme Maven. L’entretien se passe bien mais j’avais encore des doutes sur ses compétences. Devant son commercial je lui demande : “Tu as une heure de dispo ? J’ai justement un problème avec un appel WS avec Axis, tu m’aides à le coder ?”. Là encore je les ai un peu surpris, mais on s’est mis à deux devant un écran et on a corrigé le problème.&lt;/p&gt;

&lt;p&gt;Le plus important ce ne sont pas les réponses aux questions mais comment ils répondent. J’ai sélectionné de très bons développeurs qui savaient répondre “Ah non ça je ne connais pas” au lieu d’essayer de m’embrouiller. Un autre point à ne pas négliger non plus c’est bien sûr le relationnel. Un excellent développeur peut devenir un poids mort s’il ne s’intègre pas facilement dans une équipe.&lt;/p&gt;

&lt;p&gt;Pour résumer mes critères perso pour choisir un bon développeur :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Avoir un blog, un site, une activité informatique sur son temps perso&lt;/li&gt;
  &lt;li&gt;Pour les développeurs iPhone/Android : avoir publié une application à titre perso.&lt;/li&gt;
  &lt;li&gt;Un bon contact lors de l’entretien.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Recrutement Ippon vraiment original</title>
   <link href="https://liard.me/2011/04/recrutement-ippon-vraiment-original/"/>
   <updated>2011-04-08T23:55:26+02:00</updated>
   <id>https://liard.me/2011/04/recrutement-ippon-vraiment-original</id>
   <content type="html">&lt;p&gt;Je viens de tomber sur une offre emploi super bien faite d’Ippon Technologies sur l’excellent site de &lt;a href=&quot;http://www.touilleur-express.fr/&quot;&gt;Nicolas Martignole&lt;/a&gt; : &lt;a href=&quot;http://www.express-board.fr/&quot;&gt;l’express board&lt;/a&gt;. (bon ok je suis un poil à la bourre elle date de Février…)&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;span&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p&gt;&lt;span&gt;Chez Ippon Technologies, nous cherchons des consultants capables de lire cette offre d’emploi :&lt;/span&gt;&lt;/p&gt;

  &lt;p&gt;&lt;span&gt;&lt;a title=&quot;GitHub Ippon&quot; href=&quot;https://github.com/ippontech/IpponRecrute&quot; target=&quot;_blank&quot;&gt;https://github.com/ippontech/IpponRecrute&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

  &lt;p&gt;&lt;span&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;span&gt;&lt;a href=&quot;http://www.julien-dubois.com/&quot;&gt;Julien Dubois&lt;/a&gt; (passé de SpringSource à Ippon Technologies récemment) a même poussé le vis en encodant le texte de l’annonce dans le code. Il faut donc l’exécuter pour la lire.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Bravo Julien, j’adore l’idée ! :)&lt;/span&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Peut-on réussir un forfait ?</title>
   <link href="https://liard.me/2011/03/peut-on-reussir-un-forfait/"/>
   <updated>2011-03-11T18:52:32+01:00</updated>
   <id>https://liard.me/2011/03/peut-on-reussir-un-forfait</id>
   <content type="html">&lt;p&gt;Plus je travaille avec des SSII et plus je trouve que les projets gérés au forfait se passent mal. Les torts sont souvent partagés, mais je constate plusieurs causes d’échec :&lt;/p&gt;

&lt;h3 id=&quot;le-client-est-incapable-de-rédiger-un-cahier-des-charges&quot;&gt;Le client est incapable de rédiger un cahier des charges&lt;/h3&gt;

&lt;p&gt;Là je sais de quoi je parle, j’ai souvent le rôle de client en ce moment :)&lt;/p&gt;

&lt;p&gt;Le besoin évolue, n’est pas forcément clair et donc il est très dur de rédiger un cahier des charges exhaustif. Le client est obsédé par la garantie de réalisation qu’apporte le forfait, alors qu’il est incapable d’exprimer correctement son besoin. Pire je vois de plus en plus de forfait où on demande au prestataire de rédiger le cahier des charges : on rêve.&lt;/p&gt;

&lt;h3 id=&quot;les-acheteurs--price-killer&quot;&gt;Les acheteurs : price killer&lt;/h3&gt;

&lt;p&gt;Oui c’est une bonne chose de tirer les prix vers le bas, mais il faut aussi rester raisonnable. Comment voulez-vous travailler sereinement avec des prestataires à qui on a mis le couteau sous la gorge.  Pourquoi pas des enchères inversées pendant qu’on y est ? -souvenir-&lt;/p&gt;

&lt;h3 id=&quot;leréflexe-perdant--perdant&quot;&gt;Le réflexe “perdant – perdant”&lt;/h3&gt;

&lt;p&gt;J’ai l’impression d’être le seul à demander aux SSII d’augmenter leur chiffrage quand j’ai l’impression que c’est un peu juste. Une fois j’en parlais à un chef de projet, il m’a même répondu : “Ne leur dis rien, s’ils se plantent c’est pour leur pomme !”. On sait très bien que ça ne se passe pas comme cela. A un moment si le prestataire s’est vraiment planté, c’est le projet qui va en pâtir (qualité de code, test unitaire, bug..)&lt;/p&gt;

&lt;h3 id=&quot;linter-contrat&quot;&gt;L’inter-contrat&lt;/h3&gt;

&lt;p&gt;Même si les commerciaux sont les spécialistes pour vous faire de beaux discours sur leur “cellule forfait” avec des personnes dédiées. Il ne faut pas se leurrer, le forfait c’est l’idéal pour occuper une personne en inter-contrat. Le problème pour le projet c’est que l’on n’a jamais les mêmes développeurs en face. C’est dur d’assurer une continuité des développements.&lt;/p&gt;

&lt;h3 id=&quot;junior-en-solo&quot;&gt;Junior en solo&lt;/h3&gt;

&lt;p&gt;C’est un peu lié au problème des prix tirés vers le bas mais je vois de plus en plus de débutants seuls sur des projets. J’ai absolument rien contre les débutants mais il faut les encadrer. Le problème c’est qu’en SSII des développeurs avec 10 ans d’expérience c’est super rare. Et oui, on vend plus cher un mauvais chef de projet qu’un bon développeur avec de l’expérience.&lt;/p&gt;

&lt;h3 id=&quot;le-mythe-du-forfait-de-service&quot;&gt;Le Mythe du forfait de service&lt;/h3&gt;

&lt;p&gt;Depuis un certain temps on nous a mis en place des “forfaits de services”. Alors ça c’est encore une belle invention d’acheteur qui n’a pas du travailler dans le monde du développement. En gros le principe c’est d’envoyer une demande par email et d’attendre le livrable 2 mois plus tard. Vous ne savez pas qui travaille sur le projet, c’est une boite noire. Et donc on retombe dans les travers des deux précédents points et on va avoir des développeurs Flex juniors qui vont coder du J2EE.&lt;/p&gt;

&lt;h2 id=&quot;des-solutions-&quot;&gt;Des solutions ?&lt;/h2&gt;

&lt;p&gt;Je sors justement d’une expérience forfait un peu difficile. A la signature du contrat tout est beau, c’est une société avec qui je travaille souvent, ils mettent en avant le fait qu’il sont CMMI niveau 3, on parle même d’intégration continue avec Hudson. Bref on est en confiance. Au final on nous livre du code Java d’une qualité affligeante (si si c’est le bon mot quand je trouve des noms de variable avec des accents), zéro test unitaire et cerise sur le gâteau le livrable ne compile pas car il manque des sources.&lt;/p&gt;

&lt;p&gt;Malgré tout ça je vais continuer à travailler avec cette société. Car déjà elle n’est pas la seule responsable de cet “échec” mais surtout je pense que c’est avant tout un problème de mauvaise personne au mauvais endroit.&lt;/p&gt;

&lt;p&gt;Mais comment faire en sorte que la future prestation se passe bien :&lt;/p&gt;

&lt;h3 id=&quot;travailler-gagnant--gagnant&quot;&gt;Travailler gagnant – gagnant&lt;/h3&gt;

&lt;p&gt;Partager les risques avec le prestataire, s’impliquer dans le chiffrage, travailler ensemble.&lt;/p&gt;

&lt;h3 id=&quot;choisir-les-intervenants&quot;&gt;Choisir les intervenants&lt;/h3&gt;

&lt;p&gt;Il faut vraiment intégrer que la réussite d’un projet n’est pas lié à la société mais bien aux personnes qui réalisent. Faire passer des entretiens est donc primordial pour sélectionner son équipe. C’est le seul moyen d’être sûr que l’on va pas mettre un Flexeur à gérer des transactions JTA ( oui oui c’est du vécu…).&lt;/p&gt;

&lt;h3 id=&quot;faire-des-revues-de-codepériodiquement&quot;&gt;Faire des revues de code périodiquement&lt;/h3&gt;

&lt;p&gt;Les chefs de projets qui regardent la qualité du code livré sont rares, mais le faire à la livraison c’est surtout trop tard. Il est très important de bien suivre la qualité du code tout au long de la vie du projet pour s’assurer que ça ne diverge pas.&lt;/p&gt;

&lt;p&gt;Et non coder un “proto” n’autorise pas à faire n’importe quoi ! (si je retrouve le gars qui a codé la gestion des transactions à la main dans un filtre HTTP je l’étripe :)&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;C’est bête à dire mais pour réussir il faut juste travailler en bonne intelligence avec le prestataire. Arrêter ce rapport maitre/esclave qui ne peut que mal finir et discuter d’égal à égal.&lt;/p&gt;

&lt;p&gt;Le client devrait passer plus de temps sur son expression de besoins que sur les petites lignes du contrat cadre. Arrêtez d’être obsédé par la garantie de résultat et de date de livraison complètement illusoire pour vous reconcentrer sur l’essentiel : le produit.&lt;/p&gt;

&lt;p&gt;Le développement agile permet de résoudre beaucoup de problèmes. Mais quand je vois que l’on demande à des prestataires de travailler de façon Agile mais en gardant un cadre type forfait avec engagement de résultat, c’est complètement antinomique !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Profiling SQL</title>
   <link href="https://liard.me/2011/03/profiling-sql/"/>
   <updated>2011-03-11T01:04:54+01:00</updated>
   <id>https://liard.me/2011/03/profiling-sql</id>
   <content type="html">&lt;p&gt;C’est une étape souvent négligée par les projets utilisant des librairies de mapping objet. Mais faire de l’Hibernate c’est bien, regarder les requêtes générées sur la base c’est mieux.&lt;/p&gt;

&lt;p&gt;J’ai le souvenir d’un vieux projet utilisant des EJB Entity 2 où à un moment on ajoutait un objet dans une liste. En regardant les requêtes on s’est aperçu que le conteneur chargeait toute la liste avant de faire l’insert. C’était complètement inutile.&lt;/p&gt;

&lt;p&gt;Donc comment étudier correctement les requêtes ? Déjà si vous utilisez hibernate mettez la property “show_sql” à true de temps en temps. Après pour avoir plus d’informations j’utilise &lt;strong&gt;p6spy&lt;/strong&gt; et &lt;strong&gt;IronEye SQL&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;p6Spy est une librairie qui remplace votre driver de base de données. C’est en quelque sorte un driver proxy de BDD. IronEye apporte juste une vue graphique des informations récoltées par p6spy. Pour trouver de la doc c’est un peu dur &lt;a href=&quot;https://p6spy.github.io/p6spy/2.0/install.html&quot; title=&quot;Project Home&quot;&gt;p6spy&lt;/a&gt;{.link-external} ne fonctionne plus mais j’ai trouvé un site expliquant la &lt;a href=&quot;http://www.javaperformancetuning.com/tools/ironeyesql/index.shtml&quot;&gt;mise en place de p6spy et de IronSql&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Par contre ce sont deux outils un peu “vieux”. p6spy n’a pas été mis à jour depuis 2003 et pour IronEye SQL la société IronGrid a disparu. Comme il est maintenant impossible de trouver IronEye en téléchargement je vous propose la version 1.2.359 que j’avais heureusement conservée : &lt;a href=&quot;https://liard.meimages/uploads/2011/03/ironeyesql-installer-1_2_359.jar&quot;&gt;ironeyesql-installer-1_2_359.jar&lt;/a&gt;. (fonctionne que sur Windows chez moi). Le site &lt;a href=&quot;http://sourceforge.net/projects/p6spy/&quot;&gt;sourceForge de p6spy&lt;/a&gt; est toujours up.&lt;/p&gt;

&lt;p&gt;Sans refaire la doc, installer p6spy c’est simple, il faut juste remplacer le nom de votre driver jdbc par &lt;strong&gt;com.p6spy.engine.spy.P6SpyDriver&lt;/strong&gt; et de mettre le nom du vrai driver dans le fichier spy.properties : &lt;span&gt;&lt;strong&gt;realdriver = oracle.jdbc.driver.OracleDriver&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;. Pour utiliser IronEye il faut en plus activer un port d’écoute dans le spy.properties :&lt;br /&gt; &lt;strong&gt;module.monitor=com.irongrid.monitor.server.MonitorFactory&lt;br /&gt; monitorport=2000&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Et voilà ! vous pouvez observer toutes les requêtes faites sur votre base. IronSQL va les regrouper, les compter et calculer le temps moyen d’exécution.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Sans être DBA vous allez très vite voir quelles requêtes sont faites souvent et les plus longues à s’exécuter. Très pratique pour voir si un cache L2 fonctionne bien ou si on a oublié un index sur une table.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Un exemple concret que j’ai corrigé hier :&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Dans un service REST on passe en paramètre l’id d’un objet. C’est un service de monitoring appelé par du matériel pour lui passer des infos et s’assurer qu’il est encore en vie (du polling à défaut de push en gros)&lt;/span&gt;&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;java:nogutter:nocontrols&quot;&gt;Truc t = trucDao.getById(tid);
t.setLastAccess(now);&lt;/pre&gt;

&lt;p&gt;&lt;span&gt;Assez logique en java avec hibernate, mais l’objet t n’est jamais utilisé après. Le problème c’est qu’au niveau SQL on a un SELECT qui récupère toutes les informations de l’objet pour ensuite faire un UPDATE. Si en plus vous avez configuré des associations de votre objet en lazzy, ça peut être vraiment problématique.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;J’ai changé ce code par :&lt;/span&gt;&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;java:nogutter:nocontrols&quot;&gt;trucDao.updateDateById(tid, now);&lt;/pre&gt;

&lt;p&gt;&lt;span&gt;Maintenant il ne reste que la requête UPDATE. Lorsque l’on sait que nous allons avoir plusieurs milliers de “Truc” et qu’ils font cette requète toutes les 15 secondes. Je vous laisse calculer le gain en perf. &lt;/span&gt;Dans la même fonction j’ai aussi trouvé une requête SQL faite uniquement pour un log debug : no comment.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Best-of Cdp</title>
   <link href="https://liard.me/2011/02/best-of-cdp/"/>
   <updated>2011-02-13T20:39:26+01:00</updated>
   <id>https://liard.me/2011/02/best-of-cdp</id>
   <content type="html">&lt;p&gt;En 10 ans j’ai croisé pas mal de chefs de projets différents. J’ai envie de vous faire partager plusieurs échanges assez étonnants que j’ai pu avoir avec eux dans différentes sociétés.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : On est mal sur un projet. Il faut absolument livrer dans 1 mois !&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : Ok, je peux peut-être vous aider. Quelle charge en “Reste à faire” il te reste pour livrer ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; &lt;em&gt;(étonné)&lt;/em&gt; : heu… je sais pas. Mais il faut livrer dans 1 mois !&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ils ont livré avec 4 mois de retard&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : Comment s’est passée la prestation avec la société X ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : Je suis un peu mitigé&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : Ah bon ? Pourtant j’ai vu le livrable je trouvais ça pas mal&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : Oui en effet, ils ont fait ce que j’avais mis dans le cahier des charges&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : Alors ? Où est le problème ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : J’attendais un peu plus&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : …&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : Je peux voir les sources de ton projet ? Elles sont où en GConf ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : heu… J’ai du les mettre quelque part sur un répertoire partagé. Attends je cherche.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2 jours après&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : Dis moi, c’est normal que le code compile pas ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : On a besoin d’aide pour livrer à temps&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : Ok, vous avez regardé quelles features on peut décaler d’une release ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : Impossible de réduire, on en a une seule : “l’inscription d’un utilisateur”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; &lt;em&gt;étonné&lt;/em&gt; : ah… mais il y a combien de pages web pour cette fonction ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : 70 pages&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : …&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : Oui ça prend 1h30 à l’utilisateur pour s’enregistrer&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : Ah quand même …&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : Tu peux nous aider à nous organiser sur ce projet ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : Pas de problème, on va faire un Scrum Board. J’ai apporté des post-it !&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : Non mais Samuel, ça va, on a plus 6 ans on va pas perdre du temps avec tes post-it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : Je viens de regarder les sources de ton projet, y a un gros problème au niveau du code&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : Mais non tu dramatises, c’est en prod ça marche super bien&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moi&lt;/strong&gt; : Ecoute non, la gestion des transactions est une catastrophe, il faut la refaire.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : Oui oui, et bien on verra, pour le moment on n’a pas le temps.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2 semaines plus tard&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cdp&lt;/strong&gt; : Merde le service est KO. Qu’est-ce qui se passe ?&lt;/p&gt;

&lt;p&gt;Bien sûr j’ai croisé plus de bons chefs de projet que de mauvais. Mais c’est nettement moins amusant à raconter :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>My Orange en Suisse</title>
   <link href="https://liard.me/2011/01/my-orange-en-suisse/"/>
   <updated>2011-01-17T11:29:40+01:00</updated>
   <id>https://liard.me/2011/01/my-orange-en-suisse</id>
   <content type="html">&lt;p&gt;Je n’ai pas pour habitude de parler de mes projets pro sur ce blog. Par discrétion et parfois pour des raisons de confidentialité. Mais aujourd’hui c’est particulier, pour la première fois depuis 5 ans chez Orange un de mes projets est utilisé par des clients. Avant je travaillais sur des projets pour nos clients pro, alors le M2M c’est sympa mais pas vraiment “grand public” :)&lt;/p&gt;

&lt;p&gt;Donc l’application iPhone “My Orange” est disponible sur l’AppStore Suisse depuis 9h ce matin. Je suis très fier d’avoir pu mener ce projet à terme et j’espère que nos clients en seront contents.&lt;/p&gt;

&lt;p&gt;Si vous avez un compte iTunes Suisse vous pouvez la télécharger &lt;a href=&quot;http://itunes.apple.com/ch/app/my-orange/id405558461?mt=8&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Maven, JUnit et la JVM</title>
   <link href="https://liard.me/2010/11/maven-junit-et-la-jvm/"/>
   <updated>2010-11-29T10:56:23+01:00</updated>
   <id>https://liard.me/2010/11/maven-junit-et-la-jvm</id>
   <content type="html">&lt;p&gt;Ca fait longtemps que je n’ai pas fait de petit post technique où je decris la solution d’un problème simple. Et bien justement j’ai eu à en résoudre quelques uns ces derniers temps. Je vais donc les partager.&lt;/p&gt;

&lt;p&gt;En ce moment je travaille sur un projet qui charge beaucoup d’objets en mémoire. Il faut donc redéfinir la taille de mémoire max à allouer pour le faire tourner. Une simple option “-Xmx512m” au niveau de la JVM et les tests unitaires fonctionnent sans pb. Mais comment faire lorsqu’on lance les tests avec Maven ?&lt;/p&gt;

&lt;p&gt;La première solution est de redéfinir une variable d’environnement :  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MAVEN_OPTS=-Xmx512m&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mais dans ce cas chaque personne reprenant mon projet va devoir redéfinir cette variable. Pour moi ce n’est pas viable. En cherchant encore j’ai trouvé comment définir cela dans le pom :&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;xml:nogutter:nocontrols&quot;&gt;&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;argLine&amp;gt;-Xmx512m&amp;lt;/argLine&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;&lt;/pre&gt;

&lt;p&gt;Et la ça fonctionne très bien.&lt;/p&gt;

&lt;p&gt;Malheureusement j’avais un second problème. Je fais des tests avec des comparaisons de chaînes de caractères qui contiennent des accents. Et là encore sous Eclipse pas de problème mais en ligne de commande ça ne fonctionnait pas. En plus j’avais un Warning :&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Pour corriger le Warning j’ai ajouter dans le pom :&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;xml:nogutter:nocontrols&quot;&gt;&amp;lt;properties&amp;gt;

    &amp;lt;project.build.sourceEncoding&amp;gt;ISO-8859-1&amp;lt;/project.build.sourceEncoding&amp;gt;
&amp;lt;/properties&amp;gt;&lt;/pre&gt;

&lt;p&gt;Et pour que mes JUnit fonctionnent j’ai encore ajouté deux paramètres :&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;xml:nogutter:nocontrols&quot;&gt;&amp;lt;build&amp;gt;
  &amp;lt;plugins&amp;gt;
    &amp;lt;plugin&amp;gt;
      &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
      &amp;lt;configuration&amp;gt;
        &amp;lt;argLine&amp;gt;-Xmx512m -Dfile.encoding=ISO-8859-1&amp;lt;/argLine&amp;gt;
      &amp;lt;/configuration&amp;gt;
    &amp;lt;/plugin&amp;gt;
    &amp;lt;plugin&amp;gt;
      &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
      &amp;lt;configuration&amp;gt;
        &amp;lt;target&amp;gt;1.5&amp;lt;/target&amp;gt;
        &amp;lt;source&amp;gt;1.5&amp;lt;/source&amp;gt;
        &amp;lt;encoding&amp;gt;ISO-8859-1&amp;lt;/encoding&amp;gt;
      &amp;lt;/configuration&amp;gt;
    &amp;lt;/plugin&amp;gt;
  &amp;lt;/plugins&amp;gt;
&amp;lt;/build&amp;gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Windows Phone</title>
   <link href="https://liard.me/2010/10/windows-phone/"/>
   <updated>2010-10-23T00:26:35+02:00</updated>
   <id>https://liard.me/2010/10/windows-phone</id>
   <content type="html">&lt;p&gt;Cette semaine Microsoft a sorti son nouvel OS pour les “Windows Phone”. Vous le savez je ne suis pas un grand fan de Microsoft. De plus je ne garde pas de bons souvenirs de ma petite expérience de développement sur PDA Windows Mobile en 2001. Mais après avoir regardé une vidéo de démonstration de ces nouveaux téléphones, j’ai eu envie de savoir ce que Microsoft offrait aux développeurs.&lt;/p&gt;

&lt;p&gt;J’ai donc été sur leur site pour avoir des informations sur le kit de développement :&lt;/p&gt;

&lt;p&gt;http://msdn.microsoft.com/&lt;/p&gt;

&lt;p&gt;Et là j’ai eu une bonne surprise, déjà le site est entièrement en français, même le tutorial. L’environnement de développement Visual Studio Express est lui aussi entièrement traduit et gratuit. Je n’ai pas été très loin dans le test mais c’est assez agréable à utiliser.&lt;/p&gt;

&lt;p&gt;Un gros point noir par contre c’est qu’il n’y a aucune information sur la distribution des applications ni sur la rémunération des développeurs.&lt;/p&gt;

&lt;p&gt;Une première impression plutôt bonne donc. Microsoft va peut-être bichonner les développeurs pour offrir un maximum d’applications à ses clients car c’est bien là le nerf de la guerre aujourd’hui.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Le MDA va-t-il devenir à la mode ?</title>
   <link href="https://liard.me/2010/09/le-mda-va-t-il-devenir-a-la-mode/"/>
   <updated>2010-09-22T02:12:25+02:00</updated>
   <id>https://liard.me/2010/09/le-mda-va-t-il-devenir-a-la-mode</id>
   <content type="html">&lt;p&gt;C’est en effet la question que l’on peut se poser vu le nombre grandissant de conférences sur le sujet. Par exemple pendant le JUG Summer Camp 2010, je l’ai découvert en lisant le résumé sur le &lt;a href=&quot;http://blog.ippon.fr/2010/09/20/jug-summer-camp-2010-mda-en-2010-une-approche-pragmatique-55/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed:+LeBlogDesExpertsJ2ee+(Le+blog+des+experts+J2EE)&quot;&gt;blog d’ippon&lt;/a&gt;. Je ne l’ai par contre pas vu sur le blog du &lt;a href=&quot;http://www.touilleur-express.fr/2010/09/10/jug-summer-camp-2010-merci-serli/&quot;&gt;Touilleur&lt;/a&gt;, Nicolas ne doit toujours pas être convaincu 😉&lt;/p&gt;

&lt;p&gt;La prochaine ? Le lundi 4 Octobre à Rennes pour le &lt;a href=&quot;http://www.breizhjug.org/&quot;&gt;BreizhJug&lt;/a&gt;. Soirée MDA &amp;amp; Fodnation Eclipse par &lt;a href=&quot;http://www.mda4eclipse.com/&quot;&gt;Etienne Juliot&lt;/a&gt;. J’ai été fier de retrouver un lien vers un de mes articles sur leur page d’annonce 😉&lt;/p&gt;

&lt;p&gt;On remarquera que pour ces deux présentations c’est Obeo qui était invité. Leur force est surement d’avoir réconcilié les développeurs avec l’approche MDA en offrant une solution pragmatique et intégrée à Eclipse.&lt;/p&gt;

&lt;p&gt;Je vais essayer de participer au BreizhJug le 4, mais ce n’est pas gagné…&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>MDA Day et Acceleo 3</title>
   <link href="https://liard.me/2010/09/mda-day-et-acceleo-3/"/>
   <updated>2010-09-15T01:21:47+02:00</updated>
   <id>https://liard.me/2010/09/mda-day-et-acceleo-3</id>
   <content type="html">&lt;p&gt;Je viens de recevoir un email pour annoncer la date du MD Day 2010 : le &lt;strong&gt;Jeudi 25 Novembre&lt;/strong&gt;. C’est à Issy les Moulineaux donc surement chez Microsoft comme en 2009. Ils ratissent large Microsoft, après avoir accueilli le SCRUM User Group pour vendre Visual Studio comme l’outil idéal pour faire du SCRUM, ils vont peut être présenter Visio comme le meilleur modeleur UML du marché. La preuve ? c’est &lt;strong&gt;Steve Cook&lt;/strong&gt; &lt;span&gt;qui fait la Key note d’ouverture, un architecte logiciel de Microsoft de l’équipe Visual Studio, bref super indépendant. Une bonne raison pour bien dormir et arriver à 10h ! :)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Mais plus intéressant, j’ai aussi reçus un mail suite à la sortie d’Acceleo 3 (qui date de juin, je suis en retard…). Si vous utilisiez déjà Acceleo 2, Obeo propose des formations pour vous aider à migrer les :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;11-12 octobre&lt;/li&gt;
  &lt;li&gt;8-9 novembre&lt;/li&gt;
  &lt;li&gt;6-7 decembre&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contact : &lt;a href=&quot;http://www.obeo.fr/pages/formations/fr&quot;&gt;obeo&lt;/a&gt;&lt;/p&gt;

&lt;!--EndFragment--&gt;
</content>
 </entry>
 
 <entry>
   <title>C&apos;est reparti !</title>
   <link href="https://liard.me/2010/09/cest-reparti/"/>
   <updated>2010-09-04T01:07:13+02:00</updated>
   <id>https://liard.me/2010/09/cest-reparti</id>
   <content type="html">&lt;p&gt;Il faut bien avouer que ce blog est très calme depuis Juin, c’est souvent le cas pendant l’été :)&lt;/p&gt;

&lt;p&gt;C’est vrai que depuis un an je poste un peu moins. Contrairement à &lt;a href=&quot;http://www.aubryconseil.com/post/Un-an-de-tweets&quot;&gt;Claude Aubry&lt;/a&gt; ou &lt;a href=&quot;http://www.dotnetguru2.org/proques/index.php/2010/08/23/bloguer-ou-tweeter&quot;&gt;Pascal Roques&lt;/a&gt; ce n’est pas la faute de Tweeter (sans avoir la prétention de comparer mon blog aux leurs bien sur  :)). Non c’est simplement que j’ai moins de choses à partager. Comme j’ai toujours refusé de blogger des infos repêchées sur d’autres sites/blogs pour privilégier des articles techniques de fond (enfin je l’espère ! ).&lt;/p&gt;

&lt;p&gt;Alors quel programme pour cette nouvelle année scolaire ?&lt;/p&gt;

&lt;p&gt;Du MDA ? Peu de chance aux vues de mes activités. En plus je n’ai toujours pas trouvé de bon modeleur UML sur MAC.&lt;/p&gt;

&lt;p&gt;Du Scrum ? En étant un peu seul niveau développeur dans mon équipe, c’est pas simple à mettre en place :)&lt;/p&gt;

&lt;p&gt;De l’iPhone ? Oui ça c’est sur que je vais continuer à développer des applications iPhone. On y prend vite gout.&lt;/p&gt;

&lt;p&gt;Du Java ? Aussi je pense, j’ai quelques idées de service à faire. J’espère trouver le temps de les réaliser pour vous en reparler.&lt;/p&gt;

&lt;p&gt;Voila pour ce petit teasing, maintenant il faut se mettre au travail !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Retour de la WWDC 2010</title>
   <link href="https://liard.me/2010/06/retour-de-la-wwdc-2010/"/>
   <updated>2010-06-14T12:02:37+02:00</updated>
   <id>https://liard.me/2010/06/retour-de-la-wwdc-2010</id>
   <content type="html">&lt;p&gt;Et voilà je suis de retour en France après une semaine à San Francisco pour la WWDC 2010. Je ne peux pas vous faire un article par session car il est strictement interdit de communiquer sur ce que nous avons entendu. Mais par contre je peux vous résumer le voyage, la Key Note et l’ambiance.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/06/img_0016-225x300.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;le-voyage&quot;&gt;Le voyage&lt;/h2&gt;

&lt;p&gt;Comme je suis de Lannion, le trajet pour Paris c’est déjà une aventure  :)Je vous passe les détails des 4 heures de train au milieu d’un groupe de 50 gamins de 12 ans. Ensuite il faut 11 heures d’avion pour arriver à San Francisco. C’est en me baladant dans l’avion que j’ai vite compris que pas mal de monde allait aussi à la WWDC au vu du nombre d’iPad. 11h de vol c’est un très bon test pour la batterie, et bien même en regardant des films et en jouant avec l’iPad ça passe.&lt;/p&gt;

&lt;p&gt;J’arrive donc à San Francisco le Samedi vers 13h, le temps de s’installer à l’hôtel et on court direct à l’Apple store. Un collègue en profite pour acheter un iPad 64Go  :)Après un peu de shopping et un bon gros hamburger, à 20h on est claqué (5h du matin en France). Arrive donc Dimanche après une nuit un peu chaotique. Comme c’était ma première visite à San Francisco j’ai fait le tour classique :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Cable car&lt;/li&gt;
  &lt;li&gt;Golden Gate&lt;/li&gt;
  &lt;li&gt;Fisherman’s Wharf&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/06/4683917181_a580bdc71c-225x300.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/06/4683991987_a0e3df67a9-225x300.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/06/4684723542_f862d144c0-225x300.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/06/4683907607_f637a5a240-225x300.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;C’est très impressionnant de voir les rues de San Francisco, on retrouve vraiment l’ambiance des films et séries tournés ici.&lt;/p&gt;

&lt;h2 id=&quot;la-keynote&quot;&gt;La KeyNote&lt;/h2&gt;

&lt;p&gt;C’est à ce moment que la folie commence. Comme c’est Steve Jobs qui présente la Key Note et que la salle n’est pas assez grande pour accueillir tous les participants, il faut se lever tôt pour avoir une place. Personnellement j’étais présent à 5h30 alors que la conf commençait à 10h. Et bien il y avait déjà plus de 400 personnes devant moi.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/06/4684681752_bd1bc99e53-300x225.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/06/4684056775_9f7a815493-225x300.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le premier était arrivé la veille à 18h. Une grand bande de fous dont je faisais partie  :)Après 4 bonnes heures à poireauter, c’est le moment d’entrer dans la salle. Je me retrouve donc au troisième rang grâce à un petit tour de passe passe. Je peux vous dire que je pouvais presque toucher Steve Jobs, un grand moment que je garderais longtemps en mémoire.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/06/img_0045-225x300.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/06/4684079541_3a8d7f14ab-225x300.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Je ne vais pas vous refaire la Key Note, beaucoup l’on fait avant moi mais l’événement marquant a bien-sûr été la présentation de l’iPhone 4.&lt;/p&gt;

&lt;p&gt;La démo de l’appel video entre Steve Jobs et Jonathan Ive était impressionnante. Mais le moment le plus fort dans la salle s’est produit pendant la diffusion de la vidéo résumant la fonction visio au moment où deux sourds et muets communiquaient par langage des signes via FaceTime.&lt;/p&gt;

&lt;h2 id=&quot;les-conférences&quot;&gt;Les conférences&lt;/h2&gt;

&lt;p&gt;On ne peut qu’admirer l’organisation parfaite de la semaine par Apple. Jamais je n’avais participé à un séminaire où 100% des sessions commencent et terminent à l’heure, leur timing est hallucinant. Le professionnalisme des présentateurs est aussi remarquable. Après renseignement j’ai appris que les slides présentés étaient tous réalisés par une équipe de designer et que les présentateurs étaient suivis pas un coach pour parfaire la prestation. Et bien le résultat est simplement parfait !&lt;/p&gt;

&lt;p&gt;Pour vous mettre dans la même ambiance, vous pouvez écouter ci-dessous la musique qui tournait en boucle entre les sessions.&lt;/p&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;
&lt;/p&gt;

&lt;p&gt;Comme je l’ai expliqué plus haut, il nous est interdit de communiquer sur le contenu des présentations. Mais je peux vous dire que c’était souvent assez technique et très enrichissant.&lt;/p&gt;

&lt;p&gt;J’ai donc appris beaucoup au niveau développement pendant une semaine et je n’ai maintenant qu’une envie c’est d’y retourner l’année prochaine!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Départ pour San Francisco !</title>
   <link href="https://liard.me/2010/06/depart-pour-san-francisco/"/>
   <updated>2010-06-04T02:08:05+02:00</updated>
   <id>https://liard.me/2010/06/depart-pour-san-francisco</id>
   <content type="html">&lt;p&gt;Voila c’est parti Demain j’arrive à San Francisco pour participer à la WWDC 2010. Je ne suis pas sur d’avoir le temps de faire de gros articles sur le blog et dans ce cas Twitter est peut être mieux adapté.&lt;/p&gt;

&lt;p&gt;Donc même si je ne suis pas un Twitter, je vais tester l’exercice pendant ce voyage et surtout pendant la Key Note avec Steve Jobs !&lt;/p&gt;

&lt;p&gt;Vous pourrez donc me suivre sur : &lt;a href=&quot;http://twitter.com/sliard&quot;&gt;http://twitter.com/sliard&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>WWDC 2010</title>
   <link href="https://liard.me/2010/04/wwdc-2010/"/>
   <updated>2010-04-30T21:57:11+02:00</updated>
   <id>https://liard.me/2010/04/wwdc-2010</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/04/wwdc.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Apple a enfin annoncé la date de sa &lt;a href=&quot;http://developer.apple.com/WWDC/&quot;&gt;grande messe annuelle&lt;/a&gt;, c’est donc du 7 au 11 Juin. Au programme une série de conférences très techniques, des labs et une Keynote d’ouverture où l’iPhone HD a de très grandes chances d’être présenté.&lt;/p&gt;

&lt;p&gt;Pourquoi j’en parle sur ce blog ? Et bien simplement parce que cette année j’y participerai ! J’ai même déjà mon billet pour San Francisco 😉 J’ai ciblé plusieurs sessions intéressantes :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Adopting Multitasking on iPhone OS&lt;/li&gt;
  &lt;li&gt;What’s New in Foundation for iPhone OS 4&lt;/li&gt;
  &lt;li&gt;Implementing Local and Push Notifications&lt;/li&gt;
  &lt;li&gt;Mastering Table Views&lt;/li&gt;
  &lt;li&gt;Network Apps for iPhone OS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bref, un beau programme.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Retour sur la soirée Scrum User Group</title>
   <link href="https://liard.me/2010/04/retour-sur-la-soiree-scrum-user-group/"/>
   <updated>2010-04-03T13:01:53+02:00</updated>
   <id>https://liard.me/2010/04/retour-sur-la-soiree-scrum-user-group</id>
   <content type="html">&lt;p&gt;Mardi soir j’ai participé à la soirée anniversaire du French Scrum User Group.&lt;/p&gt;

&lt;p&gt;Direction Microsoft à Issy Les Moulineaux.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/03/microsoft1-300x241.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A propos si vous recherchez des locaux, il y a de la place ! :)&lt;/p&gt;

&lt;h2 id=&quot;accueil&quot;&gt;Accueil&lt;/h2&gt;

&lt;p&gt;J’entre donc dans l’amphi Grand bleu pour l’ouverture de la soirée. Salle très impressionnante que l’on remplit à moitié au début. On commence par une vidéo de &lt;a href=&quot;http://www.scrumalliance.org/profiles/7&quot;&gt;Ken Schwaber&lt;/a&gt; en personne buvant une flûte de champagne pour fêter cet anniversaire, clin d’oeil plutôt sympa :)&lt;/p&gt;

&lt;p&gt;Ensuite Luc Legardeur, président du Scrum User Group et de Xebia, fait le bilan de la première année. Il remarque que le public se diversifie et qu’il n’y a pas que des SSII dans la salle. Quelques chiffres, le SUG en France c’est 400 membres et 11 rencontres sur l’année pour un budget autour de 13 000 Euros. Un petit scoop pour la fin, le Scrum Gathering d’automne pourrait être organisé en France.&lt;/p&gt;

&lt;h2 id=&quot;roman-pichler&quot;&gt;Roman Pichler&lt;/h2&gt;

&lt;p&gt;On enchaîne par une excellente présentation de &lt;a href=&quot;http://www.scrumalliance.org/profiles/26-roman-pichler&quot;&gt;Roman Pichler&lt;/a&gt; à propos du rôle de Product Owner. Il nous présente plusieurs types de Product Owner à éviter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le proxy Product Owner&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;C’est le cas typique que je retrouve dans ma société. Avec Scrum nos chefs de projet ont un peu de mal à trouver leur place. Comme nos MOE n’ont jamais le temps de jouer le rôle de Product Owner, c’est le chef de projet qui s’y colle. Il gère très bien “l’administratif” mais ce n’est pas lui qui est maître de la “vision produit” c’est la MOE ! Dans ce cas on parle de proxy product Owner. Ca ne fait donc que ralentir les décisions. Roman parle même d’anti Pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le Product Owner faible&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si le Product Owner doit faire valider toutes ses décisions par son responsable, c’est dur d’avancer sereinement. Le Product Owner doit avoir le pouvoir de réaliser sa vision du produit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le Product Owner surchargé&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Un Product Owner peut gérer au maximum trois projets en même temps (en fonction de leur importance). Il ne doit pas non plus tout gérer seul, il a surtout un rôle de leader.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le Product Owner passif&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Roman dit qu’il rencontre ce type de Product Owner avec des personnes habituées aux livraisons “Big ban” (j’écris 3 lignes de spec et je reviens 3 mois plus tard pour constater que je n’ai pas ce que je voulais). En Scrum le Product Owner doit s’investir tout au long du projet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le Product Owner Distant&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Là aussi on rencontre souvent ce cas pendant une prestation où le client n’est pas dans les bureaux de la SSII. Ca ralentit clairement la productivité de l’équipe. Roman préconise que le Product Owner soit au minimum présent avec l’équipe les deux premiers et les deux derniers jours du sprint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le Product Owner sans vision&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le Product Owner doit présenter et partager la vision du produit à l’équipe. Il doit savoir ce que la prochaine release va contenir.&lt;/p&gt;

&lt;p&gt;Roman est un très bon orateur et ses différentes expériences enrichissent son discours.&lt;/p&gt;

&lt;h2 id=&quot;les-ateliers&quot;&gt;Les Ateliers&lt;/h2&gt;

&lt;p&gt;Après cette présentation très dynamique, plusieurs ateliers dans 4 salles différentes sont organisés. J’en ai suivi trois.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Collaborer avec Scrum grâce à Visual Studio&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/04/surface2-300x270.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Xavier Warzee de Microsoft nous présente la nouvelle version de Visual Studio qui intègre la gestion d’un product Backlog. Ca ressemble quand même beaucoup à un MS Project “Scrumisé”. Alors oui ça va plaire à nos managers grâce à tous les chiffres et les graphs que ça génère, mais j’ai quand même la désagréable impression qu’on essaie de nous revendre un Excel en plus cher.&lt;/p&gt;

&lt;p&gt;Julien Corioland d’Access it présente son application de gestion d’affectation de tâche sur la table surface. C’est bien-sûr relié à une base Visual Studio. Alors oui c’est beau, amusant mais est-ce que c’est exploitable ? J’en suis moins sûr. Sans oublier qu’une table surface c’est 12 000 $, soit à peu près 1 million de post-it.&lt;/p&gt;

&lt;p&gt;Pour finir c’est Mathieu Szablowski de Pyxis qui nous montre une extension qu’il a réalisée pour Visual Studio. Déjà ce qui me choque c’est qu’il fait une démo de Visual Studio depuis son Mac Book Pro. C’est quand même un peu tordu d’utiliser un Mac pour utiliser Visual Studio 😉 Sinon pour le fond j’ai toujours du mal à comprendre l’intérêt de ces extensions par rapport à une bonne vieille feuille Excel. Bon si, j’avoue, le seul intérêt que j’y vois c’est le travail collaboratif.&lt;/p&gt;

&lt;p&gt;Bref une première session assez décevante. On a beaucoup parlé de Microsoft et très peu de Scrum au final. L’agilité en ce moment c’est à la mode et on a vraiment l’impression que les éditeurs ajoutent le mot Scrum un peu partout pour vendre leur produit. La session d’après n’a fait que confirmer cela.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modélisation pour SCRUM avec RSA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/04/rsa1-300x286.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;C’est le titre qui m’a attiré. J’étais curieux de voir comment IBM (les rois du RUP) allait nous parler de Scrum. Et bien j’ai pas été déçu. Dès le premier slide j’ai failli m’étouffer. Regardez sur l’image la phrase “Adoption de Scrum avec un phasage RUP”. En fait ce n’est pas Adoption qu’il fallait noter mais plutôt Adaptation à mon avis. Alors oui RUP intègre la notion d’itération, mais c’est bien le seul point commun avec Scrum.&lt;/p&gt;

&lt;p&gt;Par contre je suis toujours fan de modélisation et reste convaincu que cela peut tout à fait s’intégrer dans une démarche agile. On peut même &lt;a href=&quot;http://www.net-liard.com/blog/2008/07/mda-agile/&quot;&gt;faire du MDA&lt;/a&gt; !  :)Sur ces points j’étais en phase avec IBM. Mais si on regarde de plus près RUP, comment gérer la douzaine de rôles différents définis par RUP en Scrum ? C’est juste impossible. Et quand IBM nous a dit que l’architecture de l’application présentée était gérée par des personnes ne faisant pas partie de l’équipe de dev, on sent bien que la notion de Team est encore loin.&lt;/p&gt;

&lt;p&gt;Avec tout ça je ne vous ai même pas parlé de Team Concert et de RSA, mais franchement là encore c’est vraiment intégrer Scrum dans un outil pour des raisons marketing. Comme si RSA n’était pas déjà assez lourd et lent, ils ont ajouté un mini Excel. Ca m’a un peu énervé, je n’insiste pas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IceScrum&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/04/icescrum-300x273.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;La dernière présentation va-t-elle sauver ma soirée ? Et bien oui ! Vincent Barrier va enfin faire une présentation “Scrum centrique”. La grosse différence c’est que Ice Scrum a été créé pour faire du Scrum contrairement aux deux autres ou Scrum a été intégré au chausse pied.&lt;/p&gt;

&lt;p&gt;Donc &lt;a href=&quot;http://www.icescrum.org&quot;&gt;IceScrum&lt;/a&gt; permet de faire du suivi de projet Agile en respectant toutes les phases et tous les rôles définis par Scrum. C’est un outil Open Source (GPL) disponible sous la forme d’un WAR. Je compte bien l’essayer rapidement pour l’utiliser sur nos projets.&lt;/p&gt;

&lt;p&gt;Avant IceScrum était géré par des étudiants encadrés par Claude Aubry, mais maintenant une société a été montée pour prendre en charge le développement. IceScrum Technologies va donc vendre support et évolutions spécifiques. Claude Aubry reste sur le projet en assurant le rôle de Product Owner du produit.&lt;/p&gt;

&lt;h2 id=&quot;bilan&quot;&gt;Bilan&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/04/cocktel-300x285.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ouf enfin à manger et à boire ! 😉&lt;/p&gt;

&lt;p&gt;Comme vous l’avez compris je n’ai pas été emballé par toutes les présentations. Il ne faut pas oublier que ce n’est pas grâce aux outils qu’un projet agile va réussir ou non. Vous pouvez avoir la plus belle table interactive connectée à un serveur qui génère des rapports dans tous les sens, ça vous fait une belle jambe si votre Product Owner n’est pas sérieux, que votre Scrum Master est un charlot ou que les membres de votre équipe n’arrivent pas à communiquer entre eux. Car c’est bien l’humain la clé de la réussite d’un projet agile.&lt;/p&gt;

&lt;p&gt;C’est moi ou tout le monde a oublié le manifeste agile ?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Personnes et interaction plutôt que processus et outils&lt;/li&gt;
  &lt;li&gt;Logiciel fonctionnel plutôt que documentation complète&lt;/li&gt;
  &lt;li&gt;Collaboration avec le client plutôt que négociation de contrat&lt;/li&gt;
  &lt;li&gt;Réagir au changement plutôt que suivre un plan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je répète : &lt;strong&gt;Personnes et interaction plutôt que processus et outils&lt;/strong&gt;. Alors oui c’est dur à entendre pour des éditeurs mais il va falloir s’y faire. Donc essayons déjà de construire des équipes agiles, de former nos Product Owner et nos Scrum Master et seulement après cela on pourra se poser la question des outils à utiliser.&lt;/p&gt;

&lt;p&gt;Après j’ai peut être simplement fait une erreur dans mes choix d’atelier. Sur les 12 disponibles j’ai participé aux trois qui parlaient d’outillage, ce n’était pas forcément très malin de ma part :)&lt;/p&gt;

&lt;p&gt;Liens :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://antoine.vernois.net/dotclear/index.php?post/2010/04/01/Soir%C3%A9e-anniversaire-du-Scrum-User-Group-France-30-mars-2010&amp;amp;pub=1#pr&quot;&gt;Résumé par Antoine&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blogs.msdn.com/agilefr/archive/2010/03/31/ouverture-avec-ken-schwaber-de-la-soir-e-anniversaire-du-french-scrum-user-group.aspx&quot;&gt;Vidéo de Ken Schwaber&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/jfjago/forfait-agile-fsug2010-3603611&quot;&gt;Sildes de l’atelier forfait Agile&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://brunosbille.com/?p=637&quot;&gt;Compte rendu de Bruno&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Version iPad non validée</title>
   <link href="https://liard.me/2010/04/version-ipad-non-validee/"/>
   <updated>2010-04-02T23:21:40+02:00</updated>
   <id>https://liard.me/2010/04/version-ipad-non-validee</id>
   <content type="html">&lt;div&gt;
  &lt;p&gt;
    Malgré tous mes efforts pour proposer une version iPad de iMovies Collection je n&amp;#8217;ai pas réussi à la faire valider par Apple. Le comble c&amp;#8217;est qu&amp;#8217;Apple m&amp;#8217;a informé que je n&amp;#8217;avais pas le droit d&amp;#8217;utiliser le mot &amp;#8220;iMovies&amp;#8221; dans le nom de l&amp;#8217;application.
  &lt;/p&gt;
  
  &lt;p&gt;
    En une semaine Apple m&amp;#8217;a fait trois retours. La première fois ils m&amp;#8217;ont signalé que le mot iMoves était réservé. Ils m&amp;#8217;ont aussi demandé d&amp;#8217;utiliser une popover à la place d&amp;#8217;une fenêtre modale. J&amp;#8217;ai changé pour une popover et je leur ai expliqué que le nom &amp;#8220;iMovies Collection&amp;#8221; avait été validé par leur service. Peine perdue, Apple a de nouveau refusé mon nom. Pire encore j&amp;#8217;ai reçu un email pour me demander de retirer mes applications iPhone de l&amp;#8217;AppStore à cause de leur nom. Un technicien d&amp;#8217;Apple a tout de même pris la peine de m&amp;#8217;appeler sur mon portable pour me l&amp;#8217;expliquer.
  &lt;/p&gt;
  
  &lt;p&gt;
    J&amp;#8217;ai passé ensuite deux nuits pour changer le nom de l&amp;#8217;application et relivrer l&amp;#8217;application iPad dans les temps. Malheureusement, il restait un bug au niveau du filtrage. Je n&amp;#8217;arrive toujours pas à comprendre puisque c&amp;#8217;est le même code que pour l&amp;#8217;iPhone. La requète SQL est bonne mais ça ne retourne pas les bons films. Apple a donc naturellement refusé l&amp;#8217;application.
  &lt;/p&gt;
  
  &lt;p&gt;
    Ce soir je suis donc dépité et fatigué, je finirai cette version iPad plus tard. Pour le moment la priorité c&amp;#8217;est de changer le nom de l&amp;#8217;application iPhone. &amp;#8220;iMovies Collection&amp;#8221; va devenir &amp;#8220;My Movies Rack&amp;#8221; (merci Benoit ;)).
  &lt;/p&gt;
&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Salon Display 2010</title>
   <link href="https://liard.me/2010/03/salon-display-2010/"/>
   <updated>2010-04-01T01:10:30+02:00</updated>
   <id>https://liard.me/2010/03/salon-display-2010</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/03/logo-display10.gif&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Comme je travaille en ce moment sur un projet avec de la 3D, le salon Display m’a attiré pour une conférence sur l’évolution des technos 3D et la réalité augmentée.&lt;/p&gt;

&lt;p&gt;Par contre je pensais voir des exposants avec des écrans 3D de fou et bien, perdu. En fait ce salon fait partie d’une plus grande manifestation “les salons solutions électroniques”. Et en effet c’était très très électronique. Il y avait bien des écrans mais plus pour de l’embarqué et aucun avec de la 3D :(&lt;/p&gt;

&lt;p&gt;Par contre la présentation était assez intéressante.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Normalement il devait y avoir trois intervenants, mais Luc Saint-Elie de Panasonic ne s’est pas déplacé.&lt;/p&gt;

&lt;p&gt;C’est Teyssou directeur associé de &lt;a href=&quot;http://www.beinrelief.fr/&quot;&gt;Be in relief&lt;/a&gt; qui commence par nous expliquer les différentes techniques pour faire de la 3D avec ou sans lunette. Pour lui pour le moment la mise en place de 3D sans lunette est beaucoup trop chère ce qui bloque sa généralisation. Par contre les technos avec lunettes actives sont vraiment au point et les constructeurs vont lancer les premiers écrans 3D avant l’été.&lt;/p&gt;

&lt;p&gt;Il nous a fait deux démos. La première avec de la 3D “holografique”, basée sur un écran qui reflète sur trois faces de pyramide comme sur la vidéo suivante :&lt;/p&gt;

&lt;p&gt;Même si le principe est simple, c’est assez bluffant à voir.&lt;/p&gt;

&lt;p&gt;La seconde démo était une vidéo 3D sur un iPhone. Là c’est plus dur de vous montrer le résultat avec une vidéo. Le principe est de poser un filtre sur l’écran de l’iPhone pour avoir un rendu 3D sur un film adapté. Le rendu était assez bon, mais ce n’était pas transcendant.&lt;/p&gt;

&lt;p&gt;C’est ensuite au tour de Maurice Benayoun directeur artistique du &lt;a href=&quot;http://citu-paragraphe.fr/&quot;&gt;laboratoire CITU&lt;/a&gt; (Création interactive Transdisciplinaire Universitaire) de prendre la parole.&lt;/p&gt;

&lt;p&gt;Sa spécialité c’est la réalité augmentée et plus particulièrement sur le thème de la ville numérique. Il va nous présenter trois projets sur ce sujet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Projet TerraNumerica&lt;/strong&gt; en partenariat avec entre autres Thales et l’IGN.&lt;/p&gt;

&lt;p&gt;Ils ont numérisé la ville de Paris pour organiser des visites en 3D.&lt;/p&gt;

&lt;p&gt;Cette base a permis de réaliser le second projet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le téléscope réalité augmentée&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;L’objectif est de remplacer les gros téléscopes où il faut mettre 1 euro pour admirer un point de vue par des téléscopes numériques qui ajouteraient des informations sur l’image (par exemple pour localiser des points clés). On peut même imaginer d’y afficher le lieu regardé à une autre époque et constater l’évolution du lieu. Une très bonne application de la réalité augmentée donc.&lt;/p&gt;

&lt;p&gt;Enfin le &lt;strong&gt;projet TerraDynamica&lt;/strong&gt; intégrera aussi les personnes dans la réalité augmentée et pas seulement les bâtiments.&lt;/p&gt;

&lt;p&gt;Pour conclure, même s’il n’y a pas de doute que la 3D va évoluer rapidement, on ne peut que regretter le manque cruel de contenu pour le moment.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>En avant pour l&apos;iPad</title>
   <link href="https://liard.me/2010/03/en-avant-pour-lipad/"/>
   <updated>2010-03-23T22:05:46+01:00</updated>
   <id>https://liard.me/2010/03/en-avant-pour-lipad</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/03/ipad.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Apple a envoyé un email aux développeurs iPhone samedi pour nous signaler qu’il est maintenant possible de proposer des applications iPad. De plus si l’application est publiée avant le 27 Mars elle a une chance d’être présente à la sortie de l’iPad.&lt;/p&gt;

&lt;p&gt;Le problème c’est que pour le moment il faut se contenter du simulateur pour développer. Donc l’équipe d’Apple s’occupe de tester votre application sur un iPad pour vous faire des commentaires.&lt;/p&gt;

&lt;p&gt;Du coup, pour tester, j’ai réalisé une version de iMovies Collection pour iPad :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/03/screen1.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ce n’est pas si trivial que ça. J’ai du refaire toutes les vues mais aucun changement dans mes contrôleurs (merci le MVC !).&lt;/p&gt;

&lt;p&gt;Pour découvrir un peu les nouvelles fonctionnalités de l’iPad j’ai utilisé une “Slipe View” et j’ai changé la page de configuration par une petite vue modale. Le plus dur à gérer c’est le changement d’orientation de l’iPad mais grâce à la “Slipe View” c’est géré automatiquement. Par contre le simulateur est encore truffé de bugs surtout au niveau des changements d’orientation. Du coup on développe un peu à l’aveugle, l’équipe d’Apple s’engage à faire des tests sur un “vrai” iPad mais il risque d’y avoir beaucoup de bugs sur la plupart des applications iPad à sa sortie.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Anniversaire du Scrum User Group</title>
   <link href="https://liard.me/2010/03/anniversaire-du-scrum-user-group/"/>
   <updated>2010-03-10T22:54:00+01:00</updated>
   <id>https://liard.me/2010/03/anniversaire-du-scrum-user-group</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/03/text.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le Mardi 30 Mars le Scrum User Group fête son premier anniversaire dans les locaux de Microsoft à Issy-Les-Moulineaux.&lt;/p&gt;

&lt;p&gt;Plus d’informations sur &lt;a href=&quot;http://www.SpeSend.net/SpeClicks.aspx?X=2R0T1UXHHVAKFZFW00YBWZ&quot;&gt;ce lien&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Comme je suis justement sur Paris à ce moment là, je vais en profiter pour y participer :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Premier bilan pour iMovies Collection</title>
   <link href="https://liard.me/2010/02/premier-bilan-pour-imovies-collection/"/>
   <updated>2010-02-15T23:46:10+01:00</updated>
   <id>https://liard.me/2010/02/premier-bilan-pour-imovies-collection</id>
   <content type="html">&lt;p&gt;Cela fait maintenant un peu plus d’un mois que l’application iMovies Collection est en ligne, je vais donc vous faire un premier petit bilan.&lt;/p&gt;

&lt;h3 id=&quot;début-difficile&quot;&gt;Début difficile&lt;/h3&gt;

&lt;p&gt;Première bonne surprise, l’application a été validée du premier coup et en trois jours. Ca été même un peu trop rapide, la FAQ et la doc sur le site n’étaient pas prètes. J’avais aussi laissé un gros bug. Même si je l’ai corrigé directement et que Apple l’a validé dans la journée, cela a quand même nuit à l’image de l’application. :(&lt;/p&gt;

&lt;h3 id=&quot;version-lite&quot;&gt;Version Lite&lt;/h3&gt;

&lt;p&gt;Après deux commentaires de personnes n’arrivant pas à faire fonctionner l’application, j’ai réalisé une version “Lite” gratuite de iMovies (limitée à 20 films). L’idée était à la fois de montrer que l’application fonctionnait mais aussi d’aider les indécis. Au même moment j’ai augmenté le prix de l’application de $0,99 à $1,99.&lt;/p&gt;

&lt;h3 id=&quot;evolution-rapide&quot;&gt;Evolution rapide&lt;/h3&gt;

&lt;p&gt;Après deux semaines de discussions avec les utilisateurs j’ai ajouté des fonctionnalités et optimisé le temps de chargement de l’application pour publier la version 1.1.0. Mine de rien j’ai passé beaucoup de temps à répondre aux questions par email et sur les forums.&lt;/p&gt;

&lt;h3 id=&quot;premier-paiement&quot;&gt;Premier paiement&lt;/h3&gt;

&lt;p&gt;Alors tout est relatif bien-sûr mais je suis assez content, j’ai plus de 400 téléchargements ce qui fait à peu près 400 Euros. Maintenant c’est assez stable j’ai autour de 12 achats par jour. La première bonne nouvelle c’est que je vais au moins rembourser mes frais. Ensuite je pensais bêtement recevoir un virement de 400 € d’Apple, en fait c’est pas si simple. Déjà il faut avoir plus de 150$ pour être payé et je pensais répondre facilement au critère, en fait il faut 150$ par zone monétaire :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/02/pays.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Et là c’est moins drôle. Pour le moment j’ai eu deux achats au Japon, va falloir encore pas mal de temps pour arriver à 150$. Heureusement le plus gros des achats a été fait aux USA et en Europe, j’ai donc reçu 116 Euros pour le mois de Janvier en Europe. Mais pour le moment si on cumule Canada, Angleterre, Japon, Australie et “le reste du monde” on arrive quand même à 120$. A la lecture de forum, Apple doit payer ces “petites sommes” en fin d’année (si le montant par zone est supérieur aux frais de virement bien-sûr).&lt;/p&gt;

&lt;h3 id=&quot;bilan&quot;&gt;Bilan&lt;/h3&gt;

&lt;p&gt;Je retiens donc plusieurs leçons :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Peaufiner un maximum votre première version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les nouvelles applications sont mises en avant sur l’AppStore il faut donc en profiter un maximum. Comme vos premières notes sont assez déterminantes il faut donc proposer une application bien faite.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Mettre l’accent sur l’ergonomie&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si l’utilisateur n’arrive pas à faire fonctionner l’application en 2 minutes, l’application est jetée. Et c’est justement au moment où on supprime l’application qu’Apple propose de la noter. N’oubliez pas non plus qu’il est impossible de répondre aux mauvaises critiques, et ça c’est très frustrant.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Proposer une version gratuite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tester l’application avant de l’acheter c’est vraiment important pour l’utilisateur.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Bien choisir son prix&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il y a beaucoup d’applications complètement creuses à 1$, mettre son application un peu plus chère peut montrer qu’elle a plus de contenu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Peut-on vendre du vent sur l&apos;AppStrore ?</title>
   <link href="https://liard.me/2010/02/peut-on-vendre-du-vent-sur-lappstrore/"/>
   <updated>2010-02-11T22:40:03+01:00</updated>
   <id>https://liard.me/2010/02/peut-on-vendre-du-vent-sur-lappstrore</id>
   <content type="html">&lt;p&gt;Suite à la publication de &lt;a href=&quot;http://www.net-liard.com/blog/2010/01/imovies-collection-publie/&quot;&gt;iMovies Collection&lt;/a&gt; sur l’AppStore, j’ai eu envie de réaliser une petite expérience. Je voulais savoir si grâce au volume important d’iPhone il était possible de vendre facilement une application pratiquement vide à 1$. J’ai donc cherché une idée la plus simple possible et avec très peu de développement. Ensuite je l’ai réalisée en 1h chrono un Dimanche après midi sur mon canapé.&lt;/p&gt;

&lt;p&gt;L’idée est simple : afficher des photos de chatons.&lt;/p&gt;

&lt;p&gt;J’ai donc trouvé sur le net des photos libres de droits pour ensuite les afficher sur l’iPhone. Pour faire un peu moins vide, j’ai ajouté un son de miaulement   :)Adorables Chatons est donc sorti le 27 Janvier sur l’AppStore !&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;itms://itunes.apple.com/us/app/adorables-chatons/id352275799?mt=8&quot;&gt;&lt;img src=&quot;/images/uploads/2010/02/icon.png&quot; alt=&quot;photo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Et bien la réponse est simple : non ça ne se vend pas.
&lt;/p&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Même si j&amp;#8217;ai eu un pic de 16 ventes le premier jour ça s&amp;#8217;est très vite arrêté. J&amp;#8217;en ai vendu pour le moment 29.
&lt;/p&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Alors bien-sûr il ne faut peut-être pas généraliser et il y a peut-être de meilleures idées aussi simples qui se vendent, mais à mon avis pour cela il me manquait deux choses importantes
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Une application plus fun&lt;/li&gt;
  &lt;li&gt;Un gros buzz au lancement&lt;/li&gt;
&lt;/ul&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Pour compléter cette expérience j&amp;#8217;ai eu envie de tester l&amp;#8217;affichage de publicité sur iPhone. J&amp;#8217;ai donc ajouté un bandeau &lt;a href=&quot;http://www.admob.com&quot;&gt;admob&lt;/a&gt; sous les chatons pour réaliser une version gratuite de &amp;#8220;Adorables chatons&amp;#8221;
&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/02/icon1.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Là, bien-sûr, j&amp;#8217;ai eu beaucoup plus de téléchargements (857 en une semaine). Ce qui a généré 2376 demandes de publicité pour 1894 affichages. Je ne sais pas pourquoi mais de temps en temps la pub ne s&amp;#8217;affiche pas lorsqu&amp;#8217;on lance l&amp;#8217;application, ce qui explique la différence entre ces deux chiffres. Il y a eu 259 clics sur la pub ce qui a généré un revenu de $8,20. Quand on sait que c&amp;#8217;est sur la première semaine qu&amp;#8217;il y a le plus de téléchargements, j&amp;#8217;ai peu de risque de payer l&amp;#8217;ISF cette année 😉
&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/02/admob-300x128.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Mais là aussi ce n&amp;#8217;est peut-être pas l&amp;#8217;application idéale pour générer des revenus publicitaires. En effet on a pas forcement envie de lancer très souvent une application qui affiche toujours les mêmes images.
&lt;/p&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Voilà pour mes premiers tests sur l&amp;#8217;appStore, je prépare un article pour vous faire un premier bilan sur iMovies Collection.
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>iMovies Collection publié !</title>
   <link href="https://liard.me/2010/01/imovies-collection-publie/"/>
   <updated>2010-01-10T23:41:21+01:00</updated>
   <id>https://liard.me/2010/01/imovies-collection-publie</id>
   <content type="html">&lt;p&gt;Voila c’est fait, Apple a validé mon application. Vendredi à 22h34 j’ai reçu un mail pour me prévenir que l’application était “Ready for Sale” :)&lt;/p&gt;

&lt;p&gt;Ca a été trés rapide :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/01/date1.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Dès le samedi matin j’avais un email d’un client pour me signaler un bug :(&lt;/p&gt;

&lt;p&gt;Mon premier utilisateur est un américain qui a une collection de 1500 films. Mon application n’a pas tenu la charge. En fait j’ai fait une grosse erreur de gestion de mémoire, ça divergeait. Le pire c’est que j’avais mis en place une boucle pour nettoyer la mémoire régulièrement. Mais j’ai bêtement oublié de remettre le compteur à zéro à chaque passage. L’erreur classique de débutant, j’ai honte.&lt;/p&gt;

&lt;p&gt;Cette erreur met aussi en évidence que Apple ne teste pas les applications en profondeur. Bref, j’ai passé mon week-end à préparer une nouvelle version pour corriger ce problème.&lt;/p&gt;

&lt;p&gt;Ce qui est amusant c’est que j’ai déjà eu 23 téléchargements en une journée, sans aucune publicité : 13 aux USA, 3 en Allemagne, 3 en France (merci la famille  :)), 2 en Norvège, 1 en Angleterre et 1 en Italie. En 2 jours j’ai eu 3 emails pour des renseignements. C’est impressionnant comment la publication sur l’App Store entraine une si grande visibilité.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Etape 3 : publier l&apos;application</title>
   <link href="https://liard.me/2010/01/etape-3-publier-lapplication/"/>
   <updated>2010-01-08T13:00:59+01:00</updated>
   <id>https://liard.me/2010/01/etape-3-publier-lapplication</id>
   <content type="html">&lt;p&gt;Voilà, j’ai une application qui fonctionne, un beau site web, il est temps de passer à la phase importante : publier l’application.&lt;/p&gt;

&lt;p&gt;Dans un premier temps il faut rejoindre le “iPhone developer programme” pour obtenir un certificat Apple.&lt;/p&gt;

&lt;p&gt;C’est ce certificat qui vous permet aussi de tester l’application sur un vrai iPhone. Avant de payer vous avez accès au SDK et au simulateur iPhone. Le SDK est gratuit, mais ne fonctionne que sur Mac bien-sûr.&lt;/p&gt;

&lt;p&gt;J’ai donc payé 79 Euros pour avoir le droit pendant 1 an de développer sur iPhone. Une fois la commande passée il faut compter maxi 24 heures pour que votre compte soit activé.&lt;/p&gt;

&lt;p&gt;Une fois dans le programme vous avez accès à un site web où vous pouvez déclarer vos applications et les UDID de vos iPhones de tests. C’est assez complet mais Apple fournit une très bonne documentation, je ne vais donc pas ré-expliquer la démarche en détail.&lt;/p&gt;

&lt;p&gt;J’ai mis un peu de temps au début pour déclarer mon certificat de développement. Les échanges de clé publique/clé privée c’est un peu long. Pour la petite histoire j’ai cherché longtemps l’application “Keychain” sur mon Mac. Et oui sur un Mac français l’application se nomme “Trousseau d’accès”.&lt;/p&gt;

&lt;p&gt;Une fois le certificat bien installé, mon application déclarée et la configuration d’un fichier de provisionning faite, j’ai pu tester iMovies Collection sur mon iPhone.&lt;/p&gt;

&lt;p&gt;Passons maintenant aux choses sérieuses, la déclaration dans l’appStore.&lt;/p&gt;

&lt;p&gt;Déjà il faut créer un nouveau certificat et un provisionning spécifique pour l’application à diffuser.&lt;/p&gt;

&lt;p&gt;Ensuite on passe sur une nouvelle interface : iTunes Connect. C’est dans celle-ci que l’on propose nos applications pour diffusion.&lt;/p&gt;

&lt;p&gt;Première chose importante : &lt;strong&gt;Attention à votre première déclaration !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En effet au moment de proposer votre première application on vous demande le langage principal et le nom de l’auteur. Une fois validé c’est définitif ! Ces informations seront utilisées pour toutes vos applications.&lt;/p&gt;

&lt;p&gt;Par exemple j’ai fait l’erreur de choisir French comme langue de base. Et bien je dois copier / coller la description de mon application en Anglais dans toutes les langues gérées par Apple… Si j’avais déclaré Anglais comme langue de base je n’aurais eu qu’à définir une description spécifique en Français.&lt;/p&gt;

&lt;p&gt;Bref j’ai du remplir 16 formulaires :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;English&lt;/li&gt;
  &lt;li&gt;Dutch&lt;/li&gt;
  &lt;li&gt;Australian English&lt;/li&gt;
  &lt;li&gt;Canadian English&lt;/li&gt;
  &lt;li&gt;UK English&lt;/li&gt;
  &lt;li&gt;German&lt;/li&gt;
  &lt;li&gt;Italian&lt;/li&gt;
  &lt;li&gt;Japanese&lt;/li&gt;
  &lt;li&gt;Korean&lt;/li&gt;
  &lt;li&gt;Portuguese&lt;/li&gt;
  &lt;li&gt;Russian&lt;/li&gt;
  &lt;li&gt;Simplified Chinese&lt;/li&gt;
  &lt;li&gt;Spanish&lt;/li&gt;
  &lt;li&gt;Mexican&lt;/li&gt;
  &lt;li&gt;Spanish&lt;/li&gt;
  &lt;li&gt;Swedish&lt;/li&gt;
  &lt;li&gt;Brazilian&lt;/li&gt;
  &lt;li&gt;Portuguese&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Attention aussi à la case “Keywords”, une fois le formulaire validé et même si vous n’avez pas encore uploadé votre binaire, il n’est plus possible de les changer avec une nouvelle livraison. Sur les autres langues vous pouvez mais pas sur la langue principale. C’est quand même étonnant pour un site Apple, marque connue et reconnue pour son ergonomie. Au niveau du site iTunes Connect je trouve ça très moyen.&lt;/p&gt;

&lt;p&gt;Sinon pour le reste de la déclaration rien de bien compliqué, là aussi c’est bien documenté.&lt;/p&gt;

&lt;p&gt;Comme j’ai décidé de vendre 1$ l’application je dois remplir des informations sur mon compte bancaire. J’ai perdu beaucoup de temps pour trouver le bon formulaire. En fait je l’avais trouvé dès le début mais mon navigateur Google Chrome ne savait pas le gérer. Une fois passé sur Safari, je n’ai plus eu de problème.&lt;/p&gt;

&lt;p&gt;Voilà c’est fait, mon application est en cours de validation. Histoire à suivre donc :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Etape 2 : iMovies collection</title>
   <link href="https://liard.me/2010/01/imoviescollection/"/>
   <updated>2010-01-07T19:40:36+01:00</updated>
   <id>https://liard.me/2010/01/imoviescollection</id>
   <content type="html">&lt;p&gt;Avant d’entrer dans le détail du process de publication Apple regardons par quoi il faut commencer.&lt;/p&gt;

&lt;h2 id=&quot;1--trouver-un-nom&quot;&gt;1 – Trouver un nom&lt;/h2&gt;

&lt;p&gt;La première chose est en effet de trouver un nom à cette application. Et pour ça je ne suis vraiment pas très doué. Mais comme je n’ai pas les moyens de faire appel à une boîte de comm, on va faire avec mes petits moyens.&lt;/p&gt;

&lt;p&gt;Après plusieurs heures à tourner autour des idées : DVD, film, collection… J’ai fini par choisir le nom : iMovies Collection. (i pour iPhone bien sur)&lt;/p&gt;

&lt;h2 id=&quot;2--acheter-un-domaine&quot;&gt;2 – Acheter un domaine&lt;/h2&gt;

&lt;p&gt;Une fois le nom trouvé, il faut acheter un nom de domaine pour y mettre un petit site web. J’ai donc réservé le domaine imoviescollection.com.&lt;/p&gt;

&lt;p&gt;J’ai ensuite acheté une offre d’hébergement mutualisé chez OVH (la pro). C’est ma première dépense concrète : 71 Euros&lt;/p&gt;

&lt;h2 id=&quot;3--faire-un-site&quot;&gt;3 – Faire un site&lt;/h2&gt;

&lt;p&gt;C’est quand même dingue de pouvoir mettre en place des architectures JEE très complexes et de ne pas être capable de réaliser un beau site en HTLM. C’est pourtant mon cas. J’ai toujours été tres mauvais pour faire de belles IHM. D’un autre coté c’est plus le travail d’un designer que d’un architecte JEE, chacun son job :)&lt;/p&gt;

&lt;p&gt;Heureusement j’ai trouvé un outil super bien fait : &lt;a href=&quot;http://www.webacappella.fr/&quot;&gt;WebAcapella&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Grâce à lui j’ai pu réaliser &lt;a href=&quot;http://www.imoviescollection.com/&quot;&gt;un site pas trop mal&lt;/a&gt;. Par contre j’ai du l’acheter 49 Euros. Encore une dépense de plus.&lt;/p&gt;

&lt;p&gt;Voilà pour le début de l’histoire. Reste à proposer l’application à Apple, j’y consacrerai un post entier car c’est un peu long :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Application iPhone, étape 1 : l&apos;idée</title>
   <link href="https://liard.me/2010/01/application-iphone-idee/"/>
   <updated>2010-01-06T22:35:45+01:00</updated>
   <id>https://liard.me/2010/01/application-iphone-idee</id>
   <content type="html">&lt;p&gt;Comme je vous l’annonçais dans le dernier post, j’ai envie d’essayer de développer une application iPhone et de la vendre sur l’appStore.&lt;/p&gt;

&lt;p&gt;L’idée est simple, je souhaite pouvoir consulter ma collection de DVD/Blue-Ray n’importe où. Ca peut être pratique pour la partager avec des amis ou pour préparer une soirée video.&lt;/p&gt;

&lt;p&gt;Pour gérer ma collection j’utilise le logiciel DVDProfiler sur PC. J’entre le nom d’un DVD ou juste son code barre et il me retrouve une description détaillée du film (images, acteurs, genre etc… ). DVDProfiler permet d’exporter ma liste de DVD sur un site web. Vous pouvez la trouver sur l’adresse :&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.invelos.com/dvdcollection.aspx/samuel22&quot;&gt;http://www.invelos.com/dvdcollection.aspx/samuel22&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;J’ai donc décidé de m’appuyer sur ces informations pour construire une application iPhone. Pas besoin de saisir sa collection dans son iPhone, on va utiliser le site pour la récupérer.&lt;/p&gt;

&lt;p&gt;Comme j’ai envie de vendre l’application il faut cibler un public plus large et si possible aux USA. J’ai donc cherché d’autres sites ou l’on peut déclarer sa collection de DVD. Le site &lt;a href=&quot;http://www.imdb.com&quot;&gt;imdb&lt;/a&gt; est une des plus grosses bases de films et on peut justement y enregistrer ses films. J’ai fait un exemple avec l’adresse :&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.imdb.com/mymovies/list?l=43766809&quot;&gt;http://www.imdb.com/mymovies/list?l=43766809&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voilà ce que ça donne :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/01/config2-156x300.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;C’est l’écran pour configurer son compte et faire le lien entre votre collection et l’application iPhone.&lt;/p&gt;

&lt;p&gt;Ensuite, après l’import, on peut afficher une liste de sa collection et le détail d’un film :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/01/liste-200x300.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Pour ajouter un petit côté “communautaire” j’ai aussi eu l’idée de faire un lien avec Facebook pour poster sur son mur son avis sur un film.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2010/01/facebook1.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;
  &lt;p&gt;
    L&amp;#8217;application est donc maintenant développée et dans les prochains posts je vous décrirai les différentes étapes que j&amp;#8217;ai réalisées pour publier cette application sur l&amp;#8217;appStore.
  &lt;/p&gt;
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>J&apos;ai switch !</title>
   <link href="https://liard.me/2009/12/j-ai-switch/"/>
   <updated>2009-12-15T01:01:09+01:00</updated>
   <id>https://liard.me/2009/12/j-ai-switch</id>
   <content type="html">&lt;p&gt;C’est fait je suis passé au MAC :)&lt;/p&gt;

&lt;p&gt;Après plus de 15 ans d’utilisation de PC je découvre le monde Mac avec un beau Mac Book pro. En fait c’est mon second Mac puisque dans les années 90 j’avais eu un Apple IIc, mais bon ça ne compte pas.&lt;/p&gt;

&lt;p&gt;Alors que dire sur cette belle bête ? Et bien pas de scoop, c’est bien très agréable à utiliser. Plusieurs exemples d’éléments super agréables :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Configuration du proxy en fonction du type de réseau&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Au bureau je suis connecté en ethernet via un proxy alors que chez moi j’utilise le Wifi en direct. Et bien, avec mon PC je dois changer ma config à chaque fois&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Réglage du son séparé pour les HP et le casque&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus de problème de son à fond au moment ou je débranche mon casque.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Mise en veille simple et très rapide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;J’ouvre mon écran et 10 secondes après je peux bosser. Fini les 15 minutes d’attentes au démarrage de mon PC.&lt;/p&gt;

&lt;p&gt;Et je ne parle pas du &lt;span&gt;trackpad&lt;/span&gt; Multi-Touch, un bonheur pour scroller les pages web. Par contre j’ai perdu 10 minutes à chercher les touches [ et { sur le clavier (pour un développeur ça peut servir…). Donc ne les cherchez pas elles ne sont pas notées sur le clavier, il faut faire SHIFT+ALT+(, faut le savoir…&lt;/p&gt;

&lt;p&gt;Mais pourquoi être passé d’un coup sur MAC ?? La raison est très simple, j’ai commencé à développer sur iPhone en Septembre. Et pour le moment il n’est possible de le faire qu’avec XCode sous Mac.&lt;/p&gt;

&lt;p&gt;C’est aussi la raison du calme sur ce blog, depuis Septembre je bosse beaucoup sur des protos iPhone sur la relation client pour mon employeur, et le soir je perfectionne mon code sur des projets perso. Je compte aller bientôt proposer une application sur l’apple store. J’ai en fait envie de partager et de gérer ma collection de DVD/blueRay sur mon iPhone. Mais je ferai des articles sur le blog pour présenter l’application et décrire les différentes étapes.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Résultat trophées innovation d&apos;OBS</title>
   <link href="https://liard.me/2009/10/resultat-trophees-innovation-dobs/"/>
   <updated>2009-10-23T17:32:23+02:00</updated>
   <id>https://liard.me/2009/10/resultat-trophees-innovation-dobs</id>
   <content type="html">&lt;p&gt;Je viens de trouver sur le web les résultats du trophées de l’innovation du Syntec et d’Orange Business Services. Et quelle ne fut pas ma surprise de découvrir le coup de coeur du jury : le site GeoFamily. Ca ressemble beaucoup au service AreUThere que j’avais réalisé 😉 Ce n’est donc pas forcement super “innovant” puisque j’ai fait le site il y a un an.&lt;/p&gt;

&lt;p&gt;J’avais même proposé plus de services, mais Webtiss a réussit à sortir un vrai service. AreUThere est resté à l’étape de proto, je n’ai pas eu les épaules pour industrialiser l’idée. Dommage.&lt;/p&gt;

&lt;p&gt;C’est aussi assez frustrant de voir OBS remettre ce prix alors que j’ai essayé de pousser cette idée de service dans le groupe. C’est la dure vie de la R&amp;amp;D, il faut qu’un concurrent sorte le service pour que nos responsables trouvent notre idée interessantes :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dreamcast to Jamma : la video</title>
   <link href="https://liard.me/2009/09/dreamcast-to-jamma-la-video/"/>
   <updated>2009-09-07T10:15:23+02:00</updated>
   <id>https://liard.me/2009/09/dreamcast-to-jamma-la-video</id>
   <content type="html">&lt;p&gt;Comme je l’ai noté dans l’article précédent, je compte retaper une borne d’arcade. Dans un premier temps j’ai envie d’utiliser ma vieille Dreamcast qui prenait la poussière dans cette borne. Et bien croyez moi, on est loin du plug and play !&lt;/p&gt;

&lt;p&gt;Je débarque un peu dans ce monde et il y a pas mal de choses à connaitre.&lt;/p&gt;

&lt;h2 id=&quot;le-port-jamma&quot;&gt;Le port Jamma&lt;/h2&gt;

&lt;p&gt;&lt;img class=&quot;aligncenter&quot; title=&quot;jamma&quot; src=&quot;http://farm3.static.flickr.com/2590/3887595296_f0b61d6317_m.jpg&quot; alt=&quot;&quot; width=&quot;240&quot; height=&quot;180&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Au milieu des années 80 les constructeurs ont eu la bonne idée de normaliser les branchements de leurs bornes. Grâce à ça un jeu avec un connecteur Jamma peut être utilisé dans toutes les bornes compatibles. Dans une borne, ce connecteur Jamma est relié au panel (manettes et boutons), à l’ecran, au haut parleur et à une alimentation fournissant du +5V, -5V et 12V. C’est un peu comme si on avait regroupé les ports VGA, PS2 et l’alim ATX sur un seul connecteur.&lt;/p&gt;

&lt;h2 id=&quot;les-pcb&quot;&gt;Les PCB&lt;/h2&gt;

&lt;p style=&quot;text-align: center;&quot;&gt;
  &lt;img class=&quot;aligncenter&quot; title=&quot;pcb&quot; src=&quot;http://farm3.static.flickr.com/2622/3838709143_f5630b9b49_m.jpg&quot; alt=&quot;&quot; width=&quot;240&quot; height=&quot;180&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;Printed Circuit Board, c’est la plaque électronique qui contient un jeu, les plus répandues se plug  dans le port Jamma. Elle rassemble CPU, mémoire ROM avec le code du jeu et mémoire RAM. Il y a même un petit espace de stockage pour sauvegarder les meilleurs scores, en général une EEPROM.&lt;/p&gt;

&lt;p&gt;Ma borne est compatible Jamma et j’ai deux jeux en PCB, un tetris et World Cup 90. C’est pas les meilleurs jeux, mais si je veux en mettre d’autres il faut trouver les PCB. C’est pas forcément évident à trouver si on cherche un jeu précis et ça peut valoir cher (entre 50 et 150 Euros).&lt;/p&gt;

&lt;p&gt;En lisant les forums j’ai découvert que beaucoup branchaient leur dreamcast dans leur borne. C’est plus simple pour trouver des jeux. Et là, coup de chance, j’ai justement une dreamcast dans un carton au garage. Je me décide donc à la brancher dans la borne.&lt;/p&gt;

&lt;p&gt;Premier objectif, afficher le jeu sur l’écran de la borne d’arcade. Il faut donc convertir le signal vidéo de la péritel pour le mettre sur le connecteur Jamma. La bonne nouvelle c’est que la dreamcast sort la vidéo en RGB ce qui est justement la norme Jamma. Mais il y a un hic (et oui trop simple sinon) il faut un signal de synchro vidéo qui n’est pas sur la péritel. Heureusement il est possible de le reconstruire à partir du signal de vidéo composite à l’aide d’un petit montage électronique.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/09/circuit1.gif&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Un petit CI, deux condos et une résistance, ça ne me paraissait pas bien sorcier. Je ressors donc mon fer à souder pour la réaliser. La dernière fois que j’ai soudé des composants c’était chez Bull à Angers dans l’équipe de diagnostic/réparation de carte mère de PC en 1997 (douze ans deja !). A la base j’ai quand même un DUT d’électronique, ça peut servir :)&lt;/p&gt;

&lt;p&gt;Une fois cablé, je place ce montage entre la péritel Dreamcast et le port Jamma. La première fois j’ai encore un problème de synchro verticale. Aprés avoir cherché sur des forums, on a fini par m’aider à trouver un potentiomètre de règlage de l’écran et comme par magie l’image se stabilise !&lt;/p&gt;

&lt;p&gt;Même stable l’image était super sombre. Le problème c’est que les télévisions intègrent un ampli vidéo que la borne d’arcade n’a pas. Le signal en sortie de la Dreamcast est donc trop faible. Encore une fois grâce aux sites spécialisés dans l’arcade je trouve un schéma d’ampli.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/09/vamp.gif&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Bon là c’est un peu plus costaud quand même. Premier problème, il faut utiliser deux transistors BC108B et BC178B, impossible d’en trouver chez les revendeurs. Il faut donc chercher encore une fois sur les forums pour savoir que l’on peut les remplacer par des BC548B et BC558B. Une fois les composants réunis, j’ai utilisé une platine d’essai pour tester le montage une première fois. Vous savez les plaques blanches dans lesquelles on peut piquer des composants. Ca évite d’avoir à les souder pour un premier essai. Et là par chance ça marche du premier coup ! Il faut donc refaire le circuit sur une plaque adéquate. Le schéma noté plus haut ne me convient pas. Déjà la plaque que j’ai achetée est moins large, je ne peux pas mettre les trois amplis alignés. L’espace laissé pour les résistances est beaucoup trop faible, il faut au moins 1 cm pour en placer une correctement. Et pour finir j’aimerais bien avoir le LM1881 sur la même plaque. J’ai donc réalisé un nouveau schéma.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/09/plaque.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Une fois les composants soudés ça donne cela :&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;aligncenter&quot; title=&quot;plaque&quot; src=&quot;http://farm3.static.flickr.com/2588/3890593366_a740afcf2f_m.jpg&quot; alt=&quot;&quot; width=&quot;180&quot; height=&quot;240&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Et voilà je peux jouer à la Dreamcast sur l’écran de la borne d’arcade ! La prochaine étape est de pouvoir utiliser les joysticks de la borne à la place des manettes et d’y mettre le son.&lt;/p&gt;

&lt;p&gt;Les sites que j’ai utilisés :&lt;/p&gt;

&lt;p&gt;Le site avec tous les montages : &lt;a href=&quot;http://pc2jamma.mameworld.info/hardware.html&quot;&gt;mameWorld&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Un bon tutoriel en francais : &lt;a href=&quot;http://www.gamoover.net/tuto/brancher-une-dreamcast-dans-une-borne-video-son-controles&quot;&gt;tuto&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;un forum bien pratique : &lt;a href=&quot;http://www.gamoover.net/Forums/index.php&quot;&gt;gameoover&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>C&apos;est la rentrée</title>
   <link href="https://liard.me/2009/09/cest-la-rentree/"/>
   <updated>2009-09-04T01:35:34+02:00</updated>
   <id>https://liard.me/2009/09/cest-la-rentree</id>
   <content type="html">&lt;p&gt;Même pour les blogs il est temps de se remettre au travail :)&lt;/p&gt;

&lt;p&gt;C’est aussi pour moi une vraie rentrée puisque j’ai changé d’équipe le 1er septembre. Nouveaux collègues, nouvelles activités, nouveau bureau.. Comme pour un gamin. Je ne travaille donc plus dans le domaine du Machine To Machine mais dans celui de la relation client. Un gros changement et j’espère y trouver autant de challenges techniques pour pouvoir les partager sur ce blog.&lt;/p&gt;

&lt;p&gt;A propos de challenge, j’ai acheter récemment une borne d’arcade :&lt;/p&gt;

&lt;div class=&quot;mceTemp&quot;&gt;
  &lt;dl class=&quot;wp-caption alignnone&quot; style=&quot;width: 190px;&quot;&gt;
    &lt;dt class=&quot;wp-caption-dt&quot;&gt;
      &lt;img title=&quot;arcade&quot; src=&quot;http://farm3.static.flickr.com/2618/3838701053_2164abf39e_m.jpg&quot; alt=&quot;arcade&quot; width=&quot;180&quot; height=&quot;240&quot; /&gt;
    &lt;/dt&gt;
  &lt;/dl&gt;
&lt;/div&gt;

&lt;p&gt;Elle est en bonne état, il y a meme un vrai monnayeur en franc !  Mais comme je compte brancher une dreamcast et un PC dessus, j’ai ressorti mon fer à souder ! Donc vous risquez de voir passer quelques articles avec de l’electronique 😉&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Retour sur l&apos;acceleo day</title>
   <link href="https://liard.me/2009/07/retour-sur-lacceleo-day/"/>
   <updated>2009-07-20T10:00:22+02:00</updated>
   <id>https://liard.me/2009/07/retour-sur-lacceleo-day</id>
   <content type="html">&lt;p&gt;Vendredi 10 juillet avait lieu à Nantes les Rencontres Mondiales du Logiciel Libre. C’est dans ce cadre qu’Acceleo a choisi d’organiser une journée dédiée à leur outil de transformation M2T.&lt;/p&gt;

&lt;p&gt;Etienne Juliot commence cette journée par une présentation de l’outil. Il a reussi à faire une présentation à la fois pour les débutants et pour les plus aguerris en y ajoutant quelques petites astuces bien pratiques. Le reste de la matinée était consacrée aux retours clients. Il y en aura quatre de Capgemini, Atos, Bull et OrangeLabs.  C’est celui d’ Atos qui m’a vraiment marqué et pas forcément dans le bon sens du terme. J’ai été frappé par le fossé qu’ils creusent entre les développeurs et les architectes. Attention je ne stigmatise pas Atos, beaucoup de grands groupes (le mien en premier) partage cette approche et voient l’Architecte comme un dieu dans sa tour d’argent dictant sa loi aux gueux développeurs.&lt;/p&gt;

&lt;p&gt;Pour ma part je ne l’approuve absolument pas et la distribution des rôles en scrum me donne raison. En effet en scrum les rôles architecte et développeur n’existent pas. Seul le rôle &lt;strong&gt;team&lt;/strong&gt; compte. L’équipe doit bien sûr être composée d’experts en architecture et en développement mais ils doivent travailler ensemble. Pour moi un bon architecte doit mettre les mains dans le code et un bon développeur doit maîtriser l’architecture et même y contribuer.&lt;/p&gt;

&lt;p&gt;Pour revenir à acceleo day, j’ai donc présenté très rapidement comment notre chaîne de génération a évolué avec le temps.&lt;/p&gt;

&lt;div id=&quot;__ss_1704821&quot; style=&quot;width: 425px; text-align: center;&quot;&gt;
&lt;/div&gt;

&lt;p&gt;Je me suis bien amusé à le faire et ça a été partagé si j’en crois le premier retour que j’ai pu lire. Retour fait par Cedric Vidal qui avait le créneau le plus dur, celui d’après le repas. Il a fait une très bonne présentation sur le Scaffolding. Technique intéressante qui propose d’enrichir le modèle par une ou plusieurs transformations M2M (Model to Model) avant la génération de code. Ca permet de garder la main sur certains éléments pour les enrichir. L’exemple type est le service CRUD (Create, Read, Update, Delete) d’un entité, c’est intéressant de le générer et de garder le lien avec l’entité tout en l’ayant modélisé pour le compléter et le documenter.&lt;/p&gt;

&lt;p&gt;Je n’ai malheureusement pas pu assister à la dernière présentation de Goulwen Le Fur car je devais reprendre la route. Vous pouvez lire ses slides sur &lt;a href=&quot;http://www.acceleo.org/wiki/index.php/EclipseAcceleoDay:Program&quot;&gt;leur site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Journée qui a donc été très enrichissante. C’est toujours intéressant de partager avec d’autres industriels pour comparer nos façons de faire.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Acceleo M2T et Eclipse 3.5</title>
   <link href="https://liard.me/2009/06/acceleo-m2t-eclipse/"/>
   <updated>2009-06-26T01:14:01+02:00</updated>
   <id>https://liard.me/2009/06/acceleo-m2t-eclipse</id>
   <content type="html">&lt;p&gt;Comme vous le savez Eclipse 3.5 Galileo est sorti le 24 Juin.&lt;/p&gt;

&lt;p&gt;Une des nouveautés est l’intégration d’Acceleo M2T directement dans la version “Eclipse Modeling Tools”.&lt;/p&gt;

&lt;p&gt;Je n’ai pas passé beaucoup de temps à l’essayer, mais on peut déjà noter plusieurs grosses améliorations. Bien sur la plus importante est le changement de langage de script. On passe d’un format spécifique Acceleo à du MTL standard défini par l’OMG pour les transformations Model to Text.&lt;/p&gt;

&lt;p&gt;Je vais plus me focaliser sur les nouveautés au niveaux outillage.&lt;/p&gt;

&lt;h2 id=&quot;installation-facile&quot;&gt;Installation facile&lt;/h2&gt;

&lt;p&gt;Avant je n’avais jamais réussit à installer Acceleo sur mon Eclipse via leur update site. Il y avait toujours des problèmes avec les versions d’emf, uml2… J’ai perdu beaucoup de temps et le seul moyen de le faire fonctionner rapidement était de récupérer leur package Eclipse+Acceleo.&lt;/p&gt;

&lt;p&gt;Cette fois j’ai installé un Eclipse 3.5 vierge et via l’update site de Galileo je peux installer Acceleo 0.8. Au moment de l’installation il m’a installé toutes les dépendances nécessaires (emf…) En 5 minutes ça marche. Seul petit hic, il ne tire pas les dépendances vers le plugin uml2 et l’exemple ne fonctionne pas sans. Mais si vous avez téléchargé la version “Eclipse Modeling Tools” tout fonctionne sans passer par l’update.&lt;/p&gt;

&lt;h2 id=&quot;exécution-en-standalone&quot;&gt;Exécution en standAlone&lt;/h2&gt;

&lt;p&gt;Même si cette fonctionnalité existe depuis la version 2.4.0 d’Acceleo, on note maintenant la disparition complète des chaines de lancement Acceleo. Pour générer notre code on peut donc utiliser au choix :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Du Java&lt;/li&gt;
  &lt;li&gt;Une tache ant&lt;/li&gt;
  &lt;li&gt;Un runner Eclipse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il ne manque plus qu’un plug-in Maven 2, mais vu que l’équipe d’acceleo utilise plus ivy que Maven il faudra peut être le réaliser nous-même.&lt;/p&gt;

&lt;h2 id=&quot;debug&quot;&gt;Debug&lt;/h2&gt;

&lt;p&gt;Je gardais le meilleur pour la fin, il est enfin possible de mettre des points d’arrêt dans nos templates. Ca marche très bien et on peut facilement naviguer dans notre model comme on le fait avec des objets en debug Java.&lt;/p&gt;

&lt;p&gt;C’était le gros manque au niveau outillage d’Acceleo, c’est maintenant très bien fait.&lt;/p&gt;

&lt;p&gt;Une grosse évolution très intéressante d’Acceleo donc. Je suis même étonné qu’il n’y ait pas plus d’infos à ce propos sur leur site Web. Ils sont trop occupés à préparer &lt;a href=&quot;http://www.acceleo.org/wiki/index.php/Eclipse_Acceleo_Day&quot;&gt;l’Acceleo Day&lt;/a&gt; du 10 Juillet peut être  :)Journée annoncée sur la page d’acceuil d’Eclipse, la classe !&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/06/acceleoday.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Conflit de lib Apache CXF et hibernate</title>
   <link href="https://liard.me/2009/06/conflit-de-lib-apache-cxf-et-hibernate/"/>
   <updated>2009-06-24T22:38:00+02:00</updated>
   <id>https://liard.me/2009/06/conflit-de-lib-apache-cxf-et-hibernate</id>
   <content type="html">&lt;p&gt;Je viens de perdre pas mal de temps à faire fonctionner mon projet qui utilise hibernate et apache CXF pour exposer des WebServices.&lt;/p&gt;

&lt;p&gt;Au moment de compiler j’avais l’erreur suivante :&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WARN: Nested in org.springframework.beans.factory.BeanCreationException: Error creating bean with name &apos;sessionFactory&apos; defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor:&amp;lt;br /&amp;gt;
at net.sf.cglib.core.KeyFactory$Generator.generateClass&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Au début ça me paraissait être un simple NoClassDefFound, mais la classe recherchée était bien dans mon CLASSPATH.&lt;/p&gt;

&lt;p&gt;A force de chercher j’ai fini par comprendre que c’etait un problème d’incompatibilité de version de lib cglib. Il faut donc exclure la librairie cglib récupérée avec hibernate pour en prendre une nommée : cglib-nodep.&lt;/p&gt;

&lt;p&gt;Voici comment faire dans votre fichier maven 2 :&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;xml:nogutter:nocontrols&quot;&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;hibernate&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;3.2.1.ga&amp;lt;/version&amp;gt;
    &amp;lt;exclusions&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;cglib&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;cglib&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
    &amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;cglib&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;cglib-nodep&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.1_3&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>RMLL à Nantes</title>
   <link href="https://liard.me/2009/06/rmll-a-nantes/"/>
   <updated>2009-06-03T00:47:23+02:00</updated>
   <id>https://liard.me/2009/06/rmll-a-nantes</id>
   <content type="html">&lt;p&gt;Mais c’est quoi au fait les RMLL ? C’est aussi la première question que je me suis posée :)&lt;/p&gt;

&lt;p&gt;Et bien ce sont les &lt;em&gt;Rencontres Mondiales du Logiciel Libre&lt;/em&gt; et cette année elles sont organisées à &lt;strong&gt;Nantes du 7 au 11 juillet 2009&lt;/strong&gt;. 5 jours bien chargés découpés en 18 thèmes différents !&lt;/p&gt;

&lt;p&gt;Amis du grand Ouest, c’est trop proche pour le louper !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Présentation de Modelio par Softeam ou pas</title>
   <link href="https://liard.me/2009/05/presentation-de-modelio-par-softeam-ou-pas/"/>
   <updated>2009-05-19T12:59:33+02:00</updated>
   <id>https://liard.me/2009/05/presentation-de-modelio-par-softeam-ou-pas</id>
   <content type="html">&lt;p&gt;J’ai reçu hier une invitation (enfin une publicité) pour un séminaire gratuit Softeam. Jusque là rien d’exceptionnel, Softeam en propose régulièrement. Ce qui est moins habituel c’est de recevoir ce mail via Modelio.&lt;/p&gt;

&lt;p&gt;Regardez le mail :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/05/modelio-pub.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Au premier coup d’oeil, je pense qu’il s’agit d’une après-midi de présentation du produit Modelio. Il faut s’inscrire sur le site de softeam.. pourquoi pas.&lt;/p&gt;

&lt;p&gt;Mais en arrivant sur ce site, l’image n’est plus la même. On ne parle même plus de Modelio.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/05/formation_gratuite_juin2009.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Et si on regarde la description de l’après midi c’est encore plus drole :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Lors de la pause 15H30-16H, des démonstrations pratiques de l’utilisation d’un atelier comme &lt;strong&gt;Objecteering Scope Manager&lt;/strong&gt;, &lt;strong&gt;Objecteering SOA Solution&lt;/strong&gt;, &lt;strong&gt;Objecteering UML Modeler&lt;/strong&gt;, seront organisées afin de montrer la facilité avec laquelle une telle démarche peut être mise en œuvre avec les outils modernes de modélisation. Une génération vers une application Java et BPEL sera démontrée.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Et là je suis un peu perdu… Moi qui espérait justement que softeam en profite pour clarifier la position de Modelio face à Objecteering. Cette présentation ne semble pas faite pour ça. Pour ajouter à la confusion j’ai regardé les petites lignes du mail pour savoir comment ils avaient eu mon mail. On peut lire :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nous avons collecté votre adresse email parce que vous êtes client ou en contact avec le département commercial d’une des sociétés du groupe Softeam (Softeam SA, &lt;strong&gt;Objecteering Software SA&lt;/strong&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Donc les clients Objecteering vont recevoir des pubs modelio ?&lt;/p&gt;

&lt;p&gt;Ceci mis de côté, ces séminaires sont souvent intéressants et les présentations de Philippe Desfray valent le déplacement :)&lt;/p&gt;

&lt;p&gt;EDIT : Le 30 Avril Objecteering a communiqué sur le lien avec Modelio &lt;a href=&quot;http://www.objecteering.fr/company_event_2009_avr_modelio.php&quot;&gt;http://www.objecteering.fr/company_event_2009_avr_modelio.php&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Les choses sont un peu plus claires&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Petit lifting</title>
   <link href="https://liard.me/2009/05/petit-lifting/"/>
   <updated>2009-05-17T19:04:10+02:00</updated>
   <id>https://liard.me/2009/05/petit-lifting</id>
   <content type="html">&lt;p&gt;Après un peu plus d’un an de fonctionnement j’ai eu envie de rafraîchir un peu le blog. Malheureusement je suis très vite limité par mes piètres talents de graphiste. Je me suis donc limité à changer de thème en apportant ma petite touche au niveau de l’image sous le titre.&lt;/p&gt;

&lt;p&gt;Petite nouveauté, j’ai ajouté une vidéo en haut à droite de la page créant un buzz où que je trouve drôle. L’idée est de la partager sans créer un post totalement creux avec juste : “Regardez la”.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Les domaines .tel</title>
   <link href="https://liard.me/2009/05/domaines-tel/"/>
   <updated>2009-05-13T21:26:17+02:00</updated>
   <id>https://liard.me/2009/05/domaines-tel</id>
   <content type="html">&lt;p&gt;La semaine dernière j’ai acheté le domaine liard.tel chez telnic.org.&lt;/p&gt;

&lt;p&gt;L’idée est sympa, on peut retrouver toutes mes coordonnées sur une page web avec une adresse facile à retenir. Pas d’hébergement à gérer ni de html à écrire, grâce à une interface très simple à utiliser :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/05/telhosting.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
  Pour 17 Euros par an (et non 59 Euros comme c&amp;#8217;était annoncé) ça reste raisonnable. Le seul problème risque d&amp;#8217;être le spam. En une semaine j&amp;#8217;ai déjà reçu deux appels vocaux m&amp;#8217;annonçant que j&amp;#8217;avais gagné 8000 Euros et qu&amp;#8217;il fallait appeler le 08&amp;#8230;. D&amp;#8217;un autre côté, avant je recevais déjà des SMS du même style.
&lt;/p&gt;

&lt;p style=&quot;text-align: left;&quot;&gt;
   
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ActiveMQ</title>
   <link href="https://liard.me/2009/04/activemq/"/>
   <updated>2009-04-21T09:42:59+02:00</updated>
   <id>https://liard.me/2009/04/activemq</id>
   <content type="html">&lt;p&gt;Pendant une petite semaine j’ai regardé de plus près le serveur de JMS ActiveMQ. Je vais vous faire partager mes premières remarques.&lt;/p&gt;

&lt;h1 id=&quot;le-coeur&quot;&gt;Le coeur&lt;/h1&gt;

&lt;p&gt;ActiveMQ est un broker de message à utiliser pour le développement d’une architecture MOM (Middleware Oriente Messages). Je l’ai choisi aussi pour sa bonne intégration avec Spring et sa bonne tenue en charge.&lt;/p&gt;

&lt;p&gt;Son architecture est simple : (source : http://activemq.apache.org/code-overview.html)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/03/activemq-300x205.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Donc trois couches autour de la gestion des Queues et des Topics :&lt;/p&gt;

&lt;h2 id=&quot;1--message-store&quot;&gt;1 – Message Store&lt;/h2&gt;

&lt;p&gt;On a la possibilité de choisir comment persister (ou non) les messages.&lt;/p&gt;

&lt;p&gt;Sans persistance (message en mémoire) le risque est bien sûr de perdre des messages en cas d’arrêt du processus, mais c’est aussi comme cela que l’on obtient les meilleures performances. Par contre je n’ai pas testé le cas sans consommateur de message et où on peut vite obtenir un OutOfMemory.&lt;/p&gt;

&lt;p&gt;Par défaut, ActiveMQ propose une persistance sous forme de fichiers assez performante nommée simplement “AMQ Message Store”. Dans la même famille un module kaha sauvegarde les messages sur le disque dur.&lt;/p&gt;

&lt;p&gt;Attention par contre j’ai constaté des problèmes de perte de messages avec une persitence kaha lorsque j’avais 100 threads en parallèle envoyant chacun dix messages par seconde. En passant sur AMQ Message Store je n’ai pas eu de problème.&lt;/p&gt;

&lt;p&gt;Il y a aussi les solutions reposant sur une base de données. Par défaut ActiveMQ lance un Derby embarqué mais il est possible d’utiliser un pont JDBC pour se connecter à une vrai base. C’est même fortement recommendé au vue des temps d’accès plus que moyens de Derby.&lt;/p&gt;

&lt;p&gt;Pour finir j’ai comparé le temps de création de 10 000 Messages en fonction du système de persistance choisi. Ces chiffres sont bien sûr à prendre uniquement comme éléments de comparaison entre les solutions. J’ai fait ces mesures sur mon petit PC.&lt;/p&gt;

&lt;center&gt;
  &amp;lt;/p&amp;gt; 
  
  &lt;table border=&quot;0&quot;&gt;
    &lt;tr&gt;
      &lt;td width=&quot;100&quot; align=&quot;center&quot;&gt;
        &lt;strong&gt;Persistance&lt;/strong&gt;
      &lt;/td&gt;
      
      &lt;td align=&quot;center&quot;&gt;
        &lt;strong&gt;Temps de création&lt;/strong&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    
    &lt;tr align=&quot;center&quot;&gt;
      &lt;td&gt;
        Mémoire
      &lt;/td&gt;
      
      &lt;td&gt;
        1.3s
      &lt;/td&gt;
    &lt;/tr&gt;
    
    &lt;tr align=&quot;center&quot;&gt;
      &lt;td&gt;
        AMQ
      &lt;/td&gt;
      
      &lt;td&gt;
        2.6s
      &lt;/td&gt;
    &lt;/tr&gt;
    
    &lt;tr align=&quot;center&quot;&gt;
      &lt;td&gt;
        Kaha
      &lt;/td&gt;
      
      &lt;td&gt;
        3s
      &lt;/td&gt;
    &lt;/tr&gt;
    
    &lt;tr align=&quot;center&quot;&gt;
      &lt;td&gt;
        Base Oracle
      &lt;/td&gt;
      
      &lt;td&gt;
        61s
      &lt;/td&gt;
    &lt;/tr&gt;
    
    &lt;tr align=&quot;center&quot;&gt;
      &lt;td&gt;
        Derby
      &lt;/td&gt;
      
      &lt;td&gt;
        527s
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
  
  &lt;p&gt;
    &amp;lt;/center&amp;gt;&lt;br /&gt; On note donc un facteur deux entre une persistance mémoire et une persistance sur le file system. Les rapports allant de 40 à 400 pour les solutions base de données sont plus discutables. En effet mon disque dur n&amp;#8217;est pas forcément bien défragmenté et ma base Oracle est sur mon réseau derriere plusieurs fire-wall que je ne maitrise pas.
  &lt;/p&gt;
  
  &lt;h2&gt;
    2 &amp;#8211; Connectors
  &lt;/h2&gt;
  
  &lt;p&gt;
    ActiveMQ offre différents connecteurs pour échanger des messages. De base il est possible de se connecter en tcp, mais il est aussi possible d&amp;#8217;échanger en texte via HTTP (REST ou SOAP).
  &lt;/p&gt;
  
  &lt;p&gt;
    Je ne m&amp;#8217;attarderai pas trop sur le sujet car je n&amp;#8217;ai pas beaucoup testé ces fonctionnalités
  &lt;/p&gt;
  
  &lt;h2&gt;
    3 &amp;#8211; Network Services
  &lt;/h2&gt;
  
  &lt;p&gt;
    Dans cette section on trouve les différents moyens de dialogue entre les serveurs activeMQ. Entre autres un composant Discovery permettant de retrouver d&amp;#8217;autres serveurs sur le même réseau automatiquement.
  &lt;/p&gt;
  
  &lt;p&gt;
    Par exemple un serveur A qui n&amp;#8217;a pas de consommateur connecté pour lire des messages pour une queue B ne pourra pas traiter ces messages. Par contre il va pouvoir trouver sur le réseau un autre serveur avec le bon consommateur et lui envoyer ses messages.
  &lt;/p&gt;
  
  &lt;h1&gt;
    Intégration avec Spring
  &lt;/h1&gt;
  
  &lt;p&gt;
    L&amp;#8217;utilisation dans spring est simple, il faut utiliser un BrokerFactoryBean pour démarrer le serveur.
  &lt;/p&gt;
  
  &lt;pre name=&quot;code&quot; class=&quot;xml:nogutter:nocontrols&quot;&gt;
&amp;lt;bean id=&quot;broker&quot; class=&quot;org.apache.activemq.xbean.BrokerFactoryBean&quot;&amp;gt;
      &amp;lt;property name=&quot;config&quot; value=&quot;classpath:activemq.xml&quot;&amp;gt;&amp;lt;/property&amp;gt;
      &amp;lt;property name=&quot;start&quot; value=&quot;true&quot;&amp;gt;&amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/pre&gt;
  
  &lt;p&gt;
    Ensuite pour se connecter au broker on utilise une Factory activeMQ et un template JMS de Spring.
  &lt;/p&gt;
  
  &lt;pre name=&quot;code&quot; class=&quot;xml:nogutter:nocontrols&quot;&gt;
&lt;!-- pool de connection JMS --&gt;
&amp;lt;bean id=&quot;jmsFactory&quot; class=&quot;org.apache.activemq.pool.PooledConnectionFactory&quot; destroy-method=&quot;stop&quot;&amp;gt;
  &amp;lt;property name=&quot;connectionFactory&quot;&amp;gt;
    &amp;lt;bean class=&quot;org.apache.activemq.ActiveMQConnectionFactory&quot; depends-on=&quot;broker&quot;&amp;gt;
      &amp;lt;property name=&quot;brokerURL&quot;&amp;gt;
        &amp;lt;value&amp;gt;vm:localhost&amp;lt;/value&amp;gt;
      &amp;lt;/property&amp;gt;
    &amp;lt;/bean&amp;gt;
  &amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;


&lt;!-- JMS Template --&gt;
&amp;lt;bean id=&quot;jmsTemplate&quot; class=&quot;org.springframework.jms.core.JmsTemplate&quot;&amp;gt;
  &amp;lt;property name=&quot;connectionFactory&quot;&amp;gt;
    &amp;lt;ref local=&quot;jmsFactory&quot; /&amp;gt;
  &amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;


&lt;!-- Declaration d&apos;une queue --&gt;
&amp;lt;bean id=&quot;queue1&quot; class=&quot;org.apache.activemq.command.ActiveMQQueue&quot;&amp;gt;
  &amp;lt;constructor-arg index=&quot;0&quot;&amp;gt;
    &amp;lt;value&amp;gt;queue1&amp;lt;/value&amp;gt;
  &amp;lt;/constructor-arg&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/pre&gt;
  
  &lt;p&gt;
     &lt;br /&gt; Enfin on peut déclarer nos beans producteurs et consommateurs
  &lt;/p&gt;
  
  &lt;pre name=&quot;code&quot; class=&quot;xml:nogutter:nocontrols&quot;&gt;
&lt;!-- Consomateur --&gt;


&lt;!-- le bean myConsumerBean doit implementer l&apos;interface javax.jms.MessageListener --&gt;
&amp;lt;bean id=&quot;consumer1&quot; class=&quot;org.springframework.jms.listener.DefaultMessageListenerContainer&quot;&amp;gt;
  &amp;lt;property name=&quot;concurrentConsumers&quot; value=&quot;5&quot; &amp;gt;&amp;lt;/property&amp;gt;
  &amp;lt;property name=&quot;connectionFactory&quot; ref=&quot;jmsFactory&quot; &amp;gt;&amp;lt;/property&amp;gt;
  &amp;lt;property name=&quot;destination&quot; ref=&quot;queue1&quot; &amp;gt;&amp;lt;/property&amp;gt;
  &amp;lt;property name=&quot;messageListener&quot; ref=&quot;myConsumerBean&quot; &amp;gt;&amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;


&lt;!-- Producteur --&gt;
&amp;lt;bean id=&quot;AuthentificationBean&quot; class=&quot;com.test.ProductorBean&quot;&amp;gt;
  &amp;lt;property name=&quot;template&quot; ref=&quot;jmsTemplate&quot; &amp;gt;&amp;lt;/property&amp;gt;
  &amp;lt;property name=&quot;dest&quot; ref=&quot;queue1&quot; &amp;gt;&amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/pre&gt;
  
  &lt;h1&gt;
    Répartition de charge
  &lt;/h1&gt;
  
  &lt;p&gt;
    Le principal intérêt des architectures MOM est leur capacité à monter en charge en la distribuant sur plusieurs noeuds.
  &lt;/p&gt;

![photo](/images/uploads/2009/04/repartition1.png)
    
  &lt;p&gt;
    Dans cette configuration le producteur à un rôle de loadBalancer et il suffit d&amp;#8217;ajouter des serveurs pour absorber plus de charges. De plus l&amp;#8217;utilisation d&amp;#8217;un NetworkConnector permet aux serveurs de dialoguer entre eux et d&amp;#8217;échanger des messages en cas de surcharge d&amp;#8217;un serveur ou simplement de l&amp;#8217;arrêt d&amp;#8217;un des consommateurs.
  &lt;/p&gt;
  
  &lt;p&gt;
    Le point faible de cette architecture est le risque de perte de message. En effet si le serveur A tombe la chaine n&amp;#8217;est pas cassée grâce à B et C. Mais si A avait persisté des messages non consommés avant le crash, ils resteront en attente jusqu&amp;#8217;au redémarrage du serveur. Pire, si la base de données ou le disque dur où ils étaient stockés est mort, ces messages sont définitivement perdus.
  &lt;/p&gt;
  
  &lt;h1&gt;
    Master Slave
  &lt;/h1&gt;
  
  &lt;p&gt;
    Une solution pour éviter d&amp;#8217;avoir des messages en attente à cause d&amp;#8217;un arrêt de serveur est l&amp;#8217;utilisation de la configuration Master/Slave. ActiveMQ propose 4 solutions de mise en place :
  &lt;/p&gt;
  
  &lt;h2&gt;
    1 &amp;#8211; Pure Master Slave
  &lt;/h2&gt;
  
  &lt;p&gt;
    Une configuration simple à mettre en place, il suffit d&amp;#8217;indiquer dans le fichier de configuration du serveur esclave l&amp;#8217;adresse du maitre.
  &lt;/p&gt;
  
  &lt;p&gt;
    Par contre le gros problème de cette solution vient du mode de reprise sur incident. En effet si le maitre s&amp;#8217;arrête, l&amp;#8217;esclave reprend bien le relais. Mais après avoir relancé le noeud maitre, on doit relancer l&amp;#8217;esclave pour revenir à un état stable. Autre gros problème un maitre ne peu avoir qu&amp;#8217;un seul esclave.
  &lt;/p&gt;
  
  &lt;h2&gt;
    2 &amp;#8211; Shared File System Master Slave
  &lt;/h2&gt;
  
  &lt;p&gt;
    Dans ce cas le principe est d&amp;#8217;utiliser une persistance fichier pour les messages et de faire pointer plusieurs instances d&amp;#8217;activeMQ sur le meme repertoire. La premiere insctance pose un lock sur les fichier et devient le Master, les autres attendent de pouvoir poser leur lock et sont donc Slave pendant ce temps.
  &lt;/p&gt;
  
  &lt;p&gt;
    On ne retrouve pas le problème de redémarrage de la première solution, car l&amp;#8217;esclave qui a repris le lock sur les fichiers est passé maitre et au redémarrage du noeud tombé il repasse naturellement esclave.
  &lt;/p&gt;
  
  &lt;h2&gt;
    3 &amp;#8211; JDBC Master Slave
  &lt;/h2&gt;
  
  &lt;p&gt;
    Exactement le même fonctionnement que la solution 2 mais en utilisant une base de données à la place des fichiers.
  &lt;/p&gt;
  
  &lt;h2&gt;
    4 &amp;#8211; KahaDB Master Slave
  &lt;/h2&gt;
  
  &lt;p&gt;
    Cette solution est intéressante sur le papier car elle permet un fonctionnement Master/Slave sans avoir besoin de partager des fichiers ou une base. Mais elle n&amp;#8217;est pas livrée dans la release de activeMQ pour le moment et je n&amp;#8217;ai pas réussi à faire fonctionner la version nightly-build.
  &lt;/p&gt;
  
  &lt;h1&gt;
    Configuration choisie
  &lt;/h1&gt;
  
  &lt;p&gt;
    Pour l&amp;#8217;architecture de mon application je me suis orienté vers la seconde solution de configuration Master/Slave pour construire la solution suivante :
  &lt;/p&gt;
  
  ![photo](/images/uploads/2009/04/repartition2.png)
  
  &lt;p&gt;
    Dans cette configuration on garde une capacité à monter en charge par l&amp;#8217;ajout de serveur mais on a en plus l&amp;#8217;utilisation du mode Master/Slave pour prévenir la perte ou le blocage de message.&lt;br /&gt; Pour le moment je suis resté sur une persistance fichier aux vues des résultats de performance, mais il faudra les confirmer sur les machines cibles et avec un disque réseau pour le partage.
  &lt;/p&gt;
  
  &lt;p&gt;
    J&amp;#8217;ai aussi rencontré un problème au niveau des JVM contenant un activeMQ esclave. En effet le bean de lancement du serveur bloque la JVM pendant l&amp;#8217;attente du lock et comme dans mon cas je voulais avoir mes consommateurs dans la même JVM, ils étaient bloqués.
  &lt;/p&gt;
  
  &lt;p&gt;
    Pour pouvoir avoir dans une JVM un serveur ActiveMQ et des consommateurs connectés au master, j&amp;#8217;ai du modifier le &lt;a href=&quot;https://liard.meimages/uploads/2009/04/threadbrokerfactorybean.java&quot;&gt;BrokerFactoryBean&lt;/a&gt; pour lancer dans un autre Thread le serveur. Grâce à cela le serveur hébergeant le noeud esclave travaille même lorsque le maitre n&amp;#8217;est pas mort.
  &lt;/p&gt;
  
  &lt;p&gt;
    Pour absorber plus de charge on a deux possibilités
  &lt;/p&gt;
  
  &lt;ul&gt;
    &lt;li&gt;
      Ajouter un autre groupe Master/Slave
    &lt;/li&gt;
    &lt;li&gt;
      Ajouter des slaves
    &lt;/li&gt;
  &lt;/ul&gt;
  
  &lt;p&gt;
    Si on a un problème avec ActiveMQ qui n&amp;#8217;absorbe pas assez bien les messages il faut choisir la première solution. Par contre si c&amp;#8217;est un problème de consommation pas assez rapide, il suffit d&amp;#8217;ajouter des esclaves et donc de nouveaux consommateurs.
  &lt;/p&gt;
  
  &lt;h1&gt;
    Conclusion
  &lt;/h1&gt;
  
  &lt;p&gt;
    Pour rendre plus concret ce dernier exemple vous pouvez &lt;a href=&quot;http://www.net-liard.com/activemq.zip&quot;&gt; télécharger une maquette de celui ci &lt;/a&gt;. J&amp;#8217;ai ajouté des fichiers .launch eclipse pour configurer le port JMX. C&amp;#8217;est très pratique pour observer avec la jconsole l&amp;#8217;activité du serveur activeMQ.
  &lt;/p&gt;
  
  &lt;p&gt;
    Ces premiers essais avec activeMQ sont assez satisfaisants et donnent envie de l&amp;#8217;utiliser dans nos projets. Je garde aussi un oeil sur les évolutions du mode &amp;#8220;KahaDB Master Slave&amp;#8221; qui devraient bientot etre livrées.
  &lt;/p&gt;
&lt;/center&gt;
</content>
 </entry>
 
 <entry>
   <title>Retour de vacances</title>
   <link href="https://liard.me/2009/04/retour-de-vacances/"/>
   <updated>2009-04-15T10:14:50+02:00</updated>
   <id>https://liard.me/2009/04/retour-de-vacances</id>
   <content type="html">&lt;p&gt;Après une petite semaine de ski je découvre plusieurs news très intéressantes&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Google App Engine supporte enfin le Java&lt;/li&gt;
  &lt;li&gt;Modelio sort sa version Entreprise&lt;/li&gt;
  &lt;li&gt;SFR ouvre un &lt;a href=&quot;http://www.sfrjtd.fr/&quot;&gt;concours&lt;/a&gt; Android&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pas mal de choses à tester donc.&lt;/p&gt;

&lt;p&gt;Pour le dernier point, j’ai déjà donné au niveau concours. En plus c’est pour SFR, je suis pas sûr que mon patron apprécirait  :)Et puis un coucours SFR pour une appli IPhone aurait été plus drôle !&lt;/p&gt;

&lt;p&gt;Avant ces tests je vais finaliser un article sur la mise en place de &lt;a href=&quot;http://activemq.apache.org/&quot;&gt;activeMQ&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Le PSM est-il toujours utile ?</title>
   <link href="https://liard.me/2009/03/le-psm-est-il-toujours-utile/"/>
   <updated>2009-03-06T00:49:05+01:00</updated>
   <id>https://liard.me/2009/03/le-psm-est-il-toujours-utile</id>
   <content type="html">&lt;p&gt;Pendant plus de 4 ans nous avons travaillé sur un projet avec un outillage MDA en utilisant le mécanisme suivant pour générer du code :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/03/psm1.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Sur le papier nous respections bien les concepts MDA avec une séparation du modèle abstrait de haut niveau (le PIM) et un autre spécifique à nos contraintes techniques (le PSM).&lt;/p&gt;

&lt;p&gt;Mais si on regarde de plus près on trouve dans notre PIM des informations liées à nos choix technologiques que l’on ajoute grâce à un profil (stéréotype finder, tagged value sql_name, etc). A quoi sert notre PSM du coup ? Comme notre modeleur offrait une solution de génération de code Java, nous pensions intéressant de l’utiliser. Nous avons donc réalisé un transformateur modèle vers modèle pour construire un PSM collant aux besoins du générateur Java. Dans les faits le PSM nous a aussi permis de pallier à certains bugs de ce générateur en modifiant à la main le PSM pour obtenir du code Java correct. Mais notre PSM est une image un pour un du code java. &lt;/p&gt;

&lt;p&gt;Lorsque je montre cela à nos experts MDA, j’ai le droit systématiquement au discours : “Samuel t’as tout faux, il faut séparer les concepts. Regarde comment il faut faire”&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/03/psm2.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Effectivement sur le papier c’est une bonne idée. Il faut mettre les bonnes informations au bon niveau.&lt;/p&gt;

&lt;p&gt;La première question que je pose à cette personne c’est : “Dis moi, ça fait combien de temps que tu n’as pas écrit une ligne de code ?”&lt;/p&gt;

&lt;p&gt;C’est bien beau de philosopher sur MDA, mais on oublie vite la finalité : mieux produire du code. Si à chaque modification de modèle il faut faire trois transformations, c’est inutilisable ! Pour moi, dix secondes et deux clicks c’est le maximum acceptable par une équipe de développement pour passer du modèle au code. Si on met plus de temps ou s’il y a plus d’étapes l’outil est inexploitable.&lt;/p&gt;

&lt;p&gt;C’est dans l’optique d’avoir moins d’étapes et de simplifier notre chaine de développement que nous utilisons maintenant une transformation Modèle vers Texte.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/03/psm3.png&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Vous remarquerez que je n’utilise plus le mot PIM pour ne plus me faire taper sur les doigts 😉 Mais même si notre modèle n’est pas vraiment un PIM, il ne colle pas non plus au code et on peut s’appuyer dessus pour générer une belle documentation de haut niveau.&lt;/p&gt;

&lt;p&gt;Dans ce cas il faut par contre réécrire un générateur Java. Mais le gros avantage est que ce générateur va répondre à 100% de vos exigences en terme de règle de codage et de formatage. De plus si l’outil de transformation est bien fait il offre de bonnes boites à outils (transformer une opération UML en signature de méthode Java par exemple). Si réécrire ce générateur est plus rapide et plus facile à maintenir qu’un tranformateur Modèle vers Modèle, cette méthode est plus intéressante. Et pourquoi utiliser des mécanismes complexes pour résoudre un problème simple ?&lt;/p&gt;

&lt;p&gt;Concrètement nous avions presque 15 000 lignes de code J à maintenir juste pour notre transformateur Modèle vers Modèle, nous avons maintenant moins de 3 000 lignes de scripts acceleo pour générer le même code Java.&lt;/p&gt;

&lt;p&gt;Donc aux vues de notre utilisation, avoir un modèle PSM n’apporte rien. Notre PSM c’est le code Java, après tout c’est un modèle comme un autre 😉&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Premier test de Modelio</title>
   <link href="https://liard.me/2009/02/premier-test-de-modelio/"/>
   <updated>2009-02-19T23:26:32+01:00</updated>
   <id>https://liard.me/2009/02/premier-test-de-modelio</id>
   <content type="html">&lt;p&gt;Après avoir passé quelques heures à tester Modelio je vous en fais un petit retour. &lt;/p&gt;

&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;/h2&gt;

&lt;p&gt;La première bonne nouvelle est qu’il est possible d’avoir sur un même poste plusieurs versions différentes de Modelio. J’ai installé la version Free et la version Java sur mon poste sans problème. Bien-sûr un projet créé avec la version Java n’est pas utilisable avec la version free (l’inverse est possible par contre).&lt;/p&gt;

&lt;p&gt;L’empreinte mémoire est assez faible (100Mo). Ca reste raisonnable. Par contre l’ouverture et la création de projet est vraiment lent et le fichier contenant le modèle est déjà gros même vide.&lt;/p&gt;

&lt;h2 id=&quot;utilisation&quot;&gt;Utilisation&lt;/h2&gt;

&lt;p&gt;La première chose que je remarque c’est la disparition de la barre action gauche au niveau du modèle Explorer.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/02/modelio1.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A la place il faut utiliser les menus pop-up du click droit comme avec l’éditeur de modèle emf d’Eclipse. C’est vraiment dommage et je trouve que l’on perd beaucoup de temps pour construire un modèle.&lt;/p&gt;

&lt;p&gt;Ensuite il manque toujours une aide à l’édition sur les diagrammes au niveau de la création des liens entre item (association, dépendances et autre). Je parle de cette petite flèche qui apparait en haut à droite de l’élément d’un diagramme lorsque la souris est au dessus et qui permet de créer une association ou un autre type de lien avec un autre item. RSM et EA le propose depuis pas mal de temps et je m’y suis bien habitué.&lt;/p&gt;

&lt;p&gt;Attention aussi à la gestion du delete, maintenant lorsqu’on supprime un élément d’un diagramme, il est aussi supprimé sur modèle.&lt;/p&gt;

&lt;h2 id=&quot;génération-java&quot;&gt;Génération Java&lt;/h2&gt;

&lt;p&gt;Une des nouveautés est l’utilisation d’annotation Java5 pour remplacer les marqueurs en commentaire.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/02/modelio21.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;C’est plus lisible, mais il faut accepter d’être dépendant d’un jar medelio. L’utilisation des annotations n’est possible qu’en mode “Round Trip”, lorsque l’on passe en mode “Model Driven” on revient sur une utilisation de commentaires Java.&lt;/p&gt;

&lt;p&gt;La gestion des attributs d’une classe Java ne semble pas vraiment pratique. A partir du moment où un attribut est noté privé, les méthodes get et set de celui-ci apparaissent comme par magie ! (en fonction de son mode d’accès quand même). C’est très troublant. On peut bien sûr les effacer mais à la moindre modification de l’attribut elles réapparaissent ! L’avantage est de pouvoir customizer le code java des getter et setter, ce qui était impossible avec Objecteering. Par contre maintenant le modèle est vraiment une représentation du code à l’identique. Je ne suis pas très fan de cette approche, je préfère avoir un modèle assez haut niveau (un PIM si on veut) qui peut se mapper sur mon code (le PSM du coup). &lt;/p&gt;

&lt;p&gt;Par contre les produits de génération n’existent plus. On ne peut configurer qu’un seul répertoire de génération de code. Donc maintenant un projet UML = un projet Java. C’est très génant si comme moi vous représentez plusieurs couches de votre application dans un seul modèle mais que chaque couche a son propre projet java.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Mes premiers essais sont assez mitigés, les nouveautés de Modelio sont loin de compenser les fonctions retirées d’objecteering (produit de génération, barre d’action etc…).&lt;/p&gt;

&lt;p&gt;Au niveau UML 2, rien à dire, le méta-modèle est bon. Modelio contrôle bien la validité du modèle. Pour moi c’est un plus. Même si des outils comme EA où on peut faire tout et n’importe quoi paressent plus simples à prendre en main, au final ils engendrent souvent des modèles inutilisables. &lt;/p&gt;

&lt;p&gt;Par contre le plus grave aujourd’hui est que l’import XMI ne fonctionne pas et il n’y a même pas d’export XMI. Sans export XMI, le modèle est emprisonné dans Modelio. Pour moi il est hors de question d’utiliser un outil sans avoir une solution pour exploiter le modèle avec d’autres outils de transformation de modèle ou de génération de code (comme Acceleo par exemple). J’ai fait cette erreur avec Objecteering 6 qui n’avait pas d’export XMI, on ne m’y remprendra pas ! :)&lt;/p&gt;

&lt;p&gt;J’attends toujours de tester la partie MDA et multi-user avec SVN de Modelio. Mais il faut attendre la version entreprise en Mars-Avril pour ça.&lt;/p&gt;

&lt;p&gt;Affaire à suivre donc !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Modelio, un nouveau modeleur ?</title>
   <link href="https://liard.me/2009/02/modelio-un-nouveau-modeleur/"/>
   <updated>2009-02-13T20:33:35+01:00</updated>
   <id>https://liard.me/2009/02/modelio-un-nouveau-modeleur</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2009/02/logo.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Je viens de tomber sur le site web d’un nouveau modeleur UML2 &lt;a href=&quot;http://www.modeliosoft.com&quot;&gt;Modelio.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Au premier screenshot, j’ai comme une impression de déjà vu. Dans le About on peut lire “Modeliosoft is the result of 20 years of experience in OO modeling” et “Based in Paris”. Une boîte qui a 20 ans d’experience dans la modélisation à Paris, c’est étrange de ne pas la connaître !&lt;/p&gt;

&lt;p&gt;En fait non ce n’est pas un nouveau modeleur, c’est une nouvelle version d’objecteering “rebrandée”. Alors il y a de gros changements, notament au niveau prix des licences, mais la base est la même. C’est plutôt une bonne chose car leur Meta-modèle est très bon et leurs diagrammes sont bien faits depuis la version 6. On m’a aussi confirmé que &lt;strong&gt;Philippe Desfray&lt;/strong&gt; était derrière Modelio ce qui est très rassurant et gage de qualité.&lt;/p&gt;

&lt;p&gt;Je n’ai toujours pas pu télécharger la version gratuite, mais dès que je l’ai je vous en fait un retour. Je me pose déjà pas mal de questions :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Comment gérer le versionning et le multi-user (SVN est supporté)&lt;/li&gt;
  &lt;li&gt;Comment écrire une transformation de modèle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La première bonne nouvelle c’est que le langage J n’est plus utilisé ! On peut enfin écrire des transformateurs en Java.&lt;/p&gt;

&lt;p&gt;Affaire à suivre donc. Je suis quand même étonné de ne voir aucune référence à Objecteering sur le site de modeliosoft. Fini aussi le logo avec la tour Eiffel. Une vrai volonté de tourner la page de la mauvaise réputation d’objecteering et peut-être une ouverture à l’international.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Concours d&apos;API d&apos;Orange : les résultats</title>
   <link href="https://liard.me/2009/02/concours-api-orange-fiasco/"/>
   <updated>2009-02-10T00:46:06+01:00</updated>
   <id>https://liard.me/2009/02/concours-api-orange-fiasco</id>
   <content type="html">&lt;p&gt;La liste des gagnants du concours Orange API d’octobre 2008 est enfin publiée sur le &lt;a href=&quot;http://www.orangepartner.com/site/enuk/news/challenges/p_orange_api_contest.jsp&quot;&gt;site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ce concours a vraiment été mal géré du début à la fin.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Offrir une place pour un salon en Floride sans donner de billet d’avion.. sympa.&lt;/li&gt;
  &lt;li&gt;Promettre une présentation des gagnants dans La Collection de novembre 2008 et au final rien.&lt;/li&gt;
  &lt;li&gt;Mettre 3 mois à envoyer le téléphone portable gagné pour en avoir un avec un firmware UK qu’il faut reflasher pour l’utiliser à 100% en France&lt;/li&gt;
  &lt;li&gt;Et les fameux 500 Euros gagnés… On ne les a toujours pas vus !&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Il ne faut pas venir se plaindre du peu de participants à un concours lorsque l’on voit cette désorganisation totale.&lt;/p&gt;

&lt;p&gt;Erratum : J’ai édité cet article pour corriger une mauvaise information.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Les APIs Orange passent en Beta</title>
   <link href="https://liard.me/2009/01/les-apis-orange-passent-en-beta/"/>
   <updated>2009-01-14T09:06:40+01:00</updated>
   <id>https://liard.me/2009/01/les-apis-orange-passent-en-beta</id>
   <content type="html">&lt;p&gt;Progressivement toutes les APIs Orange du site Orange Partner passent de version alpha en version Beta payante. Après l’API SMS passée en Beta en novembre, l’API de géoloc en Decembre, c’est l’API click-to-call qui devient payante à partir de maintenant.&lt;/p&gt;

&lt;p&gt;Le système fonctionne à base de crédits plus ou moins chers en fonction du volume acheté. Pour envoyer un SMS comptez 10 crédits. Vous pouvez même gagner des credits si vos utilisateurs utilisent des SMS surtaxés.&lt;/p&gt;

&lt;p&gt;Pour l’API de géoloc, c’est 10 crédits à chaque localisation et 1 pour la demande d’authentification qui était gratuite en alpha. Je regrette la disparition de la méthode buyLocationPass() qui permettait de localiser un mobile pendant 24 heures pour un forfait de 100 credits.&lt;/p&gt;

&lt;p&gt;Pour la dernière API click-to-call c’est plus compliqué car c’est une tarification à la minute (&lt;a href=&quot;http://www.orangepartner.com/getDocument.do?docId=104259&quot;&gt;ici&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Ce qu’il manque maintenant cruellement c’est un système pour aider à facturer directement ses clients (une offre “B to B to C”). Mais je sais que l’équipe d’API d’Orange travaille dessus 😉&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Partner Camp Orange dernier Jour</title>
   <link href="https://liard.me/2008/12/partner-camp-orange-dernier-jour/"/>
   <updated>2008-12-18T03:18:35+01:00</updated>
   <id>https://liard.me/2008/12/partner-camp-orange-dernier-jour</id>
   <content type="html">&lt;p&gt;Le dernier jour du Camp est beaucoup plus calme. Les participants se réveillent plus tard à cause de la soirée et certains doivent partir pour prendre leur avion. Je suis donc resté à la “developer play hut” pour aider mes collègues à faire des démos des API Orange.&lt;/p&gt;

&lt;h2 id=&quot;camp-farewell&quot;&gt;Camp farewell&lt;/h2&gt;

&lt;p&gt;Pendant la cérémonie de clôture du camp, nous avons eu droit aux remises de prix des différents concours. Pas loin d’une vingtaine de téléphones portables sont distribués.  &lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2008/12/fin.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Et pour finir une belle video résumant ces trois jours est diffusée où l’on peut noter la superbe prestation de mon collègue Jérome ! :)&lt;/p&gt;

&lt;h2 id=&quot;bilan&quot;&gt;Bilan&lt;/h2&gt;

&lt;p&gt;Ces trois jours ont été très riches tant au niveau des présentations qu’en terme de rencontres. Pour ma part j’ai aussi beaucoup apprécié le fait de discuter avec des collègues Orange que je ne connaissais pas (aussi bien de Boston que de Paris). Je suis persuadé que grâce à ces rencontres on peut travailler de façon plus efficace.&lt;/p&gt;

&lt;p&gt;Il faut aussi noter l’organisation parfaite du Camp. Les présentations étaient minutées à la seconde sans aucun retard. Il y avait des boissons et de la nourriture à profusion et d’une très bonne qualité. Le décor nous imprégnait bien de l’ambiance camp. Bref un sans faute !&lt;/p&gt;

&lt;p&gt;Et pour finir la journée (la camp s’arrêtait à 14h) nous sommes passés par Cocoa beach, ça vaut vraiment le détour 😉&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2008/12/cocoa.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Partner Camp Orange deuxieme Jour</title>
   <link href="https://liard.me/2008/12/partner-camp-orange-deuxieme-jour/"/>
   <updated>2008-12-17T16:26:53+01:00</updated>
   <id>https://liard.me/2008/12/partner-camp-orange-deuxieme-jour</id>
   <content type="html">&lt;p&gt;Seconde journée sous le soleil de floride au Partner Camp (27 degrès, c’est très agréable dans la piscine). Au programme aujourd’hui : conférences et soirée Access.&lt;/p&gt;

&lt;h2 id=&quot;géolocalisation&quot;&gt;Géolocalisation&lt;/h2&gt;

&lt;p&gt;Decarta nous présente ses API de cartographie. Elles sont très complètes (carte, calcul de trajet…) et accessibles à l’aide de trois sdk :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;J2ME&lt;/li&gt;
  &lt;li&gt;IPhone&lt;/li&gt;
  &lt;li&gt;Javascript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces SDK sont open source et téléchargeables sur le site : &lt;a href=&quot;http://developer.decarta.com&quot;&gt;http://developer.decarta.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ils ont fait une belle démo avec une même carte affichée sur un émulateur de téléphone portable et un navigateur. L’ajout d’un élément sur une des cartes se retrouve en live sur l’autre.&lt;/p&gt;

&lt;p&gt;Naveteq a ensuite fait une présentation sur son outil de gestion de publicité pour des applications de localisation. Le principe est de placer des logos sur les cartes ou de jouer un jingle sur le GPS lorsque l’on passe près du sponsor.&lt;/p&gt;

&lt;h2 id=&quot;javafx&quot;&gt;JavaFx&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2008/12/javafx-300x224.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;J’ai participé à une seconde session sur les solutions RIA de Sun pour avoir un peu plus de détails sur JavaFx. On a eu droit à beaucoup de très belles démos, mais a-t’on souvent besoin dans une application professionelle de découper une vidéo pour en faire un puzzle ? Ca me fait penser aux premières demos flash d’adobe, d’un autre côté on peut leur souhaiter le même succès.&lt;/p&gt;

&lt;p&gt;Une des nouveautés mises en valeur est l’Applets Reloaded inclue dans le Java SDK 6 upadate 10. Ca permet d’avoir des applets plus stables notamment en les lançant dans un process séparé.&lt;/p&gt;

&lt;p&gt;JavaFx fonctionne sous windows et sous Mac et propose un sdk intégré dans NeatBean 6.5. Il s’appuie sur un langage de script (sans typage fort…) et affirme que l’on peut écrire le meme code pour le deployer sur un mobile ou dans un browser. Sur ce dernier point j’ai bien sur des doutes, sourtout lorsqu’on peut voir une variable inBrowser dans leur code 😉&lt;/p&gt;

&lt;p&gt;Nous avons eu aussi une présentation de LWUIT (prononcer louit), un framwork pour développer des applications sur mobile. Le plus intéressant est d’avoir très bien séparé la partie graphique du code applicatif.&lt;/p&gt;

&lt;h2 id=&quot;soirée-access&quot;&gt;Soirée Access&lt;/h2&gt;

&lt;p&gt;Access nous a organisé une belle soirée avec un jeu concours où on gagnait le droit de faire tourner un sheaker avec un vélo (si si !)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2008/12/velo-300x225.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Dehors était intallé deux grands jeux gonflables.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2008/12/gonfle-300x225.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Une soirée très agréable où il était assez facile de créer des contacts (sauf dans la salle où la musique empèchait toute discussion)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Partner Camp Orange Jour J</title>
   <link href="https://liard.me/2008/12/partner-camp-orange-jour-j/"/>
   <updated>2008-12-16T01:17:20+01:00</updated>
   <id>https://liard.me/2008/12/partner-camp-orange-jour-j</id>
   <content type="html">&lt;p&gt;Le Camp est officiellement ouvert aujourd’hui ! Orange a vraiment fait les choses en grand: musiciens, danseuses, magiciens… même le père Noël en personne est passé pour faire la promo du site www.djinngo.com… la totale ! L’ambiance feux de camps est vraiment là et c’est très agréable.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Je vous laisse admirer nos danseuses :&lt;/p&gt;

&lt;p&gt;Ensuite j’ai participé à deux conférences.&lt;/p&gt;

&lt;h3 id=&quot;how-java-enables-the-screens-of-your-life-by-sun&quot;&gt;How Java enables the screens of your life by Sun&lt;/h3&gt;

&lt;p&gt;Dans un premier temps ils nous présentent le service www.majimob.com qui permet de réaliser des widgets pour téléphones mobiles. On notera que leur démo de visual voice mail n’a pas fonctionné, ça fait plaisir de savoir que ça arrive aussi aux autres 😉&lt;/p&gt;

&lt;p&gt;Ensuite nous avons eu une démonstration de &lt;a href=&quot;http://javafx.com/&quot;&gt;javaFx&lt;/a&gt;. C’est une solution Java pour faire du RIA (ou comment faire du flash en Java ;). Un kit de développement est téléchargeable sur leur site (pour Netbean bien sûr).&lt;/p&gt;

&lt;h3 id=&quot;why-we-are-so-shameless-in-internet-social-networks&quot;&gt;Why we are so shameless in internet social networks&lt;/h3&gt;

&lt;p&gt;C’est en fait un retour sur une étude sociologique sur nos comportements sur les réseaux sociaux et plus spécifiquement sur FaceBook.&lt;/p&gt;

&lt;p&gt;Vous pouvez retrouver les résultats de cette étude sur le site : www.sociogeek.com&lt;/p&gt;

&lt;h3 id=&quot;pow-wow&quot;&gt;Pow wow&lt;/h3&gt;

&lt;p&gt;La suite du show l’après midi a été la présentation de la statégie d’Orange. Deux phrases reviennent en boucles :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Simplicity for everyday essential&lt;/li&gt;
  &lt;li&gt;Together we can do more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le responsable du techno centre a été clair, Orange ne sortira pas de service à ses clients s’ils sont jugés trop compliqués.&lt;/p&gt;

&lt;h3 id=&quot;la-soirée&quot;&gt;La soirée&lt;/h3&gt;

&lt;p&gt;Pour finir cette première journée, un grand apéritif était organisé. Il était à l’image de l’organisation de la journée : Boissons et nourriture à volonté. Une soirée très conviviale où on peut établir très facilement un contact avec les partenaires d’Orange. Orange n’a rien à envier à Google au niveau de l’organisation !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Partner Camp Orange J-1</title>
   <link href="https://liard.me/2008/12/partner-camp-orange-j-1/"/>
   <updated>2008-12-15T05:12:25+01:00</updated>
   <id>https://liard.me/2008/12/partner-camp-orange-j-1</id>
   <content type="html">&lt;p&gt;Je suis arrivé hier à Orlando pour participer au partner Camp Orange de Cape Canaveral. Vu que le camp commence demain, j’ai passé ce dimanche au space center, c’est vraiment impressionnant !&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2008/12/nasa1-300x225.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Nous sommes arrivés le dimanche soir pour préparer le camp.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2008/12/hotel.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Donc le Jacuzzi fonctionne très bien 😉&lt;/p&gt;

&lt;p&gt;Demain les choses sérieuses commencent !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Résumé de la formation Scrum</title>
   <link href="https://liard.me/2008/12/resume-de-la-formation-scrum/"/>
   <updated>2008-12-10T21:22:08+01:00</updated>
   <id>https://liard.me/2008/12/resume-de-la-formation-scrum</id>
   <content type="html">&lt;p&gt;Comme je l’avais promis, je vous fais un retour sur les points qui m’ont paru importants dans la formation SCRUM organisée par &lt;a href=&quot;http://blog.xebia.fr/2008/10/16/certification-scrummaster-par-jeff-sutherland-session-des-1er-et-2-decembre/&quot;&gt;Xebia&lt;/a&gt;. L’objectif n’est pas de vous raconter entièrement les deux jours de formation mais de mettre en avant plusieurs points que j’ai trouvé intéressants.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h1 id=&quot;jeff-sutherland&quot;&gt;Jeff Sutherland&lt;/h1&gt;

&lt;p&gt;Les nombreux retours d’expérience de Jeff sont un des gros points forts de cette formation. Mais connaissez-vous son parcours ? Il est impressionnant :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Pilote de chasse dans l’US Air force – il fera plus de 100 missions au Viêt-Nam&lt;/li&gt;
  &lt;li&gt;Docteur en Radiologie et Biometrics.&lt;/li&gt;
  &lt;li&gt;Consultant informatique dans le domaine banquaire&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sans oublier la formalisation de SCRUM en 1993.&lt;/p&gt;

&lt;p&gt;A son arrivée Jeff s’installe, son café starbuck à la main. Il pose ses post-it pour préparer son sprint de deux jeux avec nous. Sa formation est millimétrée, chaque pause est chronométrée et on termine toujours à 17h pétantes.&lt;/p&gt;

&lt;h1 id=&quot;have-fun&quot;&gt;Have fun&lt;/h1&gt;

&lt;p&gt;La base de SCRUM c’est l’équipe et le principal rôle du Scrum Master c’est de protéger cette équipe. Et une équipe qui s’éclate dans son travail, qui est heureuse de venir travailler le matin, c’est une équipe qui est plus efficace. Mettre la pression sur une personne n’est pas la bonne solution pour augmenter sa productivité sur le long terme.&lt;/p&gt;

&lt;p&gt;De la même façon, il ne faut pas qu’une équipe soit en situation d’échec permanent. Jeff nous raconte avoir vu une équipe faire 6 sprints d’affilée avec du retard. Si la vélocité d’une équipe est de 30 story points, c’est ridicule de leur donner 40 story points par sprint.&lt;/p&gt;

&lt;h1 id=&quot;emergency-plan&quot;&gt;Emergency plan&lt;/h1&gt;

&lt;p&gt;Dans le cas où on détecte un risque de ne pas tenir les objectifs du sprint (courbe du burndown chart trop haute) il ne faut pas improviser mais avoir un “plan d’urgence”. Il propose 4 solutions :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;être creatif, innover&lt;/li&gt;
  &lt;li&gt;refaire l’estimation des taches&lt;/li&gt;
  &lt;li&gt;réduire le sprint backlog&lt;/li&gt;
  &lt;li&gt;agrandir l’équipe&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Avant de retirer des taches du sprint, il faut essayer de trouver une solution plus efficace et donc plus rapide.&lt;/p&gt;

&lt;h1 id=&quot;contracts&quot;&gt;Contracts&lt;/h1&gt;

&lt;p&gt;Un point qui pose souvent problème pour travailler de façon agile avec un client c’est le contrat. Jeff nous propose d’ajouter deux clauses optionnelles :&lt;/p&gt;

&lt;h2 id=&quot;change-for-free&quot;&gt;Change for free&lt;/h2&gt;

&lt;p&gt;Oui le client a le droit de changer d’avis, c’est aussi la vraie vie des projets. Cette clause permet donc à un client de remplacer une user story du backlog par une autre du même poids. &lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2008/12/changefree.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;money-for-nothing&quot;&gt;Money for nothing&lt;/h2&gt;

&lt;p&gt;Et oui le risque avec un projet agile c’est de finir trop tôt  :)Il faut permettre au client de stopper le contrat lorsqu’il le souhaite. Pour l’anecdote j’avais discuté avec un collègue travaillant dans une grosse SSII qui sous-traitait ses développements en Inde. A la fin ils en étaient au stade où ils ne leur demandaient plus rien : “leur demander une modification nous coûte plus cher que de le faire nous-même”. Et oui travailler avec une boîte CMMI 5 n’a pas que des avantages.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2008/12/moneynothing-300x142.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Jeff a fait une très bonne &lt;a href=&quot;http://jeffsutherland.com/scrum/Agile2008MoneyforNothing.pdf&quot;&gt;présentation&lt;/a&gt; à l’agile tour 2008 sur ce sujet.&lt;/p&gt;

&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;Deux jours très intéressants où l’on profite vraiment de l’expérience de Jeff. C’est à mon avis lui qui fait la différence par rapport à d’autres formations SCRUM.&lt;/p&gt;

&lt;p&gt;On a eu droit à la touche américaine à la fin : photo de classe et on a même appris la poignée de main secrète des Scrum Master ! la totale 😉&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Certifié SCRUM et UML</title>
   <link href="https://liard.me/2008/12/certifie-scrum-et-uml/"/>
   <updated>2008-12-03T21:46:47+01:00</updated>
   <id>https://liard.me/2008/12/certifie-scrum-et-uml</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/uploads/2008/12/scrummastermedium.jpg&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Comme je l’avais annoncé, après deux jours de formation SCRUM avec Jeff Sutherland en personne, j’ai été certifié SCRUM Master. C’est un titre un peu pompeux et il faut plus le voir comme un “permis de conduire”, c’est après l’avoir mis en pratique qu’on le maitrise vraiment.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/uploads/2008/12/certmark.gif&quot; alt=&quot;photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Et ce matin j’ai passé la certification &lt;a href=&quot;http://www-03.ibm.com/certify/tests/obj834.shtml&quot;&gt;IBM 834&lt;/a&gt; “Object Oriented Analysis and Design – Part 2” avec succés. C’est surtout la partie UML de la certification IBM qui m’intéresse.&lt;/p&gt;

&lt;p&gt;Au premier abord, ça peut paraitre étrange de mettre RUP et SCRUM côte à côte. Mais si on regarde de plus près SCRUM n’apporte pas de solution pour bien faire l’analyse et le design de son application.&lt;/p&gt;

&lt;p&gt;Je ferai un retour plus important sur la formation SCRUM très bientôt.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Chabal fait du foot</title>
   <link href="https://liard.me/2008/11/chabal-foot/"/>
   <updated>2008-11-20T09:53:37+01:00</updated>
   <id>https://liard.me/2008/11/chabal-foot</id>
   <content type="html">&lt;p&gt;J’ai pas l’habitude de blogger de la pub, mais cette video est bluffante !&lt;/p&gt;

&lt;p&gt;Regardez : www.chabal-le-duel.com&lt;/p&gt;

&lt;p&gt;Et surtout donnez bien votre numéro de portable.&lt;/p&gt;

&lt;p&gt;[edit du 2/1/09] Desolé mais la vidéo ne fonctionne plus.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Formation Scrum</title>
   <link href="https://liard.me/2008/11/formation-scrum/"/>
   <updated>2008-11-19T21:47:24+01:00</updated>
   <id>https://liard.me/2008/11/formation-scrum</id>
   <content type="html">&lt;p&gt;Xebia organise une formation Scrum de deux jours les 1 et 2 Décembre. C’est &lt;a href=&quot;http://jeffsutherland.com/&quot;&gt;Jeff Sutherland&lt;/a&gt; en personne qui va officier cette messe.&lt;/p&gt;

&lt;p&gt;Je vais participer à cette formation, j’aurai donc l’occasion de vous en faire un retour. Même si je continue à pousser les approches MDA je suis persuadé que l’utilisation des méthodes agiles ne peut être que bénéfique dans nos projets. J’avais déjà parlé du côté agile du MDA dans le poste &lt;a title=&quot;Permanent Link: Le MDA c’est Agile !&quot; rel=&quot;bookmark&quot; href=&quot;http://www.net-liard.com/blog/2008/07/mda-agile/&quot;&gt;Le MDA c’est Agile !&lt;/a&gt;, je compte bien convertir Jeff au MDA !… Enfin s’il arrive à comprendre mon anglais, c’est pas gagné ! :)&lt;/p&gt;

&lt;p&gt;Sur ce sujet je vous invite à lire de récentes discussions :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://emmanuelchenu.blogspot.com/2008/11/model-driven-et-agilite.html&quot;&gt;http://emmanuelchenu.blogspot.com/2008/11/model-driven-et-agilite.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.touilleur-express.fr/2008/11/17/mda-scrum/&quot;&gt;http://www.touilleur-express.fr/2008/11/17/mda-scrum/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.aubryconseil.com/dotclear/index.php/2008/11/17/496-controverses&quot;&gt;http://www.aubryconseil.com/dotclear/index.php/2008/11/17/496-controverses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Changement d’hébergeur</title>
   <link href="https://liard.me/2008/11/changement-dhebergeur/"/>
   <updated>2008-11-17T23:56:48+01:00</updated>
   <id>https://liard.me/2008/11/changement-dhebergeur</id>
   <content type="html">&lt;p&gt;Non je ne change pas d’hébergeur juste pour faire comme &lt;a onclick=&quot;javascript:pageTracker._trackPageview(&apos;/outbound/article/www.touilleur-express.fr&apos;);&quot; href=&quot;http://www.touilleur-express.fr/2008/10/18/le-touilleur-a-change-dhebergeur/&quot;&gt;Le Touilleur Express&lt;/a&gt; mais bien pour éviter les coupures de service et réduire un peu les coups 😉&lt;/p&gt;

&lt;p&gt;Il risque donc d’y avoir quelques dérangements pendant les changements de DNS.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Gagné !</title>
   <link href="https://liard.me/2008/11/gagne/"/>
   <updated>2008-11-04T00:33:12+01:00</updated>
   <id>https://liard.me/2008/11/gagne</id>
   <content type="html">&lt;p&gt;Je viens de recevoir une confirmation par mail pour m’informer que j’ai gagné le premier prix de la catégorie “complexe et futée”  du &lt;a href=&quot;http://www.orangepartner.com/site/frfr/news/challenges/p_orange_api_contest.jsp&quot;&gt;concours Orange Partner&lt;/a&gt; ! Aux vues de mes plus que médiocres compétences graphiques je ne pouvais gagner que dans cette catégorie :)&lt;/p&gt;

&lt;p&gt;Pour économiser mes crédits, je n’avais pas communiqué l’adresse du site. Maintenant vous pouvez l’utiliser sans problème : www.areuthere.net (jusqu’à épuisement de mes crédits bien sûr)&lt;/p&gt;

&lt;p&gt;C’est un service qui vous permet de géolocaliser en France des téléphones portables Orange. J’ai surtout réalisé deux fonctions innovantes :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Etre informé lorsqu’une personne entre dans une zone que vous avez définie.&lt;/li&gt;
  &lt;li&gt;Recevoir un SMS avec la liste de vos contacts à moins d’un kilomètre.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La première est très pratique pour être informé lorsque votre enfant arrive à l’école et même indispensable pour être alerté si votre femme approche trop près de la place Vendôme ! 😉&lt;/p&gt;

&lt;p&gt;Pour réaliser ce service j’ai utilisé les API d’Orange de géoloc, de SMS et d’authentification. Autant les deux premières sont très simples à utiliser (un simple GET sur une URL) autant la dernière est complexe. La documentation est pourtant bien faite, il faut envoyer un sendRedirect au client avec dans l’url une commande SAML. Le problème c’est qu’il faut travailler sans filet, en cas d’erreur aucun message pour savoir si c’est une erreur dans le SAML, dans le codage en base64 ou avec le zip. Heureusement que dans la dernière version de la documentation il y a un exemple en JSP.&lt;/p&gt;

&lt;p&gt;Si vous êtes intéressé par un peu plus d’informations techniques j’ai mis en ligne un embryon de documentation www.areuthere.net/model.&lt;/p&gt;

&lt;p&gt;Le service est réalisé en GWT, j’en reparlerai dans un autre article.&lt;/p&gt;

&lt;p&gt;Pour en revenir au concours je compte bien aller au &lt;a href=&quot;http://www.orangepartner.com/site/frfr/news/events/orange_partner_camp/cape_canaveral08/p_cape_canaveral_08.jsp&quot;&gt;Partner Camp&lt;/a&gt; à Cape Canaveral, il reste juste à trouver un billet d’avion. Car si Orange offre l’hébergement, il faut se débrouiller pour y aller.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>De retour</title>
   <link href="https://liard.me/2008/10/de-retour-2/"/>
   <updated>2008-10-30T01:26:11+01:00</updated>
   <id>https://liard.me/2008/10/de-retour-2</id>
   <content type="html">&lt;p&gt;Une longue pause dans un blog ça veut soit dire que l’auteur n’a rien fait d’intéressant soit au contraire qu’il a fait trop de choses pour prendre le temps de l’écrire. Et bien je suis plutôt dans le second cas :)&lt;/p&gt;

&lt;p&gt;Comme annoncé dans mon dernier post, j’ai participé au concours d’API Orange Partner. Deux semaines de longues soirées à coder. Pour l’occasion j’ai fait un site web de géolocalisation de téléphone portable orange. J’ai eu du mal à utiliser l’API d’authentification, mais les APIs de géo loc et de SMS sont très simples. Je donnerai plus de détails un peu plus tard avec les résultats du concours.&lt;/p&gt;

&lt;p&gt;J’ai aussi participé au sprint J2EE d’Acceleo mercredi dernier. Rencontre intéressante où l’on a discuté des évolutions souhaitées du module J2EE. J’ai poussé l’écriture d’un module de génération d’IHM CRUD (Create, Read, Update, Delete). Même si je suis conscient que ce type d’IHM est inutilisable tel quel, cela reste un bon moyen de valider un modèle. Goulwen a fait un résumé de la journée &lt;a href=&quot;http://www.acceleo.org/wiki/index.php/Acceleo_JEE_Module_Sprint_&apos;08&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Et pour finir, j’ai fini ma salle home-cinéma dans mon sous-sol. Alors c’est un peu hors sujet sur ce blog mais ça m’a pris pas mal de temps et j’en suis assez fier :) Si ça vous intéresse, j’ai des photos sur &lt;a href=&quot;http://www.flickr.com/photos/samuel22/sets/72157603896107986/&quot;&gt;flickr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bref un mois d’Octobre bien rempli  !&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Concours Orange API</title>
   <link href="https://liard.me/2008/09/concours-orange-api/"/>
   <updated>2008-09-30T10:05:30+02:00</updated>
   <id>https://liard.me/2008/09/concours-orange-api</id>
   <content type="html">&lt;p&gt;Orange Partner organise un &lt;a href=&quot;http://www.orangepartner.com/site/frfr/news/challenges/p_orange_api_contest.jsp&quot;&gt;concours&lt;/a&gt; des meilleures applications mashup utilisant leurs APIs. On peut y gagner :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Un « gadget » électronique d’une valeur de 500 Euros&lt;/li&gt;
  &lt;li&gt;Un téléphone portable&lt;/li&gt;
  &lt;li&gt;Une entrée au Partner Camp qui se déroulera en Floride en décembre 2008 (Mais je n’ai pas l’impresssion qu’ils payent le billet d’avion 😉 )&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personnellement je prépare une petite application, j’en ecrirai plus une fois qu’elle sera terminée 😉&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Google Developer Day à Paris</title>
   <link href="https://liard.me/2008/09/google-developer-day-a-paris/"/>
   <updated>2008-09-22T12:01:57+02:00</updated>
   <id>https://liard.me/2008/09/google-developer-day-a-paris</id>
   <content type="html">&lt;p&gt;Jeudi 18 avait lieu le google developer day à Paris. Petit résumé de la journée.&lt;/p&gt;

&lt;h1 id=&quot;accueil&quot;&gt;Accueil&lt;/h1&gt;

&lt;p&gt;Après avoir montré patte blanche deux fois, on peut enfin entrer dans le hall, un petit déjeûner est offert. C’est entre deux petits fours que je croise &lt;a href=&quot;http://mdblog.fr/blog/&quot;&gt;Grégory Weinbach&lt;/a&gt; d’object Direct.&lt;/p&gt;

&lt;p&gt;Une fois bien rassasié je continue le tour du bâtiment pour me diriger vers la salle de repos. Et pour une salle de repos c’est une belle salle de repos ! 4 écrans plats avec des Wii, deux baby-foot, un mikado géant, un domino géant, un puissance 4 géant, un jeu d’échec géant.. rien que ca ! Et le top du top c’est un tas de gros coussins aux couleurs de Google.&lt;/p&gt;

&lt;p&gt;Après deux parties de Wii Tennis, il est temps d’assister au discours d’ouverture.&lt;/p&gt;

&lt;h1 id=&quot;message-dintroduction&quot;&gt;Message d’introduction&lt;/h1&gt;

&lt;p&gt;Pour démarrer la journée, &lt;a href=&quot;http://wordpress.chanezon.com/&quot;&gt;Patrick Chanezon&lt;/a&gt; nous présente très rapidement l’ensemble des outils Google :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Chrome&lt;/li&gt;
  &lt;li&gt;Gears&lt;/li&gt;
  &lt;li&gt;App engine&lt;/li&gt;
  &lt;li&gt;GWT&lt;/li&gt;
  &lt;li&gt;OpenSocial&lt;/li&gt;
  &lt;li&gt;Androide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A chaque démo il faut switcher du Mac qui à les slides au PC, car Chrome ne fonctionne que sous Windows :). Et en plus de ces petites démonstrations, plusieurs sociétés nous présentent leur produit basé sur des outils Google :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://mapeed.com/&quot;&gt;Mapeed&lt;/a&gt; est un outil pour fusionner des marqueurs en fonction du niveau de zoom basé sur Google Maps.&lt;/li&gt;
  &lt;li&gt;MYerp.com est comme son nom l’indique un ERP en ligne ecrit avec GWT. &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.viadeo.com/&quot;&gt;Viadeo&lt;/a&gt; annonce l’ouverture de ses nouvelles APIs compatible OpenSocial&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par contre la petite démo d’android n’a pas été spectaculaire, l’application “blue dot” est beaucoup moins spectaculaire qu’à &lt;a href=&quot;http://www.youtube.com/watch?v=nmniBnVB6wA&quot;&gt;Londres&lt;/a&gt; où ils avaient un vrai téléphone.&lt;/p&gt;

&lt;p&gt;J’ai ensuite choisi de participer au code lab sur App Engine.&lt;/p&gt;

&lt;h1 id=&quot;code-lab-app-engine&quot;&gt;Code lab App Engine&lt;/h1&gt;

&lt;p&gt;App Engine est une solution d’hébergement fiable basé sur le langage python. Et la première question qui nous vient tous à l’esprit est bien sûr : “Pourquoi en Python ??” Et la l’équipe google nous répond que c’est peut être en lien avec l’arrivée de &lt;a href=&quot;http://fr.wikipedia.org/wiki/Guido_van_Rossum&quot;&gt;Guido van Rossum&lt;/a&gt; chez eux… Pas très technique comme explication.&lt;/p&gt;

&lt;p&gt;Sinon App Engine propose plusieurs briques intéressantes :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Gestion de l’authentifcation Google&lt;/li&gt;
  &lt;li&gt;Gestion d’une base objet&lt;/li&gt;
  &lt;li&gt;Api d’envoi de mail&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le Code lab est bien fait, le but est de développer une application wiki avec le kit de dev. Il permet de tester son application en local.&lt;/p&gt;

&lt;p&gt;En sortant du bâtiment j’ai même trouvé le scooter d’un Googler 😉&lt;/p&gt;

&lt;p&gt;Même si ce code lab était bien fait, je suis resté un peu sur ma faim. J’attendais beaucoup plus d’explications sur la gestion de l’hébergement.&lt;/p&gt;

&lt;h1 id=&quot;repas&quot;&gt;Repas&lt;/h1&gt;

&lt;p&gt;J’ai profité du repas pour rencontrer Julien Dubois de &lt;a href=&quot;http://www.springsource.com/fr&quot;&gt;spring source&lt;/a&gt; et &lt;a href=&quot;http://www.geeek.org/&quot;&gt;Ludovic Toinel&lt;/a&gt; de Capgemini qui travaille sur les &lt;a href=&quot;http://www.orangepartner.com/site/frfr/home/p_home.jsp&quot;&gt;API Orange Partner&lt;/a&gt;. Un moment d’échange très intéressant.&lt;/p&gt;

&lt;p&gt;Ensuite j’ai participé à deux sessions sur Gear et Chrome.&lt;/p&gt;

&lt;h1 id=&quot;gear&quot;&gt;Gear&lt;/h1&gt;

&lt;p&gt;C’est Aaron Boodman qui nous présente Gear. C’est aussi l’occasion de fêter les un an de l’application. Gear offre des fonctionnalités avancées pour les applications web et notamment de pouvoir rendre en partie l’application accessible Offline.&lt;/p&gt;

&lt;p&gt;Plusieurs points sont présentés :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desktop shortcuts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ca permet d’ajouter un icon sur le bureau pour ouvrir directement l’application Web. Le seul avantage par rapport à un lien http “normal” est de sauvegarder le navigateur utilisé et donc de ne pas simplement d’ouvir l’URL avec celui par défaut (intérêt très limité je trouve…)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gestionnaire de fichiers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gear offre une boite de dialogue qui permet d’utiliser des filtres et de sélectionner plusieurs fichiers. Encore mieux il gère une reprise sur erreur au niveau de l’upload de ces fichiers, très pratique en cas de transfert de gros fichiers (utilisé par Youtube bien-sûr)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GeoLoc&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Une API de géolocalisation est aussi présente (via un GPS, une cellule GSM ou une IP)&lt;/p&gt;

&lt;h1 id=&quot;chrome&quot;&gt;Chrome&lt;/h1&gt;

&lt;p&gt;Même si le titre de la session était nommée “Google Chrome”, c’était plus une présentation du moteur de JavaScripts V8.&lt;/p&gt;

&lt;p&gt;D’abord les objectifs de Chrome (très bien illustré dans leur superbe &lt;a href=&quot;http://www.google.com/googlebooks/chrome/small_00.html&quot;&gt;BD&lt;/a&gt;) :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Stabilité&lt;/li&gt;
  &lt;li&gt;rapidité&lt;/li&gt;
  &lt;li&gt;intuitivité&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kevin Milinkin a fait la présentation la plus technique de la journée. On a même eu droit à un slide montrant le code assembler utilisé.&lt;/p&gt;

&lt;p&gt;Déjà pourquoi faire un nouveau moteur de JavaScript ? La réponse est simple, au début des développements de Chrome il y a deux ans, la performance des moteurs Java Script existants n’etaient pas satisfaisante. C’est pour cette raison qu’ils ont lancé la réalisation de V8.&lt;/p&gt;

&lt;p&gt;Il nous présente ensuite les clés de la rapidité du moteur :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Hidden class hidden transition&lt;/li&gt;
  &lt;li&gt;Inline caching&lt;/li&gt;
  &lt;li&gt;Dynamic Machine Code Generation&lt;/li&gt;
  &lt;li&gt;Efficient Garbage Collection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces points sont très bien expliqués &lt;a href=&quot;http://code.google.com/apis/v8/design.html&quot;&gt;ici&lt;/a&gt;. V8 a aussi acceleré le temps de démarrage de la machine virtuelle en permettant le chargement d’objets en mémoire depuis un SnapShot.&lt;/p&gt;

&lt;p&gt;Malheureusement il n’y a toujours pas de date pour la version Mac.&lt;/p&gt;

&lt;h1 id=&quot;bilan&quot;&gt;Bilan&lt;/h1&gt;

&lt;p&gt;Même si je n’ai pas été seduit par le CodeLab, j’ai passé une excellente journée. C’est toujours intéressant d’échanger avec d’autres développeurs.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Fuite de threads dans Jonas</title>
   <link href="https://liard.me/2008/09/fuite-de-threads-dans-jonas/"/>
   <updated>2008-09-11T10:05:44+02:00</updated>
   <id>https://liard.me/2008/09/fuite-de-threads-dans-jonas</id>
   <content type="html">&lt;p&gt;Depuis plusieurs mois nous avions détecté que le nombre de thread de notre serveur jonas augmentait sans arrêt. Un de mes collègues a donc pris le taureau par les cornes pour trouver l’origine du problème. Après 4 jours à fouiller dans le code source de Jonas, il a trouvé le problème au niveau du connecteur Joram (notre application utilise des JMS).&lt;/p&gt;

&lt;p&gt;Dans la classe&lt;/p&gt;

&lt;p&gt;org.objectweb.joram.client.connector.ManagedConnectionFactoryImpl, on peut lire :&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;java:nogutter:nocontrols&quot;&gt;public Set getInvalidConnections(Set connectionSet) throws ResourceException {
  if (AdapterTracing.dbgAdapter.isLoggable(BasicLevel.DEBUG))
    AdapterTracing.dbgAdapter.log(BasicLevel.DEBUG,
       this+&quot; getInvalidConnections(&quot;+connectionSet+&quot;)&quot;);
    Iterator it = connectionSet.iterator();
    ManagedConnectionImpl managedCx;
    while (it.hasNext()) {
      try {
        managedCx = (ManagedConnectionImpl) it.next();
        if (managedCx.isValid())
          connectionSet.remove(managedCx);
        }
      catch (ClassCastException exc) {}
  }
  return connectionSet;
}&lt;/pre&gt;

&lt;p&gt;Ca met en évidence deux règles de codage Java importantes qui ne sont pas respectées :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ne pas retourner la référence d’un paramètre en valeur de retour&lt;/li&gt;
  &lt;li&gt;Eviter de modifier un paramètre d’une méthode&lt;/li&gt;
&lt;/ol&gt;

&lt;div&gt;
  La méthode getInvalidConnections permet de chercher dans la liste de connexions passées en paramètre celles qu&amp;#8217;il faut libérer. Mais au lieu de mettre les connexions invalides dans une nouvelle collection, ils suppriment les connexions valides de la collection passée en paramètre. Du coup ces connexions ne sont plus dans la liste des connexions actives, elles ne seront donc jamais libérées.
&lt;/div&gt;

&lt;p&gt;Depuis que nous avons patché le connecteur Joram, nous n’avons plus de fuite de thread :)&lt;/p&gt;

&lt;p&gt;Le patch :&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;java:collapse:nogutter&quot;&gt;public Set getInvalidConnections(Set connectionSet) throws ResourceException {
  if (AdapterTracing.dbgAdapter.isLoggable(BasicLevel.DEBUG))
    AdapterTracing.dbgAdapter.log(BasicLevel.DEBUG,
      this+&quot; getInvalidConnections(&quot;+connectionSet+&quot;)&quot;);
  Iterator it = connectionSet.iterator();
  ManagedConnectionImpl managedCx;
  java.util.HashSet invalidConnections = new java.util.HashSet();
  while (it.hasNext()) {
    try {
      managedCx = (ManagedConnectionImpl) it.next();
      if (!managedCx.isValid())
        invalidConnections.add(managedCx);
    }
    catch (ClassCastException exc) {}
  }
  return invalidConnections;
}&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Le MDA c&apos;est quoi ?</title>
   <link href="https://liard.me/2008/07/le-mda-cest-quoi/"/>
   <updated>2008-07-10T17:23:05+02:00</updated>
   <id>https://liard.me/2008/07/le-mda-cest-quoi</id>
   <content type="html">&lt;p&gt;Je suis toujours étonné de lire autant de réticences à propos du MDA. Cette méthode est peut être victime d’une communication trop éloignée des problèmes concrets des développeurs. Alors soyons clairs, moi non plus je ne suis pas en phase avec les grands théoritiens. Deux exemples concrets :&lt;/p&gt;

&lt;p&gt;J’ai participé il y a 3 ans à une présentation d’une thèse sur le MDA. J’ai vu pendant 1 heure des séries d’équations pour m’expliquer le principe du MDA. Au final, je n’ai pas vu une ligne de code et je suis sorti avec un beau mal de crâne.&lt;/p&gt;

&lt;p&gt;Un autre expert MDA m’a très sérieusement expliqué qu’il passait par 3 à 4 transformations successives pour arriver au code Java. De plus pour lui le principe du “round trip” ne sert à rien car son modèle ne change jamais. Bien sûr son super architecte a pensé à tout et les petits développeurs n’ont pas besoin de réfléchir… On rève..&lt;/p&gt;

&lt;p&gt;Si on vous a présenté le MDA de cette façon je comprends mieux vos griefs.&lt;/p&gt;

&lt;p&gt;Mais pour moi le MDA c’est :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Mettre le modèle au centre du pojet.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Un outil pour produire mieux et plus vite.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Une façon d’abstraire des mécanismes techniques complexes.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il faut que le passage du modèle au code soit simple et rapide. Il faut aussi que ce soit le transformateur qui s’adapte au projet et non l’inverse. Là aussi j’ai vu trop d’outils imposer une façon de faire qui rebutait l’équipe de développeurs.&lt;/p&gt;

&lt;p&gt;Oui on m’a déjà reproché de faire des PIM orientés Java et c’est aussi pour cette raison que l’on parle maintenant plutôt de MDD Model Driven Developpment. Mais mon objectif n’est pas d’être conforme à 100% avec la définition du MDA rédigée par l’OMG, mais bien de réaliser les trois points notés plus haut.&lt;/p&gt;

&lt;p&gt;C’est assez paradoxal de pousser la modélisation UML et de mettre nos beaux modèles au placard lorsqu’ils sont terminés. C’est ça le MDA : s’appuyer sur un modèle pour structurer son développement.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Le MDA c&apos;est Agile !</title>
   <link href="https://liard.me/2008/07/le-mda-cest-agile/"/>
   <updated>2008-07-09T17:25:05+02:00</updated>
   <id>https://liard.me/2008/07/le-mda-cest-agile</id>
   <content type="html">&lt;p&gt;Je viens de lire &lt;a href=&quot;http://www.touilleur-express.fr/2008/07/09/debriefing-comme-dhabitude-a-pas-dheure-de-la-soiree-paris-jug/&quot;&gt;Je viens de lire&lt;/a&gt; résumant la soirée Paris JUG d’hier soir.&lt;/p&gt;

&lt;p&gt;Et au milieu on peut lire : “&lt;em&gt;non MDA n’est pas une méthode Agile&lt;/em&gt;“&lt;/p&gt;

&lt;p&gt;Horreur ! Je ne peux donc pas m’empecher de réagir&lt;/p&gt;

&lt;p&gt;Bien sur que le MDA aide à être plus agile ! Mais attention, il ne faut pas non plus trop écouter les puristes…&lt;/p&gt;

&lt;p&gt;Je ne crois pas non plus à la notion “d’indépendance du langage”… c’est utopique, mais ça permet une certaine abstraction. C’est aussi une absurdité de mettre un fossé entre les développeurs et les architectes. L’architecte va oublier des choses dans le modèle, il faut laisser les développeurs l’aider à le compléter.&lt;/p&gt;

&lt;p&gt;Un exemple concret :&lt;/p&gt;

&lt;p&gt;Il y a 4 ans j’ai commencé un projet avec des EJB 2 session et entity. Pour les personnes qui n’ont pas la chance de connaitre les EJB 2…. c’est atroce. Pour persister une classe il faut écrire 4 classes Java + des descripteurs xml.&lt;/p&gt;

&lt;p&gt;Pour nous simplifier la vie nous avons modélisé notre système sans parler d’EJB. Un modele de haut niveau donc… un PIM.&lt;/p&gt;

&lt;p&gt;Ensuite nous avons écrit un transformateur PIM-&amp;gt; PSM EJB 2 (15j de travail )&lt;/p&gt;

&lt;p&gt;On génère classe Java + descripteurs EJB + script SQL.&lt;/p&gt;

&lt;p&gt;Et la c’était magique !!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 –&lt;/strong&gt; A la fin de la phase de modélisation, j’ai appuyé sur UN bouton et j’ai obtenu 100 % de mes squelettes de code Java. Sans aucun codage j’avais un EAR deployable !&lt;/p&gt;

&lt;p&gt;Attention ! cet EAR était bien une coquille vide, il est pour moi hors de question de modéliser le comportement. Il restait donc à notre équipe de développeurs à coder les services EJB.&lt;/p&gt;

&lt;p&gt;Mais il était déjà deployable, on pouvait donc écrire des JUnits avant d’écrire l’implémentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2 –&lt;/strong&gt; Justement à propos de l’équipe… allez trouver sur le marché des développeurs EJB 2. (pas chers donc débutants…)&lt;/p&gt;

&lt;p&gt;Et bien grâce à l’approche MDA nous avons pu prendre des débutants. En effet le coté EJB était transparent au début ils codaient de simples méthodes Java.&lt;/p&gt;

&lt;p&gt;Et au fur et à mesure ils sont montés en compétences sur les EJB 2 bien sur.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 –&lt;/strong&gt; Notre modèle est en phase avec notre code après 4 ans de dev… qui dit mieux ? 😉&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 –&lt;/strong&gt; Le MDA est agile !!&lt;/p&gt;

&lt;p&gt;C’est une approche qui nous aide à être plus agile car elle facilite les changements.&lt;/p&gt;

&lt;p&gt;Ajouter un attribut à un entity, c’est modifier 2 classes Java + un descripteur Java + un script SQL. Soit 4 chances d’oublier une modif ou de faire une erreur.&lt;/p&gt;

&lt;p&gt;Avec nos outils MDA : une modif dans le modele + un clic = c’est fini.&lt;/p&gt;

&lt;p&gt;Pour finir : la cerise sur le gâteau.&lt;/p&gt;

&lt;p&gt;L’année dernière nous avons migré nos EJB 2 vers de l’hibernate. Et bien nous avons juste changé de transformateur MDA… zero modif dans notre code.&lt;/p&gt;

&lt;p&gt;C’est pas de l’agilité ça ! :)&lt;/p&gt;
</content>
 </entry>
 

</feed>
