<?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>Sönke Rohde &#187; Cairngorm</title>
	<atom:link href="http://soenkerohde.com/category/cairngorm/feed/" rel="self" type="application/rss+xml" />
	<link>http://soenkerohde.com</link>
	<description>Flash Platform (Flash, Flex, AIR) thoughts and examples</description>
	<lastBuildDate>Fri, 18 Jun 2010 17:58:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Migrate from Cairngorm to Swiz</title>
		<link>http://soenkerohde.com/2009/05/migrate-from-cairngorm-to-swiz/</link>
		<comments>http://soenkerohde.com/2009/05/migrate-from-cairngorm-to-swiz/#comments</comments>
		<pubDate>Mon, 04 May 2009 15:15:13 +0000</pubDate>
		<dc:creator>Sönke</dc:creator>
				<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Swiz]]></category>
		<category><![CDATA[swiz cairngorm ria flex]]></category>

		<guid isPermaLink="false">http://soenkerohde.com/?p=366</guid>
		<description><![CDATA[<p>If you are a Flex developer you surely know and probably used the Cairngorm framework from Adobe. I have used it too for almost two years before I switched to Swiz. I don&#8217;t want to bitch against Cairngorm but for me and many others coding with Swiz offered a simplier way building a RIA because [...]]]></description>
			<content:encoded><![CDATA[<p>If you are a Flex developer you surely know and probably used the <a href="http://opensource.adobe.com/wiki/display/cairngorm/">Cairngorm framework</a> from Adobe. I have used it too for almost two years before I switched to <a href="http://code.google.com/p/swizframework/">Swiz</a>. I don&#8217;t want to bitch against Cairngorm but for me and many others coding with Swiz offered a simplier way building a RIA because of less repetitive tasks (boilerplate code) and more flexibility. In this post I would like to show how easy it is to migrate an existing Cairngorm application to Swiz. More ore less it is about removing code which is always a good thing. Less code means less bugs and less maintenance so &#8211; more time for features!</p>
<p>In Cairngorm you have a few central classes which are accessible as singletons. In Swiz you won&#8217;t have any singletons in your code at all if you don&#8217;t want to but instead you will use the Autowire annotation to let Swiz wire things together for you using dependency injection aka Inversion of Control. These kind of classes are mainly models, controllers, delegates and services.</p>
<p>You can mix Cairngorm and Swiz at the same time while migrating so you are not forced to refactor your application at once but in an iterative way.</p>
<p>Let&#8217;s get started: <a href="http://code.google.com/p/swizframework/downloads/list">Download</a> the latest Swiz library SWC and add it to your project libs. If you want to check out the latest sources from SVN to compile the SWC on your own be sure to add the compiler parameter -keep-as3-metadata+=Autowire,Mediate.</p>
<p>To initialize Swiz you need at least one BeanLoader which will be the place where you declare models, controllers, delegates and services. The terminology &#8220;Bean&#8221; will probably change in one of the next Swiz releases. Imagine the BeanLoader as the place where you set up non-view classes.</p>
<p>Create a new MXML class and call it e.g. MyLoader and let it extend BeanLoader. Then change the namespace to org.swizframework.util.* so it will look like this:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;BeanLoader</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;org.swizframework.util.*&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/BeanLoader<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>So let&#8217;s refactor your first peace of code. Let&#8217;s assume your ModelLocator contains a class ContactModel which holds a list of contacts. The ContactModel instance is bound to one of your views like:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span>
<span style="color: #000000; font-weight: bold;">var</span> modelLocator:MyModelLocator = MyModelLocator.<span style="color: #006600;">getIntance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">&lt;</span>mx:<span style="color: #0066CC;">List</span> dataProvider=<span style="color: #ff0000;">&quot;{modelLocator.contactModel.list}&quot;</span> <span style="color: #66cc66;">/&gt;</span></pre></div></div>

<p>Now remove the contactModel from your ModelLocator and add it to the BeanLoader so it will looks like this:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;BeanLoader</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;org.swizframework.util.*&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;model:ContactModel</span> <span style="color: #000066;">xmlns:model</span>=<span style="color: #ff0000;">&quot;com.domain.project.model.*&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/BeanLoader<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>and change the view to this:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span>Autowire<span style="color: #66cc66;">&#93;</span>
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> contactModel:ContactModel;
&nbsp;
<span style="color: #66cc66;">&lt;</span>mx:<span style="color: #0066CC;">List</span> dataProvider=<span style="color: #ff0000;">&quot;{contactModel.list}&quot;</span> <span style="color: #66cc66;">/&gt;</span></pre></div></div>

<p>With the Autowire annotation we tell Swiz that we need the the ContactModel. It has to be defined public because otherwise Swiz is not able to inject the instance defined in MyLoader.<br />
Now we have to tell Swiz to use the MyLoader where we have just set up our ContactModel. Switch to your main application MXML and add an event listener for preinitialize and define the event handler like this:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mx:Application</span> <span style="color: #000066;">xmlns:mx</span>=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">preinitialize</span>=<span style="color: #ff0000;">&quot;preInitHandler()&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mx:Script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #339933;">&lt;![CDATA[</span>
<span style="color: #339933;">			import org.swizframework.Swiz;</span>
<span style="color: #339933;">			import com.domain.project.MyBeans;</span>
<span style="color: #339933;">			private function preInitHandler():void</span>
<span style="color: #339933;">			{</span>
<span style="color: #339933;">				Swiz.loadBeans([MyBeans]);</span>
<span style="color: #339933;">			}</span>
<span style="color: #339933;">		]]&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/mx:Script<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>You see that loadBeans expects an array so you can define multiple BeanLoaders if you like.<br />
In this case we have used autowire-by-type. This means Swiz will find the ContactModel because only one instance is defined in the BeanLoader. If you have classes of the same type in the BeanLoader you can also autowire by id. Only give the instance an id like e.g. id=&#8221;contactModel&#8221; and autowire it with [Autowire(bean="contactModel")]</p>
<p>With this refactoring we might have broken a Cairngorm command because now the flow looks like this</p>
<ul>
<li>Command was invoked from a Cairngorm event mapped to in the FrontController</li>
<li>Command instantiated a Business Delegate and added itself as a Responder implementing the Responder interface</li>
<li>Business Delegate gets service from ServiceLocator and calls it</li>
<li>Service returns result/fault and the Command in this case Responder gets notified</li>
</ul>
<p>With Swiz you have no FrontController, no ServiceLocator and the delegates are also only created once because they live in a BeanLoader. The Command will be replaced by a controller so it is easier to have multiple actions in one controller so you don&#8217;t end up with a ContactReadCommand, ContactAddCommand, ContactUpdateCommand or a switch statement in the command itself to determine which event came in.</p>
<p>To refactor do the following:</p>
<ul>
<li>Move the contact service from ServiceLocator to MyLoader</li>
<li>Add the delegate to MyLoader</li>
<li>Create a new controller called ContactController extending AbstractController and add it to MyLoader</li>
</ul>
<p>Your BeanLoader now looks smilar like this:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;BeanLoader</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;org.swizframework.util.*&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xmlns:mx</span>=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xmlns:model</span>=<span style="color: #ff0000;">&quot;example.model.*&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xmlns:ctrl</span>=<span style="color: #ff0000;">&quot;example.ctrl.*&quot;</span></span>
<span style="color: #009900;">	<span style="color: #000066;">xmlns:business</span>=<span style="color: #ff0000;">&quot;example.business.*&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;model:ContactsModel</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ctrl:ContactController</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;business:ContactDelegate</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mx:HTTPService</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;contactService&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/BeanLoader<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>It is best practice to let delegates implement an interface so other classes only have to deal with a clean interface so the ContactDelegate interface looks like this:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">package example.<span style="color: #006600;">business</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">AsyncToken</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #0066CC;">interface</span> IContactDelegate
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">function</span> getContacts<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:AsyncToken;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>and the implementation like this:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">package example.<span style="color: #006600;">business</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">AsyncToken</span>;
	<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">http</span>.<span style="color: #006600;">HTTPService</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ContactDelegate <span style="color: #0066CC;">implements</span> IContactDelegate
	<span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #66cc66;">&#91;</span>Autowire<span style="color: #66cc66;">&#40;</span>bean=<span style="color: #ff0000;">&quot;contactService&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> service:HTTPService;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getContacts<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:AsyncToken
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> service.<span style="color: #0066CC;">send</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>You see that we simply autowire the service instead of having any call to a ServiceLocator.</p>
<p>Now the controller. The ContactController has two dependecies. We will need access to the delegate to call the service and to the model to store the result and both will be autowired:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">package example.<span style="color: #006600;">ctrl</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> example.<span style="color: #006600;">business</span>.<span style="color: #006600;">IContactDelegate</span>;
	<span style="color: #0066CC;">import</span> example.<span style="color: #006600;">model</span>.<span style="color: #006600;">ContactModel</span>;
&nbsp;
	<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">collections</span>.<span style="color: #006600;">ArrayCollection</span>;
	<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">AsyncToken</span>;
	<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">events</span>.<span style="color: #006600;">ResultEvent</span>;
&nbsp;
	<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">swizframework</span>.<span style="color: #006600;">controller</span>.<span style="color: #006600;">AbstractController</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ContactController <span style="color: #0066CC;">extends</span> AbstractController
	<span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #66cc66;">&#91;</span>Autowire<span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> model:ContactModel;
&nbsp;
		<span style="color: #66cc66;">&#91;</span>Autowire<span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> delegate:IContactDelegate;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ContactController<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#123;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#91;</span>Mediate<span style="color: #66cc66;">&#40;</span>event=<span style="color: #ff0000;">&quot;loadContacts&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> loadContacts<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">call</span>:AsyncToken = delegate.<span style="color: #006600;">getContacts</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			executeServiceCall<span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">call</span>, contactsResultHandler<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		protected <span style="color: #000000; font-weight: bold;">function</span> contactsResultHandler<span style="color: #66cc66;">&#40;</span>re:ResultEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">var</span> ac:ArrayCollection = re.<span style="color: #006600;">result</span> as ArrayCollection;
			model.<span style="color: #0066CC;">list</span> = ac;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>You see something new which is the Mediate annotation [Mediate(event="loadContacts")]<br />
Instead of a FrontController which maps events to commands Swiz uses a concept called dynamic mediators. In this case we are using a primitive event and there are more sophisticated ways to implement dynamic mediators and also pass parameters (event member variables) etc.</p>
<p>So let&#8217;s say you want to load the contacts when your application starts simply add this line of code to the main application creationComplete event handler:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">Swiz.<span style="color: #006600;">dispatch</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;loadContacts&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Swiz is aware of all mediate annotations and has created event listeners and with the line above our controller method loadContacts gets invoked. You could also use an event class which does not need a special base class like the CairngormEvent but only flash.events.Event. For more info and some shortcuts and runtime validation <a href="http://soenkerohde.com/2009/04/swiz-eventpackages-in-strict-mode/">read on here about eventPackages</a>.</p>
<p>So let&#8217;s some up how the different layers of your application work together:</p>
<ul>
<li>Declare models, controller, delegates and services in the BeanLoader and load them with Swiz.loadBeans</li>
<li>Views get the model autowired and can add data bindings.</li>
<li>Views dispatch events caused by user gestures with Swiz.dispatchEvent or Swiz.dispatch</li>
<li>Controller mediate events with [Mediate(event="...", properties="...")]</li>
<li>Controllers get models autowired which need to be changed by the controller.</li>
<li>If the controller calls a service autowire the delegate</li>
<li>Delegates autowire services and return the AsyncToken from the service call</li>
</ul>
<p>I hope at this post you have learned some concepts of Swiz compared to Cairngorm and see that migrating from Cairngorm to Swiz means more decoupling and removing repetitive code. I had a large project with more than one year development spend on and refactoring was done in a short timeframe and reduced about 30% lines of code.</p>
<p>If you have more questions please drop a comment and/or join the <a href="http://groups.google.com/group/swiz-framework">mailing list</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://soenkerohde.com/2009/05/migrate-from-cairngorm-to-swiz/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Open Source and Flex</title>
		<link>http://soenkerohde.com/2008/08/open-source-and-flex/</link>
		<comments>http://soenkerohde.com/2008/08/open-source-and-flex/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 15:05:01 +0000</pubDate>
		<dc:creator>Sönke</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://soenkerohde.com/?p=221</guid>
		<description><![CDATA[<p>There were a lot of news and posts about Flex and open-source so I thought it would be nice to summarize it.</p>
<p>Grant Skinner has posted a wonderful summary about common source code licenses.</p>
<p>Matt Chotin asked for feedback on suggested projects related to Flex. Personally I would love to see an ORM framework like suggested by [...]]]></description>
			<content:encoded><![CDATA[<p>There were a lot of news and posts about Flex and open-source so I thought it would be nice to summarize it.</p>
<p><a href="http://www.gskinner.com">Grant Skinner</a> has posted a <a href="http://www.gskinner.com/blog/archives/2008/07/source_code_lic_1.html">wonderful summary about common source code licenses</a>.</p>
<p><a href="http://weblogs.macromedia.com/mchotin/archives/2008/07/suggested_proje.html">Matt Chotin asked for feedback</a> on <a href="http://opensource.adobe.com/wiki/display/flexsdk/Suggested+Projects">suggested projects related to Flex</a>. Personally I would love to see an <a href="http://coenraets.org/blog/2007/10/annotating-actionscript-classes-with-custom-metadata-simple-orm-framework-for-air/">ORM framework like suggested by Christophe Coenraets</a> which works with <a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS">BlazeDS</a>.</p>
<p><a href="http://weblogs.macromedia.com/amcleod/archives/2008/08/cairngorm_moved.html">Alistair McLeod</a> and <a href="http://weblogs.macromedia.com/swebster/archives/2008/08/cairngorm_3_-_a.html">Steven Webster</a> blogged about the move of <a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm">Cairngorm</a> from the <a href="http://labs.adobe.com">Adobe Labs</a> wiki to <a href="http://opensource.adobe.com">Adobe Open Source</a>.</p>
<p>I just received the <a href="http://www.adobe.com/newsletters/edge/">Adobe Edge Newsletter</a> which covers an article about <a href="http://www.adobe.com/newsletters/edge/august2008/articles/article6/index.html">the art of open-source license</a> by <a href="http://blogs.adobe.com/open/">Dave McAllister</a>.</p>
<p>Here a list of some client side open source software I use the most to develop Flex/AIR:</p>
<ul>
<li><a href="http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK">Flex SDK</a></li>
<li><a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm">Cairngorm</a></li>
<li><a href="http://code.google.com/p/as3corelib/">as3corelib</a></li>
<li><a href="http://crypto.hurlant.com/">as3crypto</a></li>
<li><a href="http://code.google.com/p/as3flexunitlib/">FlexUnit</a><a href="http://www.opensource.org/licenses/bsd-license.php"></a></li>
<li><a href="http://code.google.com/p/flexlib/">FlexLib</a></li>
<li><a href="http://labs.adobe.com/wiki/index.php/Adobe_AIR_Update_Framework">AIR Update Framework</a></li>
<li><a href="http://codeazur.com.br/lab/airremoteupdater/">AIR Remote Updater</a></li>
</ul>
<p>Here a list of Flex frameworks (<a href="http://www.infoq.com/news/2008/01/flex-mvc">InfoQ Flex Framework article</a>):</p>
<ul>
<li><a href="http://labs.adobe.com/wiki/index.php/Cairngorm">Cairngorm</a></li>
<li><a href="http://www.infoq.com/news/2008/06/jumpship-31-released">PureMVC</a></li>
<li><a href="http://www.osflash.org/projects/jumpship">JumpShip</a> <a href="http://jumpshipframework.blogspot.com/">Blog</a> <a href="http://www.infoq.com/news/2008/06/jumpship-31-released">infoQ article</a></li>
<li><a href="http://osflash.org/projects/arp">ARP</a></li>
<li><a href="http://projects.simb.net/easyMVC/">EasyMVC</a></li>
<li><a href="http://www.model-glue.com/flex.cfm">Model-Glue Flex<br />
</a></li>
<li><a href="http://code.google.com/p/flest/">Flest Framework</a></li>
</ul>
<p>and <a href="http://en.wikipedia.org/wiki/Inversion_of_control">IoC</a> frameworks:</p>
<ul>
<li><a href="http://www.pranaframework.org/">Prana Framework</a></li>
<li><a href="http://mate.asfusion.com/">Mate</a> / <a href="http://flexblog.faratasystems.com/?p=342">Fatara Systems Diagram</a></li>
<li><a href="http://spicefactory.org/parsley/">Parsley</a></li>
<li><a href="http://www.guasax.com/guasax/web/en/index.php">Guasax Flex/AIR MVC</a></li>
<li><a href="http://code.google.com/p/swizframework/">swizframework</a></li>
</ul>
<p>and component libraries:</p>
<ul>
<li><a href="http://code.google.com/p/flexlib/">FlexLib</a></li>
<li><a href="http://developer.yahoo.com/flash/astra-flash/">ASTRA Flash Components</a></li>
<li><a href="http://blog.benstucki.net/?p=47">OpenFlux</a></li>
<li><a href="http://www.bytearray.org/?p=137">Liquid Components</a></li>
</ul>
<p>and animation/UI frameworks:</p>
<ul>
<li><a href="http://www.degrafa.com/">Degrafa</a></li>
<li><a href="http://flare.prefuse.org/">Flare</a></li>
<li><a href="http://code.google.com/p/foam-as3/">foam</a> (Physics)</li>
</ul>
<p>and 3D engines:</p>
<ul>
<li><a href="http://www.noirmatstudios.com/blog/index.php/2008/06/18/3d-engines-for-flash/">Blog post about different 3D engines</a></li>
<li><a href="http://blog.papervision3d.org/">Papervision 3D</a></li>
<li><a href="http://away3d.com/">Away 3D</a></li>
<li><a href="http://osflash.org/flauren">Flauren</a></li>
</ul>
<p>And much more if you check out <a href="http://osflash.org">OSFlash</a> or <a href="http://code.google.com/search/#q=%22flex%22%20or%20%22as3%22">search Google Code for &#8220;flex&#8221; or &#8220;as3&#8243;</a>.</p>
<p>And for the server-side there is not less. <a href="http://theflashblog.com/?p=416">Adobe recently proposed AMF support</a> for the <a href="http://framework.zend.com/">Zend framework</a> and of course <a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS">BlazeDS</a> which fits wonderfull into a <a href="http://sebastien-arbogast.com/2008/07/22/the-flex-spring-and-blazeds-full-stack-on-adobe-developer-connection/">stack</a> with <a href="http://www.springframework.org/">Spring</a> and <a href="http://www.hibernate.org/">Hibernate</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://soenkerohde.com/2008/08/open-source-and-flex/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AMFPHP on AIR Tutorial with MAMP</title>
		<link>http://soenkerohde.com/2008/06/amfphp-on-air-tutorial-with-mamp/</link>
		<comments>http://soenkerohde.com/2008/06/amfphp-on-air-tutorial-with-mamp/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 16:14:21 +0000</pubDate>
		<dc:creator>Sönke</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://soenkerohde.com/?p=197</guid>
		<description><![CDATA[<p>I had a look at my 3 year old AMFPHP tutorial and thought about what all changed. ActionScript 2 was replaced by AS3, I moved from Flash to Flex and changed my OS from Windows to OS X. I have developed desktop apps in the past with SWF Studio and now Adobe AIR is the [...]]]></description>
			<content:encoded><![CDATA[<p>I had a look at my 3 year old <a href="http://soenkerohde.com/tutorials/amfphp/">AMFPHP tutorial</a> and thought about what all changed. ActionScript 2 was replaced by AS3, I moved from Flash to Flex and changed my OS from Windows to OS X. I have developed desktop apps in the past with SWF Studio and now <a href="http://www.adobe.com/products/air/">Adobe AIR</a> is the solution for cross platform desktop applications. Summary:</p>
<ul>
<li>AS2 -&gt; AS3</li>
<li>Flash -&gt; Flex</li>
<li>Windows -&gt; OS X</li>
<li>SWF Studio -&gt; Adobe AIR</li>
</ul>
<p>Due to these huge changes I wanted to see how <a href="http://amfphp.org">AMFPHP</a> fits into this environment and write a new tutorial.</p>
<p>First the setup up the local server. Instead of WAMP (Windows, Apache, MySQL, PHP) I am now using MAMP (M for Mac) which is the pendent on OS X:</p>
<ul>
<li>Download and install <a href="http://sourceforge.net/projects/mamp">MAMP</a> an Mac+Apache+MySQL+PHP bundle</li>
<li>Start the MAMP server: /Applications/MAMP/MAMP.app (Your browser should come up with a MAMP page saying your installation was successfully)</li>
<li>Download the latest <a href="http://sourceforge.net/project/showfiles.php?group_id=72483#files">AMFPHP</a> and put it into /Applications/MAMP/htdocs/amfphp (I used 1.9 beta 20080120)</li>
<li>Download the <a href="http://soenkerohde.com/downloads/AMFPHPonAir/MyService.php.txt">MyService.php.txt</a>, rename it to MyService.php and place it into /Applications/MAMP/htdocs/amfphp/services</li>
</ul>
<p>As a client we could choose Flex in the browser but I wanted to demonstrate AIR:</p>
<ul>
<li>Open Flex Builder and create a new AIR project called AMFPHPonAIR</li>
<li>The AMFPHPonAIR.mxml opens where you put this code (<a href="/downloads/AMFPHPonAir/AMFPHPonAIR.mxml.txt">download</a>):</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&lt;</span>?<span style="color: #0066CC;">xml</span> <span style="color: #0066CC;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&lt;</span>mx:WindowedApplication xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #ff0000;">&quot;vertical&quot;</span>
	creationComplete=<span style="color: #ff0000;">&quot;init()&quot;</span><span style="color: #66cc66;">&gt;</span>
&nbsp;
	<span style="color: #66cc66;">&lt;</span>mx:Script<span style="color: #66cc66;">&gt;</span>
		<span style="color: #66cc66;">&lt;!</span><span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>
			<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">controls</span>.<span style="color: #006600;">Alert</span>;
			<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">messaging</span>.<span style="color: #006600;">channels</span>.<span style="color: #006600;">AMFChannel</span>;
			<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">messaging</span>.<span style="color: #006600;">ChannelSet</span>;
			<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">events</span>.<span style="color: #006600;">FaultEvent</span>;
			<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">rpc</span>.<span style="color: #006600;">events</span>.<span style="color: #006600;">ResultEvent</span>;
&nbsp;
			<span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span>
			<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> lastResult:<span style="color: #0066CC;">String</span>;
&nbsp;
			<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> init<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
			<span style="color: #66cc66;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">var</span> cs:ChannelSet = <span style="color: #000000; font-weight: bold;">new</span> ChannelSet<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #000000; font-weight: bold;">var</span> channel:AMFChannel = <span style="color: #000000; font-weight: bold;">new</span> AMFChannel<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;my-amf&quot;</span>, <span style="color: #ff0000;">&quot;http://localhost:8888/amfphp/gateway.php&quot;</span><span style="color: #66cc66;">&#41;</span>;
				cs.<span style="color: #006600;">addChannel</span><span style="color: #66cc66;">&#40;</span>channel<span style="color: #66cc66;">&#41;</span>;
				myService.<span style="color: #006600;">channelSet</span> = cs;
				myService.<span style="color: #006600;">hello</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;You&quot;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
&nbsp;
			<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onResult<span style="color: #66cc66;">&#40;</span>re:ResultEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
			<span style="color: #66cc66;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">var</span> s:<span style="color: #0066CC;">String</span> = re.<span style="color: #006600;">result</span> as <span style="color: #0066CC;">String</span>;
				Alert.<span style="color: #0066CC;">show</span><span style="color: #66cc66;">&#40;</span>s, <span style="color: #ff0000;">&quot;Remote Result&quot;</span><span style="color: #66cc66;">&#41;</span>;
				lastResult = s;
			<span style="color: #66cc66;">&#125;</span>
			<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onFault<span style="color: #66cc66;">&#40;</span>fe:FaultEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
			<span style="color: #66cc66;">&#123;</span>
				Alert.<span style="color: #0066CC;">show</span><span style="color: #66cc66;">&#40;</span>fe.<span style="color: #0066CC;">message</span>.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">&quot;Remote Error&quot;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;</span>
	<span style="color: #66cc66;">&lt;/</span>mx:Script<span style="color: #66cc66;">&gt;</span>
&nbsp;
	<span style="color: #66cc66;">&lt;</span>mx:TraceTarget fieldSeparator=<span style="color: #ff0000;">&quot;-&gt;&quot;</span> includeLevel=<span style="color: #ff0000;">&quot;true&quot;</span> includeCategory=<span style="color: #ff0000;">&quot;true&quot;</span> includeTime=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #66cc66;">/&gt;</span>
&nbsp;
	<span style="color: #66cc66;">&lt;</span>mx:RemoteObject id=<span style="color: #ff0000;">&quot;myService&quot;</span> result=<span style="color: #ff0000;">&quot;onResult(event)&quot;</span> fault=<span style="color: #ff0000;">&quot;onFault(event)&quot;</span>
        showBusyCursor=<span style="color: #ff0000;">&quot;true&quot;</span> destination=<span style="color: #ff0000;">&quot;AMFPHP&quot;</span> source=<span style="color: #ff0000;">&quot;MyService&quot;</span><span style="color: #66cc66;">&gt;</span>
        <span style="color: #66cc66;">&lt;</span>mx:method <span style="color: #0066CC;">name</span>=<span style="color: #ff0000;">&quot;hello&quot;</span> <span style="color: #66cc66;">/&gt;</span>
    <span style="color: #66cc66;">&lt;/</span>mx:RemoteObject<span style="color: #66cc66;">&gt;</span>
&nbsp;
    <span style="color: #66cc66;">&lt;</span>mx:HBox<span style="color: #66cc66;">&gt;</span>
		<span style="color: #66cc66;">&lt;</span>mx:TextInput id=<span style="color: #ff0000;">&quot;message&quot;</span> <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;Yourself&quot;</span> <span style="color: #66cc66;">/&gt;</span>
		<span style="color: #66cc66;">&lt;</span>mx:<span style="color: #0066CC;">Button</span> label=<span style="color: #ff0000;">&quot;say hello&quot;</span> click=<span style="color: #ff0000;">&quot;myService.hello(message.text)&quot;</span> <span style="color: #66cc66;">/&gt;</span>
	<span style="color: #66cc66;">&lt;/</span>mx:HBox<span style="color: #66cc66;">&gt;</span>
&nbsp;
	<span style="color: #66cc66;">&lt;</span>mx:Label <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;Last Result: {lastResult}&quot;</span> <span style="color: #66cc66;">/&gt;</span>
&nbsp;
<span style="color: #66cc66;">&lt;/</span>mx:WindowedApplication<span style="color: #66cc66;">&gt;</span></pre></div></div>

<p>The most important part is in the init function  where the remoting endpoint is set via ActionScript.<br />
Right-click the src/AMFPHPonAIR.mxml and choose Debug As-&gt; Adobe AIR Application</p>
<p>If all works right you should see something like this:</p>
<p><img src="http://soenkerohde.com/downloads/AMFPHPonAir/amfphponair.jpg" alt="AMFPHP on AIR" width="499" height="395" /></p>
<p>You can change the text in the TextInput control and click the button to send it to your server and the result is shown below the TextInput. Now that was easy I think! About 50 lines of code for a full AIR application which uses AMFPHP on the server side.</p>
<p>This example works but has no seperation of model,view and controller so I changed it to use the <a href="http://labs.adobe.com/wiki/index.php/Cairngorm">Cairngorm</a> micro-architecture. Download this <a href="http://soenkerohde.com/downloads/AMFPHPonAir/srcview/AMFPHPonAir.zip">example AIR application</a> (<a href="http://soenkerohde.com/downloads/AMFPHPonAir/srcview/index.html">sourceview</a>) and overwrite it into the src folder</p>
<p>The Cairngorm.swc should be in placed in the libs directory of your AIR project. Now let&#8217;s dive a bit in the code to understand the Cairngorm structure and how the RemoteObject configuration with the AMFPHP remoting gateway.</p>
<p>The AMFPHPonAIR.mxml is the main application MXML and you can right-click it to Run or Debug your AIR application. If you are not familiar with Cairngorm at all I recommend checking the <a href="http://labs.adobe.com/wiki/index.php/Cairngorm#Documentation_and_Samples">docs</a> as this is not a Cairngorm tutorial. If you have questions feel free to post a comment.</p>
<p>The main MXML is pretty short and instantiates only a TraceTarget, the FrontController, the Services (ServiceLocator) and the main view.</p>
<p>The creationComplete event goes into the init-function which dispatches a StartupEvent. Open the airamfphp/ctrl/FrontController.as on you see two events mapped to their commands. When the StartupEvent is dispatched the CairngormEventDispatcher calls the StartupCommand&#8217;s execute method with the event as the parameter.</p>
<p>Open the airamfphp/StartupCommand.as. The execute method gets called when the StartupEvent is dispatched. The ServiceLocator singleton maps to our business/Services.mxml because we instantiated it in out main MXML. The Services.mxml defines the RemoteObject which maps to the MyTestservice.php in the AMFPHP services directory. I added the method <em>setServer</em> to the ServiceLocator to set the remoting endpoint. This is pretty straight forward and is a replacement for the services-config.xml which can be compiled into the application (compiler flag -services service-config.xml). In real life the server settings should come out of an external configuration so you can switch from local dev to staging, production etc.</p>
<p>Going on in the StartupCommand you see that MyDelegate get&#8217;s instantiated and we call hello &#8220;You&#8221;. The delegate expects an IResponder as parameter and the command implements the IResponder interface meaning the methods result and fault. The delegate is standard Cairngorm so let&#8217;s finalize the command. For result and fault an Alert comes up which shows the server result of the call of MyService.hello(&#8220;You&#8221;).</p>
<p>The view/MainView.mxml shows a TextInput, Button and Label and when the button is pressed a HelloEvent with the text of the TextInput as parameter. The HelloEvent is mapped to the HelloCommand in the FrontController so open the HelloCommand to see what happens. We use the same delegate and fault-method and the result-method is changed to set the result within a bindable variable in the model/MyModelLocator singleton. This variable is bound to the Label&#8217;s text property so it shows up there after you pressed the button and the result is received from the server. That&#8217;s it!</p>
<p><br/><br />
If you want to use Flex in the browser instead of AIR simply create a new Flex project and change the root node from WindowedApplication to Application. The rest of the source should stay the same as we did not use any AIR API specific features.<br />
A big thanks to the guys who have taken over the AMFPHP project and to Patrick Mineault of course for this great peace of software!<br />
I would appreciate feedback if the detail level is to low or if your miss explanations on any parts so I can extend these parts.</p>
]]></content:encoded>
			<wfw:commentRss>http://soenkerohde.com/2008/06/amfphp-on-air-tutorial-with-mamp/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>AIR examples/links, Desktop 2.0 and Adobe Developer Connection</title>
		<link>http://soenkerohde.com/2007/10/air-exampleslinks-desktop-20-and-adobe-developer-connection/</link>
		<comments>http://soenkerohde.com/2007/10/air-exampleslinks-desktop-20-and-adobe-developer-connection/#comments</comments>
		<pubDate>Mon, 29 Oct 2007 10:21:39 +0000</pubDate>
		<dc:creator>Sönke</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://soenkerohde.com/2007/10/29/air-exampleslinks-desktop-20-and-adobe-developer-connection/</guid>
		<description><![CDATA[<p>Christophe Coenraets released the code Code from his MAX session in Barcelona about Offline Synchronization using AIR and Live Cycle Data Services.</p>
<p>Rich Tretola (Everythingflex) posted an update of his AIR Update Manager. With the Update Manager you can define the version and update URL of your AIR application and also all dialogs regarding the update [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://coenraets.org/blog/">Christophe Coenraets</a> released the code Code from his MAX session in Barcelona about <a href="http://coenraets.org/blog/2007/10/offline-synchronization-using-air-and-livecycle-data-services/">Offline Synchronization using AIR and Live Cycle Data Services</a>.</p>
<p><a href="http://blog.everythingflex.com">Rich Tretola (Everythingflex)</a> posted an update of his <a href="http://blog.everythingflex.com/2007/10/01/air-update-manager/">AIR Update Manager</a>. With the Update Manager you can define the version and update URL of your AIR application and also all dialogs regarding the update can be set. Another nice example by him is the <a href="http://blog.everythingflex.com/2007/10/18/air-contextwindow/">AIR Context Menu</a>.</p>
<p><a href="http://www.ericfeminella.com/blog">Eric Feminella</a> blogged an <a href="http://www.ericfeminella.com/blog/2007/07/16/air-cairngorm-air-extensions-for-cairngorm/">AIR </a><a href="http://www.ericfeminella.com/blog/2007/07/16/air-cairngorm-air-extensions-for-cairngorm/">extension</a> for <a href="http://www.ericfeminella.com/blog/2007/07/16/air-cairngorm-air-extensions-for-cairngorm/">Cairngorm</a>. I have not tested it yet but it looks interesting. I have already developed AIR apps with Cairngorm and there is no big difference to Flex web applications.<br />
The <a href="http://labs.adobe.com/wiki/index.php/AIR:Developer_FAQ#Where_can_I_see_an_example_of_a_badge_that_demonstrates_the_express_install_feature_included_in_the_Beta.3F">badge install</a> for AIR is one of the coolest things looking at the using experience when installing an AIR Application and the runtime itself. <a href="http://blogs.adobe.com/simplicity">Oliver Goldman</a> from the AIR Team <a href="http://blogs.adobe.com/simplicity/2007/10/badge_install_updates_current.html">posted about an update</a> which closes a security hole.</p>
<p><a href="http://weblogs.macromedia.com/cantrell">Christian Cantrell</a> from the AIR Team wrote a nice <a href="http://weblogs.macromedia.com/cantrell/archives/2007/10/air_is_desktop.cfm">article about AIR as Desktop 2.0</a>.</p>
<p>When you are new to AIR be sure to check the <a href="http://labs.adobe.com/showcase/air/">AIR Showcase</a> and when you start learning AIR be sure to check the <a href="http://www.adobe.com/devnet/air/">Adobe AIR Developer Center</a> which is part of the new launched <a href="http://www.adobe.com/devnet/">Adobe Developer Connection</a>. For more on this check the latest <a href="http://mail.adobe-direct.com/v?xJllcvPEvvvHcT">Adobe newsletter</a> which provides many interesting links for learning resources and read the <a href="http://www.adobe.com/devnet/logged_in/jwall_dev_connection.html">ADC introduction by Jonathan Wall</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://soenkerohde.com/2007/10/air-exampleslinks-desktop-20-and-adobe-developer-connection/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cairngorm 2.1.1 released</title>
		<link>http://soenkerohde.com/2007/10/cairngorm-211-released/</link>
		<comments>http://soenkerohde.com/2007/10/cairngorm-211-released/#comments</comments>
		<pubDate>Mon, 08 Oct 2007 18:02:53 +0000</pubDate>
		<dc:creator>Sönke</dc:creator>
				<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://soenkerohde.com/2007/10/08/cairngorm-211-released/</guid>
		<description><![CDATA[<p>Cairngorm 2.1.1 had a long beta phase and is now released on Adobe Labs.</p>
<p>It is now slit up into &#8220;normal&#8221; Cairngorm and Cairngorm Enterprise for LCDS solutions.</p>
<p>Cairngorm is a microarchitecure/framework for Adobe Flex. I use it in every of my projects and can only recomment it to every Flex Developer. After a small learning curve [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://labs.adobe.com/wiki/index.php/Cairngorm:Cairngorm2.2.1:Release_Notes">Cairngorm 2.1.1</a> had a long beta phase and is now released on <a href="http://labs.adobe.com/wiki/index.php/Cairngorm:Cairngorm2.2.1:Release_Notes">Adobe Labs</a>.</p>
<p>It is now slit up into &#8220;normal&#8221; Cairngorm and Cairngorm Enterprise for <a href="http://www.adobe.com/products/livecycle/dataservices/">LCDS</a> solutions.</p>
<p>Cairngorm is a microarchitecure/framework for <a href="http://labs.adobe.com/technologies/flex/">Adobe Flex</a>. I use it in every of my projects and can only recomment it to every Flex Developer. After a small learning curve where you have to understand the architecture of Cairngorm applications you will benifit from a very clearly seperated application logic.</p>
<p>A good starting point learning cairngorm are <a href="http://labs.adobe.com/wiki/index.php/Cairngorm">Adobe Labs</a> and <a href="http://cairngormdocs.org/">CairngormDocs</a> (<a href="http://cairngormdocs.org/cairngormDiagram/index.html">Cairngorm Diagram</a> has a nice visualization of how Cairngorm works).<br />
[via <a href="http://weblogs.macromedia.com/amcleod/archives/2007/10/cairngorm_221_r.cfm">Alistair McLeod</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://soenkerohde.com/2007/10/cairngorm-211-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
