Оригинал статьи написан Allen (http://dobeweb.com/2008/quickfix-try-google-app-engine-adobe-air-and-flex-2.html)
Последнюю неделю я работал над приложением, в котором объединены технологии Google App Engine, Adobe AIR и Flex. Сначала это было простым экспериментом, а затем стало полноценным интересным приложением. Алгоритм работы простой: приложение, названное QuickFix, отправляет изображение в Google App Engine, которое затем выполняет над ним преобразование по алгоритму “I’m Feeling Lucky” и отправляет его обратно. Ниже представлен скриншот, показывающий трансформацию одной из фотографий с последней конференции Java Posse Roundup прошлой зимой:

Приложение можно скачать с сайта:
http://airquickfix.appspot.com/
Весь исходный код выложен на проекте air-quick-fix в Google Code.
Вся работа была разделена между Диком и мной. Дик работал над бэкэндом на Питоне, в то время как я сконцентрировался на фронтэнде приложения на Flex. Мы использовали библиотеку PyAMF для связки бэкэнда и фронтэнда. PyAMF была выбрана потому что делает эти вещи просто и позволяет не отвлекаться на низкоуровневое программирование. Единственной проблемой, над которой пришлось подумать, явилась задача корректной конвертации типов данных. Первая версия приложения была готова буквально за несколько часов.
Бэкэнд, написанный на Питоне, очень примитивен. Метод, вызываемый клиентом (код немного обрезан):
def fiximage(data):
image_in = Image(str(data))
image_in.im_feeling_lucky()
image_out = ByteArray()
image_out.write(image_in.execute_transforms())
return image_out
В этом коде данные, передаваемые методу, являются классом ByteArray, содержащим изображение. Эти данные передаются экземпляру класса Image, после чего вызывается операция преобразования im_feeling_lucky, по завершении которой изображение отдается обратно клиенту.
Фронтэнд кода на Flex, который производит отправку изображения бэкэнду тоже достаточно простой:
Объект RemoteObject (сетевой интерфейс AMF в Flex) определен как:
<mx:RemoteObject id=“ro” destination=“image” endpoint=“http://airquickfix.appspot.com/image/”>
Функция, которая фактически выполняет запрос к бэкэнду:
var stream:FileStream = new FileStream();
stream.open(startFile, FileMode.READ);
var imageData:ByteArray = new ByteArray();
stream.readBytes(imageData);
ro.fiximage(imageData);
Этот код открывает файл с изображением, считывает его в объект ByteArray, затем передает его содержимое в метод fiximage бэкэнда.
Вся остальная часть приложения, написанная на Flex и выполняющая второстепенные функции (работа с интерфейсом, выбор и сохранение изображений) очень проста и не заслуживает отдельного внимания.
Приложение показывает сильные стороны каждой используемой технологии и то, как просто их интегрировать вместе.