I’ve created a separate blog for ChessJam-specific news. I will continue to blog about ChessJam here on Greg’s Ramblings but only when it’s relevant to the Adobe developer community. For example, I’m working on a new post that goes into some details on how the app was built with Flex, AIR, ColdFusion and LiveCycle Data Services that will be posted here but posts about ChessJam’s new features, etc. will now go on the ChessJam blog at http://chessjam.blogspot.com.
Not all chess players want to hear about Flex and ColdFusion and not all developers want to hear about an online chess game, so this seems to make sense.
A few days ago, I blogged about the roll-out of ChessJam, an online chess app built on Flex/AIR, ColdFusion and LiveCycle Data Services. The roll-out has gone well but we have quickly learned that our real challenge is creating a new chess playing community! From analyzing our logs, here is the typical experience over the past few days:
User installs the app, creates a profile
User clicks around looking for someone to play with but finds nobody so they don’t even get the gaming experience
User leaves the app after spending an average of 90 seconds
Five minutes later, another user logs in and repeats the cycle!
We discussed a few options:
Hiring middle-school kids to staff the room for $1/hr
Me take a sabbatical now and play chess 24/7
Employ some robots!
We went with option #3. If you were one of the users that went through the 90 second experience described above, come back and play a bot. Hopefully you’ll also see a few humans hanging out to play.
If your trial has run out, email us at chessjam -at- gmail -dot- com and we’ll get you going again.
To learn more about ChessJam, read my previous post.
Most updates to software applications are optional for the user. The typical flow is that the user is notified that an update is available and then given the choice to update now or later. However, there are situations that warrant forcing the update. For example, if you have made changes to server-side APIs that make existing client-side apps unusable, you obviously need all client apps to update themselves. I recently ran into this situation with my online chess application. I started reading through the AIR documentation to determine how to make some updates mandatory and others optional. AIR provides an extensive set of APIs to control each step of the update process from comparing versions to downloading the update to managing the install but this was too much work for a lazy developer like me.
I typically use the ApplicationUpdaterUI version of the update framework because it’s easy to implement and the built-in dialogs that walk the user through the update are perfect. To force an update with the ApplicationUpdatedUI, you simply disable two dialogs using the following code:
appUpdater.isDownloadUpdateVisible = false; // Disables (skips) this dialog:
appUpdater.isInstallUpdateVisible = false; // Disables (skips) this dialog:
With both of these dialogs disabled, the update immediately downloads and installs. A dialog showing download and install progress is still displayed but you can turn these off too (I wouldn’t recommend turning this off).
My approach
I wrote some code that loads my server-side update.xml file (prior to initializing the application updater) and looks for a new tag I created called “FORCE”. Once the file is loaded, I initialize the updater and toggle the dialog accordingly. Now I can control whether an update is forced by simply updating my update.xml.
The sample code below builds on my original blog post.
Server-side xml file with <force>yes</force> added (update2.xml):
<?xml version="1.0" encoding="utf-8"?>
<update xmlns="http://ns.adobe.com/air/framework/update/description/1.0">
<version>v2</version>
<force>yes</force>
<url>http://tourdeflex.adobe.com/blogfiles/AIRAutoUpdateSample/server/AIRAutoUpdateSample-v2.air</url>
<description><![CDATA[
v2
* These notes are displayed to the user in the update dialog
* Typically, this is used to summarize what's new in the release
]]>
</description>
</update>
The modified source with code added to look for the FORCE tag.
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="200" height="70" creationComplete="preCheckForUpdate()">
<mx:Script>
<![CDATA[
import flash.events.ErrorEvent;
import air.update.ApplicationUpdaterUI;
import air.update.events.UpdateEvent;
import mx.controls.Alert;
private var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI();
private var updateXMLURL:String = "http://tourdeflex.adobe.com/blogfiles/AIRAutoUpdateSample/server/update2.xml";
// Pre-read the server-side XML file to look for <force>yes</force>
private function preCheckForUpdate():void{
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, checkForUpdate);
loader.load(new URLRequest(updateXMLURL));
}
private function checkForUpdate(event:Event):void {
setApplicationVersion(); // Find the current version so we can show it below
var myXML:XML = new XML(event.target.data);
namespace items = "http://ns.adobe.com/air/framework/update/description/1.0";
use namespace items;
var forceUpdate:String = myXML.force;
appUpdater.updateURL = updateXMLURL; // Server-side XML file describing update
appUpdater.isCheckForUpdateVisible = false; // We won't ask permission to check for an update
// If <force>yes</force> was found above, turn off the download and install dialogs
if(forceUpdate.toLowerCase() == "yes") {
appUpdater.isDownloadUpdateVisible = false;
appUpdater.isInstallUpdateVisible = false;
}
appUpdater.addEventListener(UpdateEvent.INITIALIZED, onUpdate); // Once initialized, run onUpdate
appUpdater.addEventListener(ErrorEvent.ERROR, onError); // If something goes wrong, run onError
appUpdater.initialize(); // Initialize the update framework
}
private function onError(event:ErrorEvent):void {
Alert.show(event.toString());
}
private function onUpdate(event:UpdateEvent):void {
appUpdater.checkNow(); // Go check for an update now
}
// Find the current version for our Label below
private function setApplicationVersion():void {
var appXML:XML = NativeApplication.nativeApplication.applicationDescriptor;
var ns:Namespace = appXML.namespace();
ver.text = "Current version is " + appXML.ns::version;
}
]]>
</mx:Script>
<mx:VBox backgroundColor="blue" x="0" y="0" width="100%" height="100%">
<mx:Label color="white" id="ver" />
</mx:VBox>
</mx:WindowedApplication>
</code>
Keep in mind that forcing an update is borderline intrusive and should be done judiciously.
If you know of a better way to do this, please comment.
For the past eight months, I’ve been working with two friends, Todd Williams and Sean Carey, on a little side project called ChessJam. This project started in February, 2009 when Sean and I decided to play a game of online chess with each other to finally resolve who was the better player. We explored several online chess sites and to our surprise, we found all of them disappointing. This led to a discussion about what we could potentially build ourselves. We knew that UI design would be key, so we rounded out our team with Todd, artist, UI designer and ninja Flex developer. All three of us have demanding day jobs so the journey has been a bit slow, but we are finally ready to show the world what we’ve built.
ChessJam is a desktop application that you can use to play live chess with other people via the Internet. You will quickly notice that ChessJam is a bit different than the other online chess sites. Our goal from day one was to create a user interface that is both functional and fun.
Features
Rich graphics and sound
Simple interface – pick a tower, pick a room, sit at a table and play on a 3D or 2D board
Multiple game parameters available (60 minutes, 30 minutes, 10 minutes and speed chess. More coming soon)
Full disconnect/reconnect capabilities
Tracking of wins, losses and draws
Player to player chat
Watch any game in progress
Much more coming soon!
The Technology
The front end of ChessJam was built with Flex and deployed as an AIR application so it will run on Windows, Mac OS X and Linux. The back end is ColdFusion and LiveCycle Data Services. I am already working on a new blog post titled, “The making of ChessJam“ where I will share why we chose this particular combination of technologies and the challenges we faced. You might be surprised so stay tuned!
How We Monetize ChessJam
We knew from the start that we would need to charge something for ChessJam to offset the operating cost, but that’s only half the reason. If you have tried any of the free online chess sites, you know that they are filled with many people that really aren’t there to play chess. From my personal experience, I was only able to play a decent game about one out of four attempts! Many users leave in-progress games without warning (especially when they start losing!). Other users tried to get me to click a link to see their webcam and other garbage. It was not the fun atmosphere that I had hoped for! By charging a small fee, we hope to eliminate a lot of this noise.
The ChessJam application is free for 14 days. After the 14 day trial, there is a one-time $15 charge for the application. There are no recurring fees. Basically, you pay $15 and you can play chess using ChessJam forever.
We realize that it’s very important to grow a good community of users, so to encourage people to use ChessJam during these early days, we are going to give away a free copy of ChessJam to the 20 people that play the most games between now and October 31, 2009.
Dates and times are subject to change based on my work/travel schedule. In other words, be flexible and work with me.
If you are interested in challenging me to a game of chess, email chessjam@gmail.com with one or two preferred dates. I’ll update this blog post as the timeslots are assigned.
If you beat me, you get a free copy of the app. If I beat you, you have to pay triple for it and blog about how great it is! (just kidding )
Video demo (view in HD on Youtube for best viewing)
My next blog post on ChessJam will provide a tour of the stack, and I think you will find that this is an excellent use case for Flex, AIR, ColdFusion and LCDS.
In August, 2008, I blogged “Adding auto update features to your AIR application in 3 easy steps“. It gets many views every day so I spent a little time today updating it to be AIR 1.5 compatible and to include a few common mistakes that developers make when implementing auto-update.
I’ll do a new blog post in a couple of days on how to dynamically control whether an update is forced or optional.
At speaking events, I am often asked about Flex Certification. As the demand for Flex developers increases, many employers are looking to certification programs as a means of pre-qualifying applicants. I’m not a big fan of using a single test to pass or fail potential employees because some of us are just not good test takers but, in many situations certification is a good indicator that can be considered along with experience, sample projects, etc., so I absolutely see the value.
Basically, you take a test with 50 questions. If you answer 34 or more correct, you’re certified. Sounds easy, right? Well, the questions are tough!
Here’s the breakdown of topics from the Exam Guide:
This is where Attest comes in. Attest is a desktop application (build on Adobe AIR of course!) that provides mock/practice exams for the Flex certification test. You can simulate the test to gauge how you’ll do, and if things don’t go well, you can put it in “learning mode” and access tons of resources to help sharpen your skills.
Attest Pro is available in the Adobe AIR Marketplace for $20. There is a 3-day free trial available.
You may have noticed that this year’s Adobe MAX has a lot of noise about LiveCycle ES and you may be wondering what it’s all about. If you would like to see a good overview of LiveCycle along with some great demos, I recommend you grab one of the remaining seats in Marcel Boucher’s session titled, “What’s Next in LiveCycle ES?“. The session focuses on the new LiveCycle features but it’s actually a great introduction to the platform if you’ve never checked it out.
LiveCycle ES is taking a larger role this year at Adobe MAX than in previous years. There are sessions, labs, pre-conference labs (sold out!) and tons of information about LiveCycle.
In addition to all of Adobe’s activity, I wanted to make you aware of something new from one of our partners, Avoka Technologies called SmartForm Composer that will be on display at MAX at booth #434. I’ve seen a few demos of this new product and found it to be quite impressive! SmartForm Composer is a web-based Flex application that makes it easy to build PDF forms. With Composer, you simply select one of our pre-defined templates, and quickly build an interactive Adobe XFA compliant PDF SmartForm that looks great and work with LiveCycle ES.
Avoka has put together a great video demo.. check it out!
If you are attending Adobe MAX, I’d like to invite you to come to what I think will be a fun BYOL (bring your own laptop) lab that I am co-presenting with Holly Schinsky.
I’ve always been fascinated with data visualization, especially data that needs analysis as it is generated. For example, financial transaction data can contain immediately useful trending information that is invisible without some visualization. Credit card transaction data can contain data indicating fraudulent use. I once worked on a project where we analyzed cellular call data in real-time looking for indications that a phone had been cloned (old-school cellular phones could easily be “cloned” before things went digital).
I thought that this type of data visualization would make for an interesting lab at MAX and invited Holly (Flex and Data Services guru) to help me put it together. Holly and I have been working hard to make sure that this is both an informative and fun 90 minute session.
Here’s the description from the MAX site: Discover how the real-time messaging capabilities of BlazeDS and LiveCycle Data Services ES can be combined with the data visualization capabilities of Flex to result in some very interesting applications. In this lab, you will learn how to produce and consume a real-time data feed and how to pass that data to various data visualization components to create an interactive dashboard.
We’ll explore the basics of publish/subscribe messaging with BlazeDS and LiveCycle Data Services as it applies to real-time data feeds and learn how to take that feed and turn it into something very visual and compelling. We will first employ some of the Flex charting capabilities and then look at how to plot data on interactive maps.
The session times are Monday, Oct 5th at 2:30pm and Wednesday, Oct 7th at 1:30pm. Both sessions are filling quickly. The Oct 7th session is already 70% full – maybe I need to show you with a bar chart?
We just rolled out the first 22 samples in Tour de Flex for Flex 4. Holly Schinsky wrote a blog post describing this initial wave of samples. We plan to roll out more every few days over the next several weeks. Once Flex 4 ships, we will merge the samples into the main Tour de Flex tree.
The samples are best viewed using the desktop version of Tour de Flex.
Are you interested in contributing Flex 4 samples? If so, contact me!
If you live near Atlanta and have any interest in Adobe Flash, Flex, AIR, etc., you should go to http://flashcampatlanta.eventbrite.com and grab one of the remaining tickets for tomorrow’s event. I just confirmed that they have less than 10 tickets left!
I’ll be doing the keynote and showing some new stuff, including our upcoming Composite RIA Framework. If you are involved in building enterprise Flex applications, I think you’ll find this very interesting.
If you are near San Jose, CA and are curious about the Adobe Flash Platform and/or Adobe LiveCycle, please join me Wednesday, August 19th at Adobe Corporate Headquarters for a 5 hour demo-filled, action-packed free event. It’s a great opportunity to get introduced to what Adobe has going on in both client-side and server-side technologies. Topics include:
Flash Player, including cool new features of Flash Player 10
Developing applications for the Flash Platform using Adobe Flex
Exploring the types of applications possible with Flex, including data visualization examples, real-time data push apps and more
Deploying applications on the web and on the desktop with Adobe AIR
Ok, here’s what marketing told me to say: Learn how top companies are improving their business bottom line by lowering operational costs, increasing productivity and driving revenue growth using the Adobe Flash® Platform and Adobe LiveCycle®. Join us in San Jose for this complimentary event.
I’m presenting at CFUnited (August 12th-15th) on a topic I think many will find interesting – “ColdFusion 9 & LiveCycle ES: SOA Development“. I’m hoping to spark some interest in how ColdFusion and LiveCycle ES (LCES) can be combined to do some really unique and amazing things. I had the idea for this session the day I learned about the new “ColdFusion as a Service (CFaaS)” feature in ColdFusion 9, which exposes capabilities of cfchart, cfdocument, cfimage, cfmail, cfpop, and cfpdf as web services and Flash remoting endpoints.
+
LiveCycle ES not only provides 100+ out-of-the-box services, it also provides the ability to combine or orchestrate these services using LiveCycle process management (workflow) capabilities. These newly created processes become new services. The LCES invocation layer exposes all of these services to the outside world through various endpoints including SOAP, Flash Remoting, EJB, watched folders, email, and in the upcoming new version of LCES, REST!
So, you have ColdFusion services and LiveCycle ES services; each set of services offers its own unique capabilities, and all of them are callable using common means. What can you do when you combine them?
When does LiveCycle ES need ColdFusion?
LiveCycle ES offers a ton of out-of-the box features, but it doesn’t include many capabilities that ColdFusion provides such as Microsoft Exchange integration, image manipulation, dynamic chart creation, and numerous other CF-abilities. If what you need is not provided by the new CfaaS in CF9, you can easily create your own services by writing custom ColdFusion components (CFCs), and as you would expect, these CFCs can also be exposed as web services or Flash Remoting endpoints.
When does ColdFusion need LiveCycle ES?
CF includes neither the workflow/process management capabilities nor most of the extensive document-related services included in LCES. CF does provide some PDF creation capabilities and in CF9, you can now add headers and footers, optimize images, and more. But when when you look at the PDF capabilities of LCES, you’ll find a long list that includes rights management, digital signatures, 2D barcodes, and much more. LiveCycle also brings human workflow features to the table for things like approval processes and collaboration, which many CF developers will likely find useful in a variety of applications.
I’m still working out the details of my session, but here’s a rough agenda:
Introduction to ColdFusion as a Service (CFaaS)
Introduction to LiveCycle ES
Calling ColdFusion services from LiveCycle ES (including calling a simple CFC)
Calling LiveCycle ES services from ColdFusion
Exploring various use-cases where this madness actually makes a lot of sense
Brainstorming what a new custom ColdFusion component in LCES could/should look like
This is all subject to change based on how successful my demo preparation goes, but so far, it’s looking good, and I think it will be a fun session. If you have never looked at LiveCycle ES, this is a great way to get started.
During the past several weeks, I’ve been cramming on ColdFusion 9. Like many of you, I rely on blog posts from key CF’ers, Adobe TV and other key resources. During this journey, I kept notes of where I found useful information. I thought that others might find these notes useful.
There are other good resource lists out there, but I thought it couldn’t hurt to post my own. Let me know if you find this useful. I plan to do one for Flex 4, LCDS 3, Catalyst and other products soon.
THANK YOU to all of the fantastic ColdFusion bloggers out there that help the rest of us get our heads around this stuff! I’ve been super impressed by the CF community!
If you are near Atlanta and are curious about the Adobe Flash Platform and/or Adobe LiveCycle, please join me next Wednesday, July 29th at the Hotel Palomar in Atlanta, Georgia for a 5 hour demo-filled, action-packed free event. It’s a great opportunity to get introduced to what Adobe has going on in both client-side and server-side technologies. Topics include:
Flash Player, including cool new features of Flash Player 10
Developing applications for the Flash Platform using Adobe Flex
Exploring the types of applications possible with Flex, including data visualization examples, real-time data push apps and more
Deploying applications on the web and on the desktop with Adobe AIR
Ok, here’s what marketing told me to say: Learn how top companies are improving their business bottom line by lowering operational costs, increasing productivity and driving revenue growth using the Adobe Flash® Platform and Adobe LiveCycle®. Join us in Atlanta on July 29th for this complimentary event.
Kevin Hoyt is doing a similar event in New York, NY on July 30th.
I’m also doing the same event in San Jose, CA on August 19th. The registration link above has all of the events.
The solution accelerator team today announced the release of 3 new solution accelerators for LiveCycle Enterprise Suite. The solution accelerators are designed to be extended and customized by partners leading to reduced development time and increased quality. The accelerators are packaged with a set of production-ready building blocks that consist of reusable components and technical guides. The building blocks may be used within the context of a solution accelerator or form the basis for developing new solutions.
Financial Services: Account Enrollment
Improve account enrollment while driving consistency and efficiency across channels and products. With Adobe LiveCycle ES and the Account Enrollment solution accelerator, you can minimize repeated data entry, streamline account processing and setup, and deliver tailored information to customers with ease.
Ensure customer communications are consistent, tailored, and cost efficient by managing all of your correspondence on a single platform. With Adobe LiveCycle ES and the Correspondence Management Solution accelerator, you can automate all kinds of correspondence — from welcome packages and confirmations to proposals and claim letters — while ensuring communications are accurate, compliant, and secure.
Adobe solutions can help HR teams simplify and streamline forms-based processes, as well as reduce costs by providing self service options to employees. Adobe solutions can support secure HR processes throughout an enterprise, engaging employees and applicants whether online or offline, and integrating the employee or applicant data within your existing infrastructure. The Human Capital Applications solution accelerator facilitates new employee onboarding and offboarding. With Adobe LiveCycle ES and the Human Capital Applications Accelerator, you can streamline data collection, secure employee data, dynamically generate welcome and exit packages, and reduce compliance risks and loss of intellectual and physical property.
Supporting these new solution accelerators are additional technology building blocks (Selection and Capture, Content Creation, Correspondence Generation) and updates to the existing On-Demand Assembly building block.
I created tBlurb.com (original blog post) primarily as a means of sharing code snippets and other web content. The concept is simple; you go to http://tblurb.com, enter your content, click Save Page, and get a URL that you can share. The page remains online forever unless it gets zero traffic for 90 days. This concept of “disposable web pages” is something I’ve needed on multiple occasions when responding to blog comments, questions on twitter, etc. After using tBlurb for a few weeks, I realize that not having the ability to edit the content after clicking “Save” is a problem! There were several occasions where I created a page and later needed to modify it.
tBlurb.com now provides a private URL that takes you back to the content editor. I also create another URL that provides traffic data for your content. No personal information is collected…not even your email address. I simply assign a random key for the edit and reporting URLs.
So, you create your content:
When you save your content, you get 3 URLs:
Sample traffic report:
When I get time, I’ll improve the reporting and add some geo information (countries visiting, etc.).
I’ve recently been using tBlurb to share small Flex code snippets on Twitter. Below are a few recent that have received decent traffic:
Mark Szulc just posted a great summary of the new features in the next LiveCycle Designer, part of the next LiveCycle ES that just went beta yesterday. Check out Mark’s post here.
Today, Marcel Boucher announced the first ever LiveCycle developer contest. There are some great prizes so it’s worth taking a peek. I look forward to seeing the entries! Check it out here.
Below is a brief summary of what’s new in the upcoming release of LiveCycle ES:
Improved development and authoring tools, including many features to make team development possible and process design more intuitive.
Improved UI development capabilities
Improved LiveCycle ES administration including new monitoring capabilities and easier backup and restore functionality
Improved support for document assembly of XDP-based documents including a new interface to generate DDX commands
Improved administration and platform maturity with improved backup and recovery support
Expanded platform, database, and JVM support including a new turnkey installer
Improved out of the box solutions for reviewing and commenting of processes
The list above only scratches the surface of what’s new. You’ll find other enhancements across many of the individual services that make up LiveCycle. We’re also saving some big surprises for later this year so STAY TUNED!
I am a member of a group in Adobe Systems, Inc. that evangelizes the use of
AIR,
FlexColdFusion
and
LiveCycle ES
to build world-class enterprise applications. The combination of these incredible technologies is having a dramatic impact on how applications are developed and revolutionizing how people engage with them.
The postings on this site are my own and don’t necessarily represent Adobe’s positions, views, strategies or opinions.
My personal passions are flying and photography so you will see a lot of articles on these subjects as well (hence the name of my blog!).
I also have a little weekend business that combines these passions - http://www.tigeraerial.com.