<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xml:base="http://www.developmentarc.com/site/blog" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DevelopmentArc - Helping clients build for the future</title>
    <link>http://www.developmentarc.com/site/blog</link>
    <description></description>
    <language>en</language>
          <item>
    <title>Adding Superscript and Subscript support to HTML text via Text Layout Framework (TLF)</title>
    <link>http://www.developmentarc.com/site/2011/02/adding-superscript-and-subscript-support-html-text-text-layout-framework-tlf</link>
    <description>&lt;p&gt;
	For a recent client project, we were having an issue with using superscript to display the number next to a disclaimer information. In HTML this is accomplished by simply wrapping a &amp;lt;sup&amp;gt; tag around the text.&amp;nbsp;For example: &amp;quot;&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&amp;nbsp;The client wants a disclaimer here.&amp;quot; looks like: &lt;/p&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; The client wants a disclaimer here.&lt;br/&gt;&lt;/br/&gt;&lt;/p&gt;
&lt;p&gt;However, Flash does not support superscripts or subscripts in HTML text out of box, so a &amp;quot;hack&amp;quot; of some sort needed to be applied&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p&gt;
			Looking around I found two solutions. The first is fairly old (2007/2008) and uses a combination of some regular expression magic to convert &amp;lt;sup&amp;gt; and &amp;lt;sub&amp;gt; tags into HTML &amp;lt;font&amp;gt; tags. The solution next used an extra set of embedded fonts that were created for superscirpt and subscript. Here is the &amp;nbsp;&lt;a href=&quot;http://www.psyked.co.uk/adobe/flash/superscript-and-subscript-with-actionscript.htm&quot;&gt;blog post&lt;/a&gt;&amp;nbsp;for reference.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
			This solution is a reasonable but requires the process of embedding two extra fonts into the application to get the desired result.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
			The second approach was to use the Text Layout Framework (TLF) in Flex 4 and take advantage of the baselineShift property to create subscript and superscript text. See this&amp;nbsp;&lt;a href=&quot;http://blogs.adobe.com/anjuonflex/2010/11/29/to-add-superscript-or-subscript-in-label-flex-4&quot;&gt;Adobe blog&lt;/a&gt;&amp;nbsp;for reference.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
			My personal desire was to use the TLF approach so we would not have to embed extra fonts into the application. Plus, our application reads in text dynamically that is formatted as simply HTML and is then converted into TLF via the TextConverter.importFlow() method. Here is a quick example of the conversion.&lt;/p&gt;
&lt;p&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;var richText:RichText = new RichText();&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;richText.textFlow = TextConverter.importToFlow(ourContentAsString,&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;TextConverter.TEXT_FIELD_HTML_FORMAT);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
			Since we are using the TextConvert to convert HTML into TLF, we don&amp;#39;t have a chance to modify any &amp;lt;sup&amp;gt; or &amp;lt;sub&amp;gt;&amp;nbsp;tags that might be within the HTML string. The challenge is that the converter will actually strip out those tags (and any other unsupported tags), during conversion.&lt;/p&gt;
&lt;p&gt;
			So what to do...&lt;/p&gt;
&lt;p&gt;
			We found a way to combine both methods. We first use the regular expression magic outlined in the first blog, to convert all &amp;lt;sup&amp;gt; and &amp;lt;sub&amp;gt; into&amp;nbsp;&lt;span&gt;tags that TextConverter will not remove. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;// create regular expressions&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;var supStartExpression:RegExp = new RegExp(&amp;quot;&amp;lt;sup&amp;gt;&amp;quot;, &amp;quot;g&amp;quot;);&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;var supEndExpression:RegExp = new RegExp(&amp;quot;&amp;lt;/sup&amp;gt;&amp;quot;, &amp;quot;g&amp;quot;);&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;var subStartExpression:RegExp = new RegExp(&amp;quot;&amp;lt;sub&amp;gt;&amp;quot;, &amp;quot;g&amp;quot;);&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;var subEndExpression:RegExp = new RegExp(&amp;quot;&amp;lt;/sub&amp;gt;&amp;quot;, &amp;quot;g&amp;quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;// replace all tags&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;htmlContentAsString = htmlContentAsString.replace(supStartExpression, &lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;quot;&amp;lt;span class=&amp;quot;superscript&amp;quot;&amp;gt;&amp;quot;);&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;htmlContentAsString = htmlContentAsString.replace(supEndExpression, &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;);&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;htmlContentAsString = htmlContentAsString.replace(subStartExpression, &lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;quot;&amp;lt;span class=&amp;quot;subscript&amp;quot;&amp;gt;&amp;quot;);&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;htmlContentAsString = htmlContentAsString.replace(subEndExpression, &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;			// convert HTML into a TextFlow element var textFlow:TextFlow = TextConverter.importToFlow(htmlContentAsString,format, config); // format superscript and subscripts in TextFlow formatCustomTextFlow(textFlow);&lt;/p&gt;
&lt;p&gt;
			&lt;br /&gt;
			You will notice, instead of converting each &amp;lt;sup&amp;gt;/&amp;lt;sub&amp;gt; into &amp;lt;font&amp;gt; tags like in the first blog post suggests, we instead use &amp;lt;span&amp;gt; tags and add a class attribute based on what tag (&amp;lt;sup&amp;gt; or &amp;lt;sub&amp;gt;) we are converting. We do this for one main reason, when we convert HTML into TLF each &amp;lt;span&amp;gt; found will be converted into a SpanElement object and we need a way to mark each SpanElement with what they were prior in HTML. This is so that we can act upon it in the next step when we call our method formatCustomTextFlow(). The TextConverter takes the &amp;#39;class&amp;#39; attribute we define on the &amp;lt;span&amp;gt; and during the conversion, assigns the value to the &amp;#39;styleName&amp;#39; property on the SpanElement.&lt;/p&gt;
&lt;p&gt;
			The output from this part will be a single TextFlow element, which will have children for each HTML element found in the text. We will next traverse the entire&amp;nbsp;TextFlow&amp;nbsp;hierarchy of children searching for FlowElements (SpanElement is a decedent of FlowElement). We start this by calling a custom method formatCustomTLF().&amp;nbsp; In this method we examine each mxmlChild of the TextFlow element. We first look to see if the element is of type FlowElementGroup. If so, we know it might have children, so we loop over all it&amp;#39;s children calling&amp;nbsp;formatCustomTLF(). If the element is not a&amp;nbsp;FlowElementGroup&amp;nbsp;and has a styleName attribute value of &amp;quot;superscript&amp;quot; or &amp;quot;subscript&amp;quot;, we process it. &amp;nbsp; We process the FlowElement by setting the baselineShift property based on the styleName. So if the stylename is &amp;quot;superscript&amp;quot; we set the baselineShift equal to BaselineShift.SUPERSCRIPT&amp;nbsp;and then remove the styleName value. Here&amp;#39;s a look at the code.&lt;/p&gt;
&lt;p&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;private function formatCustomTLF(element:FlowElement):void {&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;// if FlowElement is a group loop over it&#039;s children and format them&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;if(element is FlowGroupElement) {&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var parentAsGroupElement:FlowGroupElement = FlowGroupElement(element);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;for each(var childElement:FlowElement in parentAsGroupElement.mxmlChildren) {&lt;/span&gt;&lt;br /&gt;
		            &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formatCustomTLF(childElement);&lt;/span&gt;&lt;br /&gt;
		            &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
		            &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;// set baselineShift based on stylename&lt;/span&gt;&lt;br /&gt;
		   	&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;else if(element.styleName == &amp;quot;superscript&amp;quot;) {&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;element.baselineShift = BaselineShift.SUPERSCRIPT;&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;element.styleName = &amp;quot;&amp;quot;;&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;else if(element.styleName == &amp;quot;subscript&amp;quot;) {&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;element.baselineShift = BaselineShift.SUBSCRIPT;&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;element.styleName = &amp;quot;&amp;quot;;&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
			&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre; &quot;&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
			After that, we have our superscript and subscript support in our html content!&lt;/p&gt;
&lt;p&gt;
			Here&#039;s a &lt;a href=&quot;http://demo.developmentarc.com/SuperscriptAndSubScriptHTMLSupport.fxp&quot;&gt;sample Flex application&lt;/a&gt; you can download and import into Flash Builder 4, that demonstrates the entire technic.&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
     <comments>http://www.developmentarc.com/site/2011/02/adding-superscript-and-subscript-support-html-text-text-layout-framework-tlf#comments</comments>
 <category domain="http://www.developmentarc.com/site/category/categories/actionscript-3">ActionScript 3</category>
 <category domain="http://www.developmentarc.com/site/category/categories/flex">Flex</category>
 <category domain="http://www.developmentarc.com/site/category/categories/knowledge-center">Knowledge Center</category>
 <pubDate>Wed, 23 Feb 2011 20:42:28 +0000</pubDate>
 <dc:creator>Aaron Pedersen</dc:creator>
 <guid isPermaLink="false">66 at http://www.developmentarc.com/site</guid>
  </item>
  <item>
    <title>The invalidateSkinState() Trap</title>
    <link>http://www.developmentarc.com/site/2010/11/invalidateskinstate-trap</link>
    <description>&lt;p&gt;A while back, a friend of mine and fellow Flex developer was consulting on a Flex 4 based application. &amp;nbsp;He was having a troublesome issue where in some cases the skin state was not updating in his application when he called invalidateSkinState(). &amp;nbsp;The problem was that when he called invalidateSkinState(), the getCurrentSkinState() was never called during the next commit properties phase (think validation during maturity, eee our &lt;a href=&quot;http://www.developmentarc.com/site/articles&quot; target=&quot;_self&quot;&gt;whitepaper&lt;/a&gt; for more details). It wasn&amp;#39;t consistent in the code and it only happened in a few specific cases.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;	He asked me if I had ever seen the issue where getCurrentSkinState() is skipped after calling invalidateSkinState(). At that time I had never seen a problem with the Skin state not updating, so I didn&amp;#39;t have much guidance for him. &amp;nbsp;He found a solution which involved making sure to call both invalidateSkinState() and invalidateProperties() at the same time, even though invalidateSkinState() should also invalidate properties for you.&lt;/p&gt;
&lt;p&gt;	About three weeks later, I stumbled upon the same issue while working on an application. &amp;nbsp;Inexplicably, one of my components started ignoring invalidateSkinState() and the skin wouldn&amp;#39;t change. &amp;nbsp;After setting some breakpoints and screaming at the code for a while I finally figured out what the cause was. &amp;nbsp;I had mistakenly used invalidateSkinState() within the commitProperties() after calling super.commitProperties():&lt;/p&gt;
&lt;p&gt;	/* don&amp;#39;t do this... */&lt;br /&gt;
	override protected function commitProperties():void {&lt;br /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // call super first&lt;/p&gt;
&lt;p&gt;	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super.commitProperties();&lt;/p&gt;
&lt;p&gt;	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;... calculate data, set the flag if the skin needs to change ...&lt;/p&gt;
&lt;p&gt;	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;// set the skin state&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;if(_flag) {&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;_stateIWant = &amp;quot;stateName&amp;quot;;&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;invalidateSkinState();&lt;br /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;}&lt;br /&gt;
	}&lt;/p&gt;
&lt;p&gt;	I am simplifying the code dramatically, but what I was trying to do was during the commit phase I was calculating a lot of data set by a dataProvider. &amp;nbsp;If the data had certain properties I needed to change the state of my skin, and that was why I was calling invalidateSkinState() post-data calculation. The core issue was that during the setting of the dataProvider, I had no idea if my skin had to change or not because the new data had to be processed before I could determine what state I needed to be in. &amp;nbsp;At that point, I still wanted to delay the data processing until the commit phase, so I deferred the calculation until later and then post-calculation I could set the proper state.&lt;/p&gt;
&lt;p&gt;	Looking back, this was clearly a bad thing to do but at the time it seemed like a reasonable request. The problem with this call is around order of operation. Let&amp;#39;s look at the order of operation within the UI component:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
		Invalidation
&lt;ol&gt;
&lt;li&gt;
				invalidateProperties() is called&lt;/li&gt;
&lt;li&gt;
				invalidateProperties() sets invalidatePropertiesFlag = true&lt;/li&gt;
&lt;li&gt;
				The component registers with LayoutManager for the next validation pass&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
		Validation
&lt;ol&gt;
&lt;li&gt;
				LayoutManager begins the validation pass (started by ENTER_FRAME / RENDER event)&lt;/li&gt;
&lt;li&gt;
				LayoutManager calls validateProperties() on the invalid component&lt;/li&gt;
&lt;li&gt;
				validateProperties() determines if invalidatePropertiesFlag is set to true&lt;/li&gt;
&lt;li&gt;
				if true, validateProperties() calls overridden commitProperties()&lt;/li&gt;
&lt;li&gt;
				overridden method first calls super.commitProperties()&lt;/li&gt;
&lt;li&gt;
				super.commitProperties() determines if the skinStateIsDirty has been marked true (set via invalidateSkinState())&lt;/li&gt;
&lt;li&gt;
				if skinStateIsDirty is true it calls getCurrentSkinState() to get the state name&lt;/li&gt;
&lt;li&gt;
				super is complete and returns to the overridden method&lt;/li&gt;
&lt;li&gt;
				we process the data, determine the skin needs to change&lt;/li&gt;
&lt;li&gt;
				we call invalidateSkinState()&lt;/li&gt;
&lt;li&gt;
				invalidateSkinState() sets skinStateIsDirty to true and calls invalidateProperties()&lt;/li&gt;
&lt;li&gt;
				invalidateProperties checks to see if invalidatePropertiesFlag is already set to true&lt;/li&gt;
&lt;li&gt;
				invalidatePropertiesFlag is set to true (we are still validating at this point), so invalidateProperties() does not re-start the invalidation process&lt;/li&gt;
&lt;li&gt;
				commitProperties is complete, and returns to validateProperties(), remember we are synchronous at this point&lt;/li&gt;
&lt;li&gt;
				invalidatePropertiesFlag is set back to false&lt;/li&gt;
&lt;li&gt;
				validation process is complete&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
		Re-Invalidation
&lt;ol&gt;
&lt;li&gt;
				At some point post the last validation pass, we call invalidateSkinState()&lt;/li&gt;
&lt;li&gt;
				invalidateSkinState() checks skinStateIsDirty, which is still set to true so invalidateProperties() is not called&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;	At there lies the crux of the issue. &amp;nbsp;The problem is that when we call invalidateSkinState() it still thinks the skin flag is dirty, meaning we are already waiting for a validation pass and therefore we don&amp;#39;t restart the invalidation process. &amp;nbsp;This means that our skin flags are now out of sync and we get odd behavior until the next full invalidation process goes through. Of course we may keep re-entering into the same conflict over and over depending on how circular our logic is in the code.&lt;/p&gt;
&lt;p&gt;	The way to fix this is to move our logic BEFORE the super call:&lt;/p&gt;
&lt;p&gt;/* acceptable fix */&lt;br /&gt;
override protected function commitProperties():void {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;// do our code first&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;if(_flag) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;_stateIWant = &amp;quot;stateName&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;invalidateSkinState();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;// then call super&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;super.commitProperties();&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;	This allows the invalidateSkinState() method to set the skinStateIsDirty flag to true before the super is called and will prevent the issue.&lt;/p&gt;
&lt;p&gt;	Finally, in 99% of the cases you won&amp;#39;t need to call invalidateSkinState() within commitProperties(). You will more then likely want to call invalidateProperties() and invalidateSkinState() at the same time. &amp;nbsp;But remember, you will still need to do all your skin state flag calculations BEFORE calling super so that commitProperties() and getCurrentSkinState() process the flags correctly.&lt;/p&gt;
</description>
     <comments>http://www.developmentarc.com/site/2010/11/invalidateskinstate-trap#comments</comments>
 <category domain="http://www.developmentarc.com/site/category/categories/actionscript-3">ActionScript 3</category>
 <category domain="http://www.developmentarc.com/site/category/tags/flex-4">flex 4</category>
 <category domain="http://www.developmentarc.com/site/category/tags/lifecycle">lifecycle</category>
 <category domain="http://www.developmentarc.com/site/category/tags/skins">skins</category>
 <category domain="http://www.developmentarc.com/site/category/categories/flex">Flex</category>
 <category domain="http://www.developmentarc.com/site/category/categories/knowledge-center">Knowledge Center</category>
 <pubDate>Mon, 22 Nov 2010 21:03:20 +0000</pubDate>
 <dc:creator>James Polanco</dc:creator>
 <guid isPermaLink="false">65 at http://www.developmentarc.com/site</guid>
  </item>
  <item>
    <title>Application Development on the BlackBerry Playbook via Adobe AIR (Free PlayBook)</title>
    <link>http://www.developmentarc.com/site/2010/11/application-development-blackberry-playbook-adobe-air-free-playbook</link>
    <description>&lt;p&gt;
	At Max one of the most interesting announcements was around the BlackBerry PlayBook.&amp;nbsp;&amp;nbsp; The new device presents a slick 7&amp;#39;&amp;#39; screen and is packed with a 1GHz dual core processor and 1GB of RAM. The device will run BlackBerry&amp;#39;s Tablet OS and come stocked with developer&amp;#39;s favorite runtimes. Those include Open GL, WebKit, SMP, Adobe Flash, Java, and Adobe AIR.&lt;/p&gt;
&lt;p&gt;	For us Flash developers, the most important specs are that the device will ship with Flash 10.1 and with Adobe Air 2.5. This means all Flash content on the web will be viewable via the latest WebKit. And Flash developers can take advantage of the Blackberry Tablet OS SDK and a Flash Builder plugin to create ActionScript based projects. The SDK seems to be a custom version of the Flex 4 SDK, but from what I understand, they do not recommend you use the Flex 4 component set. BlackBerry has created their own core set of ActionScript components for general use and to assist with developing custom components that are performante on the device. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;	The SDK does support Flex&amp;#39;s resource bundles, which means, your application can take advantage of internationalization. This is an important feature considering&amp;nbsp; the PlayBook will be released in multiple countries in 2011.&lt;/p&gt;
&lt;p&gt;	Currently the PlayBook is to be shipped sometime early next year. But this has not stopped RIM from encouraging application development now. At Max RIM announce an offer for application developers. If you build an application and the application is submitted and approved into BlackBerry&amp;#39;s AppWorld, you can be eligible for a free PlayBook. Look here for the announcement. &lt;a href=&quot;http://devblog.blackberry.com/2010/10/blackberry-playbook-developer-promotion-information/&quot; title=&quot;http://devblog.blackberry.com/2010/10/blackberry-playbook-developer-promotion-information/&quot;&gt;http://devblog.blackberry.com/2010/10/blackberry-playbook-developer-prom...&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;	Now you may be asking, &amp;quot;How do I develop an application without the hardware&amp;quot;. Well, RIM has provided a Windows and Mac simulator to development environments.&amp;nbsp; The simulator is an ISO file that will need to be run under a VMware Player on Windows or VMware Fusion on Mac.&amp;nbsp; With the FlashBuilder plugin and the Simulator, you can developer, deploy, and debug your application. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;	For more information on developing for the PlayBook visit Adobe Labs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
		&lt;a href=&quot;http://labs.adobe.com/technologies/flash/blackberrytabos/&quot; title=&quot;http://labs.adobe.com/technologies/flash/blackberrytabos/&quot;&gt;http://labs.adobe.com/technologies/flash/blackberrytabos/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	&lt;br /&gt;
	And for those of you already diving into the Max prerelease of FlashBuilder Burrito, Adobe has already posted an article to get you up and running for PlayBook development.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
		&lt;a href=&quot;http://www.adobe.com/devnet/devices/articles/blackberry_tablet_os_sdk.html&quot; title=&quot;http://www.adobe.com/devnet/devices/articles/blackberry_tablet_os_sdk.html&quot;&gt;http://www.adobe.com/devnet/devices/articles/blackberry_tablet_os_sdk.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;	RIM has also created a forum for questions and a blog where they have promised to post any new announcements about the hardware and software.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
		&lt;a href=&quot;http://supportforums.blackberry.com/t5/Tablet-OS-SDK-for-Adobe-AIR/bd-p/table&quot; title=&quot;http://supportforums.blackberry.com/t5/Tablet-OS-SDK-for-Adobe-AIR/bd-p/table&quot;&gt;http://supportforums.blackberry.com/t5/Tablet-OS-SDK-for-Adobe-AIR/bd-p/...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
		&lt;a href=&quot;http://labs.adobe.com/technologies/flash/blackberrytabos/&quot; title=&quot;http://labs.adobe.com/technologies/flash/blackberrytabos/&quot;&gt;http://labs.adobe.com/technologies/flash/blackberrytabos/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	&lt;br /&gt;
	RIM has also announced a set of webcast series to help get developers up to speed on the development environment and the hardware.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
		&lt;a href=&quot;http://us.blackberry.com/developers/tablet/devresources.jsp&quot; title=&quot;http://us.blackberry.com/developers/tablet/devresources.jsp&quot;&gt;http://us.blackberry.com/developers/tablet/devresources.jsp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
     <comments>http://www.developmentarc.com/site/2010/11/application-development-blackberry-playbook-adobe-air-free-playbook#comments</comments>
 <category domain="http://www.developmentarc.com/site/category/categories/actionscript-3">ActionScript 3</category>
 <category domain="http://www.developmentarc.com/site/category/tags/mobile">Mobile</category>
 <category domain="http://www.developmentarc.com/site/category/tags/playbook">Playbook</category>
 <pubDate>Thu, 18 Nov 2010 21:07:22 +0000</pubDate>
 <dc:creator>Aaron Pedersen</dc:creator>
 <guid isPermaLink="false">64 at http://www.developmentarc.com/site</guid>
  </item>
  <item>
    <title>RSL Calculations in the new Flex 4 Preloader</title>
    <link>http://www.developmentarc.com/site/2010/09/rsl-calculations-new-flex-4-preloader</link>
    <description>&lt;p&gt;
	Flex 4 has introduced a new preloader and with it a series of new events that we can leverage. &amp;nbsp;I am not going to take much time explaining how to build a preloader, there are some solid examples out there to cut your teeth on. The first example is &lt;a href=&quot;http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7e3c.htm&quot; target=&quot;_blank&quot;&gt;Adobe&amp;#39;s official documentation&lt;/a&gt;.&lt;/p&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	The issue with this documentation is that it ignores the Runtime Shared Library (RSL) progress events dispatched by the preloader instance. &amp;nbsp;Its briefly mentioned in the Events list, but never used in the code. &amp;nbsp;The challenge is that the basic progress events change drastically based on the current RSL being loaded.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	By default, Flex 4 now breaks the SDK into multiple RSLs (SWF &amp;amp; SWZ), this means that we have to track n number of RSLs at load time and this cascades down into both the RSL progress and the init progress. &amp;nbsp;The change in RSL requirements creates some interesting challenges in how we have to calculate the current progress and also causes some odd behavior with our loader. Let&amp;#39;s take a look at the following diagram to see how the Flash player loads the content and what events are dispatched.&lt;/div&gt;
&lt;div&gt;
	&lt;img alt=&quot;Flash Player load process and RSL management&quot; src=&quot;http://www.developmentarc.com/site/wp-content/uploads/2010/09/preloader_rsls.jpg&quot; /&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	The goal of an RSL is to compartmentalize code in a downloadable file that can be cached and individually updated without requiring the entire project to be re-compliled (more or less). &amp;nbsp;The new Flex 4 RSL structure for the framework is intended to break out different elements of the SDK into separate RSL files to allow developers to only require the RSLs they use in the project, and to allow the player to cache the files so the user only has to download them once.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	If you are creating a Flex application using all the features of Flex 4, you will have seven files that are required to be downloaded and then loaded into the player. &amp;nbsp;The main SWF (your application code) and the six Flex 4 RSLs: framework, osmf_flex, rpc, spark, sparkskins, and textLayout. &amp;nbsp;All of these files must be loaded and initialized before you application is started and we can reflect this process in the custom preloader. If you add more RSLs, custom libraries, etc; then you will have to load even more files before the application can begin.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&lt;strong&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Preloader Events&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	There are few preloader events that we want to track during our load process: &lt;em&gt;ProgressEvent.PROGRESS&lt;/em&gt;, &lt;em&gt;RSLEvent.RSL_PROGRESS&lt;/em&gt;, &lt;em&gt;RSLEvent.RSL_COMPLETE&lt;/em&gt;, &lt;em&gt;FlexEvent.INIT_PROGRESS&lt;/em&gt; and &lt;em&gt;FlexEvent.INIT_COMPLETE&lt;/em&gt;. &amp;nbsp;All these events are dispatched during the loading process, and the order they get called in changes based on what action is being taken. &amp;nbsp;This can create a really confusing order of operation.&lt;/div&gt;
&lt;div&gt;
	The &lt;em&gt;ProgressEvent.PROGRESS&lt;/em&gt; event is dispatched as the main application SWF is being loaded and as RSLs are being loaded. &amp;nbsp;This means that the total bytes and the loaded bytes in the &lt;em&gt;ProgressEvent.PROGRESS&lt;/em&gt; event changes depending on where we are in the load process. &amp;nbsp;The problem is that most examples just use the &lt;em&gt;ProgressEvent.PROGRESS&lt;/em&gt; event to calculate the percent based on the total and loaded values.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	What we experienced in a current project I am working on is that the loader bar would jump around from complete to partially loaded back to complete as each of these progress values are updated. &amp;nbsp;This lead me to start researching into the different events and found out about the &lt;em&gt;RSLEvent.RSL_PROGRESS&lt;/em&gt; and &lt;em&gt;RSLEvent.RSL_COMPLETE&lt;/em&gt; events.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	Bernhard Hirschmann has an &lt;a href=&quot;http://coding.bhirschmann.de/2008/03/20/preloader-for-flex-with-rsl-support/&quot; target=&quot;_blank&quot;&gt;example&lt;/a&gt; (make sure to view the source) that taps into the RSL download events, but his solution only shows the basics for tracking and calculating a single RSL. Seth Duffy also has a &lt;a href=&quot;http://www.leavethatthingalone.com/blog/index.cfm/2009/11/11/Flex4CustomPreloader&quot; target=&quot;_blank&quot;&gt;good demo&lt;/a&gt;, but once again he is not handling multiple-RSL loads.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	The &lt;em&gt;RSLEvent.RSL_PROGRESS&lt;/em&gt; is dispatched as a specific RSL is being loaded into the player and gives us bytes loaded and total, so that we can calculate a percentage. &amp;nbsp;When the RSL is done loading the &lt;em&gt;RSLEvent.RSL_COMPLETE&lt;/em&gt; is dispatched. &amp;nbsp;The problem is that &lt;em&gt;ProgressEvent.PROGRESS&lt;/em&gt; events are randomly mixed into the &lt;em&gt;RSLEvent.RSL_PROGRESS&lt;/em&gt; events and this creates a lot of confusion. &amp;nbsp;Luckily, Bernhard&amp;#39;s example (mentioned above) handles the mixing of &lt;em&gt;RSLEvent.RSL_PROGRESS&lt;/em&gt; and &lt;em&gt;ProgressEvent.PROGRESS&lt;/em&gt; for us.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	Once I tied our project into the &lt;em&gt;RSLEvents&lt;/em&gt;, we still were not getting a seamless load experience, because the progress would start back at zero once the next RSL started loading (not including the SWF load calculation that Bernhard shows). &amp;nbsp;After a bit more digging, I found out that the &lt;em&gt;RSLEvent&lt;/em&gt; has two properties, &lt;em&gt;rslIndex&lt;/em&gt; and &lt;em&gt;rslTotal&lt;/em&gt;. &amp;nbsp;These properties tell us which RSL is being loaded and how many we have to load. &amp;nbsp;Knowing this information we can calculate what percentage we are currently at using the &lt;em&gt;bytesLoaded&lt;/em&gt;, &lt;em&gt;totalBytes&lt;/em&gt;, &lt;em&gt;rslIndex&lt;/em&gt; and &lt;em&gt;rslTotal&lt;/em&gt;.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	At this point I had to do a little (okay a lot) of hacking to get the right calculation, because I suck at math. &amp;nbsp;BUT, I am persistent and I usually can figure it out. Here is the code (the event is the &lt;em&gt;RSLEvent.RSL_PROGRESS&lt;/em&gt;):&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;pre&gt;
Math.round(((event.bytesLoaded / event.bytesTotal) + event.rslIndex) / event.rslTotal * 100);&lt;/pre&gt;&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	This allows us to calculate the current percentage of the RSL download based on both the current bytes and the position within the RSL index.&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	&lt;img alt=&quot;Progress bar display&quot; src=&quot;http://www.developmentarc.com/site/wp-content/uploads/2010/09/progress_calculation.jpg&quot; /&gt;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	The result is the ability to create a smooth 0 - 100% progress bar for all our SWF and RSL files, no matter how many RSLs we have attached to our application. &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;cke_pastebin&quot;&gt;
	One other thing to note, is that once the SWF and RSLs are loaded they need to be initialized. &amp;nbsp;The final event we can track is the &lt;em&gt;FlexEvent.INIT_PROGRESS&lt;/em&gt; event. &amp;nbsp;This is not your typical progress event, because it does not provide &lt;em&gt;bytesLoaded&lt;/em&gt; vs. &lt;em&gt;bytesTotal&lt;/em&gt;. This is just dispatched as each part (SWF/RSL) is being initialized.&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	We can determine how many times &lt;em&gt;FlexEvent.INIT_PROGRESS&lt;/em&gt; will be called by storing the total number of RSLs plus one (each RSL and the main SWF application). &amp;nbsp;Using this value we can then increment the progress bar by a small amount as each &lt;em&gt;FlexEvent.INIT_PROGRESS&lt;/em&gt; is dispatched and allow us just a bit more granularity into the preloader. &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
	I hope this post helps some of you out there, I know that making a smooth loader was a bit of a challenge, but once you get all the parts its not too bad.&lt;/div&gt;
</description>
     <comments>http://www.developmentarc.com/site/2010/09/rsl-calculations-new-flex-4-preloader#comments</comments>
 <category domain="http://www.developmentarc.com/site/category/categories/actionscript-3">ActionScript 3</category>
 <category domain="http://www.developmentarc.com/site/category/tags/determine-rsl-download">determine rsl download</category>
 <category domain="http://www.developmentarc.com/site/category/tags/flex-4">flex 4</category>
 <category domain="http://www.developmentarc.com/site/category/tags/percentage-calculations">percentage calculations</category>
 <category domain="http://www.developmentarc.com/site/category/tags/preloading">preloading</category>
 <category domain="http://www.developmentarc.com/site/category/categories/flex">Flex</category>
 <category domain="http://www.developmentarc.com/site/category/categories/knowledge-center">Knowledge Center</category>
 <pubDate>Tue, 28 Sep 2010 17:57:19 +0000</pubDate>
 <dc:creator />
 <guid isPermaLink="false">61 at http://www.developmentarc.com/site</guid>
  </item>
  <item>
    <title>FITC San Francisco 2010 &amp; Twitter #devarc</title>
    <link>http://www.developmentarc.com/site/2010/08/fitc-san-francisco-2010-twitter-devarc</link>
    <description>&lt;p&gt;Flash in the Can (FITC) is almost upon us (or already happened depending when you read this) and we are really excited to be attending the San Francisco version of this internationally renowned conference. &amp;nbsp;Aaron and I will speaking on the first day about the Flex 4 component lifecycle and if you are attending the conference we highly recommended swinging by and saying hi.&lt;/p&gt;
&lt;p&gt;	For attendees we will be handing out a conference code for a 20% discount off our training program, so keep an eye out for our flyers. &amp;nbsp;There should also be a copy of the flyer in your goodie bag. &amp;nbsp;If you are not attending FITC, we have a twitter contest going on. &amp;nbsp;If you tweet about our training with the keyword #devarc you will have a chance to win a free session. &amp;nbsp;So, get out there and tweet!&lt;/p&gt;
</description>
     <comments>http://www.developmentarc.com/site/2010/08/fitc-san-francisco-2010-twitter-devarc#comments</comments>
 <category domain="http://www.developmentarc.com/site/category/categories/conferences">Conferences</category>
 <category domain="http://www.developmentarc.com/site/category/categories/news">News</category>
 <pubDate>Mon, 16 Aug 2010 22:43:00 +0000</pubDate>
 <dc:creator />
 <guid isPermaLink="false">58 at http://www.developmentarc.com/site</guid>
  </item>
  <item>
    <title>Introducing DevelopmentArc Online Seminar Training</title>
    <link>http://www.developmentarc.com/site/2010/07/introducing-developmentarc-online-seminar-training</link>
    <description>&lt;p&gt;We are proud to announce that DevelopmentArc is introducing a &lt;a href=&quot;http://www.developmentarc.com/site/training&quot;&gt;new training program&lt;/a&gt; focusing on Flex 4 development. &amp;nbsp;Each training session will be a live seminar hosted online using Adobe Connect. &amp;nbsp;We will offer our seminars multiple times each month, hopefully providing a good window for anyone who is interested. &amp;nbsp;Our sessions also include unique training materials that are provided to you after each session. &amp;nbsp;These materials include the source code we demonstrate with, a PDF copy of the slides and any custom training material we are creating for each series.&lt;/p&gt;
&lt;p&gt;	For our first series we are offering a four hour seminar focusing on developing custom Flex components and item renderers using the new Flex 4 Spark architecture. There has been a lot of minor and major changes to how Flex 4 content is created, which is going to change how you approach application development using Flex. Our goal with this series is to examine and explain these changes, look at new best practices to leverage these features and show you how to create content using the new principles that we are demonstrating.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;	This first seminar is based on our own development experiences while creating &lt;a href=&quot;http://labs.adobe.com/technologies/workflowlab/&quot; target=&quot;_blank&quot;&gt;Adobe&amp;#39;s WorkflowLab&lt;/a&gt; which uses Flex 4 and AIR 2. We have also been doing extensive research around the changes to the Flex 4 component lifecycle. &amp;nbsp;Our initial research has been presented at multiple conferences such as &lt;a href=&quot;http://www.360flex.com/&quot; target=&quot;_blank&quot;&gt;360|Flex&lt;/a&gt; (San Jose), &lt;a href=&quot;http://flashandthecity.com/&quot; target=&quot;_blank&quot;&gt;Flash And the City&lt;/a&gt; (NYC), &lt;a href=&quot;http://d2wc.com/&quot; target=&quot;_blank&quot;&gt;Designer Developer Workflow Conference&lt;/a&gt; (Kansas City) and will be featured at &lt;a href=&quot;http://www.fitc.ca/&quot; target=&quot;_blank&quot;&gt;Flash in the Can&lt;/a&gt; (San Francisco) and &lt;a href=&quot;http://max.adobe.com/&quot; target=&quot;_blank&quot;&gt;Adobe MAX 2010&lt;/a&gt; (Los Angeles). &amp;nbsp;Our conference series are usually limited to only an hour and this seminar will be the first time that allows us to provide a truly in-depth look at the results from our research.&lt;/p&gt;
&lt;p&gt;	At the end of the session you will get access to a new 60 page mini-book that covers all the principles and examples that we discuss in the seminar. &amp;nbsp;This mini-book includes a large section that is a Flex 4 update to our popular &amp;quot;&lt;a href=&quot;http://www.developmentarc.com/site/articles&quot; target=&quot;_blank&quot;&gt;Understanding the Adobe Flex&amp;reg; 3 Component and Framework Lifecycle&lt;/a&gt;&amp;quot; whitepaper. &amp;nbsp;We have been getting a lot of requests for how Flex 4 has changed this process and by attending this session you will get a first hand look at this new information.&lt;/p&gt;
&lt;p&gt;	Each seminar has a limited number of spots, to enable everyone time for more questions and answers. &amp;nbsp;So make sure to sign up as soon as possible to guarantee a spot in the session time that works best for you. &amp;nbsp;If you have a larger team, are interested in onsite training or more focused training in a specific area, let us know because we are more then willing to work with you and your team. &amp;nbsp;Hopefully, you will be able to join us and we look forward to this and multiple other series as time goes on!&lt;/p&gt;
</description>
     <comments>http://www.developmentarc.com/site/2010/07/introducing-developmentarc-online-seminar-training#comments</comments>
 <category domain="http://www.developmentarc.com/site/category/categories/actionscript-3">ActionScript 3</category>
 <category domain="http://www.developmentarc.com/site/category/tags/training">training</category>
 <category domain="http://www.developmentarc.com/site/category/categories/air">AIR</category>
 <category domain="http://www.developmentarc.com/site/category/categories/flex">Flex</category>
 <category domain="http://www.developmentarc.com/site/category/categories/news">News</category>
 <category domain="http://www.developmentarc.com/site/category/categories/projects">Projects</category>
 <pubDate>Fri, 09 Jul 2010 18:06:09 +0000</pubDate>
 <dc:creator />
 <guid isPermaLink="false">54 at http://www.developmentarc.com/site</guid>
  </item>
  <item>
    <title>Moving our site over to Drupal...</title>
    <link>http://www.developmentarc.com/site/2010/06/moving-our-site-over-drupal</link>
    <description>&lt;p&gt;Over the last few weeks we have been rebuilding DevelopmentArc.com using Drupal as our new platform. &amp;nbsp;Prior to the switch over, we having been running Wordpress and it has been pretty good for the last year or so. &amp;nbsp;Unfortunately, we had purchased a template system that worked well for the launch yet to make it work we had to heavily modify the template and the CSS.&lt;/p&gt;
&lt;p&gt;	When Wordpress updated to 2.9, this broke all of the tempting systems and the developers had to roll out a new version. &amp;nbsp;This new roll out drastically changed a lot of the files that we had modified, and this caused us a lot of heartache trying to re-build our modifications in the new template framework. &amp;nbsp;We are currently planning a Drupal site for a client and we felt that rebuilding our site in Drupal was the perfect exercise. &amp;nbsp;Small enough to do it between other work and would also free us up from the previous template fiasco since we would be building it from the ground up.&lt;/p&gt;
&lt;p&gt;	Now that we have ported over to Drupal, our goal is to keep the site in parity to the first one. &amp;nbsp;Hopefully, you won&amp;#39;t even tell a difference. &amp;nbsp;But now that we control the entire stack, we hope to roll out new content and updates on a much shorter timeline. &amp;nbsp;That, and we are finally wrapping up our book which has been our main focus for all our work and personal free time. &amp;nbsp;So, enjoy the &amp;quot;new&amp;quot; site and let us know what issues you all have!&lt;/p&gt;
</description>
     <comments>http://www.developmentarc.com/site/2010/06/moving-our-site-over-drupal#comments</comments>
 <category domain="http://www.developmentarc.com/site/category/categories/news">News</category>
 <category domain="http://www.developmentarc.com/site/category/categories/projects">Projects</category>
 <pubDate>Thu, 03 Jun 2010 21:08:42 +0000</pubDate>
 <dc:creator />
 <guid isPermaLink="false">42 at http://www.developmentarc.com/site</guid>
  </item>
  <item>
    <title>DevelopmentArc @ 360|Flex</title>
    <link>http://www.developmentarc.com/site/2010/02/developmentarc-360flex</link>
    <description>&lt;p&gt;With a little less than a month until &lt;a href=&quot;http://www.360flex.com/&quot; target=&quot;_blank&quot;&gt;360|Flex&lt;/a&gt; I thought I would sit down and write a long over due post about the conference.&amp;nbsp; 360|Flex is known in the community as one of those &amp;ldquo;hard core&amp;rdquo; conferences where the expectation is to leave sessions with your Flex and Flash IQ increased by a couple digits.&lt;/p&gt;
&lt;p&gt;	Unfortunately until now, James and I have had to experience the conference through other people&amp;rsquo;s stories.&amp;nbsp; For some reason or another the last few years have been pretty hectic, but we made it a mission in 2010 to attend and speak at more events, with 360|Flex being the first on the list.&lt;/p&gt;
&lt;p&gt;	&lt;strong&gt;Session&lt;/strong&gt;&lt;br /&gt;
	In our session &amp;ldquo;Flex 4 Component LifeCycle Best Practices&amp;rdquo; our goal is to walk folks through the three stages of the Flex lifecycle (birth, mature, death) and discuss what methods can be used to help build efficient and high performance Flex applications following that Flex component design methodology. With the reengineering of the skinning architecture in Flex 4, a few methods have been introduced and others have been more or less deprecated in importance. We will discuss these changes in detail and how you will want to change your development practices. We are extremely excited to share our year long research that began with our widely popular white paper on the Flex 3 lifecycle. Soon after the conference and session, we plan on updating the paper to Flex 4 and will share it with the community.&lt;/p&gt;
&lt;p&gt;	&lt;strong&gt;Attending&lt;/strong&gt;&lt;br /&gt;
	As much of an honor it is to speak at 360|Flex what is really exciting us is attending some of the other session and diving deeper into topics we have not had the time to investigate. James and I have been debating our &lt;a href=&quot;http://www.360flex.com/schedule/&quot; target=&quot;_blank&quot;&gt;schedule&lt;/a&gt; for a few weeks now so far we have compiled a &amp;ldquo;must-see&amp;rdquo; list that we have listed below to share with everyone.&lt;/p&gt;
&lt;p&gt;	&lt;strong&gt;Aaron &amp;amp; James&amp;rsquo; Must See!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;	Going deep w/OSMF - OMG!&lt;br /&gt;
	Level 300&lt;br /&gt;
	By David Hassoun&lt;/p&gt;
&lt;p&gt;	RobotLegs on Top of Gaia Flash Framework&lt;br /&gt;
	Level 100&lt;br /&gt;
	By Jesse Warden&lt;/p&gt;
&lt;p&gt;	Building Applications using Test Driven Development (TDD)&lt;br /&gt;
	By Elad Elrom Dramatic&lt;/p&gt;
&lt;p&gt;	Effect of Flex Library Linkage&lt;br /&gt;
	Level 300 By&lt;br /&gt;
	Yakov Fain&lt;/p&gt;
&lt;p&gt;	Reflex: Rethinking Component Design&amp;nbsp;&lt;br /&gt;
	Level 300 By Jacob and Tyler Wright&lt;/p&gt;
&lt;p&gt;	&lt;strong&gt;Social Activity&lt;/strong&gt;&lt;br /&gt;
	We will be both tweeting as much as we can from the conference and sessions. Hit us up if you would like to discuss our session or any other session in more details. We love meeting new techies!&lt;/p&gt;
&lt;p&gt;	Aaron Pedersen - &lt;a href=&quot;http://www.twitter.com/aaronpedersen&quot; target=&quot;_blank&quot;&gt;@aaronpedersen&lt;/a&gt;&lt;br /&gt;
	James Polanco - &lt;a href=&quot;http://www.twitter.com/jamespolanco&quot; target=&quot;_blank&quot;&gt;@jamespolanco&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;	Also don&amp;rsquo;t forget to follow 360|Flex for news and updates as we approach the and throughout the conference.&lt;/p&gt;
&lt;p&gt;	360|Flex - &lt;a href=&quot;http://www.twitter.com/360flex&quot; target=&quot;_blank&quot;&gt;@360flex&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;	&lt;strong&gt;Wrap Up&lt;/strong&gt;&lt;br /&gt;
	If you are thinking about attending 360|Flex you should book your tickets soon. Last time the conference was held in San Jose it was sold out. This year the conference has parties every night giving you a chance to mingle with the community at large. There are over 40 sessions, 2 panels, and your ticket includes hands on training sessions for all levels on the Sunday before the conference begins. Also, if you are new to Flex, you can take an all day Flex 101 course (one of the hands on training sessions) and be ready for regular sessions on Monday. Speakers include a wide assortment of Adobe engineers and communities leaders. For a full list check out the following site &lt;a href=&quot;http://www.360flex.com/blog/category/the-speakers&quot; target=&quot;_blank&quot;&gt;http://www.360flex.com/blog/category/the-speakers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;	&lt;a href=&quot;http://360flex-developmentarc.eventbrite.com&quot; target=&quot;_blank&quot;&gt;Register here&lt;/a&gt;. We hope to see you there!&lt;/p&gt;
</description>
     <comments>http://www.developmentarc.com/site/2010/02/developmentarc-360flex#comments</comments>
 <category domain="http://www.developmentarc.com/site/category/categories/actionscript-3">ActionScript 3</category>
 <category domain="http://www.developmentarc.com/site/category/categories/conferences">Conferences</category>
 <category domain="http://www.developmentarc.com/site/category/categories/news">News</category>
 <pubDate>Thu, 18 Feb 2010 07:19:43 +0000</pubDate>
 <dc:creator>Aaron Pedersen</dc:creator>
 <guid isPermaLink="false">41 at http://www.developmentarc.com/site</guid>
  </item>
  <item>
    <title>Merging Fonts When Embedding</title>
    <link>http://www.developmentarc.com/site/2009/11/merging-fonts-when-embedding</link>
    <description>&lt;p&gt;I found an interesting trick with embedding fonts today while working with the Text Flow engine in Flex 4.&amp;nbsp; What I found out is that you can embed multiple fonts under the same font family name, but set the properties such as font weight or font style to different settings based on the font source you are using.&amp;nbsp; This may be an obvious thing to a lot of people, and the property name &amp;#39;font-family&amp;#39; makes a lot more sense now, but for me it was a real &amp;#39;ah-ha&amp;#39; moment.&amp;nbsp; By the way, this isn&amp;#39;t just a Flex 4 thing, you can do this with Flex 3 and probably AS3 only projects (haven&amp;#39;t tried that yet) but the issue became more apparent in Flex 4&amp;#39;s new TLF enabled components.&lt;/p&gt;
&lt;p&gt;	The problem came about because we have a set of fonts that provide each style type in a unique OTF file, i.e. Font-Regular.otf, Font-Bold.otf, Font-Italic.otf, and Font-BoldItalic.otf.&amp;nbsp; In the past, we just embedded this with unique font-family ids (font-family: &amp;quot;Font-Regular&amp;quot;) and then just bound them via CSS.&amp;nbsp; This approach becomes a significant problem when starting to work with TLF&amp;#39;s selection management and Text Format.&amp;nbsp; We are building a simple Rich Text Editor in Flex 4 (since its not available yet in Beta 2) to allow a user to set their text to bold, italic or underline.&amp;nbsp; Simple enough, right?&lt;/p&gt;
&lt;p&gt;	Well, its not so simple when you have your font styles spread across font identifiers. The way we started to handle this is that when the user selected some text and applied Bold, we would set the text format&amp;#39;s font family for the selection to &amp;quot;Font-Bold&amp;quot;. To enable the ability to toggle the style, we would ask for the selection ranges format, look to see what the font family is and then toggle it to either bold or normal.&amp;nbsp; Now, let&amp;#39;s say that the user selects a section of text that mixes bold and normal text.&amp;nbsp; When you get the text format back, the font family property is set to undefined, letting you know that you have a mixed set.&lt;/p&gt;
&lt;p&gt;	In the bold/normal case this is easy to solve, but let&amp;#39;s say that you have bold, normal and italic text in the selection.&amp;nbsp; Because the property is undefined we can&amp;#39;t determine this nor can we just apply the new style across the entire selection because you would remove the italic (in the case of applying bold).&amp;nbsp; At this point I was getting kind of upset because the solution wasn&amp;#39;t sounding pretty.&amp;nbsp; We were looking at having to loop through the selection, grabbing the leafs and then looking at the format to determine the correct selection.&amp;nbsp; I was going to punt on it as a bug for now and move on.&lt;/p&gt;
&lt;p&gt;	This morning, while making coffee I thought about the fact that the key for the CSS font embed is font-family, and that when using @font-face that you can actually set things such as font-weight.&amp;nbsp; What I found out is that you can embed different sources under the same name as long as they have different style properties:&lt;/p&gt;
&lt;p&gt;@font-face {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; src: url(&amp;quot;./assets/fonts/Font-Regular.otf&amp;quot;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-family: MyFont;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;@font-face {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; src: url(&amp;quot;./assets/fonts/Font-Bold.otf&amp;quot;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-family: MyFont;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-weight: bold;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;@font-face {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; src: url(&amp;quot;./assets/fonts/Clean UI/Font-Italic.otf&amp;quot;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-family: MyFont;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-style: italic;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;@font-face {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; src: url(&amp;quot;./assets/fonts/Font-BoldItalic.otf&amp;quot;);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-family: MyFont;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-weight: bold;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-style: italic;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;	Now I can treat the font as the same family and then toggle the style properties, such as font-weight or font-style without having any font conflict.&amp;nbsp; This fixes the Text Format issue and also allows for a much cleaner/consistent CSS file.&amp;nbsp; I am sure this is explained somewhere (probably in the documents, clear as day), but I never knew that you could do this... hope it helps!&lt;/p&gt;
</description>
     <comments>http://www.developmentarc.com/site/2009/11/merging-fonts-when-embedding#comments</comments>
 <category domain="http://www.developmentarc.com/site/category/categories/actionscript-3">ActionScript 3</category>
 <category domain="http://www.developmentarc.com/site/category/categories/air">AIR</category>
 <category domain="http://www.developmentarc.com/site/category/categories/flex">Flex</category>
 <category domain="http://www.developmentarc.com/site/category/categories/knowledge-center">Knowledge Center</category>
 <pubDate>Tue, 24 Nov 2009 17:27:13 +0000</pubDate>
 <dc:creator />
 <guid isPermaLink="false">40 at http://www.developmentarc.com/site</guid>
  </item>
  <item>
    <title>Flash Player Internals 10.1 Recap (part four)</title>
    <link>http://www.developmentarc.com/site/2009/10/flash-player-internals-101-recap-part-four</link>
    <description>&lt;p&gt;In part one of the Flash Player Internals recap we covered &lt;a href=&quot;http://www.developmentarc.com/site/2009/10/flash-player-internals-101-recap-part-one/&quot; target=&quot;_self&quot; title=&quot;Read part one of Flash Player Internals 10.1&quot;&gt;how the player is built&lt;/a&gt;, in part two we talked about how the &lt;a href=&quot;http://www.developmentarc.com/site/2009/10/flash-player-internals-101-recap-part-two/&quot; target=&quot;_self&quot; title=&quot;Read part two of Flash Player Internals 10.1&quot;&gt;player infrastructure works&lt;/a&gt;, in part three we examined how &lt;a href=&quot;http://www.developmentarc.com/site/2009/10/flash-player-internals-101-recap-part-three/&quot; target=&quot;_self&quot; title=&quot;Read part three of Flash Player Internals 10.1&quot;&gt;ActionScript and the Virtual Machine (VM) are improvin&lt;/a&gt;&lt;a href=&quot;http://www.developmentarc.com/site/2009/10/flash-player-internals-101-recap-part-three/&quot; target=&quot;_self&quot; title=&quot;Read part three of Flash Player Internals 10.1&quot;&gt;g&lt;/a&gt; in Flash Player 10.1.&amp;nbsp; Now, in the final segment (looking at my notes this will be the longest segment) we will look at how the Flash Player rendering system is being improved and how you can leverage it for multiple devices.&lt;/p&gt;
&lt;p&gt;	&lt;strong&gt;Shake Your Movie-maker&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;	One of the biggest changes in player 10.1 is that all video will now be GPU decoded.&amp;nbsp; This is huge for you video buffs out there because GPU decoding is sick fast and allows lower power devices, like netbooks, to play 1080p video smoothly and efficiently.&amp;nbsp; In the current player, video is decoded using a software based decoder (except in fullscreen, when GPU may be used, but not guaranteed) which is fine when you are on a big 8 core beast, but little machines just can&amp;#39;t handle the data.&lt;/p&gt;
&lt;p&gt;	Now, with a change this big there has to be a few caveats.&amp;nbsp; Well, there is.&amp;nbsp; First, your GPU has to support H.264 decoding in the chipset.&amp;nbsp; If your GPU (ex: video card) doesn&amp;#39;t support that, then you are out of luck and the Player will fall back to software decoding.&amp;nbsp; Next, your GPU and GPU drivers have to be certified for the Player to use it.&amp;nbsp; If you have an older driver that is not certified it won&amp;#39;t matter if your chipset supports H.264 or not, the Player won&amp;#39;t leverage it.&lt;/p&gt;
&lt;p&gt;	Having the chipset/driver pair white-listed for the Player means that Adobe has to work closely with the manufactures to verify the certification process.&amp;nbsp; Adobe has partnered with all the major manufactures for this process, but this means that we still have a few years before everyone can leverage GPU acceleration.&amp;nbsp; The good news is that mobile devices turn over faster, and pretty much all of the newest devices meet the Player&amp;#39;s requirements today.&lt;/p&gt;
&lt;p&gt;	Another issue is that existing video may need to be re-encoded to allow for GPU acceleration.&amp;nbsp; This issue is created because the H.264 codec version that is used to encode the video must be supported by the GPU/driver combination.&amp;nbsp; Lee recommends that you use H.264 main or baseline codecs because this will guarantee that all GPUs that meet the certification process will be able to render your video.&amp;nbsp; If your videos were not encoded with main or baseline, then you may have to re-encode the video for GPU support.&lt;/p&gt;
&lt;p&gt;	So, how can you tell if the user can support GPU rendering or not?&amp;nbsp; At the moment, you can&amp;#39;t.&amp;nbsp; The Player team is looking at this and they want it for 10.1 but there is a chance that this will not be exposed for the 10.1 release.&amp;nbsp; GPU detection is coming, they will support it, but its up in the air for when the Player will enable this.&lt;/p&gt;
&lt;p&gt;	Finally, GPU support will be enabled for all wmodes.&amp;nbsp; For those of you that where in attendance for the 2008 Flash Player Internals session, Jim and Lee discussed that only one wmode may be supported in the future.&amp;nbsp; Well, Lee lost the argument and all browser wmodes will support GPU rendering (as long as you meet the previously discussed requirements).&lt;/p&gt;
&lt;p&gt;	&lt;strong&gt;Picture This&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;	There has been a lot of work done in 10.1 for how the player handles images.&amp;nbsp; Images take up a LOT of memory, and updating how images are managed was one of the keys to getting the memory footprint of applications down, without having the developer change code.&amp;nbsp; For example, the player now handles image instances much better, and allows image reuse without having to copy them. This is an issue, because if you are trying to show the same image multiple times (skins, etc.) the current player would copy the instance for each one on screen.&amp;nbsp; Now, Player 10.1 can leverage the same instance in memory for rendering.&amp;nbsp; Hot!&lt;/p&gt;
&lt;p&gt;	The Player now allows you, the developer, to determine when an image is decompressed.&amp;nbsp; Currently, when the Player loads a JPEG, it is decompressed right there and then.&amp;nbsp; This becomes an issue because the decompressed image takes up significantly more memory, even if you are not using it yet.&amp;nbsp; This becomes a serious challenge when you are trying to pre-load/cache images but aren&amp;#39;t ready to show them yet.&amp;nbsp; In Player 10.1 you will have the ability to tell the Player to load the JPEG, but not to decompress it.&amp;nbsp; This allows for a much better memory management experience within your applications. Lee also mentioned that images that are not being used will now be thrown away.&amp;nbsp; It sounds like the Player would hold on to unused images longer then needed and this is probably one of the many GC tuning issues that we talked about in part three.&lt;/p&gt;
&lt;p&gt;	For you 3D junkies out there, Player 10.1 supports &lt;a href=&quot;http://en.wikipedia.org/wiki/Mip-mapping&quot; target=&quot;_blank&quot; title=&quot;Learn about Mip-Mapping&quot;&gt;direct mip-mapping&lt;/a&gt;.&amp;nbsp; I am not a 3D guru by any stretch of the imagination, most of my 3D experience was back with Director 8 and 3D Studio Max.&amp;nbsp; So, here are my notes from what Lee said, and if you have a better understanding of mip-mapping feel free to chime in.&amp;nbsp; Lee stated that unused memory is now managed when using mip-mapping, it is extremely efficient with 16-bit images and now it only decodes/renders what is seen, which makes a lot of sense when your read the Wikipedia article on mip-mapping.&lt;/p&gt;
&lt;p&gt;	&lt;strong&gt;Vectorize Me!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;	Player 10.1 will support GPU vector rendering on mobile platforms.&amp;nbsp; This new engine fully replaces the software rendering of vector graphics and moves the process over the GPU.&amp;nbsp; The issue is that this only works well when the GPU is faster then the CPU.&amp;nbsp; In most desktop environments, this is never the case so this feature is really a mobile only solution.&amp;nbsp; The reason this is great for mobile is that in today&amp;#39;s devices the GPU is significantly faster then the CPU for rendering out Vector graphics.&lt;/p&gt;
&lt;p&gt;	&lt;strong&gt;Why So Slow?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;	Lee had a few recommendations about improving general performance in Flash Player based applications.&amp;nbsp; First, use ActionScript 3 and strong type everything.&amp;nbsp; Using AS2, Generic objects, marking everything * and/or Dynamic based Classes do not perform nearly as well as strong typing and sealed Classes.&amp;nbsp; Use the AVM2 to your advantage and take the time to type. Another tip is to avoid using intervals (timers) when ever possible and don&amp;#39;t rush to setting high frame rates.&amp;nbsp; One of the oldest tricks in the Flash book is to crank up your frame rate to &amp;quot;11&amp;quot; (i.e. 100+ frames per second).&amp;nbsp; This strong arming technique used to work but now the AVM and the way it processes frame intervals won&amp;#39;t gain you the same benefits as before, in fact in may actually hurt performance.&amp;nbsp; Really take the time to &lt;a href=&quot;http://www.craftymind.com/2008/04/18/updated-elastic-racetrack-for-flash-9-and-avm2/&quot; target=&quot;_blank&quot; title=&quot;No really, this is important information&quot;&gt;understand the elastic racetrack concept&lt;/a&gt; and build your application with this in mind.&lt;/p&gt;
&lt;p&gt;	&lt;strong&gt;You Want Me To Display What?!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;	When building mobile/handheld based applications, understanding the display list is critical.&amp;nbsp; As developers, especially Flex developers, we get a little nest happy.&amp;nbsp; HBoxes, within VBoxes, within Canvases, etc.&amp;nbsp; This becomes a HUGE problem with mobile devices.&amp;nbsp; Everytime the user interacts with the app the display list has to be traversed and this just kills the CPU.&amp;nbsp; To prevent this, try to keep the display list as flat and as small as possible.&amp;nbsp; If you don&amp;#39;t have to nest it, don&amp;#39;t, if you can render it as one Sprite, do!&amp;nbsp; Keep your numbers down and this will make your app perform much better.&lt;/p&gt;
&lt;p&gt;	What this all boils down to is that the utopia of one application on multiple devices is really not tangible.&amp;nbsp; When building an app, you have to understand the target platform/device you are building to.&amp;nbsp; What is the target devices resolution, pixel depth, GPU speed, CPU speed, memory limitations and capabilities.&amp;nbsp; When building mobile applications, what is the cause of any performance issues? Is your display list too deep, are you rendering video correctly or vectors?&amp;nbsp; Is your content truly optimized for your device?&lt;/p&gt;
&lt;p&gt;	Flash Player 10.1 is giving us a lot of great tools and features to allow us to apply our skills to new and uncharted realms, but with any tool we have to understand what it is good for and how we should use it.&amp;nbsp; I am really excited to see what doors 10.1 opens for developers but I can already foresee some of the challenges we will face.&amp;nbsp; I think that is why I really enjoy Lee&amp;#39;s sessions because he helps layout a lot of the new features of the player but he also points out trouble spots that these new abilities can create, before you may stumble upon them yourself.&lt;/p&gt;
</description>
     <comments>http://www.developmentarc.com/site/2009/10/flash-player-internals-101-recap-part-four#comments</comments>
 <category domain="http://www.developmentarc.com/site/category/categories/conferences">Conferences</category>
 <category domain="http://www.developmentarc.com/site/category/categories/knowledge-center">Knowledge Center</category>
 <category domain="http://www.developmentarc.com/site/category/categories/news">News</category>
 <pubDate>Fri, 23 Oct 2009 17:26:28 +0000</pubDate>
 <dc:creator />
 <guid isPermaLink="false">39 at http://www.developmentarc.com/site</guid>
  </item>
  </channel>
</rss>