<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>inagua</title>
	<atom:link href="http://inagua.ch/feed/" rel="self" type="application/rss+xml" />
	<link>http://inagua.ch</link>
	<description>développements logiciel itératif et incrémental</description>
	<lastBuildDate>Sun, 14 Apr 2013 09:24:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Fausse certitude</title>
		<link>http://inagua.ch/2013/04/14/fausse-certitude/</link>
		<comments>http://inagua.ch/2013/04/14/fausse-certitude/#comments</comments>
		<pubDate>Sun, 14 Apr 2013 09:20:28 +0000</pubDate>
		<dc:creator>jacques</dc:creator>
				<category><![CDATA[jacques]]></category>

		<guid isPermaLink="false">http://inagua.ch/?p=1353</guid>
		<description><![CDATA[Dans le TGV de retour de Paris pour notre rencontre de la Fédération Agile. Au premier arrêt, en gare de Nurieux, à quelques 480 km de Paris, une femme monte dans le wagon, et de façon assez désagreable, lance aux &#8230; <a href="http://inagua.ch/2013/04/14/fausse-certitude/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dans le TGV de retour de Paris pour notre rencontre de la <a title="Fédération Agile . com" href="http://federationagile.com/" target="_blank">Fédération Agile</a>.</p>
<p>Au premier arrêt, en gare de Nurieux, à quelques 480 km de Paris, une femme monte dans le wagon, et de façon assez désagreable, lance aux deux jeunes assis près de la porte : &#8220;C&#8217;est ma place !&#8221;. Après s&#8217;être regardés, les deux jeunes, hésitants, se lèvent et l&#8217;un d&#8217;eux change de place.</p>
<p>A l&#8217;approche de l&#8217;arrêt suivant, à Bellegarde, la femme se lève pour descendre : elle cherche alors sa valise sans succès, et en fait part au wagon en faisant porter sa voix. Le train étant arrivé en gare, elle bondit hors du wagon pour interpeler vivement la controlleur sur le quai&#8230; A tel point que tout le wagon a pu suivre la conversation de l&#8217;intérieur : &#8220;Non madame, vous êtes descendu du wagon 12 à Nusieux et êtes remonté dans le wagon 13&#8243;. On voit alors la femme courrir le long de notre wagon 13 en direction du 12, et effectivement repasser dans l&#8217;autre sens avec sa valise !</p>
<blockquote><p>Ce moment de vie est une belle leçon, et à plusieurs niveaux.</p>
<ul>
<ul>
<li><span style="font-family: Georgia, 'Bitstream Charter', serif; font-style: italic;">Oui la place était la bonne, mais avec un peu de recule, ce n&#8217;était pas le bon wagon.</span></li>
<li><span style="font-family: Georgia, 'Bitstream Charter', serif; font-style: italic;">Une bonne raison pour rester respectueux dans des situations de crise ou de conflit.</span></li>
<li><span style="font-family: Georgia, 'Bitstream Charter', serif; font-style: italic;">Pour ma part, les deux jeunes portent leur part de responsabilité : ils ont été trop conciliants. Un minimum de feedback, un simple &#8220;Pourquoi ?&#8221; ou &#8220;Etes-vous certain(e) ?&#8221;</span></li>
<li><span style="font-family: Georgia, 'Bitstream Charter', serif; font-style: italic;">Enfin, cela peut aller loin si on n&#8217;est pas vigilant.</span><span style="font-family: Georgia, 'Bitstream Charter', serif; font-style: italic;"> J&#8217;ai honte d&#8217;avouer que ma première pensée a été de me dire que les deux jeunes s&#8217;étaient vengés&#8230;</span></li>
</ul>
</ul>
<p>Attention aux certitudes&#8230; Avec respect !</p>
<p>&nbsp;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://inagua.ch/2013/04/14/fausse-certitude/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Objective-C : réifier les classes natives avec les Catégories</title>
		<link>http://inagua.ch/2013/04/11/objective-c-reifier-les-classes-natives-avec-les-categories/</link>
		<comments>http://inagua.ch/2013/04/11/objective-c-reifier-les-classes-natives-avec-les-categories/#comments</comments>
		<pubDate>Thu, 11 Apr 2013 15:17:34 +0000</pubDate>
		<dc:creator>jacques</dc:creator>
				<category><![CDATA[jacques]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[technical]]></category>

		<guid isPermaLink="false">http://inagua.ch/?p=1321</guid>
		<description><![CDATA[Les Catégories en Objective-C : &#8220;Ça ressemble à de l&#8217;Objet, c&#8217;est encapsulé comme l&#8217;Objet… mais ce n&#8217;est pas de l&#8217;Objet&#8221; Je suis en train de travailler sur une application iPad qui doit reprendre une partie du code source d&#8217;une précédente version de &#8230; <a href="http://inagua.ch/2013/04/11/objective-c-reifier-les-classes-natives-avec-les-categories/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>Les Catégories en Objective-C : &#8220;Ça ressemble à de l&#8217;Objet, c&#8217;est encapsulé comme l&#8217;Objet… mais ce n&#8217;est pas de l&#8217;Objet&#8221;</p></blockquote>
<p>Je suis en train de travailler sur une application iPad qui doit reprendre une partie du code source d&#8217;une précédente version de l&#8217;application.</p>
<p>Une des fonctionnalités que j&#8217;ai réutilisée est le blog. Il repose sur la digestion en lecture seule d&#8217;un flux JSON. Ce flux JSON, via l&#8217;API native iOS, retourne un NSDictionary (une hash map) par item, ou plus exactement un tableau (NSArray) d&#8217;items (NSDictionary).</p>
<p>Afin de limiter les modifications dans les sources que j&#8217;ai importées de la version antérieure, je me suis demandé si je ne pouvais pas utiliser directement les classes natives (NSArray et NSDictionary) au lieu de créer des classes dédiées (Blog et Post).<br />
Et cela s&#8217;est finalement bien passé, et donne une solution plutôt séduisante grâce à un idiome du langage Objective-C : les Catégories.</p>
<p>Voir à la fin pour les sources du projet d&#8217;exemple.</p>
<p>En Ruby, on parle aussi de ré-ouverture de classe.</p>
<blockquote><p>Etant donné que, contrairement au C++, Objective-C ne supporte pas l&#8217;héritage multiple, les catégories, avec les protocoles, sont un bon moyen d&#8217;étendre une classe.</p></blockquote>
<p><span id="more-1321"></span></p>
<h1>Théorie</h1>
<p>Pour ce qui est de l&#8217;aspect théorique des Catégories, je vous renvoie notamment au chapitre <a href="http://www.pearson.fr/resources/titles/27440100999060/extras/2470_chap11.pdf" target="_blank">Catégories, extensions et sécurité</a> (PDF) car il est en partie accessible sur le site de Pearson.</p>
<p>On peut notamment y trouver des arguments permettant de choisir entre héritage et catégorie :</p>
<ul>
<li>&#8220;<em>La simplicité prévaut</em>&#8221; : il est conseiller de minimiser la longueur de la chaine d&#8217;héritage</li>
<li>&#8220;<em>La création d’une sous-classe d’une classe implémentée sous forme d’un regroupement de classes, comme NSString, demande un travail important</em>&#8220;</li>
<li>&#8220;<em>Les catégories ont une visibilité plus grande</em>&#8221; : pour le meilleur (on peut accéder aux méthodes définies sur n&#8217;importe quelle instance) et pour le pire (y compris celle dont on ne voudrait pas). Par exemple, une catégorie de NSString définissant une méthode retournant le domaine d&#8217;une adresse email peut être appelée sur n&#8217;importe quelle string, y compris des strings n&#8217;ayant rien à voir avec un email.</li>
<li>&#8220;<em>La redéfinition avec une catégorie présente des risques</em>&#8221; : via une catégorie on peut redéfinir les méthodes de la classe étendue, ce qui est très puissant, et donc très risqué</li>
<li>&#8220;<em>L’ajout de variables d’instance exige une sous-classe</em>&#8221; : mais on peut contourner cette contrainte avec des property (que l&#8217;on peut créer sur une catégorie).</li>
<li>&#8220;<em>Parfois, vous n’avez d’autre choix que de créer une sous-classe</em>&#8220;&#8230; &#8220;<em>Si vous devez étendre la même classe de différentes manières en différents endroits du programme</em>&#8220;</li>
<li>&#8220;<em>Certaines classes imposent la création de sous-classes</em>&#8220;, notamment les classes abstraites qui ne peuvent pas être étendues via une catégorie.</li>
<li>&#8220;<em>Essayez la composition</em>&#8221; : cela est vrai pour les langages orientés objets en général, de <a href="http://blogs.codes-sources.com/tja/archive/2009/06/28/design-patterns-privil-giez-la-composition-l-h-ritage-strat-gie.aspx" target="_blank">Privilégiez la composition à l’héritage</a>.</li>
</ul>
<p>Encore une fois, étant donné que, contrairement au C++, Objective-C ne supporte pas l&#8217;héritage multiple, les catégories, avec les protocoles, sont un bon moyen d&#8217;étendre une classe.</p>
<h1>Pratique</h1>
<p>Dans mon cas, un post a donc la structure JSON suivante :</p>
<pre>{
 "date": "2013-04-04",
 "imageURL": "http://www.mydomain.com/upload/photo.jpg",
 "title": "Objective-C Category",
 "id": 6903,
 "author": "Jacques COUVREUR"
 }</pre>
<p>J&#8217;ai donc créé une catégorie sur la classe NSDictionary qui permet de d&#8217;accéder aux valeurs sans avoir à spécifier la clef :</p>
<pre>// NSDictionary+Post.m

@implementation NSDictionary (Post)

- (NSString*) postTitle { return [self objectForKey:KEY_TITLE]; }
- (NSString*) postAuthor { return [self objectForKey:KEY_AUTHOR]; }
- (NSString*) postDate { return [self objectForKey:KEY_DATE]; }
- (NSString*) postImageURL { return [self objectForKey:KEY_URL]; }
- (NSString*) postText { return [self objectForKey:KEY_TEXT]; }</pre>
<p>Par expérience, j&#8217;ai pris l&#8217;habitude de préfixer le nom des messages (méthodes) de la catégorie par son nom, afin de les retrouver plus facilement par complétion et ainsi faciliter l&#8217;utilisation par la suite.<br />
Cela permet aussi d&#8217;éviter les collisions avec des méthodes existantes sur la classe étendue.</p>
<p>J&#8217;ai également une méthode qui permet de prendre une version nouvellement téléchargée d&#8217;un post (un NSDictionary) et de la fusionner avec la version sauvegarder du même post (même ID) :</p>
<pre>- (NSDictionary*) postUpdateWith:(NSDictionary*)downloaded {
  NSMutableDictionary* result = [NSMutableDictionary dictionaryWithDictionary:self];
  if (downloaded) {
    NSString* value = [downloaded postID];
    if (value) [result setValue:value forKey:KEY_POST_ID];
    [self updateFirst:result withSecond:downloaded forKey:KEY_TITLE];
    [self updateFirst:result withSecond:downloaded forKey:KEY_AUTHOR];
    [self updateFirst:result withSecond:downloaded forKey:KEY_DATE];
    [self updateFirst:result withSecond:downloaded forKey:KEY_IMGURL];
    [self updateFirst:result withSecond:downloaded forKey:KEY_TEXT];
  }
  return result;
}</pre>
<p>J&#8217;ai ainsi fait émergé une entité de post, ses responsabilité, sans définir de classe mais en reposant sur une classe existante.<br />
Et comme je le disais, ces posts sont recensés dans un tableau.</p>
<p>Pour être précis, le fonctionnement du blog est le suivant :</p>
<ol>
<li>A la consultation du blog, l&#8217;App affiche les posts sauvegardés</li>
<li>L&#8217;App télécharge la liste de tous les posts en version allégée (plus de 400 posts, avec seulement le titre et l&#8217;ID)</li>
<li>L&#8217;App affiche les 20 plus récents</li>
<li>L&#8217;App télécharge le détail de ces 20 plus récents (texte et image)</li>
<li>L&#8217;App sauvegarde ces 20 posts pour pouvoir fonctionner en mode offline.</li>
</ol>
<p>En dehors du téléchargement, j&#8217;ai décidé de centraliser les fonctionnalités de gestion des posts dans une catégorie de NSArray. On dirait bien qu&#8217;une abstraction Blog vient d&#8217;émerger :</p>
<pre>// NSMutableArray+Blog.m

@implementation NSMutableArray (Blog) 

// Find a post by its ID
- (NSDictionary*) blogPostWithID:(NSString*)wantedPostID {
  NSArray* posts = [NSArray arrayWithArray:self];
  for (NSDictionary* post in posts) {
    NSString* currentID = [post postID];
    if ([wantedPostID isEqualToString:currentID]) return post;
  }
  return nil;
}

// Does blog contains a post?
- (BOOL) blogContainsPost:(NSDictionary*)postInfo {
  return [self blogPostWithID:[postInfo postID]] != nil;
} 

// Return a new NSArray by merging self and the recentArray.
// Only the 'size' first elements of results are returned
- (NSMutableArray*) blogUpdateWith:(NSArray*)recentArray withFinalSize:(int)size {
  NSMutableArray* keep = [NSMutableArray arrayWithCapacity:size];
  int keepSize = 0;
  for (int i = 0; i &lt; recentArray.count &amp;&amp; keepSize &lt; size; ++i) {
    NSDictionary* post = [recentArray objectAtIndex:i];
    if ([self blogContainsPost:post]) {
      NSDictionary* old = [self blogPostWithID:[post postID]];
      NSDictionary* updated = [old postUpdateWith:post];
      [self blogReplacePost:updated];
    } else {
      [keep addObject:post];
    }
    ++keepSize;
  }
  NSArray* result = [keep arrayByAddingObjectsFromArray:self];
  result = [result subarrayWithRange:NSMakeRange(0, MIN(result.count, size))];
  result = [result sortedArrayUsingComparator:^NSComparisonResult(NSDictionary* a, NSDictionary* b) {
      NSString* first = [a postDate];
      NSString* second = [b postDate];
      return [second compare:first];
    }];
  return [NSMutableArray arrayWithArray:result];
} 

// Replace existing post inside self with newPost(based on post ID)
- (void) blogReplacePost:(NSDictionary*)newPost {
  NSDictionary* old = [self blogPostWithID:[newPost postID]];
  int oldIndex = [self indexOfObject:old];
  [self replaceObjectAtIndex:oldIndex withObject:newPost];
}</pre>
<p>J&#8217;ai décidé de créer et utiliser une méthode de remplacement plutôt que de mettre à jour directement le NSDictionary dans le NSArray, car l&#8217;API JSON retourne des NSDictionary imutables.</p>
<p>Dans ce cas précis, l&#8217;utilisation de catégories présente un autre intérêt.<br />
Etant donné que les données sont peu volumineuses, en accès lecture seule et consultation &#8220;globale&#8221; (sans recherche), j&#8217;ai décidé de sauvegarder simplement les données dans les NSUserDefaults.<br />
Or, l&#8217;enregistrement et le chargement de tableaux (NSArray) et hashmap (NSDictionary) est immédiate :</p>
<pre>- (void) saveInUserDefaults {
  NSData* eventsData = [NSKeyedArchiver archivedDataWithRootObject:self.blogArray];
  NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]
  [defaults setObject:eventsData forKey:KEY_BLOG];
  [defaults synchronize];
}

- (void) loadFromUserDefaults {
  NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
  NSData* eventsData = [defaults objectForKey:KEY_BLOG];
  self.blogArray = [NSMutableArray arrayWithArray:(NSArray*)[NSKeyedUnarchiver unarchiveObjectWithData:eventsData]];
}</pre>
<h1>Sources</h1>
<p>Vous pouvez télécharger <a title="Objective-C Categories XCode project" href="http://tiny.cc/objccat" target="_blank">le projet XCode d&#8217;exemple</a> (avec les tests unitaires) : lire le README.txt pour les instructions.</p>
<h1>Conclusion</h1>
<p>Jusqu&#8217;à présent j&#8217;utilisais les catégories pour ajouter des méthodes helpers sur des classes natives, comme par exemple une méthode &#8220;isBlank&#8221; sur NSString.</p>
<p>Mais dans ce cas précis, les catégories constituent une alternative séduisante, et légitime (à mon sens) à de la Programmation Orientée Objet : elles procurent les avantages de cette dernière sans avoir à écrire la moindre nouvelle classe et donc utiliser directement les objets de l&#8217;API.</p>
<p>A moins que vous ayez un avis contraire ?&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://inagua.ch/2013/04/11/objective-c-reifier-les-classes-natives-avec-les-categories/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Agile Play Ground Cynefin @ GE</title>
		<link>http://inagua.ch/2013/03/28/agile-play-ground-cynefin-geneve/</link>
		<comments>http://inagua.ch/2013/03/28/agile-play-ground-cynefin-geneve/#comments</comments>
		<pubDate>Thu, 28 Mar 2013 09:36:26 +0000</pubDate>
		<dc:creator>jacques</dc:creator>
				<category><![CDATA[jacques]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[lego]]></category>
		<category><![CDATA[meetup]]></category>

		<guid isPermaLink="false">http://inagua.ch/?p=1287</guid>
		<description><![CDATA[Mardi soir je suis allé à la seconde session de l&#8217;Agile Play Ground de Genève qui portait ce titre : &#8220;Immersion dans un jeu de construction collectif&#8221; Notamment par curiosité. Qui sont ces gens qui ont monté un groupe similaire &#8230; <a href="http://inagua.ch/2013/03/28/agile-play-ground-cynefin-geneve/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Mardi soir je suis allé à la seconde session de l&#8217;<a href="http://www.meetup.com/AGILE-PLAY-GROUND-GENEVE/" target="_blank">Agile Play Ground de Genève</a> qui portait ce titre :</p>
<blockquote><p>&#8220;Immersion dans un jeu de construction collectif&#8221;</p></blockquote>
<p>Notamment par curiosité. Qui sont ces gens qui ont monté un groupe similaire à celui que j&#8217;ai créé avec Alex l&#8217;année dernière (<a title="Serious G@GE" href="http://inagua.ch/2012/06/07/1er-meetup-serious-gge/">Serious G@GE</a>) ? Et qui sont ces participants ?</p>
<p>Également par envie de (re)jouer avec des Lego&#8230; Quel est donc cet autre jeu à base de Lego ?</p>
<p>Bref quelques attentes&#8230;</p>
<p><span id="more-1287"></span></p>
<p><a href="http://cluster006.ovh.net/~inagua/wp-content/uploads/2013/03/apgge.jpg"><img class="aligncenter size-large wp-image-1293" title="Agile Play Ground Genève - Cynefin" src="http://cluster006.ovh.net/~inagua/wp-content/uploads/2013/03/apgge-1024x768.jpg" alt="" width="584" height="438" /></a></p>
<p style="text-align: center;"><em>On reconnait bien Hamidul et Nathalie ;)</em></p>
<p>Après quelques détours j&#8217;arrive enfin à trouver l&#8217;entrée sur le campus de la HEG SO de Genève&#8230; Ah les campus, toujours un casse tête pour s&#8217;y retrouver. D&#8217;où l&#8217;importance d&#8217;un bon fléchage (le JUG GE l&#8217;a bien compris et excelle dans ce domaine). Mais les organisateurs avaient indiqués leur mobile sur le meetup avant la soirée : donc on&#8230; je&#8230; s&#8217;en est très bien sorti.</p>
<p>En arrivant sur place, je fais la connaissance de Cédric et Nathalie, deux des organisateurs. Une petite collation avant/pendant/après : idéale pour rompre la glace et faire connaissance.</p>
<p>On papote un peu et c&#8217;est parti. <a title="Oliver WAGNER" href="http://ch.linkedin.com/in/wagneroliver" target="_blank">Oliver Wagner</a> nous explique l&#8217;atelier et ses fondements.<br />
Cynefin vient de <a href="http://www.agile42.com/en/blog/2011/12/25/cynefin-lego-game/" target="_blank">Agile42</a>.<br />
Il a pour objectif de faire prendre conscience d&#8217;une classification de projets selon leur complexité.<br />
L&#8217;occasion de faire la distinction entre compliqué (un Airbus par exemple) et complexe (un plat de spaghettis  ou un porte avion nucléaire&#8230;.), mais aussi pour moi d&#8217;entendre ma première douleur : &#8220;il faut rendre deterministe ce qui ne l&#8217;est pas&#8221;. Ouatch&#8230; Déjà bon courage, et ensuite pourquoi s&#8217;entêter à faire rentrer un rond dans un carré ? Pourquoi ne pas considérer d&#8217;une part le carré pour la beauté de ses angles et ce qu&#8217;ils apportent, et d&#8217;autre part le rond pour la beauté de ses arrondis et ce qu&#8217;ils apportent ?</p>
<p>3 équipes, 3 itérations&#8230; ET DES LEGO&#8230; C&#8217;est parti !</p>
<h2>Itération 1</h2>
<p>Faire des tas par couleur pour deux équipes et par taille pour la 3e équipe&#8230;<br />
Et on arrive premier en 1&#8217;40&#8221;&#8230; Ouah les stars ;)</p>
<p>Puis on débrief.<br />
&#8220;Pourquoi êtes vous premiers ?&#8221;&#8230; &#8220;On a planifié !&#8221; dit un membre de l&#8217;équipe&#8230; Je ne trouve pas ! Cela exprime selon moi un vieux fantasme que la planification est gage de réussite rapide. Sans concertation, chacun a pris spontanément une couleur, certains ont passé des pièces à d&#8217;autres&#8230; Bref, une bonne grosse auto-organisation. Mais je pense que cela a bien fonctionné car finalement chacun travaillait sur son propre tas&#8230;</p>
<h2>Itération 2</h2>
<p>On doit maintenant construire une tour avec 3 règles :</p>
<ol>
<li>20 étages, de couleur régulière</li>
<li>Un étage N+1 doit être plus petit ou égale en largeur à l&#8217;étage N</li>
<li>Chaque couleur ne peut être touchée que par une même personne</li>
</ol>
<p>Là on s&#8217;est fait plié : mauvais qu&#8217;on a été !</p>
<p>Puis on débrief<br />
&#8220;Il manquait des specs claires&#8221;&#8230; Je ne trouve pas non plus.<br />
&#8220;Il faudrait faire les règles plus claires&#8221;&#8230; Toujours pas : je les trouve déjà bien plus claires que ce que l&#8217;on a dans la VVP (Vraie Vie Professionnelle)&#8230; Au contraire, pour être plus réaliste il faudrait les embrouiller ;)</p>
<p>Par contre nous sommes partis à faire un premier rang (les fondations) de grande dimension, de couleur unique (forcément). Du coup, on a à peine eu le temps de commencer le second étage. Les premiers on empilé 20 briques identiques avec une alternance de 2 couleurs : that&#8217;s all !!!</p>
<p>Ouatch, 2 itérations de quelques minutes et quelques briques suffisent pour faire office de puissant révélateur :</p>
<blockquote><p>1) Nous sommes complètement formatés</p>
<p>2) Nous avons une tendance aiguë à complexifier Hallucinant !</p></blockquote>
<p>Si le jeu s&#8217;arrêtait là se serait déjà suffisant, mais ça continue&#8230;</p>
<h2>Itération 3</h2>
<p>On a 30 secondes pour décider ce que l&#8217;on va faire entre une voiture et un animal. Et après, en plus des règles précédentes, on ne parle plus, et on va tourner de table en table (que les personnes, les Lego restants sur les tables). L&#8217;idée concernant les rotations est d&#8217;injecter du chaos.</p>
<p>Une catastrophe ! On récupère notre construction : Mais qu&#8217;est ce que c&#8217;est ? Elle ne ressemble à rien et elle est fragile. Par contre, une des équipes a réussi à faire une voiture réaliste.</p>
<p>Puis on débrief<br />
Il semblerait qu&#8217;avant la première rotation ils aient réussi à faire un châssis ressemblant, avec des roues. Le message était donc clair pour les suivants, et ainsi de suite.</p>
<blockquote><p>3) Une vision claire dés le début serait donc un élément de réussite d&#8217;un projet ?</p></blockquote>
<p>Mais aussi deux autres nouvelles révélations :</p>
<blockquote><p>4) Plus le projet dure dans le temps (plus il y a d&#8217;itérations) moins l&#8217;analyse et la planification initiale n&#8217;ont d&#8217;intérêt et de pertinence dans le temps</p>
<p><span style="font-family: Georgia, 'Bitstream Charter', serif; font-style: italic;">5) Quel handicap pour le projet de ne pas pouvoir se parler, communiquer, et quelle frustration pour les individus.</span></p>
<p>&nbsp;</p></blockquote>
<h2>Itération 4</h2>
<p>Pour finir, une seule personne par équipe va tourner et pas le droit de toucher sa couleur avant l&#8217;arrivée de son remplaçant.</p>
<p>Je propose avant de commencer qu&#8217;une personne prenne toutes les couleurs et fasse une tour avec des briques de taille identique. Cela n&#8217;est pas incompatible avec la règle &#8220;une couleur peut être touchée par une seule personne&#8221;. L&#8217;idée ne semble pas faire l&#8217;unanimité. Je laisse donc l&#8217;équipe commencer, je prend deux couleurs et fait un module : le haut de la tour, assez étroite, d&#8217;une dizaine d&#8217;étages. Une fois la première moitié construite par le reste de l&#8217;équipe (4 personnes pour faire la moitié en autant de temps que moi pour faire l&#8217;autre moitié, seul), je pose l&#8217;autre moitié dessus, et c&#8217;est fini.</p>
<p>En dehors du fait que a) j&#8217;ai bossé seul dans mon coin (pas très <em>team building</em> ;(), et que b) je sois assez fort pour porter d&#8217;une main un immeuble de 10 étages, encore une leçon :</p>
<blockquote><p>6) Diviser pour mieux régner : décomposer un problème complexe en modules.</p></blockquote>
<p>&nbsp;</p>
<h1>Mon doggy bag</h1>
<p>Voilà donc ce que je retiens de cette soirée :</p>
<ol>
<li>Nous sommes complètement formatés</li>
<li>Nous avons une tendance aiguë à complexifier</li>
<li>Une vision claire dés le début serait un élément de réussite d&#8217;un projet</li>
<li>Plus le projet dure dans le temps moins l&#8217;analyse initiale n&#8217;a d&#8217;intérêt</li>
<li>Quels handicap et frustration de ne pas pouvoir se parler, communiquer</li>
<li>Diviser pour mieux régner : décomposer un problème complexe en modules.</li>
</ol>
<p>Mais l&#8217;atelier vise, via ses 4 itérations successives, à mettre en évidences une classification de projets : simple, compliqué, complexe et chaotique.</p>
<p><a href="http://www.agile42.com/en/blog/2011/12/25/cynefin-lego-game/"><img class="aligncenter" title="Cynefin framework (source: agile42.com)" src="http://media.agile42.com/content/500px-Cynefin_framework_Feb_2011.jpg" alt="" width="500" height="493" /></a></p>
<p style="text-align: center;"><em>Cynefin framework (source: agile42.com)</em></p>
<p>Même si comme l&#8217;a répété François BEAUREGARD dans sa formation au Management 3.0 &#8220;<em>un modèle est faux par définition</em>&#8220;, j&#8217;ai trouvé la mise en évidence assez efficace, même si il me semble que le chaos à la fin n&#8217;ait pas été aussi évident car trop de contraintes (interdiction de parler et juste une couleur par personne). Mais existe-t-il encore dans notre métier des projets simples ou seulement compliqués ?</p>
<p>C&#8217;est d&#8217;ailleurs ce que je comprend comme postulat de départ de l&#8217;agilité ou même du Management 3.0.</p>
<p>Et j&#8217;ai l&#8217;impression que le temps, ou plus exactement les délais, courts (souvent dans l&#8217;urgence), déplacent le barycentre vers la complexité ou le chaos ?!</p>
<p>Et dans ce contexte, la recommandation est :</p>
<ol>
<li>De commencer par *<strong>EXPERIMENTER</strong>*</li>
<li>Puis de bien *<strong>OBSERVER</strong>*</li>
<li>Et enfin *<strong>ANALYSER</strong>*&#8230;</li>
</ol>
<p>Oui, oui, la première étape est d&#8217;y aller, de mettre les pieds dans le plat.</p>
<p>Quant à Analyser, il s&#8217;agit d&#8217;analyser le processus, pour l&#8217;adapter et l&#8217;améliorer, on ne parle pas d&#8217;analyse fonctionnelle ou d&#8217;architecture technique.</p>
<p>J&#8217;aurais trouvé logique à ce moment de la soirée, d&#8217;entendre les keywords PDCA ou rétrospective (puisqu&#8217;on a quand même debriefé à chaque itération).</p>
<h1>Conclusion</h1>
<p>Et le mot de la fin (mais qui suis-je pour décider que c&#8217;est la fin ?) : Est arrivé sur le tapis la relation avec le côté féminin, plus sensible, moins directif (je me contente de citer)&#8230; C&#8217;est dingue, car cela est également arrivé sur le tapis la semaine dernière lors de la formation Management 3.0&#8230;</p>
<p>Au delà de la vocation initiale de l&#8217;atelier, je me dis qu&#8217;on pourrait le détourner pour mettre en évidence nos déviances, notre tendance à la complexification. En fin de chaque itération, pendant le debriefing, on pourrait se focaliser sur les extrapolations que l&#8217;on a fait et qui nous ont conduites à l&#8217;échec, du moins à la non performance :</p>
<ul>
<li>Pourquoi une couleur par personne au lieu de une personne avec toutes les couleurs ?</li>
<li>Pourquoi une alternance de couleurs au lieu d&#8217;une unique couleur ?</li>
<li>&#8230;</li>
</ul>
<p>Vous pourrez trouver d&#8217;autres idées d&#8217;atelier dans l&#8217;un de mes précédents post :<br />
<a title="Apprendre, Jouer, Innover et faire des erreurs : L'oeuf, la poule… Le têtard… Et la mutation !" href="http://inagua.ch/2011/11/08/apprendre-jouer-innover-et-faire-des-erreurs-loeuf-la-poule-le-tetard-et-la-mutation/">Apprendre, Jouer, Innover et faire des erreurs : L&#8217;oeuf, la poule… Le têtard… Et la mutation !</a></p>
<p>En tout cas, je sors de cette soirée avec deux nouvelles connaissances, et une croyance : il est possible de faire une formation agile qu&#8217;avec des Lego (après tout il y a bien Serious Play)&#8230; Je vais m&#8217;y atteler !&#8230;</p>
<p>Merci à tous, et notamment à <a title="Oliver WAGNER" href="http://ch.linkedin.com/in/wagneroliver" target="_blank">Oliver Wagner</a> qui s&#8217;est mis en risque puisqu&#8217;il nous a avoué jouer cet atelier pour la première fois.</p>
<p>PS: J&#8217;ai bien aimé l&#8217;astuce d&#8217;Oliver pour les slides. Il a imprimé ses quelques slides sur des pages A3 qu&#8217;il a scotchées les unes sur les autres (un bout de scotch sur l&#8217;arrête d&#8217;en haut, les premières slides sur le dessus). Ainsi, à mesure qu&#8217;il parle et qu&#8217;il parcours ses slides il récole la slide courante pour passer à la suivante. Simple et ré-utilisable. Bref, agile ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://inagua.ch/2013/03/28/agile-play-ground-cynefin-geneve/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Agile Games FR 2013 @ Avignon</title>
		<link>http://inagua.ch/2013/02/03/agile-games-fr-2013-avignon/</link>
		<comments>http://inagua.ch/2013/02/03/agile-games-fr-2013-avignon/#comments</comments>
		<pubDate>Sun, 03 Feb 2013 13:35:33 +0000</pubDate>
		<dc:creator>jacques</dc:creator>
				<category><![CDATA[jacques]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[agile game]]></category>
		<category><![CDATA[event]]></category>

		<guid isPermaLink="false">http://inagua.ch/?p=1314</guid>
		<description><![CDATA[Mike Echo Romeo Charlie India ! Je me réveille tout doucement ce matin, dans un hôtel à Avignon&#8230; Avant d&#8217;aller faire un tour au Palais des Papes, je me sens tout bizarre, un peu groggy&#8230; Mais qu&#8217;ai je donc fait &#8230; <a href="http://inagua.ch/2013/02/03/agile-games-fr-2013-avignon/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h1>Mike Echo Romeo Charlie India !</h1>
<p>Je me réveille tout doucement ce matin, dans un hôtel à Avignon&#8230; Avant d&#8217;aller faire un tour au Palais des Papes, je me sens tout bizarre, un peu groggy&#8230; Mais qu&#8217;ai je donc fait ces dernières 48 heures ?!..</p>
<p>Un puissant outil de rétrospective, que j&#8217;affectionne tout particulièrement pour se souvenir et partager, est le totem&#8230; Pour la seconde année, je déplore que nous n&#8217;ayons pas de totem, alors je me bouge&#8230;</p>
<p>Si je devais apporter un totem pour ces 2 jours&#8230;</p>
<p><a href="http://cluster006.ovh.net/~inagua/wp-content/uploads/2013/02/agf13-sepia.jpg"><img class="aligncenter size-medium wp-image-1317" title="Agile Games France '13" src="http://cluster006.ovh.net/~inagua/wp-content/uploads/2013/02/agf13-sepia-300x224.jpg" alt="" width="300" height="224" /></a></p>
<p><span id="more-1314"></span></p>
<p>Ca ne pourrait pas être Le Palais des Papes, tout d&#8217;abord parce que j&#8217;ai peur de déchirer ma poche, mais aussi parce que la conf semble se vouloir itinérante. En tout cas, cette année, l&#8217;hôtel dans les salles, et le tout à Avignon c&#8217;était top.</p>
<p>Si c&#8217;était une chose, se serait&#8230; Bernard, euh non&#8230; Le post-it est pas mal, mais facile. La carte à jouer aussi. Peut-être la brique Légo : cette brique qui permet de faire pas mal de choses, en assemblant / desassemblant, tout en jouant&#8230; Mais je vais choisir la patte-à-fixe : on peut prendre une grande barre de PaF, la découper en plusieurs petits morceaux, l&#8217;éparpiller selon notre volonté dans différentes salles pour coller&#8230; Décoller&#8230; Recoller ailleurs. Décoller&#8230; Puis rassembler différents petits morceaux pour en faire un plus grand&#8230; Et finalement, on peut complètement détourner cette fonction initiale pour jouer via une bonne bataille de boule de PaF ;)</p>
<p>Si c&#8217;était un jeu, se serait&#8230; Bernard, euh non Le Bullshit Bingo, ou comment casser notre métier, ou plus exactement notre rôle de consultant. Après il faut supporter Claude crier Bingo toutes les 3 minutes ;)) Non, j&#8217;ai encore mieux: la Crevasse&#8230; Car finalement avec peu de choses, un peu de scotch et environ 34,5 mètres linéaire d&#8217;humain, on arrive rapidement à démontrer nos limites, donc le dépassement de soi basé sur la confiance (pardon, pour montrer que j&#8217;ai bien compris, il faut dire LES 3 confiances ;). Et pas besoin d&#8217;être un grand gaillard de 2m / 90 kg pour se dépasser&#8230; Pas vrai Laurence ;) Magnifique démonstration : un simple trou permet de mettre en relief de quoi est capable l&#8217;être humain. Faudrait que je pense à toujours emporter un trou.<br />
Le bingo, la crevasse, ça fait beaucoup pour un seul homme&#8230; Et il en rajoute en se mettant à l&#8217;horizontal appuyé sur un mur&#8230; Ca doit être l&#8217;abondance d&#8217;oxygène qu&#8217;il y a à nos basses altitudes : il ne doit plus être habitué ;) Merci Olivier</p>
<p>Si c&#8217;était un animal, se serait&#8230; Bernard, euh non, la licorne, forcément. Je savais déjà de l&#8217;année dernière que la licorne couine, et j&#8217;ai appris cette année qu&#8217;elle porte des chaussettes&#8230; La licorne, car elle apparait quand nous sommes dans cet état un peu second dans lequel on est le soir une fois toute cette énergie retombée, un peu dans le gaz, un mélange d&#8217;état digestif après un lourd repas et de fatigue profonde après un triathlon (faudrait que j&#8217;en fasse un un jour ;). La licorne aussi parce que, 60 adultes, qui se réunissent pendant 2 jours à 700 km de chez eux pour faire &#8216;mumuse&#8217;, c&#8217;est forcément des animaux imaginaires&#8230; Ils ne peuvent pas vraiment exister ?!&#8230; Mais&#8230; Mais&#8230; alors tout ceci n&#8217;était qu&#8217;un rêve ?!</p>
<p>Et si c&#8217;était un humain, ça ne pourrait pas être Bernard :)&#8230;<br />
Ca pourrait être Alex, mais j&#8217;y revient.<br />
Ca pourrait être Guillaume Tell ;)<br />
Ca pourrait être Gaëlle, ces gens un peu borderline à l&#8217;agilité qui font l&#8217;effort de rejoindre La Communauté de la Licorne.<br />
Ca pourrait être Alexis, qui a le courage de se lever devant tout le monde pour lancer les choses, mais aussi la sagesse de savoir se rassoir pour laisser les autres s&#8217;exprimer.<br />
Ca pourrait être Caroline et Emilie, qui ne carburent pas aux même substances illicites que nous.<br />
Ca pourrait être Gilles&#8230; Gilles est complexe. Gilles est mystère. Schizophrène d&#8217;abord : il y a le Gilles qui tweet une idée de jeu le matin, et le Gilles qui vient à la conf mais qui ne connait plus ce même jeu. Et puis Gilles a avec lui un exemplaire de chaque jeu qui existe. Vous voulez un jeu, Gilles l&#8217;a sur lui. Je me suis d&#8217;abord dit, &#8220;ok : Gilles ne se déplace jamais sans ses 17 semi-remorques, comme Johnny en tournée&#8221;&#8230; Mais non, Gilles est venu en train ! Donc, la réponse est limpide : Gilles a volé le sac jaune de Sport Billy.<br />
Ca pourrait être Alfred&#8230; Alfred, comment dire&#8230; Comme de la confiture&#8230; Non pas celle qui s&#8217;étale partout, collante et désagréable, mais ce pot ouvert de confiture fruitée et sucrée, disponible à ce que l&#8217;on vienne y plonger notre cuillère (a)vide de savoir&#8230; Comme, également, le petit lapin Duracell, qui continu à grimper l&#8217;Everest quand les autres en sont encore à essayer de traverser le Pont d&#8217;Avignon&#8230; D&#8217;ailleurs, nous sommes plusieurs à suspecter qu&#8217;il fonctionne encore même si on lui enlève ses piles. Pour ma part je suis persuadé qu&#8217;il a volé le secret de la technologie ARK à Tony Stark. Aux dernières nouvelles, il était en train d&#8217;animer un atelier sur les Mocks à quelques participants inanimés et enchainés dans le hall d&#8217;un hôtel Kyriad à Avignon&#8230; Je me demande si ensuite il a réquisitionné les voyageurs du TGV Avignon / Lyon ;)) Ca pourrait donc être Alfred&#8230; D&#8217;un autre côté, avoir un petit Alfred en mousse chez soit sur son bureau, ça serait louche.</p>
<p>&nbsp;</p>
<p>Une autre technique agile est la métaphore.<br />
Cette (a)conférence est pour moi comme une explosion : de jeux, de bonheur, de bonne humeur, de rencontres, de discussions, de découvertes, d&#8217;énergie&#8230; Organisée en à peine quelques semaines.<br />
Mais pour qu&#8217;une combustion ait lieu, il faut :</p>
<ol>
<li>Le carburant : cette profusion de jeux, et pas mal de re/nouveau. Cool.</li>
<li>Le comburant : nous, ces Licornes imaginaires, sans qui les jeux ne pourraient bruler</li>
<li>L&#8217;apport d&#8217;énergie initial : Alex, cette étincelle, ce feu follet ;), qui a lancé cette idée folle il y a deux ans, qui a relancé la conf cette année, et qui a su proposer de bonnes actions aux bons moments pendant ces deux jours (une rétro à 14h avant la fin&#8230; N&#8217;importe quoi&#8230; A moins que faire cela avant que les gens partent au compte gouttes&#8230; Pas con ;)</li>
<li>Mettre ces 3 éléments au même moment au même endroit : l&#8217;organisation. Merci aux éléments moteurs de l&#8217;auto organisation, ceux qui ont géré la mise en place sur Avignon, ceux qui ont fait que cela se passe bien tout au long des 2 jours, ceux qui ont pris la parole spontanément devant les autres pour que l&#8217;on avance, ceux qui ont animé des jeux, ceux qui se sont mis en risque pour les autres en rejouant des jeux qu&#8217;ils ont découvert quelques temps auparavant&#8230;</li>
</ol>
<p>Le défit maintenant : transformer ces explosion en moteur à combustion, un enchainement d&#8217;explosions à intervalle régulier.<br />
Une façon de clore une rétro est d&#8217;interpeler l&#8217;autre on le remerciant pour un fait. Donc merci à vous pour tout ceci.<br />
Maintenant que c&#8217;est fait, passons aux choses sérieuse : où et quand pour la prochaine ?</p>
<p>Bonne digestion à tous, et surtout : restons joyeux !</p>
<p>j.<br />
Membre de la Communauté de la Licorne</p>
<p>PS: Voir aussi <a title="Compte rendu d'Alfred" href="http://atelierlogiciel.wordpress.com/2013/02/04/agile-games-france-2013-sur-le-pont-davignon-on-y-joue-tous-en-rond/">le compte rendu du Petit Alfred en Mousse</a> qui pointe vers d&#8217;autres compte rendus.</p>
]]></content:encoded>
			<wfw:commentRss>http://inagua.ch/2013/02/03/agile-games-fr-2013-avignon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symbolication (crash log d&#8217;une app iOS)</title>
		<link>http://inagua.ch/2012/06/08/symbolication-du-crash-log-dune-app-ios/</link>
		<comments>http://inagua.ch/2012/06/08/symbolication-du-crash-log-dune-app-ios/#comments</comments>
		<pubDate>Fri, 08 Jun 2012 12:33:29 +0000</pubDate>
		<dc:creator>jacques</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[crash]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[recipe]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://inagua.ch/?p=1253</guid>
		<description><![CDATA[Il est très utile de pouvoir récupérer les fichiers de log suite au crash d&#8217;une application sur un iPhone ou un iPad, et encore plus de pouvoir &#8220;décrypter&#8221; ces fichiers. Pour cela, il vous faudra prendre des dispositions au moment &#8230; <a href="http://inagua.ch/2012/06/08/symbolication-du-crash-log-dune-app-ios/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Il est très utile de pouvoir récupérer les fichiers de log suite au crash d&#8217;une application sur un iPhone ou un iPad, et encore plus de pouvoir &#8220;décrypter&#8221; ces fichiers. Pour cela, il vous faudra prendre des dispositions au moment où vous générez le livrable !</p>
<p><span id="more-1253"></span></p>
<h2>Extraire le fichier symboles à la livraison</h2>
<p>Afin d’avoir les symboles dans un fichier de log de crash depuis n’importe quel poste (pas seulement celui de la personne qui a livré le binaire), il faut le fichier symbole, ce qui implique les étapes suivantes :</p>
<ol>
<li>Clic droit sur l’archive depuis l’Organizer xCode, onglet Archives (voir screenshot)</li>
<li>Puis &#8220;Afficher dans finder&#8221;</li>
<li>Puis &#8220;Afficher le contenu du paquet&#8221;</li>
<li>Il s’agit du fichier dans le répertoire dSYMs</li>
</ol>
<div><a href="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/06/xcode-organizer.png"><img class="aligncenter size-large wp-image-1261" title="xCode Organizer" src="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/06/xcode-organizer-1024x730.png" alt="" width="584" height="416" /></a></div>
<div></div>
<h2>Obtenir les fichiers de log des crash</h2>
<p>Une fois que vous avez synchronisé votre device via iTunes, l&#8217;emplacement  sur votre ordinateur des fichiers de crash log dépend de l&#8217;OS :</p>
<ul>
<li>Sur Mac ils sont ~/Library/Logs/CrashReporter/MobileDevice/&lt;DEVICE_NAME&gt;</li>
<li>Sur Windows c&#8217;est dans C:\Users\&lt;USERNAME&gt;\AppData\Roaming\Apple computer\Logs\CrashReporter/MobileDevice/&lt;DEVICE_NAME&gt;</li>
</ul>
<h2>Utilisation du fichier</h2>
<p>Lorsque vous récupérez un fichier de log, pour faire apparaitre les symboles (rendre “lisible” le fichier), il faut le fichier de symbole correspondant à la version de l’application (qui a généré le log).</p>
<p>Un double clic sur le fichier symbole devrait suffire…</p>
]]></content:encoded>
			<wfw:commentRss>http://inagua.ch/2012/06/08/symbolication-du-crash-log-dune-app-ios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>1er meetup Serious G@GE</title>
		<link>http://inagua.ch/2012/06/07/1er-meetup-serious-gge/</link>
		<comments>http://inagua.ch/2012/06/07/1er-meetup-serious-gge/#comments</comments>
		<pubDate>Thu, 07 Jun 2012 12:01:13 +0000</pubDate>
		<dc:creator>jacques</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile game]]></category>
		<category><![CDATA[group]]></category>
		<category><![CDATA[innovation game]]></category>
		<category><![CDATA[meetup]]></category>
		<category><![CDATA[product box]]></category>
		<category><![CDATA[serious game]]></category>

		<guid isPermaLink="false">http://inagua.ch/?p=1249</guid>
		<description><![CDATA[Lundi soir a eu lieu la première rencontre du groupe que j&#8217;ai lancé avec Alexandre CUVA : Serious G@GE (SeriousGaGE.ch). Il s&#8217;agit d&#8217;un groupe naissant qui se rencontre une fois par mois à Genève en soirée pour mettre en oeuvre &#8230; <a href="http://inagua.ch/2012/06/07/1er-meetup-serious-gge/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Lundi soir a eu lieu la première rencontre du groupe que j&#8217;ai lancé avec Alexandre CUVA : <a href="seriousgage.ch" target="_blank">Serious G@GE</a> (<a href="seriousgage.ch" target="_blank">SeriousGaGE.ch</a>).</p>
<p>Il s&#8217;agit d&#8217;un groupe naissant qui se rencontre une fois par mois à Genève en soirée pour mettre en oeuvre des <em>(Non Video) Serious Games</em>&#8230;</p>
<p><center><a href="http://www.meetup.com/serious-games/boards/view/viewthread?thread=23958382"><img class="aligncenter" title="Product Box par et pour le Serious G@GE" src="http://photos2.meetupstatic.com/photos/event/8/f/d/6/600_126696822.jpeg" alt="" width="400" /></a></center></p>
<p><span id="more-1249"></span></p>
<p>Et pour cette première, nous avons déroulé une Product Box, afin de donner un aperçu de <a href="http://inagua.ch/formations/innovation-games-geneve-2012/" target="_blank">la formation que je vais animer avec Alexandre BOUTIN</a> (<a href="http://www.agiletoyou.com/" target="_blank">AgileToYou.com</a>) le 29 juin prochain à Genève.<br />
Un franc succès semble-t-il : <a href="http://www.meetup.com/serious-games/boards/view/viewthread?thread=23958382" target="_blank">voir le compte rendu avec les vidéos</a>.</p>
<p>J&#8217;ai eu l&#8217;idée de créer ce groupe après <a href="http://pyxis-tech.com/fr/notre-offre/formation-agile/management-30/" target="_blank">la formation de Management 3.0</a> que j&#8217;ai suivie il y a quelques semaines grâce à Francois BEAUREGARD de Pyxis. Il y avait des ateliers qui n&#8217;étaient pas uniquement agiles. Et ma participation à la première conférence <a href="http://groups.google.com/group/agiles-games-france" target="_blank">Agile Games France</a> à Nantes quelques jours plus tard a fini de me convaincre, tant par ses ateliers agiles que ceux plus personnels souvent poussés par des coaches non agiles.</p>
<p>Mon envie de découvrir et pratiquer des Serious Games est tant motivée par une volonté personnelle et mon goût pour les jeux, que par le souhait de connaitre d&#8217;avantage de jeux et donc d&#8217;outils pour animer (au sens propre comme au sens figuré) les formations agiles que je donne.<br />
Je suis pressé d&#8217;être au mois prochain.</p>
]]></content:encoded>
			<wfw:commentRss>http://inagua.ch/2012/06/07/1er-meetup-serious-gge/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Innovation Games à Genève</title>
		<link>http://inagua.ch/2012/05/31/innovation-games-a-geneve/</link>
		<comments>http://inagua.ch/2012/05/31/innovation-games-a-geneve/#comments</comments>
		<pubDate>Thu, 31 May 2012 13:56:36 +0000</pubDate>
		<dc:creator>jacques</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[formation]]></category>
		<category><![CDATA[serious games]]></category>

		<guid isPermaLink="false">http://inagua.ch/?p=1239</guid>
		<description><![CDATA[Vous êtes responsable produit, côté marketing, business ou MOA, chef de projet ou simplement acteur sur une application ou un service ? Vous souhaitez revoir ou affiner la vision ou les caractéristiques, définir les fonctionnalités clefs ? Les Innovations Games &#8230; <a href="http://inagua.ch/2012/05/31/innovation-games-a-geneve/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Vous êtes responsable produit, côté marketing, business ou MOA, chef de projet ou simplement acteur sur une application ou un service ?<br />
Vous souhaitez revoir ou affiner la vision ou les caractéristiques, définir les fonctionnalités clefs ?</p>
<p>Les Innovations Games sont pour vous : <a href="http://innovationgames.com" target="_blank">http://innovationgames.com</a></p>
<p><span id="more-1239"></span>Il s’agit d’un ensemble d’ateliers, dans la lignée des Serious Games, formalisés par Luke Hohmann dans son livre éponyme, qui ont pour vocation de générer du feedback sur un produit ou un service en jouant le rôle des utilisateurs ou consommateurs.</p>
<p>Avec la collaboration d’Alexandre Boutin (<a title="AgileToYou" href="http://www.agiletoyou.com/" target="_blank">agiletoyou.com</a>), certifié par Luke Hohmann, nous animerons <span style="text-decoration: underline;"><strong>une formation d’une journée le vendredi 29 juin à Genève</strong></span>.<br />
Si le sujet vous passionne, inscrivez-vous : <a href="http://inagua.ch/formations/innovation-games-geneve-2012/" target="_blank">http://inagua.ch/formations/innovation-games-geneve-2012/</a></p>
<p>Si vous êtes intéressés mais avez des doutes, vous pouvez toujours venir <span style="text-decoration: underline;"><strong>lundi prochain (4 juin) à la soirée du groupe Serious G@GE</strong></span> : <a href="http://seriousgage.ch" target="_blank">SeriousGage.ch</a><br />
Ce groupe gratuit, naissant, a pour vocation de réunir une fois par mois des personnes intéressées par la thématique des serious games.<br />
La séance de lancement, lundi prochain, sera “comme par hasard” sur la Product Box, l’un des Innovation Games.</p>
<p>Nous espérons vous avoir convaincus que cet atelier ne nécessite aucune compétence particulière, et encore moins dans le développement logiciel.</p>
]]></content:encoded>
			<wfw:commentRss>http://inagua.ch/2012/05/31/innovation-games-a-geneve/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Heroku on Rails</title>
		<link>http://inagua.ch/2012/05/26/heroku-on-rails/</link>
		<comments>http://inagua.ch/2012/05/26/heroku-on-rails/#comments</comments>
		<pubDate>Sat, 26 May 2012 10:07:07 +0000</pubDate>
		<dc:creator>jacques</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[heroku]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://inagua.ch/?p=1190</guid>
		<description><![CDATA[Cela faisait plusieurs mois que je voulais mais je me disais &#8220;ça va me prendre trop de temps&#8221;&#8230; Erreur ! Il m&#8217;a fallu 1h50 et 9 lignes de commande pour mettre en place mon environnement de développement Rails professionnel, créer &#8230; <a href="http://inagua.ch/2012/05/26/heroku-on-rails/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<table>
<tbody>
<tr>
<td width="200px"><img title="ruby_heroku" src="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/05/ruby_heroku.png" alt="" width="200" /></td>
<td style="vertical-align: middle;">Cela faisait plusieurs mois que je voulais mais je me disais &#8220;ça va me prendre trop de temps&#8221;&#8230;</p>
<p>Erreur ! Il m&#8217;a fallu 1h50 et 9 lignes de commande pour mettre en place mon environnement de développement Rails professionnel, créer mon application et la déployer sur une plateforme professionnelle : <a title="Heroku Quick Start" href="https://devcenter.heroku.com/articles/quickstart" target="_blank">Heroku</a>.</td>
</tr>
</tbody>
</table>
<p>Un véritable exploit, quand on sait qu&#8217;il m&#8217;a fallu plusieurs jours pour faire un tutoriel Java EE&#8230; Exploit dû d&#8217;avantage aux technologies, plutôt qu&#8217;à moi&#8230; Hélas ;)</p>
<p><span id="more-1190"></span></p>
<h1>L&#8217;environnement de développement</h1>
<ul>
<li>Installation de <a title="RVM" href="https://rvm.io" target="_blank">RVM</a> (<em>Ruby Version Manager</em>) pour gérer différentes versions de Ruby&#8230; Pour cela je me suis inspiré de <a href="http://inagua.ch/2010/01/25/gerer-plusieurs-install-de-ruby/" target="_blank">l&#8217;article de stéphane</a>, que j&#8217;ai mis à jour via un comment :</li>
<ul>
<li>(1) <code>curl -L get.rvm.io | bash -s stable</code></li>
<li>(2) <code>source /Users/jacques/.rvm/scripts/rvm</code></li>
</ul>
<li>Installer la dernière version de ruby :</li>
<ul>
<li>(3) <code>rvm install 1.9.3</code></li>
</ul>
<li>Puis installer rails :</li>
<ul>
<li>(4) <code>sudo gem install rails</code></li>
</ul>
<li>J&#8217;ai ensuite créé un repository sur <a title="Github" href="https://github.com/" target="_blank">Github.com</a>, la plateforme communautaire hébergeant Git un gestionnaire de version (comme SVN) mais distribué.</li>
</ul>
<h1>Création de l&#8217;application</h1>
<ul>
<li>Après avoir récupéré en local le projet vide depuis le repository Github via</li>
<ul>
<li>(5) <code>git clone git@github.com:&lt;username&gt;/myApp</code></li>
</ul>
<li>J&#8217;ai créé le squelette de mon application Rails via la commande dédiée en commençant à suivre <a title="Rails 3.x sur Heroku" href="https://devcenter.heroku.com/articles/rails3" target="_blank">le tutoriel Heroku sur les applications Rails</a> :</li>
<ul>
<li>(6) <code>rails new myApp</code></li>
</ul>
<li>J&#8217;ai ensuite &#8220;poussé&#8221; ce squelette sur le repositroy :</li>
<ul>
<li>(7) <code>git commit -am "myApp bootstrap"</code></li>
</ul>
</ul>
<h1>Déploiement de l&#8217;application via Heroku</h1>
<ul>
<li>Si c&#8217;est pas déjà fait, se créer un compte (gratuitement) sur <a title="Login on Heroku.com" href="https://api.heroku.com/login" target="_blank">http://heroku.com</a></li>
<li>J&#8217;ai configuré mon application pour être compatible avec Heroku :</li>
<ul>
<li>(8) <code>heroku create --stack cedar</code></li>
</ul>
<li>J&#8217;ai poussé l&#8217;application en production, à savoir sur la plateforme Heroku :</li>
<ul>
<li>(9) <code>git push heroku master</code></li>
</ul>
<li>Cela créé une instance de mon application sur Heroku avec un NOM_BARBARE généré automatiquement&#8230; Mon application est alors immédiatement accessible sur l&#8217;Internet Mondial via l&#8217;URL : http://NOM_BARBARE.herokuapp.com</li>
</ul>
<h1>Aller plus loin</h1>
<h3>Heroku</h3>
<p>Cette plateforme vous permet donc, en collaboration avec Github, de mettre en oeuvre une application web professionnelle, robuste et scallable.</p>
<p>Mais vous allez me dire qu&#8217;une URL de la forme http://NOM_BARBARE.herokuapp.com ne fait pas très pro&#8230; Je vous l&#8217;accorde. Il vous suffit alors de vous connecter sur votre compte Heroku, d&#8217;aller sur l&#8217;onglet My Apps, de selectionner la bonne application, de saisir le nom que vous souhaitez &#8220;myFabulousApp&#8221; et puis valider ! Ca y est, votre application est disponible à l&#8217;URL http://myFabulousApp.herokuapp.com. Et si cela ne vous suffit toujours pas, <a title="Custom Domains on Heroku" href="https://devcenter.heroku.com/articles/custom-domains" target="_blank">vous pourrez paramétrer Heroku</a> pour que votre application soit accessible via votre domaine http://myFabulousApp.com.</p>
<p>De plus, avec le temps, Heroku offre une compatibilité à de plus en plus de technologies : <a title="Deploy an application" href="https://devcenter.heroku.com/articles/quickstart#step_4_deploy_an_application" target="_blank">Deploy an application</a></p>
<h3>IDE Rails</h3>
<p>Etant un amoureux de l&#8217;IDE IDEA IntelliJ, je ne peux que recommander RubyMine, avec les deux remarques suivantes :</p>
<ul>
<li>Bien que j&#8217;assume pleinement ce choix, et que je reste intimement convaincu qu&#8217;il n&#8217;y a pas mieux, il n&#8217;en reste pas moins polémique : d&#8217;autres recommandent un bon viex TextMate&#8230; Mais comment peut-on encore développer dans un outil qui ne supporte même pas les refactoring, surtout avec un langage à typage dynamique comme Ruby et Rails ???</li>
<li>RubyMine est payant, quelques dizaines de dolars&#8230; Mais ça les vaut largement. D&#8217;ailleurs la version d&#8217;évaluation gratuite pendant 30 jours vous le prouvera (c&#8217;est comme si on vous offrait votre première dose de drogue dure ;). Et puis il y a des possibilités pour ne pas payer sur la page <a title="RubyMine Pricing" href="http://www.jetbrains.com/ruby/buy/index.jsp" target="_blank">RubyMine Pricing</a>.</li>
</ul>
<h1>Conclusion</h1>
<table>
<tbody>
<tr>
<td width="220px"><img title="ruby-breakfast" src="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/05/ruby-breakfast.jpg" alt="" width="210" /></td>
<td style="vertical-align: top;">Bref, plutôt expiditif comme mise en production&#8230; Et pourtant avec une robustesse qui répond tout à fait à des besoins entreprise.80% du temps passé, est du aux téléchargements d&#8217;installation (RVM, Ruby, Rails puis IDEA RubyMine)&#8230;Ah, une dernière chose : tout cela pour 0 francs&#8230; Ou euros&#8230; Ah si, 7,40 francs, à savoir le prix d&#8217;un Frapuccino car j&#8217;ai fait cela depuis une enseigne de café ricain bien connue, avec vu sur le Léman.</td>
</tr>
</tbody>
</table>
<div><em>PS : Bon anniversaire Maman.</em></div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://inagua.ch/2012/05/26/heroku-on-rails/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dash : sounds useful !</title>
		<link>http://inagua.ch/2012/05/15/dash-sounds-useful/</link>
		<comments>http://inagua.ch/2012/05/15/dash-sounds-useful/#comments</comments>
		<pubDate>Tue, 15 May 2012 13:30:54 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://inagua.ch/?p=1178</guid>
		<description><![CDATA[I’ve just come across dash. (free in mac app store :  http://itunes.apple.com/us/app/dash-docs-snippets/id458034879?mt=12) And I thought you might like it. It’s a snippet manager and an API documentation browser for Mac Os X. Access to documentation is really fast ;-) (a &#8230; <a href="http://inagua.ch/2012/05/15/dash-sounds-useful/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/05/dash_128.png"><img class="alignnone size-full wp-image-1179" title="dash_128" src="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/05/dash_128.png" alt="" width="128" height="128" /></a></p>
<p>I’ve just come across <strong>dash</strong>.<br />
(free in mac app store :  <a title="mac app store" href="http://itunes.apple.com/us/app/dash-docs-snippets/id458034879?mt=12">http://itunes.apple.com/us/app/dash-docs-snippets/id458034879?mt=12</a>)<br />
And I thought you might like it.</p>
<p>It’s a snippet manager <strong>and</strong> an API documentation browser for Mac Os X.<br />
Access to documentation is really fast ;-) (a nice improvement from integrated documentation browser inside XCode.)<br />
As I use different languages (ruby, Objective-C, javascript), I find this unified interface handy.</p>
<p>Snippets can be created and shared (via a dropbox folder) inside a team.<br />
(They will appear as search results)</p>
<p>Here is what it looks like :</p>
<p><a href="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/05/Screen-Shot-2012-05-15-at-3.33.47-PM.png"><img class="alignnone size-full wp-image-1183" title="Screen Shot 2012-05-15 at 3.33.47 PM" src="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/05/Screen-Shot-2012-05-15-at-3.33.47-PM.png" alt="" width="996" height="942" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://inagua.ch/2012/05/15/dash-sounds-useful/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dealing with &#8220;missing a required architecture &#8211; armv6&#8243; error</title>
		<link>http://inagua.ch/2012/04/04/dealing-with-missing-a-required-architecture-armv6-error/</link>
		<comments>http://inagua.ch/2012/04/04/dealing-with-missing-a-required-architecture-armv6-error/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 12:10:29 +0000</pubDate>
		<dc:creator>robert</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://inagua.ch/?p=1118</guid>
		<description><![CDATA[While trying to submit the version 3.0 of skippers.tv app to the Apple App Store we found following issue: iPhone/iPod Touch: application executable is missing a required architecture. At least one of the following architecture(s) must be present: armv6 &#160; &#8230; <a href="http://inagua.ch/2012/04/04/dealing-with-missing-a-required-architecture-armv6-error/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>While trying to submit the version 3.0 of <a title="Show skippers.tv app on the App Store web." href="http://itunes.apple.com/us/app/skippers.tv/id437499062" target="_blank">skippers.tv app</a> to the Apple App Store we found following issue:</p>
<p style="text-align: center;"><a href="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/04/armv6_submission_validation_error.png"><img class="aligncenter  wp-image-1122" title="iPhone/iPod Touch: application executable is missing a required architecture. At least one of the following architecture(s) must be present: armv6" src="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/04/armv6_submission_validation_error.png" alt="" width="524" height="71" /></a></p>
<blockquote><p>iPhone/iPod Touch: application executable is missing a required architecture. At least one of the following architecture(s) must be present: armv6</p></blockquote>
<p>&nbsp;</p>
<p>As it doesn&#8217;t seem to be <a href="http://stackoverflow.com/questions/4198676/warning-iphone-apps-should-include-an-armv6-architecture-even-with-build-config" target="_blank">an</a> <a href="http://stackoverflow.com/questions/6323491/ios-application-missing-required-architecture-even-when-listed" target="_blank">isolated</a> <a href="http://stackoverflow.com/questions/6393701/iphone-ipod-touch-application-executable-is-missing-a-required-architecture" target="_blank">issue</a> trivial to solve, I&#8217;d like to share how to we managed to fix it. We found the good hint in a comment of <a href="http://iostipsntricks.wordpress.com/2011/06/24/solved-application-executable-is-missing-a-required-architecture-at-least-one-of-the-following-architectures-must-be-present-armv6/" target="_blank">this post</a>. On the setting <strong>Project -&gt; Build Settings -&gt; Architectures -&gt; Release</strong>, we selected &#8220;Other&#8230;&#8221; and we removed <em>$(ARCHS_STANDARD_32_BIT)</em>, and we added two values: first &#8220;<em>armv6</em>&#8221; and second &#8220;<em>armv7</em>&#8220;. The project settings were like this:</p>
<p><a href="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/04/skippers_project_armv6_setting.png"><img class="aligncenter size-full wp-image-1120" title="skippers_project_armv6_setting" src="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/04/skippers_project_armv6_setting.png" alt="Project &quot;armv6&quot; and &quot;armv7&quot; settings" width="787" height="424" /></a></p>
<p>Making the changes at project level propagates the value in the corresponding target:</p>
<p><a href="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/04/skippers_target_armv6_setting.png"><img class="aligncenter size-full wp-image-1121" title="skippers_target_armv6_setting" src="http://cluster006.ovh.net/~inagua/wp-content/uploads/2012/04/skippers_target_armv6_setting.png" alt="Target &quot;armv6&quot; and &quot;armv7&quot; overridden settings" width="697" height="286" /></a></p>
<p>I hope this can help other people facing the same issue.</p>
<p>Did it work for you? Did you find another solution? Do please share it in the comments. Thanks!</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://inagua.ch/2012/04/04/dealing-with-missing-a-required-architecture-armv6-error/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
