<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Marc's Musings</title>
	
	<link>http://www.rogue-development.com/blog2</link>
	<description>Comments and thoughts on technology from Marc Hughes</description>
	<pubDate>Thu, 21 Aug 2008 15:08:36 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<creativeCommons:license>http://creativecommons.org/licenses/by-sa/2.0/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/rogue-development/aRwh" type="application/rss+xml" /><feedburner:emailServiceId>1053063</feedburner:emailServiceId><feedburner:feedburnerHostname>http://www.feedburner.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Frogue-development%2FaRwh" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Frogue-development%2FaRwh" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Frogue-development%2FaRwh" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.rojo.com/add-subscription?resource=http%3A%2F%2Ffeeds.feedburner.com%2Frogue-development%2FaRwh" src="http://blog.rojo.com/RojoWideRed.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/rogue-development/aRwh" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Frogue-development%2FaRwh" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Frogue-development%2FaRwh" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Frogue-development%2FaRwh" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>Amazon EBS</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/371007672/</link>
		<comments>http://www.rogue-development.com/blog2/2008/08/amazon-ebs/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 15:08:36 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/?p=237</guid>
		<description><![CDATA[I just got an email from Amazon about a new service.  Check it out&#8230;
http://www.amazon.com/gp/browse.html/ref=pe_2170_10160930?node=689343011
This new EBS system for E2C just made the whole compute-cloud offering from Amazon an easy port from a regular web app to an Amazon hosted app.  Before, all your persistent data storage had to go to S3 which had a specific [...]]]></description>
			<content:encoded><![CDATA[<p>I just got an email from Amazon about a new service.  Check it out&#8230;</p>
<p><a href="http://www.amazon.com/gp/browse.html/ref=pe_2170_10160930?node=689343011">http://www.amazon.com/gp/browse.html/ref=pe_2170_10160930?node=689343011</a></p>
<p>This new EBS system for E2C just made the whole compute-cloud offering from Amazon an easy port from a regular web app to an Amazon hosted app.  Before, all your persistent data storage had to go to S3 which had a specific API you had to develop for.  Now, it can go to EBS which acts like a block device.  In other words, a virtual disk.  So just about any application should &#8220;just work&#8221; instead of needing modifications.</p>
<p>I had stayed away from EC2 because I didn&#8217;t want to tie my apps to Amazon services.  But perhaps this fixes that problem.  I&#8217;ll have to play with it sometime soon.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=LAOJBK"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=LAOJBK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=QYG2Ik"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=QYG2Ik" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=8C6QBk"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=8C6QBk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/371007672" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/08/amazon-ebs/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/08/amazon-ebs/</feedburner:origLink></item>
		<item>
		<title>First AIR app to ship?</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/369912380/</link>
		<comments>http://www.rogue-development.com/blog2/2008/08/first-air-app-to-ship/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 11:49:54 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/08/first-air-app-to-ship/</guid>
		<description><![CDATA[This week, one of the projects I&#8217;ve been working on for the past year and a half ships.

Now, I have no idea if this next statement is actually true since I haven&#8217;t done extensive research.  But TimeLiner XE may be the first AIR app to ship.  And by &#8220;ship&#8221; I mean the more traditional meaning [...]]]></description>
			<content:encoded><![CDATA[<p>This week, one of the projects I&#8217;ve been working on for the past year and a half ships.</p>
<p><img src="http://rogue-development.com/uploads/tlxe.png" alt="" width="636" height="415" /></p>
<p>Now, I have no idea if this next statement is actually true since I haven&#8217;t done extensive research.  But <a href="http://www.tomsnyder.com/timelinerxe/">TimeLiner XE</a> may be the first AIR app to ship.  And by &#8220;ship&#8221; I mean the more traditional meaning of the word, from a warehouse, on a CD, in a box.</p>
<p>This is a product that I&#8217;m really proud of.  We had a really rocky start in the development process, but I ended up taking the lead of most of the project  and we were able to deliver something that I hope will really help kids out in school pretty close to the originally planned ship date.  It&#8217;s probably the most complex product I&#8217;ve ever worked on, and is definitely the biggest project I&#8217;ve managed.</p>
<p>For a little background, I work at an <a href="http://www.tomsnyder.com/">educational software company</a> that sells directly to schools.  Because of the market, we generally need to produce our products on a CD, in a box, and with a (gasp) printed manual.  Sounds old fasion, doesn&#8217;t it?</p>
<p>It&#8217;s worth reflecting on the  physical manifestation of software&#8230; It&#8217;s amazing how much satisfaction you can get from actually holding that beautifully designed box that is meant to contain your work.  Just to know that it was someone else&#8217;s job to go through iteration after iteration of design, and then someone else&#8217;s job to put ink on a piece of cardboard, and someone else&#8217;s job to assemble that cardboard.  All so the piece of software YOU worked on can be delivered to the customer in <em>style</em>.</p>
<p>The box is also great for those times when relatives ask what you do, and you can just point to that on your shelf and say &#8220;I made that.&#8221;  Then they can look at the pretty pictures on the box, or even crack the manual to see more pretty pictures.   It&#8217;s a lot easier to explain than giving out a URL to an AIR install badge or even giving a quick demo.</p>
<p>Unfortunately, there&#8217;s also an impending feeling of doom when you realize that you don&#8217;t get to update that software for a long time.  What if you missed some critical bug?  You lie awake at night wondering if you remembered to take out that September 1st expiration date that the Beta&#8217;s had and you wonder if QA ever tested that.   Those CD&#8217;s will last a long time and you can&#8217;t just throw up a new version of a web page and make all of the old versions disappear.  Sure we can do downloadble patches, and sure we&#8217;ll have a 1.1 version someday. But there is a certain feeling of permanency to the whole process.  I mean a major screwup means pressing new CD&#8217;s and packing them, and paying for postage.  That could be thousands of dollars.</p>
<p>I&#8217;m not sure if I dare to go check that expiration thing now&#8230;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=Wm9O6K"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=Wm9O6K" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=3ZlhNk"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=3ZlhNk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=zQp2Wk"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=zQp2Wk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/369912380" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/08/first-air-app-to-ship/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/08/first-air-app-to-ship/</feedburner:origLink></item>
		<item>
		<title>OpenID from AIR movie</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/369562197/</link>
		<comments>http://www.rogue-development.com/blog2/2008/08/openid-from-air-movie/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 02:17:53 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/08/openid-from-air-movie/</guid>
		<description><![CDATA[Here&#8217;s a quick movie I just recorded showing the user interaction of logging into a web service with OpenID and then loading up some data.
The flow goes like this: 

When accessing the web services the user is first presented with a normal login dialog.
From there he chooses to use an OpenID login.
He types in his [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a <a href="http://www.rogue-development.com/temp/openid_movie.html">quick movie</a> I just recorded showing the user interaction of logging into a web service with OpenID and then loading up some data.</p>
<p>The flow goes like this: </p>
<ol>
<li>When accessing the web services the user is first presented with a normal login dialog.</li>
<li>From there he chooses to use an OpenID login.</li>
<li>He types in his OpenID identity.</li>
<li>He is forwarded to his OpenID provider&#8217;s page.</li>
<li>He clicks the &quot;Allow&quot; button, and is brought to a list of all the projects he&#8217;s previously saved.</li>
<li>Upon clicking a project, the browser portion of the application closes and the program loads up the data over AMF    </li>
</ol>
<p>I&#8217;ll post code examples of what I did to make this all work as soon as I get some spare time. <br/>
		              </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=Lc0l1K"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=Lc0l1K" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=T0PeVk"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=T0PeVk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=tcQGBk"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=tcQGBk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/369562197" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/08/openid-from-air-movie/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/08/openid-from-air-movie/</feedburner:origLink></item>
		<item>
		<title>AgileAgenda Beta Signups</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/359493098/</link>
		<comments>http://www.rogue-development.com/blog2/2008/08/agileagenda-beta-signups/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 15:04:59 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/08/agileagenda-beta-signups/</guid>
		<description><![CDATA[Quick note, there&#8217;s a new signup for AgileAgenda betas.&#160; Towards the end of the month, we&#8217;ll probably be releasing a Beta with a ton of improvements including things like fully integrated time tracking, resources across projects, and RSS feeds of tasks. 

		          
]]></description>
			<content:encoded><![CDATA[<p>Quick note, there&#8217;s a <a href="http://agileagenda.com/lists/?p=subscribe&amp;id=1">new signup</a> for AgileAgenda betas.&#160; Towards the end of the month, we&#8217;ll probably be releasing a Beta with a ton of improvements including things like fully integrated time tracking, resources across projects, and RSS feeds of tasks. </p>
<p><br/>
		          </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=svccTK"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=svccTK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=qe7WHk"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=qe7WHk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=iO7ugk"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=iO7ugk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/359493098" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/08/agileagenda-beta-signups/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/08/agileagenda-beta-signups/</feedburner:origLink></item>
		<item>
		<title>OpenID From AIR</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/356941550/</link>
		<comments>http://www.rogue-development.com/blog2/2008/08/openid-from-air/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 02:03:35 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[AIR]]></category>

		<category><![CDATA[Actionscript]]></category>

		<category><![CDATA[flex]]></category>

		<category><![CDATA[red5]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/08/openid-from-air/</guid>
		<description><![CDATA[I&#8217;ve been working on some web services recently.&#160; There&#8217;s both plain old browser accessed HTML pages plus an AMF interface to them.&#160; One feature of the HTML version is OpenID authentication.&#160; Now OpenID is all fine and dandy for a web application, but we get some problems when we want to use an AIR desktop [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working on some web services recently.&#160; There&#8217;s both plain old browser accessed HTML pages plus an AMF interface to them.&#160; One feature of the HTML version is OpenID authentication.&#160; Now OpenID is all fine and dandy for a web application, but we get some problems when we want to use an AIR desktop client to connect and authenticate through OpenID.&#160; </p>
<p>If you&#8217;re not familiar with how OpenID works, here&#8217;s a quick summary.</p>
<ol>
<li>User goes to an application (Usually a web-app)</li>
<li>User types in their OpenID URL to that app</li>
<li>They get forwarded to their OpenID page where they can either grant or deny access.</li>
<li>That page then forwards them back to the original web app with an authentication token set.</li>
</ol>
<p>Obviously, it&#8217;s kind of hard to redirect back to a desktop application.&#160; I was thinking up some wacky work-a-rounds for this but then it hit me. </p>
<p>In the AIR app I can just use the HTML component and point it towards the login form of the web services.&#160; The user can then log in using either username/password or OpenID just like they do on the website.&#160; Now, here&#8217;s the cool part&#8230;&#160; The AIR HTML component shares a network stack with the AIR/Flex NetConnection object.&#160; That means any session/cookies/whatever opened in the HTML component carry through to the remoting calls I want to make from Actionscript. So I can authenticate using a web form, but then consume BlazeDS/LiveCycleDS/AMFPHP/Red5 services using AMF over Netconnection. </p>
<p>I did up a quick proof of concept and it works on both Windows and OSX.&#160; I was able to successfully call a remoting service that requires an authenticated session.&#160; So this was actually a much easier problem to figure out than I had feared. </p>
<p><img src="http://www.rogue-development.com/uploads/adlScreenSnapz014.png" width="600" height="448" /></p>
<p>Now, I&#8217;ll just need to make the web page that loads after a successful login somehow indicate to the AIR app that the user is successfully logged in.&#160; I&#8217;ll probably either use a tiny Flash component that signals over LocalConnection, or I&#8217;ll just make the AIR app watch for when the HTML component gets to a specific URL. I&#8217;m pretty sure I can get this to be a completely seamless experience for the user.</p>
<p>Oh, and as a bonus&#8230; the user can sign up for a new account instead of log into an existing one from &quot;within the app&quot; instead of going to an external website to do that.  </p>
<p><br/>
		      </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=tTYinK"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=tTYinK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=0ZWbRk"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=0ZWbRk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=VVttRk"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=VVttRk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/356941550" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/08/openid-from-air/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/08/openid-from-air/</feedburner:origLink></item>
		<item>
		<title>Object Handles Spotted?</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/346595266/</link>
		<comments>http://www.rogue-development.com/blog2/2008/07/object-handles-spotted/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 13:25:23 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[ObjectHandles]]></category>

		<category><![CDATA[OpenSource]]></category>

		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/07/object-handles-spotted/</guid>
		<description><![CDATA[
			    I might have spotted another use of ObjectHandles over at the AsButtonGen webpage.&#160; Over on the text and image tabs you can add stuff to your button that can be resized/moved using some familiar looking handles and mouse cursors.&#160; Also, I recognize a bug with resizing the left bottom corner that [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/firefoxscreensnapz003.png" width="164" height="130" align="right" /><br />
			    I might have spotted another use of <a href="http://rogue-development.com/objectHandles.html">ObjectHandles</a> over at the <a href="http://jirox.net/AsButtonGen/">AsButtonGen</a> webpage.&#160; Over on the text and image tabs you can add stuff to your button that can be resized/moved using some familiar looking handles and mouse cursors.&#160; Also, I recognize a bug with resizing the left bottom corner that was in previous versions of the library. </p>
<p>If it is ObjectHandles, this would be the second time I just ran into a use of them, that&#8217;s pretty cool.  Unfortunately, I couldn&#8217;t find an email address on that site. </p>
<p>But that aside, the site is  neat.&#160; It lets you create some pretty &quot;web 2.0&quot; style buttons with stripes, highlights, etc. </p>
<p>I spent some time on the library yesterday.&#160; I was tyring to get the rotation+resizing thing working better since it&#8217;s been somewhat broken for a while.&#160; I&#8217;ve never needed that feature so it&#8217;s been neglected.&#160; Unfortunately, I&#8217;m running into a bit of a brick wall.&#160; I&#8217;m still trying to figure out exactly what it should do, nevermind how.&#160; Luckily, most of my Trigonometry from High School is coming back to me since it&#8217;s heavy in that department. <br/>
		          </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=lyM8sJ"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=lyM8sJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=SGw05j"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=SGw05j" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=dHlIhj"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=dHlIhj" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/346595266" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/07/object-handles-spotted/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/07/object-handles-spotted/</feedburner:origLink></item>
		<item>
		<title>Model Adapters - A binding pattern using an Adapter</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/339151297/</link>
		<comments>http://www.rogue-development.com/blog2/2008/07/model-adapters-a-binding-pattern/#comments</comments>
		<pubDate>Fri, 18 Jul 2008 05:26:21 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[Actionscript]]></category>

		<category><![CDATA[actionscript 3]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/07/model-adapters-a-binding-pattern/</guid>
		<description><![CDATA[Binding in Flex is great.  It&#8217;s an ultra convienent way to get information from your data model to show up in your views.  But it does have some limitations, and to work around those limitations I&#8217;ve been using the &#8220;Model Adapter&#8221; aka the &#8220;Wrapper&#8221; or just plain &#8220;Adapter&#8221; pattern (some info, and more).
The [...]]]></description>
			<content:encoded><![CDATA[<p>Binding in Flex is great.  It&#8217;s an ultra convienent way to get information from your data model to show up in your views.  But it does have some limitations, and to work around those limitations I&#8217;ve been using the &#8220;Model Adapter&#8221; aka the &#8220;Wrapper&#8221; or just plain &#8220;Adapter&#8221; pattern (<a href="http://en.wikipedia.org/wiki/Wrapper_pattern">some info</a>, <a href="http://developerlife.com/tutorials/?p=19">and more</a>).</p>
<p>The basic idea is you shouldn&#8217;t have to modify your data model to use it in a specific view.  If you need to <strong>filter</strong>, <strong>sort</strong>, or <strong>summarize</strong> the data for a view you can do that through an Adapter so your model doesn&#8217;t need to understand that logic and you&#8217;re view isn&#8217;t reliant on a specific implementation of your model.</p>
<p><strong>Example</strong>: If you had a list of books in an array, and you want to filter by some property of books (say publisher) you shouldn&#8217;t apply the filter directly to the model.  Instead, create an adapter that can watch that array, and have that adapter apply the filter (or sort, or whatever).</p>
<p><strong>More Examples</strong>:  Consider <a href="http://www.tomsnyder.com/timelinerxe/">Timeliner XE,</a> a product I&#8217;ve been working on at my day-job.  The main data model is a list of events.  There are several views for that data.  We have a text based / grid view, and some graphical views.  Here&#8217;s a couple screenshots:</p>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/adlscreensnapz012.png" alt="" width="628" height="388" /></p>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/adlscreensnapz013.png" alt="" width="628" height="388" /></p>
<p>Each of those screenshots has 2 views active at a time, the grid, and then a seperate graphical view.  That makes 3 views that all want to bind to our data model.  But, notice the grid has 5 events in it, while the graphical views only have 3.  This is because only 3 of those events are valid to plot (they have a date).  It&#8217;d be nice if we only had to bind to a list of events that actually has the data we want.</p>
<p>Now take a look at these three screenshots from <a href="http://www.agileagenda.com/">AgileAgenda</a>, my project scheduling application.</p>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/agileagendascreensnapz007.png" alt="" width="570" height="427" /><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/agileagendascreensnapz008.png" alt="" width="570" height="427" /><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/agileagendascreensnapz009.png" alt="" width="593" height="429" /></p>
<p>In all of these the data we have is a list of tasks.  The first two show one view with two different filters applied to the data.  The third shows a large grid with all of our tasks, and a much shorter pulldown that only has the tasks that are also milestones.  (A milestone is a specific type of task)</p>
<p>To create an adapter:</p>
<ul>
<li>Create a new adapter class</li>
<li>Create a constructor for that class that takes in the &#8220;source&#8221; data model, and any options that might be specific to the adapter.</li>
<li>Add event listeners to the &#8220;source&#8221; model.</li>
<li>Write event handlers in the adapter to update the adapter&#8217;s internal state when the source changes.</li>
<li>Write accessors in the adapter, so other components can get data from it.</li>
</ul>
<p><strong>A simple example&#8230;</strong></p>
<p><a href="http://rogue-development.com/uploads/model_adapter/ModelAdapterExample.html">Click here</a> to run a simple example.  <a href="http://rogue-development.com/uploads/model_adapter/srcview/index.html">View-source</a> is enabled in that. Here&#8217;s a screenshot of the example:</p>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/07/firefoxscreensnapz001.png" alt="" width="387" height="471" /></p>
<p>When you run the example, it creates a simple data model, populates that data model with 4 sample items, and then creates 4 panels.  Each of those panels represents a view. The example also creates 4 different model adapters all from the same data model, but with different options set.  Then each panel gets a different adapter.</p>
<p>As you add items to the data model, you can see that the 4 views update depending on whether or not they are filtered and sorted.</p>
<p><strong>Our Data Model:</strong></p>
<pre>package
{
    public  DataItemExample
    {
        public var name:String;
        public var amount:Number;
        public var active:Boolean;
    }
}</pre>
<p>&#8212;-</p>
<pre>package
{
    import mx.collections.ArrayCollection;

    public  DataModelExample
    {
        [Bindable] public var myDataItems:ArrayCollection = new ArrayCollection();

    }
}</pre>
<p>As you can see, it&#8217;s a pretty simple data model.  There are items with a name, amount and active properties, and then there is DataModelExample class with an array of those.  Notice that no view-specific data is in there.</p>
<p>Now, lets create our adapter and name it &#8220;AdapterExample&#8221;</p>
<p>First, create a constructor and some variables to hold some information about the adapter.  We&#8217;ll have 2 options. onlyActiveItems and sorted.  For sorted, we&#8217;ll also create a Sort object to actually do the sort for us.  And we&#8217;ll also create an array to hold our filtered/sorted list of items.  Note that we add an event listener for the COLLECTION_CHANGE event.  This is how we&#8217;ll propogate changes from the data model to our adapter.  We&#8217;ll see the handler for that later.</p>
<pre> public  AdapterExample extends EventDispatcher
    {
        protected var model:DataModelExample;
        protected var filteredDataItems:ArrayCollection = new ArrayCollection();
        protected var _onlyActiveItems:Boolean;
        protected var _sorted:Boolean = false;
        protected var sort:Sort;        

        public function AdapterExample(dataModel:DataModelExample, onlyActiveItems:Boolean, sorted:Boolean)
        {
            _sorted = sorted;
            _onlyActiveItems = onlyActiveItems;

            model = dataModel;
            model.myDataItems.addEventListener(CollectionEvent.COLLECTION_CHANGE, onItemsChanged );    

            if(sorted)
            {
                sort = new Sort();
                sort.fields = [new SortField("name",true)];
            }

            rebuildFilteredArray();
        }</pre>
<p>Notice that we called rebuildFilteredArray above.  Lets write that next.    All this method does is loop through our data model and grab all the items from it (respecting our filtering option) and adds them to our internal array.  It also applies the sort if neccessary.  At the end we dispatch two events which will be used for binding later.</p>
<pre>  protected function rebuildFilteredArray() : void
        {
            var tmp:Array = [];
            for each ( var item:DataItemExample in model.myDataItems )
            {
                if( (! _onlyActiveItems ) || (item.active) )
                {
                    tmp.push(item);
                }
            }                        

            filteredDataItems = new ArrayCollection(tmp);

            if( sort )
            {
                filteredDataItems.sort = sort;
                filteredDataItems.refresh();
            }

            dispatchEvent(new Event(&#8221;dataItemsUpdated&#8221;) );
            dispatchEvent(new Event(&#8221;totalChanged&#8221;) );
        }</pre>
<p>So now if we made an adapter it would start up, read in the source data model, and populate our internal array of items.  But it wouldn&#8217;t respond to changes in the source data model.  So lets create the event handler that we set up in the constructor. We&#8217;ll also create  a couple helper methods</p>
<pre>    protected function onItemsChanged(event:CollectionEvent):void
        {
            switch(event.kind)
            {
                case CollectionEventKind.ADD: addItems(event.items); break;
                case CollectionEventKind.REMOVE: removeItems(event.items); break;

                case CollectionEventKind.MOVE:
                case CollectionEventKind.REFRESH:
                case CollectionEventKind.REPLACE:
                case CollectionEventKind.RESET:    rebuildFilteredArray();
                                                break;

                case CollectionEventKind.UPDATE:  

            }

        }

        protected function addItems(items:Array):void
        {
            for each ( var item:DataItemExample in items )
            {
                if( (! _onlyActiveItems ) || (item.active) )
                {
                    filteredDataItems.addItem(item);
                }
            }
            dispatchEvent(new Event("totalChanged") );
        }

        protected function removeItems(items:Array):void
        {
            for each ( var item:DataItemExample in items )
            {
                var index:int = filteredDataItems.getItemIndex(item);
                if( index != -1 )
                {
                    filteredDataItems.removeItemAt(index);
                }
            }
            dispatchEvent(new Event("totalChanged") );
        }</pre>
<p>For adding/removing items we&#8217;re going to our internal array and manually adding or removing items from it.  We&#8217;re making sure to account for filtered items, but the sort object is taking care of the sorting for us.</p>
<p>For the other types of events,  we&#8217;re kind of cheating.  We only really care about adding / removing operations so we&#8217;ll just rebuild our entire internal array on other types of events.  If your application uses those types of events often, you should implement them in the adapter in a more efficient manner.</p>
<p><strong>Exposing data from the Adapter</strong></p>
<p>We now have the internal state of the adapter updating as the model changes.  So the only thing left to do in there is expose some properties so we can get at that info from our view.  Let&#8217;s write two bindable getters.  One of them will summarize the data (get total()) the other will give us our filtered list (get dataItems())</p>
<p>Note that we set the event=&#8221;" property in the [Bindable] tags so our views can correctly know when these properties change.</p>
<pre>  [Bindable(event="dataItemsUpdated")]
        public function get dataItems() : ArrayCollection
        {
            return filteredDataItems;
        }

        [Bindable(event="totalChanged")]
        public function get total() : Number
        {
            var total:Number = 0;
            for each ( var item:DataItemExample in filteredDataItems )
            {
                total += item.amount;
            }    

            return total;
        }</pre>
<p><strong>Using the Adapter</strong></p>
<p>Once you&#8217;ve done all of that, you can actually use your adapter.  So create your data model, create your adapter, and use it!</p>
<pre> [Bindable] protected var dataModel:DataModelExample = new DataModelExample();
 [Bindable] protected var example1:AdapterExample = new AdapterExample( dataModel, true ,true);</pre>
<p>&#8230;</p>
<pre>    <span class="MXMLComponent_Tag">&lt;mx:Panel</span><span class="MXMLDefault_Text"> x=&#8221;</span><span class="MXMLString">10</span><span class="MXMLDefault_Text">&#8221; y=&#8221;</span><span class="MXMLString">218</span><span class="MXMLDefault_Text">&#8221; width=&#8221;</span><span class="MXMLString">250</span><span class="MXMLDefault_Text">&#8221; height=&#8221;</span><span class="MXMLString">200</span><span class="MXMLDefault_Text">&#8221; layout=&#8221;</span><span class="MXMLString">absolute</span><span class="MXMLDefault_Text">&#8221; title=&#8221;</span><span class="MXMLString">Filtered, Sorted</span><span class="MXMLDefault_Text">&#8220;</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;mx:Label</span><span class="MXMLDefault_Text"> x=&#8221;</span><span class="MXMLString">10</span><span class="MXMLDefault_Text">&#8221; y=&#8221;</span><span class="MXMLString">132</span><span class="MXMLDefault_Text">&#8221; text=&#8221;</span><span class="MXMLString">Total:</span><span class="MXMLDefault_Text">&#8220;</span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;mx:Label</span><span class="MXMLDefault_Text"> x=&#8221;</span><span class="MXMLString">56</span><span class="MXMLDefault_Text">&#8221; y=&#8221;</span><span class="MXMLString">132</span><span class="MXMLDefault_Text">&#8221; text=&#8221;</span><span class="MXMLString">{</span>example1.total<span class="MXMLString">}</span><span class="MXMLDefault_Text">&#8220;</span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;mx:List</span><span class="MXMLDefault_Text"> x=&#8221;</span><span class="MXMLString">10</span><span class="MXMLDefault_Text">&#8221; y=&#8221;</span><span class="MXMLString">4</span><span class="MXMLDefault_Text">&#8221; width=&#8221;</span><span class="MXMLString">210</span><span class="MXMLDefault_Text">&#8221; height=&#8221;</span><span class="MXMLString">120</span><span class="MXMLDefault_Text">&#8221; dataProvider=&#8221;</span><span class="MXMLString">{</span>example1.dataItems<span class="MXMLString">}</span><span class="MXMLDefault_Text">&#8221; labelField=&#8221;</span><span class="MXMLString">name</span><span class="MXMLDefault_Text">&#8220;</span><span class="MXMLComponent_Tag">&gt;</span><span class="MXMLComponent_Tag">&lt;/mx:List&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/mx:Panel&gt;</span></pre>
<p>If you look at the source of the example, we actually create 4 adapters with varying options.</p>
<p><strong>Beyond this basic example</strong></p>
<p>If you want your adapter to respect changes to individual items, your items should implement the IPropertyChangeNotifier interface.  So in our example if we edited an item so it&#8217;s active flag changed, the views would not update.  To make that work we would implement that IPropertyChangeNotifier interface, and then write some code for the CollectionEventKind.UPDATE event.</p>
<p>Often times only one or two views are visible at a time and it&#8217;d be nice if all the views in the background weren&#8217;t madly updating themselves every change.  To accomplish that I often write an enable() disable() method on the adapter.  They usually look something like this:</p>
<p>protected function enable() : void</p>
<p>{</p>
<p>model.myDataItems.addEventListener(CollectionEvent.COLLECTION_CHANGE, onItemsChanged );</p>
<p>rebuildFilteredArray();</p>
<p>}</p>
<p>protected function disable() : void</p>
<p>{</p>
<p>model.myDataItems.removeEventListener(CollectionEvent.COLLECTION_CHANGE, onItemsChanged );</p>
<p>}</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=mfGVTJ"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=mfGVTJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=dhO0Zj"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=dhO0Zj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=VdEVnj"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=VdEVnj" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/339151297" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/07/model-adapters-a-binding-pattern/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/07/model-adapters-a-binding-pattern/</feedburner:origLink></item>
		<item>
		<title>The Essential Guide to Open Source Flash Development</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/335173545/</link>
		<comments>http://www.rogue-development.com/blog2/2008/07/the-essential-guide-to-open-source-flash-development/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 13:34:22 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[Actionscript]]></category>

		<category><![CDATA[Flash]]></category>

		<category><![CDATA[OpenSource]]></category>

		<category><![CDATA[Schedule]]></category>

		<category><![CDATA[XRay]]></category>

		<category><![CDATA[actionscript 3]]></category>

		<category><![CDATA[ant]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[flex]]></category>

		<category><![CDATA[red5]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/07/the-essential-guide-to-open-source-flash-development/</guid>
		<description><![CDATA[The book I&#8217;ve been working on, The Essential Guide to Open Source Flash Development, is now out in stores.  It&#8217;s hard to believe that I started working on it about 11 months ago!  It&#8217;s really great to see all of that hard work finally in print.

So What is it about?
The book does a few things.  [...]]]></description>
			<content:encoded><![CDATA[<p>The book I&#8217;ve been working on, <em>The Essential Guide to Open Source Flash Development</em>, is now out in stores.  It&#8217;s hard to believe that I started working on it about 11 months ago!  It&#8217;s really great to see all of that hard work finally in print.</p>
<p><img src="http://rogue-development.com/uploads/book.jpg" alt="" width="600" height="528" /></p>
<p>So What is it about?</p>
<p>The book does a few things.  First, about a third of the book introduces you to some open source tools for doing flash development.  Things like FlashDevelop, MTASC, SwfMill, ANT, and ASDT.  It&#8217;ll show you how to create an AS2 and an AS3 based flash application using completely free and open software.  This goes all the way from installing the tools, creating a sample app, writing up some unit tests for it, and then  to publishing it to the web.  Along the way it&#8217;ll give you a brief introduction to each tool, explain what it does, and then give a quick example of how to use it.  (That&#8217;s the 5 chapters I wrote)</p>
<p>The remaining 2/3 of the book dedicates a chapter to various open source projects going into a little more detail about them.  There&#8217;s a chapter on Papervision 3D, SWX, FUSE/Go, HAXE, AMFPHP, two for Red5 and a couple more.</p>
<p>This was a lot of fun to work on, and my only regret is not getting to know the other authors better.</p>
<p>If you&#8217;re looking for a place to buy it, check out <a href="http://www.bookpool.com/sm/1430209933">Bookpool</a>.   I worked for them for a year and they&#8217;re really stellar guys.  They offer good prices, but more importantly;  as long as the book is in stock, they do their damndest to get it on a truck the day you order it. (Of course, you&#8217;re at the mercy of the publisher if it&#8217;s out of stock)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=bbWOAJ"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=bbWOAJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=P5pFZj"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=P5pFZj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=dGzyNj"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=dGzyNj" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/335173545" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/07/the-essential-guide-to-open-source-flash-development/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/07/the-essential-guide-to-open-source-flash-development/</feedburner:origLink></item>
		<item>
		<title>Talk tonight on ObjectHandles+Degrafa (Attend online!)</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/328824013/</link>
		<comments>http://www.rogue-development.com/blog2/2008/07/talk-tonight-on-objecthandlesdegrafa-attend-online/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 12:07:30 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[ObjectHandles]]></category>

		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/?p=221</guid>
		<description><![CDATA[As mentioned in a previous post, I&#8217;m giving a talk to the BFAIG group on creating a simple diagramming application in Flex using ObjectHandles and Degrafa.  It&#8217;s been delayed until tonight at 7:00pm EST.  If you&#8217;re interested in seeing it, this is a joint in-person and online meeting.  I&#8217;m actually attending from a remote location, [...]]]></description>
			<content:encoded><![CDATA[<p>As mentioned in a <a href="http://www.rogue-development.com/blog2/2008/06/creating-a-simple-diagramming-application/">previous post</a>, I&#8217;m giving a talk to the <a href="http://www.bfaig.org/">BFAIG</a> group on creating a simple diagramming application in Flex using ObjectHandles and Degrafa.  It&#8217;s been delayed until tonight at 7:00pm EST.  If you&#8217;re interested in seeing it, this is a joint in-person and online meeting.  I&#8217;m actually attending from a remote location, so the online experience should be pretty good.  You can get info about how to attend online at the <a href="http://www.bfaig.org/blog/?p=85">BFAIG Blog</a> post.</p>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/06/safariscreensnapz009.png" alt="" width="613" height="471" /></p>
<ul>
<li><a href="http://rogue-development.com/uploads/degrafa_oh2/">Run the application</a> (Flex application with view-source enabled)</li>
<li><a href="http://www.rogue-development.com/objectHandles/diagramTutorial/">Creating a simple diagramming application</a> (14 Minute Video)</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=pqFmqJ"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=pqFmqJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=iGfZPj"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=iGfZPj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=1Ri6Fj"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=1Ri6Fj" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/328824013" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/07/talk-tonight-on-objecthandlesdegrafa-attend-online/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/07/talk-tonight-on-objecthandlesdegrafa-attend-online/</feedburner:origLink></item>
		<item>
		<title>Printing horrors</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/313805193/</link>
		<comments>http://www.rogue-development.com/blog2/2008/06/printing-horrors/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 13:45:32 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[AIR]]></category>

		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/?p=219</guid>
		<description><![CDATA[Printing in a Flash/Flex application can be tricky to get right.  I&#8217;ve been working on a very print-heavy application recently.  We&#8217;ve been having a long standing intermittent bug where we print a large document, but some things on that document that were created through the Flash drawing API wouldn&#8217;t be on the paper.
We added a
var [...]]]></description>
			<content:encoded><![CDATA[<p>Printing in a Flash/Flex application can be tricky to get right.  I&#8217;ve been working on a very <a href="http://www.tomsnyder.com/timelinerxe/">print-heavy application</a> recently.  We&#8217;ve been having a long standing intermittent bug where we print a large document, but some things on that document that were created through the Flash drawing API wouldn&#8217;t be on the paper.</p>
<p>We added a</p>
<p><strong>var options:Object = canvas.prepareToPrint( canvas );</strong></p>
<p>Before the print and a</p>
<p><strong>canvas.finishPrint( options, canvas);</strong></p>
<p>After the print, and it seems to have solved our problem even though the documentation says we shouldn&#8217;t ordinarily need to explicitly call those.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=uqoRPI"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=uqoRPI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=20Ha2i"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=20Ha2i" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=UZp8Ti"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=UZp8Ti" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/313805193" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/06/printing-horrors/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/06/printing-horrors/</feedburner:origLink></item>
		<item>
		<title>Xray Viewer updated</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/312561186/</link>
		<comments>http://www.rogue-development.com/blog2/2008/06/xrayviewer-updated/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 12:10:15 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[AIR]]></category>

		<category><![CDATA[Flash]]></category>

		<category><![CDATA[XRay]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/06/xrayviewer-updated/</guid>
		<description><![CDATA[
The XRayViewer has been broken for quite some time.  I had originally done it with an AIR beta, and that has since stopped working.  So there&#8217;s now a newly compiled version just waiting for you to grab.

What is the XRayViewer?
So you may be asking yourself What exactly is the XRayViewer? 
All this little [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://rogue-development.com/images/icon128.png" alt="" width="128" height="128" /></p>
<p>The <a href="http://rogue-development.com/xrayviewer.html">XRayViewer</a> has been broken for quite some time.  I had originally done it with an AIR beta, and that has since stopped working.  So there&#8217;s now a newly compiled version just waiting for you to grab.</p>
<p><img src="http://rogue-development.com/images/xrayviewerscreenshot.png" alt="" width="645" height="518" /></p>
<h2>What is the XRayViewer?</h2>
<p>So you may be asking yourself <em>What exactly is the XRayViewer? </em></p>
<p>All this little app does is host the XRay connector and let you load a local swf. Then it displays the swf with some simple controls to play/stop/advance/back. The big benefit is you can then use <a href="http://www.osflash.org/xray/">XRay</a> (By <a href="http://www.rockonflash.com/">John Grden</a> + Others) to inspect the swf without changing any code around.</p>
<p>There&#8217;s three new (very minor) features in this version:</p>
<ol>
<li>There&#8217;s a button to launch the XRay interface in your default browser.</li>
<li>The path to the loaded swf is displayed in the top toolbar.  (You can copy &amp; paste that into Xray so you don&#8217;t have to navigate as far into the hierarchy)</li>
<li>New logo / icons</li>
</ol>
<h2>Now Open Source!</h2>
<p>The entire project is now licensed under the MIT license.  If you install the application and then right click on it you can &#8220;View Source&#8221; to get the source code for it.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=nEhC6I"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=nEhC6I" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=7uY8Oi"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=7uY8Oi" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=TJEiJi"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=TJEiJi" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/312561186" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/06/xrayviewer-updated/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/06/xrayviewer-updated/</feedburner:origLink></item>
		<item>
		<title>AgileAgenda, Basecamp, and third party API’s</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/311896794/</link>
		<comments>http://www.rogue-development.com/blog2/2008/06/agileagenda-basecamp-and-third-party-apis/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 16:37:23 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[AgileAgenda]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/06/agileagenda-basecamp-and-third-party-apis/</guid>
		<description><![CDATA[
I haven&#8217;t blogged about AgileAgenda in a while  on purpose since it seemed I was doing it far too often and was turning this blog into a big Ad instead of the resource for developers that I had meant it to be.&#160; But I&#8217;ve done good with only a single post in the past [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://agileagenda.com/images/site_name_white.png" width="269" height="84" /></p>
<p>I haven&#8217;t blogged about <a href="http://www.agileagenda.com/">AgileAgenda</a> in a while  on purpose since it seemed I was doing it far too often and was turning this blog into a big Ad instead of the resource for developers that I had meant it to be.&#160; But I&#8217;ve done good with only a <a href="http://www.rogue-development.com/blog2/2008/05/agileagenda-on-linux/">single post</a> in the past five months, and I hope you&#8217;ll indulge me for a moment with this one. </p>
<p>We just released a new version, and it has a feature that a lot of customers have been asking for.&#160; <strong>Far improved <a href="http://basecamphq.com/">Basecamp</a> integration!</strong> You can now connect to an SSL powered Basecamp install, and you can also now associate AgileAgenda resources with Basecamp contacts to automatically assign the Todo items.  This is a huge jump in the integration between these two products and I&#8217;m really excited about it.&#160; We also streamlined some of the synchronization so it all happens a bit faster.&#160; You can <a href="http://www.agileagenda.com/help/setupbasecamp.html">read all about it here.</a> </p>
<p> <a href="http://www.agileagenda.com/help/setupbasecamp.html"><img src="http://www.agileagenda.com/images/basecamp1.png" width="500" height="329" border="0" /></a></p>
<p>In the future, I&#8217;ll be exploring other services to integrate with.&#160; At my day-job we&#8217;re beginning a <a href="https://h10078.www1.hp.com/cda/hpms/display/main/hpms_content.jsp?zn=bto&amp;cp=1-11-127-24_4000_100__">QualityCenter</a> rollout, so that may be on the list.&#160; Along with that, I&#8217;ve always had plans to be able to export to <a href="http://www.google.com/calendar/render">Google Calendar</a>.&#160; Working with third party API&#8217;s really excites me since it&#8217;s a way to add a huge chunk of functionality (and customer value) very easily.&#160; Any other ideas? </p>
<p>That really gets me thinking about interchangeable data on the web and how good it is for end users. With that in mind, I hope to be able to release the AgileAgenda integration API sometime this summer that would allow other applications to integrate with AgileAgenda.&#160; That&#8217;s going to take some serverside rework, but that&#8217;ll need to happen eventually for other reasons.  Before that, we&#8217;ll start publishing RSS feeds of schedules so external programs can at least start consuming data from AgileAgenda. <br/>
		                  </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=LfwdYI"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=LfwdYI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=tAOiHi"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=tAOiHi" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=Afzi0i"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=Afzi0i" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/311896794" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/06/agileagenda-basecamp-and-third-party-apis/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/06/agileagenda-basecamp-and-third-party-apis/</feedburner:origLink></item>
		<item>
		<title>Creating a simple diagramming application</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/307950053/</link>
		<comments>http://www.rogue-development.com/blog2/2008/06/creating-a-simple-diagramming-application/#comments</comments>
		<pubDate>Mon, 09 Jun 2008 11:20:52 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[ObjectHandles]]></category>

		<category><![CDATA[OpenSource]]></category>

		<category><![CDATA[actionscript 3]]></category>

		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/06/creating-a-simple-diagramming-application/</guid>
		<description><![CDATA[Tonight, I&#8217;ll be giving a short talk to BFAIG on using ObjectHandles and Degrafa to make a simple diagramming application.  This application demonstrates the basics of working with Degrafa, and also shows how easy it is to make an interface that allows users to resize and move objects on screen.
The example application has source attached, [...]]]></description>
			<content:encoded><![CDATA[<p>Tonight, I&#8217;ll be giving a short talk to <a href="http://www.bfaig.org/">BFAIG</a> on using <a href="http://www.rogue-development.com/objectHandles.html">ObjectHandles</a> and Degrafa to make a simple diagramming application.  This application demonstrates the basics of working with Degrafa, and also shows how easy it is to make an interface that allows users to resize and move objects on screen.</p>
<p>The example application has source attached, and is licensed under the MIT license.  I hope someone can take it and make some really great application out of it.  Please drop me an email if you do!</p>
<p>I recorded a practice-run I did, so here it is&#8230;</p>
<ul>
<li><a href="http://rogue-development.com/uploads/degrafa_oh2/">Run the application</a> (Flex application with view-source enabled)</li>
<li><a href="http://www.rogue-development.com/objectHandles/diagramTutorial/">Creating a simple diagramming application</a> (14 Minute Video)</li>
</ul>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/06/safariscreensnapz009.png" alt="" width="613" height="471" /></p>
<p> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=jrNKgI"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=jrNKgI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=7nKOLi"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=7nKOLi" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=yY8vZi"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=yY8vZi" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/307950053" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/06/creating-a-simple-diagramming-application/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/06/creating-a-simple-diagramming-application/</feedburner:origLink></item>
		<item>
		<title>Gonna try out this CFML stuff, where to start?</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/306266686/</link>
		<comments>http://www.rogue-development.com/blog2/2008/06/gonna-try-out-this-cfml-stuff-where-to-start/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 18:10:55 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/06/gonna-try-out-this-cfml-stuff-where-to-start/</guid>
		<description><![CDATA[I&#8217;ve heard great things about Cold Fusion, and with the second CFML server being open sourced just recently, it&#8217;s probably time for me to dip my feet in.&#160;
So first, here&#8217;s what I want out of this&#8230;
I want a development environment which I can very quickly develop web based applications with.    I need [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve heard great things about Cold Fusion, and with the second CFML server being open sourced just recently, it&#8217;s probably time for me to dip my feet in.&#160;</p>
<p>So first, here&#8217;s what I want out of this&#8230;</p>
<p>I want a development environment which I can very quickly develop web based applications with.    I need something that lets me do the most common web things very quickly.&#160; I&#8217;m not afraid of writing  Java for complex stuff.&#160; (but really, how often does a web app have to do something really complex?) </p>
<p>Now, some questions that perhaps any readers out there might be able to help with&#8230;</p>
<p>Can you suggest where a CFML newbie should look to get started?&#160; I ordered the first two volumes of <em>ColdFusion 8 Web Application Construction Kit</em> to get started already.&#160; What blogs / websites / etc. should I visit regularly? <br/>
		          </p>
<p>If I&#8217;m gonna go with an Open Source solution to start, OpenBD, or Railo?&#160; In case it matters, eventually I&#8217;ll need it to run within JBoss and serve through Apache via an AJP connection back to JBoss. </p>
<p>What dev-environment do most people (on OSX) use for CFML?&#160; Dreamweaver?&#160; TextMate?&#160; cfeclipse?&#160; Since I&#8217;m also doing Flex stuff, the Eclipse based solution sounds appealing. </p>
<p>&#160;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=jOm2hI"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=jOm2hI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=TL7EEi"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=TL7EEi" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=DA4UOi"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=DA4UOi" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/306266686" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/06/gonna-try-out-this-cfml-stuff-where-to-start/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/06/gonna-try-out-this-cfml-stuff-where-to-start/</feedburner:origLink></item>
		<item>
		<title>ObjectHandles Spotted - KwikUML</title>
		<link>http://feeds.feedburner.com/~r/rogue-development/aRwh/~3/305643170/</link>
		<comments>http://www.rogue-development.com/blog2/2008/06/objecthandles-spotted-kwikuml/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 23:03:01 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.rogue-development.com/blog2/2008/06/objecthandles-spotted-kwikuml/</guid>
		<description><![CDATA[I was trying out KwikUML today and noticed some familiar looking resize handles.
 
A quick look inside the OSX bundle confirmed it, a use of ObjectHandles. This psyched me up, it was the first time I &#34;accidently&#34; found a use of one of my projects while doing my normal daily stuff.&#160; Looks like an older [...]]]></description>
			<content:encoded><![CDATA[<p>I was trying out <a href="http://labs.otuome.com/">KwikUML</a> today and noticed some familiar looking resize handles.</p>
<p><img src="http://www.rogue-development.com/blog2/wp-content/uploads/2008/06/picture7.png" width="700" height="458" /> </p>
<p>A quick look inside the OSX bundle confirmed it, a use of <a href="http://www.rogue-development.com/objectHandles.html">ObjectHandles</a>. This psyched me up, it was the first time I &quot;accidently&quot; found a use of one of my projects while doing my normal daily stuff.&#160; Looks like an older version since I noticed a couple bugs that have since been fixed, and there&#8217;s some custom behavior added in.</p>
<p><br/>
	            </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=gRzU7I"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=gRzU7I" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=502vii"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=502vii" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/rogue-development/aRwh?a=hFiVRi"><img src="http://feeds.feedburner.com/~f/rogue-development/aRwh?i=hFiVRi" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/rogue-development/aRwh/~4/305643170" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.rogue-development.com/blog2/2008/06/objecthandles-spotted-kwikuml/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.rogue-development.com/blog2/2008/06/objecthandles-spotted-kwikuml/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 2.540 seconds --><!-- Cached page served by WP-Cache -->
