<?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>La Fabrick &#187; tips</title>
	<atom:link href="http://www.lafabrick.com/blog/tag/tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lafabrick.com/blog</link>
	<description>Laboratoire d&#039;interfaces riches (Flex, Flash, Air ...)</description>
	<lastBuildDate>Mon, 28 Nov 2011 22:02:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Object to XML to Object : conversion XSD</title>
		<link>http://www.lafabrick.com/blog/2009/12/14/1492-object-to-xml-to-object-conversion-xsd/</link>
		<comments>http://www.lafabrick.com/blog/2009/12/14/1492-object-to-xml-to-object-conversion-xsd/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 21:38:47 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1492</guid>
		<description><![CDATA[Utiliser les schéma de déclaration XSD, s’avère souvent fort utile. Plus que l’autocompletion sur vos fichiers XML, l’apport des XSD se trouve avant tout dans le fait de qualifier et de valider vos fichiers. Dans Flex, bien que caché au fin fond du package rpc, la mécanique de lecture et de conversion XSD est bien [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/back.png" alt="back" title="back" width="520" height="120" class="aligncenter size-full wp-image-1507" /></center><br />
Utiliser les schéma de déclaration XSD, s’avère souvent fort utile. Plus que l’autocompletion sur vos fichiers XML, l’apport des XSD se trouve avant tout dans le fait de qualifier et de valider vos fichiers. Dans Flex, bien que caché au fin fond du package rpc, la mécanique de lecture et de conversion XSD est bien là. Nous allons voir comment l’utiliser, et convertir vos objets AS3 vers XML (et vice versa), en suivant ces schémas de définition.<br />
<span id="more-1492"></span></p>
<h2>Pourquoi utiliser une XSD?</h2>
<p>Pour ma part, ces quelques raisons (et pour vous certainement plein d’autres raisons) </p>
<ul>
<li>Elle valide vos XML : parce que vous définissez en amont la structure de vos fichiers, une définition XSD permet de les valider;</li>
<li>Parce que vous avez besoin de plusieurs écritures différentes d’un même jeu de donnés;</li>
<li>Parce que, comme tout bon dèv, vous êtes fainéant&#8230;</li>
<li>&#8230;et le fait que le programme valide tout et fait tout, tout seul, en suivant des règles normées ça vous va bien.</li>
<li>Ca fait toujours bien d’avoir des fichiers XSD dans vos sources : ça envoie de la rosette, et vous pouvez vous la péter grave.</li>
<li>&#8230;</li>
</ul>
<p>Dans un usage Flex, l’objectif serait de pouvoir transformer nos objets AS en XML, et l’inverse, via les schémas de définitions. Ça tombe bien ! C’est ce qu’on va faire.</p>
<h2>Où tu te caches XSD ?!</h2>
<p>Dans la plupart des langages, nous avons la possibilité de discuter avec notre serveur en utilisant le protocole SOAP, basé sur XML. En utilisant ce protocole, nos objets sont “transformés” en XML, et transmis vers notre serveur. L’opération inverse existe lors de réception de données.<br />
Mais pourquoi je vous parle de ça? Tout simplement parce que tout langage faisant du SOAP (ou du web service), à besoin de valider et de convertir de manière automatique les objets. Et je vous le donne en mille, ce sont les définitions XSD qui entrent en jeux (souvent <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<p>La mécanique XSD est utilisée, en interne dans Flex, pour l’encodage et le décodage d’objet SOAP ou WSDL. Ces classes, exclues du framework (vous n’y avez pas accès directement avec l’autocomplétion), se trouvent dans le package mx.rpc.xml.*.<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/rpcxml.png" alt="rpcxml" title="rpcxml" width="306" height="648" class="aligncenter size-full wp-image-1508" /></center><br />
Et c’est bien dommage que ces classes soit exclues !  Selon moi, elles seraient bien plus utiles ouvertes, documentées, et dans un package plus global comme flash.xml par exemple (flash.xsd ou flash.xml.xsd&#8230; ça pourrait être cool !). </p>
<p>Car vous allez le voir, il est relativement simple d’utiliser cette partie de Flex, pour un usage personnalisé du XML, en dehors du contexte RPC. </p>
<h2>Des groupes, des geeks, des bidules</h2>
<p>Donc c’est parti pour l’exemple. Je ne me casse pas la tête, et vous propose un biniou qui aura 3 éléments : des groupes, des gens (geek forcement), et des bidules&#8230; Je n’étais pas inspiré sur le 3ème éléments, mais il m’en fallait un&#8230;.</p>
<h3>XML et la définition XSD</h3>
<p>Nous avons une infinité d’écriture XML possible, comme celle-ci :</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;groups&gt;
    &lt;group&gt;
        &lt;groupName&gt;klingons&lt;/groupName&gt;
        &lt;geeks&gt;
            &lt;geek&gt;
                &lt;firstName&gt;francis&lt;/firstName&gt;
                &lt;stuffs&gt;
                    &lt;stuff&gt;
                        &lt;name&gt;mac&lt;/name&gt;
                  &lt;/stuff&gt;
                   &lt;stuff&gt;
                        &lt;name&gt;Flex&lt;/name&gt;
                    &lt;/stuff&gt;
                &lt;/stuffs&gt;
            &lt;/geek&gt;
        &lt;/geeks&gt;
    &lt;/group&gt;

    &lt;group&gt;
        ...
&lt;/groups&gt;
</pre>
<p>Ou celle là :</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;groups&gt;
    &lt;group groupName=&quot;klingons&quot;&gt;
        &lt;geeks&gt;
            &lt;geek firstName=&quot;francis&quot;&gt;
                &lt;stuffs&gt;
                    &lt;stuff name=&quot;mac&quot; /&gt;
                    &lt;stuff name=&quot;Flex&quot; /&gt;
                &lt;/stuffs&gt;
            &lt;/geek&gt;
            &lt;geek firstName=&quot;roger&quot;&gt;
                &lt;stuffs&gt;
                    &lt;stuff name=&quot;pc&quot; /&gt;
                    &lt;stuff name=&quot;photoshop&quot; /&gt;
                &lt;/stuffs&gt;
            &lt;/geek&gt;
        &lt;/geeks&gt;
    &lt;/group&gt;

    &lt;group&gt;
        ...
&lt;/groups&gt;
</pre>
<p>Ou un mélange à votre sauce, vous faites bien comme vous voulez !</p>
<p>Nous allons donc écrire notre XSD, qui va définir le XML définit ci-dessus, celui qui utilise pleins d’attributs. Je prend celui là parce que la sortie XML est moins longue&#8230;. et mon article gagnera quelques lignes&#8230;. En ce moment mes articles sont un peu trop pépère&#8230; Ca doit être l’approche des fêtes.</p>
<p>Bref !</p>
<p>Le but est de réaliser une XSD la plus complète possible, ou toutes les parties sont typées (SimpleType ou ComplexeType). C’est important pour la suite, car chaque type sera “mappé” avec la classe ActionScript qui lui correspond.</p>
<p>Dans notre exemple, nous avons 3 collections (groups geeks, stuffs) et 3 éléments (group, geek, stuff)&#8230; D’accord je ne me suis pas foulé les doigts sur ce coup là !</p>
<p>Le schéma XSD n’est finalement qu’un fichier XML standard : </p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;xsd:schema
    xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;
    targetNamespace=&quot;schemas/geeks&quot;
    xmlns=&quot;schemas/geeks&quot;&gt;

    &lt;xsd:element name=&quot;groups&quot; type=&quot;groupsCollectionType&quot; /&gt;

&lt;/xsd:schema&gt;
</pre>
<p>L’élément principale, le noeud “&lt;groups&gt;”, est la base de notre schéma. Le type correspondant va s’appeler <strong>groupsCollectionType</strong>.</p>
<p>La version actionScript de ce type <strong>groupsCollectionType</strong> serait un Array ou ArrayCollection (ou tout autre type de collection d’objet).<br />
<strong>groupsCollectionType</strong> est une séquence, un réceptacle de 0 à n éléments de type group (le nombre d’instances minimum et maximun est défini par <strong>minOccurs</strong> et  <strong>maxOccurs</strong>).</p>
<pre class="brush: xml">
&lt;xsd:complexType name=&quot;groupsCollectionType&quot; mixed=&quot;true&quot;&gt;
    &lt;xsd:sequence&gt;
        &lt;xsd:element name=&quot;group&quot; type=&quot;groupType&quot;
            maxOccurs=&quot;unbounded&quot; minOccurs=&quot;0&quot; /&gt;
    &lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
</pre>
<p>Le type group est composé comme suit :</p>
<pre class="brush: xml">
&lt;xsd:complexType name=&quot;groupType&quot; mixed=&quot;true&quot;&gt;
    &lt;xsd:sequence&gt;
        &lt;xsd:element name=&quot;geeks&quot; type=&quot;geeksCollectionType&quot;
            minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot;  /&gt;
    &lt;/xsd:sequence&gt;

    &lt;xsd:attribute name=&quot;groupName&quot; use=&quot;required&quot; type=&quot;xsd:string&quot; /&gt;

&lt;/xsd:complexType&gt;
</pre>
<p>On retrouve le noeud <strong>geeks</strong>, unique, mais non obligatoire (minOccurs=&nbsp;&raquo;0&#8243; maxOccurs=&nbsp;&raquo;1&#8243;), qui sera défini dans un type <strong>geeksCollectionType</strong> de la même manière que <strong>groupsCollectionType</strong>.<br />
Les attributs du noeud sont placé à la suite de la séquence d’éléments. Ils peuvent être requis ou optionnel, définit par l’attribut use. On peut aussi le définir “prohibited” même si je ne vois pas vraiment l’intérêt&#8230;</p>
<p>Et on continue comme cela, en rentrant en profondeur dans nos différent objets. La syntaxe n’est pas compliquée, il suffit de se pencher un peu sur <a href="http://www.w3.org/XML/Schema#dev">les spécifications de la W3C</a>. </p>
<p><a href="http://www.lafabrick.com/labz/xsdconverter/srcview/source/geeks.xsd">Vous trouverez ici la XSD complète</a> de notre exemple.</p>
<h3>Côté ActionScript</h3>
<p>Nous avons besoin de 3 objets, qui correspondent aux 3 types d’éléments de notre XML : des groupes de Geek, des Geeks, des Stuffs.</p>
<p>Là, rien de plus basique.</p>
<ul>
<li>La classe <strong>GeekGroup </strong>: avec une propriété <strong>groupName</strong>, et une collection <strong>geeks </strong>(les geeks membres du groupe)</li>
<li>La classe <strong>Geek </strong>: avec une propriété <strong>firstName</strong>, et une collection <strong>stuffs</strong> (les bidules du geek)</li>
<li>La classe <strong>Stuff</strong> : avec une propriété <strong>name</strong>, le nom du bidule</li>
</ul>
<p>Vous vous rendez compte, tout d’un coup, que je ne vous ai absolument rien appris dans ce paragraphe. Passons à la suite.</p>
<h2>Les classes de gestion XSD</h2>
<p>Nous avons une XSD et des objets AS prêts à être convertis. Regardons de plus près les classes exclues dont nous avons besoin:</p>
<ul>
<li><strong>mx.rpc.xml.SchemaTypeRegistry</strong> : cette classe est une sorte de dictionnaire, ou l’on référence les différents types du schéma XSD, avec leurs classes actionScript associées.</li>
<li><strong>mx.rpc.xml.XMLDecoder</strong> : la classe qui permet de décoder une source XML, en suivant la XSD, vers un object typé actionScript.</li>
<li><strong>mx.rpc.xml.XMLEncoder</strong> : la classe qui permet d’encoder un objet AS en un fichier XML, en suivant la définition XSD.</li>
<li><strong>mx.rpc.xml.Schema</strong> : la classe contenant le schema XSD chargé.</li>
<li><strong>mx.rpc.xml.SchemaManage</strong>r : point central du système, cette classe est utilisée par l’encodeur et le décodeur. Elle possède une référence au schéma (elle peut d&#8217;ailleurs contenir plusieurs schéma XSD), et utilise les références de classes et de type XSD enregistrés dans mx.rpc.xml.SchemaTypeRegistry.</li>
</ul>
<h2>Votre object en XML, via XSD</h2>
<p>Dans un premier temps, il nous faut charger la définition XSD via un URLLoader : </p>
<pre class="brush: js">
var urlLoader : URLLoader = new URLLoader();
urlLoader.addEventListener( Event.COMPLETE, onLoadXsdComplete );
urlLoader.load( new URLRequest( &quot;geek.xsd&quot; ) );	
</pre>
<p>A la réception de la XSD, nous initialisons la classe Schema et le SchemaManager :</p>
<pre class="brush: js">
var _schema:Schema = new Schema();
var _schemaManager:SchemaManager = new SchemaManager();

_schema.xml = XML( urlLoader.data );
_schemaManager.addSchema( _schema );
</pre>
<p>Nous ajoutons la référence du manager de schéma dans nos objets d’encodage/décodage :</p>
<pre class="brush: js">
var _xmlDecoder:XMLDecoder = new XMLDecoder();
var _xmlEncoder:XMLEncoder = new XMLEncoder();

_xmlDecoder.schemaManager = _schemaManager;
_xmlEncoder.schemaManager = _schemaManager;
</pre>
<p>Ensuite, nous référençons les types contenus dans la XSD, avec les classes AS correspondantes : </p>
<pre class="brush: js">
var _schemaTypeRegistry : SchemaTypeRegistry;
_schemaTypeRegistry = SchemaTypeRegistry.getInstance();

_schemaTypeRegistry.registerClass(
    new QName(_schema.targetNamespace.uri, &quot;groupsCollectionType&quot;), ArrayCollection);
_schemaTypeRegistry.registerClass(
    new QName(_schema.targetNamespace.uri, &quot;groupType&quot;), GeekGroup);

_schemaTypeRegistry.registerClass(
    new QName(_schema.targetNamespace.uri, &quot;geeksCollectionType&quot;), ArrayCollection);
_schemaTypeRegistry.registerClass(
    new QName(_schema.targetNamespace.uri, &quot;geekType&quot;), Geek);

_schemaTypeRegistry.registerClass(
    new QName(_schema.targetNamespace.uri, &quot;stuffCollectionType&quot;), ArrayCollection);
_schemaTypeRegistry.registerClass(
    new QName(_schema.targetNamespace.uri, &quot;stuffType&quot;), Stuff);
</pre>
<p>Enfin, nous récupérons notre XML tout bien valide, image de l’objet targetObject, via l’encodeur XML (il faut préciser le nom du noeud “root” de la XSD) : </p>
<pre class="brush: js">
var xmlList : XMLList = _xmlEncoder.encode( targetObject,
    new QName( _schema.targetNamespace.uri, &quot;groups&quot;) );
</pre>
<p>Super simple.</p>
<h2>D&#8217;un XML vers un Object</h2>
<p>C’est magique, c’est tout pareil ! au lieu d’utiliser XMLEncoder, on utilise XMLDecoder, et on change la référence de l’objet par notre XML : </p>
<pre class="brush: js">
var obj : ArrayCollection = _xmlDecoder.decode( myXml,
    new QName( _schema.targetNamespace.uri, &quot;groups&quot;) ) as ArrayCollection;
</pre>
<h2>Automatisation</h2>
<p>Je vous propose un set de classes pour faire tout ça de manière automatique. </p>
<ul>
<li><a href="http://www.lafabrick.com/labz/xsdconverter/srcview/source/com/lafabrick/converter/XSDConverter.as.html">XSDConverter</a> : un convertisseur XML via XSD.<br />
2 méthodes : </p>
<ul>
<li>importFromXml( xml : *, xsdUrl : String, schemaTypes : Vector.<XSDType> = null ) : void</li>
<li>exportToXml( target : Object, xsdUrl : String, schemaTypes : Vector.<XSDType> = null ) : void</li>
</ul>
<p>En paramètre de ces méthodes : </p>
<ul>
<li><strong>la source</strong> : Object pour l’exportation, une String, un XML ou un XMLList pour l’importation;</li>
<li><strong>xsdUrl</strong> : l’url de la xsd a charger;</li>
<li><strong>schemaType</strong> : une collection (Vector) d’objet de type XSDType, définissant le mapping entre les types XSD, et les classes référentes AS.</li>
</ul>
</li>
<li><a href="http://www.lafabrick.com/labz/xsdconverter/srcview/source/com/lafabrick/converter/XSDEvent.as.html">XSDEvent</a> : l’évènement diffusé par XSDConverter (importSuccess, exportSuccess et conversionError (en cas de problème de conversion ou de chargement de la XSD ) ).</li>
<li><a href="http://www.lafabrick.com/labz/xsdconverter/srcview/source/com/lafabrick/converter/XSDType.as.html">XSDType</a> : définition d’un type XSD, avec la classe AS associée.</li>
</ul>
<p><a href="http://www.lafabrick.com/labz/xsdconverter/">Un petit exemple est disponible là</a>, avec <a href="http://www.lafabrick.com/labz/xsdconverter/srcview/index.html">les sources sous ce lien</a>.</p>
<h2>Et donc&#8230;.</h2>
<p>&#8230; vous pouvez vous dire que  “Ahh ! Maintenant que mes données sont automatiquement transformées en XML, je me sens mieux. Et comme j’ai gagné plein de temps, ba du coup je peux lire des articles fort intéressants comme ceux concernant <a href="http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/">le skinning</a> ou <a href="http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/">les primitives dans Flex4</a>. De toutes façons y’a trop de monde à la Fnac pour finir mes cadeaux&#8230;.”</p>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2008/02/06/301-tips-of-the-day-les-collectionevent/" rel="bookmark" title="6 février 2008">Pti truc du jour : Les CollectionEvent</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/01/10/288-cairngorm-pour-les-fainants-tour-d-horizons-des-code-generator/" rel="bookmark" title="10 janvier 2008">Cairngorm pour les fainéants&#8230; Tour d&#8217;horizons des code generator</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/21/999-what-is-adobe-cocomo/" rel="bookmark" title="21 janvier 2009">Developing with AFCS a.k.a Cocomo &#8211; Introduction</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/15/819-reflex-2-vous-reprendez-bien-un-peu-de-ioc/" rel="bookmark" title="15 janvier 2009">Reflex #2 : vous reprendrez bien un peu de IOC ?</a></li>
</ul>
<p><!-- Similar Posts took 21.399 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/12/14/1492-object-to-xml-to-object-conversion-xsd/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Vous reprendrez bien un set de travail !?</title>
		<link>http://www.lafabrick.com/blog/2009/04/14/1100-vous-reprendrez-bien-un-set-de-travail/</link>
		<comments>http://www.lafabrick.com/blog/2009/04/14/1100-vous-reprendrez-bien-un-set-de-travail/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 23:40:15 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[Bientôt chez vous]]></category>
		<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[flex builder]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1100</guid>
		<description><![CDATA[[UPDATE] Si vous préférez la langue de Shakespeare, Tekool avait déjà écrit à ce propos il y a &#171;&#160;fort longtemps&#160;&#187;&#8230; je rends donc à César !&#8230; désolé&#8230; Vous venez de créer votre douzième workspace Eclipse/Flex Builder ??? Et vous en avez marre de recréer vos perspectives, et autres vues&#8230; à chaque fois ??? Mais pourquoi [...]]]></description>
			<content:encoded><![CDATA[<p>[UPDATE] Si vous préférez la langue de Shakespeare, <a href="http://www.tekool.net/blog/2008/05/26/%c2%abworking-sets%c2%bb-an-helpful-flex-navigator-functionality/">Tekool</a> avait déjà écrit à ce propos il y a &laquo;&nbsp;fort longtemps&nbsp;&raquo;&#8230; je rends donc à César <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  !&#8230; désolé&#8230;</p>
<p>Vous venez de créer votre douzième workspace Eclipse/Flex Builder ??? Et vous en avez marre de recréer vos perspectives, et autres vues&#8230; à chaque fois ???</p>
<p><img src="http://lafabrick.com/blog/images/erick//01_project_list-20090414-012817.png" alt="trop c'est trop !!!" /></p>
<p>Mais pourquoi diable n&#8217;utilisez vous pas les &laquo;&nbsp;fameux&nbsp;&raquo; &#8216;working sets&#8217; ?</p>
<p><span id="more-1100"></span></p>
<p>Et puisque quelques pixels valent pleins de mots&#8230;</p>
<p><img src="http://lafabrick.com/blog/images/erick//02_menuWorkingSet-20090414-013950.png" alt="Selection Working Set" /></p>
<p><img src="http://lafabrick.com/blog/images/erick//03_Select_Working_Set-20090414-013159.png" alt="Nouvea working set" /></p>
<p><img src="http://lafabrick.com/blog/images/erick//04_RessourceSet-20090414-013246.png" alt="Ressource Set type" /></p>
<p><img src="http://lafabrick.com/blog/images/erick//05_NewWorkingSet-20090414-013429.png" alt="Choix ressources" /></p>
<p><img src="http://lafabrick.com/blog/images/erick//06_selectWorkingSet-20090414-013547.png" alt="Selection working set" /></p>
<p><img src="http://lafabrick.com/blog/images/erick//07_workingSet1_result-20090414-013636.png" alt="un bol d'air" /></p>
<p>Les working sets ( prononcez &#8216;setss&#8217; )&#8230; tout simplement la solution moderne aux problèmes de congestion de projets dans Eclipse &#038; Flex Builder !Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/08/28/209-wtp-flex-buider-rsoudre-les-problmes-de-mmoire/" rel="bookmark" title="28 août 2007">WTP &#8211; Flex Buider : résoudre les problèmes de mémoire</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/11/15/266-debuguer-un-projet-flex-distant-via-flex-builder/" rel="bookmark" title="15 novembre 2007">L&#8217;erreur est humaine&#8230; debuguer un projet Flex distant via Flex Builder</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/27/309-flex-builder-3-et-le-php/" rel="bookmark" title="27 février 2008">Flex Builder 3 et le PHP ( PDT ) : installation</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/01/15/291-flex-masquer-les-warnings-inutiles/" rel="bookmark" title="15 janvier 2008">Flex et les warnings inutiles&#8230;</a></li>
</ul>
<p><!-- Similar Posts took 19.201 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/04/14/1100-vous-reprendrez-bien-un-set-de-travail/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Hello AFCS ( bye Cocomo ) : première application multi-utilisateurs</title>
		<link>http://www.lafabrick.com/blog/2009/01/31/1040-hello-cocomo-first-app/</link>
		<comments>http://www.lafabrick.com/blog/2009/01/31/1040-hello-cocomo-first-app/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 21:48:24 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[cocomo]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[interactivité]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1040</guid>
		<description><![CDATA[[ 5 mars 2009 : Mise à jour de l'article : Cocomo devient AFCS et passe en version 0.9.1, corrigeant quelques bugs ] Dans ce 1er exemple d’application Cocomo Adobe Flash Collaboration Services aka A.F.C.S, nous allons développer, à vrai dire «&#160;assembler&#160;», une application de visioconférence intégrant un tchat, des notes partagées et un gestionnaire [...]]]></description>
			<content:encoded><![CDATA[<p>[ 5 mars 2009 : Mise à jour de l'article : <del datetime="2009-03-05T19:23:22+00:00">Cocomo</del> devient AFCS et passe en version 0.9.1, corrigeant quelques bugs ]</p>
<p>Dans ce 1er exemple d’application <del datetime="2009-03-05T19:23:22+00:00">Cocomo</del> <strong>Adobe Flash Collaboration Services</strong> aka <strong>A.F.C.S</strong>, nous allons développer, à vrai dire «&nbsp;assembler&nbsp;», une application de <strong>visioconférence</strong> intégrant un <strong>tchat, </strong>des<strong> notes partagées </strong>et un gestionnaire de <strong>partage de fichiers</strong>. Pour cela nous allons utiliser des <strong>pods</strong>, les composants de plus haut-niveau fournis dans <del datetime="2009-03-05T19:23:22+00:00">cocomo</del> AFCS .</p>
<p>L’un des principaux composants d’une application <del datetime="2009-03-05T19:23:22+00:00">cocomo</del> AFCS  est le <strong>gestionnaire de session</strong>. C’est lui qui sera chargé de la communication avec les serveurs <del datetime="2009-03-05T19:23:22+00:00">cocomo</del> AFCS , et donc de l’identification des utilisateurs, de la gestion de leur connexion, de la synchronisation des données… et plus encore…</p>
<p>Deux composants peuvent jouer ce rôle : <strong>ConnectSessionContainer</strong> et <strong>ConnectSession</strong> ( tous deux implémentent <em><strong>com.adobe.rtc.session.IConnectSession </strong></em>).</p>
<p><img src="http://lafabrick.free.fr/blogImg/Cocomo_prez1-20081218-051847.jpg" alt="Connexion Cocomo" /><br />
<span id="more-1040"></span></p>
<h3>Hello AFCS ( bye Cocomo )</h3>
<p>Pour commencer :</p>
<p>- créer un <strong>nouveau projet Flex</strong>,<br />
- <strong>copier le SWC <del datetime="2009-03-06T16:02:18+00:00">Cocomo</del> AFCS (depuis CocomoSDK_0.9/lib/player 9 ou 10/afcs.swc) et collez-le dans votre répertoire /libs/</strong></p>
<p>Il s’agit d’un composant basé sur la classe Canvas, et intégrant toute la «&nbsp;mécanique&nbsp;» nécessaire à la communication avec les serveurs <del datetime="2009-03-05T19:23:22+00:00">cocomo</del> AFCS .</p>
<p>Il est à noter que le ConnectSessionContainer, et donc ses «&nbsp;composants-enfants&nbsp;», resteront invisibles tant que la communication avec salon ne sera pas établie. C’est pour cette raison que nous allons lui intégrer nos <strong><em>pods ( WebCamera, SimpleChat, Notes et FileShare ).</em></strong>Tant que la connexion ne sera pas établie, aucun des composants ne sera visible.</p>
<p>Pour débuter une session, nous devrons renseigner deux propriétés du <strong>container de session</strong> :</p>
<ul>
<li>l’adresse du salon: <strong>roomURL</strong> ( exemple : http://connectnow.acrobat.com/votreCompte/nomSalon )</li>
<li>les identifiants de connexion : <strong>authenticator</strong></li>
</ul>
<p>La transmission des identifiants se fait par l’intermédiaire de la classe <strong>AdobeHSAuthenticator</strong>.Elle a pour fonction d’encapsuler les informations relatives à l’identification( <strong>userName</strong>, <strong>password</strong> ). Plusieurs modes d’authentification sont possibles, nous nous y interresserons plus tard.</p>
<p>Dans un premier temps nous nous contenterons d’inscrire nos identifiants «&nbsp;en dur&nbsp;» dans notre application.</p>
<p>On peut noter que les composants liés à AFCS se référent au namespace ‘AfcsNameSpace’ ( anciennement ‘CocomoNameSpace’ dans version 0.9 )</p>
<pre class="brush: xml">

&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;mx:Application layout=&quot;absolute&quot;
 xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
 xmlns:rtc=&quot;AfcsNameSpace&quot;
 &gt;
&lt;rtc:ConnectSessionContainer id=&quot;sessionManager&quot; width=&quot;500&quot; height=&quot;400&quot;
 roomURL=&quot;http://connectnow.acrobat.com/yourAccount/roomName&quot;
 authenticator=&quot;{identificator}&quot;
 backgroundColor=&quot;#FFFFFF&quot;
/&gt;
&lt;rtc:AdobeHSAuthenticator id=&quot;identificator&quot;
 userName=&quot;votreLogin&quot; password=&quot;VotreMotDePasse&quot;
/&gt;
&lt;/mx:Application&gt;
</pre>
<p>À ce stade, l’application peut déjà se connecter. Par défaut, dès que le connectSessionContainer est créé, il tente d’initier la communication avec les serveurs. Dans cet exemple, j’ai ajouté une couleur de fond pour le container, de manière à pouvoir observer lorsque la connexion au salon est réussie.</p>
<p>Si vous publiez le projet en mode debug vous verrez les logs relatifs aux communications client/serveur.</p>
<p><img src="http://lafabrick.free.fr/blogImg/Flex_Builder-20081218-065625.jpg" alt="Logs Connexion Serveurs Cocomo" /></p>
<p>Pour vérifier si l’authentification est correcte, nous pouvons déclarer des écouteurs d’événements <strong>AuthenticationEvent.AUTHENTICATION_FAILURE </strong>et <strong>AuthenticationEvent.AUTHENTICATION_SUCCESS </strong>sur <strong>AdobeHSAuthenticator</strong>.</p>
<p>Pour capter le moment où notre application est connectée et synchronisée, nous pouvons ajouter un écouteur d’événement <strong>SessionEvent.SYNCHRONIZATION_CHANGE</strong> sur le container, et surveiller sa propriété ‘<strong>isSynchronized</strong>‘. Nous reviendrons prochainement sur les différents aspects et acteurs en jeu lors de cette synchronisation.</p>
<pre class="brush: xml">

&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;mx:Application layout=&quot;absolute&quot;
    xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
    xmlns:rtc=&quot;AfcsNameSpace&quot;
&gt;
     &lt;mx:Script&gt;
         &lt;![CDATA[
             import mx.controls.Alert;
             import com.adobe.rtc.events.SessionEvent;

             // session&#039;s state
             private var isConnected:Boolean = false;

			// when a &quot;server synchronization&quot; event is dispatched
             public function onSynchro( e:SessionEvent ):void
             {
                 if ( sessionManager.isSynchronized &amp;&amp;  ! isConnected )
                 {
                     Alert.show(&quot;Application connectée&quot;);
                     isConnected = true ;
                 }
             }
     ]]&gt;
 &lt;/mx:Script&gt;
&lt;rtc:ConnectSessionContainer id=&quot;sessionManager&quot;
    width=&quot;100%&quot; height=&quot;100%&quot; backgroundColor=&quot;#FFFFFF&quot;
    authenticator=&quot;{identificator}&quot;
    roomURL=&quot;http://connectnow.acrobat.com/regartdemo/meetingzone&quot;
    synchronizationChange=&quot;onSynchro( event )&quot;
/&gt;
&lt;!-- Authentication component --&gt;
 &lt;rtc:AdobeHSAuthenticator id=&quot;identificator&quot;
   userName=&quot;YourUserName&quot; password=&quot;YourPassword&quot;
   authenticationSuccess=&quot;Alert.show(&#039;authentication success&#039;)&quot;
   authenticationFailure=&quot;Alert.show(&#039;authentication failed&#039;)&quot;/&gt;
&lt;/mx:Application&gt;
</pre>
<p>Maintenant que notre connexion parvient à se connecter au salon, nous allons pouvoir intégrer les pods.</p>
<h3>Utilisation des pods</h3>
<p>Les pods sont des composants collaboratifs «&nbsp;<strong>prêt à l’emploi</strong>«&nbsp;. Lorsque vous utilisez un <strong>ConnectSessionContainer</strong>, il suffit d’insérer vos pods à l’intérieur pour qu’ils puissent repérer la connexion établie et l’utiliser.</p>
<p>À ce jour, les pods disponibles sont :</p>
<ul>
<li><strong>SimpleChat</strong> : composant de «&nbsp;clavardage&nbsp;» permettant l’envoi de messages publics et privés</li>
<li><strong>WebCamera</strong> : composant de visioconférences</li>
<li><strong>FileShare</strong> : composant de partage de fichier ( upload / download )</li>
<li><strong>Note</strong> : composant de partage de notes</li>
<li><strong>Roster</strong> et <strong>HorizontalRoster</strong> : composant de gestion d’utilisateurs</li>
<li><strong>SharedWhiteBoard</strong> : tableau blanc partagé</li>
</ul>
<p>Nous allons maintenant insérer les pods souhaités :</p>
<pre class="brush: xml">

&lt;rtc:ConnectSessionContainer id=&quot;sessionManager&quot; width=&quot;100%&quot; height=&quot;100%&quot; backgroundColor=&quot;#FFFFFF&quot;
   authenticator=&quot;{identificator}&quot;
   roomURL=&quot;http://connectnow.acrobat.com/votreCompte/nomSalon&quot;
   synchronizationChange=&quot;onSynchro( event )&quot;
   &gt;

   &lt;!-- PODS --&gt;
   &lt;mx:VBox width=&quot;50%&quot; height=&quot;100%&quot; horizontalAlign=&quot;center&quot;&gt;

      &lt;rtc:WebCamera id=&quot;webcam&quot; width=&quot;300&quot; /&gt;

      &lt;rtc:SimpleChat id=&quot;chat&quot; width=&quot;100%&quot; height=&quot;100%&quot; /&gt;

   &lt;/mx:VBox&gt;

   &lt;mx:VBox width=&quot;50%&quot; height=&quot;100%&quot;  right=&quot;0&quot;&gt;

     &lt;rtc:FileShare id=&quot;fileManager&quot; width=&quot;100%&quot; height=&quot;50%&quot; /&gt;

      &lt;rtc:Note id=&quot;notes&quot; width=&quot;100%&quot; height=&quot;50%&quot; /&gt;
   &lt;/mx:VBox&gt;
&lt;/rtc:ConnectSessionContainer&gt;
</pre>
<p><img src="http://lafabrick.free.fr/blogImg/hello_cocomo-20081218-081901.jpg" alt="Hello Cocomo" /></p>
<p>Les pods intégrent des mécanismes de gestion de droits. Nous y reviendrons …</p>
<p>Toujours est-il que voilà, vous avez créé votre première application <del datetime="2009-03-05T19:23:22+00:00">cocomo</del> AFCS , ou devrais je dire votre première application de «&nbsp;communication en temps réelle&nbsp;». Mais comment faisait-on avant ???…</p>
<h3>Identification et gestion de la connexion aux serveurs</h3>
<p>Bon il manque encore quelque chose peut être… Pour un seul utilisateur çà irait presque… mais c’est pas le but :s…Comment fera-t-on si un jour on trouve des amis et qu’on veut collaborer avec eux ??? Tout le monde va se connecter avec le compte «&nbsp;d’admin&nbsp;» ??? Et n’importe quel décompileur AS3 va pouvoir récupérer les identifiants ? Pas très sécure… Heureusement <del datetime="2009-03-05T19:23:22+00:00">cocomo</del> AFCS  nous permet de gérer facilement tous ces aspects.</p>
<p>Les serveurs <del datetime="2009-03-05T19:23:22+00:00">cocomo</del> AFCS  permettent plusieurs types d’identification, notamment une connexion en tant que <strong>hôte</strong>, basée sur le compte <del datetime="2009-03-05T19:23:22+00:00">cocomo</del> AFCS  Developper, et une connexion en tant <strong>qu’invité</strong>, ne nécessitant qu’un nom de participant.</p>
<p>Nous allons donc supprimer les attributs userName et password de l’AdobeHSAuthenticator, et ajouter un formulaire d’authentification à notre application. Ce formulaire permettra de choisir le type d’identification ( hôte ou invité ) :</p>
<pre class="brush: xml">

&lt;mx:Panel id=&quot;logPanel&quot; &gt;
   &lt;mx:Form&gt;

      &lt;mx:FormItem label=&quot;Login&quot;&gt;
         &lt;mx:TextInput id=&quot;chp_login&quot; /&gt;
      &lt;/mx:FormItem&gt;

      &lt;mx:FormItem label=&quot;your role :&quot; direction=&quot;horizontal&quot; &gt;

         &lt;mx:RadioButtonGroup id=&quot;userRole&quot; /&gt;

         &lt;mx:RadioButton id=&quot;isGuest&quot; groupName=&quot;userRole&quot;
            label=&quot;Guest&quot; value=&quot;{UserRoles.VIEWER}&quot;  selected=&quot;true&quot;
         /&gt;
         &lt;mx:RadioButton id=&quot;isOwner&quot; groupName=&quot;userRole&quot;
            label=&quot;Host&quot; value=&quot;{UserRoles.OWNER}&quot;
         /&gt;
      &lt;/mx:FormItem&gt;

      &lt;mx:FormItem label=&quot;Password&quot;  enabled=&quot;{ userRole.selectedValue == UserRoles.OWNER }&quot;&gt;
         &lt;mx:TextInput id=&quot;field_password&quot; displayAsPassword=&quot;true&quot;  /&gt;
      &lt;/mx:FormItem&gt;

      &lt;mx:FormItem &gt;
         &lt;mx:Button label=&quot;Enter&quot;
            click=&quot;login(chp_login.text , userRole.selectedValue == UserRoles.OWNER ? field_password.text : null  )&quot;
          /&gt;
      &lt;/mx:FormItem&gt;

   &lt;/mx:Form&gt;
&lt;/mx:Panel&gt;
</pre>
<p>La définition des <strong>rôles des utilisateurs</strong> est basée sur des valeurs numériques, définies dans des constantes de la classe <strong>UserRoles</strong>.</p>
<p>Les principaux rôles sont <strong>Owner</strong> ( hôte / propriétaire du salon ), <strong>Publisher</strong> ( participant autorisé à publier sur un ou plusieurs pods ) et <strong>Viewer</strong> ( invité seulement autorisé à utiliser le tchat ). Normallement, les invités ne peuvent utiliser un salon que si l’hôte est présent. Il est possible de modifier la configuration initiale des salons ( droit de publication automatique, persistence des données, entrée libre… ), ainsi que les rôles et les droits des utilisateurs connectés, pour cela nous pourrons utiliser l’application <del datetime="2009-03-05T19:23:22+00:00">CocomoDevConsole</del> AFCSDevConsole ou l’API directement. Mais c’est déjà une autre histoire…</p>
<p>Pour le moment, nous allons permettre à l’utilisateur de s’identifier à l’aide du formulaire. Pour cela nous devons <strong>désactiver la connexion automatique du gestionnaire de session</strong> en déclarant sa propriété <strong>autoLogin=&nbsp;»false&nbsp;»</strong>.</p>
<p>Pour finir, nous allons ajouter une méthode <strong><em>login()</em></strong> qui sera chargée de renseigner le <strong><em>AdobeHSAuthenticator</em></strong>, et de lancer la connexion du gestionnaire de session :</p>
<pre class="brush: js">

private function login ( login:String, password:String ):void
{
   identificator.userName = login;
	//if password is set : log as host
	//else log as guest
   identificator.password = password ;

	// run sessionManager connection
   sessionManager.login();
}
</pre>
<p>Nous allons ensuite rajouter un bouton et une fonction de déconnexion.</p>
<pre class="brush: js">

// disconnection
// in actual 0.9 beta, mostly pods, can&#039;t be re-connected after a disconnection

private function logout():void
{
    sessionManager.logout();

	// close() is supposed to disconnect et remove all childNodes, but seems not work yet
    //sessionManager.close();
}
</pre>
<pre class="brush: xml">

&lt;mx:VBox width=&quot;50%&quot; height=&quot;100%&quot; horizontalAlign=&quot;center&quot; right=&quot;0&quot;&gt;
    &lt;mx:Button label=&quot;Logout&quot; click=&quot;logout()&quot; /&gt;

    &lt;rtc:FileShare id=&quot;fileManager&quot; width=&quot;100%&quot; height=&quot;50%&quot; /&gt;

    &lt;rtc:Note id=&quot;notes&quot; width=&quot;100%&quot; height=&quot;50%&quot; /&gt;
&lt;/mx:VBox&gt;
</pre>
<p>Dès que l’application sera connectée, nous supprimerons le formulaire, et en cas de déconnexion le gestionnaire de session sera supprimé :</p>
<pre class="brush: js">

// for each synchronization event
// : connection, disconnection , state&#039;s change, ...
private function onSynchro( e:SessionEvent ):void
{

	// once application is successfully connected / synchronized
    if ( sessionManager.isSynchronized &amp;&amp; ! isConnected )
    {
        Alert.show(&quot;Application connectée&quot;);

        isConnected = true ;

        removeChild( logPanel );

    } else if ( ! sessionManager.isSynchronized &amp;&amp; isConnected ){
    // if disconnected
    isConnected = false ;

   /* remove the connectSessionContainer
   *  » in this version disconnected pods can&#039;t re-connect
   *
   *  » For re-connect, you can :
   *     - reload html page
   *     - dynamically re-create connectSession and pods
   */
   removeChild( sessionManager );

   // display logout message
   Alert.show( &#039;vous avez quitté la réunion, recharger la page pour entrer à nouveau&#039;);
   }
}
</pre>
<p><strong>La gestion des déconnexions / reconnexions semblent pour le moment un peu instables.</strong> Mais bon on est prévenu, c’est une béta. Après quelques tests, je crois que le meilleur moyen de revenir dans un salon après s’être déconnecté, est de recharger la page.</p>
<p>Accéder aux <a href="http://www.e-actif.com/lab/hello_cocomo">sources complétes</a></p>
<p>Voilà la fin de ce premier exemple d’utilisation de <del datetime="2009-03-05T19:23:22+00:00">cocomo</del> AFCS , et il est bien entendu possible d’aller beaucoup plus loin. La prochaine fois nous nous intéresserons de plus près aux différents mécanismes articulés au sein de <del datetime="2009-03-05T19:23:22+00:00">cocomo</del> AFCS , et plus globalement à l’architecture du service. Nous utiliserons également la <del datetime="2009-03-05T19:23:22+00:00">CocomoDevConsole</del>AFCSDevConsole et le <strong>LocalConnectionServer</strong>, les deux outils AIR proposés dans le SDK.</p>
<p>D’ici là bonne collaboration !!! <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  </p>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/12/07/274-cocomo-dbarque-et-personne-me-prvient/" rel="bookmark" title="7 décembre 2007">Cocomo est là et personne me prévient ??!!</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/12/22/568-cocomo-kezako/" rel="bookmark" title="22 décembre 2008">Cocomo ? Kezako ?</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/12/13/506-utiliser-le-dragmanager-de-flex-1ere-partie/" rel="bookmark" title="13 décembre 2008">Utiliser le DragManager de Flex ( 1ère partie )</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/21/999-what-is-adobe-cocomo/" rel="bookmark" title="21 janvier 2009">Developing with AFCS a.k.a Cocomo &#8211; Introduction</a></li>
</ul>
<p><!-- Similar Posts took 12.410 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/01/31/1040-hello-cocomo-first-app/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Developing with AFCS a.k.a Cocomo &#8211; Introduction</title>
		<link>http://www.lafabrick.com/blog/2009/01/21/999-what-is-adobe-cocomo/</link>
		<comments>http://www.lafabrick.com/blog/2009/01/21/999-what-is-adobe-cocomo/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 23:38:28 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[cocomo]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=999</guid>
		<description><![CDATA[[ 05.03.2009 : Update : Cocomo is now called Adobe Flash Collaboration Services / AFCS and 0.9.1 was released with some bug fixes and a new namespace ] Hey there! Here is, as a first English article, an introduction to Adobe Cocomo AFCS. (Translated from French tutorial on FlashXPress ) Cocomo is an abbreviation of [...]]]></description>
			<content:encoded><![CDATA[<p>[ 05.03.2009 : Update : Cocomo is now called Adobe Flash Collaboration Services / AFCS and 0.9.1 was released with some bug fixes and a new namespace ]</p>
<p>Hey there!<br />
Here is, as a first English article, an introduction to <del datetime="2009-03-06T00:25:09+00:00">Adobe Cocomo</del> AFCS.<br />
(Translated from <a href="http://www.flashxpress.net/ressources-flex/developper-avec-cocomo-introduction/"> French tutorial on FlashXPress </a>)</p>
<p style="text-align: center;"><a href="https://cocomo.acrobat.com/"><img class="aligncenter" title="AFCS/Cocomo developer account" src="http://lafabrick.free.fr/blogImg/cocomo-20090121-005745.png" alt="" width="520" height="180" /></a></p>
<p><span id="more-999"></span></p>
<p><strong> Cocomo </strong> is an abbreviation of «<strong>COmmon COllaboration MOdel</strong>», which was the first name given by Adobe to its new online service dedicated to <strong>collaborative application development</strong>. The final commercial name is Adobe Flash Collaboration Services a.k.a AFCS </p>
<p>This name both references :</p>
<ul>
<li>a <strong>SDK</strong> that includes a Flex components library and tools dedicated to multi-users applications development. Just so you know, those components are used by Adobe for developing ConnectNow, a video conference application part of the <a href="http://www.acrobat.com/">Acrobat.com</a> platform.</li>
<li>a <strong>free online service</strong> (with some limitations), enabling creation and deployment of collaborative applications on <a href="http://www.adobe.com/fr/products/flashmediaserver/">FMS</a> servers hosted and maintained by Adobe.</li>
</ul>
<p>In short, <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS will allow us to develop applications that will use real-time communications capabilities of FMS servers, without taking care of those servers&#8230; cooool !!!</p>
<p>But what are the «<strong>real-time communications</strong> capabilities of those FMS servers» ???</p>
<p>In fact, the <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  servers will allow us to:</p>
<ul>
<li>exchange <strong>audio and video data flows</strong>, useful to create visioconference application for example,</li>
<li><strong>synchronize different types of data between multiple client applications</strong>. It allows you to add a chat to an existing application, to develop a co-navigation system, a document co-edition functionnality, some multi-users game&#8230;</li>
<li><strong>share files</strong></li>
<li><strong>manage user rights</strong> regarding their role</li>
</ul>
<p><img src="http://lafabrick.free.fr/blogImg/Cocomo_prez1-20090120-220414.png" alt="AFCS /  Cocomo  " /></p>
<p>This schema describes the interaction between a room, hosted on a developer account of a cocomo server, and some Flex clients : the host user (owner), an active guest (publisher), and a passive guest. The host send his webcam output, and both host and publisher can update notes on the server, these data are broadcasted to the other clients.</p>
<p>The library contains «high-level» graphical components, known as <strong>pods</strong>, but also some more «low-level» classes that a developer can use to create his own components (<strong>SharedModel</strong>, <strong>CollectionNode</strong>).</p>
<p><img src="http://lafabrick.free.fr/blogImg/Cocomo_Pods-2-3-20090121-003644.png" alt="AFCS / Cocomo built-in Pods" /></p>
<p>This schema shows an example of pods (Tchat, Notes, User management, Webcam and File sharing)</p>
<p>The pods are <strong>collaborative «plug’n’play» components</strong>, that we will use to create our first <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  applications without having to write a single line of code (Tchat, Webcam, Notes&#8230;). The lower level classes will help us to go deeper and create components that will fit more specific needs.</p>
<p>But, first things first : let’s create a «<del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  Developer» account&#8230;</p>
<h3><del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  Developer account creation</h3>
<p>To create an account :</p>
<ul>
<li>Go to the <a href="https://cocomo.acrobat.com/"><del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  portal (https://cocomo.acrobat.com)</a>,</li>
<li>Create a <strong>new account</strong> (you can also use your existing Adobe account)</li>
<li>Choose a <strong><del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  account identifier</strong> («account name», room access URLs will be based on that identifier)
<ol>
<li>The Account URL situation in the screen</li>
<li>The Room instances panel (click the &laquo;&nbsp;Add&nbsp;&raquo; button)</li>
<li>The &laquo;&nbsp;Download SDK&nbsp;&raquo; button</li>
</ol>
</li>
<p><img src="http://lafabrick.com/blog/images/erick//AFCS_Developer_Portal-20090305-213035.jpg" alt="Cocomo Developper Console" /><br />
This capture represents the <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  home page. It mainly illustrates the three steps to follow:</p>
<li>Once your account has been created, make sure to note your <strong>Account URL</strong></li>
<li>In the &laquo;&nbsp;<strong>Room instances</strong>&nbsp;&raquo; panel, create a new <strong>room. </strong>A room represents a &laquo;&nbsp;virtual meeting point&nbsp;&raquo; where several client application will be able to <strong>exchange audio / video flows, files or messages</strong>. Your account will allow you to create several rooms, with a single configuration for each room. A room is also identified by a URL that looks like <em>http://connectnow.acrobat.com/yourAccount/roomName</em>.</li>
<li>Once your room has been created, download the SDK.</li>
</ul>
<p>You&#8217;ll find within the downloaded ZIP:</p>
<ul>
<li><strong>documentation</strong></li>
<li><strong>application examples</strong></li>
<li>Air utilities: <strong><del datetime="2009-03-06T00:25:09+00:00">CocomoDevConsole</del> AFCSDevConsole</strong> for your accounts and rooms management, and <strong>LocalConnectionServer</strong>, a local <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  server emulation that will allow you to test some of your applications features without having to connect to a &laquo;&nbsp;real&nbsp;&raquo; <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  server (mainly messaging)</li>
<li>library <strong>sources</strong></li>
<li>library SWC for Flash Player 9 and Flash Player 10</li>
</ul>
<h3><del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  installation</h3>
<p>For this version (0.9), installation will reside in including <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  library documentation at Eclipse&#8217;s one. To do so:</p>
<ul>
<li>create a &#8216;<em>com.adobe.afcs</em>&#8216; folder in the &#8216;<em>plugins</em>&#8216; folder of your Flex Builder installation<br />
<strong>Windows</strong>: C:\Program Files\Adobe\Flex Builder 3\plugins\com.adobe.afcs<br />
<strong>Macintosh</strong>: /Applications/Adobe Flex Builder 3/plugins/com.adobe.afcs</li>
<li>Copy the content of the downloaded file into that folder</li>
<li>(Re)Launch Flex Builder and open the help contents (Help / Help Contents)</li>
</ul>
<p>You should now find the <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  API documentation</p>
<p><img src="http://lafabrick.free.fr/blogImg/cocomo_help-20081218-031802.jpg" alt="Cocomo Doc in Flex Builder / Eclipse" /><br />
This schema is a screen capture of the cocomo documentation opened within the Flex Builder environment.</p>
<p>And noooow&#8230; <a href="http://www.lafabrick.com/blog/2009/01/31/1040-hello-cocomo-first-app/">let&#8217;s collaborate</a> !!! <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
&gt;&gt; Next : <a href="http://www.lafabrick.com/blog/2009/01/31/1040-hello-cocomo-first-app/">My first <del datetime="2009-03-06T00:25:09+00:00">Cocomo</del> AFCS  Application</a>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/12/07/274-cocomo-dbarque-et-personne-me-prvient/" rel="bookmark" title="7 décembre 2007">Cocomo est là et personne me prévient ??!!</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/12/22/568-cocomo-kezako/" rel="bookmark" title="22 décembre 2008">Cocomo ? Kezako ?</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/12/23/591-cocomo-wiibot/" rel="bookmark" title="23 décembre 2008">Introducing r.CØ &#8230; First &laquo;&nbsp;Cocomo ready&nbsp;&raquo; Air Wiibot&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/31/1040-hello-cocomo-first-app/" rel="bookmark" title="31 janvier 2009">Hello AFCS ( bye Cocomo ) : première application multi-utilisateurs</a></li>
</ul>
<p><!-- Similar Posts took 12.885 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/01/21/999-what-is-adobe-cocomo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Développer une application iPhone &#8211; XCode et Interface Builder passés au crible</title>
		<link>http://www.lafabrick.com/blog/2009/01/16/807-developper-une-application-iphone-xcode-et-interface-builder-passes-au-crible/</link>
		<comments>http://www.lafabrick.com/blog/2009/01/16/807-developper-une-application-iphone-xcode-et-interface-builder-passes-au-crible/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 22:00:38 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[Conseils]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=807</guid>
		<description><![CDATA[Cet article suit la <a href="http://www.lafabrick.com/blog/2009/01/12/753-developper-une-application-iphone-introduction-aux-concepts-de-base/">description des concepts de base permettant d'appréhender le développement d'une application pour iPhone</a>.
Il présente les outils de développement utilisés pour faire une application pour iPhone en analysant rapidement un projet de base proposé avec le SDK iPhone.
Il ne parle pas de la syntaxe de développement Objective-C.]]></description>
			<content:encoded><![CDATA[<p>Cet article suit la <a href="http://www.lafabrick.com/blog/2009/01/12/753-developper-une-application-iphone-introduction-aux-concepts-de-base/">description des concepts de base permettant d&#8217;appréhender le développement d&#8217;une application pour iPhone</a>.<br />
Il présente les outils de développement utilisés pour faire une application pour iPhone en analysant rapidement un projet de base proposé avec le SDK iPhone.<br />
Il ne parle pas de la syntaxe de développement Objective-C.</p>
<p>Je vous suggère vivement si vous n&#8217;avez pas lu l&#8217;article ou si vous ne connaissez pas encore grand chose au développement sous iPhone de vous y intéresser pour mieux aborder cette suite&#8230;</p>
<p><img class="aligncenter" title="XCode and Interface Builder" src="http://lafabrick.free.fr/blogImg/xbuilderInterface-20090121-010351.png" alt="" width="520" height="224" /></p>
<p>Une dernière chose avant de démarrer : massez-vous les tempes, faites-vous un petit café&#8230;<br />
Prêt ?<br />
<span id="more-807"></span></p>
<h3>Installer le SDK iPhone</h3>
<p>A l&#8217;heure ou j&#8217;écris ces lignes, Apple en est à la <a href="http://developer.apple.com/iPhone/program/download.html">version 2.2 du SDK iPhone</a>.<br />
L&#8217;installation vous mettra à disposition tous les outils dont je vais parler ici.</p>
<h3>Ouvrir un projet d&#8217;exemple pour se familiariser avec la structure d&#8217;un projet iPhone</h3>
<p>Je considère à présent que vous avez déjà un Mac (bah oui&#8230;), et le SDK iPhone installé dessus.</p>
<ol>
<li>Ouvrez XCode.<br />
<img class="alignnone size-medium wp-image-785" title="Xcode" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/welcome-to-xcode-300x206.jpg" alt="Xcode" width="300" height="206" /></li>
<li>Faites Fichier &gt; Nouveau projet&#8230;<br />
<img class="alignnone size-full wp-image-787" title="New project" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/new-project.jpg" alt="New project" width="503" height="477" /></li>
<li>Choisissez &laquo;&nbsp;View-Based Application&nbsp;&raquo;</li>
<li>Entrez le nom de projet &laquo;&nbsp;LaFabrick&nbsp;&raquo; puis choisissez un emplacement, vous arrivez alors sur l&#8217;interface principale d&#8217;Xcode.</li>
</ol>
<p>Voyons maintenant les fichiers que nous avons :<br />
<img class="alignnone size-full wp-image-792" title="Accueil Xcode View-Based application" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/lafabrick.jpg" alt="Accueil Xcode View-Based application" width="676" height="479" /><br />
Nous sommes en Objective-C, donc pour chaque classe, vous trouverez un fichier .h définissant l&#8217;interface et un fichier .m contenant l&#8217;implémentation (amis du C bonjour !).<br />
Ouvrons &laquo;&nbsp;LaFabrickAppDelegate.h&nbsp;&raquo;<br />
<img class="alignnone size-full wp-image-799" title="LaFabrickAppDelegate.h" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/lafabrickappdelegateh.png" alt="LaFabrickAppDelegate.h" width="554" height="331" /><br />
On constate dans cette interface les déclarations d&#8217;un objet fenêtre (objet de base utilisé pour l&#8217;affichage) et le contrôleur <strong>LaFabrickViewController</strong> que nous étudierons rapidement après.<br />
L&#8217;implémentation est simple :<br />
<img class="alignnone size-full wp-image-801" title="LaFabrickAppDelegate.m" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/lafabrickappdelegatem.png" alt="LaFabrickAppDelegate.m" width="530" height="386" /><br />
Lorsque l&#8217;application vient d&#8217;être démarrée <code>applicationDidFinishLaunching</code>, on demande l&#8217;affichage de la vue contrôlée par notre LaFabrickViewController dans la fenêtre <code>[window addSubview:viewController.view];</code>.<br />
Notez enfin la notation à crochet pour appeler une méthode d&#8217;un objet : oui oui, c&#8217;est relou.</p>
<p>Jetons maintenant un oeil à LaFabrickViewController (.h et .m) : il est quasiment vide ! C&#8217;est effectivement là qu&#8217;on doit travailler un peu&#8230;<br />
Quelques questions se posent :</p>
<ul>
<li>Où est la vue ?</li>
<li>Comment est-elle associée au contrôleur ?</li>
</ul>
<p>Nous allons voir cela avec l&#8217;interface builder.</p>
<h3>Utilisation de l&#8217;Interface Builder pour gérer la vue</h3>
<p>Première réponse : notre vue est ici créée à partir d&#8217;un fichier de description d&#8217;interface géré par l&#8217;interface builder : <strong>LaFabrickViewController.xib</strong>. Double-cliquez dessus, l&#8217;interface suivante s&#8217;affiche alors :<br />
<img class="alignnone size-full wp-image-846" title="Interface Builder" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/interface-builder.png" alt="Interface Builder" width="727" height="481" /><br />
On constate notamment dans la fenêtre centrale, les éléments suivants :</p>
<ul>
<li>File&#8217;s owner : LaFabrickViewController</li>
<li>View : UIView</li>
</ul>
<p>OK, donc le .xib permet de dire que la vue est associée au contrôleur LaFabrickViewController, voilà la deuxième réponse !</p>
<p>Sélectionnez à présent la ligne <strong>View : UIView</strong> puis sélectionnez le second onglet dans la fenêtre de droite.<br />
<strong>Note :</strong> si cette fenêtre n&#8217;est pas visible, faites <em>Tools &gt; Identity Inspector</em></p>
<p>Vous pouvez visualiser l&#8217;association entre la vue <strong>View</strong> et la propriété <strong>view</strong> du contrôleur LaFabrickViewController.<br />
<img class="alignright size-full wp-image-847" title="View connections" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/view-connections.png" alt="View connections" width="290" height="104" /></p>
<p>Cette partie est primordiale pour que l&#8217;affichage de la vue soit effectif : souvenez-vous que dans LaFabrickAppDelegate, on charge la propriété &laquo;&nbsp;view&nbsp;&raquo; de LaFabrickViewController, aussi sans l&#8217;association effectuée dans l&#8217;Interface Builder, il serait impossible d&#8217;afficher quoi que ce soit !</p>
<p><strong>D&#8217;une manière générale, chaque élément ajouté depuis l&#8217;Interface Builder devra être lié à une propriété du contrôleur (ou d&#8217;un délégué) via l&#8217;Interface Builder afin que vous puissez interagir avec depuis le code.<br />
La propriété en question est alors nommée &laquo;&nbsp;Outlet&nbsp;&raquo; côté Interface Builder, soit &laquo;&nbsp;Sortie&nbsp;&raquo; si l&#8217;on traduit litéralement : c&#8217;est effectivement un paramètre de sortie de votre interface.</strong></p>
<h3>Personnaliser un peu l&#8217;interface</h3>
<p>Depuis l&#8217;Interface Builder, ajoutez deux champs texte, deux labels et un bouton histoire d&#8217;obtenir à peu près ça :<br />
<img class="alignnone size-full wp-image-899" title="iPhone - View" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/view.png" alt="iPhone - View" width="321" height="308" /></p>
<p>Si vous faites <em>Tools &gt; Reveal in Document Window&#8230;</em> vous verrez l&#8217;arborescence de contrôles de la vue mise à jour.<br />
<img class="alignnone size-full wp-image-901" title="iPhone - Arborescence de contrôles" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/lafabrickviewcontrollerxib.png" alt="iPhone - Arborescence de contrôles" width="435" height="232" /></p>
<p>Il est maintenant temps de contrôler ces éléments depuis notre LaFabrickViewController.<br />
Pour cela deux méthodes :</p>
<ol>
<li>Directement depuis Interface Builder (cf. <a href="#videodemo">vidéo de démonstration</a>)
<ul>
<li>Sélectionnez LaFabrickViewController depuis le Document Window</li>
<li>Dans &laquo;&nbsp;l&#8217;Inspector&nbsp;&raquo; (fenêtre de droite) choisissez le dernier onglet (i) puis ajoutez les propriétés via la section &laquo;&nbsp;Class Outlets&nbsp;&raquo;<br />
<img class="alignnone size-full wp-image-905" title="Interface Builder - Propriétés de classe" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/la-fabrick-view-controller-identity.png" alt="Interface Builder - Propriétés de classe" width="277" height="421" /></li>
<li>Ceci fait vous devez enregistrer les modifications dans le fichier LaFabrickViewController.m. Pour cela, vous devez utiliser la fonction <em>File &gt; Write class files&#8230;</em></li>
<li>Faites alors &laquo;&nbsp;Save&nbsp;&raquo;</li>
<li>L&#8217;outil vous demande si vous souhaitez fusionner ou écraser : choisissez Merge (fusionner)</li>
<li>Le fichier .m n&#8217;est pas modifié, vous pouvez le fermer, en revanche vous constaterez que le .h peut être modifié comme suit :<br />
<img class="alignnone size-full wp-image-908" title="Merging de fichier sous Interface Builder" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/lafabrickviewcontrollerh.png" alt="Merging de fichier sous Interface Builder" width="785" height="101" /><br />
sous réserve que vous choisissiez l&#8217;action &laquo;&nbsp;Choose left&nbsp;&raquo; depuis le menu déroulant du bas</li>
<li>Sauvegardez (enfin) votre fichier fusionné</li>
</ul>
</li>
<li>Mix XCode et Interface Builder
<ul>
<li>Déclarez manuellement les propriétés correspondant aux contrôles que vous souhaitez manipuler dans l&#8217;interface (LaFabrickViewController.h) :<code><br />
IBOutlet UITextField *lastNameField;<br />
IBOutlet UITextField *nameField;<br />
IBOutlet UIButton *validateButton;<br />
</code></li>
<li>Compilez le projet</li>
<li>Rouvrez l&#8217;Interface Builder pour faire les liens</li>
</ul>
</li>
</ol>
<p><strong>Note :</strong> la première méthode a le mauvais goût d&#8217;ouvrir l&#8217;outil de fusion de fichiers pour que vous validiez que rien n&#8217;est écrasé ou ajouté sans votre accord.<br />
J&#8217;avoue que, malgré la nécessité de la fusion, je trouve ça très peu pratique voire franchement lourdingue, je m&#8217;attendais à mieux venant d&#8217;un monstre de l&#8217;ergonomie. Mais c&#8217;est le prix à payer pour avoir deux outils quasiment indépendants, et enfin, si vous connaissez une meilleure méthode, n&#8217;hésitez pas à poster !</p>
<p><em>&#8211; ca se voit tant que ça que je préfère la méthode à l&#8217;ancienne ? &#8211;</em></p>
<p>Ce n&#8217;est pas encore tout à fait terminé ! (si si je vous jure, c&#8217;est long)<br />
Il reste à faire les fameux liens entre les contrôles de la vue et les propriétés que nous avons créé dans LaFabrickViewController. Pour cela, rien ne vaut l&#8217;image (et en plein écran tant qu&#8217;à faire) :</p>
<div id="videodemo">
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_0" width="800" height="600" align="center">
      <param name="movie" value="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/Tuto-iPhone.swf" />
      <param name="align" value="center" />
      <param name="allowfullscreen" value="true" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/Tuto-iPhone.swf" width="800" height="600" align="center" allowfullscreen="true">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
 </div>
<p>Voilà ! Vous avez lié les contrôles de votre vue à des propriétés de votre contrôleur.<br />
Nous utiliserons désormais la technique décrite ci-dessus pour gérer nos association vue-contrôleur.</p>
<p>Reprenons Interface Builder pour créer un handler gérant le clic sur le bouton. Pour cela :</p>
<ol>
<li>Sélectionnez <strong>LaFabrickViewController</strong> depuis la <em>Document Window</em></li>
<li>Dans le dernier onglet de <em>l&#8217;Inspector</em>, cliquez sur le bouton + de la section <em>Class Actions</em> en entrez <code>buttonClick:</code>. Laissez le <em>Type</em> sur <strong>id</strong></li>
<li>Sauvegardez, faites <em>Write class files&#8230;</em>, fusionnez les sources et enregistrez</li>
<li>Faites un lien entre l&#8217;événement <em>Touch up Inside</em> de votre bouton et <strong>LaFabrickViewController</strong>, l&#8217;éditeur vous propose alors votre fonction <code>buttonClick:</code></li>
</ol>
<p>Maintenant que votre événement est lié à votre contrôleur, ajoutons un bout de code bateau juste pour valider que l&#8217;ensemble fonctionne bien :</p>
<ol>
<li>Retournez sous XCode, et ouvrez LaFabrickViewController.m</li>
<li>Modifiez le code pour avoir la méthode <strong>buttonClick:</strong> sous la forme suivante :<br />
<code>- (IBAction)buttonClick:(id)sender {<br />
[firstNameField setText:[lastNameField text]];<br />
}</code> </p>
<p>Le principe étant simplement de modifier le texte du prénom avec le texte du nom (je vous avais prévenu, c&#8217;est un bout de code bateau)</li>
<li>Faites <strong>Build and Go</strong> et testez !</li>
</ol>
<p>Bien, il ne reste plus qu&#8217;à apprendre Objective-C. Pour cela, rien ne vaut quelques ressources dédiée au sujet :</p>
<ul>
<li><a href="http://pierre-chatelier.developpez.com/tutoriels/mac/objectivec/migration/">Passage de C++ à Objective-C</a></li>
<li><a href="http://sylvain-gamel.developpez.com/tutoriel/mac/cocoa/java/">Passage de Java à Objective-C</a></li>
</ul>
<p>Voilà, vous avez à présent les bases nécessaires pour démarrer le développement d&#8217;une application iPhone.<br />
A bientôt !Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/11/15/266-debuguer-un-projet-flex-distant-via-flex-builder/" rel="bookmark" title="15 novembre 2007">L&#8217;erreur est humaine&#8230; debuguer un projet Flex distant via Flex Builder</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/09/04/206-flex-3-beta-rsolution-de-bug-comment-placer-fichier-d-application/" rel="bookmark" title="4 septembre 2007">[Flex 3 Beta] bug : Application File doesn&#8217;t exist</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/12/753-developper-une-application-iphone-introduction-aux-concepts-de-base/" rel="bookmark" title="12 janvier 2009">Développer une application iPhone &#8211; Introduction aux concepts de base</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/" rel="bookmark" title="13 janvier 2009">Reflex #1: une micro-architecture pour Flex&#8230; simple !</a></li>
</ul>
<p><!-- Similar Posts took 15.764 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/01/16/807-developper-une-application-iphone-xcode-et-interface-builder-passes-au-crible/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Développer une application iPhone &#8211; Introduction aux concepts de base</title>
		<link>http://www.lafabrick.com/blog/2009/01/12/753-developper-une-application-iphone-introduction-aux-concepts-de-base/</link>
		<comments>http://www.lafabrick.com/blog/2009/01/12/753-developper-une-application-iphone-introduction-aux-concepts-de-base/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 23:33:28 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[Conseils]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=753</guid>
		<description><![CDATA[<p>Il est des petits appareils qui font envie de nos jours : l'iPhone fait certainement partie des premiers de cette liste.</p>
<p>Voilà donc un tutoriel d'approche d'une technologie nouvelle pour des personnes n'ayant aucune notion de développement dans ce domaine.</p>]]></description>
			<content:encoded><![CDATA[<h3>Introduction</h3>
<p>Il est des petits appareils qui font envie de nos jours : l&#8217;iPhone fait certainement partie des premiers de cette liste.</p>
<p>Voilà donc un tutoriel d&#8217;approche d&#8217;une technologie nouvelle pour des personnes n&#8217;ayant aucune notion de développement dans ce domaine.</p>
<p>Je parlerai donc ici :</p>
<ul>
<li>Des principaux concepts à maîtriser <strong>absolument</strong> pour bien démarrer un développement pour iPhone</li>
<li>De quelques exemples permettant d&#8217;illustrer les concepts</li>
</ul>
<p>Je ne parlerai pas :</p>
<ul>
<li>Des différences entre un développement pour Mac par rapport à un développement pour iPhone</li>
<li>De quelconques &laquo;&nbsp;best practices&nbsp;&raquo; de développement</li>
</ul>
<p>Il s&#8217;agit plutôt d&#8217;un retour d&#8217;expérience qui permettra peut-être à d&#8217;autres personnes d&#8217;appréhender un développement pour iPhone sans trop se casser les dents.</p>
<p>Pour la suite, la documentation fournie par Apple est très complète et peut vous donner de quoi satisfaire vos nuits blanches pour un bon moment !</p>
<p><span id="more-753"></span></p>
<h4>Pour bien démarrer</h4>
<ol>
<li>Comprendre l&#8217;environnement nécessaire au développement d&#8217;une application iPhone
<ol>
<li>Les principaux concepts</li>
<li>Les outils</li>
</ol>
</li>
<li>Ouvrir quelques projets d&#8217;exemple pour se familiariser avec la syntaxe Objective-C</li>
<li>Créer son premier projet</li>
</ol>
<p>Ce premier article présente les concepts et introduit la liste des outils nécessaires au développement.</p>
<h4>Note aux pressés (j&#8217;en fais généralement partie)</h4>
<p>Si vous grillez les deux premières étapes, vous risquez rapidement de vous rendre compte qu&#8217;elles vous manquent et perdrez certainement beaucoup plus de temps que si vous y consacrez une petite journée.</p>
<h3>Comprendre l&#8217;environnement nécessaire au développement d&#8217;une application iPhone</h3>
<h4>Les principaux concepts</h4>
<p>Pour commencer, il est indispensable de maîtriser quelques bases de fonctionnement d&#8217;un programme iPhone.</p>
<p><strong>Une application iPhone est une application MVC</strong> dans sa plus pure forme. Vous concevez des <strong>vues</strong>, manipulées par des <strong>contrôleurs</strong> en faisant transiter des données d&#8217;un <strong>modèle</strong>.</p>
<h5>Application delegate</h5>
<p>Il s&#8217;agit de la classe en charge du lancement de l&#8217;application et de l&#8217;affichage de la fenêtre principale.<br />
Vous pouvez vous en servir pour initialiser des éléments particuliers communs à l&#8217;ensemble des éléments de votre application :</p>
<ul>
<li>connexion à une base de données,</li>
<li>configuration générale,</li>
<li>&#8230;</li>
</ul>
<h5>View controller</h5>
<p>Classe gérant la vue et pouvant recevoir les événements propres aux composants de la vue gérée.</p>
<h5>View</h5>
<p>Une vue, chargée d&#8217;afficher des contrôles. </p>
<p>Il faut savoir qu&#8217;une vue peut être créée par programme ou en utilisant des fichiers de ressources définis à l&#8217;aide de l&#8217;interface builder.</p>
<p>Ce sont deux moyens différents qui présentent leurs avantages et inconvénients&#8230; A vous de voir lequel convient le mieux à telle ou telle situation.</p>
<h5>Delegate</h5>
<p>C&#8217;est un terme souvent employé dans un programme.</p>
<p>Un délégué est un objet prenant en charge un certain nombre de méthodes remplissant des fonctions propres à un émetteur.</p>
<p>En pratique, un view controller est, dans la plupart des cas, désigné comme délégué des composants de la vue et va implémenter les méthodes répondant aux événements que chacun d&#8217;entre eux déclenche.</p>
<p>Par exemple, un composant table view (tableau) va appeler différentes méthodes de son délégué pour pouvoir s&#8217;afficher convenablement :</p>
<p><code>- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView</code><br/>Doit renvoyer le nombre de sections dans le tableau</p>
<p><code>- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section</code><br/>Doit renvoyer le nombre de lignes du tableau à afficher pour la section dont le numéro est passé en paramètre</p>
<p><code>- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath</code><br/>Doit initialiser une cellule du tableau pour le numéro de section et de ligne passé en paramètre</p>
<p>Ce mode de fonctionnement permet notamment que n&#8217;importe que objet soit désigné comme délégué. On peut donc très bien imaginer avoir les deux possibilités suivantes :</p>
<p><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/01/iphone-delegates.png" alt="iPhone - Concept de delegate" title="iPhone - Concept de delegate" width="500" height="444" class="alignnone size-full wp-image-779" /></p>
<ul>
<li><strong>Le schéma A</strong> montre l&#8217;exemple le plus courant : une seule classe faisant office de ViewController et de Delegate pour l&#8217;ensemble des contrôles de la vue.</li>
<li><strong>Le schéma B</strong> montre une alternative intéressante lors de gestion de vues complexes : une classe Delegate par contrôle et un ViewController standard.</li>
</ul>
<p>La différence entre ces deux solutions, c&#8217;est que le premier ViewController contiendra l&#8217;ensemble du code de BoutonDelegate, Tableau1Delegate et Tableau2Delegate, le rendant peut-être plus complexe à lire et à comprendre.</p>
<p>Ceci étant dit passons aux outils.</p>
<h3>Les outils</h3>
<p>Vous avez trois outils à votre disposition :</p>
<ol>
<li><strong>XCode</strong> : l&#8217;environnement de développement en charge de coder, compiler et lancer la deuxième application</li>
<li><strong>Le simulateur iPhone</strong> : une application simulant à quelques restrictions près un iPhone et vous permettant de tester unitairement vos fonctionnalités</li>
<li><strong>Interface Builder</strong> : l&#8217;outil de création d&#8217;interfaces (écrans, vues&#8230;)</li>
</ol>
<p>XCode est un peu l&#8217;application maître et lance ses 2 gentils larbins pour faciliter le développement.</p>
<p>Dans le prochain article, passage aux choses sérieuses : nous ouvrirons XCode pour voir comment cette théorie se traduit en pratique, histoire d&#8217;illustrer un peu ces jolis concepts.</p>
<p>A la prochaine !<br />
Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/11/16/19-petit-cour-sur-lapi-de-dessin/" rel="bookmark" title="16 novembre 2006">Petit cours sur l’API de dessin</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/01/10/288-cairngorm-pour-les-fainants-tour-d-horizons-des-code-generator/" rel="bookmark" title="10 janvier 2008">Cairngorm pour les fainéants&#8230; Tour d&#8217;horizons des code generator</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/16/807-developper-une-application-iphone-xcode-et-interface-builder-passes-au-crible/" rel="bookmark" title="16 janvier 2009">Développer une application iPhone &#8211; XCode et Interface Builder passés au crible</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/31/1040-hello-cocomo-first-app/" rel="bookmark" title="31 janvier 2009">Hello AFCS ( bye Cocomo ) : première application multi-utilisateurs</a></li>
</ul>
<p><!-- Similar Posts took 13.725 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/01/12/753-developper-une-application-iphone-introduction-aux-concepts-de-base/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Pti truc du jour : Les CollectionEvent</title>
		<link>http://www.lafabrick.com/blog/2008/02/06/301-tips-of-the-day-les-collectionevent/</link>
		<comments>http://www.lafabrick.com/blog/2008/02/06/301-tips-of-the-day-les-collectionevent/#comments</comments>
		<pubDate>Wed, 06 Feb 2008 16:29:17 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://92.243.2.196/lafabrick/blog/?p=301</guid>
		<description><![CDATA[Bon je suis peut être le dernier, mais en farfouillant la doc de Flex, j’ai découvert une petite classe qui simplifie la vie : les CollectionEvent. Ce type d’évenement, géré par toutes les classes implémentant ICollectionView, est généré lors d’un changement de la collection . Il en devient du coup un complément très intéressant au Databinding. [...]]]></description>
			<content:encoded><![CDATA[<p>Bon je suis peut être le dernier, mais en farfouillant la doc de Flex, j’ai découvert une petite classe qui simplifie la vie : les CollectionEvent.</p>
<p>Ce type d’évenement, géré par toutes les classes implémentant ICollectionView, est généré lors d’un changement de la collection . Il en devient du coup un complément très intéressant au Databinding.</p>
<p>Imaginons par exemple une application de gestion de notes :</p>
<p><img src="http://lafabrick.free.fr/blogImg/collEvent_1-20080206-174538.jpg" alt="" /></p>
<p><a hreflang="fr" href="http://lafabrick.free.fr/labo/collection_e/">Exemple</a> / <a href="http://lafabrick.free.fr/labo/collection_e/srcview/">Source</a></p>
<p>L’affichage des notes dans le Datagrid est assuré grâce à un databinding avec une arrayCollection.</p>
<pre>
<pre class="brush: xml">
&lt;mx:DataGrid id=&quot;notesDGrid&quot; dataProvider=&quot;{notesCollection}&quot; /&gt;
</pre>
<p><span style="font-family: 'Lucida Grande'; line-height: 19px; white-space: normal;">Lorsqu’on ajoute un élément, la collection change, l’affichage est automatiquement mis à jour.</span></pre>
<p>Par contre, pour la note moyenne, calculée à l’ouverture à partir des élements présents, le binding ne permettra pas la mise à jour automatique.</p>
<p>C’est là qu’interviennent les CollectionEvent : en ajoutant un écouteur sur la collection, on peut réagir à ses modifications :</p>
<pre>
<pre class="brush: js">
notesCollection.addEventListener(
     CollectionEvent.COLLECTION_CHANGE ,
     updateMoyenne
);
</pre>
<p><span style="font-family: 'Lucida Grande'; line-height: 19px; white-space: normal;">Dans notre exemple, l’application va recalculer la moyenne lors de chaque ajout.</span></pre>
<p>Plus fort encore, les CollectionEvent possédent une propriété &#8216;kind&#8217;, qui permet de savoir quel type d’opération a été effectué ( Ajout, deplacement, supression ) et une &#8216;items&#8217; de récupérer des informations sur la dîte opération ( item ajouté, nouvelle position .. ) .</p>
<p>L’exemple est très simpliste, mais dans le cas d’un dév avec Cairngorm par exemple, je vous laisse imaginer l’intérêt de cette fonctionnalité utilisée sur les collections d’un modelLocator</p>
<p>Toutes les infos sur <a hreflang="en" href="http://livedocs.adobe.com/flex/201/langref/mx/events/CollectionEvent.html">LiveDocs</a>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2008/12/13/506-utiliser-le-dragmanager-de-flex-1ere-partie/" rel="bookmark" title="13 décembre 2008">Utiliser le DragManager de Flex ( 1ère partie )</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/12/14/1492-object-to-xml-to-object-conversion-xsd/" rel="bookmark" title="14 décembre 2009">Object to XML to Object : conversion XSD</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/16/807-developper-une-application-iphone-xcode-et-interface-builder-passes-au-crible/" rel="bookmark" title="16 janvier 2009">Développer une application iPhone &#8211; XCode et Interface Builder passés au crible</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/31/1040-hello-cocomo-first-app/" rel="bookmark" title="31 janvier 2009">Hello AFCS ( bye Cocomo ) : première application multi-utilisateurs</a></li>
</ul>
<p><!-- Similar Posts took 12.266 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2008/02/06/301-tips-of-the-day-les-collectionevent/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flex et les warnings inutiles&#8230;</title>
		<link>http://www.lafabrick.com/blog/2008/01/15/291-flex-masquer-les-warnings-inutiles/</link>
		<comments>http://www.lafabrick.com/blog/2008/01/15/291-flex-masquer-les-warnings-inutiles/#comments</comments>
		<pubDate>Tue, 15 Jan 2008 11:16:43 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[flex builder]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://92.243.2.196/lafabrick/blog/?p=291</guid>
		<description><![CDATA[<p>Me trouverez-vous intolérant, mais je déteste que des warnings envahissent mon Flex. Voici les méthodes pour masquer deux types de warnings "inutiles'&#160;:</p>]]></description>
			<content:encoded><![CDATA[<p>Me trouverez-vous intolérant, mais je déteste que des warnings envahissent mon Flex. Voici les méthodes pour masquer deux types de warnings &laquo;&nbsp;inutiles&#8217; :</p>
<p><span id="more-291"></span></p>
<p>1. <strong>les warnings liés à des feuilles de styles</strong> définissant des propriétés de styles pour des composants inexistants dans l&#8217;application au moment de la compilation</p>
<p><img src="http://lafabrick.free.fr/blogImg/flexf_ckingwarning-20080115-111620.jpg" alt="" /></p>
<p>» <strong>la solution</strong></p>
<p>Ajouter cette ligne au compilateur :</p>
<pre> -show-unused-type-selector-warnings=false</pre>
<p>Voilà une bonne occasion de (re)jeter un petit coup d&#8217;oeil aux <a hreflang="en" href="http://livedocs.adobe.com/flex/201/html/compilers_123_24.html">différentes options de compilation</a>.</p>
<p>via <a href="http://life.neophi.com/danielr/2006/08/css_and_runtime_modules_1.html">Daniel R.</a></p>
<p>2. <strong>les warnings de validation HTML</strong> lorsque l&#8217;on installe PDT ( PHP Development Tools )</p>
<p><img src="http://lafabrick.free.fr/blogImg/flexWarn2-20080115-113207.jpg" alt="" /></p>
<p>» <strong>la solution rapide ( mais pas valide ) </strong></p>
<ul>
<li>Ouvrir les préférences de Flex Builder ( ou d&#8217;eclipse )</li>
</ul>
<ul>
<li>Dans le panneau &#8216;Validation&#8217; , décocher les lignes correspondants au HTML</li>
</ul>
<p><img src="http://lafabrick.free.fr/blogImg/PreferencesFlexValidation-20080115-111250.jpg" alt="" /></p>
<ul>
<li>lancez un <strong><em>clean</em></strong> de votre projet</li>
</ul>
<p> </p>
<p>Eh ben voilà c&#8217;est plus propre, je me sens mieux <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>PS : y a aussi une solution encore plus propre pour les warning HTML&#8230; c&#8217;est de créer un template valide grâce à SwfObject. J&#8217;y reviendrais&#8230;<br />
<strong>UPDATE</strong> : Toutes les infos nécessaires sur le wiki Mediabox <a hreflang="fr" href="http://wiki.mediabox.fr/tutoriaux/flex/template_swfobject">Adaptez le template HTML de flex builder à l&#8217;utilisation de SWFObject</a>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/07/25/194-installer-son-environnement-de-dveloppement-tomcat-eclipse-wtp-flex-builder-maven-2/" rel="bookmark" title="25 juillet 2007">Installer son environnement de développement : Tomcat &#8211; Eclipse &#8211; WTP &#8211; Flex Builder</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/11/15/266-debuguer-un-projet-flex-distant-via-flex-builder/" rel="bookmark" title="15 novembre 2007">L&#8217;erreur est humaine&#8230; debuguer un projet Flex distant via Flex Builder</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/27/309-flex-builder-3-et-le-php/" rel="bookmark" title="27 février 2008">Flex Builder 3 et le PHP ( PDT ) : installation</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/04/14/1100-vous-reprendrez-bien-un-set-de-travail/" rel="bookmark" title="14 avril 2009">Vous reprendrez bien un set de travail !?</a></li>
</ul>
<p><!-- Similar Posts took 13.725 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2008/01/15/291-flex-masquer-les-warnings-inutiles/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Cairngorm pour les fainéants&#8230; Tour d&#8217;horizons des code generator</title>
		<link>http://www.lafabrick.com/blog/2008/01/10/288-cairngorm-pour-les-fainants-tour-d-horizons-des-code-generator/</link>
		<comments>http://www.lafabrick.com/blog/2008/01/10/288-cairngorm-pour-les-fainants-tour-d-horizons-des-code-generator/#comments</comments>
		<pubDate>Thu, 10 Jan 2008 10:18:42 +0000</pubDate>
		<dc:creator>Lionel</dc:creator>
				<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[cairngorm]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://92.243.2.196/lafabrick/blog/?p=288</guid>
		<description><![CDATA[<p>parce que Cairngorm c'est bien, mais c'est un peu long des fois...</p> <p>En fait, quand on utilise cairngorm dans un projet avec plusieurs commandes, et quelques écrans, ça devient vite le Bowdel, pour une commande, 2 voir 3 de fichiers à écrire, souvent les mêmes mais qui changent un peu, à 3 mots prêts... Donc au final, on gagne du temps parce qu'on utilise cairngorm et qu'on ré-invente pas la roue mais on en perds parce que c'est pas super pratique à utiliser... Je dirai que c'est le même combat pour des projets de Remoting, avec coté serveur, le développement des méthodes Création / Ajout / Suppression / Modification (CRUD) pour les objets (VO,DTO au choix) que l'on utilise dans notre appli...</p> <p>C'est la que les outils de générations automatiques du codes interviennent, plus ou moins bien fichus, plus ou moins bien intrégrés.</p>]]></description>
			<content:encoded><![CDATA[<p>parce que Cairngorm c&#8217;est bien, mais c&#8217;est un peu long des fois&#8230;</p>
<p>En fait, quand on utilise cairngorm dans un projet avec plusieurs commandes, et quelques écrans, ça devient vite le Bowdel, pour une commande, 2 voir 3 de fichiers à écrire, souvent les mêmes mais qui changent un peu, à 3 mots prêts&#8230; Donc au final, on gagne du temps parce qu&#8217;on utilise cairngorm et qu&#8217;on ré-invente pas la roue mais on en perds parce que c&#8217;est pas super pratique à utiliser&#8230; Je dirai que c&#8217;est le même combat pour des projets de Remoting, avec coté serveur, le développement des méthodes Création / Ajout / Suppression / Modification (CRUD) pour les objets (VO,DTO au choix) que l&#8217;on utilise dans notre appli&#8230;</p>
<p>C&#8217;est la que les outils de générations automatiques du codes interviennent, plus ou moins bien fichus, plus ou moins bien intrégrés.</p>
<p><span id="more-288"></span></p>
<p><strong>Pour Cairngorm</strong></p>
<p><a hreflang="en" href="http://www.ericfeminella.com/blog/2007/01/04/introducing-cairngen/">cairngen</a></p>
<p>Sous la forme d&#8217;une tache ANT, on peut, à partir d&#8217;un fichier properties, créer l&#8217;arborescence type de cairngorm, créer le ModelLocator, le Controller, le service Locator, des VO, et les sequences Event / commandes / Delegate, la totale quoi. Comme c&#8217;est une tache Ant, c&#8217;est parfaitement intégré à FlexBuilder / Eclipse. Ca prend 5min à configurer et ça fait gagner pas mal de temps. Pour ceux qui voudraient en apprendre un peu plus sur Ant, je vous invite à explorer les sources,  ça fournis un bon exemple pratique.</p>
<p><a hreflang="en" href="http://www.tylerbeck.com/CairngormCreator/">CairngormCreator</a></p>
<p>C&#8217;est un outil de génération en ligne, qui fournit une interface graphique. Il permet d&#8217;aller assez loin en terme de personnalisation, on peut en plus de toute la base (Arborescence Cairngorm, ModelLocator, Controller, &#8230;.)  créer des vues, et même les squelettes de classes qui seront dans un package Utility. Il fournit aussi un fichier de build pour compiler l&#8217;appli&#8230; il est même possible de visualiser les sources générées. Quand on a fini, on peut  télécharger une archive qui contient tous nos fichiers.</p>
<p><a hreflang="en" href="http://www.dehats.com/drupal/?q=node/7">FCG &#8211; Flex Cairngorm code generator</a> (par Dehats)</p>
<p>FCG est une appli Air. La différence avec les précédents outils, c&#8217;est qu&#8217;il est &laquo;&nbsp;intelligent&nbsp;&raquo;. Il peut lire les sources / java / php  de nos objets coté serveurs et il crée aussi les fichiers AS / Mxml qui vont bien, en plus des classes de bases de cairngorm. On a un outil bien complet et assez bien fait que j&#8217;ai malheureusement pas eu le temps de le tester, par contre, sur le site, on peut voir une démo en vidéo&#8230; ça donne envie,  ca à l&#8217;air d&#8217;être un bon outils pour préparer son projet Cairngorm. (A quand un outils, qui par de l&#8217;UML &#8230; )</p>
<p>Pour info, il existe aussi un générateur en ruby sur googleCode&#8230; mais je fais pas ruby !</p>
<p><strong>Coté serveur</strong></p>
<p><a hreflang="en" href="http://titaniclinux.net/daogen">DAOGen</a></p>
<p>La, rien a voir avec cairngorm, puisqu&#8217;on a que la partie objets serveur (+ connections à une BDD). Ici le point de départ, c&#8217;est la base de données. On crée des tables un peu comme avec phpMyAdmin.  On choisi son langage coté serveur (pour l&#8217;instant JAVA / PHP ) et au final, en plus des fichiers DAO dans le langage choisi, on a les fichiers SQL pour créer les tables&#8230; la classe !</p>
<p>Après, on a aussi des truc genre La Grosse Berta, qui font le flex, le partie serveur&#8230; pas encore le café&#8230; mais bon on leur fait confiance ça devrait pas tarder&#8230;</p>
<p><a hreflang="en" href="http://www.crazedcoders.com/php/codegen.php">Simple CRUD code generator</a></p>
<p>Génération en ligne, le générateur se connecte à votre base et génère les classes php (5) des VO, les classes qui gèrent les transactions&#8230; le tout pour après faire du remoting avec amfphp1.9.</p>
<p><strong>Et quelques mots pour conclure&#8230;</strong></p>
<p>Le premier point, c&#8217;est que c&#8217;est des outils, pas autres choses, ils codent pas à notre place. Leur but est juste de supprimer des parties redondantes ou commune à la mise en place de projet Cairngorm, utilisant du Remoting ou pas&#8230;</p>
<p>De mon point de vue, le plus important dans ces outils, c&#8217;est leur rapidité d&#8217;utilisation, faut pas qu&#8217;on passe 3 heures à tout configurer aux petits oignons pour avoir une génération parfaite. Je pense qu&#8217;on gagne plus de temps à avoir une génération &laquo;&nbsp;presque parfaite&nbsp;&raquo; mais qui nécessite beaucoup moins de temps de préparation, et pour ca j&#8217;aime bien cairngen, car après l&#8217;avoir personnalisé, on modifie 10 lignes dans un fichier properties et c&#8217;est parti&#8230; par contre il fait que la partie flex. J&#8217;aime bien aussi l&#8217;approche de parti de la base de donnée pour généré ce qu&#8217;il faut coté serveur.</p>
<p>En tout cas après ça, si vous utilisez pas cairngorm&#8230; c&#8217;est que que vous avez une bonne raison !Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/11/15/266-debuguer-un-projet-flex-distant-via-flex-builder/" rel="bookmark" title="15 novembre 2007">L&#8217;erreur est humaine&#8230; debuguer un projet Flex distant via Flex Builder</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/10/03/256-titre/" rel="bookmark" title="3 octobre 2007">Utiliser Cairngorm dans un projet Flex / AMFPHP</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/06/301-tips-of-the-day-les-collectionevent/" rel="bookmark" title="6 février 2008">Pti truc du jour : Les CollectionEvent</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/01/15/291-flex-masquer-les-warnings-inutiles/" rel="bookmark" title="15 janvier 2008">Flex et les warnings inutiles&#8230;</a></li>
</ul>
<p><!-- Similar Posts took 14.134 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2008/01/10/288-cairngorm-pour-les-fainants-tour-d-horizons-des-code-generator/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Le xml de flex, en vrac&#8230;</title>
		<link>http://www.lafabrick.com/blog/2008/01/08/287-le-xml-de-flex-en-vrac/</link>
		<comments>http://www.lafabrick.com/blog/2008/01/08/287-le-xml-de-flex-en-vrac/#comments</comments>
		<pubDate>Tue, 08 Jan 2008 14:00:18 +0000</pubDate>
		<dc:creator>Lionel</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://92.243.2.196/lafabrick/blog/?p=287</guid>
		<description><![CDATA[<p>Dans la série, un petit pas pour l'homme... un petit pas pour l'homme.</p> <p><img src="/blog/images/images.jpeg" alt="foot on moon" /></p>]]></description>
			<content:encoded><![CDATA[<p>Dans la série, un petit pas pour l&#8217;homme&#8230; un petit pas pour l&#8217;homme. </p>
<p>((/blog/images/images.jpeg|foot on moon))<br />
<span id="more-287"></span></p>
<p><strong>insertChild</strong></p>
<p>on  a du xml : </p>
<pre class="brush: js">
var x : XML =
&lt;books&gt;
  &lt;book title=&quot;Harry potter et l&#039;ordre de phoenix&quot;&gt;
    &lt;chapitre nom=&quot;HPOPchapitre 1&quot; test=&quot;B&quot;/&gt;
    &lt;chapitre nom=&quot;HPOPchapitre 2&quot; test=&quot;B&quot;/&gt;
    &lt;chapitre nom=&quot;HPOPchapitre 3&quot; test=&quot;B&quot;/&gt;
  &lt;/book&gt;
  &lt;book title=&quot;Harry Potter et prince de sang mele&quot;&gt;
    &lt;chapitre nom=&quot;HPPSMchapitre 1&quot; test=&quot;a&quot;/&gt;
    &lt;chapitre nom=&quot;HPPSMchapitre 2&quot; test=&quot;yoy&quot;/&gt;
    &lt;chapitre nom=&quot;HPPSMchapitre 3&quot; test=&quot;B&quot;/&gt;
  &lt;/book&gt;
  &lt;book title=&quot;Harry potter et les reliques de la Mort&quot;&gt;
    &lt;chapitre nom=&quot;HPRMchapitre 1&quot; test=&quot;B&quot;/&gt;
    &lt;chapitre nom=&quot;HPRMchapitre 2&quot; test=&quot;B&quot;/&gt;
    &lt;chapitre nom=&quot;HPRMchapitre 3&quot; test=&quot;B&quot;/&gt;
  &lt;/book&gt;
&lt;/books&gt;
</pre>
<p>on voudrait ajouter un livre:</p>
<pre class="brush: js">
    var book : XML = &lt;book title=&quot;StarWars&quot; /&gt; ;
</pre>
<p>on lit la doc (http://livedocs.adobe.com/labs/flex3/html/help.html?content=13_Working_with_XML_07.html) et on trouve un truc du genre</p>
<pre class="brush: js">
    x = x.insertChildAfter(x.book[0], book);
</pre>
<p>Et x donne ca :  </p>
<pre class="brush: xml">
&lt;books&gt;
    &lt;book title=&quot;Harry Potter et l&#039;ordre du phoenix&quot;&gt;
    &lt;chapitre nom=&quot;HPOPchapitre 1&quot; test=&quot;B&quot;/&gt;
    &lt;chapitre nom=&quot;HPOPchapitre 2&quot; test=&quot;B&quot;/&gt;
    &lt;chapitre nom=&quot;HPOPchapitre 3&quot; test=&quot;B&quot;/&gt;
  &lt;/book&gt;
  &lt;book title=&quot;StarWars&quot;/&gt;
  &lt;book title=&quot;Harry Potter et prince de sang mele&quot;&gt;
    &lt;chapitre nom=&quot;HPPSMchapitre 1&quot; test=&quot;a&quot;/&gt;
    &lt;chapitre nom=&quot;HPPSMchapitre 2&quot; test=&quot;yoy&quot;/&gt;
    &lt;chapitre nom=&quot;HPPSMchapitre 3&quot; test=&quot;B&quot;/&gt;
  &lt;/book&gt;
  &lt;book title=&quot;Harry potter et les reliques de la Mort&quot;&gt;
    &lt;chapitre nom=&quot;HPRMchapitre 1&quot; test=&quot;B&quot;/&gt;
    &lt;chapitre nom=&quot;HPRMchapitre 2&quot; test=&quot;B&quot;/&gt;
    &lt;chapitre nom=&quot;HPRMchapitre 3&quot; test=&quot;B&quot;/&gt;
  &lt;/book&gt;
&lt;/books&gt;
</pre>
<p>Cool ca marche <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Et puis bon on se dit qu&#8217;on a bien compris, alors pourquoi pas rajouter un chapitre&#8230;<br />
on tente :</p>
<pre class="brush: js">
     var chapitre : XML = &lt;chapitre nom=&quot;HPRMchapitre2.5&quot; /&gt; ;
     x = x.insertChildAfter(x.book[0].chapitre[1], chapitre);
</pre>
<p>mais ça marche pas&#8230; pourtant on fait tout comme la documentation ???<br />
En fait, pour insérer un noeud xml il faut surtout appeler insertChildAfter sur le noeud parent du noeud qui sera inséré&#8230; </p>
<pre class="brush: js">
    var after : XML = x.book[1].chapitre[1];
    var after_parent = after.parent();
    after_parent = after_parent.insertChildAfter(after,chapitre);
</pre>
<p>et la ca marche&#8230; plutôt bien</p>
<pre class="brush: xml">
&lt;books&gt;
  &lt;book title=&quot;Harry potter et l&#039;ordre de phoenix&quot;&gt;
    &lt;chapitre nom=&quot;HPOPchapitre 1&quot; test=&quot;B&quot;/&gt;
    &lt;chapitre nom=&quot;HPOPchapitre 2&quot; test=&quot;B&quot;/&gt;
    &lt;chapitre nom=&quot;HPOPchapitre 3&quot; test=&quot;B&quot;/&gt;
  &lt;/book&gt;
  &lt;book title=&quot;Harry Potter et prince de sang mele&quot;&gt;
    &lt;chapitre nom=&quot;HPPSMchapitre 1&quot; test=&quot;a&quot;/&gt;
    &lt;chapitre nom=&quot;HPPSMchapitre 2&quot; test=&quot;yoy&quot;/&gt;
    &lt;chapitre nom=&quot;HP 2.5&quot;/&gt;
    &lt;chapitre nom=&quot;HPPSMchapitre 3&quot; test=&quot;B&quot;/&gt;
  &lt;/book&gt;
  &lt;book title=&quot;Harry potter et les reliques de la Mort&quot;&gt;
    &lt;chapitre nom=&quot;HPRMchapitre 1&quot; test=&quot;B&quot;/&gt;
    &lt;chapitre nom=&quot;HPRMchapitre 2&quot; test=&quot;B&quot;/&gt;
    &lt;chapitre nom=&quot;HPRMchapitre 3&quot; test=&quot;B&quot;/&gt;
  &lt;/book&gt;
&lt;/books&gt;
</pre>
<p><strong>Les requetes</strong></p>
<p>Sur des noeuds XML, on peut faire des requètes rapides à écrire,<br />
Par exemple : Tout les chapitres , à n&#8217;importe quelle profondeur</p>
<pre class="brush: js">
    var chap : XMLList =  x..chapitre;
</pre>
<p>On peut compliquer en voulant le chapitre dont le paramètres test vaut yoy&#8230; (<chapitre nom="HPPSMchapitre 2" test="yoy"/>)</p>
<pre class="brush: js">
    var chap : XMLList = x..chapitre.(@test==&quot;yoy&quot;);
</pre>
<p>Sauf que là, ça marche que si tout les noeuds chapitre ont cet attribut test, sinon ca génère un erreur&#8230;</p>
<p><strong>Passer du XMLList au XML</strong></p>
<p>Bon ca, c&#8217;est plus un pense bête, parce que ce matin, étant pas très réveillé, ca me paraissait super intéressant, beaucoup moins maintenant&#8230;<br />
Concernant les requètes, elles sont super pratiques, facile à écrire !<br />
On peux s&#8217;en servir pour retrouver un noeud précis dans le xml par exemple, pour utiliser ensuite insertChildAfter. Sauf que insertChildAfter, lui il prend du XML et pas du XMLList.<br />
La solution, pour récupérer du XML, quand on utilise ce genre de requète, c&#8217;est d&#8217;utiliser les opérateurs [] pour accèder à l&#8217;objet XML contenu dans la XMLList. </p>
<pre class="brush: js">
    var chap : XML = x..chapitre.(@test==&quot;yoy&quot;)[0];
</pre>
<p>Voilà j&#8217;avais prévenu, c&#8217;est pas la découverte du siècle <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/05/24/110-du-html-dans-mon-flex/" rel="bookmark" title="24 mai 2007">Du HTML dans mon Flex&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/01/15/291-flex-masquer-les-warnings-inutiles/" rel="bookmark" title="15 janvier 2008">Flex et les warnings inutiles&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/12/14/1492-object-to-xml-to-object-conversion-xsd/" rel="bookmark" title="14 décembre 2009">Object to XML to Object : conversion XSD</a></li>
<li><a href="http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/" rel="bookmark" title="11 janvier 2011">MdaME, ma résolution 2011 de génération de code AS3</a></li>
</ul>
<p><!-- Similar Posts took 19.616 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2008/01/08/287-le-xml-de-flex-en-vrac/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

