<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title><![CDATA[[SoftRatty] tag: flex]]></title>
    <link>http://softratty.com/tag/flex</link>
    <description></description>
    <pubDate>Mon, 24 Nov 2008 06:28:00 +0000</pubDate>
    <generator>iRatty Engine</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <item>
      <title><![CDATA[Feed the Beast]]></title>
      <link>http://softratty.com/article/64c5fa94847a050edf210d0955c93511</link>
      <guid>http://softratty.com/article/64c5fa94847a050edf210d0955c93511</guid>
      <description><![CDATA[Working with the local database can be a bit of a challenge. If the db is not well organized and if your application structures are not well thought out then you can end up with a real mess. As I said...]]></description>
      <content:encoded><![CDATA[
	<p>Working with the local database can be a bit of a challenge.&#160; If the db is not well organized and if your application structures are not well thought out then you can end up with a real mess.&#160; As I said <a href="http://blogs.adobe.com/steampowered/2008/11/thats_no_moon.html">before</a>, sitting down and thinking the data layout all the way through and performing a few simple normalization exercises goes a long way to making the db construction a lot easier. </p>
	<p>Knowing how AIR interacts with the local SQLite database helps as well.&#160;Essentially there are three parts to an AIR database setup:</p>
	<ul>
	  <li>The SQLite database</li>
      <li>A  class to interact with the database</li>
	  <li>Classes to hold the results of a database query </li>
	</ul>
	<h2>The SQLite database </h2>
	<p>AIR uses SQLite for a local/offline database.&#160; SQLite is a very easy db to work with, but its pretty Mickey Mouse in a lot of respects.&#160; For example there is no true auto-increment feature so the developer has to handle record id generation him/herself.&#160; Also there are no foreign keys which means that most relationships between tables must be handled by the calling application.&#160; How can you call yourself a relational database when the major function for controlling relationships does not exist?!</p>
	<p>One tool that anyone working with SQLite databases must have is a database management tool. Sometimes you just need to have a look at what is going on inside the database itself. &#160; There are a few out there for SQLite, but one of the most useful is a simple plugin for Firefox.&#160;<a href="https://addons.mozilla.org/en-US/firefox/addon/5817"> SQLite Manager </a>has many useful features including a simple SQL execution tool, that will make your SQLite development much easier.&#160; Go get it! </p>
	<p>The nice thing about using the built in SQLite database is that you don't need to mess around with a lot of connection properties.&#160; You just point to a .db file (or create one) and away you go. You can concentrate on working with your data instead of trying to find the database. </p>
	<h2>Database Interaction Class </h2>
	<p>To make life easier I re-used a standard J2EE pattern for database connectivity - the Data Access Object (DAO).&#160; A DAO is nothing more complicated than a class that acts as an interface between the AIR app and the database.&#160; This way all db interactions (connection, queries, inserts, etc.) can be centralized and the rest of the AIR application doesn't need to deal with the db trivialities.&#160; The db structure can also be changed without having to rewrite the entire application.</p>
	<p>The first thing that I needed to do was to connect to the database - actually before that I needed to check if the database exists and if not then create it.&#160;&#160; I did this in the constructor for the DAO class as it only needs to be done once. </p>
	<blockquote>
	  <blockquote>
	    <p><font color="#009900">//private vars</font><br />
	      private var _dbExists:Boolean;<br />
	      private var _dbConnection:SQLConnection;<br />
	      private var _createFlyTypeTableStmt:SQLStatement 	= new SQLStatement();</p>
	    <p>........</p>
	    <p> public function LocalDAO(){<br />
	      &#160;&#160; _dbConnection = new SQLConnection();<br />
	      <font color="#009900"><br />
          &#160;&#160;
          // Add event listeners to react when database connection is opened.</font><br />
	      &#160;&#160;
	      _dbConnection.addEventListener(SQLEvent.OPEN, openSuccessHandler);<br />
	      &#160;&#160;
	      //_dbConnection.addEventListener(SQLErrorEvent.ERROR, openErrorHandler);<br />
	      <br />
	      <font color="#009900">&#160;	// The database file is to be stored in the user's application (UserData) folder.</font><br />
	      &#160;&#160;
	      var dbFile:File = File.applicationStorageDirectory.resolvePath(&quot;FlyData.db&quot;);<br />
	      &#160;&#160;
	      trace(&quot;Database file location is: &quot; + dbFile.nativePath);<br />
	      <font color="#009900"><br />
          &#160;&#160;
          //Check if the database has already been created.</font><br />
	      &#160;&#160;
	      _dbExists = dbFile.exists;<br />
	      <br />
	      <font color="#009900">&#160;	//Open the connection.</font><br />
	      &#160;&#160;
	      _dbConnection.open(dbFile);<br />
	      }</p>
      </blockquote>
	</blockquote>
	<p>The nice thing is that if the FlyData.db database file does not exist then one will be created for me.&#160;</p>
	<p>The openSuccessHandler listener will wait until the db is opened (or created and opened).&#160; If it is newly created then I want to create the tables in the database as well.&#160; The listener will then call a method called initDatabase that will fire a bunch of CREATE SQL statements. Most interactions with the database happen via a SQLStatement, through which you pass standard <a href="http://www.w3schools.com/sql/default.asp">SQL queries</a> as strings.&#160; The SQLStatement is pointed to the correct database using a SQLConnection object. &#160;</p>
	<blockquote>
	  <blockquote>
	    <p><font color="#0033FF">/**<br />
        * Success handler for _dbConnection <br />
        **/ </font><br />
	      <font color="#0000FF">private</font> function openSuccessHandler(event:SQLEvent):<font color="#0000FF">void</font><br />
	      {<br />
	     &#160;&#160;&#160; <font color="#009900">//We have an open handle to the database file.<br />
&#160;&#160;&#160; //Next, we need to create the tables if this is a new database</font><br />
	     &#160;&#160;&#160; if(_dbExists){<br />
	     &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; trace(&quot;Application Database already exists.&quot;);<br />
	     &#160;&#160;&#160; }else{<br />
	     &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; trace(&quot;New Application Database, must generate tables&quot;);<br />
	     &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; initDatabase();<br />
	     &#160;&#160;&#160; }<br />
	      }</p>
	    <p><font color="#0000FF">private</font> function initDatabase():<font color="#0000FF">void</font>{<br />
         &#160;&#160;&#160; _createFlyTypeTableStmt.sqlConnection = _dbConnection;<br />
<br />
&#160;&#160;&#160;<font color="#009900">
//Create the database tables </font><br />
&#160;&#160;&#160;
var sql:String = &quot;<font color="#990000">CREATE TABLE `Material` (`MaterialID` INTEGER UNSIGNED NOT NULL, `MaterialName` VARCHAR(45) NOT NULL,`Color` VARCHAR(45) NOT NULL,  `Size` VARCHAR(45) NOT NULL, PRIMARY KEY (`MaterialID`))</font>&quot;;<br />
&#160;&#160;&#160;
_createFlyTypeTableStmt.text = sql;<br />
&#160;&#160;&#160;
_createFlyTypeTableStmt.execute(); <br />
	    </p>
	    <p><font color="#009900">//more create statements follow .....</font>           <br />
	    </p>
      </blockquote>
    </blockquote>
	<p>Great, now the database exists, has been connected and I know for sure that I have a table structure.&#160; Next I need to be able to select and insert records.</p>
	<h2>Query Results Classes </h2>
	<p>You need to have a place to put the results of a search.&#160; In Java you have a result set that you can parse for specific db columns.&#160; In AIR the execution of an SQLStatement returns an array of objects.&#160; The objects must match the structure of the query exactly (and I do mean exactly).&#160; Therefore, for all practical purposes, you need to have a class for each database search - one for each table (or one that matches multiple tables in the case of a join).</p>
	<p>The next thing to do then is to create classes for each of the possible searches.&#160; In my case this means that each table will need a corresponding class.&#160; For example I have a table called Material that has a MaterialID, MaterialName, Color and Size.&#160; I therefore need a class that has all of those elements:</p>
	<blockquote>
	  <blockquote>
	    <p><font color="#660099">package</font> components.dataStructures<br />
          {<br />
         &#160;&#160; <font color="#0000FF">public</font> <font color="#660099">class</font> Material         &#160;&#160; {<br />
         &#160;&#160;&#160;&#160;&#160; <font color="#0000FF">public</font> var MaterialID:int;<br />
         &#160;&#160;&#160;&#160;&#160; <font color="#0000FF">public</font> var MaterialName:String;<br />
         &#160;&#160;&#160;&#160;&#160; <font color="#0033FF">public</font> var Color:String;<br />
         &#160;&#160;&#160;&#160;&#160; <font color="#0000FF">public</font> var Size:String;<br />
          <br />
         &#160;&#160; <font color="#0000FF">public</font> <font color="#006600">function</font> Material(){<br />
         &#160;&#160; }</p>
	    <p> &#160;	}<br />
          }</p>
      </blockquote>
    </blockquote>
	<p>When I perform a query against the Material database the result will be mapped into an array of the class Material:</p>
	<blockquote>
	  <blockquote>
	    <p> <font color="#0000FF">public</font> <font color="#006600">function</font> getMaterials():void{<br />
          <br />
	     &#160;&#160;&#160; _dbMaterialStatement.sqlConnection = _dbConnection; <br />
	     &#160;&#160;&#160; var sqlQuery:String = &quot;<font color="#990000">SELECT * FROM Material</font>&quot;;<br />
	     &#160;&#160;&#160; <span style="background-color: #FFFF00">_dbMaterialStatement.itemClass = Material;</span><br />
	     &#160;&#160;&#160; _dbMaterialStatement.text = sqlQuery;<br />
          <font color="#009900">&#160;&#160;	//SQL calls are asynchronous so a listener for the results is required</font><br />
	     &#160;&#160;&#160; _dbMaterialStatement.removeEventListener(SQLEvent.RESULT,onDBMaterialSelectResult);<br />
	     &#160;&#160;&#160; _dbMaterialStatement.addEventListener(SQLEvent.RESULT, onDBMaterialSelectResult);<br />
	     &#160;&#160;&#160; _dbMaterialStatement.execute();<br />
          <br />
	      } </p>
      </blockquote>
	</blockquote>
	<p>In AIR, database calls are asynchronous.&#160; This means most calls to the db will involve the setup of a listener.&#160; This can be a bit of a pain because its difficult to just setup a method to make a call and return a value, you have to setup a listener to wait for the call to be executed.&#160; This leads to many, many listeners floating around and , take my advice, you need to make sure you remove the listeners when they are not needed. </p>
	<blockquote>
	  <blockquote>
	    <p> <font color="#0000FF">private</font> <font color="#006600">function</font> onDBMaterialSelectResult(event:SQLEvent):<font color="#0000FF">void</font>{<br />
	     &#160;&#160; var result:SQLResult = _dbMaterialStatement.getResult();<br />
	     &#160;&#160; <font color="#0000FF">if</font> (result != <font color="#0000FF">null</font>){<br />
	     &#160;&#160;&#160;&#160;&#160;&#160; MaterialData = result.data;<br />
	     &#160;&#160; } <br />
	      } </p>
      </blockquote>
	</blockquote>
	<h2>Guess What Class I Am </h2>
	<p>As I said earlier, because SQLite does not implement a proper auto-increment feature, you must do it yourself.&#160; Shouldn't be too hard - get the MAX of a column, add one and Bob's your Uncle.&#160;&#160; Something like:<br /> 
      <font color="#990000">&quot;SELECT MAX(MaterialID) FROM Material&quot; </font><br />
      should work fine. That works, but there is an important little trick.&#160;  AIR returns the result of all db queries as an array of objects, you must specify what those objects are, usually by setting the SQLStatement's itemClass property.&#160; Unfortunately this doesn't seem to work too well for the MAX function.&#160; I thought that MAX should return an integer, or at best a long - but it doesn't.  Setting the code to:<br /> 
      <font color="#990033">_dbMaxStatement.itemClass = int;</font><br />
      didn't work.&#160; With much use of the Flex Builder's debugging tool, I determined that the MAX statement was returning an &quot;id&quot; class.&#160; Okay, what the heck is an id class?&#160; I can't just set<br />
      <font color="#990033">_dbMaxStatement.itemClass = id;</font><br />
    because I don't have the class &quot;id&quot; anywhere in my code - and I couldn't figure out its package designation. I tried recasting the result to an integer and it didn't work either. This all got very frustrating until a colleague pointed out that you can set the returned class type in the SQLStatement text itself.  This lead to the following code:</p>
	<blockquote>
	  <blockquote>
	    <p> <br />
	      _dbMaxStatement.sqlConnection = _dbConnection;<br />
          <font color="#0066FF">var</font> sqlQuery:String = &quot;<font color="#990000">SELECT MAX(MaterialID) AS id FROM Material</font>&quot;;<br />
	      _dbMaxStatement.text = sqlQuery;<br />
	      _dbMaxStatement.execute();<br />
          <br />
          <font color="#0066FF">var</font> result:SQLResult = _dbMaxStatement.getResult();<br />
          <font color="#0066FF">var</font> myint:int = result.data[0].id;<br />
	      MaterialMax = myint;<br />
          <font color="#9966FF">trace</font> (&quot;<font color="#990000">***** MaterialMax:</font> &quot; + MaterialMax); </p>
      </blockquote>
	</blockquote>
	<p>That little &quot;AS id&quot; makes all the difference in the world.</p>
	<h2>Prepared Statement </h2>
	<p>The one other thing that I wanted to mention is the use of variables inside a SQLStatement.&#160; Since the statement is essentially a string, you could write it like:<br />
      <font color="#0000FF">var</font> sqlQuery:String = &quot;<font color="#990000">INSERT into Material (MaterialID, MaterialName, Color, Size) VALUES('</font>&quot; + material.MaterialID + &quot;<font color="#990000">','</font>&quot; + material.MaterialName + &quot;<font color="#990000">','</font>&quot; + material.Color +  &quot;<font color="#990000">','</font>&quot; + material.Size + &quot;<font color="#990000">')</font>&quot;; The problem is that keeping track of the quotes and commas quickly becomes a nightmare.&#160; Fortunately there is an easier way. </p>
	<p>In Java there is the concept of a &quot;prepared statement&quot; in which a question mark is substituted for a variable entry in an SQL statement.&#160; ActionScript has the same concept although it uses an @ symbol and a variable name instead of a question mark.&#160; Using this method the same SQL command can be written as:</p>
	<blockquote>
      <blockquote>
        <p><font color="#0000FF">var</font> sqlQuery:String = &quot;<font color="#990000">INSERT into Material (MaterialID, MaterialName, Color, Size) VALUES(@MatID, @MatName, @MatColor, @MatSize)</font>&quot;;<br />
          _dbMaterialStatement.text = sqlQuery;<br />
          _dbMaterialStatement.parameters[&quot;<font color="#990000">@MatID</font>&quot;] = material.MaterialID;<br />
          _dbMaterialStatement.parameters[&quot;<font color="#990000">@MatName</font>&quot;] = material.MaterialName;<br />
          _dbMaterialStatement.parameters[&quot;<font color="#990000">@MatColor</font>&quot;] = material.Color;<br />
          _dbMaterialStatement.parameters[&quot;<font color="#990000">@MatSize</font>&quot;] = material.Size; </p>
      </blockquote>
	</blockquote>
	<p>This makes the code much easier to read and maintain.  </p>
	<h2>Conclusion</h2>
	<p>Using the above methods I created the other tables, classes for holding results and DAO methods for querying and updating the database.&#160; The next step will be to wire the database stuff back into the display objects that I created earlier.&#160; As you may recall I had setup some temporary data sources that were hard coded.&#160; I now want to use the real objects as returned from the database. </p>
	<p><BR/>
    </p>
  ]]></content:encoded>
      <pubDate>Tue, 02 Dec 2008 08:03:19 +0000</pubDate>
      <category domain="http://softratty.com/tag/class">class</category>
      <category domain="http://softratty.com/tag/database interaction class">database interaction class</category>
      <category domain="http://softratty.com/tag/public class material">public class material</category>
      <category domain="http://softratty.com/tag/material">material</category>
      <category domain="http://softratty.com/tag/table material">table material</category>
      <category domain="http://softratty.com/tag/material database">material database</category>
      <category domain="http://softratty.com/tag/application database">application database</category>
      <category domain="http://softratty.com/tag/application">application</category>
      <category domain="http://softratty.com/tag/database">database</category>
      <source url="http://blogs.adobe.com/steampowered/2008/12/feed_the_beast.html">Feed the Beast</source>
    </item>
    <item>
      <title><![CDATA[Tour de Flex]]></title>
      <link>http://softratty.com/article/ebafb4d3bb69fe0e42fe4c29ea6942f6</link>
      <guid>http://softratty.com/article/ebafb4d3bb69fe0e42fe4c29ea6942f6</guid>
      <description><![CDATA[While at MAX, I learned about the 'Tour de Flex' website. I'm excited about the resources that are offered at Flex.org, but the Tour de Flex tool is especially focused and useful
First, the site...]]></description>
      <content:encoded><![CDATA[<p><a href="http://flex.org/tour" target="new"><img alt="tourdeflex.png" src="http://blogs.adobe.com/viab/images/tourdeflex.png" width="268" height="61" border="0"/></a></p>

<p>While at MAX, I learned about the 'Tour de Flex' website. I'm excited about the resources that are offered at Flex.org, but the Tour de Flex tool is especially focused and useful.  </p>

<p>First, the site allows you to download the <a href="http://flex.org/tour" target="new">Tour de Flex</a> AIR app.  This is a tool similar to the <a href="http://examples.adobe.com/flex3/componentexplorer/explorer.html" target="new">Adobe Flex 3 Component Explorer</a>.  The <b>Tour de Flex</b> version is expanded, with 200 component examples, covering core components, data access, data visualization, mapping. and many others.   Because it is an AIR app, the tool can also demo components and language features only available in AIR.  There is also a listing of custom components, effects, skins, and other content created by the community.   </p>

<p>One of the features I'm most excited about is the listing of Cloud APIs</p>

<p><img alt="cloudapi.png" src="http://blogs.adobe.com/viab/images/cloudapi.png" width="237" height="422" style="float:right"/><br />
A few clicks brings up example code for a bunch of online APIs.  Viewing how to get started with Ebay, Amazon, or Google Maps is a great way to help an idea get off the ground.  Even better, there's examples for some of the services that Adobe offers, like Acrobat.com and Photoshop.com.  Way cool.</p>

<p>The tool also includes a download option, which creates a zip of the source code for the example you choose to download.  </p>

<p>Another great feature is the Tour de Flex plugin for Eclipse.  With this installed, you can browse the 200 examples from within your IDE.  Having an example to look at often makes it easier to implement a component you haven't used before, or one you haven't used in a while.  With this, there's no need to go looking around on the web for example code.</p>

<p>Check out the <a href="http://flex.org/tour" target="new">Tour de Flex</a> page for more detail.</p>]]></content:encoded>
      <pubDate>Mon, 01 Dec 2008 16:23:07 +0000</pubDate>
      <category domain="http://softratty.com/tag/flex">flex</category>
      <category domain="http://softratty.com/tag/flex air app">flex air app</category>
      <category domain="http://softratty.com/tag/air">air</category>
      <category domain="http://softratty.com/tag/flex plugin">flex plugin</category>
      <category domain="http://softratty.com/tag/tour">tour</category>
      <category domain="http://softratty.com/tag/flex tool">flex tool</category>
      <category domain="http://softratty.com/tag/adobe flex">adobe flex</category>
      <category domain="http://softratty.com/tag/component explorer">component explorer</category>
      <category domain="http://softratty.com/tag/component">component</category>
      <source url="http://blogs.adobe.com/viab/2008/12/tour_de_flex.html">Tour de Flex</source>
    </item>
    <item>
      <title><![CDATA[This Week's Top Posts (11/26)]]></title>
      <link>http://softratty.com/article/c7e7b47f7219f7fec8bfa8b805a0a7d3</link>
      <guid>http://softratty.com/article/c7e7b47f7219f7fec8bfa8b805a0a7d3</guid>
      <description><![CDATA[Here is a collection of blog posts from my coworkers on the Flex SDK, Flex Builder, AIR, and Text Layout Framework teams
Alex's Flex Closet (Alex Harui): Faster DataGrid Horizontal Scrolling
Ted On...]]></description>
      <content:encoded><![CDATA[Here is a collection of blog posts from my coworkers on the Flex SDK, Flex Builder, AIR, and Text Layout Framework teams:
<ul>
	<li>Alex's Flex Closet (Alex Harui): <a href="http://blogs.adobe.com/aharui/2008/11/faster_datagrid_horizontal_scr.html">Faster DataGrid Horizontal Scrolling</a></li>
	<li>Ted On Flex (Ted Patrick): <a href="http://onflash.org/ted/2008/11/adobe-groups-launched.php">Adobe Groups Launched!</a></li>
	<li>Adobe Developer Connection: <a href="http://feeds.feedburner.com/~r/developer_center_tutorials/~3/461329587/rluxemburg_adobe_groups.html">Meet Adobe Groups</a></li>
	<li>Ted On Flex (Ted Patrick): <a href="http://onflash.org/ted/2008/11/3rd-party-components-into-tour-de-flex.php">3rd Party Components into Tour De Flex</a></li>
	<li>Matt Chotin: <a href="http://weblogs.macromedia.com/mchotin/archives/2008/11/judging_the_rib.html">Judging the Ribbit Killer App Challenge</a></li>
	<li>Flex Team blog: <a href="http://feeds.feedburner.com/~r/flexteam/~3/465061212/zend_releases_zend_framework_1.html">Zend Releases Zend Framework 1.7 with AMF Support</a></li>
	<li>Sujit Reddy G - The Evangelist: <a href="http://sujitreddyg.wordpress.com/2008/11/25/measuring-message-processing-performance/">Measuring message processing performance</a></li>
	<li>Text Layout Framework Team blog: <a href="http://blogs.adobe.com/tlf/2008/11/welcome_to_the_text_layout_fra.html">Welcome to the Text Layout Framework Team Blog</a></li>
	<li>Text Layout Framework Team blog: <a href="http://blogs.adobe.com/tlf/2008/11/embedded_font_subsetting_using.html">Embedded Font Subsetting Using DefineFont4</a></li>
	<li>AIR Team blog: <a href="http://blogs.adobe.com/air/2008/11/google_maps_api_for_flash_now_1.html">Google Maps API for Flash now supports Adobe AIR</a></li>
	<li>AIR Team blog: <a href="http://blogs.adobe.com/air/2008/11/ext_js_announces_enhanced_supp.html">Ext JS announces enhanced support for Adobe AIR</a></li>
	<li>AIR Team blog: <a href="http://blogs.adobe.com/air/2008/11/building_desktop_applications.html">Building Desktop Applications Powered by Dojo and Adobe AIR</a></li>
	<li>AIR Team blog: <a href="http://blogs.adobe.com/air/2008/11/application_mashups_on_adobe_a.html">Application mashups on Adobe AIR</a></li>
	<li>James Ward - RIA Cowboy: <a href="http://www.jamesward.com/blog/2008/11/25/using-adobe-air-and-flex-to-make-your-apps-bling/">Using Adobe AIR and Flex to Make Your Apps *Bling*</a></li>
	<li>Flex Builder Tech Note: <a href="http://www.adobe.com/go/kb407675">Installing in a non-default directory may result in lost data (Flex Builder 3.0.2 on Mac)</a></li>
</ul>

<p>And from our friends on the Flash Authoring, and Flash Platform Evangelism teams: </p>
<ul>
	<li>Flashthusiast (Jen deHaan): <a href="http://feeds.feedburner.com/~r/flashthusiast/~3/464563778/">Lists of keyboard modifiers in the Flash CS4 motion model - lets you do more stuff</a></li>
	<li>Daniel Dura: <a href="http://feeds.feedburner.com/~r/danieldura/~3/464128262/another-twittercamp-update">Another TwitterCamp Update</a></li>
	<li>The Flash Blog (Lee Brimelow): <a href="http://theflashblog.com/?p=477">Download Tour de Flex right now!</a></li>
	<li>The Flash Blog (Lee Brimelow): <a href="http://theflashblog.com/?p=478">Flash and Flex Project Builder application</a></li>
	<li>The Flash Blog (Lee Brimelow): <a href="http://theflashblog.com/?p=480">New tutorial on customizing Flex Builder</a></li>
	<li>The Flash Blog (Lee Brimelow): <a href="http://theflashblog.com/?p=479">Win $100,000 doing Flash development!</a></li>
</ul>

<p>Finally, a bunch of post-MAX wrap-ups, and session notes/files:</p>
<ul>
	<li>Ted On Flex (Ted Patrick): <a href="http://onflash.org/ted/2008/11/max-2008-na-session-recording.php">MAX 2008 NA Session Recording</a></li>
	<li>Adobe MAX Blog: <a href="http://max.adobe.com/blog/2008/11/max-2008-na-session-recording.html">MAX 2008 NA Session Recording</a></li>
	<li>AIR Team blog: <a href="http://blogs.adobe.com/air/2008/11/max_session_maintain_security.html">MAX Session: Maintain Security With Adobe AIR</a></li>
	<li>AIR Team blog: <a href="http://blogs.adobe.com/air/2008/11/oliver_goldmans_high_performan.html">Oliver Goldman's "High Performance AIR Applications" MAX 2008 slides now available</a></li>
	<li>Kevin Hoyt: <a href="http://blog.kevinhoyt.org/2008/11/25/max-2008-review-and-content/">MAX 2008 Review and Content</a></li>
	<li>James Ward - RIA Cowboy: <a href="http://www.jamesward.com/blog/2008/11/25/duanes-world-road-to-max-2008-europe-with-james-ward/">Duane's World: Road to MAX 2008 Europe with James Ward</a></li>
	<li>Adobe MAX Blog: <a href="http://max.adobe.com/blog/2008/11/duanes-world-road-to-max-2008-europe.html">Duane's World: Road to MAX 2008 Europe with James Ward</a></li>
	<li>FLEXing My Muscle (Raghu Rao): <a href="http://raghuonflex.wordpress.com/2008/11/17/the-msrit-mojo-flex-bootcamp-day-1/">The MSRIT Mojo - Flex Bootcamp [Day 1]</a> and <a href="http://raghuonflex.wordpress.com/2008/11/18/the-msrit-mojo-flex-bootcamp-day-2/">The MSRIT Mojo - Flex Bootcamp [Day 2]</a></li>
</p>]]></content:encoded>
      <pubDate>Wed, 26 Nov 2008 14:33:40 +0000</pubDate>
      <category domain="http://softratty.com/tag/adobe air">adobe air</category>
      <category domain="http://softratty.com/tag/air">air</category>
      <category domain="http://softratty.com/tag/performance air applications">performance air applications</category>
      <category domain="http://softratty.com/tag/performance">performance</category>
      <category domain="http://softratty.com/tag/air team blog">air team blog</category>
      <category domain="http://softratty.com/tag/supports adobe air">supports adobe air</category>
      <category domain="http://softratty.com/tag/max session">max session</category>
      <category domain="http://softratty.com/tag/max">max</category>
      <category domain="http://softratty.com/tag/flex">flex</category>
      <source url="http://blogs.adobe.com/pdehaan/2008/11/this_weeks_top_posts_1126.html">This Week's Top Posts (11/26)</source>
    </item>
    <item>
      <title><![CDATA[Granite Data Services 1.2.0 RC1 (Default branch)]]></title>
      <link>http://softratty.com/article/cc13727a7c8bc82f214ba7ba3a32eeae</link>
      <guid>http://softratty.com/article/cc13727a7c8bc82f214ba7ba3a32eeae</guid>
      <description><![CDATA[Granite Data Services (GDS) is an alternative to Adobe LiveCycle (Flex 2) Data Services for J2EE application servers. The primary goal of this project is to provide a framework for Flex...]]></description>
      <content:encoded><![CDATA[Granite Data Services (GDS) is an alternative to Adobe LiveCycle (Flex 2) Data Services for J2EE application servers. The primary goal of this project is to provide a framework for Flex 2+/EJB3/Seam/Spring/Guice/Pojo application development with full AMF3/RemoteObject benefits. It also features a Comet-like Data Push implementation (AMF3 requests sent over HTTP) and ActionScript3 code generation tools (Ant task and Eclipse Builder).
<hr />
<strong>License:</strong> GNU Lesser General Public License (LGPL)
<hr />
<strong>Changes:</strong><br />
The Jetty/Continuation implementation of Gravity
was broken, while Tomcat/CometProcessor didn't
scale well on heavy load. A new experimental
feature has been added: Producer/Consumer should
now automatically reconnect (and resubscribe) when
the webapp is reloaded. Tide is now compatible
with Seam 2.1. Additionally, there is new
experimental Tide integration with plain EJB and
Spring. A GlassFish security service and TopLink
persistence support were added.<br style="clear: both;"/>
<a href="http://www.pheedo.com/click.phdo?s=035de59b02abe5385facf1f8e3ffb864&p=1"><img alt="" style="border: 0;" border="0" src="http://www.pheedo.com/img.phdo?s=035de59b02abe5385facf1f8e3ffb864&p=1"/></a>
<img src="http://www.pheedo.com/feeds/tracker.php?i=035de59b02abe5385facf1f8e3ffb864" style="display: none;" border="0" height="1" width="1" alt=""/>


]]></content:encoded>
      <pubDate>Wed, 26 Nov 2008 12:48:35 +0000</pubDate>
      <category domain="http://softratty.com/tag/data services">data services</category>
      <category domain="http://softratty.com/tag/granite data services">granite data services</category>
      <category domain="http://softratty.com/tag/experimental tide integration">experimental tide integration</category>
      <category domain="http://softratty.com/tag/tide">tide</category>
      <category domain="http://softratty.com/tag/public license">public license</category>
      <category domain="http://softratty.com/tag/toplink persistence support">toplink persistence support</category>
      <category domain="http://softratty.com/tag/j2ee application servers">j2ee application servers</category>
      <category domain="http://softratty.com/tag/license">license</category>
      <category domain="http://softratty.com/tag/glassfish security service">glassfish security service</category>
      <source url="http://www.pheedo.com/click.phdo?i=035de59b02abe5385facf1f8e3ffb864">Granite Data Services 1.2.0 RC1 (Default branch)</source>
    </item>
    <item>
      <title><![CDATA[Tour de Flex - Explore Flex Capabilities and Resources]]></title>
      <link>http://softratty.com/article/d13c4e4c073a4da3e84018e753b4f058</link>
      <guid>http://softratty.com/article/d13c4e4c073a4da3e84018e753b4f058</guid>
      <description><![CDATA[Tour de Flex is a desktop application for exploring Flex capabilities and resources, including the core Flex components, Adobe AIR and data integration, as well as a variety of third-party components,...]]></description>
      <content:encoded><![CDATA[<p><a title="Tour de Flex" href="http://flex.org/tour" target="_blank">Tour de Flex</a> is a desktop application for exploring Flex capabilities and resources, including the core Flex components, Adobe AIR and data integration, as well as a variety of third-party components, effects, skins, and more. Tour de Flex has three primary purposes:</p>
<ul>
<li>Provide non-Flex developers with a good overview of what is possible in Flex in a “look and see” environment</li>
<li>Provide Flex developers with an illustrated reference tool</li>
<li>Provide commercial and non-commercial Flex developers a place to showcase their work</li>
</ul>
<p style="text-align: center;"><a title="Tour de Flex" href="http://flex.org/tour" target="_blank"><img src="http://www.webappers.com/img/2008/11/flex-work.png" alt="Tour de Flex" /></a></p>
<p>One of the objectives of Tour de Flex is to provide a place for developers to showcase their work. They are always looking for new samples to add. You can follow the instruction and complete the <a href="http://flex.org/2008/10/31/submit-component-tour-de-flex" target="_new3">sample submission form</a> in order to submit your own Flex work.</p>
<blockquote><p>Requirements: Flex<br />
Demo: <a rel="nofollow" href="http://flex.org/tour" target="_blank">http://flex.org/tour</a><br />
License: License Free</p></blockquote>
<div class="RelatedPosts"><h3>Related Posts</h3><ul><li><a href="http://www.webappers.com/2007/10/04/showcase-point-is-a-showcase-of-css-flash-galleries/" rel="bookmark" title="October 4, 2007">Showcase Point is a Showcase of CSS, Flash Galleries</a></li>
<li><a href="http://www.webappers.com/2008/08/08/soundsnap-platform-to-find-and-share-sound-effects/" rel="bookmark" title="August 8, 2008">Soundsnap - Platform to Find and Share Sound Effects</a></li>
<li><a href="http://www.webappers.com/2008/05/07/2d-fisheye-menus-component-with-flex/" rel="bookmark" title="May 7, 2008">2D Fisheye Menus Component with Flex</a></li>
<li><a href="http://www.webappers.com/2008/03/15/aspnet-ajax-control-toolkit/" rel="bookmark" title="March 15, 2008">ASP.Net Ajax Control Toolkit</a></li>
<li><a href="http://www.webappers.com/2007/11/01/flare-visualize-charts-and-complex-animations-on-the-web/" rel="bookmark" title="November 1, 2007">Flare - Visualize Charts and Complex Animations on the Web</a></li>
</ul></div><!-- Similar Posts took 18.487 ms --><h3>Sponsors</h3><p><a href="http://www.dreamhost.com/r.cgi?311309/signup|WEBAPPER">Dreamhost: Get $50 Off with Coupon Code: WEBAPPERS</a></p><p><a href="http://www.pheedo.com/click.phdo?x=1dc04fa0abd540788a5c9b9b70833980&u=%%UNIQUEID%%"><img src="http://www.pheedo.com/img.phdo?x=1dc04fa0abd540788a5c9b9b70833980&u=%%UNIQUEID%%" border="0"/></a>
</p><div class="feedflare">
<a href="http://feedproxy.google.com/~f/Webappers?a=zs5fdDgv"><img src="http://feedproxy.google.com/~f/Webappers?d=41" border="0"></img></a> <a href="http://feedproxy.google.com/~f/Webappers?a=C19dkyN8"><img src="http://feedproxy.google.com/~f/Webappers?d=50" border="0"></img></a> <a href="http://feedproxy.google.com/~f/Webappers?a=ShpfEvxJ"><img src="http://feedproxy.google.com/~f/Webappers?i=ShpfEvxJ" border="0"></img></a> <a href="http://feedproxy.google.com/~f/Webappers?a=eloOBtOP"><img src="http://feedproxy.google.com/~f/Webappers?i=eloOBtOP" border="0"></img></a> <a href="http://feedproxy.google.com/~f/Webappers?a=roou8BUa"><img src="http://feedproxy.google.com/~f/Webappers?i=roou8BUa" border="0"></img></a>
</div><img src="http://feedproxy.google.com/~r/Webappers/~4/p-Ua08ymX-w" height="1" width="1"/>]]></content:encoded>
      <pubDate>Wed, 26 Nov 2008 04:01:44 +0000</pubDate>
      <category domain="http://softratty.com/tag/provide">provide</category>
      <category domain="http://softratty.com/tag/provide flex developers">provide flex developers</category>
      <category domain="http://softratty.com/tag/developers">developers</category>
      <category domain="http://softratty.com/tag/flex">flex</category>
      <category domain="http://softratty.com/tag/flex capabilities">flex capabilities</category>
      <category domain="http://softratty.com/tag/non-commercial flex developers">non-commercial flex developers</category>
      <category domain="http://softratty.com/tag/core flex components">core flex components</category>
      <category domain="http://softratty.com/tag/provide non-flex developers">provide non-flex developers</category>
      <category domain="http://softratty.com/tag/tour">tour</category>
      <source url="http://feedproxy.google.com/~r/Webappers/~3/p-Ua08ymX-w/">Tour de Flex - Explore Flex Capabilities and Resources</source>
    </item>
    <item>
      <title><![CDATA[Embedded Font Subsetting Using DefineFont4]]></title>
      <link>http://softratty.com/article/25ebede579002610ecaf34155699897a</link>
      <guid>http://softratty.com/article/25ebede579002610ecaf34155699897a</guid>
      <description><![CDATA[The first tidbit of information I would like to share with you is how to use DefineFont4 to selectively embed glyphs from a font for use in Text Layout Framework, also knowing as font subsetting....]]></description>
      <content:encoded><![CDATA[The first tidbit of information I would like to share with you is how to use DefineFont4 to selectively embed glyphs from a font for use in Text Layout Framework, also knowing as font subsetting. While subsetting is not new to Flash via DefineFont3, it is limited to little more than embedding the outlines of glyphs. With DefineFont4, you are able to embed a complete portion of an OpenType font, including the tables (horizontal/vertical metrics, ligatures, kerning, GSUB, GPOS, etc...) that TLF has excellent support for. This is absolutely essential for fully supporting many complex scripts. Although currently you are required to use Flex Gumbo to get access to DefineFont4, I will show you how to use it no matter what type of Flash project you are working on by creating a font SWF.  This is valuable knowledge for taking full advantage of TLF without burdening your users with the weight of embedding an entire font. It is especially important when including text from a font such as Adobe Song Std. Weighing in at a hefty 14.8MB it would be ridiculous to embed the entire font, but this should not stop you from taking advantage of all the new features in TLF.<h2>DefineFont4 Embedded Font Subsetting in Flex Gumbo</h2>
First of all, you need to set up Flex Gumbo for use in your development environment. There are some instructions for doing so here: <a href="http://blog.flexexamples.com/2008/08/02/using-the-beta-gumbo-sdk-in-flex-builder-3/">using the beta gumbo sdk in flex builder 3</a>.<br />
<br />
First, I'll show you the code for embedding a full font with DefineFont4:<br />
<div class="code">[Embed(source='C:/WINDOWS/Fonts/AdobeArabic-Regular.otf', cff='true', fontFamily='_AdobeArabicFull')]<br />
private const AdobeArabicFullFont:Class;</div><br />
Note the cff='true' attribute. This is necessary to specify DefineFont4. The fontFamily is a user-specified value that will be used later to refer to the embedded font.<br />
<br />
The unicodeRange attribute is the key to subsetting. It accepts a comma separated list of Unicode values. There are two methods for specifying these values: individual (U+0627) and ranges (U+0625-U+0630). I recommend <a href="http://www.babelstone.co.uk/Software/BabelPad.html">BabelPad</a> for converting your text into Unicode for use in selecting the unicodeRange values.<br />
<div class="code">[Embed(source='C:/WINDOWS/Fonts/AdobeArabic-Regular.otf', cff='true', fontFamily='_AdobeArabicSubset', unicodeRange='U+0627,U+0644,U+0625,U+062E,U+0627,U+0621')]<br />
private const AdobeArabicSubsetFont:Class;</div><br />
<br />
The following is the full code for my subsetting example. The TextView component is a Gumbo instance of Text Layout Framework. I have included three of them to demonstrate the difference in specifying device, subsetted, and fully embedded fonts. Note that the embedded fonts all include the fontLookup="embeddedCFF" attribute and reference the fontFamily that was specified above to select the appropriate font.<br />
<div class="code">
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;FxApplication name="Subsetting Example" xmlns="http://ns.adobe.com/mxml/2009"&gt;<br />
	&lt;layout&gt;&lt;HorizontalLayout/&gt;&lt;/layout&gt;<br />
	&lt;Script&gt;<br />
		&lt;![CDATA[<br />
			[Embed(source='C:/WINDOWS/Fonts/AdobeArabic-Regular.otf', cff='true', fontFamily='_AdobeArabicSubset', unicodeRange='U+0627,U+0644,U+0625,U+062E,U+0627,U+0621')]<br />
			private const AdobeArabicSubsetFont:Class;<br />
		<br />
			[Embed(source='C:/WINDOWS/Fonts/AdobeArabic-Regular.otf', cff='true', fontFamily='_AdobeArabicFull')]<br />
			private const AdobeArabicFullFont:Class;<br />
		]]&gt;<br />
	&lt;/Script&gt;<br />
	<br />
	&lt;TextView id="deviceFont" fontSize="28" fontLookup="device" fontFamily="AdobeArabic-Regular"&gt;<br />
		Device: &amp;#x0627;&amp;#x0644;&amp;#x0625;&amp;#x062E;&amp;#x0627;&amp;#x0621;<br />
	&lt;/TextView&gt;<br />
	&lt;TextView id="subsetFont" fontSize="28" fontLookup="embeddedCFF" fontFamily="_AdobeArabicSubset"&gt;<br />
		Subset: &amp;#x0627;&amp;#x0644;&amp;#x0625;&amp;#x062E;&amp;#x0627;&amp;#x0621;<br />
	&lt;/TextView&gt;<br />
	&lt;TextView id="fullFont" fontSize="28" fontLookup="embeddedCFF" fontFamily="_AdobeArabicFull"&gt;<br />
		Full: &amp;#x0627;&amp;#x0644;&amp;#x0625;&amp;#x062E;&amp;#x0627;&amp;#x0621;<br />
	&lt;/TextView&gt;<br />
&lt;/FxApplication&gt;
</div>
<br />
Output from this SWF looks like this (image edited to fit on the page):<br />
<img alt="SubsetExampleOutput.png" src="http://blogs.adobe.com/tlf/SubsetExampleOutput.png" /><br />
Notice how the 'Subset:' text is using the Times New Roman as a fallback font. The necessary glyphs were not included due to the subset. The coolest part about this example is that the Arabic text is using ligatures to display itself properly, and you didn't have to worry about that when choosing the values to embed!<br />
<br />
<h2>Building a Font SWF for use in any Flash Application</h2>
This was an important technique used for the 'World Language' portion of the 'World Class Text Tour' on our labs page. While the application was being built in Flash CS4, it was necessary to use DefineFont4 subsetting in order to embed the glyphs used in all 10 of the language samples and show off all the features that enable all of those complex scripts to look fantastic. It's extremely simple to build a Font SWF, in fact, just remove the TextView components from the example in the previous section and you have a Font SWF ready to be used in any Flash app.<br />
<br />
<span style="font-weight: bold;">Using a font SWF in a Flex/AIR application:</span>
There is already a great explanation of this over on Flex examples: <a href="http://blog.flexexamples.com/2007/10/25/embedding-fonts-from-a-flash-swf-file-into-a-flex-application/">embedding fonts from a flash swf file into a flex application</a>.
<br />
<br />
<span style="font-weight: bold;">Using a font SWF in a Flash Profession CS4 application:</span>
As I mentioned above, the 'World Language' portion of the 'World Class Text Tour' on our labs pages used DefineFont4 embedding for all of the languages. Their app is a great example of how to use a font SWF in a Flash CS4 app and we've made the source available for download: <a href="http://download.macromedia.com/pub/labs/textlayout/source/WorldLanguages.zip">World Language Source Code</a>. It makes use of the Font.registerFont call in order to make the embedded fonts available for use in TLF. The code for the font SWF is also included in that ZIP file. Please feel free to post in the comments if you'd like to see us do a more in depth explanation of how this is working.
<br />
<br />
Also - for general information about font embedding in Flash Professional CS4, check out page 6 in our <a href="http://www.adobe.com/go/textlayout_flashcomponent_overview">Flash CS4 Component Overview</a>.]]></content:encoded>
      <pubDate>Tue, 25 Nov 2008 15:04:19 +0000</pubDate>
      <category domain="http://softratty.com/tag/font">font</category>
      <category domain="http://softratty.com/tag/flash swf file">flash swf file</category>
      <category domain="http://softratty.com/tag/swf">swf</category>
      <category domain="http://softratty.com/tag/font swf">font swf</category>
      <category domain="http://softratty.com/tag/opentype font">opentype font</category>
      <category domain="http://softratty.com/tag/fallback font">fallback font</category>
      <category domain="http://softratty.com/tag/font swf ready">font swf ready</category>
      <category domain="http://softratty.com/tag/flash">flash</category>
      <category domain="http://softratty.com/tag/flash app">flash app</category>
      <source url="http://blogs.adobe.com/tlf/2008/11/embedded_font_subsetting_using.html">Embedded Font Subsetting Using DefineFont4</source>
    </item>
    <item>
      <title><![CDATA[Of Referees and Wrenches : Cocomo vs FMS, Redux]]></title>
      <link>http://softratty.com/article/4d7819f5a8972c9362a97dbb571132e8</link>
      <guid>http://softratty.com/article/4d7819f5a8972c9362a97dbb571132e8</guid>
      <description><![CDATA[I wanted to take a few minutes today to respond to Stefan Richter's thoughtful posting from last week , responding to our announcement of the Public Beta. I've always followed Stefan's blog pretty...]]></description>
      <content:encoded><![CDATA[<p>I wanted to take a few minutes today to respond to <a href="http://www.flashcomguru.com/index.cfm/2008/11/17/cocomo-public-beta">Stefan Richter's thoughtful posting from last week</a>, responding to our announcement of the Public Beta. I've always followed Stefan's blog pretty closely, and he's definitely on my "top Flash devs I'd like to have a beer with" list. So when he's got stuff to say about <a href="http://labs.adobe.com/technologies/cocomo/">Cocomo</a>, I listen. </p>

<p><img alt="210px-Referee_hockey_ahl_2004.jpg" src="http://blogs.adobe.com/collabmethods/images/210px-Referee_hockey_ahl_2004.jpg" width="210" height="245" /></p>

<p>  Reading through Stefan's post, there are a few nuggets that were really satisfying (to me, and yes, I crave validation..). </p>

<blockquote>"Having taken part in the Cocomo pre-release program I have had the opportunity to use the technology first hand and the team at Adobe (many of which are familiar faces) have done an incredibly good job. The platform cannot be faulted from a technical standpoint."</blockquote>

<p>  Thanks Stefan! More than anything, I've been focusing on the <a href="http://download.macromedia.com/pub/labs/cocomo/cocomo_developerguide.pdf">API architecture</a>, designing the approach we take in <a href="http://www.adobe.com/go/cocomo_docs_en">exposing the Cocomo platform to developers</a>. Hearing that someone at Stefan's level of experience with FMS thinks we've got a good technical foundation, to me, is nerd manna. To extend the pat-on-the-back-fest for one more quote (then we'll get to the real deal, I promise), I thought this was particularly gratifying - he describes how Cocomo development differs from FMS development : </p>

<blockquote>"A key differentiators is the fact that Cocomo is a pure client side framework, meaning the developer has no access to the server side code. This is not a big issue since Adobe is aiming to provide all required functionality without the developer requiring access to any server side logic."
</blockquote>
 For me, having been in this game a pretty long time, I can remember when an idea like the above ("no access to server side code!") was laughable, something to be derided. Seeing the world slowly come to accept this idea has been a sea change that we're happy to be sailing in.

<p><br />
  But let's not get too caught up in ourselves - Stefan has some pretty pointed commentary around Cocomo's positioning with regard to <a href="http://www.adobe.com/products/flashmediaserver/">FMS</a> : </p>

<blockquote>" What concerns me are Adobe's efforts to push further into the domain of their own developers, and potentially competing with them on a playing field on which the referee may be playing for the opponent. I'm not yet convinced whether Cocomo will open more doors than it will close, and it is clear that any application built using Cocomo is competing with applications that were previously built with FMS. Undoubtedly this will drive some developers away from FMS since Cocomo is now the suggested way to build collaborative applications."
</blockquote>
  I'd like to hear something more clear on this from Stefan, but I can at least offer my point of view [disclaimer, I work for Adobe, but I am not Adobe]. I just don't see how Cocomo constitutes "competing with developers". If Cocomo is the right platform for an application (which it won't always be), then the developer has a choice to use Cocomo or not (be that FMS, <a href="http://www.adobe.com/products/livecycle/dataservices/">LCDS</a>, etc). At no point are we intending to get in that developer's way - we're not about taking away the option to purchase licenses of our server products!  I don't anticipate a sudden flight away from FMS - there are tons of great products out there using FMS, and most will continue to do so. 

<p><br />
 The "referee" analogy seems really emotionally charged, but doesn't fit imo - I don't think there's a competition going on for developers' share of money. If a developer chooses Cocomo, she'll make money. If she chooses FMS, she'll make money. In some cases more, in some cases less, depending on the situation. So I think there's a difference in when you would choose which platform - but they're just tools in a toolbox. To parry with another weird analogy - this is like saying that the invention of socket wrenches hurt everyone who used open-ended wrenches; they do similar jobs, after all.</p>

<p><img alt="75px-Open_ended_spanner.jpg" src="http://blogs.adobe.com/collabmethods/images/75px-Open_ended_spanner.jpg" width="323" height="75" /><br />
<img alt="350px-First_socket_wrench.png" src="http://blogs.adobe.com/collabmethods/images/350px-First_socket_wrench.png" width="350" height="119" /></p>

<p>  So, although the use cases have some overlap, I think that the situations and audience we're trying to reach with Cocomo are different than the ones FMS reaches out to. I think there will ALWAYS be a place for FMS - places where server side scripting is required, or a hosted service is unpalatable, or where really customized requirements just don't fit with Cocomo. But the flipside is also true - there will be developers who would honestly never consider putting real-time collaboration in their applications (<a href="http://www.swartzfager.org/blog/index.cfm/2008/11/17/CoCoMo-Now-Out-on-Adobe-Labs">or even using Flex, period</a>), because it isn't cost effective for their use case or because it was something they weren't familiar enough with to try. These are devs for whom Cocomo is a natural fit.</p>

<p>  This is an important point. We'd like to lower the barriers to real-time collaboration, and hosting the service is a piece of that which can't be ignored - it makes some things *really* easy. But in lowering the barriers, it also raises expectations, which I think has the potential to benefit *anyone* doing work in the rtc space; once rtc becomes more common, there will be more demand for it. If you're a kickass FMS dev, you'll most certainly be a kickass Cocomo dev, and for projects where Cocomo makes sense for you, you'll have yet another tool in the toolset to get what you need done. Even if you never want to touch Cocomo, increased demand for rtc will still find its way to you.</p>

<p> I'm sure I haven't fully answered Stefan's concerns, but I look forward to hearing more from him on the subject - ultimately, the team we're both playing for here is "people who want to make the web more immediate and social", and I don't see how recruiting more players hurts our chances of winning.<br />
</p>]]></content:encoded>
      <pubDate>Tue, 25 Nov 2008 10:53:56 +0000</pubDate>
      <category domain="http://softratty.com/tag/cocomo">cocomo</category>
      <category domain="http://softratty.com/tag/fms">fms</category>
      <category domain="http://softratty.com/tag/cocomo constitutes">cocomo constitutes</category>
      <category domain="http://softratty.com/tag/cocomo platform">cocomo platform</category>
      <category domain="http://softratty.com/tag/developer chooses cocomo">developer chooses cocomo</category>
      <category domain="http://softratty.com/tag/developer">developer</category>
      <category domain="http://softratty.com/tag/cocomo pre-release program">cocomo pre-release program</category>
      <category domain="http://softratty.com/tag/touch cocomo">touch cocomo</category>
      <category domain="http://softratty.com/tag/kickass cocomo dev">kickass cocomo dev</category>
      <source url="http://blogs.adobe.com/collabmethods/2008/11/of_referees_and_wrenches_cocom.html">Of Referees and Wrenches : Cocomo vs FMS, Redux</source>
    </item>
    <item>
      <title><![CDATA[Salvation Focus 0.9.1 (Default branch)]]></title>
      <link>http://softratty.com/article/97fab0c42b3ca77019cdc7f6eb093e67</link>
      <guid>http://softratty.com/article/97fab0c42b3ca77019cdc7f6eb093e67</guid>
      <description><![CDATA[Salvation Focus is an application that encourages a group of people to pray for others they know who do not know Jesus Christ as Lord and Saviour. Salvation Focus is a small Flash application that can...]]></description>
      <content:encoded><![CDATA[Salvation Focus is an application that encourages a group of people to pray for others they know who do not know Jesus Christ as Lord and Saviour. Salvation Focus is a small Flash application that can be included on pretty much any Web site. There is also an administrative interface for adding people to pray for, the people that asked for prayer, and some contact info.
<hr />
<strong>License:</strong> The Apache License 2.0
<hr />
<strong>Changes:</strong><br />
The Java UI has been replaced with a Flex 3 UI. The admin interface is also programmed in Flex 3 now and uses Google's app engine, so there is no need for installation. Using Salvation Focus is now as easy as including a Flash application on your Web page.<br style="clear: both;"/>
<a href="http://www.pheedo.com/click.phdo?s=c074a33b038f71b175fc89f513e62dae&p=1"><img alt="" style="border: 0;" border="0" src="http://www.pheedo.com/img.phdo?s=c074a33b038f71b175fc89f513e62dae&p=1"/></a>
<img src="http://www.pheedo.com/feeds/tracker.php?i=c074a33b038f71b175fc89f513e62dae" style="display: none;" border="0" height="1" width="1" alt=""/>

]]></content:encoded>
      <pubDate>Tue, 25 Nov 2008 02:00:37 +0000</pubDate>
      <category domain="http://softratty.com/tag/salvation focus">salvation focus</category>
      <category domain="http://softratty.com/tag/flash application">flash application</category>
      <category domain="http://softratty.com/tag/application">application</category>
      <category domain="http://softratty.com/tag/license">license</category>
      <category domain="http://softratty.com/tag/people">people</category>
      <category domain="http://softratty.com/tag/apache license">apache license</category>
      <category domain="http://softratty.com/tag/web site">web site</category>
      <category domain="http://softratty.com/tag/app engine">app engine</category>
      <category domain="http://softratty.com/tag/pray">pray</category>
      <source url="http://www.pheedo.com/click.phdo?i=c074a33b038f71b175fc89f513e62dae">Salvation Focus 0.9.1 (Default branch)</source>
    </item>
    <item>
      <title><![CDATA[New ActionScript blog - http://actionscriptexamples.com/]]></title>
      <link>http://softratty.com/article/2418fc971ab0d1b90b5c11cea780ff40</link>
      <guid>http://softratty.com/article/2418fc971ab0d1b90b5c11cea780ff40</guid>
      <description><![CDATA[I started another new blog ( actionscriptexamples.com/ ) a few months ago, but have been holding off on posting the URL until I got some content posted. Well, content has gone a lot slower than...]]></description>
      <content:encoded><![CDATA[I started another new blog (<a href="http://actionscriptexamples.com/">actionscriptexamples.com/</a>) a few months ago, but have been holding off on posting the URL until I got some content posted. Well, content has gone a lot slower than planned, but I think I finally have enough entries where the site may be useful to somebody out there.

<p>The ActionScript Examples blog mainly focuses on ActionScript 3.0 solutions in the Flash Authoring IDE (Flash CS3 and CS4 specifically). My Flex SDK and Flex Builder specific examples will continue to be posted on <a href="http://blog.flexexamples.com/">blog.flexexamples.com</a>. There are also a few interesting examples of using the Flex SDK compiler in Flash CS4 though, so there will definitely be a bit of overlap between the two blogs.</p>

<p>And since I love using unordered lists, here's what I've posted about in the past nine months since I first set up the blog:</p>
<ul>
<li><a href="http://actionscriptexamples.com/2008/02/26/loading-flv-files-in-actionscript-30-using-the-netconnection-and-netstream-classes/">Loading FLV files in ActionScript 3.0 using the NetConnection and NetStream classes</a></li>
<li><a href="http://actionscriptexamples.com/2008/02/26/loading-text-files-using-the-urlloader-class-in-actionscript-30/">Loading text files using the URLLoader class in ActionScript 3.0</a></li>
<li><a href="http://actionscriptexamples.com/2008/02/27/loading-url-encoded-variables-into-a-flash-application-using-the-urlloader-class-in-actionscript-30/">Loading URL encoded variables into a Flash application using the URLLoader class in ActionScript 3.0</a></li>
<li><a href="http://actionscriptexamples.com/2008/02/27/decoding-url-encoded-strings-in-a-flash-application-using-the-urlvariables-class-in-actionscript-30/">Decoding URL encoded strings in a Flash application using the URLVariables class in ActionScript 3.0</a></li>
<li><a href="http://actionscriptexamples.com/2008/02/28/using-the-externalinterface-class-in-actionscript-20-and-actionscript-30/">Using the ExternalInterface class in ActionScript 2.0 and ActionScript 3.0</a></li>
<li><a href="http://actionscriptexamples.com/2008/02/28/creating-transition-effects-using-the-transitionmanager-class-in-actionscript-30/">Creating transition effects using the TransitionManager class in ActionScript 3.0</a></li>
<li><a href="http://actionscriptexamples.com/2008/03/01/loading-external-mp3-files-in-actionscript-20-and-actionscript-30/">Loading external MP3 files in ActionScript 2.0 and ActionScript 3.0</a></li>
<li><a href="http://actionscriptexamples.com/2008/03/01/displaying-a-dynamically-loaded-mp3-files-id3-information-in-actionscript-20-and-actionscript-30/">Displaying a dynamically loaded MP3 file's ID3 information in ActionScript 2.0 and ActionScript 3.0</a></li>
<li><a href="http://actionscriptexamples.com/2008/03/02/dynamically-loading-an-image-in-actionscript-20-and-actionscript-30/">Dynamically loading an image in ActionScript 2.0 and ActionScript 3.0</a></li>
<li><a href="http://actionscriptexamples.com/2008/03/02/dynamically-loading-external-xml-files-using-actionscript-30/">Dynamically loading external XML files using ActionScript 3.0</a></li>
<li><a href="http://actionscriptexamples.com/2008/03/03/positioning-a-dynamically-loaded-image-in-actionscript-20-and-actionscript-30-using-the-moviecliploader-class-and-loader-class/">Positioning a dynamically loaded image in ActionScript 2.0 and ActionScript 3.0 using the MovieClipLoader class and Loader class</a></li>
<li><a href="http://actionscriptexamples.com/2008/03/06/overriding-the-default-framerate-for-a-tween-in-flash/">Overriding the default framerate for a tween in Flash</a></li>
<li><a href="http://actionscriptexamples.com/2008/03/09/using-embedded-fonts-with-the-combobox-control-in-flash-cs3/">Using embedded fonts with the ComboBox control in Flash CS3</a></li>
<li><a href="http://actionscriptexamples.com/2008/03/10/using-embedded-fonts-with-the-datagrid-control-in-flash-cs3/">Using embedded fonts with the DataGrid control in Flash CS3</a></li>
<li><a href="http://actionscriptexamples.com/2008/03/11/using-embedded-fonts-with-the-button-control-in-flash-cs3/">Using embedded fonts with the Button control in Flash CS3</a></li>
<li><a href="http://actionscriptexamples.com/2008/03/13/dynamically-adding-cue-points-to-an-flv-using-the-flvplayback-control-in-actionscript-30/">Dynamically adding cue points to an FLV using the FLVPlayback control in ActionScript 3.0</a></li>
<li><a href="http://actionscriptexamples.com/2008/04/01/creating-data-grid-columns-using-the-datagridcolumn-object/">Creating data grid columns using the DataGridColumn object</a></li>
<li><a href="http://actionscriptexamples.com/2008/04/01/sorting-data-grid-columns-numerically-in-flash-cs3/">Sorting data grid columns numerically in Flash CS3</a></li>
<li><a href="http://actionscriptexamples.com/2008/04/02/determining-the-current-sort-column-and-sort-order-on-a-flash-cs3-datagrid-control/">Determining the current sort column and sort order on a Flash CS3 DataGrid control</a></li>
<li><a href="http://actionscriptexamples.com/2008/04/03/calling-actionscript-functions-from-javascript-using-the-externalinterface-api-in-actionscript-20/">Calling ActionScript functions from JavaScript using the ExternalInterface API in ActionScript 2.0</a></li>
<li><a href="http://actionscriptexamples.com/2008/10/25/determining-which-classes-are-automatically-imported-in-flash-cs3-and-flash-cs4/">Determining which classes are automatically imported in Flash CS3 and Flash CS4</a></li>
<li><a href="http://actionscriptexamples.com/2008/10/26/using-the-flex-sdk-with-flash-cs4/">Using the Flex SDK with Flash CS4</a></li>
<li><a href="http://actionscriptexamples.com/2008/10/26/embedding-images-into-a-flash-document-using-the-embed-metadata/">Embedding images into a Flash document using the [Embed] metadata</a></li>
<li><a href="http://actionscriptexamples.com/2008/11/24/copying-a-dynamically-loaded-images-pixels-to-a-new-bitmap-instance/">Copying a dynamically loaded image’s pixels to a new Bitmap instance</a></li>
<li><a href="http://actionscriptexamples.com/2008/11/24/embedding-fonts-in-flash-cs4-using-actionscript/">Embedding fonts in Flash CS4 using ActionScript</a></li>
<li><a href="http://actionscriptexamples.com/2008/11/24/using-jsfl-to-determine-your-current-flex-sdk-path/">Using JSFL to determine your current Flex SDK path in Flash CS4</a></li>
</ul>

<p>For lots of information about using the new Motion Editor features in Flash CS4, check out Jen deHaan's blog, <a href="http://flashthusiast.com/">Flashthusiast</a>, and for more information on Flash+Flex integration from Tareq AlJaber on the Adobe Flash Authoring team, check out his blog at <a href="http://flashauthoring.blogspot.com/">http://flashauthoring.blogspot.com/</a>.</p>]]></content:encoded>
      <pubDate>Mon, 24 Nov 2008 14:14:59 +0000</pubDate>
      <category domain="http://softratty.com/tag/blog">blog</category>
      <category domain="http://softratty.com/tag/actionscript">actionscript</category>
      <category domain="http://softratty.com/tag/flash">flash</category>
      <category domain="http://softratty.com/tag/flash document">flash document</category>
      <category domain="http://softratty.com/tag/adobe flash">adobe flash</category>
      <category domain="http://softratty.com/tag/actionscript examples blog">actionscript examples blog</category>
      <category domain="http://softratty.com/tag/flash cs3">flash cs3</category>
      <category domain="http://softratty.com/tag/actionscript functions">actionscript functions</category>
      <category domain="http://softratty.com/tag/flash cs4">flash cs4</category>
      <source url="http://blogs.adobe.com/pdehaan/2008/11/new_actionscript_blog_httpacti.html">New ActionScript blog - http://actionscriptexamples.com/</source>
    </item>
    <item>
      <title><![CDATA[Google Maps API for Flash now supports Adobe AIR ]]></title>
      <link>http://softratty.com/article/948950adafe6a235576a912db15f3b54</link>
      <guid>http://softratty.com/article/948950adafe6a235576a912db15f3b54</guid>
      <description><![CDATA[The team behind the very impressive Google Maps API for Flash recently addressed a popular feature request that involves extending support of their API's to Adobe AIR
Dmitri Abramov posted on the...]]></description>
      <content:encoded><![CDATA[<p>The team behind the very impressive <a href="http://code.google.com/apis/maps/documentation/flash/">Google Maps API for Flash</a> recently addressed a <a href="http://code.google.com/p/gmaps-api-issues/issues/detail?id=322"> popular</a> feature request that involves extending support of their API's to Adobe AIR. </p>
<p>Dmitri Abramov <a href="http://googlegeodevelopers.blogspot.com/2008/11/google-maps-api-for-flash-air-how-did.html">posted</a> on the Google Geo Developers Blog: </p>
<blockquote>
  <p> There were both technical and legal challenges blocking AIR support in  our API. AIR has a different security model, which required a number  of changes to the &quot;internal plumbing&quot; of the API in order to implement our delayed-loading model, where the actual  implementation of the map's functionality loads dynamically from  Google's servers once the application launches. Also, our Terms of  Service used to specify that the Maps API could only be used for  online web applications. </p>
  <p> Now that both the <a href="http://code.google.com/apis/maps/documentation/flash">API</a> and <a href="http://code.google.com/apis/maps/terms.html">Terms of Service</a> have undergone a facelift, we are releasing the first version of the  API that will allow Flash/Flex developers to bring Google Maps to the  AIR runtime. </p>
</blockquote>
<p>This is great news for Adobe AIR developers looking to build on Google's mapping API's. The team has also put together a great tutorial that shows how to take advantage of this functionality from <a href="http://www.adobe.com/products/flex/">Flex Builder</a>. Our thanks to the Google Maps API team for making this possible! </p>]]></content:encoded>
      <pubDate>Mon, 24 Nov 2008 06:28:00 +0000</pubDate>
      <category domain="http://softratty.com/tag/air">air</category>
      <category domain="http://softratty.com/tag/adobe air">adobe air</category>
      <category domain="http://softratty.com/tag/maps api">maps api</category>
      <category domain="http://softratty.com/tag/api">api</category>
      <category domain="http://softratty.com/tag/air runtime">air runtime</category>
      <category domain="http://softratty.com/tag/adobe air developers">adobe air developers</category>
      <category domain="http://softratty.com/tag/google">google</category>
      <category domain="http://softratty.com/tag/google maps">google maps</category>
      <category domain="http://softratty.com/tag/air support">air support</category>
      <source url="http://blogs.adobe.com/air/2008/11/google_maps_api_for_flash_now_1.html">Google Maps API for Flash now supports Adobe AIR </source>
    </item>
  </channel>
</rss>
