<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>RSS feed for InstantSpot - (AIR)</title><link>http://www.instantspot.com</link><description>RSS feed for InstantSpot - (AIR)</description><language>en-us</language><copyright>This work is Copyright &#xA9; 2009 by InstantSpot</copyright><generator>RSSVille ColdFusion FeedMaker, version 1.0</generator><pubDate>Sun, 22 Nov 2009 05:53:52 GMT</pubDate><item><title>WhenWhatHowLong - A Simple Time and Task Tracker</title><link>http://goodcf.instantspot.com/blog/2009/05/12/WhenWhatHowLong--A-Simple-Time-and-Task-Tracker</link><description>&lt;p&gt;Over the weekend, out of necessity, I threw together a very simple AIR app for tracking tasks, when they were done and how long they took.&amp;nbsp; It&apos;s basically a glorified stopwatch with historical logging.&amp;nbsp; If this is something that interests you I encourage you to check it out and leave me some feedback.&lt;/p&gt;
&lt;p&gt;Enjoy! &lt;a href=&quot;http://slantsoft.com/index.cfm/products/wwhl&quot; target=&quot;_blank&quot;&gt;slantsoft.com/index.cfm/products/wwhl&lt;/a&gt;&lt;/p&gt;</description><pubDate>Tue, 12 May 2009 13:30:00 GMT</pubDate><guid>http://goodcf.instantspot.com/blog/2009/05/12/WhenWhatHowLong--A-Simple-Time-and-Task-Tracker</guid></item><item><title>Moving Images Between CF 8 and Flex 3 (AIR 1.5) - Part 2 of 2</title><link>http://goodcf.instantspot.com/blog/2009/02/03/Moving-Images-Between-CF-8-and-Flex-3-AIR-15--Part-2-of-2</link><description>&lt;p&gt;In my &lt;a target=&quot;_blank&quot; href=&quot;http://www.lanctr.com/blog/2009/02/03/Moving-Images-Between-CF-8-and-Flex-3-AIR-15--Part-1-of-2&quot;&gt;previous post&lt;/a&gt; I covered the ColdFusion 8 half of moving image data between CF8 and Flex 3, AIR 1.5 in this example.&amp;nbsp; This post will be a bit longer since there is a bit more ActionScript (and MXML) than there was CFML.&amp;nbsp; I am going to assume that you know how to setup a new AIR / Flex project as that falls out of the scope of this topic.&lt;br /&gt;
&lt;br /&gt;
I started with a pretty basic layout for my application.&amp;nbsp; I have a ComboBox that displays the names of the available images, a button to browse and select a new image to add to the server, a TextInput to display the name of the selected image, an upload button to set the image data to the server and a delete button, obviously, to delete the selected image.&amp;nbsp; Below all that I have a canvas with it&amp;rsquo;s height and width set to 100% which I will use to contain and display the image I&amp;rsquo;ve selected.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;mx:HBox width=&amp;quot;100%&amp;quot;&amp;gt;
	&amp;lt;mx:ComboBox id=&amp;quot;imageSelect&amp;quot; prompt=&amp;quot;Select an image...&amp;quot; dataProvider=&amp;quot;{_imageArray}&amp;quot; change=&amp;quot;onImageSelect()&amp;quot;/&amp;gt;
	&amp;lt;mx:Button label=&amp;quot;Add Image (Preview)&amp;quot; click=&amp;quot;selectImage()&amp;quot;/&amp;gt;
	&amp;lt;mx:TextInput id=&amp;quot;imageNameTI&amp;quot; text=&amp;quot;{this.previewFileName}&amp;quot; enabled=&amp;quot;false&amp;quot;/&amp;gt;
	&amp;lt;mx:Button id=&amp;quot;uploadBtn&amp;quot; label=&amp;quot;Upload&amp;quot; enabled=&amp;quot;false&amp;quot; click=&amp;quot;uploadImage()&amp;quot;/&amp;gt;
	&amp;lt;mx:Button id=&amp;quot;deleteBtn&amp;quot; label=&amp;quot;Delete Selected Image&amp;quot; enabled=&amp;quot;false&amp;quot; click=&amp;quot;deleteSelectedImage()&amp;quot;/&amp;gt;
&amp;lt;/mx:HBox&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Next I&amp;rsquo;ve defined my RemoteObject and the methods I want to call.&amp;nbsp; Note that since I am working with AIR I need to specify an endpoint for my RemoteObject, in my case http://localhost:8302/flex2gateway .&amp;nbsp; Without the endpoint the RemoteObject will not know where your CFC lives.&amp;nbsp; Also, note the &amp;lsquo;/flex2gateway&amp;rsquo; at the end of my url.&amp;nbsp; This is how the RemoteObject talks to CF and it is required when connecting an Adobe ColdFusion server, I can&amp;rsquo;t speak for the other projects like OpenBD or Railo since I haven&amp;rsquo;t used remoting with them.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;mx:RemoteObject id=&amp;quot;RO&amp;quot; endpoint=&amp;quot;http://localhost:8302/flex2gateway&amp;quot; destination=&amp;quot;ColdFusion&amp;quot;
	source=&amp;quot;ImageService&amp;quot; fault=&amp;quot;onROFault(event)&amp;quot;&amp;gt;
	
	&amp;lt;mx:method name=&amp;quot;getImageArray&amp;quot; result=&amp;quot;onGetImageArrayResult(event)&amp;quot;/&amp;gt;
	&amp;lt;mx:method name=&amp;quot;getImage&amp;quot; result=&amp;quot;onGetImageResult(event)&amp;quot;/&amp;gt;
	&amp;lt;mx:method name=&amp;quot;setImage&amp;quot; result=&amp;quot;this.RO.getImageArray()&amp;quot;/&amp;gt;
	&amp;lt;mx:method name=&amp;quot;deleteImage&amp;quot; result=&amp;quot;this.RO.getImageArray()&amp;quot;/&amp;gt;
	
&amp;lt;/mx:RemoteObject&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Each of the methods in my RemoteObject correspond to it&amp;rsquo;s counterpart in the CFC.&amp;nbsp; In both the getImageArray and getImage methods I am calling an actionscript method and passing the ResultEvent as an argument.&amp;nbsp; Rather than calling a method when a result is returned from the setImage and deleteImage methods I am directly invoking the getImageArray method on the RemoteObject, this will just update my list of available images in the ComboBox.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
ActionScript methods.&lt;br /&gt;
&lt;br /&gt;
The init() method is called when the creationComplete event is dispatched by the application.&amp;nbsp; In it I am making a call to the getImageArray method.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function init():void{
	this.RO.getImageArray();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The onROFault() method handles any fault events from the RO RemoteObject.&amp;nbsp; I&amp;rsquo;m just popping up an Alert with the fault strings and clearing the busy cursor if we have one.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function onROFault(event:FaultEvent):void{
	Alert.show(event.fault.faultString,event.fault.faultDetail);
	cursorManager.removeBusyCursor();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The onGetImageArray() method is called when a result is returned from the getImageArray() method.&amp;nbsp; I am casting the event.result into a bindable array that I&amp;rsquo;ve defined at the top of my script block.&amp;nbsp; The array, _imageArray, is set as the dataProvider for my ComboBox, and because it is bindable any changes made to _imageArray will be reflected in the contents of the ComboBox&amp;rsquo;s drop down.&amp;nbsp; I am also removing the busy cursor if we are displaying one.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function onGetImageArrayResult(event:ResultEvent):void{
	_imageArray = event.result as Array;
	cursorManager.removeBusyCursor();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The onImageSelect() method is called when an image name is selected from the ComboBox.&amp;nbsp; I&amp;rsquo;m calling another method, clearPreview(), to sort of reset the application, more on this later.&amp;nbsp; Next I call the getImage() method passing the selected image name from the ComboBox as an argument and showing the busy cursor.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function onImageSelect():void{
	clearPreview();
	
	this.RO.getImage(this.imageSelect.selectedItem);
	this.cursorManager.setBusyCursor();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The onGetImageResult() method is the handler called by the result event from calling getImage().&amp;nbsp; Here&amp;rsquo;s where we start to see how we handle the image data returned from ColdFusion.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function onGetImageResult(event:ResultEvent):void{
	var tempImg:Image = new Image;
	tempImg.height = event.result.Height;
	tempImg.width = event.result.Width;
	tempImg.data = event.result.Data;
	this.imgCanvas.removeAllChildren();
	this.imgCanvas.addChild(tempImg);
	cursorManager.removeBusyCursor();
	this.deleteBtn.enabled = true;
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
First I create a new Image and set it&amp;rsquo;s height and width to the returned Height and Width values.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;var tempImg:Image = new Image;
tempImg.height = event.result.Height;
tempImg.width = event.result.Width;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Next we set the data property of the Image equal to the returned binary blob.&amp;nbsp; This was the data we got when we used the ImageGetBlob() function in our CFC.&amp;nbsp; Binary data in ColdFusion is the same as a ByteArray in Flex, and since the data attribute of our image expects a ByteArray we can pass the returned value right in without any data casting or translation.&amp;nbsp; Pretty cool huh?&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;tempImg.data = event.result.Data;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
After setting up the image I remove any children the canvas might have so that Flex doesn&amp;rsquo;t just stack the images one on top of the other.&amp;nbsp; Next I add the image as a child to the canvas, remove the busy cursor and enable my delete button.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;this.imgCanvas.removeAllChildren();
this.imgCanvas.addChild(tempImg);
cursorManager.removeBusyCursor();
this.deleteBtn.enabled = true;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The selectImage() method is called when the &amp;ldquo;Add Image&amp;rdquo; button is clicked.&amp;nbsp; I create an array of image file types the application will accept, I defined the values in a variable at the top of the script block, all other file types will not be selectable in the file browser.&amp;nbsp; Next I open the native file browser, I set the default directory as the user&amp;rsquo;s documents directory at the top of the script block.&amp;nbsp; Then i add an event listener for when a file is selected.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function selectImage():void{
	var imageTypesArray:Array = new Array(this.imageTypes);
	this.imageFile.browse(imageTypesArray);
	this.imageFile.addEventListener(Event.SELECT,imageSelected);
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The imageSelected() method is called when a file has been chosen through the native file browser.&amp;nbsp; Here again I am using ByteArrays to store the image data.&amp;nbsp; I&amp;rsquo;m also using a FileStream to read the bytes from the selected image and store them in my ByteArray.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function imageSelected(event:Event):void{
	this.ImageByteArray = new ByteArray();
	this.ImageFileStream = new FileStream();
	this.ImageFileStream.open(this.imageFile,FileMode.READ);
	this.ImageFileStream.readBytes(this.ImageByteArray);
	
	this.imgPreview = new Image;
	this.imgPreview.data = this.ImageByteArray;
	this.imgCanvas.removeAllChildren();
	this.imgCanvas.addChild(imgPreview);
	
	this.uploadBtn.enabled = true;
	this.imageNameTI.enabled = true;
	
	this.previewFileType = event.currentTarget.type;
	this.previewFileName = event.currentTarget.name.replace(this.previewFileType,&apos;&apos;);
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Next I create a new Image much like i did before, however, since I haven&amp;rsquo;t figured out how to read the image metadata with Flex / AIR I am letting Flex figure out the image&amp;rsquo;s dimensions based on just the image created by the ByteArray.&amp;nbsp; Then I remove any children from the canvas, giving me a clear work area in which to add my new image.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;this.imgPreview = new Image;
this.imgPreview.data = this.ImageByteArray;
this.imgCanvas.removeAllChildren();
this.imgCanvas.addChild(imgPreview);&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Next I enable my Upload button and the TextInput so the user can rename the image if they want.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;this.uploadBtn.enabled = true;
this.imageNameTI.enabled = true;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Lastly I store the image format (extension) and strip the extension from the file name, giving the user the ability to only rename the file, but not change it&amp;rsquo;s format.&amp;nbsp; If you want to let your users change the format you can, it&amp;rsquo;s just a matter of giving them the options your server can read.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;this.previewFileType = event.currentTarget.type;
this.previewFileName = event.currentTarget.name.replace(this.previewFileType,&apos;&apos;);&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
At this point I haven&amp;rsquo;t actually sent the image data to the server, this is simply a preview mode so that the user can see the image selected.&amp;nbsp; From reading a few other blog posts it seems that this behavior should also be possible in Flash Player 10 apps, where the client side application is able to store the ByteArray in memory and manipulate it without having to interact with the server.&amp;nbsp; As I understand it, Flash Player 9 would require the data to be sent to the server then returned from the server in order to work with it.&amp;nbsp; Please correct me if my assumption is incorrect.&lt;br /&gt;
&lt;br /&gt;
The uploadImage() method is called when the upload button is clicked.&amp;nbsp; In it I make a call to the setImage() method in my RemoteObject, passing the image ByteArray, image name and image format (extension) as arguments.&amp;nbsp; Then I call the clearPreview() method to &amp;lsquo;reset&amp;rsquo; my application and show the busy cursor.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function uploadImage():void{
	this.RO.setImage(this.ImageByteArray,this.imageNameTI.text,this.previewFileType);
	clearPreview();
	this.cursorManager.setBusyCursor();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The clearPreview() method removes all children from the canvas, disables the upload button and text input and sets the file name to null.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function clearPreview():void{
	this.uploadBtn.enabled = false;
	this.imageNameTI.enabled = false;
	this.previewFileName = null;
	this.imgCanvas.removeAllChildren();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The deleteSelectedImage() method calls the deleteImage() in the RemoteObject, passing the selected image name as an argument.&amp;nbsp; Then it disables the delete button and removes all children from the canvas.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function deleteSelectedImage():void{
	this.RO.deleteImage(this.imageSelect.selectedItem);
	this.deleteBtn.enabled = false;
	this.imgCanvas.removeAllChildren();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
And here is the completed MXML file.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;mx:WindowedApplication xmlns:mx=&amp;quot;http://www.adobe.com/2006/mxml&amp;quot; layout=&amp;quot;vertical&amp;quot; horizontalAlign=&amp;quot;left&amp;quot; creationComplete=&amp;quot;init()&amp;quot;&amp;gt;
	&amp;lt;mx:Script&amp;gt;
		&amp;lt;![CDATA[
			import mx.controls.Image;
			import mx.rpc.events.ResultEvent;
			import mx.rpc.events.FaultEvent;
			import mx.controls.Alert;
			
			[Bindable] private var _imageArray:Array;
			private var imageFile:File = File.documentsDirectory;
			private var imageTypes:FileFilter = new FileFilter(&amp;quot;Images (*.jpg; *.jpeg; *.gif; *.png)&amp;quot; ,&amp;quot;*.jpg; *.jpeg; *.gif; *.png&amp;quot;);
			private var ImageByteArray:ByteArray;
			private var ImageFileStream:FileStream;
			private var imgPreview:Image;
			private var previewFileType:String;
			[Bindable] private var previewFileName:String;
			
			private function init():void{
				this.RO.getImageArray();
			}
			private function onROFault(event:FaultEvent):void{
				Alert.show(event.fault.faultString,event.fault.faultDetail);
				cursorManager.removeBusyCursor();
			}
			private function onGetImageArrayResult(event:ResultEvent):void{
				_imageArray = event.result as Array;
				cursorManager.removeBusyCursor();
			}
			private function onImageSelect():void{
				clearPreview();
				
				this.RO.getImage(this.imageSelect.selectedItem);
				this.cursorManager.setBusyCursor();
			}
			private function onGetImageResult(event:ResultEvent):void{
				var tempImg:Image = new Image;
				tempImg.height = event.result.Height;
				tempImg.width = event.result.Width;
				tempImg.data = event.result.Data;
				this.imgCanvas.removeAllChildren();
				this.imgCanvas.addChild(tempImg);
				cursorManager.removeBusyCursor();
				this.deleteBtn.enabled = true;
			}
			private function selectImage():void{
				var imageTypesArray:Array = new Array(this.imageTypes);
				this.imageFile.browse(imageTypesArray);
				this.imageFile.addEventListener(Event.SELECT,imageSelected);
			}
			private function imageSelected(event:Event):void{
				this.ImageByteArray = new ByteArray();
				this.ImageFileStream = new FileStream();
				this.ImageFileStream.open(this.imageFile,FileMode.READ);
				this.ImageFileStream.readBytes(this.ImageByteArray);
				
				this.imgPreview = new Image;
				this.imgPreview.data = this.ImageByteArray;
				this.imgCanvas.removeAllChildren();
				this.imgCanvas.addChild(imgPreview);
				
				this.uploadBtn.enabled = true;
				this.imageNameTI.enabled = true;
				
				this.previewFileType = event.currentTarget.type;
				this.previewFileName = event.currentTarget.name.replace(this.previewFileType,&apos;&apos;);
			}
			private function uploadImage():void{
				this.RO.setImage(this.ImageByteArray,this.imageNameTI.text,this.previewFileType);
				clearPreview();
				this.cursorManager.setBusyCursor();
			}
			private function clearPreview():void{
				this.uploadBtn.enabled = false;
				this.imageNameTI.enabled = false;
				this.previewFileName = null;
				this.imgCanvas.removeAllChildren();
			}
			private function deleteSelectedImage():void{
				this.RO.deleteImage(this.imageSelect.selectedItem);
				this.deleteBtn.enabled = false;
				this.imgCanvas.removeAllChildren();
			}
		]]&amp;gt;
	&amp;lt;/mx:Script&amp;gt;
	
	&amp;lt;mx:RemoteObject id=&amp;quot;RO&amp;quot; endpoint=&amp;quot;http://localhost:8302/flex2gateway&amp;quot; destination=&amp;quot;ColdFusion&amp;quot;
		source=&amp;quot;ImageService&amp;quot; fault=&amp;quot;onROFault(event)&amp;quot;&amp;gt;
		
		&amp;lt;mx:method name=&amp;quot;getImageArray&amp;quot; result=&amp;quot;onGetImageArrayResult(event)&amp;quot;/&amp;gt;
		&amp;lt;mx:method name=&amp;quot;getImage&amp;quot; result=&amp;quot;onGetImageResult(event)&amp;quot;/&amp;gt;
		&amp;lt;mx:method name=&amp;quot;setImage&amp;quot; result=&amp;quot;this.RO.getImageArray()&amp;quot;/&amp;gt;
		&amp;lt;mx:method name=&amp;quot;deleteImage&amp;quot; result=&amp;quot;this.RO.getImageArray()&amp;quot;/&amp;gt;
		
	&amp;lt;/mx:RemoteObject&amp;gt;
	
	&amp;lt;mx:HBox width=&amp;quot;100%&amp;quot;&amp;gt;
		&amp;lt;mx:ComboBox id=&amp;quot;imageSelect&amp;quot; prompt=&amp;quot;Select an image...&amp;quot; dataProvider=&amp;quot;{_imageArray}&amp;quot; change=&amp;quot;onImageSelect()&amp;quot;/&amp;gt;
		&amp;lt;mx:Button label=&amp;quot;Add Image (Preview)&amp;quot; click=&amp;quot;selectImage()&amp;quot;/&amp;gt;
		&amp;lt;mx:TextInput id=&amp;quot;imageNameTI&amp;quot; text=&amp;quot;{this.previewFileName}&amp;quot; enabled=&amp;quot;false&amp;quot;/&amp;gt;
		&amp;lt;mx:Button id=&amp;quot;uploadBtn&amp;quot; label=&amp;quot;Upload&amp;quot; enabled=&amp;quot;false&amp;quot; click=&amp;quot;uploadImage()&amp;quot;/&amp;gt;
		&amp;lt;mx:Button id=&amp;quot;deleteBtn&amp;quot; label=&amp;quot;Delete Selected Image&amp;quot; enabled=&amp;quot;false&amp;quot; click=&amp;quot;deleteSelectedImage()&amp;quot;/&amp;gt;
	&amp;lt;/mx:HBox&amp;gt;
	
	&amp;lt;mx:Canvas id=&amp;quot;imgCanvas&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot;/&amp;gt;
	
&amp;lt;/mx:WindowedApplication&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
So there you have it, you can now move image data between CF8 and Flex 3 apps without having to make http post or get calls from the Flex app.&amp;nbsp; Delivering content via binary data / ByteArrays makes it possible to deliver content to your Flex applications without having to expose that content to the public web via a URL, combined with using RemoteObject over SSL you could make a pretty slick and secure application.&lt;/p&gt;</description><pubDate>Tue, 03 Feb 2009 17:01:00 GMT</pubDate><guid>http://goodcf.instantspot.com/blog/2009/02/03/Moving-Images-Between-CF-8-and-Flex-3-AIR-15--Part-2-of-2</guid></item><item><title>Moving Images Between CF 8 and Flex 3 (AIR 1.5) - Part 1 of 2</title><link>http://goodcf.instantspot.com/blog/2009/02/03/Moving-Images-Between-CF-8-and-Flex-3-AIR-15--Part-1-of-2</link><description>&lt;p&gt;In my &lt;a href=&quot;http://www.lanctr.com/blog/2009/02/03/Moving-Images-Between-CF-8-and-Flex-3-AIR-15--Part-1-of-2&quot; target=&quot;_blank&quot;&gt;previous post&lt;/a&gt; I covered the ColdFusion 8 half of moving image data between CF8 and Flex 3, AIR 1.5 in this example.&amp;nbsp; This post will be a bit longer since there is a bit more ActionScript (and MXML) than there was CFML.&amp;nbsp; I am going to assume that you know how to setup a new AIR / Flex project as that falls out of the scope of this topic.&lt;br /&gt;
&lt;br /&gt;
I started with a pretty basic layout for my application.&amp;nbsp; I have a ComboBox that displays the names of the available images, a button to browse and select a new image to add to the server, a TextInput to display the name of the selected image, an upload button to set the image data to the server and a delete button, obviously, to delete the selected image.&amp;nbsp; Below all that I have a canvas with it&amp;rsquo;s height and width set to 100% which I will use to contain and display the image I&amp;rsquo;ve selected.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;mx:HBox width=&amp;quot;100%&amp;quot;&amp;gt;
	&amp;lt;mx:ComboBox id=&amp;quot;imageSelect&amp;quot; prompt=&amp;quot;Select an image...&amp;quot; dataProvider=&amp;quot;{_imageArray}&amp;quot; change=&amp;quot;onImageSelect()&amp;quot;/&amp;gt;
	&amp;lt;mx:Button label=&amp;quot;Add Image (Preview)&amp;quot; click=&amp;quot;selectImage()&amp;quot;/&amp;gt;
	&amp;lt;mx:TextInput id=&amp;quot;imageNameTI&amp;quot; text=&amp;quot;{this.previewFileName}&amp;quot; enabled=&amp;quot;false&amp;quot;/&amp;gt;
	&amp;lt;mx:Button id=&amp;quot;uploadBtn&amp;quot; label=&amp;quot;Upload&amp;quot; enabled=&amp;quot;false&amp;quot; click=&amp;quot;uploadImage()&amp;quot;/&amp;gt;
	&amp;lt;mx:Button id=&amp;quot;deleteBtn&amp;quot; label=&amp;quot;Delete Selected Image&amp;quot; enabled=&amp;quot;false&amp;quot; click=&amp;quot;deleteSelectedImage()&amp;quot;/&amp;gt;
&amp;lt;/mx:HBox&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Next I&amp;rsquo;ve defined my RemoteObject and the methods I want to call.&amp;nbsp; Note that since I am working with AIR I need to specify an endpoint for my RemoteObject, in my case http://localhost:8302/flex2gateway .&amp;nbsp; Without the endpoint the RemoteObject will not know where your CFC lives.&amp;nbsp; Also, note the &amp;lsquo;/flex2gateway&amp;rsquo; at the end of my url.&amp;nbsp; This is how the RemoteObject talks to CF and it is required when connecting an Adobe ColdFusion server, I can&amp;rsquo;t speak for the other projects like OpenBD or Railo since I haven&amp;rsquo;t used remoting with them.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;mx:RemoteObject id=&amp;quot;RO&amp;quot; endpoint=&amp;quot;http://localhost:8302/flex2gateway&amp;quot; destination=&amp;quot;ColdFusion&amp;quot;
	source=&amp;quot;ImageService&amp;quot; fault=&amp;quot;onROFault(event)&amp;quot;&amp;gt;
	
	&amp;lt;mx:method name=&amp;quot;getImageArray&amp;quot; result=&amp;quot;onGetImageArrayResult(event)&amp;quot;/&amp;gt;
	&amp;lt;mx:method name=&amp;quot;getImage&amp;quot; result=&amp;quot;onGetImageResult(event)&amp;quot;/&amp;gt;
	&amp;lt;mx:method name=&amp;quot;setImage&amp;quot; result=&amp;quot;this.RO.getImageArray()&amp;quot;/&amp;gt;
	&amp;lt;mx:method name=&amp;quot;deleteImage&amp;quot; result=&amp;quot;this.RO.getImageArray()&amp;quot;/&amp;gt;
	
&amp;lt;/mx:RemoteObject&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Each of the methods in my RemoteObject correspond to it&amp;rsquo;s counterpart in the CFC.&amp;nbsp; In both the getImageArray and getImage methods I am calling an actionscript method and passing the ResultEvent as an argument.&amp;nbsp; Rather than calling a method when a result is returned from the setImage and deleteImage methods I am directly invoking the getImageArray method on the RemoteObject, this will just update my list of available images in the ComboBox.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
ActionScript methods.&lt;br /&gt;
&lt;br /&gt;
The init() method is called when the creationComplete event is dispatched by the application.&amp;nbsp; In it I am making a call to the getImageArray method.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function init():void{
	this.RO.getImageArray();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The onROFault() method handles any fault events from the RO RemoteObject.&amp;nbsp; I&amp;rsquo;m just popping up an Alert with the fault strings and clearing the busy cursor if we have one.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function onROFault(event:FaultEvent):void{
	Alert.show(event.fault.faultString,event.fault.faultDetail);
	cursorManager.removeBusyCursor();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The onGetImageArray() method is called when a result is returned from the getImageArray() method.&amp;nbsp; I am casting the event.result into a bindable array that I&amp;rsquo;ve defined at the top of my script block.&amp;nbsp; The array, _imageArray, is set as the dataProvider for my ComboBox, and because it is bindable any changes made to _imageArray will be reflected in the contents of the ComboBox&amp;rsquo;s drop down.&amp;nbsp; I am also removing the busy cursor if we are displaying one.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function onGetImageArrayResult(event:ResultEvent):void{
	_imageArray = event.result as Array;
	cursorManager.removeBusyCursor();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The onImageSelect() method is called when an image name is selected from the ComboBox.&amp;nbsp; I&amp;rsquo;m calling another method, clearPreview(), to sort of reset the application, more on this later.&amp;nbsp; Next I call the getImage() method passing the selected image name from the ComboBox as an argument and showing the busy cursor.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function onImageSelect():void{
	clearPreview();
	
	this.RO.getImage(this.imageSelect.selectedItem);
	this.cursorManager.setBusyCursor();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The onGetImageResult() method is the handler called by the result event from calling getImage().&amp;nbsp; Here&amp;rsquo;s where we start to see how we handle the image data returned from ColdFusion.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function onGetImageResult(event:ResultEvent):void{
	var tempImg:Image = new Image;
	tempImg.height = event.result.Height;
	tempImg.width = event.result.Width;
	tempImg.data = event.result.Data;
	this.imgCanvas.removeAllChildren();
	this.imgCanvas.addChild(tempImg);
	cursorManager.removeBusyCursor();
	this.deleteBtn.enabled = true;
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
First I create a new Image and set it&amp;rsquo;s height and width to the returned Height and Width values.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;var tempImg:Image = new Image;
tempImg.height = event.result.Height;
tempImg.width = event.result.Width;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Next we set the data property of the Image equal to the returned binary blob.&amp;nbsp; This was the data we got when we used the ImageGetBlob() function in our CFC.&amp;nbsp; Binary data in ColdFusion is the same as a ByteArray in Flex, and since the data attribute of our image expects a ByteArray we can pass the returned value right in without any data casting or translation.&amp;nbsp; Pretty cool huh?&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;tempImg.data = event.result.Data;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
After setting up the image I remove any children the canvas might have so that Flex doesn&amp;rsquo;t just stack the images one on top of the other.&amp;nbsp; Next I add the image as a child to the canvas, remove the busy cursor and enable my delete button.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;this.imgCanvas.removeAllChildren();
this.imgCanvas.addChild(tempImg);
cursorManager.removeBusyCursor();
this.deleteBtn.enabled = true;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The selectImage() method is called when the &amp;ldquo;Add Image&amp;rdquo; button is clicked.&amp;nbsp; I create an array of image file types the application will accept, I defined the values in a variable at the top of the script block, all other file types will not be selectable in the file browser.&amp;nbsp; Next I open the native file browser, I set the default directory as the user&amp;rsquo;s documents directory at the top of the script block.&amp;nbsp; Then i add an event listener for when a file is selected.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function selectImage():void{
	var imageTypesArray:Array = new Array(this.imageTypes);
	this.imageFile.browse(imageTypesArray);
	this.imageFile.addEventListener(Event.SELECT,imageSelected);
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The imageSelected() method is called when a file has been chosen through the native file browser.&amp;nbsp; Here again I am using ByteArrays to store the image data.&amp;nbsp; I&amp;rsquo;m also using a FileStream to read the bytes from the selected image and store them in my ByteArray.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function imageSelected(event:Event):void{
	this.ImageByteArray = new ByteArray();
	this.ImageFileStream = new FileStream();
	this.ImageFileStream.open(this.imageFile,FileMode.READ);
	this.ImageFileStream.readBytes(this.ImageByteArray);
	
	this.imgPreview = new Image;
	this.imgPreview.data = this.ImageByteArray;
	this.imgCanvas.removeAllChildren();
	this.imgCanvas.addChild(imgPreview);
	
	this.uploadBtn.enabled = true;
	this.imageNameTI.enabled = true;
	
	this.previewFileType = event.currentTarget.type;
	this.previewFileName = event.currentTarget.name.replace(this.previewFileType,&apos;&apos;);
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Next I create a new Image much like i did before, however, since I haven&amp;rsquo;t figured out how to read the image metadata with Flex / AIR I am letting Flex figure out the image&amp;rsquo;s dimensions based on just the image created by the ByteArray.&amp;nbsp; Then I remove any children from the canvas, giving me a clear work area in which to add my new image.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;this.imgPreview = new Image;
this.imgPreview.data = this.ImageByteArray;
this.imgCanvas.removeAllChildren();
this.imgCanvas.addChild(imgPreview);&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Next I enable my Upload button and the TextInput so the user can rename the image if they want.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;this.uploadBtn.enabled = true;
this.imageNameTI.enabled = true;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Lastly I store the image format (extension) and strip the extension from the file name, giving the user the ability to only rename the file, but not change it&amp;rsquo;s format.&amp;nbsp; If you want to let your users change the format you can, it&amp;rsquo;s just a matter of giving them the options your server can read.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;this.previewFileType = event.currentTarget.type;
this.previewFileName = event.currentTarget.name.replace(this.previewFileType,&apos;&apos;);&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
At this point I haven&amp;rsquo;t actually sent the image data to the server, this is simply a preview mode so that the user can see the image selected.&amp;nbsp; From reading a few other blog posts it seems that this behavior should also be possible in Flash Player 10 apps, where the client side application is able to store the ByteArray in memory and manipulate it without having to interact with the server.&amp;nbsp; As I understand it, Flash Player 9 would require the data to be sent to the server then returned from the server in order to work with it.&amp;nbsp; Please correct me if my assumption is incorrect.&lt;br /&gt;
&lt;br /&gt;
The uploadImage() method is called when the upload button is clicked.&amp;nbsp; In it I make a call to the setImage() method in my RemoteObject, passing the image ByteArray, image name and image format (extension) as arguments.&amp;nbsp; Then I call the clearPreview() method to &amp;lsquo;reset&amp;rsquo; my application and show the busy cursor.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function uploadImage():void{
	this.RO.setImage(this.ImageByteArray,this.imageNameTI.text,this.previewFileType);
	clearPreview();
	this.cursorManager.setBusyCursor();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The clearPreview() method removes all children from the canvas, disables the upload button and text input and sets the file name to null.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function clearPreview():void{
	this.uploadBtn.enabled = false;
	this.imageNameTI.enabled = false;
	this.previewFileName = null;
	this.imgCanvas.removeAllChildren();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
The deleteSelectedImage() method calls the deleteImage() in the RemoteObject, passing the selected image name as an argument.&amp;nbsp; Then it disables the delete button and removes all children from the canvas.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;private function deleteSelectedImage():void{
	this.RO.deleteImage(this.imageSelect.selectedItem);
	this.deleteBtn.enabled = false;
	this.imgCanvas.removeAllChildren();
}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
And here is the completed MXML file.&lt;br /&gt;
&lt;div class=&quot;code&quot; &gt;&lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;mx:WindowedApplication xmlns:mx=&amp;quot;http://www.adobe.com/2006/mxml&amp;quot; layout=&amp;quot;vertical&amp;quot; horizontalAlign=&amp;quot;left&amp;quot; creationComplete=&amp;quot;init()&amp;quot;&amp;gt;
	&amp;lt;mx:Script&amp;gt;
		&amp;lt;![CDATA[
			import mx.controls.Image;
			import mx.rpc.events.ResultEvent;
			import mx.rpc.events.FaultEvent;
			import mx.controls.Alert;
			
			[Bindable] private var _imageArray:Array;
			private var imageFile:File = File.documentsDirectory;
			private var imageTypes:FileFilter = new FileFilter(&amp;quot;Images (*.jpg; *.jpeg; *.gif; *.png)&amp;quot; ,&amp;quot;*.jpg; *.jpeg; *.gif; *.png&amp;quot;);
			private var ImageByteArray:ByteArray;
			private var ImageFileStream:FileStream;
			private var imgPreview:Image;
			private var previewFileType:String;
			[Bindable] private var previewFileName:String;
			
			private function init():void{
				this.RO.getImageArray();
			}
			private function onROFault(event:FaultEvent):void{
				Alert.show(event.fault.faultString,event.fault.faultDetail);
				cursorManager.removeBusyCursor();
			}
			private function onGetImageArrayResult(event:ResultEvent):void{
				_imageArray = event.result as Array;
				cursorManager.removeBusyCursor();
			}
			private function onImageSelect():void{
				clearPreview();
				
				this.RO.getImage(this.imageSelect.selectedItem);
				this.cursorManager.setBusyCursor();
			}
			private function onGetImageResult(event:ResultEvent):void{
				var tempImg:Image = new Image;
				tempImg.height = event.result.Height;
				tempImg.width = event.result.Width;
				tempImg.data = event.result.Data;
				this.imgCanvas.removeAllChildren();
				this.imgCanvas.addChild(tempImg);
				cursorManager.removeBusyCursor();
				this.deleteBtn.enabled = true;
			}
			private function selectImage():void{
				var imageTypesArray:Array = new Array(this.imageTypes);
				this.imageFile.browse(imageTypesArray);
				this.imageFile.addEventListener(Event.SELECT,imageSelected);
			}
			private function imageSelected(event:Event):void{
				this.ImageByteArray = new ByteArray();
				this.ImageFileStream = new FileStream();
				this.ImageFileStream.open(this.imageFile,FileMode.READ);
				this.ImageFileStream.readBytes(this.ImageByteArray);
				
				this.imgPreview = new Image;
				this.imgPreview.data = this.ImageByteArray;
				this.imgCanvas.removeAllChildren();
				this.imgCanvas.addChild(imgPreview);
				
				this.uploadBtn.enabled = true;
				this.imageNameTI.enabled = true;
				
				this.previewFileType = event.currentTarget.type;
				this.previewFileName = event.currentTarget.name.replace(this.previewFileType,&apos;&apos;);
			}
			private function uploadImage():void{
				this.RO.setImage(this.ImageByteArray,this.imageNameTI.text,this.previewFileType);
				clearPreview();
				this.cursorManager.setBusyCursor();
			}
			private function clearPreview():void{
				this.uploadBtn.enabled = false;
				this.imageNameTI.enabled = false;
				this.previewFileName = null;
				this.imgCanvas.removeAllChildren();
			}
			private function deleteSelectedImage():void{
				this.RO.deleteImage(this.imageSelect.selectedItem);
				this.deleteBtn.enabled = false;
				this.imgCanvas.removeAllChildren();
			}
		]]&amp;gt;
	&amp;lt;/mx:Script&amp;gt;
	
	&amp;lt;mx:RemoteObject id=&amp;quot;RO&amp;quot; endpoint=&amp;quot;http://localhost:8302/flex2gateway&amp;quot; destination=&amp;quot;ColdFusion&amp;quot;
		source=&amp;quot;ImageService&amp;quot; fault=&amp;quot;onROFault(event)&amp;quot;&amp;gt;
		
		&amp;lt;mx:method name=&amp;quot;getImageArray&amp;quot; result=&amp;quot;onGetImageArrayResult(event)&amp;quot;/&amp;gt;
		&amp;lt;mx:method name=&amp;quot;getImage&amp;quot; result=&amp;quot;onGetImageResult(event)&amp;quot;/&amp;gt;
		&amp;lt;mx:method name=&amp;quot;setImage&amp;quot; result=&amp;quot;this.RO.getImageArray()&amp;quot;/&amp;gt;
		&amp;lt;mx:method name=&amp;quot;deleteImage&amp;quot; result=&amp;quot;this.RO.getImageArray()&amp;quot;/&amp;gt;
		
	&amp;lt;/mx:RemoteObject&amp;gt;
	
	&amp;lt;mx:HBox width=&amp;quot;100%&amp;quot;&amp;gt;
		&amp;lt;mx:ComboBox id=&amp;quot;imageSelect&amp;quot; prompt=&amp;quot;Select an image...&amp;quot; dataProvider=&amp;quot;{_imageArray}&amp;quot; change=&amp;quot;onImageSelect()&amp;quot;/&amp;gt;
		&amp;lt;mx:Button label=&amp;quot;Add Image (Preview)&amp;quot; click=&amp;quot;selectImage()&amp;quot;/&amp;gt;
		&amp;lt;mx:TextInput id=&amp;quot;imageNameTI&amp;quot; text=&amp;quot;{this.previewFileName}&amp;quot; enabled=&amp;quot;false&amp;quot;/&amp;gt;
		&amp;lt;mx:Button id=&amp;quot;uploadBtn&amp;quot; label=&amp;quot;Upload&amp;quot; enabled=&amp;quot;false&amp;quot; click=&amp;quot;uploadImage()&amp;quot;/&amp;gt;
		&amp;lt;mx:Button id=&amp;quot;deleteBtn&amp;quot; label=&amp;quot;Delete Selected Image&amp;quot; enabled=&amp;quot;false&amp;quot; click=&amp;quot;deleteSelectedImage()&amp;quot;/&amp;gt;
	&amp;lt;/mx:HBox&amp;gt;
	
	&amp;lt;mx:Canvas id=&amp;quot;imgCanvas&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot;/&amp;gt;
	
&amp;lt;/mx:WindowedApplication&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
So there you have it, you can now move image data between CF8 and Flex 3 apps without having to make http post or get calls from the Flex app.&amp;nbsp; Delivering content via binary data / ByteArrays makes it possible to deliver content to your Flex applications without having to expose that content to the public web via a URL, combined with using RemoteObject over SSL you could make a pretty slick and secure application.&lt;/p&gt;</description><pubDate>Tue, 03 Feb 2009 06:45:00 GMT</pubDate><guid>http://goodcf.instantspot.com/blog/2009/02/03/Moving-Images-Between-CF-8-and-Flex-3-AIR-15--Part-1-of-2</guid></item><item><title>dlog private beta</title><link>http://goodcf.instantspot.com/blog/2008/10/12/dlog-private-beta</link><description>&lt;p&gt;I&apos;m going to be releasing version 0.1.0b of dlog as a private beta.&#xa0; To be part of it, shoot me a DM on twitter (&lt;a target=&quot;_blank&quot; href=&quot;http://twitter.com/stevegood&quot;&gt;@stevegood&lt;/a&gt;), or hit the Contact Form button below my picture here on the blog.&#xa0; Either way, send me your email address and I&apos;ll make sure to get you included in the beta.&lt;/p&gt;
&lt;p&gt;Things to expect in the 0.1.0b release:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Basic Twitter functionality&lt;/li&gt;
    &lt;li&gt;Ability to create a blog post (currently only for InstantSpot blogs) and assign categories to it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Things to expect, in addition to above, before the public beta release (0.5.0b):&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;RegEx filtering and blocking for twitter / pownce / friendfeed messages and RSS feeds&lt;/li&gt;
    &lt;li&gt;Ability to create mashups of twitter /pownce / friendfeed with filters&lt;/li&gt;
    &lt;li&gt;Ability to edit or view blog entries&lt;/li&gt;
    &lt;li&gt;Support for more XMLRPC MetaWeblog API blog sites, like blogspot and blogger&lt;/li&gt;
    &lt;li&gt;Light weight RSS reader&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I didn&apos;t include Jaiku in any of my features since, at the time of this posting, I still have not been sent an invitation to the service, which means no API access either.&#xa0; If anyone knows a way for me to get an account on the service shoot me an email sgood [at] lanctr [dot] com or hit the contact form button on my blog.&lt;/p&gt;
&lt;p&gt;Thanks for readin&apos;!&#xa0;&lt;/p&gt;</description><pubDate>Sun, 12 Oct 2008 13:56:00 GMT</pubDate><guid>http://goodcf.instantspot.com/blog/2008/10/12/dlog-private-beta</guid></item><item><title>dlog preview</title><link>http://goodcf.instantspot.com/blog/2008/09/26/dlog-preview</link><description>&lt;p&gt;Here&apos;s a preview of dlog, my AIR (desktop) app for blogging and microblogging built completely in Flex. Currently it handles service interfaces to twitter and instantspot. It&apos;s final release will include the ability to interact with twitter, pownce, friendfeed and jaiku for microblogging and any blogging site that uses the MetaWeblog API (XMLRPC). If you have any suggested services that could be integrated in please let me know, I&apos;m always open to adding more functionality.&lt;/p&gt;
&lt;p&gt;Here&apos;s the video!&lt;/p&gt;
&lt;p&gt;&lt;object width=&quot;499&quot; height=&quot;360&quot;&gt;	&lt;param name=&quot;allowfullscreen&quot; value=&quot;true&quot; /&gt;	&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;	&lt;param name=&quot;movie&quot; value=&quot;http://vimeo.com/moogaloop.swf?clip_id=1820348&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1&quot; /&gt;	&lt;embed src=&quot;http://vimeo.com/moogaloop.swf?clip_id=1820348&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; width=&quot;499&quot; height=&quot;360&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;a href=&quot;http://vimeo.com/1820348?pg=embed&amp;amp;sec=1820348&quot;&gt;dlog - v0.0.2b - 9-26-2008&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/stevegood?pg=embed&amp;amp;sec=1820348&quot;&gt;Steve Good&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com?pg=embed&amp;amp;sec=1820348&quot;&gt;Vimeo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here&apos;s a link to the uncompressed version, just a little over 6MB. &lt;a href=&quot;http://dl.getdropbox.com/u/208899/dlog-preview.mp4&quot; target=&quot;_blank&quot;&gt;&lt;br /&gt;
dl.getdropbox.com/u/208899/dlog-preview.mp4&lt;/a&gt;&lt;/p&gt;</description><pubDate>Fri, 26 Sep 2008 18:32:00 GMT</pubDate><guid>http://goodcf.instantspot.com/blog/2008/09/26/dlog-preview</guid></item><item><title>Subeclipse in Flexbuilder</title><link>http://kukiel.instantspot.com/blog/2008/05/20/Subeclipse-in-Flexbuilder</link><description>&lt;p&gt;I wanted to intergrate SVN into Flexbuilder.&amp;nbsp; As flexbuilder doesn&apos;t include all the java plugins installing SubEclipse took 1 or 2 extra steps.&amp;nbsp; I found this blog post which worked for me without issue:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flexer.info/2008/04/30/how-to-install-subclipse-on-flex-builder-3/&quot;&gt;http://www.flexer.info/2008/04/30/how-to-install-subclipse-on-flex-builder-3/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s working great. Now to find a MS SQL explorer plugin so I don&apos;t need Enterprise manager open as well.&lt;/p&gt;</description><pubDate>Tue, 20 May 2008 15:01:00 GMT</pubDate><guid>http://kukiel.instantspot.com/blog/2008/05/20/Subeclipse-in-Flexbuilder</guid></item><item><title>Adobe Air Camp</title><link>http://kukiel.instantspot.com/blog/2008/05/17/Adobe-Air-Camp</link><description>&lt;p&gt;I recently attended Adobe&apos;s Air Camp ( Melbourne Australia ).&amp;nbsp; There was quite a large turn out and a surprising amount of interest.&amp;nbsp; I spoke with a few people and, as noted by Adobe, one of the key points is due to Adobes push for cross platform frameworks.&lt;/p&gt;
&lt;p&gt;I&apos;d say 70% of laptops I saw there were Macs and 100% of the Adobe staff were on Macs.&amp;nbsp; I sat with a few guys who basically said if this didnt run on Linux then they wouldn&apos;t have been there that day.&amp;nbsp; I think this is a good thing for Adobe.&amp;nbsp; I have personally been using Flexbuilder in OSX, Windows and I played with it in Linux all with great success.&lt;/p&gt;
&lt;p&gt;One of the nice things Adobe is doing is working hard to integrate its products and although I don&apos;t use CS3, others at work do and now they can design UI in Flash and Fireworks then pass that onto a developer to implement the logic.&lt;/p&gt;
&lt;p&gt;The presenters and their blogs were:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Andrew Spaulding - &lt;a href=&quot;http://www.flexdaddy.com/&quot;&gt;http://www.flexdaddy.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mark Blair - &lt;a href=&quot;http://www.blairsblog.com/&quot;&gt;http://www.blairsblog.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Matt Voerman - &lt;a href=&quot;http://blog.schematic.com.au/&quot;&gt;http://blog.schematic.com.au/&lt;/a&gt;&lt;/p&gt;</description><pubDate>Sat, 17 May 2008 15:13:00 GMT</pubDate><guid>http://kukiel.instantspot.com/blog/2008/05/17/Adobe-Air-Camp</guid></item><item><title>Coldfusion on OSX ( again )</title><link>http://kukiel.instantspot.com/blog/2008/04/19/Coldfusion-on-OSX--again-</link><description>Well the CF 8 install on leopard was working well the constant wifi drop outs I was experiencing were just not worth the price on the &quot;newest and shiniest&quot; OS.  So today I wiped the old partition and reinstalled OSX 10.4.

Ill follow the same steps as before on hopefully have my setup running again soon.</description><pubDate>Sun, 20 Apr 2008 00:56:00 GMT</pubDate><guid>http://kukiel.instantspot.com/blog/2008/04/19/Coldfusion-on-OSX--again-</guid></item><item><title>Coldfusion and Flex a perfect harmony.</title><link>http://kukiel.instantspot.com/blog/2008/04/18/Coldfusion-and-Flex-a-perfect-harmony</link><description>&lt;div style=&quot;margin: 0cm 0cm 10pt&quot;&gt;&lt;span style=&quot;font-size: 7.5pt; line-height: 115%&quot;&gt;A new site has been launched to give examples and short tutorials on how Coldfusion and Flex communicate.&amp;nbsp;Anyone can submit a tutorial and request specific examples.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin: 0cm 0cm 10pt&quot;&gt;&lt;span style=&quot;font-size: 7.5pt; line-height: 115%&quot;&gt;&lt;a href=&quot;http://www.flexcf.com/&quot;&gt;www.flexcf.com&lt;/a&gt; is the sister site to &lt;a href=&quot;http://www.learncf.com/&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;www.learncf.com&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;</description><pubDate>Fri, 18 Apr 2008 05:09:00 GMT</pubDate><guid>http://kukiel.instantspot.com/blog/2008/04/18/Coldfusion-and-Flex-a-perfect-harmony</guid></item><item><title>My notes on Adobe&apos;s Flex 3 presentation: D-Flex UG kickoff meeting</title><link>http://daveshuck.instantspot.com/blog/2008/02/01/My-notes-on-Adobes-Flex-3-presentation-DFlex-UG-kickoff-meeting</link><description>&lt;p&gt;Last night was the kickoff meeting for D-Flex which is the &lt;a href=&quot;http://www.d-flex.org&quot;&gt;Dallas Flex User Group&lt;/a&gt;.  This meeting was planned in conjunction with the Flex 3 Launch and featured a presentation by local Flex guru Mark Pillar, of Midnight Coders, Inc who delivered a presentation that was created by Adobe.   As he went through the presentation, I took some very high level notes in bullet point format.  &lt;br /&gt;
&lt;br /&gt;
One thing of note specific to ColdFusion - Not *once* in Adobe&apos;s presentation materials did they even give the slightest mention to CF and how gracefully it natively interacts with Flex.  As a CF developer, I find this a bit troublesome and makes me wonder a bit about Adobe&apos;s commitment to promoting ColdFusion outside of the ColdFusion community itself.&lt;br /&gt;
&lt;br /&gt;
Here are my notes...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;big&gt;Mark Piller - Midnight Coders, Inc&lt;/big&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;General demo of features of Flex Builder
    &lt;ul&gt;
        &lt;li&gt;Design view&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
        &lt;li&gt;Descriptions of XMXL &amp;amp; AS&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Adobe RIA technology principles
    &lt;ul&gt;
        &lt;li&gt;Deploy consistently no all browsers, and now on the desktop&lt;/li&gt;
        &lt;li&gt;Engaging, highly interactive, expressive experiences&lt;/li&gt;
        &lt;li&gt;Highly productive environment&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Description of Adobe&apos;s stack of tools&lt;/li&gt;
    &lt;li&gt;Adobe reaches 700+ million PCs and 200+ devices&lt;/li&gt;
    &lt;li&gt;99% reach on connected PCs. 8 million installs per day&lt;/li&gt;
    &lt;li&gt;250,000,000 PDF Files on the internet&lt;/li&gt;
    &lt;li&gt;Discussion of the Designer Developer Workflow - Fw, Fx, Ps, Fl, Ai
    &lt;ul&gt;
        &lt;li&gt;Thermo&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Some interesting Flex implementations
    &lt;ul&gt;
        &lt;li&gt;Buzzword - very cool web based Flex word processing app (url: &lt;a href=&quot;http://www.buzzword.com&quot;&gt;http://www.buzzword.com&lt;/a&gt; )&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
        &lt;li&gt;Small Worlds - Virtual 3d world written in Flex (url: &lt;a href=&quot;http://www.smallworlds.com/beta/&quot;&gt;http://www.smallworlds.com/beta/&lt;/a&gt; )&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Rich library of common UI Controls
    &lt;ul&gt;
        &lt;li&gt;video playback components&lt;/li&gt;
        &lt;li&gt;datagrids, date, controls, etc&lt;/li&gt;
        &lt;li&gt;charting components&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Extensible model
    &lt;ul&gt;
        &lt;li&gt;CSS support&lt;/li&gt;
        &lt;li&gt;skinnable components&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;price for Flex Builder -  $249 standard, professional $649 (upgrade pricing: Standard - 99 plugin, 249 standalone... I may have recorded the upgrade pricing incorrectly as I was still typing when he changed slides)&lt;/li&gt;
    &lt;li&gt;Import Skin Assets into Flex Builder
    &lt;ul&gt;
        &lt;li&gt;CS3 makes it easy to create custom skins, then use the Flex Import Wizard&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;New in Flex 3
    &lt;ul&gt;
        &lt;li&gt;visual CSS editor&lt;/li&gt;
        &lt;li&gt;view all component states in one view&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Design view enhancements
    &lt;ul&gt;
        &lt;li&gt;Enhanced Constraints Model
        &lt;ul&gt;
            &lt;li&gt;align components with edges of any vertical of horizontal coordinate&lt;/li&gt;
        &lt;/ul&gt;
        &lt;ul&gt;
            &lt;li&gt;support for basline alignment&lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;Skinning Model Improvements
        &lt;ul&gt;
            &lt;li&gt;New skin states simplify styling&lt;/li&gt;
            &lt;li&gt;Enhanced control over individual components&lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;OpenType Font support&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Advanced Data Grid
    &lt;ul&gt;
        &lt;li&gt;New &amp;quot;Grouping&amp;quot; including multiple grouping in datagrids in Fx3.  Looks like an expandable folder tree view&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Charting enhancments&lt;/li&gt;
    &lt;li&gt;New list and detail enhancements&lt;/li&gt;
    &lt;li&gt;Working with Data
    &lt;ul&gt;
        &lt;li&gt;Web Services Introspection
        &lt;ul&gt;
            &lt;li&gt;Generate client proxy classes from wsdl signatures&lt;/li&gt;
            &lt;li&gt;Includes support for complex types returned from web services&lt;/li&gt;
            &lt;li&gt;enables complete code hinting for service methods and custom types&lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;Introductory Data Wizards
        &lt;ul&gt;
            &lt;li&gt;generates crud, etc but is mostly only useful to those just getting started&lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;AIR
    &lt;ul&gt;
        &lt;li&gt;Previously named Apollo&lt;/li&gt;
        &lt;li&gt;Cross-OS application engine that enables hybrid desktop-internet application
        &lt;ul&gt;
            &lt;li&gt;New capabilities
            &lt;ul&gt;
                &lt;li&gt;Native OS drag and drop support&lt;/li&gt;
            &lt;/ul&gt;
            &lt;ul&gt;
                &lt;li&gt;multi-windowed apps&lt;/li&gt;
            &lt;/ul&gt;
            &lt;ul&gt;
                &lt;li&gt;access local file sys&lt;/li&gt;
            &lt;/ul&gt;
            &lt;ul&gt;
                &lt;li&gt;local database storage&lt;/li&gt;
            &lt;/ul&gt;
            &lt;ul&gt;
                &lt;li&gt;complete rendering support for html&lt;/li&gt;
            &lt;/ul&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;Flex Builder support for AIR apps&lt;/li&gt;
        &lt;li&gt;Platform evolution
        &lt;ul&gt;
            &lt;li&gt;Reduced application size&lt;/li&gt;
            &lt;li&gt;users only need to download the Adobe-signed F3 platform component once&lt;/li&gt;
            &lt;li&gt;Flash player cache stores it for use by any flex-enabled site&lt;/li&gt;
            &lt;li&gt;enter flex apps can no be as small as 50K (used to be around 250K)&lt;/li&gt;
            &lt;li&gt;Flex 3 RSL  - runtime shared library&lt;/li&gt;
            &lt;li&gt;RSL is potentially pulled from any Flex app.
            &lt;ul&gt;
                &lt;li&gt;question about the case where someone might modify the RSL on their site?  Handshake from the player maybe? No answer&lt;/li&gt;
            &lt;/ul&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Example of the Flex Builder profiler that allowed visibility to bottle necks &amp;amp; high memory spots in the application.  Also shows how many instances of objects have been created.&lt;/li&gt;
    &lt;li&gt;JavaScript and Ajax Wrappers&lt;/li&gt;
    &lt;li&gt;Deep Linking
    &lt;ul&gt;
        &lt;li&gt;updates browser URL to represent application state&lt;/li&gt;
        &lt;li&gt;enables user to bookmark particular points in the app or share urls&lt;/li&gt;
        &lt;li&gt;standalone web-tier compiler modules for IIS and Apache&lt;/li&gt;
        &lt;li&gt;Mark questioned how usable it is in its current state and insinuated that there may be some issue with using this&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;AIR application stack
    &lt;ul&gt;
        &lt;li&gt;walk through of Seamless install (after you have AIR runtime installed which makes this a bit less than &amp;quot;seamless&amp;quot; for first timers)&lt;/li&gt;
        &lt;li&gt;web launcher&lt;/li&gt;
        &lt;li&gt;AIR installer contans&lt;/li&gt;
        &lt;li&gt;Privileges - AIR apps have full desktop application privileges
        &lt;ul&gt;
            &lt;li&gt;read/write files, background execution, network access&lt;/li&gt;
            &lt;li&gt;There is apparently some setting in the AIR runtime environment to limit this... (an operating system where the default user doesn&apos;t have admin rights is my personal suggestion)&lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;Window Chrome
        &lt;ul&gt;
            &lt;li&gt;use native OS window chrome&lt;/li&gt;
            &lt;li&gt;use custom chrome implemented by application&lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;Local File Access
        &lt;ul&gt;
            &lt;li&gt;create delete copy move, list directoreis, get system info on files, dirs&lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;Local database
        &lt;ul&gt;
            &lt;li&gt;SQL Lite
            &lt;ul&gt;
                &lt;li&gt;supports ACID transactions&lt;/li&gt;
                &lt;li&gt;zero-config allowing for embedded solution&lt;/li&gt;
            &lt;/ul&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;AIR desktop integration
        &lt;ul&gt;
            &lt;li&gt;install/uninstall&lt;/li&gt;
            &lt;li&gt;task manager or process list&lt;/li&gt;
            &lt;li&gt;application shortcuts, drag/drop&lt;/li&gt;
            &lt;li&gt;clipboard&lt;/li&gt;
            &lt;li&gt;app can run in background, can show on taskbar&lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;Adobe Reader integration&lt;/li&gt;
        &lt;li&gt;AIR limitations
        &lt;ul&gt;
            &lt;li&gt;limited hardware accessibility&lt;/li&gt;
            &lt;li&gt;no access to native libraries/executables&lt;/li&gt;
            &lt;li&gt;no USB or serial port&lt;/li&gt;
            &lt;li&gt;limited support for accessibility,&lt;/li&gt;
            &lt;li&gt;limited printing support&lt;/li&gt;
            &lt;li&gt;limited localization
            &lt;ul&gt;
                &lt;li&gt;English only for 1.0&lt;/li&gt;
                &lt;li&gt;Japanese, German, French for 1.1&lt;/li&gt;
            &lt;/ul&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Flex Remoting, Data Management and Messaging
    &lt;ul&gt;
        &lt;li&gt;Java,.NET, PHP and Ruby solutions... no ColdFusion in your preso Adobe???&lt;/li&gt;
        &lt;li&gt;first connectivity for Java was FDS,
        &lt;ul&gt;
            &lt;li&gt;JAVA -open source on elater Granite Data Service, Red5, WebORB ***matches LiveCycle features***, BlazeDS&lt;/li&gt;
            &lt;li&gt;.NET - WebORB for .NET, Flourine, AMF.Net&lt;/li&gt;
            &lt;li&gt;PHP - WebORB for PHP, AMFPHP, SabreAMF&lt;/li&gt;
            &lt;li&gt;Ruby - WebORB for Rails, RubyAMF (*stronger than WebORB for Rails*)&lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;Introducing Open Source BlazeDS
        &lt;ul&gt;
            &lt;li&gt;Capabilites
            &lt;ul&gt;
                &lt;li&gt;Easily connects FLex and AIR apps to existing server logic&lt;/li&gt;
                &lt;li&gt;high performance data transfer&lt;/li&gt;
                &lt;li&gt;real-time data push over standard http&lt;/li&gt;
                &lt;li&gt;full pub/sub messaging that extends existing messaging infrastructure&lt;/li&gt;
                &lt;li&gt;publication of AMF3&lt;/li&gt;
            &lt;/ul&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
        &lt;li&gt;bottom line: there is a free connector for almost every solution&lt;/li&gt;
        &lt;li&gt;Remoting performance example - significant performance with remoting vs http/web services - james ward google &amp;quot;Blaze Bench&amp;quot; ???&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;ILOG Elixir Components (charting)
    &lt;ul&gt;
        &lt;li&gt;advanced charting components&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Thermo - Convert Artwork to Functional Components&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 01 Feb 2008 15:54:00 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2008/02/01/My-notes-on-Adobes-Flex-3-presentation-DFlex-UG-kickoff-meeting</guid></item><item><title>Recap of the Dallas stop of the on AIR Bus Tour</title><link>http://daveshuck.instantspot.com/blog/2007/07/19/Recap-of-the-Dallas-stop-of-the-on-AIR-Bus-Tour</link><description>&lt;p&gt;
Last night was the 5th stop in the on AIR Bus tour as the brought their traveling show to Big D. Unfortunately I was unable to attend, so I was glad to see this &lt;a href=&quot;http://cjordan.us/index.cfm/2007/7/19/Adobe-on-AIR-Bus-Tour-Summer-2007&quot;&gt;complete and detailed recap&lt;/a&gt;  by &lt;a href=&quot;http://dfwcfug.instantspot.com&quot;&gt;DFWCFUG&lt;/a&gt;  member &lt;a href=&quot;http://cjordan.us&quot;&gt;Chris Jordan&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Thanks Chris!&amp;nbsp;
&lt;/p&gt;
</description><pubDate>Thu, 19 Jul 2007 11:56:37 GMT</pubDate><guid>http://daveshuck.instantspot.com/blog/2007/07/19/Recap-of-the-Dallas-stop-of-the-on-AIR-Bus-Tour</guid></item><item><title>Adobe OnAir Bus Tour</title><link>http://grumpee.instantspot.com/blog/2007/07/18/Adobe-OnAir-Bus-Tour</link><description>&lt;p&gt;
If you have a spare 4 hours tonight (ya right) you should definitely come down and check out the AIR bus tour.
&lt;/p&gt;
&lt;p&gt;
http://onair.adobe.com/schedule/cities/dallas.php
&lt;/p&gt;
&lt;p&gt;
Ted Patrick along with Mike Downey and Mike Chambers will be on hand to show you what you can do with Flex and HTML based AIR applicaitons.
&lt;/p&gt;
&lt;p&gt;
BTW - free Red Bull, food, Adobe Software (including Flex Builder) and Master Collections. &lt;br /&gt;
&lt;/p&gt;
</description><pubDate>Wed, 18 Jul 2007 16:03:51 GMT</pubDate><guid>http://grumpee.instantspot.com/blog/2007/07/18/Adobe-OnAir-Bus-Tour</guid></item></channel></rss>