Paul Robertson's words, punctuated

Thoughts on development, user-centered design, code, etc. by Paul Robertson

I am 360|Flex (and so can you!)

(With apologies to Stephen Colbert =)

The next 360|Flex conference is coming up quickly – March 7-10, 2010 in San Jose, California. As I’ve been preparing for the conference and reading some of the things other people are saying about it, I’ve been reminiscing about past 360|Flex (and other) conferences I’ve been to, and about how much they’ve impacted me professionally and personally. (Hint: a lot.)

But I’m not here to talk about the past. (Or about what I’m presenting at the conference, since I’ve already mentioned that.) Instead, I’d like to talk to you about this 360|Flex, and why I’m excited to attend and what I’m looking forward to most. These fall into two categories: Sessions I’m looking forward to, and people I’m excited to meet (or see again).

The sessions (in schedule order)

I combed over the whole schedule, and there is literally not a single time slot that I’m not looking forward to. Except the ones where I have to choose from two or three awesome-sounding presentations. Frankly, what I’m not looking forward to about 360|Flex is that I’ll have to choose not to attend some sessions that I’m really anxious to see.

Sunday

Sunday afternoon: Joel Hooks: Hands-on development with the Robotlegs AS3 framework (I’ve mentioned I’ll be helping with this, but I’d definitely attend if I wasn’t)

Monday

Keynote: Is this Deepa’s first keynote, now that she’s a Flex Product Manager and not an engineer anymore? She spoke to my users’ group last week talking about Flex “next” (i.e. after 4). I have no idea what she’ll talk about here, but I’m looking forward to it!

Monday 1: Already there are too many to choose…Michael Labriola (Flex components), Chase Brammer (analytics) or Richard Lord (“Designer Last” architecture)?

Monday 2: Drew McClean and RJ Owen - Rules engine with AS3 and Hamcrest (time to find out what the buzz is about), although if I was doing more video work I’d definitely hit expert David Hassoun’s session (OSMF), or maybe I should broaden my horizons/prepare for the future with Bryce Barrand (How to find and keep top developers)

Monday 3: Again, I can’t decide…Garth Braithwaite on skinning, or Jesse Warden on Robotlegs and Gaia?

Tuesday

Morning panel discussion (“Principles for RIA design”): Don’t discount this because it’s early. Keith is a great facilitator (he’s a co-manager of my local users’ group) and from the things I’ve heard, there will be lots of great ideas shared in this session.

Tuesday 1: Alas, I’m speaking in this slot so I’ll miss Deepa’s Flex 4 talk and Aaron Pedersen and James Polanco’s Flex 4 lifecycle talk. Will anyone notice if I just skip out and go to their sessions instead?

Tuesday 2: Jacob and Tyler Wright (and Ben Stucki, I think!): “Reflex: Rethinking Component Design.” I got to hear about the ideas behind this component/layout framework in conversations at the last 360|Flex conference, and I’ve been dying to try it out since then. Revolutionary stuff will appear here!

Tuesday 3: Yet another tough choice: Elad Elrom on TDD, Randy Troppman and Adrew Westberg on GPS in Flex, or Aaron Hardy on Queue and Cache?

Wednesday

Keynote: always fun and informative – hear the behind-the-scenes of the conference, and win prizes too!

Wednesday 1: Why do they have to make it so hard to choose! Renaun Erickson (“AS tips for iPhone games”), Jeff Tapper (don’t even know but always extremely valuable), or Sim Bateman (“Getting Git”)?

Wednesday 2: I think I may go to the dark side for a bit, and learn more about Silverlight from Jun Heider. But Nate Beck’s “Flexible games” looks mighty tempting too…

Wednesday 3: Eric Fickes with Silverlight, part 2, Shashank Tiwari on multi-touch, or Andy Powell on UX? John and Tom, you’re making this so hard!

Wednesday 4: (at least) two presentations worth sticking around for: Matt Guest on Flex text with TLF, and Huyen Tue Dao on Greenthreading

So yes, I’ve realized I’m going to have to make two clones of myself (at least) in order to attend all the sessions I want to see. And then I’ll have to merge them back together somehow. I’ll get back to you on how that one turns out…

The people

Richard Lord really nailed it when he said that the best part of conferences, especially smaller ones like 360|Flex, is getting to meet and talk with and throw ideas around with other developers. I’ve learned some good things in the sessions at past conferences, but by far my best memories and most valued times are the ones I spent between sessions and evenings/nights kicking around ideas with others.

These are my “conference friends” (and a few “users’ group friends) who I’ve met at conferences and always look forward to hanging out with again. I’m sure you know their names, and like me you may wonder why they’re actually willing to talk and hang out with someone like me =) But I’ve never gotten any attitude from these (or other) “superstars” that I’ve met in person at conferences. That’s reason 1 I love the Flash/Flex community – these people welcome ideas, and are just excited to meet people and share:

And these are the people who I’ve learned from whose work I’ve admired online, who I’m hoping to meet and get to know “in real life”:

And the best part is, there are plenty of others that I will meet, that I don’t know (or even know of) yet, but who will be on my “conference friends” list for the next 360|Flex =)

Thoughts on multi-screen, multi-context app development

Around 8 months ago I was asked to start thinking about the now emerging (particularly from a Flash Platform perspective) world of multi-screen application development. What are issues to consider? What guidance should we offer?

It turns out that my thinking on that topic isn’t going to become anything in the Adobe documentation. So I’ve sort of just been sitting on my ideas with the idea that someday I’ll probably share them.

Which brings me to this post.

Aside: upcoming presentations on multi-screen development

This is really a side note to the main ideas here, but I thought I’d mention it since it’s the reason I actually stopped to write this. In one of my mind-wandering moments this morning, I realized that at the upcoming 360|Flex conference (San Jose, March 7-10) I’ll be involved in two presentations that are directly related to practical aspects of building multi-screen apps:

  • As part of the pre-conference free training, Joel Hooks and I are doing a four-hour training on using the Robotlegs micro-architecture. (Joel is the main speaker, fortunately, because he’s one of the core Robotlegs developers and the main “evangelist.” I’ll be helping out, to try and help save his voice and maybe to help find typos. =)

    If you’re wondering what a Robotlegs session has to do with multi-screen apps…keep reading, it’s explained below.

  • On Tuesday and Wednesday, Renaun Erickson and I are giving (two separate) presentations about building iPhone apps using Flash Platform tools. My session is more of an intro into the workflow, how it’s similar to other app building, and how it’s different. (Plenty of code to look at – don’t worry!) Renaun is going to get more into specifics of building a game, as well as some more intermediate/advanced topics like performance.

Funny that I never really made that connection until this morning. I guess subconsciously I knew this is a direction I want to move in, and that’s why I’ve been focusing my learning (and hence my presenting) on these topics =)

Background

While I was partially trying to keep my thinking abstract, from a practical perspective I centered my thoughts around developing using the Flash Platform. So conceptually, what I was thinking about was the idea of making a single “app” for multiple screens, which would mean that (in the technology of the next year or so) it could be potentially take several forms:

  • a browser/computer app (Flash Player)
  • a browser/mobile app (Flash Player)
  • a desktop app (AIR)
  • a mobile (iPhone) app (Publisher for iPhone, similar to AIR)
  • a mobile app for other devices (AIR)
  • a TV app or widget (Flash for the digital home)

(Obviously many of these are only out in public beta, some have only been vaguely publicly acknowledged, and others may or may not ever exist as actual Adobe products =)

One app, or many?

Back when I started thinking about this, there seemed to be two main camps. One group was a strong advocate for the “single source” idea: you would build one SWF or one AIR app and distribute that same app on any platforms (desktop/mobile/TV). Obviously a key element to that, especially for desktop/mobile apps rather than browser apps, would be having code that detects screen size and device capabilities and adapts the UI to the device.

The second group felt that it was more likely that developers who are creating an app for multiple screens would actually create multiple apps (from the perspective of the IDE). The apps would obviously share some code, visual assets, etc., but would be different enough that they’d be created separately and distributed as separate file types. (In the case of apps created for the iPhone, of necessity this has to be true, at least in terms of the publishing part.)

Since I try to be pragmatic about things unless I have a really good reason, I favored the second viewpoint. However, I acknowledge that in some circumstances the first approach might be used. As always, I think that developers are going to use a mix of approaches.

For example, suppose I’m building an app and I want to create a version for desktop computers, a version for the iPhone, and a version for other mobile devices. Personally I see this not just as an issue of “porting” the app from one platform to another. I think that each device has its strengths, and more importantly, each device is used for different purposes and in different contexts. If I’m building an app for a device, I should definitely be taking that notion of context into account as I’m designing the app. That pretty much rules out the possibility of using the exact same app (UI and everything) for both computers and mobile devices, unless I want it to run as a widget-type app on the desktop.

Also see: Adobe Flash Platform contextual applications developer center

Adaptable code to the rescue

On the other hand, that doesn’t mean that developers will always create completely separate projects. For example, suppose I’m creating an app for iPhone, and another for another mobile device. Or perhaps I’m using the Publisher for iPhone to create an iPhone version of my app and an iPad version. If my app is a game where I can more freely discard the conventions of the platforms, perhaps the only platform difference I need to consider is the difference in screen dimensions and pixel density. In that case, it’s quite possible that I canuse the same source code and have it adapt to the different screen sizes.

Frameworks to the rescue

Even for a more line-of-business or productivity app, one of the key ideas in Slider, the future Flex mobile framework, is to (as much as possible) abstract away platform convention differences. For example, if iPhone usually puts the back button on the top, and another platform puts it on the bottom, and another platform puts it in a menu, and another platform has it assigned to a physical button on the device, then Slider might have a “back” event that you can hook into, and you can make your app perform the necessary “back” tasks regardless of platform.

Design patterns to the rescue

And, of course, in some situations you’ll almost surely need to create different versions of apps for different screens. For example, suppose you’re building a desktop Twitter client and a mobile Twitter client. Chances are good you’ll put some functionality into the desktop version that doesn’t go into the mobile one – such as previewing images, or maybe Facebook integration. On the other hand, adding a feature like automatic location tagging would make lots of sense in the mobile version, but not so much in the desktop one.

As I was thinking, many months ago, about the idea of efficiently creating different versions of the same app for different devices, a thought hit me like a ton of bricks. This is exactly the use case that the oft-mentioned “separation of concerns” is designed for:

Over several years, various “micro architectures” and “application frameworks” have emerged and waxed and waned in popularity. Many of these architectures are modeled around the ”Model-View-Controller” design pattern (or its many variations).

One of the key benefits that these architectures claim is that it helps you keep the pieces of your application separate, without explicit links and dependencies between them. I’ve looked into and even tried out several of these over the years. One example that is frequently used to describe the notion of separation of concerns, which I always struggled with, goes something like this:

Suppose you’re creating an app, and you build the user interface and the other logic like server communication and data processing. If you use MVC/separation of concerns, then it’s really easy to just rip out your whole user interface layer and replace it with a new one.

They usually lost me with that one. As much as I tried, I couldn’t imagine a situation in which I’d want to build my app and then just rip out the UI and replace it with a different one note 1.

Until now.

Suddenly I had discovered, for myself at least, a real-world use case for the separation-of-concerns-so-you-can-swap-out-the-UI argument. If I’m building an app for the desktop and mobile, I’d like to be able to reuse my code where I can. At the same time, some functionality is only going to apply to one app or the other, so it’d be nice to be able to plug it in cleanly. Oh and by the way, the user interfaces are going to be different, so being able to swap those out is an absolute must.

I’d always liked micro-architectures in general, if only because I like knowing that I’m building my app using some pattern or structure that is based on developers’ real-world experience. It’s much nicer than trying to invent it myself and having to deal with all the pain points they’ve already gotten over. Now that I am imagining a world where I create multiple versions of the same app, with similar functionality but different user interfaces, suddenly micro-architecture patterns have become indispensable in my mind.

Conclusion

These are only just a few of my thoughts about the future world of multi-screen, contextual applications. Like Lee Brimelow, I believe that going forward building multi-screen, multi-context apps is going to be a much more common scenario. From my perspective as someone who thinks a lot about user experience design, and trying to optimize tools for the task and context, I think this is one of the most exciting aspects of the current technology revolution. I’ll definitely continue to share my thoughts and ideas in the future (hopefully more practical ones, too, not just abstract ones like this =)

Notes

Note 1: Just to be clear, I’m not trying to sound negative about MVC or micro-architectures/frameworks. Most of them provide many benefits, many of which are also related to the idea of separation of concerns, such as making code easier to test, making code cleaner, reducing boilerplate code, providing structure so that teams or developers who inherit a project can get going more quickly, etc. Swapping out the view layer is just one little benefit they mention. (back)

New project: AIR SQLite utilities

I’m excited to announce that I’m “officially” releasing a new open-source project that I’ve been using on personal and work projects for over a year.

For lack of a better name, I call it my ”AIR SQLite utility library

The code currently contains one major piece of functionality (well, two different variations on one bit of functionality), which is a SQL “query runner” library. This is a wrapper for the AIR SQL classes that allows you to run a SQL statement by just passing a few bits of information:

  • The text of the SQL statement itself
  • An object containing properties with the values for any statement parameters in the SQL
  • A Function to call when the operation completes
  • A failure Function
  • (optionally) a class to use as the data type for the data returned from a SELECT statement

The library does all the work of creating SQLStatement objects and caching prepared queries, as well as pooling SQLConnection instances so you can execute multiple statements simultaneously. It also has a variation that allows you to specify a “batch” of statements to execute, and they are executed in order in a transaction.

I’ve also got an additional utility to add to the library. It’s a “database copy” utility that allows you to create a “deep copy” of a database – all it’s tables, views, etc. – with or without data. The key reason why this is useful is that you can use it to create an encrypted database from an unencrypted database (and vice-versa). It’s written and tested, but I decided to modify the structure slightly before releasing it, so it’s not checked in yet.

I’ve put the details about how it works and why it’s designed that way in the project page. In case you’ve ever wondered how I design apps, I think the examples and this library give some insight into how I actually do my database-driven AIR app development. At least, how I structure the data-access part of my apps.

On (another) personal note, this project is also my first project that I’ve posted to my Github repository (as opposed to projects I’ve forked). It was actually posted-but-not-advertised on Google code for a month or so, but I decided to move to Github because the collaboration and checkin-without-network-connection features are so awesome.

Multi-table INSERT using one SQL statement in AIR SQLite

This article describes a way that you can use a single INSERT statement to add data to multiple tables in the SQL dialect supported by the SQLite engine in Adobe AIR.

Normally in SQL, including in AIR’s built-in SQLite database engine, you can only add data to one table at a time using an INSERT statement. In some cases, particularly when you’re doing a “bulk loading” operation such as importing data from a text file into a database, it’s convenient to be able to insert data into multiple tables using a single INSERT statement.

For example, suppose you have XML data to import into a database such as the following:

<?xml version="1.0"?>
<employees>
    <employee firstName="Bob" lastName="Smith"
        location="San Francisco" country="USA"/>
    <employee firstName="Harold" lastName="Jones"
        location="San Francisco" country="USA"/>
    <employee firstName="Tom" lastName="Donovan"
        location="Boston" country="USA"/>
    <employee firstName="Mike" lastName="Wilson"
        location="Calgary" country="Canada"/>
    <employee firstName="Steve" lastName="Thomas"
        location="London" country="UK"/>
    <employee firstName="Joe" lastName="Nelson"
        location="London" country="UK"/>
    <employee firstName="Juan" lastName="Varga"
        location="Buenos Aires" country="Argentina"/>
    ...
</employees>

The XML data isn’t normalized, so there is duplicate data between the various records. We will import it into a database with the following (normalized) structure:

Data model for the database

Assuming the data is going to be imported as a single user operation, it would be painful to need to prompt the user or throw errors for every duplicate entry.

Using the technique described here, you can use a single SQL statement to add an employee and if necessary any related data including office location and country. (You would still loop over the data and execute one INSERT statement per employee record – but you wouldn’t need to execute three INSERT statements per employee record, or need to check for duplicate office locations and countries for each employee record to be inserted.)

As mentioned above, this technique is probably only appropriate when you’re doing “bulk importing” of data. If you’re just adding a single conceptual record (even if it includes data in multiple tables) you’ll most likely want to use a series of INSERT statements to add the data, so that you can have more precise error checking and handling.

How to do it

In an attempt to “cut to the chase” I’m going to put the necessary code here. For more detailed explanations on how this works and why it’s necessary, see the ”details” section below.

This technique for inserting data into multiple tables using a single SQL statement consists of three elements:

  1. A view in the database that groups the data to be inserted (from all the tables) into one “table”
  2. An INSERT statement to add the data, using the view as the destination “table” in the INSERT statement. This is the INSERT statement that you’ll run from your application while importing the data
  3. A trigger defined on the view, which runs when any INSERT statement is executed against the view. This trigger does the actual work of checking for existing data and inserting data into individual tables.

Here’s the code for each part:

A view grouping the data to insert

This combines all the tables that potentially need data inserted into a single “table” for the INSERT statement. You run this statement once to create the view in the database.

CREATE VIEW employees_for_insert AS
SELECT e.firstName,
    e.lastName,
    l.name AS locationName,
    c.name AS countryName
FROM employees e
    INNER JOIN locations l ON e.locationId = l.locationId
    INNER JOIN countries c ON l.countryId = c.countryId

An INSERT statement that “inserts” the data into the view

This code isn’t actually run, but it passes all the data to the database engine for use in the trigger. You execute this SQL statement once for each record to add to the tables.

INSERT INTO employees_for_insert
(
    firstName,
    lastName,
    locationName,
    countryName
)
VALUES
(
    :firstName,
    :lastName,
    :locationName,
    :countryName
)

An INSTEAD OF trigger defined on the view

This is the code that actually runs when the INSERT statement above is executed. You run this code once to create the trigger. Then the database runs the code in the trigger body automatically. If a location or country doesn’t exist it is inserted. However, if they do exist, nothing happens (no duplicate record is created). Then the main employee record is inserted.

CREATE TRIGGER insert_employees_locations_countries
INSTEAD OF INSERT
ON employees_for_insert
    
BEGIN
    
INSERT INTO countries (name)
SELECT NEW.countryName
WHERE NOT EXISTS
    (SELECT 1 FROM countries
     WHERE name = NEW.countryName);
        
INSERT INTO locations (name, countryId)
SELECT NEW.locationName, countries.countryId
FROM countries
WHERE countries.name = NEW.countryName
AND NOT EXISTS
    (SELECT locationId
     FROM locations
     WHERE name = NEW.locationName);
    
INSERT INTO employees (firstName, lastName, locationId)
SELECT NEW.firstName,
    NEW.lastName,
    locations.locationId
FROM locations
WHERE locations.name = NEW.locationName;
    
END

Details

The SQL language is designed for working with relational databases, so in a SQL database you usually use multiple tables to represent a single piece of data. That means that in a normal scenario, if you want to add a new record to a table, you may need to add a new row of data to additional tables that the main data is related to.

In this example, we are using a database with the following structure:

Data model for the database

This data represents employees in a large company that has multiple office locations, identified by records in the locations table. In fact, this company is an international company that has offices in different countries, including multiple offices in some countries (represented by the countries table.

Each employee is associated with their primary office location by the locationId field in the employees table, and each location is defined as being in a certain country by the countryId column in the locations table.

In order to add a new employee you would generally have to perform several steps:

  1. Check whether the country where the employee’s office is located exists in the countries table
  2. If not, add it; if so, get its id to create the relationship with the locations table
  3. Make sure the office location exists in the locations table
  4. If necessary add the location record, and get its id to use in the employee record
  5. Add the employee record to the employees table

This is a fairly complicated process because a single SQL INSERT statement can only operate on one table at a time. In a simple case where you are adding a single employee record, this complexity isn’t unbearably difficult. You can execute the series of SQL statements in sequence in a single transaction. If an error occurs, you can break out of the sequence and display an error message or handle the error as desired.

However, if you’re importing a large set of data it’s not convenient to throw errors or display dialogs to the user. Instead, it would be nice to be able to just add any dependent data where appropriate, and insert all the data in one step.

The technique that’s described in this article makes use of database views and a SQLite feature known as INSTEAD OF triggers.

A view is a predefined SELECT statement that’s saved in a database so it can be used in queries as though it was a table. Because it usually includes data from multiple tables, and doesn’t necessarily include all the data from any given table, a view is generally read-only – you can use a SELECT statement to retrieve data from a view, but you can’t use an INSERT, UPDATE, or DELETE statement to modify the view data.

However, in SQLite (and consequently in AIR) you can define a special type of trigger that’s associated with a view known as an INSTEAD OF trigger. (A trigger is a set of SQL code that’s associated with a table. The code is executed when a data manipulation operation is performed on that table.) When a SQL statement attempts to perform an INSERT, DELETE, or UPDATE operation on the view that has an INSTEAD OF trigger defined for that particular operation, the trigger is executed instead of the specified operation. You can only define INSTEAD OF triggers on views (it wouldn’t make sense to use one for a table). For more information about triggers, see the Adobe AIR SQL reference documentation for the CREATE TRIGGER statement.

In this example, a view is defined that includes all the data in all the tables that potentially need data inserted. When the INSERT statement is executed the database runs the trigger instead. The trigger contains code that checks whether related data in the locations and countries tables already exists, and adds it if necessary. Then it adds the employee record with the related key values.

Building iPhone apps with Flash Platform tools roundup

Lots of news and rumors are flying around right now about developing iPhone apps using Flash Platform tools. Here’s a collection of links that I’ve found, some the official information and some information from folks who were involved in developing this cool new technology:

That’s all for now. I’ll keep updating the list as I find more resources.

New article “Programming with the Vector class”

Several months ago (probably almost a year ago) I wrote an article for the Adobe Developer Connection titled ”Programming with the Vector class.” As you can surely guess, the article is about the Vector class, which provides typed array functionality (an array whose elements are required to all be instances of the same data type). The Vector class was added to ActionScript in Flash Player 10 and AIR 1.5.

Apparently the article got lost in the shuffle, and about a week ago they found it and asked me to review their changes. I just found out that the article was published today.

Although it’s grouped under the “quick starts” category, it has a lot of detail. Also, it’s included in the Flash developer center but Flex developers shouldn’t be put off by that. It’s really about a core ActionScript class that’s available anywhere you’re writing ActionScript. (I’ve always found the ADC’s forced boundaries between Flash, Flex, and AIR to be too constraining for reality.)

I personally think the article provides a good, in-depth introduction to various aspects of working with the Vector class. In particular, it has guidance on areas that some people find problematic, such as the type parameter syntax and the fact that you have to provide your own custom sorting code (and of course the article includes examples to copy). I personally think it’s better than the developer guide documentation on the Vector class. (And I wrote them both so I’m not just showing a bias for my own work =)

A paperless world?

In the spirit of the anecdote I shared last March, here’s a funny little story from my day.

My boss asked me to review a report he’s been working on. He wrote it in a wiki page. I reviewed it mostly while I was riding on the train to work this morning (without network connectivity), so I didn’t make any changes to the wiki page itself but instead wrote notes in a Word document. Once I had finished my notes, I wanted to discuss them with my boss, but I was having a bit of trouble figuring out how to do it. Although I don’t think I was explicitly thinking about it, in retrospect I think I was looking at the situation with a few requirements:

  • I wanted to share my comments in person, rather than (for example) sending them by email.
  • I wanted to be able to share them in context, i.e. while actually looking at the report.
  • I wanted to minimize the disruption to my boss. We didn’t have a planned meeting (it wasn’t a formal review) so I planned to go to his cubicle and didn’t want to have to ask him to come back to my cubicle just to see my notes.

That was the problem in a nutshell. The notes were in a Word file on my computer in my cubicle. I wanted to go to my boss’s cubicle to discuss the notes so I needed a way to bring the notes with me to his cubicle. I had pretty much resigned myself to the idea that I would need to carry my laptop over to my boss’s cubicle and read my notes from it while we looked at the report on his monitor – but I wasn’t completely happy with that idea. (I’m not that lazy – my laptop is just hooked into a docking station and it’s really flaky about running on battery power unless you disconnect it in just the right way, which involves putting it to sleep twice and logging back in twice, among other steps. So there was a reason I didn’t want to have to go through that process.)

Suddenly I thought of a straightforward solution – so basic in fact that it really struck me that it wasn’t my first instinct (whereas previously it would have been).

Are you ready for it?

Here it comes…

I printed my Word document and carried the paper in my hand to my boss’s cubicle, together with a pen for taking notes.

Genius! The perfect solution for my requirements! The only thing noteworthy about it is that I realized it’s so extremely rare for me to print anything that it is apparently no longer an obvious course of action for me. I guess on a personal level at least I’m getting close to a paperless world.

And just in case this story makes me sound really unproductive, I should point out that this whole train of thought probably took no more than a couple of seconds. I wasn’t really investing that much time into it =)

Flex and AIR usability studies

My team at Adobe is conducting a few usability-type studies to learn more about how our customers actually work (and hopefully improve our products as a result =). To sweeten the deal, we’re offering Amazon gift cards for participants. (There are a limited number of participant slots available.)

We’re mainly looking for developers who have Flex experience but little or no experience developing for Adobe AIR. There aren’t many other restrictions – We’ll conduct the study on the phone and online using Adobe Connect.

Admittedly, I realize that if you read what I write here then there’s a good chance that you’ve already got too much AIR development experience. Even so, we’d appreciate it if you can spread the word to other developers you know who might be qualified.

If you’re interested or want to get more details, check out the official post on my team’s blog:

Need participants for studies about AIR and Flex

On a related note, we’re also conducting some (very brief) surveys about your experience developing AIR applications (Flex or HTML/JS). I can’t remember all the places where you might encounter them, but if you browse around the documentation or the developer center for a while there’s a chance you’ll be offered the survey. If you’ve done some AIR development and get a chance to take the survey, we’d like to hear about your experiences.

Survey: Is a ChosenSecurity certificate trusted on your machine?

Please take the following “survey” to see if a ChosenSecurity code-signing certificate is trusted on your machine.

(If you’re curious, you can read the background details below.)

Here’s how you can help:

  1. Download the .air file for the test application (339 KB)
  2. Double-click the .air file to install it (you’ll need to have Adobe AIR installed already, of course).
  3. When the installer gets to the warning dialog, check to see if the certificate is trusted or not. If the certificate is trusted, the dialog will look like this (the circled areas are the specific things to check for):

    You can cancel the installation once you’ve seen the dialog – it’s just a super-plain “hello world” application anyway.

  4. Leave a comment with your results! If the certificate is trusted (if it looks like the image) leave a “Yes” comment. If the certificate isn’t trusted, say “No” in your comment. In either case, you get bonus points if you add what kind of computer (manufacturer and model name) you tested, what operating system (including version number and language) you’re running, and where (country/city) you live.
  5. Repeat the test on other computers you may have access to (parents, friends, roommates, etc.). Spread the word and ask your developer friends to test it out also! I’d like to get a good cross-section of machines, not just developer machines in the United States running the latest OS X or Windows.

Once again, here’s the link to leave a comment with your results.

Background

I got a code-signing certificate from ChosenSecurity. Since they’re not a “big name” Certificate Authority like Verisign, I was worried that the certificate might not be trusted on as many machines. (If on a given machine a chain of trust can’t be established for a certificate you get the “unknown publisher” dialog when you’re installing AIR apps signed with that cert, regardless of whether the certificate is self-signed or not.)

However, since I was getting my code-signing certificate for free, I decided to give it a try and be the “guinea pig” for other developers who might be considering a ChosenSecurity certificate. (The advantages of the ChosenSecurity cert are that it costs less and you don’t have to have a backing company – you can get the certificate as an individual.)

Thanks very much for participating. Remember, this isn’t just for me – this is for all AIR developers who are wanting to get a code-signing certificate for less, but are concerned that the certificate might not be trusted on every machine where they’d like their apps to run.

New features in the next Adobe AIR “Athena”

Note: article updated Sept. 18, 2009 with additional features that have been made public since the original post.

…and another update Sept. 22, 2009

…and still another update Sept. 25, 2009

If you were following Twitter during the San Francisco Flash Camp on May 29, you might have seen that Arno Gourdol, Engineering manager for AIR, announced/showed a few features that are going to be in the next major version of AIR code name “Athena”.

Today I found the link to the video of Arno’s presentation ”Flash Camp Update on Adobe AIR,” so even if you couldn’t attend you can learn about those features yourself. The video’s fairly long and the new stuff is near the middle/end, so here are the highlights for you to watch for (sadly the video doesn’t have time markers so I can’t give exact times):

  • He starts the demo a little past the half-way point of the presentation.

  • He shows an app that detects when a drive is mounted/unmounted by listening for the new StorageVolumeChangeEvent.STORAGE_VOLUME_MOUNT and STORAGE_VOLUME_UNMOUNT events. He plugs a USB thumb drive into his computer and, sure enough, the new drive appears in the FileSystemDataGrid in his app.

  • Next he shows a change to the AIR installation process that’s coming in the “Squirter” release, which is a dot release coming out “probably late this summer” according to the video. The change is specifically to the warning dialog that’s displayed when a user installs an AIR app that’s signed by a trusted security certificate.

    Here’s the new version that he showed:

    Arno Gourdol shows the new AIR installation dialog.

    For reference, here’s an example of the current warning dialog. The highlighted items are the parts that are removed in the new dialog. It also looks like the “Install” and “Cancel” buttons have switched places for some reason, and some white space has been tightened up. Other than that the new dialog is the same (as far as I can tell):

Update Sept. 18, 2009

A couple of other new features have been mentioned publicly since I posted this:

  • In an AIR forum post, product manager Rob Christensen mentioned that the next major version of AIR will “provide an API to allow you to open documents” in their default applications. (The examples discussed in the post are opening Word or Excel files in their respective applications.) The code for this feature actually appears in the sample Arno showed at Flash Camp – he just didn’t point it out (look right above his head):

  • AIR principal scientist Oliver Goldman mentioned in a blog post that in his MAX 2009 talk he will be talking about “the new deployment options that will be available in Adobe AIR 2, including the native installer support required to use some of the advanced new AIR 2 APIs.”
  • And of course, Oliver’s quote also makes it explicit that the next major release of AIR is called “AIR 2.” In case that wasn’t so likely as to be obvious.

Update Sept. 22, 2009

Another update: In his Flash on the Beach 2009 presentation ”Advanced Desktop Development with Adobe AIR” Mike Chambers described the following feature (on page 20 of his slides):

NativeProcess API
  • New API in AIR 2.0
  • Can call and communicate with external applications
  • Requires application be distributed as native installer (no AIR files)
  • Cannot execute applications within application directory
  • Must add “extendedDesktop” to support profiles

Update Sept. 25, 2009

At a Flash users’ group meeting in Paris, Mike Chambers announced and demoed “the new raw microphone access feature coming in AIR 2.0.” Source and video: Lee Brimelow