<?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>netinfluence&#039;s blog &#187; communauté</title>
	<atom:link href="http://blog.netinfluence.com/tag/communaute/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.netinfluence.com</link>
	<description>le blog de l&#039;agence netinfluence</description>
	<lastBuildDate>Fri, 13 Jan 2012 10:39:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Closure et fonctions lambda en Objective-C</title>
		<link>http://blog.netinfluence.com/2009/11/12/closure-et-fonctions-lambda-en-objective-c/</link>
		<comments>http://blog.netinfluence.com/2009/11/12/closure-et-fonctions-lambda-en-objective-c/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 22:02:00 +0000</pubDate>
		<dc:creator>macmade</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[avant-garde]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[communauté]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[méthodes]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=55</guid>
		<description><![CDATA[De nombreux langages de scripts permettent l'utilisation de «fonctions lambdas», ou encore «fonctions anonymes», concept généralement lié au phénomène appelé «closure».<br />
 Il s'agit de concepts bien connus notamment en JavaScript, ActionScript, ou encore en PHP depuis sa version 5.3.<br />
 Le langage Objective-C offre depuis peu une implémentation de ces deux concepts, appelée «blocks».<br />
 Les blocks sont disponibles depuis Mac OS X 10.6 et l'adoption de Clang.]]></description>
			<content:encoded><![CDATA[<div class="macmade-grey">
<div class="macmade-small"> Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found at: <a href="http://www.gnu.org/copyleft/fdl.html" title="Free Documentation License">http://www.gnu.org/copyleft/fdl.html</a></div>
</div>
<h3>Définitions</h3>
<div>
De nombreux langages de scripts permettent l&#8217;utilisation de «fonctions lambdas», ou encore «fonctions anonymes», concept généralement lié au phénomène appelé «closure».<br />
 Il s&#8217;agit de concepts bien connus notamment en JavaScript, ActionScript, ou encore en PHP depuis sa version 5.3.<br />
 Le langage Objective-C offre depuis peu une implémentation de ces deux concepts, appelée «blocks».<br />
 Les blocks sont disponibles depuis Mac OS X 10.6 et l&#8217;adoption de Clang.
</div>
<p><span id="more-55"></span></p>
<h4>Fonctions anonymes</h4>
<div> Comme son nom l&#8217;indique, une fonction anonyme est une fonction ne possédant pas de nom, ou d&#8217;identifiant. Elle ne contient que son contenu (body), et peut être associée à une variable, pour être ré-utilisée, ou passée en argument d&#8217;une autre fonction. </div>
<div> Ce phénomène est très souvent utilisé dans des langages de scripts, notamment pour des callbacks. </div>
<div> En JavaScript par exemple, imaginons une fonction standard nommée «foo», prenant en paramètre un callback, et l&#8217;exécutant dans son body: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">function</span> foo( callback )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    callback();</code><br />
 <code class="macmade-source">}</code> </div>
<div> Il est parfaitement possible de définir une autre fonction standard, et de la passer en paramètre de notre première fonction: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">function</span> bar()</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    alert( <span class="macmade-code-string">'Hello World!'</span> );</code><br />
 <code class="macmade-source">}</code></p>
<p> <code class="macmade-source">foo( bar );</code> </div>
<div> Le problème dans un tel cas est que nous déclarons une fonction nommée «bar» dans le scope global. Il en découle un risque de collision avec une éventuelle autre fonction qui porterait le même nom. </div>
<div> Le langage JavaScript nous permet donc de déclarer la fonction utilisée comme callback lors de l&#8217;appel: </div>
<div class="macmade-code"> <code class="macmade-source">foo(</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">function</span>()</code><br />
 <code class="macmade-source">    {</code><br />
 <code class="macmade-source">        alert( <span class="macmade-code-string">'Hello World!'</span> );</code><br />
 <code class="macmade-source">    }</code><br />
 <code class="macmade-source">);</code> </div>
<div> Notre callback n&#8217;a ici pas d&#8217;identifiant. Il n&#8217;existera pas dans le scope global, et donc ne risquera pas d&#8217;entrer en conflit avec une fonction existante. </div>
<div> Il est également possible de définir le callback comme variable. Il n&#8217;existera toujours pas dans le scope global, mais pourra ainsi être ré-utilisé à volonté via cette variable: </div>
<div class="macmade-code"> <code class="macmade-source">myCallback = <span class="macmade-code-keyword">function</span>()</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    alert( <span class="macmade-code-string">'Hello World!'</span> );</code><br />
 <code class="macmade-source">};</code></p>
<p> <code class="macmade-source">foo( myCallback );</code> </div>
<h4>Closure</h4>
<div> Le phénomène appelé «closure» consiste en la possibilité, pour une fonction, d&#8217;accéder aux variables disponibles dans son contexte de déclaration, ceci même dans le cas où son contexte d&#8217;exécution est différent. </div>
<div> Toujours en JavaScript, imaginons le code suivant: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">function</span> foo( callback )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    alert( callback() );</code><br />
 <code class="macmade-source">}</code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">function</span> bar()</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">var</span> str = <span class="macmade-code-string">'Hello World'</span>;</code></p>
<p> <code class="macmade-source">    foo(</code><br />
 <code class="macmade-source">        <span class="macmade-code-keyword">function</span>()</code><br />
 <code class="macmade-source">        {</code><br />
 <code class="macmade-source">            <span class="macmade-code-keyword">return</span> str;</code><br />
 <code class="macmade-source">        }</code><br />
 <code class="macmade-source">    );</code><br />
 <code class="macmade-source">}</code></p>
<p> <code class="macmade-source">bar();</code> </div>
<div> Notre callback, passé à la fonction «foo» depuis le contexte d&#8217;exécution de le fonction «bar» retourne une variable nommée «str».<br />
 Or, cette variable, déclarée dans le contexte de la fonction «bar», est une variable locale à cette dernière. Autrement dit, elle n&#8217;existe qu&#8217;à l&#8217;intérieur de ce contexte.<br />
 Comme notre callback est exécuté depuis un contexte différent du contexte de la déclaration de cette variable, on pourrait penser que le code-ci dessus n&#8217;affiche rien.<br />
 Mais c&#8217;est ici que le phénomène de closure intervient.<br />
 Quel que soit son contexte d&#8217;exécution, une fonction conserve un accès aux variables disponibles lors de sa déclaration. </div>
<div> Notre callback aura donc bien accès à la variable «str», même s&#8217;il est effectivement appelé depuis la fonction «foo», et que cette dernière n&#8217;y a pas accès. </div>
<h3>Implémentation en Objective-C</h3>
<div> Objective-C implémente ce genre de concepts, même s&#8217;il existe un certain nombre de subtilités, venant du fait qu&#8217;il s&#8217;agit d&#8217;un langage compilé dérivé du C, en restant très proche, donc très différent d&#8217;un langage de script interprété. </div>
<div> Il est à noter que le support des blocks est aussi disponible en C pur, ou en C++ (et donc en Objective-C++). </div>
<div> De même qu&#8217;une fonction standard en C, la déclaration d&#8217;un block (fonction anonyme) se doit d&#8217;être précédée par la déclaration de son prototype. </div>
<div> La syntaxe de déclaration d&#8217;un block n&#8217;est pas la plus évidente, mais on s&#8217;y fait relativement vite.<br />
 Voici par exemple le prototype d&#8217;un block: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-predefined">NSString</span> * ( ^myBlock )( <span class="macmade-code-keyword">int</span> );</code> </div>
<div> Nous déclarons ici le prototype d&#8217;un block («^»), destiné à être nommé «myBlock», prenant un argument unique de type «int», et retournant un pointeur sur un objet de type «NSString». </div>
<div> Nous pouvons maintenant déclarer le block: </div>
<div class="macmade-code"> <code class="macmade-source">myBlock = ^( <span class="macmade-code-keyword">int</span> number )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">return</span> [ <span class="macmade-code-predefined">NSString stringWithFormat</span>: <span class="macmade-code-string">@"Passed number: %i"</span>, number ];</code><br />
 <code class="macmade-source">};</code> </div>
<div> Nous assignons donc à la variable «myBlock» le body d&#8217;une fonction, prenant comme argument «number» un entier. Cette fonction retourne un objet «NSString», dans lequel sera affiché cet entier. </div>
<div> <strong>Attention, ne pas oublier le point virgule à la fin de la déclaration du block!</strong> </div>
<div> Si cela est facultatif dans des langages de scripts, c&#8217;est absolument nécessaire pour un langage compilé comme Objective-C.<br />
 L&#8217;oublier résulterait en une erreur du compilateur, qui refuserait de générer l&#8217;exécutable final. </div>
<div> Le block peut désormais être utilisé, comme une fonction standard: </div>
<div class="macmade-code"> <code class="macmade-source">myBlock();</code> </div>
<div> Voici le code complet d&#8217;un programme Objective-C, reprenant l&#8217;exemple précédent: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">&lt;Cocoa/Cocoa.h&gt;</span></code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">int</span> main( <span class="macmade-code-keyword">void</span> )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSAutoreleasePool</span> * pool;</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSString</span>          * ( ^myBlock )( <span class="macmade-code-keyword">int</span> );</code></p>
<p> <code class="macmade-source">    pool    = [ [ <span class="macmade-code-predefined">NSAutoreleasePool</span> alloc ] init ];</code><br />
 <code class="macmade-source">    myBlock = ^( <span class="macmade-code-keyword">int</span> number )</code><br />
 <code class="macmade-source">    {</code><br />
 <code class="macmade-source">        <span class="macmade-code-keyword">return</span> [ <span class="macmade-code-predefined">NSString stringWithFormat</span>: <span class="macmade-code-string">@"Passed number: %i"</span>, number ];</code><br />
 <code class="macmade-source">    };</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-predefined">NSLog</span>( <span class="macmade-code-string">@"%@"</span>, myBlock() );</code></p>
<p> <code class="macmade-source">    [ pool release ];</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">return</span> EXIT_SUCCESS;</code><br />
 <code class="macmade-source">}</code> </div>
<div> Un tel programme peut être compilé à l&#8217;aide de la commande suivante (Terminal): </div>
<div class="macmade-code"> <code class="macmade-source">gcc -Wall -framework Cocoa -o test test.m</code> </div>
<div> Cela générera un fichier exécutable nommé «test», à partir du fichier source «test.m».<br />
 Pour lancer l&#8217;exécutable: </div>
<div class="macmade-code"> <code class="macmade-source">./test</code> </div>
<div> La déclaration du prototype d&#8217;un block peut être omise dans le cas où le block n&#8217;est pas assigné à une variable, comme par exemple s&#8217;il est transmis directement comme argument. </div>
<div> Par exemple: </div>
<div class="macmade-code"> <code class="macmade-source">someFunction( ^ <span class="macmade-code-predefined">NSString</span> * ( <span class="macmade-code-keyword">void</span> ) { <span class="macmade-code-keyword">return</span> <span class="macmade-code-string">@"Hello World!"</span> } );</code> </div>
<div> Il est à noter que dans un tel cas, le type de retour doit être déclaré. Ici, il s&#8217;agit d&#8217;un objet de type «NSString». </div>
<h4>Passage d&#8217;un block comme argument</h4>
<div> Un block peut bien sûr être passé comme argument d&#8217;une fonction C.<br />
 Là aussi, la syntaxe peut être quelque peu déroutante à première vue: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">void</span> logBlock( <span class="macmade-code-predefined">NSString</span> * ( ^theBlock )( <span class="macmade-code-keyword">int</span> ) )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSLog</span>( <span class="macmade-code-string">@"Block returned: %@"</span>, theBlock() );</code><br />
 <code class="macmade-source">}</code> </div>
<div> Evidemment, comme Objective-C est un langage fortement typé, une fonction recevant un block en argument doit également déclarer son type de retour et le type de ses éventuels arguments. </div>
<div> Il en va de même dans le cas d&#8217;une méthode d&#8217;une classe Objective-C: </div>
<div class="macmade-code"> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )logBlock: ( <span class="macmade-code-predefined">NSString</span> * ( ^ )( <span class="macmade-code-keyword">int</span> ) )theBlock;</code> </div>
<h4>Closure</h4>
<div> Le phénomène de closure est également présent en Objective-C, même si son comportement est évidemment différent de celui des langages interprétés. </div>
<div> Imaginons le programme suivant: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">&lt;Cocoa/Cocoa.h&gt;</span></code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">void</span> logBlock( <span class="macmade-code-keyword">int</span> ( ^theBlock )( <span class="macmade-code-keyword">void</span> ) )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSLog</span>( <span class="macmade-code-string">@"Closure var X: %i"</span>, theBlock() );</code><br />
 <code class="macmade-source">}</code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">int</span> main( <span class="macmade-code-keyword">void</span> )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSAutoreleasePool</span> * pool;</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">int</span> ( ^myBlock )( <span class="macmade-code-keyword">void</span> );</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">int</span> x;</code></p>
<p> <code class="macmade-source">    pool = [ [ <span class="macmade-code-predefined">NSAutoreleasePool</span> alloc ] init ];</code><br />
 <code class="macmade-source">    x    = 27;</code></p>
<p> <code class="macmade-source">    myBlock = ^( <span class="macmade-code-keyword">void</span> )</code><br />
 <code class="macmade-source">    {</code><br />
 <code class="macmade-source">        <span class="macmade-code-keyword">return</span> x;</code><br />
 <code class="macmade-source">    };</code></p>
<p> <code class="macmade-source">    logBlock( myBlock );</code></p>
<p> <code class="macmade-source">    [ pool release ];</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">return</span> EXIT_SUCCESS;</code><br />
 <code class="macmade-source">}</code> </div>
<div> La fonction «main» déclare un entier, de valeur 27, ainsi qu&#8217;un block, retournant cette même variable.<br />
 Le block set ensuite passé à la fonction «logBlock», qui affiche sa valeur de retour. </div>
<div> Même dans le contexte d&#8217;exécution de la fonction «logBlock», le block déclaré dans la fonction «main» continue d&#8217;avoir accès à l&#8217;entier «x», et peut donc sans aucun problème en retourner la valeur. </div>
<div> Il est à noter que les blocks ont également accès aux variable globales, même statiques si elles sont disponibles dans le contexte du block. </div>
<div> Il existe ici une première subtilité. En effet, les variables disponibles depuis un block par le phénomène de closure sont de type «const». Autrement dit, elle ne peuvent être modifiées depuis l&#8217;intérieur du block. </div>
<div> Par exemple, imaginons que notre block incrémente la valeur de x avant de la retourner: </div>
<div class="macmade-code"> <code class="macmade-source">myBlock = ^( <span class="macmade-code-keyword">void</span> )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    x++</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">return</span> x;</code><br />
 <code class="macmade-source">};</code> </div>
<div> Le compilateur refusera ici de compiler le programme, puisque la variable «x» n&#8217;est disponible qu&#8217;en lecture pour notre block. </div>
<div> Pour qu&#8217;une variable puisse être modifiée depuis un block, il faut la déclarer avec le mot clé «__block».<br />
 Ainsi, le codé précédent est valide si l&#8217;on déclare la variable x ainsi: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">__block</span> <span class="macmade-code-keyword">int</span> x;</code> </div>
<h4>Gestion de la mémoire</h4>
<div> Au niveau C, un block est une structure, pouvant être copiée et détruite.<br />
 Deux fonctions C sont à disposition pour cet usage: «Block_copy()» et «Block_destroy».<br />
 En Objective-C, un block peut également recevoir les messages «retain», «release» et «copie», comme un objet. </div>
<div> C&#8217;est aspect peut-être extrêmement important dans le cas où un block doit être conservé pour une utilisation ultérieure (et par exemple stocké dans une propriété d&#8217;une classe). </div>
<div> Ne pas copier le block, ou ne pas effectuer de «retain» dans un tel cas peut en effet induire une erreur de segmentation. </div>
<h4>Exemple d&#8217;utilisation</h4>
<div> Les blocks peuvent être utilisés dans de très nombreux contextes, afin de simplifier le code, et réduire le nombre de fonctions déclarées. </div>
<div> Voici un exemple simple illustrant l&#8217;utilisation des blocks. </div>
<div> Nous allons ajouter à la classe «NSArray» une méthode statique permettant de générer un tableau en filtrant les éléments d&#8217;un autre tableau, à l&#8217;aide d&#8217;un callback. </div>
<div> Pour les amateurs de PHP, il s&#8217;agit ici d&#8217;un équivalent de la fonction «array_filter()». </div>
<div> Nous allons commencer par la déclaration d&#8217;une catégorie de la classe «NSArray». Pour rappel, une catégorie permet l&#8217;ajout de méthodes dans une classe existante, évitant ainsi le besoin de créer une sous-classe.</div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">@interface</span> <span class="macmade-code-predefined">NSArray</span>( BlockExample )</code></p>
<p> <code class="macmade-source">+ ( <span class="macmade-code-predefined">NSArray</span> * )arrayByFilteringArray: ( <span class="macmade-code-predefined">NSArray</span> * )source withCallback: ( <span class="macmade-code-keyword">BOOL</span> ( ^ )( <span class="macmade-code-keyword">id</span> ) )callback;</code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">@end</span></code> </div>
<div> Nous déclarons ici une méthode retournant un objet de type «NSArray», et prenant en argument un autre objet «NSArray», ainsi qu&#8217;un callback, sous forme de block. </div>
<div> Ce callback sera exécuté pour chaque élément du tableau passé en argument. Il doit retourner une valeur booléenne, afin de savoir si l&#8217;élément courant du tableau source doit être conservé dans le tableau retourné. Le block prend donc comme unique argument l&#8217;objet courant du tableau source. </div>
<div> Voyons maintenant l&#8217;implémentation de cette méthode: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> <span class="macmade-code-predefined">NSArray</span>( BlockExample )</code></p>
<p> <code class="macmade-source">+ ( <span class="macmade-code-predefined">NSArray</span> * )arrayByFilteringArray: ( <span class="macmade-code-predefined">NSArray</span> * )source withCallback: ( <span class="macmade-code-keyword">BOOL</span> ( ^ )( <span class="macmade-code-keyword">id</span> ) )callback</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSMutableArray</span> * result;</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">id</span>               element;</code></p>
<p> <code class="macmade-source">    result = [ <span class="macmade-code-predefined">NSMutableArray</span> <span class="macmade-code-predefined">arrayWithCapacity</span>: [ source count ] ];</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">for</span>( element <span class="macmade-code-keyword">in</span> source ) {</code></p>
<p> <code class="macmade-source">        <span class="macmade-code-keyword">if</span>( callback( element ) == <span class="macmade-code-keyword">YES</span> ) {</code></p>
<p> <code class="macmade-source">            [ result <span class="macmade-code-predefined">addObject</span>: element ];</code><br />
 <code class="macmade-source">        }</code><br />
 <code class="macmade-source">    }</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">return</span> result;</code><br />
 <code class="macmade-source">}</code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">@end</span></code> </div>
<div> Nous créons en premier lieu un tableau de taille dynamique («NSMutableArray»), en lui allouant une capacité initiale correspondant au nombre d&#8217;entrées du tableau source. </div>
<div> Ensuite, nous itérons chaque élément du tableau source, et nous ajoutons l&#8217;élément courant dans le cas où le résultat du callback retourne la valeur booléenne «YES». </div>
<div> Voici un exemple de programme utilisant une telle méthode.<br />
 Ici, nous nous servons du callback pour créer un tableau ne contenant que les objets de type «NSString» du tableau source: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">&lt;Cocoa/Cocoa.h&gt;</span></code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">@interface</span> <span class="macmade-code-predefined">NSArray</span>( BlockExample )</code></p>
<p> <code class="macmade-source">+ ( <span class="macmade-code-predefined">NSArray</span> * )arrayByFilteringArray: ( <span class="macmade-code-predefined">NSArray</span> * )source withCallback: ( <span class="macmade-code-keyword">BOOL</span> ( ^ )( <span class="macmade-code-keyword">id</span> ) )callback;</code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">@end</span></code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> <span class="macmade-code-predefined">NSArray</span>( BlockExample )</code></p>
<p> <code class="macmade-source">+ ( <span class="macmade-code-predefined">NSArray</span> * )arrayByFilteringArray: ( <span class="macmade-code-predefined">NSArray</span> * )source withCallback: ( <span class="macmade-code-keyword">BOOL</span> ( ^ )( <span class="macmade-code-keyword">id</span> ) )callback</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSMutableArray</span> * result;</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">id</span>               element;</code></p>
<p> <code class="macmade-source">    result = [ <span class="macmade-code-predefined">NSMutableArray</span> <span class="macmade-code-predefined">arrayWithCapacity</span>: [ source count ] ];</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">for</span>( element <span class="macmade-code-keyword">in</span> source ) {</code></p>
<p> <code class="macmade-source">        <span class="macmade-code-keyword">if</span>( callback( element ) == <span class="macmade-code-keyword">YES</span> ) {</code></p>
<p> <code class="macmade-source">            [ result <span class="macmade-code-predefined">addObject</span>: element ];</code><br />
 <code class="macmade-source">        }</code><br />
 <code class="macmade-source">    }</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">return</span> result;</code><br />
 <code class="macmade-source">}</code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">@end</span></code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">int</span> main( <span class="macmade-code-keyword">void</span> )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSAutoreleasePool</span> * pool;</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSArray</span>           * array1;</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSArray</span>           * array2;</code></p>
<p> <code class="macmade-source">    pool   = [ [ <span class="macmade-code-predefined">NSAutoreleasePool</span> alloc ] init ];</code><br />
 <code class="macmade-source">    array1 = [ <span class="macmade-code-predefined">NSArray</span> <span class="macmade-code-predefined">arrayWithObjects</span>: <span class="macmade-code-string">@"Hello World!"</span>, [ <span class="macmade-code-predefined">NSDate</span> date ], <span class="macmade-code-string">@"Hello Universe!"</span>, <span class="macmade-code-keyword">nil</span> ];</code><br />
 <code class="macmade-source">    array2 = [ <span class="macmade-code-predefined">NSArray</span></code><br />
 <code class="macmade-source">                    <span class="macmade-code-ctag">arrayByFilteringArray</span>: array1</code><br />
 <code class="macmade-source">                    <span class="macmade-code-ctag">withCallback</span>: ^ <span class="macmade-code-keyword">BOOL</span> ( <span class="macmade-code-keyword">id</span> element )</code><br />
 <code class="macmade-source">                    {</code><br />
 <code class="macmade-source">                        <span class="macmade-code-keyword">return</span> [ element <span class="macmade-code-predefined">isKindOfClass</span>: [ <span class="macmade-code-predefined">NSString</span> class ] ];</code><br />
 <code class="macmade-source">                    }</code><br />
 <code class="macmade-source">             ];</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-predefined">NSLog</span>( <span class="macmade-code-string">@"%@"</span>, array2 );</code></p>
<p> <code class="macmade-source">    [ pool release ];</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">return</span> EXIT_SUCCESS;</code><br />
 <code class="macmade-source">}</code></div>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/11/12/closure-et-fonctions-lambda-en-objective-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Interview Loic Le Meur- 1ere partie</title>
		<link>http://blog.netinfluence.com/2009/08/18/interview-loic-le-meur-1ere-partie/</link>
		<comments>http://blog.netinfluence.com/2009/08/18/interview-loic-le-meur-1ere-partie/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 13:47:00 +0000</pubDate>
		<dc:creator>netinfluence</dc:creator>
				<category><![CDATA[think]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[communauté]]></category>
		<category><![CDATA[micro-blogging]]></category>
		<category><![CDATA[silicon valley]]></category>
		<category><![CDATA[socialmedia]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=78</guid>
		<description><![CDATA[This article was originally created by Marie Girardet (Left our team) Lors de mon séjour en Californie, j&#8217;ai eu l&#8217;occasion de rencontrer Loic Le Meur, fondateur de Seemic, qui s&#8217;est installé à San Francisco il y a plus de 2 ans maintenant. C&#8217;est d&#8217;ailleurs dans ses bureaux qu&#8217;il a eu la gentilesse de me recevoir pour parler du phénomène Twitter et de son application phare: Seemic desktop.  Confortablement assis sur un canapé, voici donc ci-dessous la première partie de notre conversation:]]></description>
			<content:encoded><![CDATA[<p style="color: #999999; border-bottom: solid 1px #EFEFEF; margin-bottom: 20px; padding-bottom: 20px;">This article was originally created by Marie Girardet (Left our team)</p>
<p>Lors de mon séjour en Californie, j&#8217;ai eu l&#8217;occasion de rencontrer Loic Le Meur, fondateur de Seemic, qui s&#8217;est installé à San Francisco il y a plus de 2 ans maintenant. C&#8217;est d&#8217;ailleurs dans ses bureaux qu&#8217;il a eu la gentilesse de me recevoir pour parler du phénomène Twitter et de son application phare: Seemic desktop.  Confortablement assis sur un canapé, voici donc ci-dessous la première partie de notre conversation:</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/08/18/interview-loic-le-meur-1ere-partie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Can every business create an online community?</title>
		<link>http://blog.netinfluence.com/2009/06/29/can-i-create-a-b2b-online-community/</link>
		<comments>http://blog.netinfluence.com/2009/06/29/can-i-create-a-b2b-online-community/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 13:15:00 +0000</pubDate>
		<dc:creator>netinfluence</dc:creator>
				<category><![CDATA[grow]]></category>
		<category><![CDATA[communauté]]></category>
		<category><![CDATA[communautés]]></category>
		<category><![CDATA[communication interne]]></category>
		<category><![CDATA[online communities]]></category>
		<category><![CDATA[Online PR & communication]]></category>
		<category><![CDATA[social media]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=109</guid>
		<description><![CDATA[This article was originally created by Marie Girardet (Left our team) Two weeks ago, I attended the Online Communities Unconfenrence in Moutain View (while in SF). One of the session was about B2B communities.  This generated an interesting conversation and further brainstorm on my side I would like to share. Creating a community became quite standard for consumers (BtoC), but not so much for BtoB. Cisco created an online community called Cisco NetPro which aims at helping customers to use their products and so did Apple and Microsoft who also have communities. If the subject is trendy for consumers and advanced marketing, can all company consider creating an online community? Let&#8217;s take the example of B2B industrial companies. Imagine a [...]]]></description>
			<content:encoded><![CDATA[<p style="color: #999999; border-bottom: solid 1px #EFEFEF; margin-bottom: 20px; padding-bottom: 20px;">This article was originally created by Marie Girardet (Left our team)</p>
<p><strong>Two weeks ago, I attended the Online Communities Unconfenrence in Moutain View (while in SF). One of the session was about <a hreflang="fr" href="http://impactinteractions.com/best-practices/b2b-communities-what-works/420">B2B communities</a>.  This generated an interesting conversation and further brainstorm on my side I would like to share.</strong></p>
<p>Creating a community became quite standard for consumers (BtoC), but not so much for BtoB.<br />
Cisco created an online community called <a hreflang="fr" href="http://www.cisconetpro.com/">Cisco NetPro</a> which aims at helping customers to use their products and so did Apple and Microsoft who also have communities.</p>
<p>If the subject is trendy for consumers and advanced marketing, can all company consider creating an online community?</p>
<p>Let&#8217;s take the example of B2B industrial companies. Imagine a pay per view security system manufacturer selling to cable operators, a watch piece manufacturer selling to time piece makers or engine manufacturer selling to automobile industry&#8230;.</p>
<p><strong><img style="margin: 0 1em 1em 0; float: left;" title="unconference.png, juin 2009" src="../public/marie/unconference.png" alt="" /></strong>I can&#8217;t see any advantages for the business customers to share information considering their own competitors would benefit from it.<br />
The way they use the product is part of their business strategy; which they ought not to share.</p>
<p>This brings to the question of communities purpose.</p>
<p>Why do you create a community for ?<br />
What can people expect from a community ?</p>
<p>Why do you join a community</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/06/29/can-i-create-a-b2b-online-community/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Custom Twitter Background Application : laquelle choisir?</title>
		<link>http://blog.netinfluence.com/2009/06/29/custom-twitter-background-application-laquelle-choisir/</link>
		<comments>http://blog.netinfluence.com/2009/06/29/custom-twitter-background-application-laquelle-choisir/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 08:08:00 +0000</pubDate>
		<dc:creator>netinfluence</dc:creator>
				<category><![CDATA[think]]></category>
		<category><![CDATA[communautaire]]></category>
		<category><![CDATA[communauté]]></category>
		<category><![CDATA[micro-blogging]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=16</guid>
		<description><![CDATA[This article was originally created by Marie Girardet (Left our team) Il existe de nombreuses applications pour personnaliser votre interface Twitter, alors j&#8217;ai voulu en savoir plus et en tester quelques unes pour vous faire partager mes impressions et vous dresser un petit bilan sur chacune de ces applications. J&#8217;ai tester au total 4 applications au hasard et voici ci-dessous le résultats et mes commentaires sur les différentes fonctionnalités offertes, les points positifs, les points à améliorer. Application N°1: My Tweet Space Premier point, cette première interface nécessite un login. On doit donc s&#8217;inscrire sur le site pour pouvoir avoir accès à l&#8217;interface de personnalisation. Les fonctionnalités offertes: - upload de logo - upload de photo - choix d&#8217;un background - choix d&#8217;un encadrement [...]]]></description>
			<content:encoded><![CDATA[<p style="color: #999999; border-bottom: solid 1px #EFEFEF; margin-bottom: 20px; padding-bottom: 20px;">This article was originally created by Marie Girardet (Left our team)</p>
<p>Il existe de nombreuses applications pour personnaliser votre interface Twitter, alors j&#8217;ai voulu en savoir plus et en tester quelques unes pour vous faire partager mes impressions et vous dresser un petit bilan sur chacune de ces applications.</p>
<p><strong><span style="font-weight: normal;">J&#8217;ai tester au total 4 applications au hasard et voici ci-dessous le résultats et mes commentaires sur les différentes fonctionnalités offertes, les points positifs, les points à améliorer. </span><br />
</strong></p>
<p><!--StartFragment--></p>
<p class="MsoNormal"><a hreflang="fr" href="http://www.mytweetspace.com/">Application N°1: My Tweet Space</a></p>
<p class="MsoNormal">Premier point, cette première interface nécessite un login.<br />
On doit donc s&#8217;inscrire sur le site pour pouvoir avoir accès à l&#8217;interface de personnalisation.</p>
<p class="MsoNormal"><span><span style="font-weight: bold;">Les fonctionnalités offertes:</span></span><br />
- upload de logo<br />
- upload de photo<br />
- choix d&#8217;un background<br />
- choix d&#8217;un encadrement pour photo<br />
- ajout de texte et choix de la police<br />
- installation automatique du background créé sur votre Twitter</p>
<p class="MsoNormal"><span><span style="font-weight: bold;">Les points à améliorer:</span></span><br />
- pas le choix de l&#8217;emplacement du texte<br />
- pas le choix d&#8217;un background personnalisé ( from scratch)<br />
- pas un large choix de style d&#8217;encadrement de photo<br />
- background personnalisé payant (59$)</p>
<p class="MsoNormal">D&#8217;un point de vue globale, je n&#8217;ai pas été très séduite par cette application pour plusieurs raisons.Tout d&#8217;abord, il a fallu que je m&#8217;inscrive et ça a eu tendance à me rebuter. Quand on demande une inscription, on s&#8217;attend à un outil offrant plus de possibilités que les autres, ce qui n&#8217;a malheureusement pas été le cas car il propose les personnalisations de base comme les autres applications ( background, logo, texte, etc)</p>
<p class="MsoNormal">De manière générale, cette interface fonctionne bien mais, selon moi, elle devrait étendre sa gamme de possibilités au niveau de la personnalisation pour être plus compétitive avec les autres applications.</p>
<p class="MsoNormal"><!--StartFragment--></p>
<p class="MsoNormal"><a hreflang="fr" href="http://twittergallery.com/">Application n°2:Twitter Gallery<br />
</a></p>
<p class="MsoNormal">Comme son nom l&#8217;indique ce site est une gallerie de backgrounds donc un site consultatif.<br />
Simple d&#8217;utilisation, les backgrounds sont catégorisés par thème et par couleur.</p>
<p class="MsoNormal">On peut installer les backgrounds proposés  automatiquement en indiquant ses identifiants Twitter ou manuellement en suivant le css fourni par Twitter. Au niveau rapidité et practicité, cette application est sans doute la plus simple. En quelques clics on a choisi son template et il est installé sur notre profil Twitter.</p>
<p class="MsoNormal"><!--StartFragment--></p>
<p class="MsoNormal"><a hreflang="fr" href="http://www.prettytweet.com/">Application N°3: Pretty Tweet<br />
</a></p>
<p class="MsoNormal">Cette application propose une technologie flex et une interface de personnalisation plutôt intéressante et agréable.<br />
L&#8217;interface représente votre page Twitter telle qu&#8217;elle est sur le web, les modifications sont donc visibles en temps réel.</p>
<p class="MsoNormal"><span><span style="font-weight: bold;">Elle propose de nombreuses fonctionnalités:</span></span><br />
- édition de texte dans deux zones prédéfinies<br />
- importation d&#8217;image ou même prise de photo via la web cam de l&#8221;ordinateur<br />
- édition des couleurs des liens, des bordures<br />
- ajustement des images ( rotation, taille, etc..)<br />
- génération du background et envoi par mail</p>
<p class="MsoNormal"><span><span style="font-weight: bold;">La déception:</span></span><br />
Comme l&#8217;upload d&#8217;images et la première étape, c&#8217;est par là que j&#8217;ai commencé.<br />
J&#8217;ai d&#8217;abord voulu uploader une image depuis mon ordinateur, mais je n&#8217;y suis pas arrivé. Un message m&#8217;informe que mon image est en train de charger mais ensuite il ne se passe plus rien malgré les tentatives avec différents formats d&#8217;images (jpg, png et gif).<br />
J&#8217;ai ensuite voulu utiliser la webcam pour faire une photo mais là encore déception car après avoir accepté les paramètres flash, la webcam ne s&#8217;est pas lancée. Finalement j&#8217;ai réussi à intégrer une image avec la fonction &#8220;image url&#8221;, qui est une image hébergée sur un serveur externe.</p>
<p class="MsoNormal">C&#8217;est vraiment dommage que l&#8217;insertion d&#8217;une image ne fonctionne pas car ensuite d&#8217;autres réglages propre à l&#8217;image comme le recadrage, la position, la taille des images perdent leur intérêt&#8230; Les autres fonctionnalités proposées fonctionnent bien et de manière intuitive, je pense par exemple à la modification des tailles et des polices des liens.</p>
<p class="MsoNormal">Dans l&#8217;ensemble cette application est agréable au niveau design et usabilité mais tout n&#8217;est pas au point. Petite note originale, elle propose de payer 5$ pour enlever le nom de leur application sur le background.</p>
<p class="MsoNormal"><a hreflang="fr" href="http://freetwitterdesigner.com/">Application N°4: Free Twitter Designer</a></p>
<p class="MsoNormal">Cette dernière application testée est également dotée de la technologie flex</p>
<p class="MsoNormal"><span><span style="font-weight: bold;">Voici ce qu&#8217;elle propose:</span></span><br />
- ajout de texte dans tout l&#8217;espace de personnalisation de la page Twitter<br />
- ajout de formes prédéfinies ( par exemple étoile)<br />
- ajout d&#8217;images<br />
- modification du css des textes, des bordures, etc<br />
- choix parmi de nombreux effets sur police et images<br />
- choix de partir d&#8217;un bakground vierge<span style="font-weight: bold;"><br />
</span><br />
Une fois votre background entièrement terminé, vous le sauvez sous forme d&#8217;images (jpg) et vous devez ensuite configurer dans Twitter votre nouveau design.</p>
<p class="MsoNormal">Dans l&#8217;ensemble cet outil est le plus performant en terme de possibilités et de liberté de personnalisation. Pas de bugs lors de la création de mon background et pas de souci pour lîmporter ensuite comme nouveau backgroun. C&#8217;est donc un sans faute pour cette application.</p>
<p class="MsoNormal">Dans l&#8217;ordre de préférences, mon classement serait le suivant:</p>
<p class="MsoNormal">1. Free Twitter Designer<br />
2. <span>Twitter Gallery<br />
3. Pretty Tweet<br />
4. My Tweet Space<br />
</span></p>
<p><!--EndFragment--> <!--StartFragment--><!--StartFragment--></p>
<p class="MsoNormal">Voici donc mon opinion sur ses quatre outils. Bien entendu la liste n&#8217;est pas exhaustive et il existe des milliers d&#8217;autes applications de personnalisation de votre background. Vous pouvez d&#8217;ailleurs en trouver quelques unes sur &#8221; <a hreflang="fr" href="http://thesocialmediaguide.com.au/2009/05/30/the-ultimate-list-of-twitter-tools/">Social Media guide</a>&#8220;. Si vous avez déjà utiliser d&#8217;autres outils de personnalisation de Twitter ou si vous avez des commentaire, je serais ravie de les lire.</p>
<p><!--EndFragment--></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/06/29/custom-twitter-background-application-laquelle-choisir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Par quoi on commence pour créer sa communauté?</title>
		<link>http://blog.netinfluence.com/2009/05/23/par-quoi-on-commence-pour-creer-sa-communaute/</link>
		<comments>http://blog.netinfluence.com/2009/05/23/par-quoi-on-commence-pour-creer-sa-communaute/#comments</comments>
		<pubDate>Sat, 23 May 2009 19:13:00 +0000</pubDate>
		<dc:creator>sandrine</dc:creator>
				<category><![CDATA[grow]]></category>
		<category><![CDATA[communauté]]></category>
		<category><![CDATA[communautés]]></category>
		<category><![CDATA[conseils]]></category>
		<category><![CDATA[influence]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[micro-blogging]]></category>
		<category><![CDATA[tribus]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=106</guid>
		<description><![CDATA[Bien entendu toutes les marques (enfin celles qui ont compris que le vieux marketing était mort) veulent une communauté.  Mais pas où commencer ? Le pourquoi on commence bien le comprendre. Une communauté c&#8217;est un groupe d&#8217;individus qui ont à coeur votre marque ou votre entreprise suffisamment pour en parler à leurs amis et surtout à participer au développement de l&#8217;entreprise, en faisant des suggestions, en évangélisant leurs amis. Internet a donné le pouvoir aux utilisateurs et ils ont maintenant, grâce aux tribus, un pouvoir d&#8217;influence notable. Le comment est plus difficile à organiser&#8230; Il ne suffit pas de se lever un bon matin, avec, l&#8217;envie de créer sa communauté parce que vous aurez lu ça dans votre magazine marketing [...]]]></description>
			<content:encoded><![CDATA[<p>Bien entendu toutes les marques (enfin celles qui ont compris que le vieux marketing était mort) veulent une communauté.  Mais pas où commencer ?</p>
<p><strong>Le pourquoi on commence bien le comprendre.</strong><br />
Une communauté c&#8217;est un groupe d&#8217;individus qui ont à coeur votre marque ou votre entreprise suffisamment pour en parler à leurs amis et surtout à participer au développement de l&#8217;entreprise, en faisant des suggestions, en évangélisant leurs amis.<br />
Internet a donné le pouvoir aux utilisateurs et ils ont maintenant, grâce aux tribus, un pouvoir d&#8217;influence notable.</p>
<p><strong>Le comment est plus difficile à organiser&#8230;</strong><br />
Il ne suffit pas de se lever un bon matin, avec, l&#8217;envie de créer sa communauté parce que vous aurez lu ça dans votre magazine marketing ou dans la presse.<br />
Si c&#8217;est une mode, allez dormir, ça vous passera.<br />
Si c&#8217;est une vrai volonté de votre management, assortie de moyens, alors allez-y.</p>
<p>Je ne parle pas de moyens indécents. Je parle de la volonté, du temps d&#8217;une personne qui aura la charge de ce travail et surtout de la disposition de la marque à s&#8217;engager dans ce dialogue de manière constructive.  Faire une communauté, c&#8217;est donner la possibilités à vos meilleurs fans de devenir partie intégrante de l&#8217;entreprise.  Cela ne peut donc pas être une stratégie de façade car il faudra écouter les commentaires, en tenir compte et évoluer ou faire évoluer la marque avec.</p>
<h1><ins><strong>Par quoi on commence ?</strong></p>
<p></ins></h1>
<p>Il me semble que l&#8217;on crée déjà une communauté par envie de rassembler des fans. La première question à se poser est donc de comprendre qui sont ces fans.</p>
<p><strong>1. Avez-vous des fans?</strong><br />
Les connaissez-vous ?<br />
Parle-t&#8217;on de vos produits ou de votre entreprise sur internet ?  Si personne n&#8217;en parle c&#8217;est que vous n&#8217;existez pas ! Aussi rude que cela puisse paraitre, ne vous découragez pas.  C&#8217;est juste que tout est à faire.<br />
Trouver ses fans siginifie explorer tous les moyens à votre dispositions pour les repérer.  Recherchez votre marque sur internet, sur twitter, dans les réseaux sociaux.  Utilisez aussi vos moyens traditionnels pour rassembler des informations sur vos fans.  C&#8217;est quoi un fan ? C&#8217;est un client satisfait au point où il sera prêt à en parler à <a href="/post/2009/05/14/Le-marketing-d-aujourd-hui-est-tribal">sa tribu</a>.</p>
<p><strong>2. Partagez avec votre communauté, plus que vos produits ou services</strong><br />
Ce qui cimente votre communauté c&#8217;est l&#8217;échange.  Si vous ne faites que parle de vous, vous lasserez rapidement. Prendre le pouls sur vos produits via les outils de &#8220;feedback&#8221; ne suffit donc pas.<br />
Une communauté se crée autour d&#8217;une passion, d&#8217;un intérêt. Ce qui cimente la communauté c&#8217;est moins ce que vous pensez en retirer comme bienfait que ce qui intéresse votre communauté<em>.</em> On en revient à cette histoire d&#8217;égo.  En vous concentrant sur ce que votre communauté veut savoir et développant du contenu utile, pointu et de qualité, vous gagnerez la reconnaissance de cette communauté qui se développera alors, vous permettant de rassembler de plus en plus de membres, intéressés et impliqués.</p>
<p><strong>3. Collectez le feedback de vos clients</strong><br />
Pour tous vos nouveaux clients, interrogez-les pour comprendre ce qui leur permettrait de devenir des fans inconditionnels (c&#8217;est le début d&#8217;une communauté) et obtenez leur autorisation pour les interroger sur le sujet et leur demander leur feedback.<br />
Si vous avez un service en ligne, des outils comme <a href="http://getsatisfaction.com/">get satisfaction</a> ou <a href="http://uservoice.com/signup">uservoice</a> sont de bons points de départ.  Ils vous permettront de collecter les suggestions et d&#8217;identifier celles qui sont les plus importantes pour vos clients.</p>
<p><strong>4. Tenez-compte de leurs avis</strong><br />
Soyez honnête surtout si cela ne marche pas<br />
Prenez en compte de leurs remarques, parlez de vos futures évolutions, demandez leur leur avis. Que leur avis soient positifs ou pas. Répondez à ce que les membres de votre commmunauté suggèrent et n&#8217;hésitez pas à être transparent.  L&#8217;attention que vous accorderez à leurs interventions, leur donnera encore plus envie de vous aider.</p>
<p><strong>5. 1000 amis suffisent</strong><br />
Un artiste, une marque, a besoin de seulement 1000 personnes qui parlent à 1000 autres personne.  Il suffit de peu, mais obtenir ces 1000 premiers &#8220;fans&#8221; nécessite un investissement, dans l&#8217;écoute, dans le partage (idée développée par Seth Godin dans <a href="/post/2009/05/14/Le-marketing-d-aujourd-hui-est-tribal">Tribes</a>).</p>
<h1><ins><strong>Les pièges à éviter</strong></ins></h1>
<p><strong>1. Croire que la communauté vous appartient et qu&#8217;elle vous sera fidèle</strong><br />
La communauté ne vous doit rien, vous le devez tout.  Elle ne vous sera pas aveuglément fidèle car les gens zappent et une fois l&#8217;intérêt passé, ils peuvent vous quitter si leurs amis leur recommande de leur faire.  Donc il n&#8217;y a pas de rente de situation et c&#8217;est un effort perpétuel qu&#8217;il faut reproduire sans cesse pour garder fans vos fans.</p>
<p><strong>2. Penser que la sagesse des foules remplace l&#8217;innovation</strong><br />
Si vous demandez l&#8217;avis à tout le monde sur vos produits et que vous tenez scrupuleusement compte de tout ce qui vous est donné comme avis, vous tuerez votre entreprise.  <a href="http://scobleizer.com/">Scoble</a> disait, &#8220;si on demandait aux clients de porsche leurs avis pour ajouter des &#8220;features&#8221;, ils en feraient une volvo&#8221;.<br />
Consulter, oui. Améliorer, oui.  Mais l&#8217;innovation vous appartient.  Comme dirait steve jobs :&#8221;people know what they want, when they see it&#8221;  Restez maîtres à bord, cherchez, testez avec votre communauté, mais ne croyez pas que votre communauté remplacera votre R&amp;D.</p>
<p><a href="http://www.loiclemeur.com/">Loic Lemeur</a>, brillant comme toujours et surtout simple, explique comment il a développé sa communauté et pourquoi c&#8217;est crucial pour lui.  Merci Loic pour cette brillante vidéo.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="580" height="360" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/BpI0Kc4ySHs&amp;hl=fr&amp;fs=1&amp;border=1" /><embed type="application/x-shockwave-flash" width="580" height="360" src="http://www.youtube.com/v/BpI0Kc4ySHs&amp;hl=fr&amp;fs=1&amp;border=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>A voir aussi ces slides sur slideshare:</p>
<div id="__ss_1199150" style="width: 425px; text-align: left;"><a style="margin: 12px 0 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" title="How to launch a product with your community" href="http://www.slideshare.net/loiclemeur/how-to-launch-a-product-with-your-community?type=powerpoint">How to launch a product with your community</a><object style="margin: 0;" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=howtolaunchaproductintheopen-090325201015-phpapp01&amp;stripped_title=how-to-launch-a-product-with-your-community" /><embed style="margin: 0;" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=howtolaunchaproductintheopen-090325201015-phpapp01&amp;stripped_title=how-to-launch-a-product-with-your-community" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/05/23/par-quoi-on-commence-pour-creer-sa-communaute/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cette génération Y que nous connaissons encore si mal</title>
		<link>http://blog.netinfluence.com/2009/05/19/cette-generation-y-que-nous-connaissons-encore-si-mal/</link>
		<comments>http://blog.netinfluence.com/2009/05/19/cette-generation-y-que-nous-connaissons-encore-si-mal/#comments</comments>
		<pubDate>Tue, 19 May 2009 07:11:00 +0000</pubDate>
		<dc:creator>sandrine</dc:creator>
				<category><![CDATA[grow]]></category>
		<category><![CDATA[communauté]]></category>
		<category><![CDATA[communautés]]></category>
		<category><![CDATA[entreprise]]></category>
		<category><![CDATA[génération]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[Online PR & communication]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=8</guid>
		<description><![CDATA[Si vous pensez qu&#8217;il y a un fossé entre la génération de vos parents et vous, celui qui nous sépare de nos enfants est encore plus grand. La génération &#8220;Y&#8221; mérite qu&#8217;on ne la sous-estime pas et que l&#8217;on prenne un peu la peine de l&#8217;étudier. Sceptique et méfiante, elle semble moins impliquée à bien des égards. Eco-consciente et soucieuse de l&#8217;avenir, elle est plus individualiste. Connectée et plus structurée en tribus qu&#8217;en organisation hiérarchique, elle a une vision plate du monde même si aujourd&#8217;hui elle a tendance à se sentir écrasée. Elle préférera amener de la vie privée au travail, que du travail à la maison et ne voit pas son plan de carrière comme une fin en soi. [...]]]></description>
			<content:encoded><![CDATA[<p>Si vous pensez qu&#8217;il y a un fossé entre la génération de vos parents et vous, celui qui nous sépare de nos enfants est encore plus grand. <a href="http://funnyonly.com/generation-y/">La génération &#8220;Y&#8221;</a> mérite qu&#8217;on ne la sous-estime pas et que l&#8217;on prenne un peu la peine de l&#8217;étudier.<br />
Sceptique et méfiante, elle semble moins impliquée à bien des égards.<br />
Eco-consciente et soucieuse de l&#8217;avenir, elle est plus individualiste.<br />
Connectée et plus <a href="http://www.presentationzen.com/presentationzen/2008/10/seth-godins-tribes.html">structurée en tribus</a> qu&#8217;en organisation hiérarchique, elle a <a href="http://en.wikipedia.org/wiki/The_World_is_Flat">une vision plate du monde</a> même si aujourd&#8217;hui elle a tendance à se sentir écrasée.<br />
Elle préférera amener de la vie privée au travail, que du travail à la maison et ne voit pas son plan de carrière comme une fin en soi.<br />
Sur-qualifiée, agile avec les technologies, elle observe, résiliante, les miettes que les générations supérieures concèdent à lui laisser, en attendant mieux.</p>
<p>Ses aspirations seront sociales, voire même utopiques (créer un monde meilleur) et leurs modèles ne sont pas dogmatiques.  Le 20° siècle a écrasé tout ce qui pouvait leur rester de confiance dans les institutions ou dans le système.</p>
<p>Si on leur fait confiance et que l&#8217;on accepte de leur laisser construire un nouveau système, nous serons capables d&#8217;innover, car leur vision est unique.</p>
<p>Si vous vous adressez aujourd&#8217;hui à cette génération que vous voulez comme consommateurs ou futurs collaborateurs, il va falloir accepter d&#8217;être différent et de remettre en cause vos modèles.<br />
Férus de dialogue constructif dans lequel ils auront leur part de contribution, ils ont besoin du net et de son mode de fonctionnement comme nous des institutions avant.</p>
<p>Si vous avez encore besoin de vous persuader du fossé qui existe, lisez <a href="http://owni.fr/2009/05/10/la-generation-y-en-a-assez-des-pourquoi/">ce billet d&#8217;OWNI</a> qui a inspiré celui-ci et prenez des notes.  Il va falloir intégrer ce changement dans votre approche marketing si vous visez cette génération.</p>
<p><em>L&#8217;illustration de ce billet provient de l&#8217;édition du 22 janvier, du</em><a style="font-style: italic;" href="http://lejournaldequebec.canoe.ca/"> journal de Montréal</a><em> et a été réalisée par le talentueux </em><a style="font-style: italic;" href="http://ruefrontenac.com/nouvelles-generales/societe/4677-mention-a-marc-beaudet-world-press-cartoon">caricaturiste Marc Beaudet</a></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/05/19/cette-generation-y-que-nous-connaissons-encore-si-mal/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Une communauté iPhone très active en Suisse</title>
		<link>http://blog.netinfluence.com/2009/05/15/rencontre-de-la-communaute-iphone-en-suisse-romande/</link>
		<comments>http://blog.netinfluence.com/2009/05/15/rencontre-de-la-communaute-iphone-en-suisse-romande/#comments</comments>
		<pubDate>Fri, 15 May 2009 12:10:00 +0000</pubDate>
		<dc:creator>netinfluence</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[communauté]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[outil communautaire]]></category>
		<category><![CDATA[viral]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=66</guid>
		<description><![CDATA[This article was originally created by Emilien Vuillaume (Left our team) La 3ème réunion du groupe &#8220;Les développeurs iPhone de Suisse Romande&#8221; hier soir au sous-sol du café Le Vaudois à Lausanne à rencontré un grand succès. Le but de ce groupe, qui compte actuellement 125 membres, est tout d&#8217;abord &#8220;l&#8217;échange d&#8217;informations autour du développement iPhone, le partage d&#8217;expériences et l&#8217;organisation d&#8217;événements une fois par mois dans la région Lémanique&#8221;. Après un tour de table pour présenter tous les nouveaux arrivants, deux sujets de discussion ont été lancés : Présenté par Sébastien Hugues, le premier sujet présentait l&#8217;utilisation des services Facebook dans les applications iPhone et l&#8217;intérêt viral que cela représente. Par exemple il est très facile de publier le [...]]]></description>
			<content:encoded><![CDATA[<p style="color: #999999; border-bottom: solid 1px #EFEFEF; margin-bottom: 20px; padding-bottom: 20px;">This article was originally created by Emilien Vuillaume (Left our team)</p>
<p>La 3ème réunion du groupe &#8220;<strong>Les développeurs iPhone de Suisse Romande</strong>&#8221; hier soir au sous-sol du café <strong><em>Le Vaudois</em></strong> à <strong><em>Lausanne</em></strong> à rencontré un grand succès.</p>
<p>Le but de ce groupe,  qui compte actuellement <strong>125 membres</strong>, est tout d&#8217;abord &#8220;l&#8217;échange d&#8217;informations autour du développement iPhone, le partage d&#8217;expériences et l&#8217;organisation d&#8217;événements une fois par mois dans la région Lémanique&#8221;.</p>
<p>Après un tour de table pour présenter tous les nouveaux arrivants, deux sujets de discussion ont été lancés :</p>
<ul>
<li>Présenté par <a href="http://www.linkedin.com/in/sebastienhugues">Sébastien Hugues</a>, le premier sujet présentait l&#8217;utilisation des services <a href="http://developers.facebook.com/connect.php?tab=iphone"><strong>Facebook</strong></a> dans les applications iPhone et l&#8217;intérêt viral que cela représente.<br />
Par exemple il est très facile de publier le score de l&#8217;utilisateur sur son profil Facebook ce qui va entraîner une sorte de compétition entre les membres de son réseau et ainsi accroître rapidement la popularité de votre application.<br />
Pensez-y dans vos futurs projets et n&#8217;hésitez pas à le proposer à vos clients.</li>
<li>Le second thème, présenté par <a href="http://www.linkedin.com/pub/gilles-cherix/0/a59/175">Gilles Cherix</a>, plus technique, portait sur le choix du format d&#8217;échange des données entre deux entités (iPhone/Serveur web, iPhone/iPhone, etc&#8230;). Après une longue discussion, les deux principaux formats retenus sont le <a href="http://fr.wikipedia.org/wiki/Extensible_Markup_Language">XML</a> et le <a href="http://www.json.org/">JSON</a>. Il en ressort que la solution la plus simple est toujours la meilleure. Si votre application iPhone ou votre serveur doit intégrer une bibliothèque complexe pour utiliser le flux d&#8217;information, alors pensez à un autre format d&#8217;échange&#8230;</li>
</ul>
<p>Pour conclure cette session, nous avons fait le point sur la communication entre les membres du groupe (forum, mailing-list, etc&#8230;) ainsi que sur un possible changement de nom. Il se pourrait même qu&#8217;une application open source voit le jour!</p>
<p>Affaire à suivre&#8230;</p>
<p>Si vous êtes intéressé à nous rejoindre et à participer à nos rencontres, rejoignez le groupe Facebook : <a hreflang="fr" href="http://www.facebook.com/group.php?gid=39755092833"><strong>Les développeurs iPhone de Suisse Romande</strong></a></p>
<p>A bientôt&#8230;</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/05/15/rencontre-de-la-communaute-iphone-en-suisse-romande/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Être présent sur le web oui, mais comment ?</title>
		<link>http://blog.netinfluence.com/2008/06/24/etre-present-sur-le-web-oui-mais-comment/</link>
		<comments>http://blog.netinfluence.com/2008/06/24/etre-present-sur-le-web-oui-mais-comment/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 08:56:00 +0000</pubDate>
		<dc:creator>sandrine</dc:creator>
				<category><![CDATA[grow]]></category>
		<category><![CDATA[bloguer]]></category>
		<category><![CDATA[communauté]]></category>
		<category><![CDATA[communication interne]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[Nestle]]></category>
		<category><![CDATA[stress]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=6</guid>
		<description><![CDATA[Cela sonne comme une évidence pour les entreprises, de plus en plus. Il faut être là. Alors rien de plus facile, un site et hop ! Il n&#8217;y a effectivement aucune barrière technologique et les coûts de présence, par rapport aux autres médias, sont si faibles, que c&#8217;est à la portée de main de n&#8217;importe quelle entreprise. Donc on les voit ces sites se créer par milliers. Mal référencés, mal construits, ils conduisent alors souvent les mandataires à décrier les possibilités d&#8217;internet : cela ne marche pas ! Bien sûr qu&#8217;internet est accessible. Mais il ne fait pas confondre accessibilité et expertise. Internet a des règles qu&#8217;il faut savoir respecter. Bien référencer un site c&#8217;est avant tout bien le concevoir [...]]]></description>
			<content:encoded><![CDATA[<p>Cela sonne comme une évidence pour les entreprises, de plus en plus. <strong>Il faut être là.</strong> Alors rien de plus facile, un site et hop !<br />
Il n&#8217;y a effectivement aucune barrière technologique et les coûts de présence, par rapport aux autres médias, sont si faibles, que c&#8217;est à la portée de main de n&#8217;importe quelle entreprise. Donc on les voit ces sites se créer par milliers.  Mal référencés, mal construits, ils conduisent alors souvent les mandataires à décrier les possibilités d&#8217;internet : cela ne marche pas !</p>
<p>Bien sûr qu&#8217;internet est accessible.  Mais il ne fait pas confondre accessibilité et expertise. Internet a des règles qu&#8217;il faut savoir respecter. Bien référencer un site c&#8217;est avant tout bien le concevoir en terme de contenu et de structure. <strong>Une stratégie avant tout</strong> Et oui, bien souvent la question du sens, de la stratégie, n&#8217;est pas abordée dans les projets, ou alors trop tard.</p>
<ul>
<li>Pour quelle raison devez vous être présent sur internet ?</li>
<li>Comment envisagez vous de nourrir votre site ?</li>
<li>Qui en a la responsabilité ?</li>
<li>Que doit vous rapporter votre site en terme de contacts et de traffic ?</li>
</ul>
<p>On ne part pas à l&#8217;aventure, en espérant que l&#8217;ouverture du site se traduira immédiatement en traffic spontané.  En matière de web, rien d&#8217;instantanné.  Ceux qui ont réussi ont travaillé. Le contenu, la structure.  Il faut penser le site, le voir vieillir, imaginer ses évolutions de manière interactive et décrire tout ce que l&#8217;on en attend. <strong>La question des ressources</strong> <em> L&#8217;accessibilité et la gratuité du net ont fait naître un mythe : le web ne coûte rien.</em> Pour être présent sur internet, il faut des ressources. Les sous-estimer contribue invariablement à péjorer la qualité du site.</p>
<ul>
<li>Le budget</li>
</ul>
<p>On atteint certes pas les budgets de la télévision ou de la presse, mais développer une stratégie de communication se fait sur le long terme (pour prétendre exister il faut de la fraîcheur, un renouvellement permanent), il faut donc un budget minimum.  Lequel ? Difficile à dire tellement il peut varier selon les objectifs. Une chose est sûre, il faut comparer le travail et les offres des agences avant de vous engager.  Ne pas croire tout ce que l&#8217;on vous dit et prendre le temps de la réflexion avant de vous lancer.  ET puis ne pas oublier, un site c&#8217;est du design (la charte, la mise en page, la création de templates&#8230;), du développement (un développement personnalisé ou la remise clef en main d&#8217;un site qui fera l&#8217;objet quoi qu&#8217;il en soit d&#8217;un peu d&#8217;adaptation), de la stratégie (quoi mettre, comment structurer, comment s&#8217;organiser, penser référencement), éventuellement des conseils en référencement, voire en achat de mots clefs, l&#8217;hébergement du site et son nom de domaine, et du budget pour la communication ou des opérations de marketing (viral, buzz, RP&#8230;), et enfin tout ce qui concerne les passerelles de paiement si c&#8217;est un site e-commerce et un budget formation si vous êtes novices ou devez former une personne. On parle donc de budgets conséquents&#8230;d&#8217;où l&#8217;importance d&#8217;en fixer les limites et d&#8217;en définir les retours attendus précisément (la stratégie)</p>
<ul>
<li>Les ressources</li>
</ul>
<p>Animer une stratégie de présence cela signifie avoir des personnes qui vont mettre à jour de l&#8217;info, tisser des liens, créer des échanges, imaginer des contenus; tout ceci représente beaucoup de temps et donc fatalement des ressources.<br />
Souvent, dans les stratégie on se concentre sur la sortie du site.  Qui s&#8217;en occupe au début, qui le fait naître.  En réalité, tout commence vraiment une fois qu&#8217;il est en ligne.<br />
Qu&#8217;avez-vous prévu de mettre en place comme ressource ? Une ? 2 ? aucune ?<br />
Si aucune, alors n&#8217;en attendez rien. Si vous avez prévu au moins une personne à temps plein, voire plus, alors vous pourrez en escompter les ressources attendues.<br />
<strong>A titre d&#8217;exemple, animer un site, deux blogs et une communauté me prend 80% de mon temps.</strong>..et encore je ne le fais pas comme je voudrais vraiment et surtout j&#8217;ai l&#8217;habitude, donc je vais assez vite.</p>
<ul>
<li>La Formation</li>
</ul>
<p>Je reviens dessus à chaque fois mais là, plus qu&#8217;ailleurs, cela me semble vital.  Si vos ressources sont internes, formez-les au web.<br />
Le web a ses règles et vous aurez besoin d&#8217;initier les animateurs, blogueurs et autres rédacteurs de vos sites.  Les laisser se débrouiller donnera au mieux aucun résultat tangible et au pire de grosses gaffes. <strong><br />
Notions de Cross Media</strong> Tout d&#8217;abord internet est un média pas comme les autres, mais avant tout un média.  Il convient donc de le considérer comme un moyen de plus avec des caractéristiques spécifiques mais surtout de le considérer par rapport aux autres médias.</p>
<p>Une stratégie de communication efficace est une stratégie qui prend en compte tous les médias dans son ensemble, dans ce qu&#8217;ils se complètent et dans ce qui les différencie. Un plan de communication devra donc toujours prendre en compte cette diversité et n&#8217;écarter aucun média mais plutôt de voir comment les uns peuvent relayer, voire renforcer les contenus des autres.</p>
<p>Bref, si internet est accessible, cela reste une chose éminemment complexe à comprendre et vous avez tout à gagner à étudier avec précision votre projet de manière critique avant de vous lancer.  Cela ne signifie pas ne pas vous lancer mais vous lancer en connaissance de cause. Si vous avez des questions, n&#8217;hésitez pas à <a href="mailto:sandrine@netinfluence.ch">venir m&#8217;en parler</a> ou à laisser vos commentaires ci après <img src='http://blog.netinfluence.com/wp-content/plugins/smilies-themer/Silk/emoticon_wink.png' alt=';-)' class='wp-smiley' /> </p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2008/06/24/etre-present-sur-le-web-oui-mais-comment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

