<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1843365659011037590</id><updated>2011-11-27T18:12:43.715-08:00</updated><category term='Adobe'/><category term='MAX'/><category term='Mapper'/><category term='Cocomo'/><category term='travel'/><category term='Dev Summit'/><category term='Google Wave'/><category term='Huntsville'/><category term='ASDoc'/><category term='Flex'/><category term='Flex 4'/><category term='Flex Unit'/><category term='Holistic Lab'/><category term='Flex API'/><category term='maps'/><category term='Security'/><category term='Unit Testing'/><category term='google'/><category term='ESRI'/><category term='FlashVars'/><title type='text'>I R Spatial</title><subtitle type='html'>Life as a GIS software developer can be interesting...I promise.  I work with ESRI technology, building applications which use their apis.  I use various technologies on a daily basis: C#, Flex, Oracle, SQL Server, Javascript, you name it, we've probably tried it.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-7211488888778393221</id><published>2009-11-11T11:48:00.000-08:00</published><updated>2009-11-11T11:58:37.128-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex 4'/><title type='text'>Creating in Memory BitMaps from a single image file.</title><content type='html'>I found this today while looking up information on the new Flex 4 Layout classes.  &lt;a href="http://www.ryancampbell.com/flex/Flex4Layouts/Flex4Layouts.html"&gt;This guy&lt;/a&gt; has a single .png file with a bunch of cards on it that he wants to use as individual images in his application.  I was pretty impressed with the code, mainly because I had never really thought about it and it's an easy solution.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="ActionScriptReserved"&gt;protected&lt;/span&gt; &lt;span class="ActionScriptfunction"&gt;function&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;application1_creationCompleteHandler&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;event&lt;/span&gt;:&lt;span class="ActionScriptDefault_Text"&gt;FlexEvent&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;:&lt;span class="ActionScriptReserved"&gt;void&lt;/span&gt;&lt;br /&gt;&lt;span class="ActionScriptBracket/Brace"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class="ActionScriptDefault_Text"&gt;loader&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;=&lt;/span&gt; &lt;span class="ActionScriptReserved"&gt;new&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;Loader&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;;&lt;br /&gt;  &lt;span class="ActionScriptDefault_Text"&gt;loader&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;.&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;contentLoaderInfo&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;.&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;addEventListener&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;Event&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;.&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;COMPLETE&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;,&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;loaderComplete&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;;&lt;br /&gt;  &lt;span class="ActionScriptDefault_Text"&gt;loader&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;.&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;load&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptReserved"&gt;new&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;URLRequest&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptString"&gt;"cards.png"&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span class="ActionScriptBracket/Brace"&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;&lt;span class="ActionScriptASDoc"&gt;/**&lt;br /&gt;* Extract each card in the deck into their own object&lt;br /&gt;* The object includes a label (rank of suit) and a Bitmap image of the card&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class="ActionScriptReserved"&gt;protected&lt;/span&gt; &lt;span class="ActionScriptfunction"&gt;function&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;loaderComplete&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;event&lt;/span&gt;:&lt;span class="ActionScriptDefault_Text"&gt;Event&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;:&lt;span class="ActionScriptReserved"&gt;void&lt;/span&gt;&lt;br /&gt;&lt;span class="ActionScriptBracket/Brace"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class="ActionScriptvar"&gt;var&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;suitsIdx&lt;/span&gt;:&lt;span class="ActionScriptDefault_Text"&gt;Number&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;=&lt;/span&gt; 0;&lt;br /&gt;  &lt;span class="ActionScriptvar"&gt;var&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;ranksIdx&lt;/span&gt;:&lt;span class="ActionScriptDefault_Text"&gt;Number&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;=&lt;/span&gt; 0;&lt;br /&gt;  &lt;span class="ActionScriptvar"&gt;var&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;cardWidth&lt;/span&gt;:&lt;span class="ActionScriptDefault_Text"&gt;Number&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;=&lt;/span&gt; 79;&lt;br /&gt;  &lt;span class="ActionScriptvar"&gt;var&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;cardHeight&lt;/span&gt;:&lt;span class="ActionScriptDefault_Text"&gt;Number&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;=&lt;/span&gt; 123;&lt;br /&gt;  &lt;span class="ActionScriptvar"&gt;var&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;a&lt;/span&gt;:&lt;span class="ActionScriptDefault_Text"&gt;Array&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;=&lt;/span&gt; [];&lt;br /&gt;  &lt;span class="ActionScriptvar"&gt;var&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;img&lt;/span&gt;:&lt;span class="ActionScriptDefault_Text"&gt;BitmapData&lt;/span&gt;;&lt;br /&gt;        &lt;br /&gt;  &lt;span class="ActionScriptvar"&gt;var&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;d&lt;/span&gt;:&lt;span class="ActionScriptDefault_Text"&gt;BitmapData&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;=&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;Bitmap&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;loader&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;.&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;content&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;.&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;bitmapData&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;  &lt;span class="ActionScriptReserved"&gt;for&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptvar"&gt;var&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;i&lt;/span&gt;:&lt;span class="ActionScriptDefault_Text"&gt;int&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;=&lt;/span&gt; 0; &lt;span class="ActionScriptDefault_Text"&gt;i&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;&lt;&lt;/span&gt; 52; &lt;span class="ActionScriptDefault_Text"&gt;i&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;++&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="ActionScriptBracket/Brace"&gt;{&lt;/span&gt;&lt;br /&gt;     &lt;span class="ActionScriptDefault_Text"&gt;img&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;=&lt;/span&gt; &lt;span class="ActionScriptReserved"&gt;new&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;BitmapData&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;cardWidth&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;,&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;cardHeight&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;;&lt;br /&gt;     &lt;span class="ActionScriptDefault_Text"&gt;img&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;.&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;copyPixels&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;d&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;,&lt;/span&gt; &lt;span class="ActionScriptReserved"&gt;new&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;Rectangle&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;ranksIdx&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;*&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;cardWidth&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;,&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;suitsIdx&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;*&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;&lt;br /&gt;         cardHeight&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;,&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;cardWidth&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;,&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;cardHeight&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;,&lt;/span&gt; &lt;span class="ActionScriptReserved"&gt;new&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;Point&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; 0&lt;span class="ActionScriptOperator"&gt;,&lt;/span&gt; 0 &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;;&lt;br /&gt;     &lt;span class="ActionScriptDefault_Text"&gt;img&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;.&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;draw&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;img&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;,&lt;/span&gt; &lt;span class="ActionScriptReserved"&gt;new&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;Matrix&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;;&lt;br /&gt;     &lt;span class="ActionScriptDefault_Text"&gt;a&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;.&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;push&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptReserved"&gt;new&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;Bitmap&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;img&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;;&lt;br /&gt;            &lt;br /&gt;     &lt;span class="ActionScriptReserved"&gt;if&lt;/span&gt; &lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;i&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;==&lt;/span&gt; 12 &lt;span class="ActionScriptOperator"&gt;||&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;i&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;==&lt;/span&gt; 25 &lt;span class="ActionScriptOperator"&gt;||&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;i&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;==&lt;/span&gt; 38 &lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;&lt;br /&gt;     &lt;span class="ActionScriptBracket/Brace"&gt;{&lt;/span&gt;                    &lt;br /&gt;          &lt;span class="ActionScriptDefault_Text"&gt;suitsIdx&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;++&lt;/span&gt;;&lt;br /&gt;          &lt;span class="ActionScriptDefault_Text"&gt;ranksIdx&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;=&lt;/span&gt; 0;&lt;br /&gt;     &lt;span class="ActionScriptBracket/Brace"&gt;}&lt;/span&gt;&lt;br /&gt;     &lt;span class="ActionScriptReserved"&gt;else&lt;/span&gt;&lt;br /&gt;     &lt;span class="ActionScriptBracket/Brace"&gt;{&lt;/span&gt;&lt;br /&gt;          &lt;span class="ActionScriptDefault_Text"&gt;ranksIdx&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;++&lt;/span&gt;;&lt;br /&gt;     &lt;span class="ActionScriptBracket/Brace"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class="ActionScriptBracket/Brace"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;  &lt;span class="ActionScriptDefault_Text"&gt;list&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;.&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;dataProvider&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;=&lt;/span&gt; &lt;span class="ActionScriptReserved"&gt;new&lt;/span&gt; &lt;span class="ActionScriptDefault_Text"&gt;ArrayCollection&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;(&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;a&lt;/span&gt;&lt;span class="ActionScriptBracket/Brace"&gt;)&lt;/span&gt;;&lt;br /&gt;  &lt;span class="ActionScriptDefault_Text"&gt;list&lt;/span&gt;&lt;span class="ActionScriptOperator"&gt;.&lt;/span&gt;&lt;span class="ActionScriptDefault_Text"&gt;selectedIndex&lt;/span&gt; &lt;span class="ActionScriptOperator"&gt;=&lt;/span&gt; 25;&lt;br /&gt;&lt;span class="ActionScriptBracket/Brace"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-7211488888778393221?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/7211488888778393221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=7211488888778393221' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/7211488888778393221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/7211488888778393221'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2009/11/creating-in-memory-bitmaps-from-single.html' title='Creating in Memory BitMaps from a single image file.'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-6256962287966726990</id><published>2009-11-06T11:04:00.000-08:00</published><updated>2009-11-06T11:14:33.287-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mapper'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Wave'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Getting Behind!</title><content type='html'>Wow I've really fallen off of keeping updates on here.  It's been really busy here at 3-GIS over the past six or so months.  We're doing a ton of extensions for our base product and continuing to push our Flex applications to do more than nature intended. &lt;br /&gt;&lt;br /&gt;One of the cool things we've done in recent months is release a product called Mapper in a joint venture with another company.  You can check it out here &lt;a href="http://www.tucuxisoftware.com/"&gt;tucuxisoftware.com&lt;/a&gt; just don't ask me to explain the company name.&lt;br /&gt;&lt;br /&gt;I think I dropped off the blog updates when I switched over my main development machine to a Mac.  I got busy at that point figuring out everything about it and lost track of doing updates. &lt;br /&gt;&lt;br /&gt;In the Adobe world this month's user group meeting we talked about Photoshop to Catalyst to Flash Builder.  You can find the post about it &lt;a href="http://groups.adobe.com/posts/dad6c76179"&gt;here&lt;/a&gt;.  You may have to be a member to see it, let me know if anyone has any issues.&lt;br /&gt;&lt;br /&gt;The other hot topic right now is Google Wave!  I've been playing around with it for the last couple of weeks.  I'm still not sure what the total value of it is going to be.  If anyone is reading this and would like an invite just let me know.  I have 10 invites open to the first 10 people to comment here!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-6256962287966726990?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/6256962287966726990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=6256962287966726990' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/6256962287966726990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/6256962287966726990'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2009/11/getting-behind.html' title='Getting Behind!'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-7193785899266062004</id><published>2009-03-16T11:15:00.000-07:00</published><updated>2009-03-16T11:40:29.978-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FlashVars'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>FlashVars</title><content type='html'>I'm currently overseeing a project where our main application is being embedded into another web application.  As part of this we needed to be able to pass information from an external source into our app, so we turned to Flash Vars.  I'm not going to lie, it was a pain in the butt to figure out how to get them to work.  I looked at a number of different examples, all of which failed, before I finally found one that steered me in the right direction, and even it had me doing edits in two or three places that were not necessary.  In the end it was pretty simple (of course).  Just open up your index.template.html for your application.  You are going to edit the AC_FL_RunContent, but be careful because it's in two places, one for if the client didn't have the right flash player and one (the second one) for if they did.  You need to edit this second one.  Mine ended up looking something like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;AC_FL_RunContent(&lt;br /&gt;            "src", "${swf}",&lt;br /&gt;            "width", "${width}",&lt;br /&gt;            "height", "${height}",&lt;br /&gt;            "align", "middle",&lt;br /&gt;            "id", "${application}",&lt;br /&gt;            "quality", "high",&lt;br /&gt;            "bgcolor", "${bgcolor}",&lt;br /&gt;            "name", "${application}",&lt;br /&gt;            "allowScriptAccess","sameDomain",&lt;br /&gt;            "type", "application/x-shockwave-flash",&lt;br /&gt;            "pluginspage", "http://www.adobe.com/go/getflashplayer",&lt;br /&gt;            "FlashVars", "MyToken="+token+"&amp;amp;a="+aVariable+"&amp;amp;b="+bVariable+""&lt;br /&gt;    );&lt;/blockquote&gt;Then to access the Flash Vars from Flex:&lt;br /&gt;&lt;br /&gt;                &lt;blockquote&gt;var paramObj:Object = Application.application.parameters;&lt;br /&gt;&lt;br /&gt;                var mapperToken:String = paramObj.MyToken;&lt;br /&gt;                var outsideA:String = paramObj.a;&lt;br /&gt;                var outsideB:String = paramObj.b;&lt;/blockquote&gt;And that was it.  I of course check to make sure none of them are null etc. so that the application can still work stand alone.  All in all it was a ton of ferreting around for the information and easy to do once I found this.  Hope it helps someone else out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-7193785899266062004?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/7193785899266062004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=7193785899266062004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/7193785899266062004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/7193785899266062004'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2009/03/flashvars.html' title='FlashVars'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-93420039675131980</id><published>2009-01-28T10:52:00.000-08:00</published><updated>2009-01-28T10:55:03.800-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex 3 for Education</title><content type='html'>Sorry no updates for a while on here.  Listening to the Tech Wednesday for the Flex SDK today though they said a couple of things that I thought were worth posting on. &lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Flex 4 will be delivered in Q4 of 2009 with open beta in the second quarter.&lt;/li&gt;&lt;li&gt;Adobe gives Flex Builder 3 Profesional away to students, faculty, and any employees!&lt;/li&gt;&lt;/ol&gt;Get that free Flex Builder &lt;a href="https://freeriatools.adobe.com/flex/"&gt;here&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-93420039675131980?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/93420039675131980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=93420039675131980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/93420039675131980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/93420039675131980'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2009/01/flex-3-for-education.html' title='Flex 3 for Education'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-906722077715241630</id><published>2008-12-12T06:45:00.000-08:00</published><updated>2008-12-12T06:48:37.466-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex API'/><category scheme='http://www.blogger.com/atom/ns#' term='ESRI'/><title type='text'>Adobe + ESRI = LOVE?</title><content type='html'>Bouncing around the Adobe site this morning I came across a large 'Now developing on Flex' area with the ESRI logo as one of those listed.  &lt;a href="http://www.adobe.com/cfusion/showcase/index.cfm?event=casestudydetail&amp;amp;casestudyid=343143&amp;amp;loc=en_us"&gt;This &lt;/a&gt;article was linked and includes excerpts from an interview with Mansour Raad of the ESRI Flex API team among others.  It's an nice to know that Adobe has taken notice of all the interest from the GIS community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-906722077715241630?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/906722077715241630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=906722077715241630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/906722077715241630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/906722077715241630'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/12/adobe-esri-love.html' title='Adobe + ESRI = LOVE?'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-7110985081467559610</id><published>2008-11-25T07:30:00.000-08:00</published><updated>2008-11-25T07:48:06.599-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Working with data in Flex</title><content type='html'>This session was led by James Ward.  I was somewhat familiar with him having found a couple of interesting posts on his blog in the past about easing functions in Flex.  He focused mainly on what you should use to store and move your data under different circumstances.  He briefly discussed the &lt;a href="http://flex.org/tour"&gt;Tour de Flex&lt;/a&gt; AIR application which everyone in the session was given a copy of on a nice 1gb thumb drive.  Tour de Flex shows how to use a myriad of components, both built in Flex components and third party ones.  I was of course interested in playing with the mapping APIs included from Google, MapQuest and Yahoo Maps. &lt;br /&gt;&lt;br /&gt;Next we talked about different ways to send your data over the wire from the server to the client.  James has a great Flex &lt;a href="http://www.jamesward.com/census/"&gt;application &lt;/a&gt;available online which allows you to test out all of the different options.  Of course AMF (Remote Objects) was basically the fastest.  It did seem to get beaten by Data Services using Flex Paging though, but that's what you pay for with Blaze DS I suppose.  The application is quite nice and allows you to send rows across from a server side database.&lt;br /&gt;&lt;br /&gt;He followed that presentation by giving a few other examples that boil down to things to be careful of when dealing with large amounts of data.  With XML there is a memory overhead which can become significant with large amounts of data and can cause performance issues. &lt;br /&gt;&lt;br /&gt;For AMF (surely nothing is bad about AMF!  It's a binary, no parsing required, way to send data!) he said to watch out for circular references and the overhead you accept for the use of binding.  Sounds like a no big deal thing to me but maybe Adobe pays him to get people to consider buying Blaze DS?&lt;br /&gt;&lt;br /&gt;One last thing he talked about was something I had assumed but never really quantified.  He built a quick Flex application which loaded 100,000 objects into an Array and the same objects into an ArrayCollection.  It took the Array a mere 100 milliseconds to complete where the ArrayCollection took 1.4 seconds!  So if you are dealing with large amounts of data and want your application to be fast, watch out for those ArrayCollections.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-7110985081467559610?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/7110985081467559610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=7110985081467559610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/7110985081467559610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/7110985081467559610'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/11/working-with-data-in-flex.html' title='Working with data in Flex'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-1930048248702267097</id><published>2008-11-24T14:21:00.001-08:00</published><updated>2008-11-24T14:37:56.084-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='MAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><title type='text'>Flash Security Model</title><content type='html'>We all know that security is one of the most important parts of any enterprise solution.  That said, it's also dead boring.  Deneb Meketa led this session and opened with a line very similar to that so I don't feel bad saying it.  Before I get into some of what we went over in this session &lt;a href="http://link.brightcove.com/services/link/bcpid1691027859/bctid2479288001"&gt;here&lt;/a&gt; is a nice video that overviews the first day and general session.&lt;br /&gt;&lt;br /&gt;Now that you're excited let's talk security.  In order to make this fairly brief I'm mainly going to just go over the five basic security rules Deneb gave us and if I think of anything for each of them I'll expound.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rule 1: Use least privilege&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When creating your cross domain files etc. never use an allowDomain="*".  It may be a bit of a pain to actually enumerate the domains allowed to access your stuff but it's much better than being hacked.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rule 2: Validate Input&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You never know what someone might try to stick into the stream as input so validate it on the client side &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; on the server side.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rule 3: Deploy HTTPS Consistently&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Don't mix HTTP and HTTPS.  All you will do is expose holes in your security.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rule 4: Prototype Early&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I thought this was an interesting rule for the Flash Security Model but as he explained a bit more it made perfect sense.  If you don't prototype early there may be something you plan on doing which simply isn't allowed within the Security Model.  If you prototype that stuff early and find out it won't work you may be able to find an easy way around it.  If you wait until the end it may be a nightmare.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rule 5: Keep Track of Security Changes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The last thing you want is the CEO walking up to you and saying, "Internet Explorer upgraded my Flash Player and now none of our stuff works.  What did you break?"  Believe me, I know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-1930048248702267097?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/1930048248702267097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=1930048248702267097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/1930048248702267097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/1930048248702267097'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/11/flash-security-model.html' title='Flash Security Model'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-7090593746442911239</id><published>2008-11-24T12:57:00.000-08:00</published><updated>2008-11-24T13:19:31.896-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><title type='text'>Tuesday General Session of MAX</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ab1lZbmeifw/SSsaF9GkAzI/AAAAAAAAAM4/FRCXHOIKFIA/s1600-h/Agency.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 147px;" src="http://1.bp.blogspot.com/_ab1lZbmeifw/SSsaF9GkAzI/AAAAAAAAAM4/FRCXHOIKFIA/s320/Agency.png" alt="" id="BLOGGER_PHOTO_ID_5272336478371054386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The General Session on Tuesday was led by Tim Buntell, the Sr. Product Manager for Flex Builder.  They walked through a &lt;span style="font-weight: bold;"&gt;lot&lt;/span&gt; of functionality with Tim as Agent B doing a James Bond inspired walk-thru the 'lab' to look at all of the cool new stuff.  It was definitely entertaining.&lt;br /&gt;&lt;br /&gt;There were a few things that really caught my attention (besides the James Bond theme) during this session.  One was &lt;a href="http://labs.adobe.com/technologies/alchemy/"&gt;Project Alchemy&lt;/a&gt;.  This technology allows you to take C/C++ code and recompile it into ActionScript!  Think of all that C/C++ code bouncing around the web that Flex developers can not&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ab1lZbmeifw/SSsaNa9ghkI/AAAAAAAAANA/YXHlofveqMo/s1600-h/Agent+B.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 223px;" src="http://3.bp.blogspot.com/_ab1lZbmeifw/SSsaNa9ghkI/AAAAAAAAANA/YXHlofveqMo/s320/Agent+B.png" alt="" id="BLOGGER_PHOTO_ID_5272336606645225026" border="0" /&gt;&lt;/a&gt; take advantage of!  They showed an example of a NES emulator running in Flash player as well as a Quake Player.  That was pretty awesome to see.  I can't wait to take advantage of some C/C++ code!&lt;br /&gt;&lt;br /&gt;Something else that I'm sure many people will be excited to hear is that there is an IDE coming out for Cold Fusion called &lt;a href="http://labs.adobe.com/wiki/index.php/Bolt"&gt;Bolt&lt;/a&gt;.  It will be built off of Eclipse just like Flex Builder and from the little they talked about it I think it will be a nice change for Cold Fusion developers.&lt;br /&gt;&lt;br /&gt;Now how is &lt;span style="font-style: italic;"&gt;this&lt;/span&gt; for a shell shocker: There is a new plugin for VS 2008 called &lt;a href="http://www.ensemble.com/products/tofino.html"&gt;Tofino&lt;/a&gt; that allows you to create Flex applications/front ends for your projects!  That's right, you can develop a Flex application in Visual Studio!  If anyone gives this a try please let me know.  It didn't seem to be that big of a deal to anyone at MAX but I think it was because most of them have never even used Visual Studio.  I'd like to hear how well it performs and integrates with a normal .NET workflow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-7090593746442911239?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/7090593746442911239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=7090593746442911239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/7090593746442911239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/7090593746442911239'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/11/tuesday-general-session-of-max.html' title='Tuesday General Session of MAX'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ab1lZbmeifw/SSsaF9GkAzI/AAAAAAAAAM4/FRCXHOIKFIA/s72-c/Agency.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-1961787620640710243</id><published>2008-11-24T12:18:00.000-08:00</published><updated>2008-11-24T12:31:50.764-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Intro to Thermo and Gumbo</title><content type='html'>My last session on Monday was about Thermo (Adobe Catalyst) and Gumbo (Flex 4) and was led by Ryan Stewart. &lt;br /&gt;&lt;br /&gt;This was a great session and he went over a ton of stuff that will be in Catalyst as well as going through an end to end example of taking a Photoshop file, importing it into Catalyst, marking up the parts as components, and then importing the resulting file into Flex as a project.  When you open a Photoshop file in catalyst and mark the different parts as components and insert your transistions etc. what gets saved is an fxp file.  This is basically just a zipped up flex project file!  This was a nice way to show the story they have developed for the use of the Adobe products and I have to admit I was blown away.&lt;br /&gt;&lt;br /&gt;Among other things of note, we were told that the first public beta would be in the first quarter of 2009.  There is a new merge tool for Flex Builder which allows you to pull changes in from Flex Catalyst which is nice if you have developers and designers working on a project at the same time.&lt;br /&gt;&lt;br /&gt;Something that really got me excited is the new Services Explorer in Fx.  It allows you to select remote objects you wish to use and automatically creates strongly typed classes for you!  That means you can treat them as normal objects (type checking and all) without having to go through it all on your own anymore.  I'm really excited about this since we use remote objects a great deal. &lt;br /&gt;&lt;br /&gt;Another nice addition to Fx is the Network Monitor which allows you to watch all network traffic between your Flex application and the Server.  They have also included Flex Unit Support which allows you to generate test suites and auto-generate unit tests for your code!  Of course you still have to fill in some of the actual test part but the skeleton is created for you.  This is going to make life for us at 3-GIS much better.&lt;br /&gt;&lt;br /&gt;One last thing he didn't spend much time on but which I'm interested in seeing is Templates.  Basically if there is a standard way you build out classes or functions you can now save these as templates (boiler plate code) and stamp them down wherever they are needed.  This could be a big time saver for anyone like us that uses a standard framework that requires a lot of the same basic code being written every time you add a new feature, screen or component.&lt;br /&gt;&lt;br /&gt;I would tell you how I've found working with these features so far but unfortunately the preview disc they gave us was for Mac only and I'm stuck with a Windows box.  The release for Windows though is supposed to be coming out early next year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-1961787620640710243?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/1961787620640710243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=1961787620640710243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/1961787620640710243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/1961787620640710243'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/11/intro-to-thermo-and-gumbo.html' title='Intro to Thermo and Gumbo'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-3012447049409496160</id><published>2008-11-21T11:53:00.000-08:00</published><updated>2008-11-22T05:56:56.264-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Cocomo'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><title type='text'>Real Time Collaboration Apps with Flex and Cocomo</title><content type='html'>Monday afternoon I was able to attend this session of MAX led by Nigel Pegg.  The first thing he mentioned is a free collaborative tool they have created using Cocomo called &lt;a href="http://www.adobe.com/acom/connectnow/"&gt;Connect Now&lt;/a&gt;.  It's a pretty durn nice piece of software especially for small/medium size companies and includes video/audio streaming capabilities.  Cocomo is described as a PaaS (Platform as a Service) built for real time collaboration.  The Cocomo SDK for Flex is designed to make it simple to share areas and inputs.  I have signed up for a developer license but haven't had a chance to really play with it yet.  I'll post back here about it once I have had a chance to do so.  They allow the sharing of inputs etc. with a Batton property, basically when someone has control of an input no one else can get access to it until they are finished.  Cocomo rooms (using the developer license) can be built to share user status, roles, webcams, VoIP (using the Speex Codec), documents, media etc.  It even allows direct client to client streaming as of flash 10.&lt;br /&gt;&lt;br /&gt;The Cocomo Dev Console (which is where you go once you sign in using your account) allows you to configure rooms, enter rooms, etc.  For more information go &lt;a href="http://adobe.com/go/cocomo"&gt;here&lt;/a&gt; and &lt;span style="font-style: italic;"&gt;read the FAQ!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-3012447049409496160?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/3012447049409496160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=3012447049409496160' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/3012447049409496160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/3012447049409496160'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/11/real-time-collaboration-apps-with-flex.html' title='Real Time Collaboration Apps with Flex and Cocomo'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-8773813262568645955</id><published>2008-11-21T09:18:00.000-08:00</published><updated>2008-11-21T09:44:40.585-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Looking Ahead at the Next Version of Flex</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ab1lZbmeifw/SSbuA0XhZOI/AAAAAAAAAMw/6-khWr51vnE/s1600-h/flex.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 200px;" src="http://1.bp.blogspot.com/_ab1lZbmeifw/SSbuA0XhZOI/AAAAAAAAAMw/6-khWr51vnE/s200/flex.png" alt="" id="BLOGGER_PHOTO_ID_5271162111708456162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This was the first regular session of MAX I attended.  It was led by &lt;a href="http://www.quietlyscheming.com/blog/"&gt;Ely Greenfield&lt;/a&gt; whose blog I check from time to time.  He was talking about Flex Gumbo (Flex 4) and to some degree Flex Catalyst (formerly known as Thermo). &lt;br /&gt;&lt;br /&gt;There are a lot of changes in Flex 4 which are necessary strictly for Catalyst to work correctly and he spent a large portion of time on them.  For those of you who don't know (and I didn't before this conference) Catalyst allows a designer to take a user interface they have mocked up in Photoshop, import it into Catalyst, mark parts as 'button' or 'scroll bar' and even set transitions and animations, and then save all of their changes as a Flex Project!  This means that developers can be handed a nice intuitive user interface and simply do what they do best, put in all of the business logic, without being worried about color schemes and glossy buttons. &lt;br /&gt;&lt;br /&gt;It also means that the designer can make changes to the UI at any time without having to bother the developer.  The designer simply reopens the project in Catalyst, makes the necessary changes, and saves them and the next time the developer opens his project the new UI will be in place without having bothered his code.&lt;br /&gt;&lt;br /&gt;All of this is accomplished via the new &lt;a href="http://labs.adobe.com/wiki/index.php/Gumbo:Whats_New_SDK"&gt;Spark Architecture&lt;/a&gt; from Adobe which basically divorces visual components from their data and behavior.  Don't worry about your old projects not working though because Adobe has created a new set of components (FxComponents) to take advantage of this new architecture, so all of the old components will still behave the same as always. &lt;br /&gt;&lt;br /&gt;The way this data is passed around adobe products (Photoshop, Catalyst, etc) is through a new interaction language called FXG, a graphics format based upon MXML, which all Adobe products can read. &lt;br /&gt;&lt;br /&gt;Flex Catalyst is a completely declaritive language (think mxml) and adds a few new metadata tages like SkinPart and SkinStates which help define things like parts of buttons and the states of those buttons. &lt;br /&gt;&lt;br /&gt;There is also a new MXML Graphics library containing things like Fill and Stroke.  These graphics objects are 1st class citizens in flex, making them usable just like any other object.  This includes a new GraphicElement which is a graphics base class created purely for the purpose of rendering graphics and improving performance.&lt;br /&gt;&lt;br /&gt;The new FlexText objects allow more liberties with text within a Flex application.  This includes fading and rotating among others.  Flex now has a very powerful ability to produce top quality text which is one of the reasons the NY Times is developing an AIR application.&lt;br /&gt;&lt;br /&gt;There has been an effort to make states easier to understand inside of MXML by putting an &lt;span style="font-style: italic;"&gt;inState &lt;/span&gt;property on components instead of the old state tree.  This is one case where you can &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; use new and old styles together.  A file must use one or the other.&lt;br /&gt;&lt;br /&gt;A number of other small changes were discussed, including that if you wish to add non-visual components to your mxml you can't simply add a &lt;mynonvisualcomponent/&gt; tag but must wrap it inside of a &lt;declerations/&gt; tag.  Otherwise non visual components will be left out.&lt;br /&gt;&lt;br /&gt;Other changes include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Container tag has changed to Group&lt;/li&gt;&lt;li&gt;List class is now DataGroup class/tag&lt;/li&gt;&lt;li&gt;3D effects now built in!  (FX:Rotate3D)&lt;/li&gt;&lt;li&gt;2-way data binding! (value='@{bindvalue}')&lt;/li&gt;&lt;li&gt;increased compiler performance! (2x-5x faster)&lt;/li&gt;&lt;/ul&gt;We were given a latest and up-to-datest copy of the new Flex Builder and Flex Catalyst but unfortunately it was for Mac only and those of us in the Windows world will have to carry on a bit longer (January or February) before we can play with both of these together.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-8773813262568645955?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/8773813262568645955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=8773813262568645955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/8773813262568645955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/8773813262568645955'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/11/looking-ahead-at-next-version-of-flex.html' title='Looking Ahead at the Next Version of Flex'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ab1lZbmeifw/SSbuA0XhZOI/AAAAAAAAAMw/6-khWr51vnE/s72-c/flex.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-5676434867959010073</id><published>2008-11-21T08:39:00.000-08:00</published><updated>2008-11-21T09:14:48.936-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Max 2008</title><content type='html'>So I got the chance to go to the Adobe MAX conference this year in San Francisco.  It was a Monday-Wednesday (November 17-19) affair in the downtown area of the city.  I've been to a number of different conferences at this point in my career but this one definitely stands out as unique.  The location was nice and it had all of the standard elements of a conference: general sessions, labs, lectures, swag, etc.&lt;br /&gt;&lt;br /&gt;The atmosphere however was a surprise to me.  Instead of your normal business conference atmosphere (think lots of stuffy old guys shuffling around a large room) it was more like Lollapalooza.  There were gaming stations (both console and computer) spread throughout the conference, lots of give-aways  like PS3s and notebook computers, and the average age of attendees had to be about 27.  There was also an interesting mix of Designers and Developers, two groups who don't traditionally walk in the same circles but it seemed to work just fine at MAX.&lt;br /&gt;&lt;br /&gt;The general session Monday started at 9:30 a.m.  Free breakfast started at 7 a.m. so naturally I got there at about 7:01  After I filled myself to capacity I went up to the third floor where the general session was going to be and figured I would get a good seat since I was almost an hour early.  I was told that the session didn't start until 9:30 however and so I couldn't come in.&lt;br /&gt;&lt;br /&gt;Thus began the wait.  At &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ab1lZbmeifw/SSboL56gNUI/AAAAAAAAAMg/rf7mpw1D1W0/s1600-h/generalsession1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 162px;" src="http://4.bp.blogspot.com/_ab1lZbmeifw/SSboL56gNUI/AAAAAAAAAMg/rf7mpw1D1W0/s320/generalsession1.png" alt="" id="BLOGGER_PHOTO_ID_5271155705106150722" border="0" /&gt;&lt;/a&gt;about 9:32 a.m. they finally let the stampede of five thousand of us through the doors.  I'm not sure what happened then, I don't know how many died, all I know is that I made it to a seat somehow.  I ended up just to the right of the stage on the third row.  As I walked down the isle the booming sound system pounded out recent rock hits so loudly that I could feel the bass in my chest.  Up top were three giant wide screen displays placed next to each other with a panorama of Adobe images and video interviews.  Once things got started the first person to come out went up to a turntable (that's right) and started a video/audio slide-show.    It was one of the coolest things I've ever seen a serious geek do.  When he scratched the turntables not only did it scratch the music but also the video.  It basically went through a rundown of what Adobe was about, what was coming out, and how people were using the &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ab1lZbmeifw/SSbqDzbydYI/AAAAAAAAAMo/kwUR7eE_B3k/s1600-h/generalsession2.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 185px;" src="http://2.bp.blogspot.com/_ab1lZbmeifw/SSbqDzbydYI/AAAAAAAAAMo/kwUR7eE_B3k/s320/generalsession2.png" alt="" id="BLOGGER_PHOTO_ID_5271157764951012738" border="0" /&gt;&lt;/a&gt;products etc.  Like I said, it was pretty cool. &lt;br /&gt;&lt;br /&gt;After that Kevin Lynch (CTO Adobe) came out and led most of the session, bringing on people from Disney, The NY Times, Google, and Maria Shriver (y'know the governator's wife) among others.  They also breezed over all of things coming soon from Adobe including that next year will see the Flash Player 10 come to mobile devices as a full Flash Player!  For those of you interested For those of you interested you can go to http://adobe.com/go/keynote to see a little more information about what went on.  They are also supposed to have audio/video of actual sessions up at some point.  I'll go over all of the sessions I attended along with my thoughts about them as I have time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-5676434867959010073?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/5676434867959010073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=5676434867959010073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/5676434867959010073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/5676434867959010073'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/11/max-2008.html' title='Max 2008'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ab1lZbmeifw/SSboL56gNUI/AAAAAAAAAMg/rf7mpw1D1W0/s72-c/generalsession1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-1984248158852306686</id><published>2008-11-10T05:34:00.000-08:00</published><updated>2008-11-10T05:44:25.165-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>The Power of '\'</title><content type='html'>I recently went through an ordeal attempting to use the Flex command line compiler for a project I was working on.  After figuring out a series of fairly cryptic problems I got to one which made no sense.  I was getting a ‘cannot find file’ error for an asset that I knew to be in the correct position.  In fact the project would build just fine within Flex Builder.  The file was an embedded image asset located at something like ‘…/assets/images/image.png’.  I couldn’t figure out why it would have an issue.  After searching the internet for about half an hour I came across the post of another blogger with the same problem.  He said that adding a ‘/’ to the front of his embedded file names fixed all of his issues.  Lo and behold it worked for me as well.  I guess the Flex Builder compiler is smart enough to find the files with or without the ‘/’ but the command line compiler wasn’t built with the same intelligence.  I’ve also seen the power of the ‘/’ in a couple of other places even within Flex Builder such as source paths remaining unfound without the ‘/’ in front.&lt;br /&gt;Lesson Learned: When in doubt, add a ‘/’ to the front of the path.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-1984248158852306686?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/1984248158852306686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=1984248158852306686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/1984248158852306686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/1984248158852306686'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/11/power-of.html' title='The Power of &apos;\&apos;'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-5629298124228875522</id><published>2008-07-31T12:40:00.000-07:00</published><updated>2008-08-25T11:14:41.921-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex Builder Cryptic error message</title><content type='html'>From time to time I find some fun errors in Flex Builder 3.  Today for instance we were refactoring our framework project and moving some events and interfaces into our common library.  All was going well until I renamed a folder (namespace) within Flex Builder to be singular (i.e. renaming dogs to dog).&lt;br /&gt;&lt;br /&gt;Once I did this I got an error saying: &lt;blockquote&gt;Cannot find source for class dogs.blah Location Unknown&lt;br /&gt;&lt;/blockquote&gt;My assumption was that this error was caused by the fact that many classes still referenced the dogs.blah class instead of dog.blah which was it's new name.  After diligently fixing all of the references and package declarations within the project the error still occurred.  Another developer sat with me and neither of us could figure it out, so I did what I always do in these situations, I Google'd it.  And lo and behold I found the answer &lt;a href="http://pegolon.wordpress.com/category/blogroll/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Basically you need to go to the base directory of your project, open the .flexLibProperties file and remove or correct the bad class references.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This file contains an xml list of all classes to include in your project swc/swf file and for some reason doesn't update properly sometimes.  I hope someone reads this and it helps them as much as the other post helped me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-5629298124228875522?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/5629298124228875522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=5629298124228875522' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/5629298124228875522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/5629298124228875522'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/07/flex-builder-cryptic-error-message.html' title='Flex Builder Cryptic error message'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-7916004993470050443</id><published>2008-07-17T11:00:00.001-07:00</published><updated>2008-07-17T11:04:08.660-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex Unit'/><title type='text'>Modular Test Driven Development</title><content type='html'>&lt;p&gt;So as I mentioned before we've decided to use &lt;a href="http://code.google.com/p/as3flexunitlib/"&gt;FlexUnit&lt;/a&gt; to do test driven development in Flex for our latest project. We also want to do modular development in order to support Bundles as per the OSGi framework which I also mentioned before. In order to make these two things work together easily I wanted to be able to simply drop modules into a 'test runner' flex application and have it run all of the tests embedded within that module. Zach Smith, one of our new developers, whipped up a pretty nice test framework and test runner application which allows us to do just that. &lt;/p&gt;  &lt;p&gt;For the test framework he extended the Flex Module class to make a TestModule class. All of the tests within your module are then registered with your TestModule. Below is an example registering a TemperatureConverterTest.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/danny.r.hatcher/SH-Jlvz3-hI/AAAAAAAAAD4/uPN6X-sLuvw/example_testmodule%5B1%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; width: 422px; border-bottom: 0px; height: 217px" height="222" alt="example_testmodule" src="http://lh4.ggpht.com/danny.r.hatcher/SH-IuKxcBkI/AAAAAAAAAD8/iHHJtWmvq4Q/example_testmodule_thumb.png" width="430" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You'll notice the line 'this.testClassArray' which is the inherited property from the TestModule class. After that you drop the swf from your built module into the directory containing the test runner application, edit an xml file to register your module with the test runner, and run the application. The application is the basic FlexUnit built in interface. &lt;/p&gt;  &lt;p&gt;I'm really pleased with the way this turned out and it's going to make unit testing fairly easy since we can do it all in one central location, and since it's a Flex application we can leave it on a central server and run it from anywhere within our internal network.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-7916004993470050443?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/7916004993470050443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=7916004993470050443' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/7916004993470050443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/7916004993470050443'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/07/modular-test-driven-development.html' title='Modular Test Driven Development'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/danny.r.hatcher/SH-IuKxcBkI/AAAAAAAAAD8/iHHJtWmvq4Q/s72-c/example_testmodule_thumb.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-6085728485681399016</id><published>2008-07-15T05:12:00.000-07:00</published><updated>2008-07-15T06:12:26.312-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASDoc'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Creating ASDoc for your Flex application</title><content type='html'>Since we're heading down the path of creating an actual product in Flex here I decided to look into ASDoc.  Once I found the location of the asdoc.exe the whole experience was fairly painless.  Above each of my classes and functions I've added a comment something like this:&lt;br /&gt;&lt;blockquote&gt;    /**&lt;br /&gt;   * Starts this class.&lt;br /&gt;   * Try to start this class.&lt;br /&gt;   * &lt;br /&gt;   * @throws &lt;code&gt;MyError&lt;/code&gt; upon error of if the class was in an invalid state for this operation. &lt;br /&gt;   */&lt;br /&gt;                 function start():void&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And then from a command prompt I typed:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;C:\Program Files\Adobe\Flex Builder 3\sdks\3.0.0\bin&gt;asdoc -doc-sources "C:\MyProject\src" -main-title "My OSGi Framework" -window-title "My Documentation" -output OSGI_ASDoc&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;after hitting enter I got this status message:&lt;br /&gt;&lt;blockquote&gt;Loading configuration file C:\Program Files\Adobe\Flex Builder 3\sdks\3.0.0\fram&lt;br /&gt;eworks\flex-config.xml&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;followed by a 'complete' message.  The resulting html document looks much as you'd expect a Javadoc to look, with links to each class and package along with your comments.  I'd suggest this to anyone trying to keep up with a fairly complex object model, especially if you will be having more than one person working on it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-6085728485681399016?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/6085728485681399016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=6085728485681399016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/6085728485681399016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/6085728485681399016'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/07/creating-asdoc-for-your-flex.html' title='Creating ASDoc for your Flex application'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-3952624416216704938</id><published>2008-07-12T08:28:00.000-07:00</published><updated>2008-07-13T05:50:41.758-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Holistic Lab'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex API'/><category scheme='http://www.blogger.com/atom/ns#' term='ESRI'/><title type='text'>Flex Holistic Lab Wrapup</title><content type='html'>&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;o:officedocumentsettings&gt;   &lt;o:relyonvml/&gt;   &lt;o:allowpng/&gt;  &lt;/o:OfficeDocumentSettings&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face  {font-family:Wingdings;  panose-1:5 0 0 0 0 0 0 0 0 0;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face  {font-family:"Cambria Math";  panose-1:2 4 5 3 5 4 6 3 2 4;  mso-font-charset:1;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:variable;  mso-font-signature:0 0 0 0 0 0;} @font-face  {font-family:Calibri;  panose-1:2 15 5 2 2 2 4 3 2 4;  mso-font-charset:0;  mso-generic-font-family:swiss;  mso-font-pitch:variable;  mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-parent:"";  margin-top:0in;  margin-right:0in;  margin-bottom:10.0pt;  margin-left:0in;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  margin-top:0in;  margin-right:0in;  margin-bottom:10.0pt;  margin-left:.5in;  mso-add-space:auto;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0in;  margin-right:0in;  margin-bottom:0in;  margin-left:.5in;  margin-bottom:.0001pt;  mso-add-space:auto;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0in;  margin-right:0in;  margin-bottom:0in;  margin-left:.5in;  margin-bottom:.0001pt;  mso-add-space:auto;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast  {mso-style-priority:34;  mso-style-unhide:no;  mso-style-qformat:yes;  mso-style-type:export-only;  margin-top:0in;  margin-right:0in;  margin-bottom:10.0pt;  margin-left:.5in;  mso-add-space:auto;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoChpDefault  {mso-style-type:export-only;  mso-default-props:yes;  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:Calibri;  mso-fareast-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} .MsoPapDefault  {mso-style-type:export-only;  margin-bottom:10.0pt;  line-height:115%;} @page Section1  {size:8.5in 11.0in;  margin:1.0in 1.0in 1.0in 1.0in;  mso-header-margin:.5in;  mso-footer-margin:.5in;  mso-paper-source:0;} div.Section1  {page:Section1;}  /* List Definitions */  @list l0  {mso-list-id:1143814038;  mso-list-type:hybrid;  mso-list-template-ids:2032301054 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l0:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-.25in;  font-family:Symbol;} ol  {margin-bottom:0in;} ul  {margin-bottom:0in;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-priority:99;  mso-style-qformat:yes;  mso-style-parent:"";  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin-top:0in;  mso-para-margin-right:0in;  mso-para-margin-bottom:10.0pt;  mso-para-margin-left:0in;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal"&gt;This past week in the ESRI Holistic lab was interesting as always.&lt;span style=""&gt;  &lt;/span&gt;The Flex API is moving along nicely, now containing api toolbar functionalities, like the drawing toolbar, which really makes life easy for those of us doing redlining and more within the api.&lt;span style=""&gt;  &lt;/span&gt;I already had a firm grasp of the framework’s intended uses and functionality so I ended up pinging the ESRI team most of the week with feature requests and programming framework questions.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The end result of this week’s testing is that I think I’ve managed to decide on a list of api, application, and programming frameworks that we will use in building our new software.&lt;span style=""&gt;  &lt;/span&gt;For our prototype version of Network Express we used &lt;a href="http://www.fluorinefx.com/"&gt;Fluorine&lt;/a&gt;, a .NET gateway technology, to handle all of our calls from/to the server and our Flex application.&lt;span style=""&gt;  &lt;/span&gt;This was a natural choice for us as we’re mainly a .NET shop and it was easy to write all of our server side classes and web services quickly in C# and ASP.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Moving forward however it seems that if we stayed the course with Fluorine we’d be out on a limb all alone.&lt;span style=""&gt;  &lt;/span&gt;No one on the ESRI Flex API team (I’m just gonna call them EFA team from now on) have even heard of Fluorine and a number of them come from Java teams within ESRI.&lt;span style=""&gt;  &lt;/span&gt;As a result they tend to gravitate towards Java based technologies for their server side components.&lt;span style=""&gt;  &lt;/span&gt;Add to this the fact that Adobe (the company that produces the Flex SDK and Flex Builder) has their own server side product, &lt;a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS"&gt;Blaze DS&lt;/a&gt;, which is built on top of a Java platform and it appears that peer pressure has forced our hand.&lt;span style=""&gt;  &lt;/span&gt;The EFA team are comfortable with Blaze and have used it for several projects, and although they didn’t explicitly say “don’t use .NET!” the mere fact that if we had any technical issues we wouldn’t be able to lean on them for support makes it seem like a bad idea.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;So I spent the week largely looking at Blaze DS, which works great actually, once you get used to coding all of your server components in Java.&lt;span style=""&gt;  &lt;/span&gt;Luckily for me I spent a couple of years coding Java in the past and so it wasn’t too much of a stretch to brush up on my syntax enough to get a few things working.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Late one afternoon I was speaking with Ismael Chivite, the lead of the ArGIS Server group and a generally nice guy, about doing server side coding and he mentioned something that gave me an “aha” moment.&lt;span style=""&gt;  &lt;/span&gt;He told me to be careful when using a server context to create objects because each time the context is used it makes a call back to touch the SOM machine.&lt;span style=""&gt;  &lt;/span&gt;Whether you know what this means or not doesn’t really matter, the punch line is that I suddenly remembered our prototype doesn’t take any advantage of the distributed processing environment offered by ArcGIS server &lt;b style=""&gt;at all&lt;/b&gt;!&lt;span style=""&gt;  &lt;/span&gt;We knew it would be necessary long term for the actual product to do so in order to provide a stable, scalable product but we had other things to worry about for the prototype so we let it go.&lt;span style=""&gt;  &lt;/span&gt;At some point in all the worry of learning the new EFA, learning basic Flex best practices, and deciding on server side technologies and overall architectures and frameworks to use the fact that our current server side design was completely un-scalable had slipped my mind.&lt;span style=""&gt;  &lt;/span&gt;So I added that to my list of to-dos.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Mid-day Thursday afternoon I finally got my Blaze DS setup working and talking back and forth with my Flex application.&lt;span style=""&gt;  &lt;/span&gt;I found a great example &lt;a href="http://www.brucephillips.name/blog/index.cfm/2008/6/22/Using-Flex-BlazeDS-and-Java-Together--A-Simple-Tutorial"&gt;here &lt;/a&gt;by a guy who had gone though my same issues, which was awesome.&lt;span style=""&gt;  &lt;/span&gt;After I was confident with that I went back to the Java class I had written that morning to create a point feature in SDE using a server context, and consequentially a SOC process.&lt;span style=""&gt;  &lt;/span&gt;Antony, one of the EFA team members found &lt;a href="http://edndoc.esri.com/arcobjects/9.1/ArcGISDevHelp/DevelopmentEnvs/Java/TasksInCode.htm"&gt;this site&lt;/a&gt; for me which really helped me past the last few issues I was having with it.&lt;span style=""&gt;  &lt;/span&gt;Blaze DS is so fast in transmitting data back and forth from the server and the Flex application that I didn’t even do any debugging in my server side classes, I simply returned any errors they had to my Flex app and debugged through it.&lt;span style=""&gt;  &lt;/span&gt;The response time was so fast that I had no problem doing it this way and less than an hour after I got Blaze up and running I was creating features in SDE through my Flex application.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Do’s and Don’ts of Server Context programming:&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family:Symbol;"&gt;&lt;span style=""&gt;·&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Don’t simply ‘new’ your variables, you need to use the server context to create them.&lt;span style=""&gt;  &lt;/span&gt;Otherwise you’ll end up with automation errors.&lt;span style=""&gt;  &lt;/span&gt;This occurs because the objects need to be created within the context of the SOC process which will be running your code.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family:Symbol;"&gt;&lt;span style=""&gt;·&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Do release your server context in a ‘finally’ block or otherwise assure that it will always be released, otherwise you’ll end up bogging down your server when errors occur and the process sits around waiting to time out.&lt;span style=""&gt;  &lt;/span&gt;This caused me several minutes frustration while I was initially debugging my server side code.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family:Symbol;"&gt;&lt;span style=""&gt;·&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;         &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Do follow all standard Arc Objects programming practices when using a server context.&lt;span style=""&gt;  &lt;/span&gt;If you would start an edit operation in a standard Arc Objects application, start one in your server code.&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Application Frameworks&lt;/p&gt;  &lt;p class="MsoNormal"&gt;We talked about several frameworks during the week and I took a hard look at three of them: &lt;a href="http://labs.adobe.com/wiki/index.php/Cairngorm"&gt;Cairngorm&lt;/a&gt;, the M Framework, and &lt;a href="http://mate.asfusion.com/"&gt;Mate &lt;/a&gt;(pronounced like latte but with an m).&lt;span style=""&gt;  &lt;/span&gt;Cairngorm is an application framework developed by the Adobe solutions developers and is designed to help teams create complex and robust applications without stepping on each other’s toes and getting bogged down with interdependencies and repeating code.&lt;span style=""&gt;  &lt;/span&gt;The M Framework, named after Mansour Raad the lead EFA team guru, is the name Mansour jokingly gave the framework he uses when creating solutions for customers.&lt;span style=""&gt;  &lt;/span&gt;It is basically a pared down version of Cairngorm in which he has left the parts that are useful to him and removed the parts that don’t actually give him any benefit and simply create extra overhead.&lt;span style=""&gt;  &lt;/span&gt;In my opinion his framework is great for any small to medium project with a team of 1-3 developers, but I think you would miss some of the things you gain with full blown Cairngorm on larger projects.&lt;span style=""&gt;  &lt;/span&gt;The last framework I looked at was Mate.&lt;span style=""&gt;  &lt;/span&gt;It is the current flavor of the month in Flex frameworks and is generating a lot of buzz.&lt;span style=""&gt;  &lt;/span&gt;I downloaded the framework and looked at some of their examples and I guess I am still reserving judgment although I think I’d have to say it’s not for me.&lt;span style=""&gt;  &lt;/span&gt;It seems to be a slick, low maintenance framework though.&lt;span style=""&gt;  &lt;/span&gt;It’s deemed as a framework for people who hate frameworks and I can definitely see that.&lt;span style=""&gt;  &lt;/span&gt;For me though I just don’t think I’ll ever be working on the type of projects that it’s meant for, and as an Engineer at heart I love frameworks.&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;OSGi&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The &lt;a href="http://www.osgi.org/Main/HomePage"&gt;OSGi &lt;/a&gt;framework is an application framework for large Rich Internet Applications (RIA) which allows you to drop new components into the working directory of an application and have the app find and expose the new functionality immediately.&lt;span style=""&gt;  &lt;/span&gt;Basically the way this works is that each new set of functionality you create for an application is wrapped up in a Bundle (IBundle).&lt;span style=""&gt;  &lt;/span&gt;This Bundle can then be discovered by your base application when it is present, and the functionality it contains is exposed as services which are registered so that any other service can gain access to them.&lt;span style=""&gt;  &lt;/span&gt;This means that if two related Bundles are present they may use one another to enhance their own functionality and if one of them is removed the other will continue to work but the available options may change.&lt;span style=""&gt;  &lt;/span&gt;This is exactly what we want for Network Express and is also exactly the way our current field application works.&lt;span style=""&gt;  &lt;/span&gt;You simply develop new functionality, drop it in the bin directory of our app, and boom, you can use that functionality within our existing application just like it was native.&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Resolving OSGI and Cairngorm&lt;/p&gt;  &lt;p class="MsoNormal"&gt;So great, I have found two frameworks I want to use.&lt;span style=""&gt;  &lt;/span&gt;Now how in the world am I going to use both of them on one project?&lt;span style=""&gt;  &lt;/span&gt;Well first off, OSGi is a Java framework.&lt;span style=""&gt;  &lt;/span&gt;That is, it was developed to work for Java based web applications.&lt;span style=""&gt;  &lt;/span&gt;This being the case there isn’t really an official version of the framework for Flex.&lt;span style=""&gt;  &lt;/span&gt;This is a mixed blessing for us.&lt;span style=""&gt;  &lt;/span&gt;It means that we have to develop the framework on our own, and mesh it with the Flex notion of Modules (Modules are dynamically loadable swf files for Flex applications) &lt;b style=""&gt;and&lt;/b&gt; at the same time interweave it with the Cairngorm framework, which &lt;b style=""&gt;is&lt;/b&gt; based on Flex, although an official Flex 3 version of it has yet to see the light of day.&lt;span style=""&gt;  &lt;/span&gt;The fact that Cairngorm is open source may end up being the saving grace for us in this situation but my initial feeling is that we’ll end up using Bundles from OSGI to encapsulate functionality which is built using Cairngorm, with one master Application Bundle that runs all of the rest.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Oh yes, and don’t forget that we will be using Test Driven Development (using FlexUnit) for each individual piece of functionality.&lt;span style=""&gt;  &lt;/span&gt;I’m sure there are going to be even more intricacies I have yet to even consider, but hey, that’s the price of doing something new and hopefully cool.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Overall I’d say my week of testing was a big success. &lt;span style=""&gt; &lt;/span&gt;I managed to get a handle on using Server Contexts, learn and test the new pieces of the EFA, and begin to get a grip on how we’re going to manage to develop this whole mess.&lt;span style=""&gt;  &lt;/span&gt;I’m sure it’s going to be busy over the next few weeks but I’ll do my best to keep our progress updated here and post any interesting problems/solutions we run into along the way.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-3952624416216704938?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/3952624416216704938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=3952624416216704938' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/3952624416216704938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/3952624416216704938'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/07/flex-holistic-lab-wrapup.html' title='Flex Holistic Lab Wrapup'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-6735741670956591005</id><published>2008-07-10T11:43:00.000-07:00</published><updated>2008-07-12T18:46:25.499-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex API'/><category scheme='http://www.blogger.com/atom/ns#' term='ESRI'/><title type='text'>Greetings from Redlands</title><content type='html'>So I'm spending another week in Redlands, CA this week doing more testing of ESRI's new Flex API.  I've got a lot of notes and things to go over here that I'll do over the next several days.  A lot of what I'm dealing with now is deciding on the overall architecture of the product we plan on building on top of this new API.  I'm dealing with application frameworks, server side technology, etc.  I'll post about all of the ones I'm considering and what I like/dislike about all of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-6735741670956591005?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/6735741670956591005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=6735741670956591005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/6735741670956591005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/6735741670956591005'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/07/greetings-from-redlands.html' title='Greetings from Redlands'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-3101204805696770210</id><published>2008-06-13T05:26:00.000-07:00</published><updated>2008-06-13T05:29:22.423-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='Huntsville'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google Street View Comes to Huntsville</title><content type='html'>Google's street view vans have been running around Huntsville!  &lt;a href="http://maps.google.com"&gt;Check it out&lt;/a&gt; and see if you can find my house, it's at the corner of Indian Creek and Kelly Springs in Harvest.  It looks like they came through about three months or so ago because my old neighbor's car is in their driveway and they moved about three months ago.  And before you say anything I know I need some landscaping, I'm planning to do that this summer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-3101204805696770210?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/3101204805696770210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=3101204805696770210' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/3101204805696770210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/3101204805696770210'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/06/google-street-view-comes-to-huntsville.html' title='Google Street View Comes to Huntsville'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-544560322788857652</id><published>2008-05-30T13:15:00.000-07:00</published><updated>2008-05-30T13:34:13.506-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dev Summit'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ESRI'/><title type='text'>2008 ESRI Dev Summit Code Entry</title><content type='html'>For anyone interested, I entered the code challenge for the developer summit this past year.  My entry can be found &lt;a href="http://arcscripts.esri.com/details.asp?dbid=15443"&gt;here&lt;/a&gt; and the interview they did with me about it during the dev summit is &lt;a href="http://www.esri.com/news/podcasts/audio/speaker/devsum08/devsummit08cc_hatcher.mp3"&gt;here&lt;/a&gt;.  I know I sound a bit like an idiot, but what can you do?  The code is built upon the old ArcWebServices flex api but most of it is still valid.  It's a small flex program that does automated testing of your map services and gives you data in csv format based on the response times for pans and zooms.  I think that the example link is broken but if anyone would like me to set it back up just let me know and I'd be happy to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-544560322788857652?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/544560322788857652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=544560322788857652' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/544560322788857652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/544560322788857652'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/05/2008-esri-dev-summit-code-entry.html' title='2008 ESRI Dev Summit Code Entry'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-3110440263501417729</id><published>2008-05-28T06:55:00.000-07:00</published><updated>2008-05-28T06:58:42.344-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dev Summit'/><category scheme='http://www.blogger.com/atom/ns#' term='ESRI'/><title type='text'>The 2008 ESRI Dev Summit</title><content type='html'>I was fortunate enough to go the the ESRI Dev Summit in Palm Springs, CA this past March.  It was a great place to learn all about the next release of ESRI software, meet with the actual developers, and learn tips and tricks and see actual code.  Almost all of the sessions are now available online on the &lt;a href="http://edn.esri.com/index.cfm?fa=conferences.gateway"&gt;EDN Conferences&lt;/a&gt; page.  Check it out, I'm sure it will be worth your time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-3110440263501417729?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/3110440263501417729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=3110440263501417729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/3110440263501417729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/3110440263501417729'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/05/2008-esri-dev-summit.html' title='The 2008 ESRI Dev Summit'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-682827879277655495</id><published>2008-05-23T07:24:00.000-07:00</published><updated>2008-05-23T16:40:05.780-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Holistic Lab'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ESRI'/><title type='text'>ESRI Holistic Lab: Flex API Day 3</title><content type='html'>I got around to asking about two things I would really like to have in the Flex API on day three: Will there be a way to change the version I am seeing, and will there be a way to change the data frame that I am viewing?&lt;span style=""&gt;  &lt;/span&gt;The answer here was pretty much what you would expect.&lt;span style=""&gt;  &lt;/span&gt;If the REST API will support it then the Flex API will be able to do it, which means that it isn’t currently available.&lt;span style=""&gt;  &lt;/span&gt;That means this will still be one area where the ArcServer WebADF will outshine Flex.&lt;span style=""&gt;  &lt;/span&gt;There are of course ways to get around this.&lt;span style=""&gt;  &lt;/span&gt;You can create a Map Service for each version you wish to see although that will potentially cause problems with far too many Map Services.&lt;span style=""&gt;  &lt;/span&gt;As far as data frames go, the same applies, simply create separate map services for each data frame.  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Built In Tasks&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Having gotten the QueryTask to work on day two I decided to take a gander at the other built in tasks on my last day in the labs.&lt;span style=""&gt;  &lt;/span&gt;The other two currently available are the Locate and Find tasks.&lt;span style=""&gt;  &lt;/span&gt;They work similarly to the QueryTask, using the built-in support of the REST API to do their work.&lt;span style=""&gt;  &lt;/span&gt;Neither of these tasks is currently bug free however so I was unable to satisfactorily test them.&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Debugging&lt;/p&gt;  &lt;p class="MsoNormal"&gt;This leads me to the next thing I would like to go over, debugging your flex code.&lt;span style=""&gt;  &lt;/span&gt;Here, especially when using native REST API calls, you can take serious advantage of the Services Explorer.&lt;span style=""&gt;  &lt;/span&gt;This is typically located at &lt;a href="http://servername/ArcGIS/rest/services"&gt;http://serverName/ArcGIS/rest/services&lt;/a&gt; and from here you can view any of the MapServices setup for that server.&lt;span style=""&gt;  &lt;/span&gt;You can also see what capabilities exist both for the service and each individual layer and even test them.&lt;span style=""&gt;  &lt;/span&gt;The explorer also has links directly to the REST API documentation which can be invaluable.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The other priceless tool for debugging is an extension to Firefox called Firebug.&lt;span style=""&gt;  &lt;/span&gt;Firebug allows you to see requests being made over your browser.&lt;span style=""&gt;  &lt;/span&gt;You can then see the request, header, parameters, and the response.&lt;span style=""&gt;  &lt;/span&gt;By right clicking on a request you can copy it and then paste it into your browser’s address bar and see the result in your browser.&lt;span style=""&gt;  &lt;/span&gt;I was able to figure out several issues I had with the QueryTask by doing this and then manipulating the variables directly within my request.&lt;span style=""&gt;  &lt;/span&gt;I wouldn’t recommend working with the Flex API without using Firebug or something similar.&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Building an Extensible Framework&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The original Flex API from ArcWebServices was built on a variation of OSGi &lt;span class="a"&gt;&lt;a href="http://www.osgi.org/"&gt;www.&lt;b&gt;osgi&lt;/b&gt;.org/&lt;/a&gt; which is a dynamic module system originally created for Java.&lt;span style=""&gt;  &lt;/span&gt;Using such a framework allows for seamless adding and removing of modules from an application without having to take it down.&lt;span style=""&gt;  &lt;/span&gt;You can simply drop a new module into your framework on a server while the application is running and it will be discovered and its functionality made available.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="a"&gt;Eclipse (the base application for Flex Builder) is built on top of the OSGi Spec.&lt;span style=""&gt;  &lt;/span&gt;The basic idea is that each module you create must implement the IBundle and IBundleActivator interface.&lt;span style=""&gt;  &lt;/span&gt;When a new module is discovered your application then casts it to an IBundleActivator, passing it a context (IBundleContext) and retrieves all of the services (IService) from the module.&lt;span style=""&gt;  &lt;/span&gt;Now any other part of the application can find and use the services provided by this new module.&lt;span style=""&gt;  &lt;/span&gt;There are several freely available OSGi frameworks.&lt;span style=""&gt;  &lt;/span&gt;Knoplerfish ( &lt;a href="http://www.knopflerfish.org/"&gt;http://www.knopflerfish.org/&lt;/a&gt; ) and Felix ( &lt;a href="http://felix.apache.org/"&gt;http://&lt;span style=""&gt;felix.apache.org/&lt;/span&gt;&lt;/a&gt;&lt;span style=""&gt; &lt;/span&gt;) are two fairly uncomplicated and well known ones.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="a"&gt;&lt;span style="font-weight: bold;"&gt;Transmitting Data&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span class="a"&gt;We also spent some time on the different ways to transmit data using Flex.&lt;span style=""&gt;  &lt;/span&gt;There are three basic ways beyond Web Services which are available: Remote Objects, messaging, and data services.&lt;span style=""&gt;  &lt;/span&gt;Adobe provides a free Blaze DS service which allows you to do the first two.&lt;span style=""&gt;  &lt;/span&gt;If you want to do the third though, you’ll need to shell out $25,000 for the privilege.&lt;span style=""&gt;  &lt;/span&gt;Each of these transmission types buy you something.&lt;span style=""&gt;  &lt;/span&gt;Using remote objects allows you to transmit actual objects as binary over the wire, speeding things up considerably over the use of web services.&lt;span style=""&gt;  &lt;/span&gt;Messaging allows clients to subscribe to a destination point on a server and then receive any messages that come from there.&lt;span style=""&gt;  &lt;/span&gt;&lt;span style=""&gt;  &lt;/span&gt;Data Services allows for things like ‘active rows’ where you are given and can manipulate a row from a database table that will automatically manipulate the row on the server and let other users of that row that it has changed.&lt;span style=""&gt;  &lt;/span&gt;There are a lot of powerful uses I can think of for this last method which is probably why it is so expensive.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-682827879277655495?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/682827879277655495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=682827879277655495' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/682827879277655495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/682827879277655495'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/05/esri-holistic-lab-flex-api-day-3.html' title='ESRI Holistic Lab: Flex API Day 3'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-1837354678446242716</id><published>2008-05-23T05:53:00.000-07:00</published><updated>2008-05-23T16:24:31.688-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Holistic Lab'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ESRI'/><title type='text'>ESRI Holistic Lab: Flex API Day 2</title><content type='html'>Day two for me consisted mainly of trying to get an extent QueryTask to work in order to do feature selections.&lt;span style=""&gt;  &lt;/span&gt;I had already created a map service on my machine which exposed a set of utility data.&lt;span style=""&gt;  &lt;/span&gt;My first task was to create a graphic to allow users to click and drag to create an extent for their selection.&lt;span style=""&gt;  &lt;/span&gt;This was somewhat less straight forward than in the old ArcWebServices version of the Flex API as there is currently no easy way to draw an interactive extent on the map with no mouse handler interface and toolkits not yet implemented.&lt;span style=""&gt;  &lt;/span&gt;One of the Flex API team members gave me a sample which got me jumpstarted however.&lt;span style=""&gt;  &lt;/span&gt;In the end it was a case of simply hooking the mouse down, mouse move, and mouse up events.&lt;span style=""&gt;  &lt;/span&gt;The tricky part was getting the extent rectangle to draw the way I wanted.&lt;span style=""&gt;  &lt;/span&gt;I never really got it to look the way I wanted, but I did get it to work.&lt;span style=""&gt;  &lt;/span&gt;The really nice thing about this is that using the new REST api available in 9.3 you can query on a layer with no custom web services.&lt;span style=""&gt;  &lt;/span&gt;The query capability of the REST api is nicely wrapped up within the QueryTask object.&lt;span style=""&gt;  &lt;/span&gt;I’ll not go into too many details about it because I don’t want to push the NDA I had to sign too far but the Task interface is going to make a lot of people happy, not to mention making their jobs easier when creating flex applications.&lt;span style=""&gt;  &lt;/span&gt;  &lt;p class="MsoNormal"&gt;We also sat together as a group for a couple of hours in the morning and afternoon and talked about basic Flex programming dos and don’ts.&lt;span style=""&gt;  &lt;/span&gt;Many of the following ideas come from the Cairngorm flex framework &lt;a href="http://labs.adobe.com/wiki/index.php/Cairngorm"&gt;http://labs.adobe.com/wiki/index.php/Cairngorm&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Code-behind&lt;/p&gt;  &lt;p class="MsoNormal"&gt;We started out by going over the basic GUI coding paradigm of code-behind and how it works in the Flex world.&lt;span style=""&gt;  &lt;/span&gt;The best way to do this is to create your own Actionscript class, MyApp for instance, which has Application as a super class.&lt;span style=""&gt;  &lt;/span&gt;You then create your base application mxml and have it subclass your MyApp Actionscript class.&lt;span style=""&gt;  &lt;/span&gt;At this point you can put all of the code you need to run your application within its own actionscript class and keep it completely separated from the mxml gui tags.&lt;span style=""&gt;  &lt;/span&gt;In order to access your gui items from your MyApp class you must declare a public variable within your class with the same name and type as the items within the mxml.&lt;span style=""&gt;  &lt;/span&gt;So if you have a &lt;mx:label id="”myLabel”/"&gt; in mxml then you would need a public myLabel:Label declared within your MyApp to be able to access it.&lt;/mx:label&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The names that you give your objects now become very important because you will be coding the logic in a separate file from where the GUI is created.&lt;span style=""&gt;  &lt;/span&gt;If you name your objects and event handlers poorly you will have trouble keeping up with what functions and items do what.&lt;span style=""&gt;  &lt;/span&gt;Therefore it is good to not only give your objects meaningful names but to also follow a standard when naming your event handlers.&lt;span style=""&gt;  &lt;/span&gt;Using the convention of objected_eventNameHandler() is the standard way of naming your event handlers and does a good job of concisely informing you on what it is (an event handler), what type of event it handles and for what object it does the handling.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Making use of Singletons&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Cairngorm recommends creating a bindable singleton class which holds on to all of your application level information and allows any class to manipulate that class level data and always be sure that it is the correct version of the data.&lt;span style=""&gt;  &lt;/span&gt;Making the class bindable also allows other classes to bind to these application level variables and be automatically updated when those values change.&lt;span style=""&gt;  &lt;/span&gt;The Flex API team called this class the Model.&lt;span style=""&gt;  &lt;/span&gt;We used a singleton class in our original Network Express prototype which definitely made life much easier but the one we were shown had a couple of advantages over the one we used previously.&lt;span style=""&gt;  &lt;/span&gt;Chief among these was the ability to make sure that only one instance of the Model is ever created, and the ability to be certain there is only ever one instance of any given application level object.&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;The Flex Object Lifecycle&lt;/p&gt;  &lt;p class="MsoNormal"&gt;All objects which are created in the Flex world go through the same cycle when they are created.&lt;span style=""&gt;  &lt;/span&gt;There are several events and functions which fire off that can be overloaded to allow you as the programmer to perform specific functions even before the CreationComplete event has fired.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family:Symbol;"&gt;&lt;span style=""&gt;·&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;New (Label) – the first step is the object instantiation is started.&lt;/li&gt;&lt;li&gt;PreInitialize – an event dispatched before any actual initialization takes place.&lt;/li&gt;&lt;li&gt;Setter – calls all Set functions&lt;/li&gt;&lt;li&gt;Initialize – another event dispatched to alert of actual initialization&lt;/li&gt;&lt;li&gt;CommitProperty – a function.&lt;span style=""&gt;  &lt;/span&gt;Overriding this function will allow you to make changes to the object atomically, preventing flashes and other artifacts from occurring as properties are set.&lt;/li&gt;&lt;li&gt;CreateChildren – function which starts the Lifecycle on all children objects.&lt;span style=""&gt;  &lt;/span&gt;This is another function which can be overridden.&lt;/li&gt;&lt;li&gt;Measure – Sets all of the width, height, etc.&lt;/li&gt;&lt;li&gt;UpdateDisplayList – function that adds the new object to the display list atomically.&lt;/li&gt;&lt;li&gt;CreationComplete – the final event which signals that the object is complete.&lt;span style=""&gt;  &lt;/span&gt;This is called only once.&lt;/li&gt;&lt;/ul&gt;                  &lt;p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Simply knowing about this lifecycle opens a lot of possibilities, especially with the functions which can be overridden. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt; &lt;/span&gt;Tips:&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpFirst" style="margin-left: 42.75pt; text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;1.&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Make sure to listen to the Load event on map objects as the CreationComplete event will fire well before any layers have actually been loaded.&lt;span style=""&gt;  &lt;/span&gt;Trying to manipulate the map before the Load event will only cause you heartache, and errors.&lt;span style=""&gt;  &lt;/span&gt;Each individual map layer will also fire a Load event.&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast" style="margin-left: 42.75pt; text-indent: -0.25in;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;2.&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;b style=""&gt;Always&lt;/b&gt; call super on all overloaded functions.&lt;span style=""&gt;  &lt;/span&gt;Failing to do so will keep the normal behavior from occurring.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;For more information on the Flex lifecycle check out this document: &lt;a href="http://livedocs.adobe.com/flex/2/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;amp;file=00000492.html"&gt;http://livedocs.adobe.com/flex/2/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;amp;file=00000492.html&lt;/a&gt;&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Events&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Let’s say you have an application with a VBox that contains a button.&lt;span style=""&gt;  &lt;/span&gt;The display tree would look like: Application --&gt; VBox --&gt; Button.&lt;span style=""&gt;  &lt;/span&gt;If you were too hook into the click event on this button then I’m sure you can guess that your function will be informed when the button is clicked.&lt;span style=""&gt;  &lt;/span&gt;What you might not know however is that Every item in the display list starting at the top will receive a click event as well.&lt;span style=""&gt;  &lt;/span&gt;This means that if you were to hook the click event on the VBox or the Application you would catch an event each time the button was clicked as well.&lt;span style=""&gt;  &lt;/span&gt;So how does your function know if the event it catches was meant for it? &lt;span style=""&gt; &lt;/span&gt;The event object has target and currentTarget properties.&lt;span style=""&gt;  &lt;/span&gt;The target property contains the id of the actual target of the event and the currentTarget property contains the id of the item in the display list currently receiving the event.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Events also have a phase.&lt;span style=""&gt;  &lt;/span&gt;There are two event phases: capture and bubble.&lt;span style=""&gt;  &lt;/span&gt;The capture phase occurs as the event is making its way down the display list looking for the target.&lt;span style=""&gt;  &lt;/span&gt;If you need to cancel an event for some reason you would want to handle it during the capture phase.&lt;span style=""&gt;  &lt;/span&gt;The bubble phase occurs on the way back up to the top of the display list.&lt;span style=""&gt;  &lt;/span&gt;When a handler is added it will fire by default on the bubble phase.&lt;span style=""&gt;  &lt;/span&gt;There is also a bubbles property on an event which is set to true by default.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Delegates and Unit Testing&lt;/p&gt;  &lt;p class="MsoNormal"&gt;During the afternoon of day 2 we sat down together and did a quick example application using Delegates which we then performed unit testing upon.&lt;span style=""&gt;  &lt;/span&gt;Delegates take the idea of code-behind a step further.&lt;span style=""&gt;  &lt;/span&gt;Once you have your mxml application and the code for it separated, you then perform all of the actual logic of your program via Commands.&lt;span style=""&gt;   &lt;/span&gt;These commands are called by events in your code-behind which then in turn call their own Delegate classes which perform all of the actual work.&lt;span style=""&gt;  &lt;/span&gt;The Commands are then in charge of making changes to application level data within your Model.&lt;span style=""&gt;  &lt;/span&gt;Delegate classes are completely independent of the rest of your program, not caring how they are used as long as they receive their input in the correct form.&lt;span style=""&gt;  &lt;/span&gt;The Delegates for your application can even be removed to separate swc libraries without causing any issues.&lt;span style=""&gt;  &lt;/span&gt;This allows teams to break up tasks fairly easily and logically.&lt;span style=""&gt;  &lt;/span&gt;One person can be in charge of creating the GUI for the application, another in charge of the code-behind application and commands, and yet another person or group can be in charge of creating the Delegates to actually perform the logic of the application.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Unit testing can be performed on Delegate classes very easily because they have well defined inputs and outputs.&lt;span style=""&gt;  &lt;/span&gt;As long as a Delegate receives input in the correct format it doesn’t matter where it comes from.&lt;span style=""&gt;  &lt;/span&gt;The unit testing framework we used was Flex Unit &lt;a href="http://code.google.com/p/as3flexunitlib/"&gt;http://code.google.com/p/as3flexunitlib/&lt;/a&gt; which is a free download and a very slick addition to your Flex environment which I highly recommend and plan to use myself.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Tips:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;When your mxml application is compiled by the flex compiler it goes through several steps.&lt;span style=""&gt;  &lt;/span&gt;First it is parsed into MXMLC and then it is translated into an actual actionscript (as3) file before being compiled into a swf.&lt;span style=""&gt;  &lt;/span&gt;Now I know what you’re thinking, wouldn’t it be nice to see how flex natively converts all of those mxml tags into neat concise code?&lt;span style=""&gt;  &lt;/span&gt;Well it turns out that you can.&lt;span style=""&gt;  &lt;/span&gt;There is a compiler setting which allows you to tell the compiler to leave all of those as3 files behind instead of deleting them once it is finished, allowing you to learn all types of tips and tricks by seeing how the compiler creates all of that code.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-1837354678446242716?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/1837354678446242716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=1837354678446242716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/1837354678446242716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/1837354678446242716'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/05/esri-holistic-lab-flex-api-day-2.html' title='ESRI Holistic Lab: Flex API Day 2'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-8686720156256392837</id><published>2008-05-21T06:52:00.000-07:00</published><updated>2008-05-23T16:23:12.815-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Holistic Lab'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ESRI'/><title type='text'>Holistic Lab: Flex API Day 1</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Error Handling&lt;/span&gt;  &lt;p class="MsoNormal"&gt;This is obviously the first beta, and a closed beta at that, of the new Flex API so you expect a few rough edges.&lt;span style=""&gt;  &lt;/span&gt;One of those is error handling.&lt;span style=""&gt;  &lt;/span&gt;There are a few places where I would expect no error to be thrown but they are anyway, if a layer’s url property is set to an empty string then the next pan/zoom will throw an error, and a few places where you would like an error to be thrown to let you know something is wrong and it isn’t.&lt;span style=""&gt;  &lt;/span&gt;The main place I can think of is when a tiling service fails you have no way of knowing this which caused some of the people here issues.&lt;span style=""&gt;  &lt;/span&gt;I have no doubt these will be fixed going forward.&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Authentication&lt;/p&gt;  &lt;p class="MsoNormal"&gt;There is no support currently for secured services.&lt;span style=""&gt;  &lt;/span&gt;If you want to use one you must first add it to an mxd and then expose it as an unsecured map service in Arc Server.&lt;span style=""&gt;  &lt;/span&gt;I did this with an IMS weather service and it worked just fine.&lt;span style=""&gt;  &lt;/span&gt;This is something that will be added but hasn’t crept to the top of the development team’s list yet.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Slow/Dead Services&lt;/p&gt;  &lt;p class="MsoNormal"&gt;There are issues with services which are either slow to respond or have died.&lt;span style=""&gt;  &lt;/span&gt;When a zoom occurs and a service doesn’t respond correctly the area on the screen which is coming from that service will behave weirdly, growing or shrinking out of proportion with the rest of the map.&lt;span style=""&gt;  &lt;/span&gt;This caused a small set of data in Montgomery to eventually cover the entire South East US for me when I tested it by stopping the map service completely.&lt;span style=""&gt;  &lt;/span&gt;In the case of extremely slow services this will eventually correct itself but it may take several minutes.&lt;span style=""&gt;  &lt;/span&gt;This is something &lt;span style=""&gt; &lt;/span&gt;the team was working on fixing as the day progressed and may even now be dealt with.&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Layering Services&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Layering multiple services is now much smoother than it was with the old api.&lt;span style=""&gt;  &lt;/span&gt;When you drop services on top of one another they now automatically leave the area not covered by their features transparent.&lt;span style=""&gt;  &lt;/span&gt;This means that if I put a map service with gas mains on top of a service showing street data I can automatically see all of the data.&lt;span style=""&gt;  &lt;/span&gt;This is a nice improvement from the past when you had to set transparency colors etc. to get this effect.&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;No More IMouseHandler!!&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The IMouseHandler interface is gone with the wind.&lt;span style=""&gt;  &lt;/span&gt;This made me sad mainly because we have created a number of mouse handlers to do various tasks for us.&lt;span style=""&gt;  &lt;/span&gt;After talking it over with the development team however it seems there will be a new paradigm called Toolkits which will allow the same type of behavior along with (hopefully) even more flexibility...no pun intended.&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;TOC Control&lt;/p&gt;  &lt;p class="MsoNormal"&gt;One of the first tests I did was to recreate the table of contents control I had made with the old api.&lt;span style=""&gt;  &lt;/span&gt;This is now much more straight forward.&lt;span style=""&gt;  &lt;/span&gt;LayerInfo objects now come along with your layer when it is received from the rest api.&lt;span style=""&gt;  &lt;/span&gt;This means you can immediately cycle through all of the layers, drop them in a VBox as checkboxes, and correctly check/uncheck them based upon the default visibility property.&lt;span style=""&gt;  &lt;/span&gt;I was very pleased with the TOC control in both performance and ease of coding.&lt;span style=""&gt;  &lt;/span&gt;The only issue that I saw was when switching the URL of my background layer there would be a flicker as the background turned momentarily white.&lt;span style=""&gt;  &lt;/span&gt;I didn’t even notice it at first but when the Product Lead was watching me show the TOC control he commented on it.&lt;span style=""&gt;  &lt;/span&gt;I’m not sure if this will get fixed to not redraw the background layer until the new source comes through but that would be a nice little adjustment.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;Tips:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Use &lt;mx:tracetarget&gt; when debugging.&lt;span style=""&gt;  &lt;/span&gt;Lots of useful information comes through here which can help you solve your issues.&lt;br /&gt;&lt;/mx:tracetarget&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;Whenever you change the underlying map document for a map service be ready to also clear the REST cache.&lt;span style=""&gt;  &lt;/span&gt;You can find the REST manager by going to &lt;a href="http://servername/ArcGIS/rest/admin"&gt;http://servername/ArcGIS/rest/admin&lt;/a&gt;&lt;span style=""&gt;  &lt;/span&gt;where the only option is currently to clear the cache or setup a schedule for it to be cleared.&lt;span style=""&gt;  &lt;/span&gt;If you don’t do this and the api has already been used to get information on that map service then you will get some strange inconsistencies.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-8686720156256392837?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/8686720156256392837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=8686720156256392837' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/8686720156256392837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/8686720156256392837'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/05/flex-holistic-lab-day-1.html' title='Holistic Lab: Flex API Day 1'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1843365659011037590.post-9077625578591364244</id><published>2008-05-19T19:52:00.000-07:00</published><updated>2008-05-19T20:24:45.091-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><title type='text'>Traveling to the ESRI Holistic Lab</title><content type='html'>I hate to start off this blog with an off topic post but I have to rant about this somewhere.  I left Sunday morning at 6 am to head out to Redlands for the Flex API holistic lab this week.  Everything went fine on the first leg.  We arrived on time and I easily found my way to my next gate.  Then the trouble started.&lt;br /&gt;&lt;br /&gt;Let me start by saying this is the very first time I have ever attempted to fly American Airlines.  I've flown many times with multiple airlines all over the states and over seas and nothing like this has ever happened before.&lt;br /&gt;&lt;br /&gt;My 9:05 flight got delayed until 11 am and then canceled all together because of an apparent issue with one of the engines.  Don't get me wrong, I'm glad they caught it, flying with a faulty engine is not my idea of a good time.  From that point onward however things were just handled badly.&lt;br /&gt;&lt;br /&gt;To begin with they lined all 300+ passengers up at the gate and had two people begin to reroute everyone.  If those numbers don't seem bad enough already it took an average of ten minutes per passenger, and I was at the &lt;span style="font-style: italic;"&gt;very&lt;/span&gt; back of the line.  After about thirty five minutes someone from the airline came up and told us "if you will go to gate sixteen they have five people there that can help you".  So the back thirty or so of us started the long walk to gate sixteen.&lt;br /&gt;&lt;br /&gt;When we arrived fifteen minutes later to see the two people there staring off into space I was not pleased.  We told one of the ladies what was going on and what we had been told and she told us we had to go out past security and go speak with the ticketing agents.  Okay, not convenient but still faster than waiting in that other line.  We all get outside and line up.  There are five agents there but only three of them are willing to help us as the other two apparently had better things to do staring out into space.&lt;br /&gt;&lt;br /&gt;After a few minutes I get my turn, I tell the lady what the issue is and she begins to help me.  She tells me I can't go to my actual destination but I can go to an airport thirty miles away.  That stinks but at least I can still make my destination.  She puts me standby on the 11:45 flight and gets me a 'confirmed' ticket on the 3:15 flight which had my seat assignment and everything.&lt;br /&gt;&lt;br /&gt;Now I went back through security, and rushed to the 11:45 gate to see if I have a chance, it was 11:05 when I got my ticket.  When I make it to the gate they tell me that the boarding door was closed and so no new passengers may enter.  That was a bummer but at least I had my ticket for the 3:15 flight.  I bought some lunch, bought and read an entire magazine, and waited.&lt;br /&gt;&lt;br /&gt;My 3:15 flight was delayed...of course.  At 3:30 boarding began.  Once they finally called my group I got in line and handed the attendant my boarding pass.  He swiped it as I have seen many times before but this time something new happened: the scanner flashed red and beeped.  I was pulled aside and asked to sit down while the other gate attendant tried to figure out the problem.  Well it turns out the problem was that they had canceled my ticket!  According to American Airlines I had left on the 1:45 flight to my original destination!  The very flight I had been told was fully booked when I went out and talked to the ticket agent earlier in the day!  So not only had my luggage gone with that flight but they had canceled my ticked for this flight, and they couldn't get me on it because it was full!!&lt;br /&gt;&lt;br /&gt;After telling me he was sorry the gate agent booked me on a 10:15pm flight, still not to Ontario (my original destination) but to the 'close by' airport.  He also can't actually issue me a ticket for it because according to their computers I already flew out of the airport.  So I have to go back out to a ticketing agent &lt;span style="font-weight: bold;"&gt;again&lt;/span&gt;.  Have I mentioned yet that I love American Airlines?  So I go back out and go to get my ticket.&lt;br /&gt;&lt;br /&gt;When I get there I let the lady at the counter know everything that has happened and what my current situation is regarding the fact that I'm actually still in the airport despite what the computer says.  She managed to actually get me a confirmed ticket on a 4:55pm flight to the 'close by' airport, but it was already 4:05 at this point so I had to hurry.  She also wasn't able to get me a seat assignment but assured me that they would give me one when I arrived.  I ran to security, got threw there and then ran to the terminal train.&lt;br /&gt;&lt;br /&gt;I managed to arrive at the gate as the last of the passengers were boarding and told the gate agent what the ticketing agent had said and handed her my ticket.  She was not impressed.  She told me that yes I was &lt;span style="font-style: italic;"&gt;confirmed&lt;/span&gt; but I would have to wait until all of the other passengers were on before they could try to find me a seat.  So I waited for fifteen minutes while they waited to see if anyone else would show up for the flight.  Finally they actually printed me a boarding card and reluctantly allowed me to get on the plane.  I hate American Airlines.&lt;br /&gt;&lt;br /&gt;The flight went off without a hitch, as far as I know since I slept the entire time.  After I got to the 'close by' airport I was told that it was a forty five minute drive when 'traffic is good'.  I hopped on the super shuttle and a quick two hours later I was at the Ontario airport!&lt;br /&gt;&lt;br /&gt;The only good thing I can say about the whole experience is that the airport actually managed to get my luggage to the hotel faster than me.  The scariest part of the whole thing is that I still have the return trip to deal with.  I won't even go into my issues with the rental car company here but it wasn't much better and was exactly what I needed to go along with all of my American Airlines fun.&lt;br /&gt;&lt;br /&gt;Coming soon:  The Flex API Holistic testing day 1 recap.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1843365659011037590-9077625578591364244?l=irspatial.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://irspatial.blogspot.com/feeds/9077625578591364244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1843365659011037590&amp;postID=9077625578591364244' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/9077625578591364244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1843365659011037590/posts/default/9077625578591364244'/><link rel='alternate' type='text/html' href='http://irspatial.blogspot.com/2008/05/traveling-to-esri-holistic-lab.html' title='Traveling to the ESRI Holistic Lab'/><author><name>Danny</name><uri>http://www.blogger.com/profile/04943292767400347033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_ab1lZbmeifw/SHn5LHDiyFI/AAAAAAAAADg/RuWKb8KZ3Oc/S220/renfestme.jpg'/></author><thr:total>0</thr:total></entry></feed>
