SlideSix Now Supports Embedding Videos from YouTube and Vimeo

slidesixCrunchGear has a good writeup about the new features in SlideSix, which include the ability to add video from Vimeo and YouTube. Todd Sharp has been busy at work and I’m glad to see SlideSix getting more and more attention (as well as features). It’s all built with Adobe technologies from ColdFusion on the back to Flex on the front. I think a few of us on the evangelism team are planning to start using it to share our presentations with the community, so we’re going to be bugging Todd for more features.

Upcoming Adobe Days in Chicago and Washington DC

Next week I’m embarking on a couple of city tour to participate in Adobe Days in Chicago and Washington DC. At the Chicago event I’ll be presenting ColdFusion and Flex with Kevin Hoyt. We’ll be covering the Flash Platform and talking about how ColdFusion and Flex go great together. In Washington DC I’ll be doing the same set of sessions and Terry Ryan, our newest evangelist is going to be helping out. Greg Wilson will also be doing a track on LiveCycle ES.

Both of the events are absolutely free and make for a great introduction, refresher, or looking glass into Flex and ColdFusion. Come take the day and hang out (lunch is included).

Register here for Adobe Day Chicago and here for Adobe Day Washington DC. Hope to see you there!

Obama’s Inauguration: Brought to you With ColdFusion and Flash

Nice. There is a very good roundup by Andrew Nusca on where to watch the Obama Inauguration next week online. I blogged about this earlier, but what I thought was interesting is that Andrew mentions the site for the folks that are “in charge of all the inaugural activities at the capitol” – the Joint Congressional Committee on Inaugural Ceremonies – and they have a .gov address, so they mean business. They’re offering closed captioning of the entire thing. How are they delivering it? Flash. And what’s that extension on their site? That’s right, it’s ColdFusion!

Using LiveCycle Data Services 2.6 Inside of ColdFusion 8

By default, ColdFusion 8 comes with LCDS 2.5. But there’s a lot of new, good stuff in LCDS 2.6 that might be good to take advantage of if you’re doing data services work in ColdFusion. There are some instructions on Labs, but I just tried them tonight, and I think they’re terrible. Luckily, Joshua Rodgers has a great step-by-step walkthrough for getting LCDS 2.6 up and running inside your ColdFusion 8 server.

I just wanted to make sure people saw Joshua’s instructions and didn’t waste time like I did decoding the official version.

Notes from the Evangelist Offsite

Update: Wow, this ended up being really long.

All of the evangelists at Adobe had an offsite today in New York and it was one of the coolest days I’ve had at Adobe. Obviously I can’t get into a bunch of what we talked about but the team had really great in depth meetings with a bunch of products that are semi-public and that you should already know about. We had meetings with the Thermo team, the Pacifica team, the CoCoMo team, and some inter-evangelist presentations on ColdFusion and LiveCycle.

For me as an evangelist and Adobe employee it was great because we got completely free access to ask questions of all these teams and got a full picture across many business units of how all of our technologies are coming together. For you as developers and designers I think there are a bunch of interesting things on the horizon.

Adobe does so many damn things that sometimes it’s hard to keep track of what’s going on. The fact that we picked those three teams to talk to should tell you something. They’re all on the cutting edge of Adobe’s plans and should enable you guys to take RIAs to the next level.

Thermo
I’ll start with Thermo. You’ve heard a bunch about Thermo, so I won’t try to rehash all of that here. We’re building a tool that we think is going to appeal to a wide range of designers – even those not building Flex applications today. Thermo is also a way to help get the Flex Framework out to more people. Flex makes it easy to do some very powerful things with RIAs. Thermo will let designers bring a new level of expressiveness to the framework so that you’ll be able to create very visually appealing applications but with a lot of “under the hood” functionality. Being able to essentially customize Flex applications at the level of our Creative Suite tools is going to let you combine a great rich data story with a great user experience and bring all parts of Adobe’s platform together. Think of all the stuff Flex does well on the developer side, then think about being able to let designers in that process. Thermo is going to be a big tool for the platform.

Pacifica
The second meeting was with Pacifca. High quality voice inside the player is a big deal by itself. And our goal is to let developers bring that into their applications very easily. We want voice to be as much a part of the experience as text is today. A lot of RIAs could benefit from easy, high quality voice. It won’t be a fit for every application but if you can call voice APIs just as easily as you can call Math APIs then you can start to expand your own RIAs quite a bit. Not to mention the ability to call outside phone lines right from Flash. Merging the telephony and technology worlds is something that’s been popular for a long time but making that accessible to web developers hasn’t really been done before. I wasn’t trying to slight Ribbit here. They’re showing how cool this can be when you enable telephony and web developers. I was thinking more about point-to-point voice but that wasn’t clear. Sorry guys, Ribbit rules.

CoCoMo
Our CoCoMo meeting was also great. Connect is a really solid product. Half of my “sales” as an evangelist have been just showing off collaboration inside a Connect meeting using the Flash Player. By taking that and turning it into components that developers can use we’re going to help make real time collaboration a part of RIAs anywhere that it fits. You can just as easily add video chat or whiteboard functionality as you can create a new Panel in Flex. Think about the combination of Flex, Thermo, Pacifica, and CoCoMo inside of your applications and you’ll be able to create a real-time, collaborative experience that goes beyond text and video to be not only good looking, but more personal with voice and teamwork.

ColdFusion and LiveCycle
We also had Adam and Greg present ColdFusion and LiveCycle respectively. ColdFusion is in for some great things. Coté and I have talked a bit about an RIA middleware in our RIA Weekly podcasts and ColdFusion is making huge strides in that direction. One of the best quotes of the day was from Adam in describing ColdFusion as “instant SOA”. ColdFusion combines so many different aspects of technology and brings it together in a way that’s accessible anywhere. You can expose an SMS gateway as a REST service, use Flash Remoting to talk to XMPP or any other combination you can think of. LiveCycle takes that to the next level in a lot of ways. I always thought of LiveCycle as primarily a Document server (and that’s a big part) but it actually automates the workflow for basically anything you want to do. You can set up a process to receive an email and then based on the content do something with a PDF, send a Twitter message, or fire off an FTP command. It lets you work with a bunch of different services together in one workflow and create processes around it. It’s kind of cool to think about being able to take data and then turn it into a protected PDF, a Twitter message, or send it to a Flex application in one big sweep.

Most of this is already here and what isn’t here is coming pretty soon. The power of AIR, the Flash Player, and the Flex Framework enables a lot of very powerful data stories as well as a great user experience. Bringing our design tools, services, and developer technologies together means that all of this will be accessible to you to use in your own applications. Being able to take an application and add interactivity not just at the UI layer but at the data level is a huge leap. Our goal is to make that really easy for you so that you can quickly plug these things into what you’re doing today. Lowering the barrier to entry is half the battle and I think we’ve done that. Over the next few months I am excited to hear what you think and see what you build.

Real Time Communication with Flex and AIR using ColdFusion and LiveCycle Data Services

In this walkthrough I’m going to take you through using ColdFusion (which contains LiveCycle Data Services) to create real time communication between an application in the browser and one on the desktop built with Adobe AIR. Both applications are written in Flex. You’ll see how we can create a better user experience on the desktop by using things like drag-and-drop and still tie that into a real time scenario inside of the browser.

The first thing you need to do is get ColdFusion 8 or LiveCycle Data Services (LCDS). For this tutorial I’m using RTMP which BlazeDS doesn’t support. I’ll have a BlazeDS example out later this week hopefully. ColdFusion has a LiveCycle Data Services install on top of it, so that’s what I’m going to use. You can grab all of the code from my SVN repository under the GPXShare project. You’ll also need my AS3 GPX library. I’ve got a sample GPX file you can use as well.

The second thing to be aware of is there are two general categories of communication in LiveCycle DS: the real time communication using RTMP and data management. Data Management lets you do things like synchronize data between online and offline sources while real time communication allows you to push data to clients instead of having to force clients to check in with a server. Data management is included in LiveCycle DS but not Blaze DS and BlazeDS doesn’t support the RTMP protocol but does have support for AMF for psuedo-real time communication. For this I’m just talking about real time messaging over RTMP. Damon Cooper has a good blog post about the differences between RTMP and AMF and how they apply to BlazeDS and LiveCycle DS.

The code is really, really simple. In my example, called GPXShare, I have two applications, one is a Flex-based application running in the browser and the other is a Flex-based AIR application on the desktop. You’ll see that I’m reusing a lot of code, one of the great things about using Flex is that you can quickly and easily move between the browser and the desktop. What I’m going to do is take an XML file with a bunch of GPS waypoints, drag it on to my AIR application, which will then send out that data to the browser application. You can have any number of browser applications open – each one “subscribes” to messages coming from the AIR application so they get the data in real time. The second part adds a tiny bit of collaboration. I want to be able to select a specific waypoint in either the AIR version or the Flex browser version and have that selection be highlighted on all the clients. All of that is really easy to do with LiveCycle Data Services.

Let’s first take a look at the AIR application. In my AIR app I have two pieces of code which establish a Producer and Consumer:

<mx:Producer id="producer" destination="GpxShare" />
<mx:Consumer id="consumer" destination="GpxShare"
			    message="doMessage( event );" />

. The Producer lets me send code out and the Consumer is what watches for changes. Each of those point to a destination which tells all of the connected clients how to pass the information back and forth. There are a couple of things we need to configure on the server now that we’ve seen the consumer and the producer.

  • The Destination – The first thing is to set the destination. We’re looking for a file called messaging-config.xml in the /WEB-INF/flex/ directory. In ColdFusion it’s located in your wwwroot directory. Add the following code in between the <adapters> node:
    <destination id="GpxShare">
    	<adapter ref="actionscript" />
    	<channels>
    		<channel ref="cf-rtmp" />
    	</channels>
    </destination>
    
  • The Channel – Now that we’ve set the destination, he second thing we need is to make sure that “cf-rtmp” channel exists. The channel tells the connected clients which protocol they’re all using to get to each other and where to send the information. Here we’re looking for a file called services-config.xml which will be in the same place as the destination config file. Once you find it, the channel definition should already be there you just need to uncomment it and tweak it. It should look like this:
    <channel-definition id="cf-rtmp"
    	class="mx.messaging.channels.RTMPChannel">
    <endpoint uri="rtmp://localhost:2048"
    	class="flex.messaging.endpoints.RTMPEndpoint"/>
    <properties>
             <idle-timeout-minutes>20</idle-timeout-minutes>
                  <serialization>
                      <instantiate-types>false</instantiate-types>
                  </serialization>
              </properties>
    </channel-definition>
    

So we’ve got our configuration files set up (you’ll have to rebuild your Flex project if you’re following along at home to make sure they get the new configuration settings). With that Producer/Consumer tag set up in our AIR application we’re ready to send out some data. Using the AIR API’s I’ve enabled drag and drop events from the file system so that when I drag in a GPX file, it will parse the data and display it in the grid. Once that happens we use the Producer to send the data out to all of our consumers with a doSend() function:

// Send our changes out to the consumers
public function doSend( array : Array ):void
{
	// Create the message and set the message body to our data
	var mess:AsyncMessage = new AsyncMessage();
	       mess.body.waypoints = array;
	       producer.send( mess );
}

The doSend() function is called after we finish opening the file from the file system and we just pass in the array of Waypoints. We create a new asynchronous message for storing our data and then set the body of that message to our data. In this case I’m sending an array with the name of waypoints. Finally we call the send() method on our Producer to fire it off. Now lets take a look at what happens inside of our browser application.

If you take a look at the code, you can see that we get to reuse a lot. Same data grid code and the same Producer/Consumer code. In this case, the browser is acting as a Consumer and you can see we’ve set the message attribute: message="doMessage( event );". This sets all of the consumers to watch for new messages and when they come in to call that doMessage function. So when we get message from our Consumer (the AIR application) with new GPS data, we call doMessage() in the browser:

// This is what happens when we get a message from the producer
public function doMessage( event:MessageEvent ):void
{
	// Logic checks to see which kind of message we're getting
	if( event.message.body.waypoints != null )
	{
	   dg.dataProvider = event.message.body.waypoints as Array;
	}
	dg.selectedIndex = event.message.body.selectedIndex;
}

Pretty straight forward. We’re passing in a MessageEvent and that MessageEvent contains the waypoint array we passed in from the AIR application. The only semi-tricky thing is that because this application also sends the selected row information back and forth, I do a check to make sure we actually have waypoint data and not just a new selected row number.

So that’s it! The only other part to the application is sending the selected row back and forth. For that you can again reuse a lot of the same code between the AIR application and the browser application. In both applications we follow the same steps. Set up a change event to fire on our data grid when we select a new row which calls a doChangeSend() function. Then attach the selectedIndex to the message body and pass it through the AsyncMessage. Now when we receive that message we set the selectedIndex of our data grid:

// When we make a change to the datagrid we
// send a message with this function
public function doChangeSend( event : ListEvent ) : void
{
	// Create the message and set the message body to our data
	var mess:AsyncMessage = new AsyncMessage();
	       mess.body.selectedIndex = dg.selectedIndex;
	       producer.send( mess );
}
// When we get back a change event
// make sure the right index is selected
public function doMessage( event:MessageEvent ):void
{
	dg.selectedIndex = event.message.body.selectedIndex;
}

That’s all there is to it. Remember you can grab the source code for both the browser-based Flex application and the desktop-based Flex application built with Adobe AIR from my SVN repository. If you have any question, leave a comment or send me an email. Damon Cooper also has a great list of resources for BlazeDS and LiveCycle Data Services for more information.

National Geographic’s mapXchange using ColdFusion

When I was doing full time ColdFusion development I always got a kick out of Ben’s “Using CF” posts. It’s left an impact because to this day I find myself checking for that little .cfm extension. Today, I noticed it on the National Geographic mapXchange, a library of files that you can download into the Topo! application series and then export to a GPS unit. It doesn’t look like Ben caught this one yet, so I wanted to blog it. It doesn’t seem like they’re doing anything super-cool, but hey, if they want someone to come meet with them about what Adobe is doing, I’m more than happy to volunteer.

[tags]mapXchange, ColdFusion, National Geographic[/tags]

ColdFusion and OpenID

I was looking for a small but interesting project to build in ColdFusion and was thinking it would be good to have a way for ColdFusion developers to integrate OpenID into their applications (I’ve become a huge fan of OpenID as I use it more). But the guys at IndianKey already beat me to it and have a project called CFOpenID which is open source and gives you everything you need to put an OpenID login into your CF application.

Now I need to find another cool, small, CF project to try.

[tags]ColdFusion, OpenID[/tags]

ColdFusion and AIR and the Adobe Platform

ColdFusion LogoI’m a big fan of ColdFusion. It’s what got me started in development and I’ve always had a soft spot for it. The ColdFusion 8 release was awesome and the features that they packed into it were very impressive. But despite a killer launch I don’t really do much ColdFusion any more. The “sexy” technologies, Flex and AIR are all based on ActionScript so that’s what I’ve been doing. But the ColdFusion community remains very strong and now that I’m inside at Adobe and have seen the revenue numbers for ColdFusion I know it’s not going away anytime soon. But I want to see it grow and Terry Ryan has a thought provoking post about ColdFusion and Adobe AIR which is worth a read.

There are a ton of things going on behind the scenes of ColdFusion. Tags like cfpresentation and cfpdf are indicative of the robustness of ColdFusion. When you think about it in these SOA-crazy times (service oriented architecture) and remind yourself how well it works with Flex, it doesn’t take much imagination to see how much potential ColdFusion has. As both a previous user and now Adobe employee, I’d love to see ColdFusion become more relevant to the technologies that are getting all the buzz. Terry and I talked for a long time and he has some good ideas. I’d love to see the wider ColdFusion blogging community start talking about how CF can work more closely with the Adobe platform.

Adobe listens very closely to it’s community and you guys may not realize it, but the CF team is probably among the best listeners. They’ve also got a crack dev team, so flood them with ideas. Help CF regain some of the luster that technologies like Ruby or PHP have taken. One easy way to start that is brainstorming CF and where it fits in the wider world of rich internet applications. I want to hear your ideas and I think a lot of people at Adobe do to.

[tags]Adobe, AIR, ColdFusion, Adobe Platform[/tags]