Flex и RIA блоги



2014-12-09

11:51:10, Flash-ripper.com
Дима Гранецкий — Flash, Unity и Haxe разработчик и математик
Ищу постоянную работу в компании с полной занятостью
Мое резюме: 

Опытный разработчик с сильной математической подготовкой. Планирую переезд в Киев, в связи с этим ищу в Киеве постоянную работу.

Отлично разбираюсь в математике и геометрии. Пишу AGAL-шейдеры и не только. Много работал с 3D как во флэше, так и на Unity3D. Сделал много NDA-проектов для мировых брендов, промо- и игровых сайтов с 3D-графикой, элементами Augmented Reality и потоковым видео.

Отдельно стоит рассказать об отношении к Haxe. На этом языке пишу как обычный код, так и макросы, благодаря поддержке мета-программирования. Реализовал поддержку MXML-подобной нотации со связыванием данных (binding) на чистом Haxe. Написал ряд статей и заметок о Haxe, а также организовал несколько конференций по этой технологии. Поэтому в сообществе Haxe меня знают все — или почти все (а вы знаете, что такое Haxe?)

Контакт:

Сейчас ищу работу в Киеве, предпочитаю haxe или flash/flex (чистый ас3 меня устроит). Хочу делать что-то интереснее, чем онлайн-казино. Если у вас есть предложение работы для меня — свяжитесь со мной через LinkedIn или по этой почте.

 

 

Минимальная зарплата: 
$3000
Максимальная зарплата: 
$4000

2014-09-08

14:57:29, Flash-ripper.com
FlexJS: выход MXML и AS3 за рамки Flash

FlexJS — это название следующего поколения Flex SDK. Его цель — дать MXML- и ActionScript-приложениям возможность работать не только в Adobe AIR и Flash, но и в браузерах без Flash, на мобильных устройствах, под PhoneGap/Cordova, во встраиваемых средах JS (например, Chrome Embedded Framework, используемой в Adobe Common Extensibility Platform). 

Это расширяет использование MXML- и ActionScript-кода до большего количества платформ, чем есть у Flash в настоящее время.

Причина появления FlexJS — желание использовать готовые библиотеки кода. В то время, как флэш работает тольков в стандартных десктоп-браузерах, многие клиенты хотят, чтобы их Flex-приложения работали и там, где нет Flash или AIR, т.к. для их пользователей планшет является единственным компьютером. А стоимость переписывания приложения с нуля высока, как и сопутствующие риски потери качества, особенно при переходе к JavaScript как менее строгому языку. Здесь и приходит на помощь кросс-компилятор следующего поколения FlexJS.

Как работает FlexJS?

В основе FlexJS лежит концепция параллельных фреймворков. Компоненты имеют как AS-, так и JS- версию, а компилятор Falcon переводит MXML- и АS-код в JS. Для генерирования готового JS-кода связываются между собой не AS-, а JS-"классы".
 
А поскольку ActionScript и JavaScript основаны на ECMAScript, то большая часть AS-кода хорошо переводится в JS. Чаще всего большая часть готового кода Flex-приложения на самом деле не очень зависит от объектной модели Flash. Да, основные компоненты, типа Button и DataGrid зависят, но в HTML и JS для них есть эквиваленты. И так как код состоит из набора UI-элементов, управляемых AS-логикой видов, связанной с AS-логикой моделей, то можно компилировать в SWF элементы для Flash, а в веб-приложении — элементы для HTML, уже встроенные в браузер. 
 
Смотрите презентацию по FlexJS и схему работы FlexJS на сайте Apache Flex JS Wiki.
 

Пример FlexJS-приложения

Вот простое приложение для проверки концепции — позволяет смотреть биржевые курсы. Кликните на нем правой кнопкой мыши и выберите пункт "View Source". Вы увидите MXML и ActionScript для этого примера. Файл MyInitialView.mxml содержит UI, использует states, байндинг и CSS, как обычное Flex-приложение. 

Затем перейдите на Javascript-версию этого же приложения и посмотрите, как это работает в браузере без Flash. Это результат кросс-компиляции из того же исходного кода, что и код для SWF-файла. Кликнув правой кнопкой мыши на этой версии, вы не увидите Flash в контекстном меню. Но там вы тоже можете выбрать пункт View Source и увидеть минимизированный JS- код от FlexJS-компилятора Falcon.
 
Обратите внимание, что как SWF-, так и HTML-версии весят намного меньше, чем любая другая, которую вы можете создать в текущей версии Flex SDK (поэтому они стартуют намного быстрее).
 

Скачать FlexJS

Свежая версия FlexJS SDK появилась в июле 2014 года и имеет номер версии 0.0.2. Скачать ее можно здесь: http://flex.apache.org/download-flexjs.html
 
Если вы хотите создать свое FlexJS-приложение, то следуйте этим инструкциям для FlexJS и Flash Builder.
 
 

 

2014-04-21

05:38:38, Action Script 3
Как отделить мух от колет?

Рано или поздно любой flex-разработчик понимает, что нужно что-то сделать с собственным “винегретом” в коде, состоящим из mxml-разметки вперемешку с inline-кодом. А, собственно, что с ним не так? Если кратко, то:

  • код трудночитаем, из-за постоянного перехода внутри одного файла от as3 кода к mxml разметке и обратно;
  • сильная связанность (нет возможности легко заменить разметку или реализацию);
  • низкая переиспользуемость кода (трудно перенести код/разметку в другой проект);
  • отсутствует возможность разделить обязанности между разработчиком и дизайнером (кто-нибудь помнит/пользовался Flash Catalyst?, ах да: Development and sales ended on April 23, 2012);
  • сильно разросшийся размер файла;
  • и так далее.


Почему же так происходит? Отчасти в этом виновата сама Adobe, которая не удосужилась привить нужные навыки будущим разработчикам. Официальный хелп пестрит примерами наподобие этого (это всего лишь примеры, но все же):

<?xml version="1.0" encoding="utf-8"?>   
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"  
    xmlns:s="library://ns.adobe.com/flex/spark"  
    xmlns:mx="library://ns.adobe.com/flex/mx"  
    height="450">  

    <s:layout>  
        <s:VerticalLayout/>  
    </s:layout>  

    <fx:Script> <![CDATA[  
        import spark.events.IndexChangeEvent;  
        private function myChangedHandler(event:IndexChangeEvent):void  
        {  
            var selIndices:Vector.<int> = event.currentTarget.selectedIndices;  
            var selItems:Vector.<Object> = event.currentTarget.selectedItems;  
            var numItems:Number = selIndices.length;  
            selIndicesTA.text = "";  
            selItemsTA.text = "";  
            for (var i:Number = 0; i<numItems; i++)  
            {  
                selIndicesTA.text = selIndicesTA.text + selIndices[i] + "\n";  
                selItemsTA.text = selItemsTA.text + selItems[i] + "\n";  
            }  
        }  
    ]]>  
    </fx:Script>  
 
    <s:List allowMultipleSelection="true" change="myChangedHandler(event);">  
        <mx:ArrayCollection>  
            <fx:String>Flex</fx:String>  
            <fx:String>Flash Builder</fx:String>  
            <fx:String>Flash</fx:String>  
            <fx:String>Director</fx:String>  
            <fx:String>Dreamweaver</fx:String>  
            <fx:String>ColdFusion</fx:String>  
        </mx:ArrayCollection>  
    </s:List>  

    <s:Label text="Selected indices"/>  
    <s:TextArea id="selIndicesTA" height="75"/>  
    <s:Label text="Selected items"/>  
    <s:TextArea id="selItemsTA" height="75"/>
  
</s:Application>

 

Вместо того, чтобы пропагандировать “здоровое кодирование”, а также потому, что не смогла, как обычно, сразу сделать нормально. А, в конце концов, совсем открестилась от flex-а. Возможно, мы перекладываем с больной головы на здоровую, и во всем виновата прокрастинация разработчика. Но и она в основе своей вытекает, хоть и отчасти, из предыдущей проблемы. (Действительно ленивый программист сразу пишет рабочий, красивый и сопровождаемый код).

Не будем о грустном. Так как же можно отделить просо от гречки? Если хорошо поискать, то Adobe предлагает следующие варианты:

  • использовать <fx:Script> блок. Собственно, от его использования мы и пытаемся избавиться;
  • инлайн обработчики событий:

<s:Button label="Convert" 
click="celsius.text=String(Math.round((Number(fahrenheit.text)-32)/1.8 * 10)/10);"/>

 

  • в отдельном as файле: <fx:Script source=”includes/Sample3Script.as”/>.

Много кода в инлайн обработчике не напишешь. Нельзя использовать операторы сравнения. Да и не похож этот вариант на разделение, скорее наоборот. Проходим мимо.

Описывание кода в отдельном as файле ни к чему, кроме головной боли, не ведет. Как минимум, код в пустом (безо всяких package, class и тд) файле выглядит странно, запутывает и приводит в уныние, наверное, все современные IDE. Кто-нибудь сейчас так пишет? Получается, название статьи расходится с её содержанием. Зачем она нужна непонятно (см. абзац “Почему так происходит”).

Вот мы все ругаем Adobe за Flex. Так ведь да, в один прекрасный момент она сама это поняла и переписала часть фреймворка, как надо. Ввела новый жизненный цикл компонентов и отделила логику/поведение компонентов от их внешнего вида и увеличила цифру у фреймворка аж до 4.00. Можно даже почитать, как правильно готовить такие компоненты. Переписать все компоненты сил не хватило, теперь этим занимается Apache Foundation.

Что же делать? И как быть? Наверное, многие уже поняли, к чему я клоню, и вспомнили о старом, добром CodeBehind-е.  Идея этого архитектурного паттерна проста: всю бизнес-логику пишем на чистом as3 (базовый класс), а расположение и внешний вид контролов, описываем, используя mxml-разметку. Все контролы, которые будут использоваться в коде, должны иметь id и быть описаны в базовом классе как публичные переменные с соответствующим типом. Звучит страшно, но на самом деле все просто. Рассмотрим пример:

// BaseControlPanel.as 
public class BaseControlPanel extends Group 
    { 
        public var stopButton : Button; 
        public var startButton: Button; 
        public function BaseControlPanel() 
        { 
            super(); 
        } 
 
 
        /** 
         * @inheritDoc 
         */ 
        override protected function createChildren():void 
        { 
            super.createChildren(); 
            stopButton.addEventListener(MouseEvent.CLICK, onStopButtonClicked); 
        } 
 
 
        /** 
         * Обработчик клика по кнопке старт 
         * @param e 
         */ 
        protected function onStartButtonClicked(e:MouseEvent):void 
        { 
            trace("Start"); 
        } 
 
 
        /** 
         * Обработчик клика по кнопке стоп 
         * @param e 
         */ 
        private function onStopButtonClicked(e:MouseEvent):void 
        { 
            trace("Stop"); 
        } 
    } 
 
// ControlPanelView.mxml 
<?xml version="1.0"?> 
<local:BaseControlPanel xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:local="*" xmlns:layouts="spark.layouts.*" 
                        xmlns:components="spark.components.*"> 
 
    <local:layout> 
        <layouts:HorizontalLayout paddingLeft="5" paddingTop="5"/> 
    </local:layout> 
 
    <!-- Кнопка запуска --> 
    <components:Button id="startButton" label="start" click="onStartButtonClicked(event)"/> 
 
    <!-- Кнопка остановки --> 
    <components:Button id="stopButton" label="stop"/> 
 
</local:BaseControlPanel>

В приведенном примере мы видим два варианта подписки на событие клика по кнопке. Стоп-кнопку мы подписываем на клик mxml файле. Для этого необходимо, чтобы обработчик события был виден, т.е. был либо protected либо public. Старт-кнопку мы подписываем в createChildren, сразу после того, как она создастся. Оба варианта приемлемы. Вариант с подпиской в разметке, как нам кажется, короче, но не так универсален. Если нам нужно будет создать еще один вариант разметки, нам придется еще раз подписывать кнопку на это событие, что избыточно и легко может привести к ошибке, если мы забудем это сделать. С другой стороны, если нам нужно подписаться на это событие не сразу, или подписать вообще другой компонент (который также может послать это событие), то сделать это без изменения as3 кода не получится. А так как именно эту проблему мы и решаем, то вариант с подпиской на событие в разметке в данном случае подходит лучше. Используем тот вариант, который решает нашу задачу лучше.

Таким образом, мы частично решили поставленные в начале статьи задачи, и даже получили некоторые другие преимущества:

  • создание конструктора класса;
  • возможность тестировать логику приложения отдельно от её представления;
  • возможность наследоваться от базовой логики, без необходимости нести с собой mxml-мусор.

Но, как и у любого другого шаблона, у CodeBehind есть не только плюсы, но и минусы:

  • увеличилось количество набираемого кода;
  • увеличилось количество файлов/классов для редактирования (что приводит к частому переключению между вкладками в IDE);
  • использование наследования вместо композиции, что ведет к увеличению иерархии наследования;
  • необходимость в предоставлении ссылок-заглушек при тестировании базовых классов;
  • возможно частичное нарушение инкапсуляции и наследования.

Другим вариантом реализации отделения логики от разметки является приём, называемый CodeFront (или code in front). Идея его (вы наверное и сами догадались) так же проста и кристальна, как и в случае с CodeBehind, и заключается в том, что сначала мы реализуем расположение компонентов, и только потом наполняем их жизнью (добавляем логику). Пример:

// BaseControlPanelView.mxml 
<?xml version="1.0"?> 
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:local="*" xmlns:layouts="spark.layouts.*" 
         xmlns:components="spark.components.*" xmlns:s="library://ns.adobe.com/flex/spark"> 
    <!-- 
        /** 
         * Внешний вид панели управления 
         * Created 18.04.2014 
         * Version 1.0 
         * Copyright (c) 2014 
         * @author ChessMax (www.chessmax.ru) 
         */ 
    --> 
 
 
    <s:layout> 
        <layouts:HorizontalLayout paddingLeft="5" paddingTop="5"/> 
    </s:layout> 
 
 
    <!-- Кнопка запуска --> 
    <components:Button id="startButton" label="start"/> 
 
 
    <!-- Кнопка остановки --> 
    <components:Button id="stopButton" label="stop"/> 
 
 
</s:Group> 
// ControlPanel.as 
public class ControlPanel extends BaseControlPanelView 
    { 
        public function ControlPanel() 
        { 
            super(); 
        } 
 
 
        /** 
         * @inheritDoc 
         */ 
        override protected function createChildren():void 
        { 
            super.createChildren(); 
 
 
            startButton.addEventListener(MouseEvent.CLICK, onStartButtonClicked); 
            stopButton .addEventListener(MouseEvent.CLICK, onStopButtonClicked); 
        } 
 
 
        /** 
         * Обработчик клика по кнопке старт 
         * @param e 
         */ 
        protected function onStartButtonClicked(e:MouseEvent):void 
        { 
            trace("Start"); 
        } 
 
 
        /** 
         * Обработчик клика по кнопке стоп 
         * @param e 
         */ 
        private function onStopButtonClicked(e:MouseEvent):void 
        { 
            trace("Stop"); 
        } 
    }

Используя CodeFront, нам больше нет необходимости описывать все необходимые переменные в классе, чтобы использовать их в логике. Так как мы наследуемся от mxml-разметки, то компилятор делает это за нас. Но теперь мы лишены возможности назначить обработчик события inline-внутри mxml-разметки, так как описан он будет только в наследнике. Также нет возможности полностью заменить layout получившегося компонента, по понятным причинам. Да и перенести логику в другой проект без layout-а теперь не получится. Возможно, поэтому этот вариант гораздо менее популярен, чем CodeBehind.

Заключение.

CodeBehind/CodeFront - архитектурный прием, который позволяет относительно легко сделать код чистым и структуированным, что  легко дает возможность модифицировать его в будущем. Хотя поначалу довольно непросто привыкнуть писать код так, и это сильно раздражает. Даже кажется, что мы делаем слишком много дополнительной работы. Но, как говорится, стоит только начать, а уж когда втянетесь… Становится легче абстрагировать логику от разметки. Гораздо легче наследоваться от чистых AS3 классов, нежели от MXML классов с необходимостью изменять layout. Попробуйте один из перечисленных приемов в своем проекте. И обязательно оставляйте комментарии о своем положительном/отрицательном использовании перечисленных техник.

Почитать:

Code Behind
Code behind in Flex and WPF
Flex and WPF: A comparison – Part 2b
Code-Behind and Flex 2.0 (Partial Classes)
Building components by using code behind
Creating components and enforcing separation of concerns with Flex
Best Practice: Code Behind versus MXML Script Blocks versus View Helper


2013-12-06

03:54:04, Action Script 3
Жизненный цикл Spark компонентов Flex фреймворка и базовые правила наследования компонентов

Для правильной работы со Spark компонентами и создания собственных компонентов, необходимо иметь понятие о том, как и по каким правилам они работают. Сегодня мы  рассмотрим базовые принципы, без знания которых невозможно эффективно использовать этот мощный фреймворк.

Итак, жизненный цикл каждого компонента во Flex фреймворке проходит следующие этапы:

  • создание (construction);
  • конфигурация (configuration);
  • подключение/присоединение (attachment);
  • инициализация (initialization);
  • инвалидация (invalidation);
  • взаимодействие (interaction);
  • удаление (detachment);
  • сборка мусора (garbage collection).


При наследовании компонентов разработчик может (должен) переопределять следующие методы:

  • createChildren();
  • commitProperties();
  • measure();
  • updateDisplayList().

Когда мы добавляем компонент с помощью mxml разметки

<local:MyComponent fontSize="12" width="100"/>

происходит следующее.

Сначала запускается этап создания, и инстанциируется экземпляр класса MyComponent. Затем происходит конфигурация, в течение которой компоненту выставляются свойства и стили, объявленные при добавлении компонента (применяются они позже). Пока внутри компонента не доступны свойства systemManager, stage, root и т.д. Но при этом могут вызываться get/set методы (конфигурация), поэтому при реализации необходимо правильно определять такие методы. Нельзя сразу применять изменения внутри метода, необходимо использовать валидацию.

private var _data:Object;
private var _dataChanged:Boolean;

private function set data(value:Object):void
{
    if (this._data !== value)
    {
        this._data = value;
        this._dataChanged = true;

        this.invalidateProperties();
    }
}

Теперь движемся дальше (до применений изменений мы дойдем чуть позже). Наступает этап подключения, в котором компонент добавляется на сцену, после чего происходит инициализация. Инициализацию рассмотрим подробнее.

Фазы инициализации:

  • устанавливается значение свойства parent;
  • событие «preinitialize»;
  • создание дочерних компонентов createChildren() (для скинируемых компонентов это порождает вызов attachSkin(), про скины мы поговорим в следующий раз);
  • событие «initialize», вызов метода инициализации initialize().

При переопределении метода createChildren() в наследниках, необходимо создавать здесь постоянные дочерние компоненты (которые должны проходить этапы создания, конфигурации и подключения), но не применять динамических изменений (это будет происходить на этапе валидации). Вызывать super.createChildren() лучше в конце переопределения.

private var _okButton:Button;

override protected function createChildren():void
{
    if (this._okButton === null)
    {
        this._okButton = new Button();
        this._okButton.label = 'OK';
        this._okButton.addEventListener(MouseEvent.CLICK, this.okButton_clickHandler);
    }

    this.addChild(this._okButton);
    super.createChildren();
}

После того как компонент инициализирован, наступает этап инвалидации. Компоненты Flex фреймворка используют отложенную валидацию изменений. Аналогично как мы делали выше с полем data: изменения сохраняются и помечаются как измененные, а валидация происходи позже. Это позволяется сохранить высокую производительность, в том числе за счет того, что изменения применяются не по одному, а сразу все. Чтобы сообщить флексу о том, что требуется валидация, необходимо вызывать один из методов инвалидации:

  • изменение свойств – invalidateProperties();
  • изменение размеров – invalidateSize();
  • изменение отображения – invalidateDisplayList().

Для применения изменения свойств будет вызван метод commitProperties(), именно его и надо переопределять в наследниках для применения изменения данных. Для определения необходимости обновления используются флаги (_dataChanged в примере с set data).

override function protected commitProperties():void
{
    super.commitProperties();

    if (this._dataChanged)
    {
        this._dataChanged = false;

        // Применение изменения поля this._data
    }
}

Отметим, что, так как валидация происходит после инициализации, то в методе commitProperties() уже доступны дочерние элементы, созданные в createChildren().

При валидации размеров будет вызван метод measure(), который устанавливает предпочтительные размеры (поля measuredWidth, measuredHeight, measuredMinWidth, measuredMinHeight). Замечу, что метод не будет вызван при установленных explicitWidth/explicitHeight (значения, присвоенные пользователем: <s:Label width="100"/>). Пример:

override protected function measure():void
{
    var i:uint;
    var count:uint;
    var w:Number;
    var h:Number;
    var child:UIComponent;

    w = 0;
    h = 0;
    count = this.numChildren;
    for (i = 0; i < count; ++i)
    {
        child = this.getChildAt(i) as UIComponent;
        if (child !== null)
        {
            w = Math.max(w, child.getExplicitOrMeasuredWidth());
            h += child.getExplicitOrMeasuredHeight();
        }
    }

    measuredWidth = w;
    measuredHeight = h;

    measuredMinWidth = w;
    measuredMinHeight = h;
}

Валидация размеров вызывает метод updateDisplayList(). При переоределении этого метода в наследниках здесь следует позиционировать и устанавливать размеры дочерних элементов. Также можно перерисовывать например фон. Актуальный размер компонента выставляется именно здесь. Вызов super.updateDisplayList() снова советую делать в конце переопределения.

По окончании инвалидации рассылается событие «creationComplete», после чего компонент находится в рабочем состоянии и доступен для взаимодействия с ним.

Когда компонент уже не нужен – он удаляется со сцены (методами удаления или выставлением флага visible=false). Если при этом больше не существует ссылки на объект или она слабая, то компонент будет удален из памяти сборщиком мусора. Обратите внимание, что ссылки на объект могут сохраняться при использовании обработчиков событий, биндига, сохранении в качестве ключей в словаре и т.д., поэтому не забывайте отписываться от событий, если больше не требуется его слушать.

Полезные ссылки


2013-04-03

09:58:03, Flash-ripper.com
Urgently!!!

Successful company is looking for flash/flex developer (middle-senior). For developing RIA applications. We are ready to pay fairly! Send us your resume - e.farenik@gmail.com

For details, call 0502868568 Helen


09:58:03, Flash-ripper.com
Urgently - Flash / Flex Developer needed

Successful company is looking for flash/flex developer (middle-senior). For developing RIA applications. We are ready to pay fairly! Send us your resume - e.farenik@gmail.com

For details, call 0502868568 Helen


2013-02-01

16:43:44, Flash-ripper.com
Open Souls

Несколько дней назад вернулся с 10ти дневного похода, побывал на самой высокогорной метеостанции родины Кара-Тюрек, немного простыл, чутку обморозил щеку, живой. Новый год встречал в 15ти дневном походе, ногами прошли более 150км. Удивительный выбор , вместо теплой Черногории, лететь в морозный Алтай, помещать себя в суровые условия выживания. Возможность осознать действительно значимое в жизни и отсеять шелуху Включается понимание не умом, не логическое, более глубокое, настоящее. Возможно такой способ понимания изменений происходящих с платформой flash будет лучшим :) 



Долгие годы знакомства с платформой и флэшерами, создали впечатление о flash как о технологии добра и любви Flash-тусовки и мероприятия во всём мире несут позитивную, солнечную атмосферу дружбы и взаимопомощи Настоящие флэшеры добрые любвеобильные, редко можно увидеть флэшера пускающего лучи ненависти, и даже если случилось увидеть, то стоит присмотреться, вероятно окажется, в те дни он кодил на C# или js+html5. :) Владельцы технологии несколько лет назад, в ответ на клевету и выпиливание, разместили "WE LOVE APPLE" в бумажных изданиях вроде "the Wall Street Journal" и сети. 

Уже не так слежу за новостями платформы, на днях почитал хештег #as3, увидел много твитов счастья и любви последний год случилось многое о чём мечтал работая в игр-строе, и вот, через виртуальную примерочную снова вернулся к enterprise стороне технологии. Впервые на своём опыте получил реальный кросс-платформенный проект с единым ядром и различными контролами-интерфейсами для десткоп и планшет версий. Процесс разработки и сборки в в IntelliJ IDEA невероятно приятен словно песнь и сказка.

Как flex/flash-разработчик чувствую комфорт и заботу о себе и технологии, естественно с flex не всё сладко, будущее mxml не ясно, но настоящее вполне светло. GUI в технологии flash сейчас осваивают Stage3D, яркий пример тому Feathers, в последнем проекте серьёзно рассматривалась возможность использовать Stage3D-контролы для планшетной версии с таблицами, чартами, бубликами графиками. Вижу это направление перспективным, плавность элементов интерфейса на планшете-телефоне весомый аргумент.

Редакторы вроде mindmap тоже хорошо ложатся на Stage3D, есть ещё недостатки связанные с заточенностью под игровые текстуры а не редакторы схем, но использовать можно. У технологии впереди яркое будущее в игромире, радостно осознавать это. Сфере корпоративных приложений flex ещё послужит. 

Хочется верить сразу в два чуда, корпорации мира таки объединятся и создадут единый язык для web и RIA, конечно же на основе последней версии ECMAScript, а лучше чтоб это AS4 и был. И последняя чудо-мечта чтоб flashplayer перестал существовать как закрытый плагин, открылся и стал частью всех современных браузеров, тем самым утвердив единый язык

Давайте объединятся и жить дружно! :)

Задумываться, что важней, рубить бабло ли нести в мир красоту и гармонию, flash в моих глазах всегда была волшебной технологией способной менять сеть к лучшему.


2013-01-15

08:35:08, Flash-ripper.com
Резюме -> интервью -> зарплата

Как составить резюме так, чтобы его прочли, а не выбросили? Зачем вообще нужно резюме? Какое резюме лучше: всеохватное с перечислением всех регалий или лаконичное? Если пригласили на собеседование, то к чему готовиться? О чем стоит, а о чем не стоит говорить? Оказывается, не все наши знают ответы на эти вопросы. Более того, не все догадываются о существовании этих вопросов. Попытаемся заполнить этот пробел.

Зачем нужно резюме

Кроме перечисления ваших профессиональных достижений, ваше резюме -- это способ за 5 минут понять, насколько вы адекватны собственной среде. Если вы не можете составить резюме, то это уже многое о вас говорит. Если вы не хотите это делать -- то о вас понятно еще больше. А что именно понятно? А кое-что. Каждый работодатель поймет немного по-своему, он сделает выводы о вашей коммуникабельности и умении излагать. Если вы ничего не можете о себе сказать -- понятно. Если говорите слишком много и флудите -- понятно. Попробуйте сами взять кого-то незнакомого на работу и вы поймете то, что понятно лишь работодателям, и ваше видение изменится. И станет ясно, как важно правильное резюме.

Так говорит Будам

Тема адекватного интервью в американской компании раскрыта в подкастах Будама. Если вы обновляете свое резюме или готовитесь к собеседованию, то их прослушивание может доставить вам как пользу, так и возможность приятно провести время, узнав конкретные и ясные мысли о карьере.

  1. О том, как ищут IT-работу в США, рассказывается в 28 подкасте (mp3).
  2. О правильном собеседовании рассказывается в 266 подкасте (mp3)
  3. Правильный ответ на вопрос "Сколько ты получаешь?" -- в важном 3 подкасте (mp3).

Зачем вы пишете резюме?

Первый вопрос, на который вы должны ответить перед составлением резюме: что и зачем я хочу сказать о себе работодателю, чтобы получить максимум пользы для себя и для всех? Второй вопрос: что я хочу сказать о себе в первую очередь? Ответы на эти вопросы приведут к переделке резюме, и это правильно. Для каждого случая поиска работы лучше всего редактировать резюме так, чтобы приоритеты в резюме были ориентированы на запросы вашего работодателя. Представьте это как проекции трехмерного предмета на двумерные плоскости: в зависимости от свойств пространства, более привлекательной будет та или иная проекция, тут лучше показать вид сверху, а там -- лучше вид справа. Ваше самое полное резюме, со всеми вашими достижениями, хобби и котятами - это трехмерный объект. Созданная из него версия, адаптированная под конкретную вакансию -- это его редуцированная проекция. Часто адаптация резюме заключается в том, чтобы вырезать лишнее и дать читателю-работодателю лишь то, что его интересует. Не тратьте его время зря. Расскажите о себе главное, и sapienti sat.

Лаконичное резюме или полное?

Пару лет назад я начал использовать сверх-лаконичное резюме, где мои приоритеты выделены размером, как тэги в облаке:

_____________________________________________________________________________________
Rostyslav ‘Rost’ Siryk          { rostislav.siryk@gmail.com, +38 050 406 03 96 }
_____________________________________________________________________________________

Consultant, web engineer and prototypist specializing in cross-platform web apps UI creation  including [motion] design, development and localization. Created PoCs E-learning apps and interactive demos for web, iPad and Android to engage Cisco, Motricity, Sony, Medtronic and more.

Use ActionScript, MXML, JavaScript, XHTML XML, CSS, JSON, Photoshop, Flash, Balsamiq, Eclipse TFS, SVN, Ant, Flex, jQuery, Drupal, Wordpress, Mate, Flash Remoting, FluorineFx, Apache, Google Apps, Scrum.
Like to automate workflows to make things easier.

 

По такому резюме легко увидеть, что именно вы о себе думаете (или что вы хотите, чтобы о вас думали). Это -- схема ваших возможностей, и ее также легко редактировать, т. к. она охватывается одним взглядом. Полное резюме можно включить в текст лаконичного как ссылку.

Посмотрите на это так: составление резюме -- это упражнение в креативности и смелости. Это ваш шанс сразу понравиться или ваш риск сразу показаться унылым задротом. И это -- первый шаг к новой зарплате :- )

Тэги: 

2012-03-31

08:53:54, Flash-ripper.com
Step Up

Квартал заканчивается. Погода радует непредсказуемостью, вечерами на горизонте светит яркая Венера, Луна и не  далёкий Юпитер... это как чудо, всегда считал что Венера появляется только рано утром перед восходом, она там была всегда, неужели сейчас нет. Вместо того чтоб открыть stellarium, добавлю задачу, "утром, до восхода попробовать отыскать её на горизонте". Для меня это событие не менее важное, чем остальные случившиеся в этом году : )

Аппаратно ускоренная графика - то, чего хотел последние лет так 5, прочно вошела в наши гаджеты всех размеров. И сейчас в разработке двух не игровых приложений, делаю ставку на наличие 3D-ускорителя у пользователя. В одном случае это приложения для Vk, там перекладываю работу с фотографиями на stage3D. Во втором это ios/android компас, простое бесплатное приложение, указывающие стороны по числу гуа и фен-шуй, тут на stage3D переносится часть интерфейса и сам компас. На устройствах без совместимого GPU оно не заработает, зато на остальных гладко/плавно/классно. Тема gui на stage3D, на мой взгляд - тема, пока не раскрытая. Хотел было использовать AlternativaGUI, но склонился к flash Ide компонентам, показалось кропотливо переправить тему на свой лад аля metro, т.е. без графики. Сегодня снова попробую выбрать между flex mxml и альтернативой. 

Попробовал Robolegs на Galaxy S в игровом приложении, тормозов не замечено. Сейчас всё пишу на них, реализация медиаторов очень понравилась. С февраля, вместе с друзьями создаём игровой проект, хотим к flashgamm успеть сделать просто круто. Не многим раньше альтернативы выложил сорсы на гитхаб, изначально рендер был на nd2d, сейчас их два, на альтернативе тоже. К слову очень понравилось как сделана альтернатива, сразу учат как делать правильно, сделать плохо - не просто , даже если были привычки - отучат. Привычки вообще это плохо.

Очередная попытка оседлать Realaxy AS Editor мне не удалась, сходу не завелись инжекты роболегсов. Тут наверное я чего-то не так настроил, показалось что RASE не гонялся ещё с кучей swc, вникать не стал, решил если научусь уверенно держаться в седле других JetBrains, то и тут буду успешен. Зато попробовал вникнуть в тему беты RASE 1.1 - компиляции AS3 кода в js-html5 , и тут не удалось, вроде не один я такой - кто хочет RASE, чтоб всё получилось и желает создателям вдохновений. 

Adobe в моих глазах делает сложно объяснимые вещи, понимать которые, возможно, лучше всего не умом. Вчерашнее заявление о поборах 9% с веб платформы... после того как они отключили поддержку веба на смартфонах и линуксах. Они или знают что webgl и js-html5 (которые есть/будут на мобилках), никогда не смогут догнать и стать конкурентами fp. Или всё плохо : )  А что если хорошо?  

Apache Flex вроде как обещается синтез js/fp , как я понял, существующие flex приложения заработают там где нет fp. Общем, что бы то не было, искать замену flash сегодня дело сомнительное, схоже как ставить flashbloсker в браузер - неразумно. Есть AdBlocker, который издавна, значительно лучше справлялся с задачей блокирования не только flash, а всей рекламы делая интернет чище. Несмотря на летящие камни, Adobe Flash продолжает "make love", и будет радовать классными штуками вроде http://www.incredibox.fr

Предполагаю, у adobe есть причины делать ещё пачку, вроде бы не нужных редакторов для HTML5 помимо Flash IDE, редакторы выполнены на AIR. Сейчас все силы развития Flash платформы перекинуты в AIR, повышение производительности и мобильные приложения, будущие flash это air. Nvidia ion - чипсет для процессоров intel atom, рекламировал себя так: "HD Videos on GPU-Accelerated Flash Player". Специально для fp на десктопе, Nvidia и ATI выпускают драйвера... а может и GPU. Теперь представим webkit скомпилированный под AIR )) и CUDA туда же. 

Так а что же если всё плохо? Отличный ответ на все случаи даёт Яков Файн в подкасте б.т. - "выучите то что знаете ещё лучше" будь то java, phyton, php, as или вышивание. Будьте  специалистом там, где вам нравится.  

В легендарных словах мастера Йоды, на мой взгляд не хватает одного слова, 

... Помни: сила рыцаря-джедая - это сила Вселенной. Но помни: гнев, страх, ненависть  – это всё ведет на тёмную сторону Силы. Как только ты сделаешь первый шаг по тёмному пути, ты уже не сможешь с него свернуть...

Выбор - личное дело каждого.


2012-02-21

08:54:34, Flash-ripper.com
К вопросу об архитектурных фреймворках в Adobe AIR

Пишет Адилет Абылов:

Недавно столкнулся с проблемой выбора архитектурного фреймворка для разработки под мобильные устройства на Adobe AIR. У меня довольно большой опыт использования Cairngorm, но терзают смутные сомнения в том, что Cairngorm - это хороший выбор для мобильных приложений, с учетом рекомендаций Adobe по экономии памяти и ресурсов процессора. Поиск в сети на эту тему не дал однозначного результата. Где-то читал, что Mate подходит для мобильных устройств, но Adobe рекомендует меньше использовать mxml, а Mate очень активно использует его. Возможно, мобильные приложения по определению не могут быть большими и сложными, поэтому использование фреймворком и не требуется.

Хотелось бы спросить мнения у более опытных коллег.

С уважением, Адилет Абылов


2011-10-04

21:36:05, 33 коровы
AIR. Полезные советы. Custom chome, тень и html
Как сделать приложение с кастомным хромом можно найти за 5 минут. Речь пойдет о том как к нему добавить тень. Проблема: Добавить к аир приложению тень. Решение: Используем следующий код: <?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" width="900" height="700" showStatusBar="false" backgroundAlpha="0" > <fx:Script> <![CDATA[ import spark.filters.GlowFilter; ]]> </fx:Script> <fx:Declarations> </fx:Declarations> <s:Group left="5" right="5" top="5" bottom="5" […]

20:36:05, 33 коровы
AIR. Полезные советы. Custom chome, тень и html
Как сделать приложение с кастомным хромом можно найти за 5 минут. Речь пойдет о том как к нему добавить тень. Проблема: Добавить к аир приложению тень. Решение: Используем следующий код: <?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" width="900" height="700" showStatusBar="false" backgroundAlpha="0" > <fx:Script> <![CDATA[ import spark.filters.GlowFilter; ]]> </fx:Script> <fx:Declarations> </fx:Declarations> <s:Group left="5" right="5" top="5" bottom="5" [...]

09:52:33, Flash-ripper.com
Скажи «Hello» Андроиду: FlashDevelop и FDT

Спойлер. Это не просто. Это очень просто. - пишет Елена Геллер и продолжает:

На самом деле, Flash Builder – не единственный инструмент, с помощью которого можно комфортно изготавливать приложения для платформы Android. Это же самое могут и другие два популярных инструмента - FlashDevelop (далее по тексту - FD) и FDT. Учитываем, что  FlashDevelop бесплатен, а  FDT станет бесплатным, начиная с пятой версии (хотя и только в «упрощенном» варианте Free) – новость, особенно приятная для пользователей Mac и Linux.

В обоих инструментах главное — создать мобильный проект (Flex). В новом проекте у Вас уже готовы два mxml-файла — основной (в каталоге src) и первый вид (Home) в папке src/views. Ваши действия на самом деле аналогичны тем, которые требуются при работе в Flash Builder, ведь общую структуру и логику Flex 4.5 никто не отменял. 

Тестирование: F5 (FD), Run configurations (FDT).

Сертификат:  FDT — в папке проекта cert лежит образец сертификата, который для начала можно использовать.  FD – пользуемся .bat-файлом createCertificate.bat, который по умолчанию использует пароль fd.

Создаем .apk:  FDT — запускаем ant-скрипт (android_release_build.xml, либо, если необходимо, другой из папки ant), FD – запускаем соответствующий .bat-файл (подробнее можно прочитать в соответствующем readme-файле, также находящемся в проекте; отметим, что темплейты проекта для различных версий FD4 могут несколько отличаться, т. к. четвертая «ветка» популярного IDE хотя и рекомендуется для работы, но все еще не является релизом).

Собственно, все.

Читайте также предыдущую статью Елены - о разработке под iOS в среде OpenPlug.


2011-01-25

08:22:55, Flash-ripper.com
Как быстро свести с ума Flex-компилятор

Я помогаю Павлу изучать Flex и сегодня он попросил меня разобраться с одной странной ошибкой, которая возникла в его коде "непонятно откуда". Ошибка возникает во время выполнения и в сокращенном виде гласит такое:

VerifyError: Error #1019: Объект Getscopeobject 2 выходит за границы.

Официальная документация об этой и некоторых других ошибках ActionScript времени выполнения говорит, что они возникают в случае повреждения SWF-файла. Или в случаях сбоя работы компилятора, о чем надо сообщать в Adobe. То есть компилятор может создать неправильный файл, который не может быть корректно выполнен, но ошибки компиляции при этом мы не получим - только ошибку времени выполнения.

Разбираясь с причинами возникновенния этой ошибки, мы сначала мы убедились, что SWF-файл не поврежден: очистили и пересобрали проект во Flash Builder, очистили кэш браузера, перезапустили. Повторили два раза. Не помогло.

Получается, что ошибка -- где-то в исходном коде

Покопавшись немного, мы нашли проблему, из-за которой компилятор делал неправильный мед код. Павел предпринял попытку изобретения чего-то вроде геттера. Он смешал объявление переменной в классе с объявлением функции. Создал переменную типа Function и присвоил ей функцию. И это привело к созданию неправильного байткода.

Отбросив все несущественное, получим такой исходный код приложения, целиком воссоздающий данную проблему:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
	
	<fx:Script>
		private var compilationDestroyer: Function = 
			function makeMyCompilerCrazy(): void
			{
			}			
	</fx:Script>
</s:Application>

После компиляции и запуска готовое приложение выдает такую длинную ошибку с матами на языке ассемблера виртуальнной машины Flash, что мы помещаем ее под кат:

читать далее


2011-01-03

09:09:57, Flash-ripper.com
Видео: работа с языком MXML в редакторе Realaxy IDE

Евгений Потапенко таки оказался быстрее ребят из FDT и FlashDevelop и реализовал поддержку MXML в редакторе RASE (Realaxy ActionScript Editor) в разы быстрее, чем это сделали они. Вот скринкаст о том, как работать с MXML в редакторе RASE - Realaxy ActionScript Editor. Видео, как и редактор, пока в бете - так что пока без звука:

Выходит, что название редактора уже устарело, ведь вторая и третья буквы в аббревиатуре "RASE" обозначают "ActionScript" в названии "Realaxy ActionScript Editor". Теперь весь функционал редактора уже не помещается в его названии, так как MXML теперь тоже можно писать. Можно начинать думать над новым названием и новой аббревиатурой. Предлагаю название "Realaxy IDE" с аббревиатурой "RIDE!", что переводится как "Погнали!" Smile

Лайк? Дизлайк? Предложите в комментариях свой вариант названия для этого редактора!


2010-05-22

13:19:05, Flash-ripper.com
Доступна альфа версия UML редактора UML4AS

Сегодня разработчики UML редактора UML4AS выложили альфа версию в публичный доступ для скачивания.
Разработчики выделяют как основные особенности редактора:

  • дружественный интерфейс разработчика/процесс разработки
  • технология CodeSync для генерации кода, реверс-инжиниринг и устранение конфликтов
  • поддержка ActionScript и MXML файлов
  • поддержка рефакторинга
  • поддержка командной работы

и много чего ещё...
Видео, фото редактора.
После закачки можно подсмотреть как правильно установить, а после установки -- как использовать.
Свои пожелания и предложения можете выказывать на этом форуме, а рассказать о найденых ошибках, на этом.


2010-03-16

08:21:06, Flash-ripper.com
Flex для PHP-разработчиков

Я работал с веб-технологиями, начиная с ранних 90-х, и моей первой серверной технологией был язык PHP. Потом я работал с ColdFusion и Java, но всегда считал себя PHP-разработчиком. Когда пришел AJAX, я начал работать с фреймворками типа Prototype и script.aculo.us, и начал создавать собственные фреймворки.

В конце 2006 года я впервые попробовал разработку на Flex. Это было что-то вроде экспресс-курса, так как у меня было от 4 до 6 недель на создание демо-приложения для выходящей вскоре версии FDS (Flex Data Services, теперь называются LiveCycle Data Services). Хотя я был новичком во Flex и FDS, проект пошел хорошо, и я действительно насладился разработкой и процессом изучения.

Тем не менее, как бы приятно это ни было, это было нечто другое. Я имею в виду, что, когда я делал веб-приложения на ColdFusion или Java, я не ощущал большой разницы в сравнении с PHP; это было больше вопросом поиска правильных API и усвоения специфики языка. Позже, когда я начал работать с AJAX для DHTML, это тоже не так сильно отличалось. Большая часть сайта создавалась с помощью все тех же техник серверного языка, нужно было просто добавить специй тут и там (в данном случае – некоторых AJAX- виджетов).

Когда я сделал свой первый проект на Flex, о, мой мальчик, это было такое переключение! Четкое разделение между клиентом и сервером (бизнес-логика на стороне клиента в дополнение к бизнес-логике на стороне сервера), клиентская технология, которая компилировалась, а не интерпретировалась, два языка на клиенте, и все это требовало другой настройки ума, чем традиционная веб-разработка.

Это и есть моя причина для написания этой статьи. Я хочу поделиться с вами некоторыми из особенностей  Flex относительно PHP. Вместе с этим, я хочу представить Flex, сравнивая его с PHP там, где такое сравнение имеет смысл. Итак, эта статья предназначена для:

  • PHP-разработчиков, которые хотят узнать о Flex и ActionScript 3 больше, чем может дать простое определение;
  • PHP-разработчиков, которые уже сделали свои первые попытки кодирования Flex-приложений и хотят более широкого и глубокого понимания

Чего нет в этой статье? Мое намерение не в том, чтобы превратить вас во флексеров, и не в том, чтобы убедить вас в превосходстве Flex над X или Y. Я твердо верю, что существуют различные типы проектов, и что они могут и должны быть реализованы с помощью различных инструментов. Когда производительность, максимальная отдача от инвестиций и удобство являются главными приоритетами, то нет такой вещи, как универсальный инструмент.

В то же время, эта статья не является полной документацией к Flex или ActionScript3. Существуют десятки книг, охватывающих эту тему сотнями страниц. Есть тысячи статей о Flex. Моя цель – дать вам достаточно информации по наиболее важным темам и там, где это имеет смысл, связать концепции Flex с  аналогичными понятиями из PHP. Чтобы статья была полезной, я структурировал ее и постарался не вдаваться слишком глубоко в детали. В конце я даю краткое введение в Adobe AIR и ссылки на дополнительные ресурсы, если вам нужна подробная информация по этим вопросам.

Для большинства примеров я выбрал Flex 3, на то есть пара причин. Во-первых, во время написания этой статьи Flex 4 все еще не вышел. Во-вторых, Flex 4 в основном является эволюцией Flex 3, так что большая часть описываемых вещей может быть применена к Flex 4 с минимальными изменениями, если они вообще понадобятся. В некоторых случаях я укажу на эти отличия. Что касается PHP, то я использую версию PHP 5.3. Теперь посмотрим содержание, а затем – погрузимся в материал!

  1. Что такое Flex?
    1. Flex: два языка и один фреймворк, чтобы связать их
    2. Почему вам нужно знать про Flex
    3. От тонкого клиента к умному и богатому клиенту
  2. Введение в язык MXML
    1. Смешивание MXML  ActionScript 3
    2. CSS-стили
    3. Изменение MXML-кода во время выполнения
  3. Введение в язык ActionScript 3
    1. Разделение выражений
    2. Типы данных, переменные, константы
    3. Функции и анонимные функции (замыкания)
    4. OOП: классы и интерфейсы
    5. Область видимости переменной
    6. Массивы
    7. Пространства имен
    8. Работа с XML
    9. Динамический ActionScript
  4. Flex асинхронен
  5. Связывание данных, метаданные и отражение
  6. Где мои данные, давайте их сюда!
  7. Аутентификация пользователя во Flex- и PHP-проектах
  8. Работа над проектами Flex и PHP
    1. Flex SDK
    2. Flex Builder / Flash Builder
    3. Отладка Flex-приложений
  9. Что такое Adobe AIR?
  10. Что будет с Flash дальше??
  11. Куда направиться после всего этого

Что такое Flex?

Простейший ответ: Flex – это просто еще один способ создания Flash-приложений. Flex-приложение компилируется в SWF-файл, который проигрывается в браузере с помощью Flash Player. Но зачем нужен еще один способ создания Flash-приложений? Традиционно Flash-приложения создавались в среде разработки Flash. Если вы посмотрите на нее, то вы заметите, что она ориентирована в основном на дизайнеров. Там есть сцена, временная шкала, инструменты рисования и т.д.

При разработке приложений важную роль играет производительность, вам нужны компоненты, вы хотите максимально упростить разработку, использовать код повторно, и, не в последнюю очередь, вы хотите современную IDE – интегрированную среду разработки.

Так что пересмотренный ответ может быть таким: Flex – это фреймворк с открытым исходным кодом, помогающий разработчикам быстро создавать насыщенные интернет-приложения (RIA, Rich Internet Applications), работающие внутри Flash Player. Фреймворк к сегодняшнему дню хорошо отточен в сравнении со своим первоначальным состоянием в 2006 году, когда вышел Flex 2, Flash Player 9 и ActionScript 3.

Adobe Flex[к началу]

Читать всю статью "Flex для PHP-разработчиков"

читать далее


2010-03-10

10:35:41, Junik
Фильтруем ArrayCollection

Так случилось, что фильтрация коллекций ни разу не беспокоила меня. А тут коллега задал вопрос, который послужил толчком к тому, что вы сейчас прочитаете. =)

Коллеге необходимо показать во view отфильтрованную ArrayCollection. Сама ArrayCollection находится в модели. Когда во view применяется фильтр, то данные модели очень сильно выглядят измененными. Что делать? Как быть?

Конечно, мы с вами знаем, что данные на самом деле не меняются. source коллекции так и остается исходным. Но не работать же в модели с source?

Конечно, не работать! И уж конечно, не делать копии коллекций! Тут спасибо Константинеру за наводку. =)

Можно использовать ListCollectionView в качестве обертки нашей исходной коллекции уже на уровне view. Тогда довольная модель работает с ArrayCollection, как и прежде, а view показывает, что захочет.

В качестве примера использую пример из доков Adobe для фильтрации коллекций.
Пример такой:

XML:

<?xml version="1.0"?>
<!−− dpcontrols\SortFilterArrayCollection.mxml −−>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="600">
    <mx:Script>
        <![CDATA[
            import mx.collections.*;
    
            /* Function to sort the ICollectionView
               in ascending order. */
            public function sortAC():void {
                var sortA:Sort = new Sort();
                sortA.fields=[new SortField("label")];
                myAC.sort=sortA;
                //Refresh the collection view to show the sort.
                myAC.refresh();
            }
 
            /* Function to filter out all items with labels
               that are not in the range of M-N. */
            public function stateFilterFunc(item:Object):Boolean {
                return item.label >= "M" && item.label < "O";
            }
            
            /* Function to apply the filter function the ICollectionView. */
            public function filterAC():void {
                myAC.filterFunction=stateFilterFunc;
                /* Refresh the collection view to apply the filter. */
                myAC.refresh();
            }
 
            /* Function to Reset the view to its original state. */
            public function resetAC():void {
                myAC.filterFunction=null;
                myAC.sort=null;
                //Refresh the collection view.
                myAC.refresh();
            }
 
        ]]>
    </mx:Script>
 
    <!−− An ArrayCollection with an array of objects. −−>
    <mx:ArrayCollection id="myAC">
        <mx:Array id="myArray">
            <mx:Object label="LA" data="Baton Rouge"/>
            <mx:Object label="NH" data="Concord"/>
            <mx:Object label="TX" data="Austin"/>
            <mx:Object label="MA" data="Boston"/>
            <mx:Object label="AZ" data="Phoenix"/>
            <mx:Object label="OR" data="Salem"/>
            <mx:Object label="FL" data="Tallahassee"/>
            <mx:Object label="MN" data="Saint Paul"/>
            <mx:Object label="NY" data="Albany"/>
        </mx:Array>
    </mx:ArrayCollection>
 
    <!-- Buttons to filter, sort, or reset the view in the second ComboBox
            control. -->
    <mx:HBox width="100%">
        <mx:Button id="sortButton" label="Sort" click="sortAC();"/>
        <mx:Button id="filterButton" label="Filter" click="filterAC();"/>
        <mx:Button id="resetButton" label="Reset" click="resetAC();"/>
    </mx:HBox>
    <mx:VBox width="550" height="143" borderStyle="solid" paddingTop="10" paddingLeft="10">
        <mx:Label text="This box retains original order and contents of the Array:"/>
        <!-- A ComboBox populated by the underlying Array object.
            This control shows that Array retains its original order. -->
        <mx:ComboBox id="cb2" rowCount="10" dataProvider="{myArray}"/>
        <mx:HRule/>
        <mx:Label text="This box reflects the changes to the Array:"/>
        <!−− A ComboBox populated by the collection view of the Array. −−>
        <mx:ComboBox id="cb1" rowCount="10" dataProvider="{myAC}"/>
    </mx:VBox>
</mx:Application>

Тут у нас два выпадающих списка: один с source коллекции, а второй с самой коллекцией.
Можно отсортировать, отфильтровать коллекцию и посмотреть, что будет.
После выполнения метода filterAC наша коллекция уже сама не своя, ее прямо не узнать.

Что же мы делаем? Тут и далее использован беглый стиль программирования, потому что все-таки пример. =)
Добавляем обертку для коллекции:

Code:

[Bindable]
private var wrapper:ListCollectionView;

После создания приложения создаем эту нашу обертку:

Code:

creationComplete="wrapper=new ListCollectionView(myAC)"

Фильтруем уже эту обертку, ее же показываем во втором выпадающем списке.
Добавляем новый выпадающий список для нашей родной коллекции.

Вот как выглядит код после изменений:

XML:

<?xml version="1.0"?>
<!−− dpcontrols\SortFilterArrayCollection.mxml −−>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="600"
  creationComplete="wrapper=new ListCollectionView(myAC)">
    <mx:Script>
        <![CDATA[
 
            import mx.collections.*;
            
            [Bindable]
            private var wrapper:ListCollectionView;
    
            /* Function to sort the ICollectionView
               in ascending order. */
            public function sortAC():void {
                var sortA:Sort = new Sort();
                sortA.fields=[new SortField("label")];
                wrapper.sort=sortA;
                //Refresh the collection view to show the sort.
                wrapper.refresh();
            }
 
            /* Function to filter out all items with labels
               that are not in the range of M-N. */
            public function stateFilterFunc(item:Object):Boolean {
                return item.label >= "M" && item.label < "O";
            }
            
            /* Function to apply the filter function the ICollectionView. */
            public function filterAC():void {
                wrapper.filterFunction=stateFilterFunc;
                /* Refresh the collection view to apply the filter. */
                wrapper.refresh();
            }
 
            /* Function to Reset the view to its original state. */
            public function resetAC():void {
                wrapper.filterFunction=null;
                wrapper.sort=null;
                //Refresh the collection view.
                wrapper.refresh();
            }
 
        ]]>
    </mx:Script>
 
    <!−− An ArrayCollection with an array of objects. −−>
    <mx:ArrayCollection id="myAC">
        <mx:Array id="myArray">
            <mx:Object label="LA" data="Baton Rouge"/>
            <mx:Object label="NH" data="Concord"/>
            <mx:Object label="TX" data="Austin"/>
            <mx:Object label="MA" data="Boston"/>
            <mx:Object label="AZ" data="Phoenix"/>
            <mx:Object label="OR" data="Salem"/>
            <mx:Object label="FL" data="Tallahassee"/>
            <mx:Object label="MN" data="Saint Paul"/>
            <mx:Object label="NY" data="Albany"/>
        </mx:Array>
    </mx:ArrayCollection>
 
    <!-- Buttons to filter, sort, or reset the view in the second ComboBox
            control. -->
    <mx:HBox width="100%">
        <mx:Button id="sortButton" label="Sort" click="sortAC();"/>
        <mx:Button id="filterButton" label="Filter" click="filterAC();"/>
        <mx:Button id="resetButton" label="Reset" click="resetAC();"/>
    </mx:HBox>
    <mx:VBox width="550" borderStyle="solid" paddingTop="10" paddingLeft="10">
        <mx:Label text="This box retains original order and contents of the Array:"/>
        <!-- A ComboBox populated by the underlying Array object.
            This control shows that Array retains its original order. -->
        <mx:ComboBox id="cb2" rowCount="10" dataProvider="{myArray}"/>
        <mx:HRule/>
        <mx:Label text="This box reflects the changes to the Wrapper:"/>
        <!−− A ComboBox populated by the collection view of the Array. −−>
        <mx:ComboBox id="cb1" rowCount="10" dataProvider="{wrapper}"/>
        <mx:HRule/>
        <mx:Label text="This box reflects the changes to the ArrayCollection:"/>
        <!−− A ComboBox populated by the collection view of the Array. −−>
        <mx:ComboBox rowCount="10" dataProvider="{myAC}"/>
    </mx:VBox>
</mx:Application>

В результате получаем фильтрацию исключительно на уровне view. А модель живет своей счастливой и долгой жизнью. =)

Этот же подход можно использовать и при необходимости показывать одну и ту же коллекцию в разных контролах с разными фильтрами.


2010-01-12

15:03:00, Flex 2 & Co
Утечка памяти в IE 8
Столкнулся со следующей проблемой. Есть простое приложение, использующее ExternalInterface.addCallback:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
applicationComplete="appCompleteHandler();">
<mx:Script>
<![CDATA[
private function appCompleteHandler():void {
if (ExternalInterface.available) {
ExternalInterface.addCallback("getWidth", getWidth);
}
}

private function getWidth():Number {
return width;
}
]]>
</mx:Script>
</mx:Application>

Флешка вставлена через swfobject. В IE8 при перезагрузке страницы видно, что память отданная под страничку с флешом не освобождается, что приводит к падению браузера через несколько перезагрузок. Немного поискав, нашел в swfobject 2.2 метод:

swfobject.removeSWF(objElemIdStr)

Removes a SWF from your web page. Is especially built to safely (only remove a SWF after it has been loaded, to avoid broken references) and completely (nullify references to avoid memory leaks) remove a SWF in Internet Explorer.

И помогло :)

15:03:00, Flex 2 & Co
Утечка памяти в IE 8
Столкнулся со следующей проблемой. Есть простое приложение, использующее ExternalInterface.addCallback:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
applicationComplete="appCompleteHandler();">
<mx:Script>
<![CDATA[
private function appCompleteHandler():void {
if (ExternalInterface.available) {
ExternalInterface.addCallback("getWidth", getWidth);
}
}

private function getWidth():Number {
return width;
}
]]>
</mx:Script>
</mx:Application>

Флешка вставлена через swfobject. В IE8 при перезагрузке страницы видно, что память отданная под страничку с флешом не освобождается, что приводит к падению браузера через несколько перезагрузок. Немного поискав, нашел в swfobject 2.2 метод:

swfobject.removeSWF(objElemIdStr)

Removes a SWF from your web page. Is especially built to safely (only remove a SWF after it has been loaded, to avoid broken references) and completely (nullify references to avoid memory leaks) remove a SWF in Internet Explorer.

И помогло :)

2010-01-06

22:05:00, Flash-разработка
Знакомство с Mate

Вступление.

Этот пост начал свое существование 7 месяцев назад. Именно тогда я решил взять на вооружение Mate Flex Framework. Но злостный непрекращающийся дидлайн никак не давал мне закончить статью. Год выдался трудным и на работе и дома (в конце ноября у нас родился 3й ребятёнок). Сейчас, на праздниках (Всех с Новым Годом и Рождеством!) появилась свободная минутка, чтобы оглянуться назад.

Начало этого поста писалось в режиме осваивания Mate, т.е. с распухающим мозгом, силящимся понять принципы фреймворка и пытающимся подстроиться под новый стиль программирования. Затем, втягиваясь, я понемногу добавлял небольшие комментарии (курсивом) и заметки. Сейчас я просто всё это немного причешу, добавлю небольшие комментарии, подведу итоги, и увидим, что получится.

Забегая вперед, хочу с удовольствием отметить, что освоение прошло успешно и пол-десятка проектов были запущены на каркасе Mate.

Теоретическое знакомство с Mate

Наконец-то у меня появилось время копнуть Mate.
И начну я с того, чтобы удостовериться в правильности выбора.

  • Мне, как Flex-разработчику, Mate в первую очередь интересен тем, что это фреймворк, базирующийся на Flex.
  • Очень хочется меньше кодить, но иметь при этом наглядный и прозрачный код.
  • Понятная документация, обучение и примеры. Теперь посмотрим, какие фреймворки сравнивают и что о них думают:
    - Здесь - presentation сравниваются Cairngorm, Mate и PureMVC. Забавно, что количество доводов "против" для Mate меньше чем для остальных.
    - Довольно объемная статья: FrameworkQuest 2008, а точнее, заключительная часть исследования фреймворков. Почти во всех качествах, Mate выигрывает.
  • Последним аргументом будет личный опыт. Приступим к тестовому проекту.

Для начала посмотрим видео: Mate Helloworld. Впечатления позитивные. Всё довольно очевидно и изящно. Здесь рассказывают про Mate на примере работы с простейшим сервисом при использовании AMFPHP. Мне это дело так понравилось, что я решил немедленно себе поставить эту штуку - но об этом позже.

А пока - продолжаем изучать Mate. Читаем про Mate на Go!Verla Flex Blog:

Теперь, когда достаточно изучен хороший пример, почитаем документацию, и особенно, раздел Tags.

Все эти статьи действительно здорово помогли освоить Mate, и особенно наличием исходного кода. На сайте Mate также есть куча примеров с исходниками, которые здорово помогли понять основы и принципы.


Неудачно перехожу от теории к практике

Пока изучал Mate, решил испробовать на реальном проекте (проект небольшой многослойной карты с маркерами и с подгрузкой данных). Подготовил все компоненты к виду Model/View и... всё получилось само собой, но только без Mate. На байндинге и событиях. Делаем вывод - Mate не для простых проектов. Точнее, не имеет смысла его использовать в простых проектах. Хотя, в примерах числятся очень простые приложения типа "Weather Widget".

Сейчас, оглядываясь на этот проект, я понимаю, что сделать его на Mate было бы очень удобно и просто. Но принципы Mate требуют изменить свои устоявшиеся привычки разработки. На тот момент я еще не был готов к этому.

Кстати, хочу отметить, что мое решение ничуть не проиграло бы Mate-решению. Чисто-Flex-разработка обладает богатым набором возможностей, и вовсе не обязательно всем сломя голову пересаживаться на Mate. Но попробовать, точно, стоит.


Создаю проект Mate

Но меня просто переполняет желание освоить этот фреймворк. Попробую начать с нуля.
Для начала, создаю проект (обычный). В папку libs скачиваю свежий SWC.

Теперь хорошо бы создать структуру пакетов (проще говоря, папок) проекта. После обзора примеров, выявляется устоявшаяся структура:

Основной пакет проекта помещается в папку:
src/[org, com, ru, ....]/[name, company-name, nick-name, ...]/[project name]

В проекте содержатся следующие пакеты:

  • business. Классы, которые определяют модель поведения приложения. Это классы, которые как правило наследуются от EventDispatcher или не наследуются совсем. Они выполняют различные действия по инициализации, обработке данных и пр.
  • events. Классы событий. Назначение их понятно - передача команд и данных.
  • extensions. Классы, представляющие собой расширения классов Mate. Собственно, расширяют функционал Mate для конкретных целей приложения. Таковых, в средне-обычном проекте вообще не бывает.
  • maps. Здесь размещаются карты событий EventMap. Содержат обработчики событий EventHandlers, Injectors.
  • views. Классы и компоненты, представляющие UI и всё что с ним связано - в общем, занимаются вводом и отображением данных.
  • vos. Классы объектов данных (Value Object). Это классы, наследники EventDispatcher, с набором bindable-свойств, представлюящих данные объекта. VO не должны ничего делать кроме как получать и выдавать свои данные.

Само собой разумеется, что каждый волен пользоваться собственной структурой. Но по мне, так лучше присоединиться к общественности и следовать какому-то общему правилу. Хотя бы самому обобщенно общему. Для лучшего понимания собственного и чужого кода.

Такая структура хорошо подходит для относительно простого проекта. Однако, работая над крупным проектом, я убедился, что этого мало. Нужна также смысловая структуризация. То есть, в пакете проекта я располагаю пакеты функционально обособленных модулей, а уже каждый пакет модуля содержит обозначенную выше структуру. Общие для всех модулей сущности складируются в пакет "common". Такой способ особенно оправдан в проектах с использованием подгружаемых модулей.

Первое Mate-приложение

А о чем будет наше приложение? После некоторых изысканий, я окончательно убедился, что фреймворк рассчитан на работу с данными.

Позже я делал настраиваемый анимационный движок для виджета, где данные играли не самую первую роль, но, всё же, в приложениях без необходимости обработки данных Mate действительно не нужен.

И тут подвернулся как раз подходящий проект - еще одна интерактивная карта с подгружаемыми данными маркеров и списка объектов. Ну теперь нужно не облажаться и все-же применить новое учение.

Опишу приблизительный процесс создания приложения с использованием Mate. Все действующие лица не вымышлены, но и приводятся не в полном составе, без усложнений, связанных с особенностями проекта.

1. Создаем все Views

Их у меня получилось два:

  • первый - вывод карты с маркерами (LayerView.mxml),
  • второй - списки информации по объектам карты (InformationView.mxml).

Экраны оформляю так, чтобы все детали ушли в компоненты, а полученные компоненты "плавали на поверхности".

Таким образом, InformationView содержит компоненты:

  • InformationPanel - панель списка объектов карты
  • RouteSelectionPanel - панель выбора варианта маршрута

Каждый из них имеет dataProvider, в который передается список данных объектов карты informationDataProvider и список маршрутов routesDataProvider.

А LayerView содержит компоненты:

  • LayerContent - графическое содержимое карты (имеет selectedRoute - текущий вариант маршрута - ID клипа, который выводится на карте в данный момент)
  • MarkerSet - слой с множеством маркеров (имеет dataProvider)

Всё это лежит в папке views.

2. Создаем VO

Теперь создадим объекты данных, которые будут выводить наши views. Это обычные потомки EventDispatcher с Bindable-свойствами:

  • InstitutionVO - объект, описывающий организацию (дом) на карте (id, название, координаты маркера)
  • RouteVO - объект, описывающий маршрут на карте (id клипа, название маршрута)

Размещаем их в папке vos.

3. Создаем файлы данных

Имея представление о данных, которые мы выводим, можно создать XML-файл с данными. Данные будем получать по HTTP-запросу, и нам не важно, будет ли их кто-то генерировать или это будет простой XML файл. Сейчас главное, чтобы наше приложение их получало, обрабатывало и выводило. Создаю в src папку data, в которой размещаю XML-файл с данными. Структуру выбираю произвольно - так как мне удобно - тех-требований на формат обмена данными нет, поэтому их диктую я сам. URL файла данных приложение получает через переменные FlashVars (без подробностей).

4. Создаем поставщиков данных

InformationDataProvider - так я его назвал. Он получает загруженные данные, обрабатывает их и размещает у себя. Собственно, этим занимается его метод aquire(data:XML), который помещает данные в полях:

  • information:ArrayCollection - список объектов InstitutionVO,
  • routes:ArrayCollection - список объектов RouteVO.
В случае ошибки при разборе данных, или сервер возвратил информацию об ошибке, поставщик генерирует событие, информирующее об ошибке - SettingsEvent.SETTINGS_ERROR. В случае успеха - событие успешного получения данных SettingsEvent.SETTINGS_SUCCESS.

События из классов, не являющихся компонентами приложения, нужно генерировать через специальный, предусмотренный в Mate, класс Dispatcher. Тогда они будут отрабатываться в картах событий EventMap.
Размещаем его в папке business.


5. Создаем события и карты событий

В папке maps создаем InjectionMap.mxml, в котором размещаем теги Injectors, связывающие information (из InformationDataProvider) и informationDataProvider (из InformationView и LayerView), и аналогично для routes - routesDataProvider. Как только InformationDataProvider получит данные и установит их в information и routes - они тут же попадут по средством связывания (binding) в соответствующие поля InformationView и LayerView и будут отображены их компонентами в окне приложения.

Другая карта событий - MainEventMap.mxml - содержит обработчики событий. Такие инструменты как HTTPServiceInvoker и т.п. прекрасно заменяют рутинные классы отправки/получения данных. Обрабатываются все основные FlexEvent-события, которые позволяют обрабатывать инициализацию приложения и его готовность к работе. Чтобы событие улавливалось картой событий, оно должно иметь параметр по умолчанию bubbles:Boolean=true.
Итак, наша карта событий улавливает в контейнере EventHandlers событие FlexEvent.APPLICATION_COMPLETE и отправляет HTTP-запрос (HTTPServiceInvoker) на получение конфигурации. Не забываем указать resultFormat="e4x", чтобы полученные данные были представлены в виде XML. В разделе обработчиков resultHandlers помещаем MethodInvoker с вызовом нашего метода aquire, у которого resultObject указан в аргументах. В раздел faultHandlers помещаем обработчики ошибки запроса.

Теги с картами событий InjectionMap и MainEventMap обязательно помещаем в корне приложения.

Заметки

В общих чертах - как-то так. К сожалению, у меня нет возможности оформить это приложение в туториал с исходниками (эх, дидлайны-дидлайны), но надеюсь, идею Mate я немножко смог передать.

Столкнулся со следующими проблемами:

1. id в Request. Если я хочу передать в HTTPServiceInvoker, в Request переменную id - у меня проблема. В MXML id - это имя инстанцируемого объекта. В обсуждении предлагается использовать для этих целей параметр _id, но это не помогает - с запросом отправляется чепуха. Выход - не именовать так переменные (даже сильно поругался из-за этого с сервер-разработчиком).
2. source в EventHandlers. Переменные с именем source ведут как-то странно в обработчиках событий. Несколько раз ловил в них не действительное значение, а что-то вроде строки "Event". Непонятна причина такой особенности, поэтому, опять-таки, лучше избегать таких имен.
3. События. Не сильно проблемная особенность, но все же - нельзя модифицировать параметры конструктора события - добавлять и менять порядок следования параметров.

* * *

Работая с flex-модулями (Module), убедился, что Mate следует использовать очень осторожно. Лично я так и не понял, как сделать так, чтобы модуль выгружался и убивался GC.
Взаимодействие модулей с главным приложением производится успешно, однако, выгруженные модули продолжают ловить события.
Следуя инструкциям и собственным экспериментам, я постарался сделать модули как можно более автономными и создал следующую структуру:
1. Каждый модуль имеет свои карты событий. По возможности, я старался сделать их локальными (LocalEventMap). Однако, карты, которые работают с событиями главного приложения не могут являться таковыми, да и вообще - не очень то с ними всё сложилось.
2. События, которые используются и основным приложением и модулями выделены в отдельный пакет. Обработка и отправка событий в/из модуля вынесены в отдельные карты событий.
3. Перекрыл класс Module - каждый модуль при удалении из Stage подчищает в своих картах событий все возможные связи.

После таких действий, выгруженные модули теряют интерес к событиям приложения, однако, сомневаюсь, что они удаляются из памяти - есть угроза утечки памяти. Виновен ли в этом я, или Mate или вообще Flex - сказать трудно. Остается полагаться на то, что смена модуля не столь частая операция (я использую flex-модули в качестве "страниц" flash-сайта), чтобы съесть всю память во время просмотра сайта.

* * *

Общее впечатление

Mate упрощает разработку, но усложняет логику.
Многие вещи лучше визуализируются, работа с событиями выносится в отдельные блоки, повышается наглядность, а связность кода уменьшается. Превосходно решается задача отделения представления от логики - задача любого фреймворка, особенно для flash.
Возможность легкого надстраивания приложения - огромный плюс Mate. Если работа с событиями в приложении изначально организована правильно, добавлять новые программные возможности легче простого. Я без труда добавил возможности дип-линкинга SWFAddress, или встроил приложение в Zinc.

Однако, есть и обратная сторона. Логически связанные сущности разрываются, когда выносятся в карты событий. Рабочий процесс приложения рассредоточивается по файлам разного формата, в картах событий методы вызываются непривычным способом, имена их указываются как строки, а аргументы - как массивы, что мешает автокомплиту и компилятору помогать и контролировать процесс разработки. Да и на читабельности и понятности кода это сильно сказывается, и не в лучшую сторону. Я вообще молчу об удобстве отладки такого приложения. Всё построено на связывании (binding) и событиях, а всем известно - это злые враги дебагера.

При попытке как-то сохранить связность сущностей, я стараюсь группировать классы в обособленные пакеты, общающиеся друг с другом посредством общих событий. Это помогает сохранить логически стройное представление сущностей, но увеличивает количество файлов. Зачастую, файлы при этом просто дублируются, лишь с заменой имен событий и переменных. Особенно это касается бурного размножения классов событий. В итоге, простой проект выглядит красиво, но сложный - громоздко. С другой стороны, простое приложение легче сделать красивым чем сложное, которое в любом случае будет громоздким и потребует больших умственных затрат.

Итак, Mate - превосходный инструмент. Не скажу, что он сильно ускоряет разработку. Время, сэкономленное на рутине, легко тратится на вспухание мозга, пытающегося объять логику, заключенную в куче файлов, а так же на ловлю своих же багов (а иногда и багов Mate). Но, должен отметить, что всё зависит от опыта разработчика и правильного проектирования приложения.
И главное - как и любой другой фреймворк, Mate дает прочный каркас приложению, быстрый старт разработки, помогает больше сосредоточиться на логике приложения, не отвлекаясь на рутину.


22:05:00, Flash-разработка
Знакомство с Mate

Вступление.

Этот пост начал свое существование 7 месяцев назад. Именно тогда я решил взять на вооружение Mate Flex Framework. Но злостный непрекращающийся дидлайн никак не давал мне закончить статью. Год выдался трудным и на работе и дома (в конце ноября у нас родился 3й ребятёнок). Сейчас, на праздниках (Всех с Новым Годом и Рождеством!) появилась свободная минутка, чтобы оглянуться назад.

Начало этого поста писалось в режиме осваивания Mate, т.е. с распухающим мозгом, силящимся понять принципы фреймворка и пытающимся подстроиться под новый стиль программирования. Затем, втягиваясь, я понемногу добавлял небольшие комментарии (курсивом) и заметки. Сейчас я просто всё это немного причешу, добавлю небольшие комментарии, подведу итоги, и увидим, что получится.

Забегая вперед, хочу с удовольствием отметить, что освоение прошло успешно и пол-десятка проектов были запущены на каркасе Mate.

Теоретическое знакомство с Mate

Наконец-то у меня появилось время копнуть Mate.
И начну я с того, чтобы удостовериться в правильности выбора.

  • Мне, как Flex-разработчику, Mate в первую очередь интересен тем, что это фреймворк, базирующийся на Flex.
  • Очень хочется меньше кодить, но иметь при этом наглядный и прозрачный код.
  • Понятная документация, обучение и примеры. Теперь посмотрим, какие фреймворки сравнивают и что о них думают:
    - Здесь - presentation сравниваются Cairngorm, Mate и PureMVC. Забавно, что количество доводов "против" для Mate меньше чем для остальных.
    - Довольно объемная статья: FrameworkQuest 2008, а точнее, заключительная часть исследования фреймворков. Почти во всех качествах, Mate выигрывает.
  • Последним аргументом будет личный опыт. Приступим к тестовому проекту.

Для начала посмотрим видео: Mate Helloworld. Впечатления позитивные. Всё довольно очевидно и изящно. Здесь рассказывают про Mate на примере работы с простейшим сервисом при использовании AMFPHP. Мне это дело так понравилось, что я решил немедленно себе поставить эту штуку - но об этом позже.

А пока - продолжаем изучать Mate. Читаем про Mate на Go!Verla Flex Blog:

Теперь, когда достаточно изучен хороший пример, почитаем документацию, и особенно, раздел Tags.

Все эти статьи действительно здорово помогли освоить Mate, и особенно наличием исходного кода. На сайте Mate также есть куча примеров с исходниками, которые здорово помогли понять основы и принципы.


Неудачно перехожу от теории к практике

Пока изучал Mate, решил испробовать на реальном проекте (проект небольшой многослойной карты с маркерами и с подгрузкой данных). Подготовил все компоненты к виду Model/View и... всё получилось само собой, но только без Mate. На байндинге и событиях. Делаем вывод - Mate не для простых проектов. Точнее, не имеет смысла его использовать в простых проектах. Хотя, в примерах числятся очень простые приложения типа "Weather Widget".

Сейчас, оглядываясь на этот проект, я понимаю, что сделать его на Mate было бы очень удобно и просто. Но принципы Mate требуют изменить свои устоявшиеся привычки разработки. На тот момент я еще не был готов к этому.

Кстати, хочу отметить, что мое решение ничуть не проиграло бы Mate-решению. Чисто-Flex-разработка обладает богатым набором возможностей, и вовсе не обязательно всем сломя голову пересаживаться на Mate. Но попробовать, точно, стоит.


Создаю проект Mate

Но меня просто переполняет желание освоить этот фреймворк. Попробую начать с нуля.
Для начала, создаю проект (обычный). В папку libs скачиваю свежий SWC.

Теперь хорошо бы создать структуру пакетов (проще говоря, папок) проекта. После обзора примеров, выявляется устоявшаяся структура:

Основной пакет проекта помещается в папку:
src/[org, com, ru, ....]/[name, company-name, nick-name, ...]/[project name]

В проекте содержатся следующие пакеты:

  • business. Классы, которые определяют модель поведения приложения. Это классы, которые как правило наследуются от EventDispatcher или не наследуются совсем. Они выполняют различные действия по инициализации, обработке данных и пр.
  • events. Классы событий. Назначение их понятно - передача команд и данных.
  • extensions. Классы, представляющие собой расширения классов Mate. Собственно, расширяют функционал Mate для конкретных целей приложения. Таковых, в средне-обычном проекте вообще не бывает.
  • maps. Здесь размещаются карты событий EventMap. Содержат обработчики событий EventHandlers, Injectors.
  • views. Классы и компоненты, представляющие UI и всё что с ним связано - в общем, занимаются вводом и отображением данных.
  • vos. Классы объектов данных (Value Object). Это классы, наследники EventDispatcher, с набором bindable-свойств, представлюящих данные объекта. VO не должны ничего делать кроме как получать и выдавать свои данные.

Само собой разумеется, что каждый волен пользоваться собственной структурой. Но по мне, так лучше присоединиться к общественности и следовать какому-то общему правилу. Хотя бы самому обобщенно общему. Для лучшего понимания собственного и чужого кода.

Такая структура хорошо подходит для относительно простого проекта. Однако, работая над крупным проектом, я убедился, что этого мало. Нужна также смысловая структуризация. То есть, в пакете проекта я располагаю пакеты функционально обособленных модулей, а уже каждый пакет модуля содержит обозначенную выше структуру. Общие для всех модулей сущности складируются в пакет "common". Такой способ особенно оправдан в проектах с использованием подгружаемых модулей.

Первое Mate-приложение

А о чем будет наше приложение? После некоторых изысканий, я окончательно убедился, что фреймворк рассчитан на работу с данными.

Позже я делал настраиваемый анимационный движок для виджета, где данные играли не самую первую роль, но, всё же, в приложениях без необходимости обработки данных Mate действительно не нужен.

И тут подвернулся как раз подходящий проект - еще одна интерактивная карта с подгружаемыми данными маркеров и списка объектов. Ну теперь нужно не облажаться и все-же применить новое учение.

Опишу приблизительный процесс создания приложения с использованием Mate. Все действующие лица не вымышлены, но и приводятся не в полном составе, без усложнений, связанных с особенностями проекта.

1. Создаем все Views

Их у меня получилось два:

  • первый - вывод карты с маркерами (LayerView.mxml),
  • второй - списки информации по объектам карты (InformationView.mxml).

Экраны оформляю так, чтобы все детали ушли в компоненты, а полученные компоненты "плавали на поверхности".

Таким образом, InformationView содержит компоненты:

  • InformationPanel - панель списка объектов карты
  • RouteSelectionPanel - панель выбора варианта маршрута

Каждый из них имеет dataProvider, в который передается список данных объектов карты informationDataProvider и список маршрутов routesDataProvider.

А LayerView содержит компоненты:

  • LayerContent - графическое содержимое карты (имеет selectedRoute - текущий вариант маршрута - ID клипа, который выводится на карте в данный момент)
  • MarkerSet - слой с множеством маркеров (имеет dataProvider)

Всё это лежит в папке views.

2. Создаем VO

Теперь создадим объекты данных, которые будут выводить наши views. Это обычные потомки EventDispatcher с Bindable-свойствами:

  • InstitutionVO - объект, описывающий организацию (дом) на карте (id, название, координаты маркера)
  • RouteVO - объект, описывающий маршрут на карте (id клипа, название маршрута)

Размещаем их в папке vos.

3. Создаем файлы данных

Имея представление о данных, которые мы выводим, можно создать XML-файл с данными. Данные будем получать по HTTP-запросу, и нам не важно, будет ли их кто-то генерировать или это будет простой XML файл. Сейчас главное, чтобы наше приложение их получало, обрабатывало и выводило. Создаю в src папку data, в которой размещаю XML-файл с данными. Структуру выбираю произвольно - так как мне удобно - тех-требований на формат обмена данными нет, поэтому их диктую я сам. URL файла данных приложение получает через переменные FlashVars (без подробностей).

4. Создаем поставщиков данных

InformationDataProvider - так я его назвал. Он получает загруженные данные, обрабатывает их и размещает у себя. Собственно, этим занимается его метод aquire(data:XML), который помещает данные в полях:

  • information:ArrayCollection - список объектов InstitutionVO,
  • routes:ArrayCollection - список объектов RouteVO.
В случае ошибки при разборе данных, или сервер возвратил информацию об ошибке, поставщик генерирует событие, информирующее об ошибке - SettingsEvent.SETTINGS_ERROR. В случае успеха - событие успешного получения данных SettingsEvent.SETTINGS_SUCCESS.

События из классов, не являющихся компонентами приложения, нужно генерировать через специальный, предусмотренный в Mate, класс Dispatcher. Тогда они будут отрабатываться в картах событий EventMap.
Размещаем его в папке business.


5. Создаем события и карты событий

В папке maps создаем InjectionMap.mxml, в котором размещаем теги Injectors, связывающие information (из InformationDataProvider) и informationDataProvider (из InformationView и LayerView), и аналогично для routes - routesDataProvider. Как только InformationDataProvider получит данные и установит их в information и routes - они тут же попадут по средством связывания (binding) в соответствующие поля InformationView и LayerView и будут отображены их компонентами в окне приложения.

Другая карта событий - MainEventMap.mxml - содержит обработчики событий. Такие инструменты как HTTPServiceInvoker и т.п. прекрасно заменяют рутинные классы отправки/получения данных. Обрабатываются все основные FlexEvent-события, которые позволяют обрабатывать инициализацию приложения и его готовность к работе. Чтобы событие улавливалось картой событий, оно должно иметь параметр по умолчанию bubbles:Boolean=true.
Итак, наша карта событий улавливает в контейнере EventHandlers событие FlexEvent.APPLICATION_COMPLETE и отправляет HTTP-запрос (HTTPServiceInvoker) на получение конфигурации. Не забываем указать resultFormat="e4x", чтобы полученные данные были представлены в виде XML. В разделе обработчиков resultHandlers помещаем MethodInvoker с вызовом нашего метода aquire, у которого resultObject указан в аргументах. В раздел faultHandlers помещаем обработчики ошибки запроса.

Теги с картами событий InjectionMap и MainEventMap обязательно помещаем в корне приложения.

Заметки

В общих чертах - как-то так. К сожалению, у меня нет возможности оформить это приложение в туториал с исходниками (эх, дидлайны-дидлайны), но надеюсь, идею Mate я немножко смог передать.

Столкнулся со следующими проблемами:

1. id в Request. Если я хочу передать в HTTPServiceInvoker, в Request переменную id - у меня проблема. В MXML id - это имя инстанцируемого объекта. В обсуждении предлагается использовать для этих целей параметр _id, но это не помогает - с запросом отправляется чепуха. Выход - не именовать так переменные (даже сильно поругался из-за этого с сервер-разработчиком).
2. source в EventHandlers. Переменные с именем source ведут как-то странно в обработчиках событий. Несколько раз ловил в них не действительное значение, а что-то вроде строки "Event". Непонятна причина такой особенности, поэтому, опять-таки, лучше избегать таких имен.
3. События. Не сильно проблемная особенность, но все же - нельзя модифицировать параметры конструктора события - добавлять и менять порядок следования параметров.

* * *

Работая с flex-модулями (Module), убедился, что Mate следует использовать очень осторожно. Лично я так и не понял, как сделать так, чтобы модуль выгружался и убивался GC.
Взаимодействие модулей с главным приложением производится успешно, однако, выгруженные модули продолжают ловить события.
Следуя инструкциям и собственным экспериментам, я постарался сделать модули как можно более автономными и создал следующую структуру:
1. Каждый модуль имеет свои карты событий. По возможности, я старался сделать их локальными (LocalEventMap). Однако, карты, которые работают с событиями главного приложения не могут являться таковыми, да и вообще - не очень то с ними всё сложилось.
2. События, которые используются и основным приложением и модулями выделены в отдельный пакет. Обработка и отправка событий в/из модуля вынесены в отдельные карты событий.
3. Перекрыл класс Module - каждый модуль при удалении из Stage подчищает в своих картах событий все возможные связи.

После таких действий, выгруженные модули теряют интерес к событиям приложения, однако, сомневаюсь, что они удаляются из памяти - есть угроза утечки памяти. Виновен ли в этом я, или Mate или вообще Flex - сказать трудно. Остается полагаться на то, что смена модуля не столь частая операция (я использую flex-модули в качестве "страниц" flash-сайта), чтобы съесть всю память во время просмотра сайта.

* * *

Общее впечатление

Mate упрощает разработку, но усложняет логику.
Многие вещи лучше визуализируются, работа с событиями выносится в отдельные блоки, повышается наглядность, а связность кода уменьшается. Превосходно решается задача отделения представления от логики - задача любого фреймворка, особенно для flash.
Возможность легкого надстраивания приложения - огромный плюс Mate. Если работа с событиями в приложении изначально организована правильно, добавлять новые программные возможности легче простого. Я без труда добавил возможности дип-линкинга SWFAddress, или встроил приложение в Zinc.

Однако, есть и обратная сторона. Логически связанные сущности разрываются, когда выносятся в карты событий. Рабочий процесс приложения рассредоточивается по файлам разного формата, в картах событий методы вызываются непривычным способом, имена их указываются как строки, а аргументы - как массивы, что мешает автокомплиту и компилятору помогать и контролировать процесс разработки. Да и на читабельности и понятности кода это сильно сказывается, и не в лучшую сторону. Я вообще молчу об удобстве отладки такого приложения. Всё построено на связывании (binding) и событиях, а всем известно - это злые враги дебагера.

При попытке как-то сохранить связность сущностей, я стараюсь группировать классы в обособленные пакеты, общающиеся друг с другом посредством общих событий. Это помогает сохранить логически стройное представление сущностей, но увеличивает количество файлов. Зачастую, файлы при этом просто дублируются, лишь с заменой имен событий и переменных. Особенно это касается бурного размножения классов событий. В итоге, простой проект выглядит красиво, но сложный - громоздко. С другой стороны, простое приложение легче сделать красивым чем сложное, которое в любом случае будет громоздким и потребует больших умственных затрат.

Итак, Mate - превосходный инструмент. Не скажу, что он сильно ускоряет разработку. Время, сэкономленное на рутине, легко тратится на вспухание мозга, пытающегося объять логику, заключенную в куче файлов, а так же на ловлю своих же багов (а иногда и багов Mate). Но, должен отметить, что всё зависит от опыта разработчика и правильного проектирования приложения.
И главное - как и любой другой фреймворк, Mate дает прочный каркас приложению, быстрый старт разработки, помогает больше сосредоточиться на логике приложения, не отвлекаясь на рутину.



2009-12-08

15:31:10, RIA crumbs
Flash Builder 4: Проблема с запуском приложения из Flex Builder 3

Столкнулся с проблемой запуска добавленных, не созданных в этом же билдере, mxml application файлов в проект.

решение описал в Flex Cookbook


15:31:10, RIA crumbs
Flash Builder 4: Проблема с запуском добавленного mxml приложения

Столкнулся с проблемой запуска добавленных, не созданных в этом же билдере, mxml application файлов в проект.

решение описал в Flex Cookbook


2009-10-26

13:03:48, Flash-ripper.com
Двухдневный марафон завершен: субботний флекс во Львове плюс воскресный флэш в Киеве

Во Львове мы имели пиковые по плотности флекс-доклады. Первый, "Практики большого флекс-проекта" от Андрея Табачина из EPAM Systems, занял 2,5 часа, как мы и рассчитывали. Вообще, эта конфа отличилась точностью: почти 100% явка регистрантов, пунктуальность всех участников и докладчиков. Было много, трудно и интересно. Во втором докладе, "Создание Spark-компонентов" от Андрея Процика из EPAM, стало ясно, как Code Behind мутировал во Flex 4: было наследование, а стала композиция MXML-класса скина и AS3 класса логики. Так что теперь к нему будет меньше претензий в духе "родитель обращается к свойствам ребенка, это же антипаттерн". Два этих основных доклада перемежались двумя "разгрузочными": "Управление рисками для разработчика" от Олега Керницкого (экспромт) и "Что я узнал от моей новой флекс-команды", который сделал я.

На афтепати в клубе "Культ" свершился сакральный контакт челябинских флексеров (1 чел) с флексерами из Ивано-Франковска (5 чел). Было точно установлено, что и уральские, и западно-украинские флексеры имеют дружелюбное человеческое обличье и темы для обсуждения. Всего я не слышал, но видел интерес. Люди из Ивано-Франковска показались мне еще немного более сдержанными, чем львовяне. Но если с ними заговорить, то за сдержаностью видна природная энергия. Карпаты...

По результатам Львовской встречи в тамбуре поезда "Львов-Киев" состоялся беспрецедентный, самый жаркий и длительный на моей памяти холивор на тему "Код бихайнд, нужен ли он". Для себя я понял, что точного определения код бихайнда не знает никто. Основная ошибка отрицающих код бихайнд в том, что они ищут в нем сакральный смысл (или Истину?), терпят естественную неудачу и потом обвиняют в ней кодбихайнд. В то время как всесь смысл кодбихайнда выражен в его названии, и видов его может быть множество. Незамороченные кодбихайндеры обычно довольны его предсказуемым поведением. И на этом все. Холивор длился часа 3. Традиционно похоливорили на тему "Синглтон, ты — Зло", осудили злоупотребление, неофитство, профанацию и деградацию образования программистов. Расходились спать довольные, впереди был Киев.

Такого флекса мы еще не докладывали, холивора такого — не холиворили. Спасибо тебе, Львов! И EPAM Systems — спасибо. Отдельное. Именно всего такого сурового и хотелось, и мы сделали это, йоу!

В Киеве, сойдя с поезда и позавтракав, мы отправились на конфу, где успели на завершение презентации разработчиков "Счастливого фермера". Затем Виталий Хить сделал доклад "Минимальные UI-компоненты" (как частное лицо) и сразу после него — "Как реально срубить бабла на социальных играх" (названия докладов привожу по мутирующей памяти, простите). И вот: снова Хить порубил нас на части живыми спичами с анализом факторов и рисков. Затем был доклад о поисках путей в лабиринтах от Владимира Кожаева. Потом Хитрый в очередной раз сразил нас мастерклассом, это была техника создания игры-платформера. Вот уж кто настоящий флэшер — так это Хитрый. Такого адекватного подхода к существующим инструментам хочется желать всем. Полный фэншуй. Удивительная харизма. Спасибо тебе, Денис.

Мы кулуарно обсудили PureMVC и немного Mate. В ходе обсуждения я понял, что часто задаваемый вопрос "где применять PureMVC" некорректен. Не "где", а "кому" применять PureMVC — вот что важнее! Почему: фреймворк PureMVC очень акцентирован идеологически. Его создатель — академик ООП, и это видно по самому фреймворку и документации к нему, даже по названию. Отсюда вывод: PureMVC рекомендуется адептам акдемического подхода. Поклонникам нордического, строгого и безжалостного к слабостям индивидуальных разработчиков ООП. Перфекционистам, которые хотят не только делать проект, но и превращать его в Памятник Программной Архитектуры для Восхищения и Поклонения ценителями и знатоками. Уверен, что лучшие результаты PureMVC даст именно в руках таких людей, которые способны его расширять конкретно для своего проекта, например, типизировав Оповещения. Избавившись от всего нетипизированного и соорудив Идеальный ООП- Аппарат для Этого Конкретного Проекта. Короче говоря: осмысленное превращение абстрактного PutreMVC в конкретное MyPureMVC даст адептам ООП лучший результат и наслаждение. Остальным даст головную боль. И больше тут не о чем спорить.

В этом идеологическая противоположность PureMVC с Mate: теплым, немного разболтанным таким фреймворчиком, в котором нетипизированность неустранима в принципе, и в том нет нужды. Это фреймворки, созданные противоположными человеческими психотипами, и это нужно учитывать при выборе. Нужно понимать, что когда в самом начале презентации Mate у Лоры Аргуэльо зависает презентуемое приложение, то она говорит "упс" и не вырезает єто из видео, так оно и идет в историю и на сайт Adobe. А ее напарник Нахуэль пишет прямо в конструкторе: "знаю, что здесь у меня полная лажа, но ничего лучше не смог родить, если знаете, пишите на почту". Легкость в отношении к жизни — это Mate.

Еще один вывод по фреймворкам: они даны нам, чтобы опробовать заложенные в них концепции и практики, увидеть недостатки, взять из них лучшее и потом решать, что делать дальше. Использовать или нет. Только практика, личные ошибки и анализ результатов дают настоящее понимание, меньше теорий — к делу!

В самом конце молодой отец, поздравляем! и изобретатель Олег Галабурда представил свои необычные разработки и творения, от мультибайтового упаковщика данных до караоке-системы. Темы были интересные, но чувствовалась подусталость: пятый доклад, несколько частей! На том и покончили с официальной частью. Мне показалось, что в Киеве было намного меньше людей, чем зарегистрировалось (56). Зря не пришли. Кстати, а во Львове секьюрити сегодня сообщило мне, что в воскресенье (25 числа) приходили какие-то люди на конфу во Львове. Странно, ведь везде было написано, что конфа — 25 октября. Кто были эти люди? Отпишитесь, пожалуйста.

На афтепати в Киеве мы видели Белую и она теперь пушиста. Также она набрала воды из Майдана, это такой фонтан в центре Киева. Также был частично развиртуализирован Makc3D, что вызвало живую реакцию сразу нескольких членов нашего движения. В частности, был развязан кармический вопрос экстрагирования звука в AS3 — Татьяна и Макс наконец увидели друг друга и тут же доразрулили ситуацию на красной салфетке. Мы много и часто фотографировали себя и тут же рассматривали фото, пораженные! Была минута, когда вспышки четырех камер создавали эффект стробоскопа.

В Киеве я понял, что люблю его просторы и стремительную ясность архитектурных линий. Вернувшись во Львов я вспомнил, как люблю его органическую природу, пятиугольные и треугольные комнаты, и артефакты в непрямых углах.

Организационные выводы, идеи по UAFPUG:

  1. Во Львове будет еще больше Флекс-конференций.
  2. Следующий, ноябрьский UAFPUG будет в г. Днепропетровск.
  3. Появилась идея проведения зимнего ITSki в Карпатах: неделю живем в домике, делаем доклады, жжем камины, обсуждаем, катаемся на лыжах, получаем удовольствие. Точим лыжи!

Это не отчет, а мои впечатления по горячим следам. Дополняйте или поправляйте в комменатариях Smile


13:03:48, Flash-ripper.com
Двухдневный марафон завершен: субботний флекс во Львове плюс воскресный флэш в Киеве

Во Львове мы имели пиковые по плотности флекс-доклады. Первый, "Практики большого флекс-проекта" от Андрея Табачина из EPAM Systems, занял 2,5 часа, как мы и рассчитывали. Вообще, эта конфа отличилась точностью: почти 100% явка регистрантов, пунктуальность всех участников и докладчиков. Было много, трудно и интересно. Во втором докладе, "Создание Spark-компонентов" от Андрея Процика из EPAM, стало ясно, как Code Behind мутировал во Flex 4: было наследование, а стала композиция MXML-класса скина и AS3 класса логики. Так что теперь к нему будет меньше претензий в духе "родитель обращается к свойствам ребенка, это же антипаттерн". Два этих основных доклада перемежались двумя "разгрузочными": "Управление рисками для разработчика" от Олега Керницкого (экспромт) и "Что я узнал от моей новой флекс-команды", который сделал я.

На афтепати в клубе "Культ" свершился сакральный контакт челябинских флексеров (1 чел) с флексерами из Ивано-Франковска (5 чел). Было точно установлено, что и уральские, и западно-украинские флексеры имеют дружелюбное человеческое обличье и темы для обсуждения. Всего я не слышал, но видел интерес. Люди из Ивано-Франковска показались мне еще немного более сдержанными, чем львовяне. Но если с ними заговорить, то за сдержаностью видна природная энергия. Карпаты...

По результатам Львовской встречи в тамбуре поезда "Львов-Киев" состоялся беспрецедентный, самый жаркий и длительный на моей памяти холивор на тему "Код бихайнд, нужен ли он". Для себя я понял, что точного определения код бихайнда не знает никто. Основная ошибка отрицающих код бихайнд в том, что они ищут в нем сакральный смысл (или Истину?), терпят естественную неудачу и потом обвиняют в ней кодбихайнд. В то время как всесь смысл кодбихайнда выражен в его названии, и видов его может быть множество. Незамороченные кодбихайндеры обычно довольны его предсказуемым поведением. И на этом все. Холивор длился часа 3. Традиционно похоливорили на тему "Синглтон, ты — Зло", осудили злоупотребление, неофитство, профанацию и деградацию образования программистов. Расходились спать довольные, впереди был Киев.

Такого флекса мы еще не докладывали, холивора такого — не холиворили. Спасибо тебе, Львов! И EPAM Systems — спасибо. Отдельное. Именно всего такого сурового и хотелось, и мы сделали это, йоу!

В Киеве, сойдя с поезда и позавтракав, мы отправились на конфу, где успели на завершение презентации разработчиков "Счастливого фермера". Затем Виталий Хить сделал доклад "Минимальные UI-компоненты" (как частное лицо) и сразу после него — "Как реально срубить бабла на социальных играх" (названия докладов привожу по мутирующей памяти, простите). И вот: снова Хить порубил нас на части живыми спичами с анализом факторов и рисков. Затем был доклад о поисках путей в лабиринтах от Владимира Кожаева. Потом Хитрый в очередной раз сразил нас мастерклассом, это была техника создания игры-платформера. Вот уж кто настоящий флэшер — так это Хитрый. Такого адекватного подхода к существующим инструментам хочется желать всем. Полный фэншуй. Удивительная харизма. Спасибо тебе, Денис.

Мы кулуарно обсудили PureMVC и немного Mate. В ходе обсуждения я понял, что часто задаваемый вопрос "где применять PureMVC" некорректен. Не "где", а "кому" применять PureMVC — вот что важнее! Почему: фреймворк PureMVC очень акцентирован идеологически. Его создатель — академик ООП, и это видно по самому фреймворку и документации к нему, даже по названию. Отсюда вывод: PureMVC рекомендуется адептам акдемического подхода. Поклонникам нордического, строгого и безжалостного к слабостям индивидуальных разработчиков ООП. Перфекционистам, которые хотят не только делать проект, но и превращать его в Памятник Программной Архитектуры для Восхищения и Поклонения ценителями и знатоками. Уверен, что лучшие результаты PureMVC даст именно в руках таких людей, которые способны его расширять конкретно для своего проекта, например, типизировав Оповещения. Избавившись от всего нетипизированного и соорудив Идеальный ООП- Аппарат для Этого Конкретного Проекта. Короче говоря: осмысленное превращение абстрактного PutreMVC в конкретное MyPureMVC даст адептам ООП лучший результат и наслаждение. Остальным даст головную боль. И больше тут не о чем спорить.

В этом идеологическая противоположность PureMVC с Mate: теплым, немного разболтанным таким фреймворчиком, в котором нетипизированность неустранима в принципе, и в том нет нужды. Это фреймворки, созданные противоположными человеческими психотипами, и это нужно учитывать при выборе. Нужно понимать, что когда в самом начале презентации Mate у Лоры Аргуэльо зависает презентуемое приложение, то она говорит "упс" и не вырезает єто из видео, так оно и идет в историю и на сайт Adobe. А ее напарник Нахуэль пишет прямо в конструкторе: "знаю, что здесь у меня полная лажа, но ничего лучше не смог родить, если знаете, пишите на почту". Легкость в отношении к жизни — это Mate.

Еще один вывод по фреймворкам: они даны нам, чтобы опробовать заложенные в них концепции и практики, увидеть недостатки, взять из них лучшее и потом решать, что делать дальше. Использовать или нет. Только практика, личные ошибки и анализ результатов дают настоящее понимание, меньше теорий — к делу!

В самом конце молодой отец, поздравляем! и изобретатель Олег Галабурда представил свои необычные разработки и творения, от мультибайтового упаковщика данных до караоке-системы. Темы были интересные, но чувствовалась подусталость: пятый доклад, несколько частей! На том и покончили с официальной частью. Мне показалось, что в Киеве было намного меньше людей, чем зарегистрировалось (56). Зря не пришли. Кстати, а во Львове секьюрити сегодня сообщило мне, что в воскресенье (25 числа) приходили какие-то люди на конфу во Львове. Странно, ведь везде было написано, что конфа — 25 октября. Кто были эти люди? Отпишитесь, пожалуйста.

На афтепати в Киеве мы видели Белую и она теперь пушиста. Также она набрала воды из Майдана, это такой фонтан в центре Киева. Также был частично развиртуализирован Makc3D, что вызвало живую реакцию сразу нескольких членов нашего движения. В частности, был развязан кармический вопрос экстрагирования звука в AS3 — Татьяна и Макс наконец увидели друг друга и тут же доразрулили ситуацию на красной салфетке. Мы много и часто фотографировали себя и тут же рассматривали фото, пораженные! Была минута, когда вспышки четырех камер создавали эффект стробоскопа.

В Киеве я понял, что люблю его просторы и стремительную ясность архитектурных линий. Вернувшись во Львов я вспомнил, как люблю его органическую природу, пятиугольные и треугольные комнаты, и артефакты в непрямых углах.

Организационные выводы, идеи по UAFPUG:

  1. Во Львове будет еще больше Флекс-конференций.
  2. Следующий, ноябрьский UAFPUG будет в г. Днепропетровск.
  3. Появилась идея проведения зимнего ITSki в Карпатах: неделю живем в домике, делаем доклады, жжем камины, обсуждаем, катаемся на лыжах, получаем удовольствие. Точим лыжи!

Это не отчет, а мои впечатления по горячим следам. Дополняйте или поправляйте в комменатариях Smile


2009-10-15

15:15:07, 33 коровы
Проблемы с Flash Builder 4 и Flex Library проектом

На днях пришла необходимость попробовать перенести библиотеки с flex sdk 3.2 на flex sdk 4.  Заодно повтыкать в Flash Builder 4 и различные радости которые нам принес Gumbo.

Все было хорошо и ничто не предвещало беды ). После создания проекта компилятор сразу начал ругаться. “Почему бы и нет” - подумал я, ведь различия в сдк большие. Начал выяснять почему.

Первым сюрпризом было то, что он ругался на mxml класс, который обращался к AS классу лежащему в том же пакете. “Едить колотить, какая та лажа” - подумал я. И волевым движением руки добавил в mxml импорт,  этого нужного класса.

Потом выяснилось, что такая же проблема еще с несколькими mxml.  Ругая индусов я добавил импорт и в остальные классы. Вылез следующий такой же проблемный AS класс. Вставка импорта не помогла — данный класс бы internal. Скрипя душей и наплевав на хорошие манеры сделал класс public. Вылез следующий баг, mxml наследованный от mxml. И тут полностью приплыли, если навигатор нормально видет класс, нормально входит в него, то компилятор ругается.

Начал выдумывать почему такое происходит. Вариантов у меня было три:

  1. “Старый код”, В качестве базовых mxml классов используется mx:Canvas.
  2. Проблемы с неймспейсами.
  3. Я что то пропустил в этой жизни и изменился порядок создания библиотек.

Покапал в сторон “старых классов”, ничего! Нет никаких упоминаний о том что с ними, что-то нитак, поклацал галочки типа “Use Flex 3 compability”. Никаких результатов.

Поискал доки про изменения неймспейсов, плохого ничего не написано, никаких сложностей.

Библиотеки создаются стандартным образом, никаких шаманст ненужно.

Сделал тестовую библиотеку, неработает. Попробовал mxml без наследования, работает :) но меня это не спасает, использование классов в том же пакете без импорта не работает.

Поспрашивал у народа в чате UAFPUG. Никто ничего незнает. Дима попробывал несколько предложить несколько способов (пол мороженного лежит на полочке, ждет ;) ).  Но они не повторяли мою проблему и не особо помогли. Затем Дима прислал пример с кукбук как создавать компоненты со своим неймспейсом. Повторил все операции описаные в статье, не работает! Ругается, что не может найти мой класс в моем неймспейсе. Почувствовал себя полным дебилом.

Одновременно со мной этой же проблемой занималась Татьяна Белоусова из команды Flexis. Она сказала, что если поставить опцию компилятора

-keep-generated-actionscript

то mxml классы генерятся и пачкой вываливаються в корень каталога generated, а имена пакетов пустые т.е. реально все mxml классы лежат в корневом пакете. после этого у меня осталось лишь 2 мысли, или я всетаки что то неправильно готовлю или это буг.

На bugs.adobe.com ничего похожего найти не смог (кошмар как сайт тормозит). Вернулся к варианту с неправильной готовкой.

Стянул проект с кукбука, запустил, все работает. Повторил снова все действия из кукбука, неработает. Проверил все настройки компилятора, неймспейсов — все совпадает, но не комплится. Копипастом перенес все в свой проект — неработает! К этому моменту я исчерпал практически весь запас ругательств. Попробовал убрать все описания кастомных неймспейсов, в настройке компилятора, библиотека с AS классом собралась. Добавил MXML — собралась, добавил наследника, естественно не собралась :).

Начал сравнивать вообще все галочки в примере и в моем проекте. Все одинакого. Перенес свои MXML в проект из кукбука, либа собралась, ни на что не ругалась, но и мои mxml не включила в проект. Полез в настройки библиотеки, пункт “Flex Library Build Path”, таб “Classes”, естетсвенно вновь появившиеся классы небыли включены в библиотеку, поставил галочки напротив них — либа нормально собралась, все классы сгенеренные из mxml разложились по нужным папочкам, package были розданы правильно. В этот момент, я почувствовал себя полным неудачником, ламером, человеком с погнутой кармой. Добавил еще несколько файлов, все отлично собирается и компилится. Затем еще пару, и тут мне надоело выставлять галочки напротив моих вновь созданых классов. И я подумал, какие клевые индусы, сделали такую офигенно-удобно-полезную переключалку “Include all classes from all sources path” (я еще в старых проектах не раз попадался когда вновь созданые классы не включались в либу) и я поспешил воспользоваться ей.

Всё. Всё перестало работать и вернулось на круги своя! Убрал галочку, все работает.
Убрал галочку протестил все мои нерабочие варианты, с наследованием mxml, с кастомными неймспейсами, с импортом. Всё работает.

Люди, вы понимаете, что это полная ЖОПА? Это полный маразм! Из-за левой, выставляемой по умолчанию, кажущейся мега удобной галочкой, которую не один здраво-ленивый человек не захочет просто так снимать (а если снимет, то только при важных обстоятельствах), я протрахался 2 дня! Я исчерпал все свои ругательства, заговоры, шаманства, волшебные слова и веру в людей. Если бы не пример. И если не случай(! просто неочевидное стечение обстоятельств), то я бы вообще ничего не собрал.


Не используйте пока эту опцию!
Не используйте пока эту опцию! Никогда, забудьте про нее или дождитесь релиза )

Поняв причину, я смог найти на bugs.adobe.com баги связаные с этой опцией (и я, как оказалось, повторил их все!). Подумав немного над возможной причиной я пришел к выводу, что все связано с неверной генерацией кода, так сказать первопричина. Поэтому я запостил баг FB-23453 в котором попытался описать первопричину.

2009-10-08

08:13:51, Junik
Передача версии flex приложения при компиляции (Flex 3)

Когда давно я писала о вариантах передачи версии в приложение. Там упоминалось возможное использования для этого сonditional compilation, но тогда еще Flex 3 не вышел.

Сейчас уже давным давно вышел Flex 3 и даже 4 не за горами.

Сейчас расскажу про то, как легко и непринужденно передать версию вашего приложения при компиляции, а потом и запросто использовать ее в приложении.

Передать константы в приложение можно, используя опцию компилятора compiler.define. Константы могут быть типов Boolean, String, Number или выражения, которые могут быть преобразованы в ActionScript в процессе компиляции. Далее эти константы доступны в приложении как глобальные.

Используя опцию define, необходимо для константы определить: namespace, имя и значение:

-define=namespace::variable_name,value

Пример:

-define=VERSION::description,'3.15.6'

Доступ из приложения доступен пока только из as-классов. В скором будущем, возможно будет работать и доступ из mxml-классов. Говорят, что в mxml-классах можно использовать только Boolean. Но зачем нам? Мы же код в mxml не пишем. ;)
Пример доступа:

public static const VERSION_DESCR:String = VERSION::description;

Подробнее про использование conditional compilation в доках.

Bookmark this article at


2009-09-24

16:01:35, Flash-ripper.com
О Code Behind во Flex — еще раз

Наглядные официальные статьи по Code Behind во Flex уже есть, включая статьи о Code Behind на русском и украинском, рекомендующие этот подход новичкам во Flex. Напишем о нем еще раз, так как мы о нем толком еще не писали. Это упущение, ведь Code Behind относится к лучшим практикам!

"Code Behind" означает, что код находится за чем-то. А зачем это нужно?

Code Behind помогает стройно разделить код приложения по задачам. Код, в котором задается дизайн находится в одном классе, а код с собственно логикой работы — в другом, том самом, который "Behind".

Во Flex это выражается в том, что Actionscript находится за кодом MXML. Один из возможных (и хорошо работающих, проверенных подходов) к Code Behind реализуется с помощью т.н. Base-классов. Начнем с главного приложения проекта:

1. Для приложения создается базовый Actionscript-класс, в простейшем случае расширяющий родной флексовый класс Application:

package core
{
    public class ApplicationBase extends Application
    {
        ...
    }
}

2. Этот класс затем и используется как базовый в коде MXML-класса самого приложения:

<?xml version="1.0" encoding="utf-8"?>
<core:ApplicationBase ... >
     ...
</core:ApplicationBase>

Что мы получили: есть Actionscript-класс ApplicationBase, в котором мы контролируем MXML-приложение. То же самое мы делаем и для всех остальных MXML-компонентов нашего проекта: создаются AS-классы с именами, соответствующими шаблону ComponentNameBase, а MXML-компоненты используют эти классы как базовые — точно так же, как было показано выше для кода Application.

В таком подходе использование тэга Script в MXML-коде сводится к нулю и является, говоря упрощенно, уже плохой практикой.

Таким образом достигается четкое разделение вычислительной логики и дизайна приложения. Логика идет в Actionscript, дизайн — остается в MXML-коде.


2009-09-04

19:47:50, Flash-ripper.com
Как поймать все события в визуальных компонентах Flex-приложения? Используя dispatchEventHook!

Удивительно: для того, чтобы перехватить все события в интерфейсе Flex-приложения, нужно написать всего одну строку кода, и она весьма проста:

UIComponent.mx_internal::dispatchEventHook = myEventsHook;

Здесь myEventsHook — это метод вашего приложения, перехватывающий события. Он принимает два аргумента: само событие и объект, это событие породивший, так что в самом методе вы можете легко фильтровать информацию.

Еще удивительнее то, как мало об этой простой технике написано в сети. Гугл в основном находит применение к Cairngorm (снова это имя!), короткую запись на японском и занятный пост о задании поведения флекс-компонентов по умолчанию.

Обратите внимание, речь идет не обо всех событиях флекса, но именно о событиях визуальных компонентов, а точнее — всех компонентов, унаследованнх от класса UIComponent.

Но уже это открывает интересные возможности по исследованию работы флекс-приложения. Важно: именно по исследованию его работы, а не вторжению в нее, которое возможно, но рекомендуется лишь в крайних случаях — пахнет дурным кодом и хаками. А вот изучить, как работают флексовые события при тех или иных ваших действиях в коде — самое оно.

Например, посмотрим, что происходит при перемещении компонента Text из одной панели в другую:

# Move text field: 
	TextArea event: remove
Panel 1 event: childRemove
Panel 1 event: childrenChanged
Panel 2 event: childrenChanged
Panel 2 event: childAdd
	TextArea event: add
	TextArea event: htmlTextChanged
	TextArea event: textChanged
	TextArea event: valueCommit
	TextArea event: viewChanged
	TextArea event: viewChanged
Panel 1 event: widthChanged
Panel 1 event: heightChanged
Panel 1 event: resize
Panel 2 event: widthChanged
Panel 2 event: heightChanged
Panel 2 event: resize
Panel 1 event: xChanged
Panel 1 event: move
Panel 2 event: xChanged
Panel 2 event: yChanged
Panel 2 event: move
	TextArea event: updateComplete
Panel 1 event: updateComplete
Panel 2 event: updateComplete

Код, который выдает этот лог после нажатия кнопки "Move text":

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
				preinitialize="preinitializeHandler();"	>
	<mx:Script>
		<![CDATA[
			import mx.core.UIComponent;
			
			private function preinitializeHandler():void
			{
				trace("Hooking UIComponent's event dispatcher"); 
				UIComponent.mx_internal::dispatchEventHook = myEventsHook;
			}
			
			private function myEventsHook(event:Event, uiComponent:Object):void
			{
				if(uiComponent.name == "firstPanel")
				{
					trace("Panel 1 event: " + event.type );
				}
				
				if(uiComponent.name == "secondPanel")
				{
					trace("Panel 2 event: " + event.type );
				}
				
				if(uiComponent.name == "textArea")
				{
					trace("\tTextArea event: " + event.type );
				}
			}
			
			private function moveText():void
			{
				trace('##################\n# Move text field: ');
				secondPanel.addChild(textArea);
			}
		]]>
	</mx:Script>
	<mx:Panel id="firstPanel" >
		<mx:TextArea id="textArea" text="Hello world"/>
	</mx:Panel>
	<mx:Panel id="secondPanel" />
	<mx:Button label="Move text" click="moveText();" />
</mx:Application>

Наглядно и просто! А сколько бы пришлось лазить по исходникам Flex SDK, чтобы получить эту элегантную картину Smile

Данная техника помогает оптимизировать код. Например, если задать панелям и текстовому полю из вышеприведенного кода явные размеры (width, height), то событий будет почти в два раза меньше — отпадают всякие ресайзы, ведь размеры указаны явно, и у вас есть еще один повод сделать выводы.


19:47:50, Flash-ripper.com
Как поймать все события в визуальных компонентах Flex-приложения? Используя dispatchEventHook!

Удивительно: для того, чтобы перехватить все события в интерфейсе Flex-приложения, нужно написать всего одну строку кода, и она весьма проста:

UIComponent.mx_internal::dispatchEventHook = myEventsHook;

Здесь myEventsHook — это метод вашего приложения, перехватывающий события. Он принимает два аргумента: само событие и объект, это событие породивший, так что в самом методе вы можете легко фильтровать информацию.

Еще удивительнее то, как мало об этой простой технике написано в сети. Гугл в основном находит применение к Cairngorm (снова это имя!), короткую запись на японском и занятный пост о задании поведения флекс-компонентов по умолчанию.

Обратите внимание, речь идет не обо всех событиях флекса, но именно о событиях визуальных компонентов, а точнее — всех компонентов, унаследованнх от класса UIComponent.

Но уже это открывает интересные возможности по исследованию работы флекс-приложения. Важно: именно по исследованию его работы, а не вторжению в нее, которое возможно, но рекомендуется лишь в крайних случаях — пахнет дурным кодом и хаками. А вот изучить, как работают флексовые события при тех или иных ваших действиях в коде — самое оно.

Например, посмотрим, что происходит при перемещении компонента Text из одной панели в другую:

# Move text field: 
	TextArea event: remove
Panel 1 event: childRemove
Panel 1 event: childrenChanged
Panel 2 event: childrenChanged
Panel 2 event: childAdd
	TextArea event: add
	TextArea event: htmlTextChanged
	TextArea event: textChanged
	TextArea event: valueCommit
	TextArea event: viewChanged
	TextArea event: viewChanged
Panel 1 event: widthChanged
Panel 1 event: heightChanged
Panel 1 event: resize
Panel 2 event: widthChanged
Panel 2 event: heightChanged
Panel 2 event: resize
Panel 1 event: xChanged
Panel 1 event: move
Panel 2 event: xChanged
Panel 2 event: yChanged
Panel 2 event: move
	TextArea event: updateComplete
Panel 1 event: updateComplete
Panel 2 event: updateComplete

Код, который выдает этот лог после нажатия кнопки "Move text":

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
				preinitialize="preinitializeHandler();"	>
	<mx:Script>
		<![CDATA[
			import mx.core.UIComponent;
			
			private function preinitializeHandler():void
			{
				trace("Hooking UIComponent's event dispatcher"); 
				UIComponent.mx_internal::dispatchEventHook = myEventsHook;
			}
			
			private function myEventsHook(event:Event, uiComponent:Object):void
			{
				if(uiComponent.name == "firstPanel")
				{
					trace("Panel 1 event: " + event.type );
				}
				
				if(uiComponent.name == "secondPanel")
				{
					trace("Panel 2 event: " + event.type );
				}
				
				if(uiComponent.name == "textArea")
				{
					trace("\tTextArea event: " + event.type );
				}
			}
			
			private function moveText():void
			{
				trace('##################\n# Move text field: ');
				secondPanel.addChild(textArea);
			}
		]]>
	</mx:Script>
	<mx:Panel id="firstPanel" >
		<mx:TextArea id="textArea" text="Hello world"/>
	</mx:Panel>
	<mx:Panel id="secondPanel" />
	<mx:Button label="Move text" click="moveText();" />
</mx:Application>

Наглядно и просто! А сколько бы пришлось лазить по исходникам Flex SDK, чтобы получить эту элегантную картину Smile

Данная техника помогает оптимизировать код. Например, если задать панелям и текстовому полю из вышеприведенного кода явные размеры (width, height), то событий будет почти в два раза меньше — отпадают всякие ресайзы, ведь размеры указаны явно, и у вас есть еще один повод сделать выводы.


2009-08-14

12:51:40, Agahov's blog
Package organization

Организация кода в пакеты

Словарь

Рефакторинг - Класическая книга описывающая практики рефакторинга - http://www.ozon.ru/context/detail/id/1308678/
DSL - Domain-specific language

Введение

Пакеты это механизм для организации кода и разрешения конфликта уникальности наименования классов. Это техническое определение, но по какому принципу создавать наименования? Какими критериями руководствоваться? И зачем вообще об этом задумываться?
К сожелению этот вопрос слабо освещен в классической литературе. В данной статье я хочу поделиться своим опытом и некоторыми исследованиями по данному вопросу. Первая часть статьи это моя попытка выделить общие принципы. В частности много идей я подчеркнул из презентации Juergen Hoeller, http://www.infoq.com/presentations/code-organization-large-project. Вторая часть статьи - описание вымышненного flex проекта и пошаговое развитие его структуры на основе свормулированных принципов и моего личного опыта.

Общие принципы

Можно сформулировать следующие архитектурные принципы:

      Избегать циклических зависимостей;
      Избегать дублирования;
      Формировать модули;
      Стремиться создавать слабо связанные модули;
      Выбирать модули на основе логической, концептуальной организации (домена)

Далее о каждом их них более подробно:

Избегать циклических зависимостей между пакетами

картинка

Циклическая зависимость это когда два пакета ссылаются друг на друга. Обычно такая зависимость не планируется и появляется в последстивии. Часто это может быть признаком ухудшения общего состояния кода. Создание пакетов - динамический процесс. Со временем приложение меняется, появляется новая функциональность, старая переосмысливается. Возможно вам придется разделить пакеты по разным приложениям(библиотекам) и компелировать по отдельности. Цикличиская зависимость усложняет понимание и развитие кода. Не дает его повторно использовать.

Избегать дублирования

Часто альтернативой циклической зависимости является дублирование кода. Но такой код уже плохо пахнет. Дублирование заграмождает код и затрудняет его модификацию. Попробуйте переосмыслить местоположение нового кода и не прятать его глобоко в иерархии.

Формировать модули

Модуль это концептуальная сущность содержащая один или несколько дочерних пакетов. Модуль определяет границы для используемых в нем пакетов.

Стремиться создавать слабо связанные модули

картинка
Слабая связность модулей также обеспечивает более понятный код и облегчает повторное использование.

Выбирать модули на основе логической, концептуальной организации (домена)

Часто модули разделяют на основе типов, например:
картинка
или на основе уровней:
картинка
Данная организация имеет право на существование, но она искуственна, то есть не следует из природы вещей. На мой взгляд, лучшим решением является разбиение на основе домена предметной области. Такое разделение ортогонально разбиению на основе типов или слоев, и развивается более естественно и имеет прозрачные границы.
картинка

Зачем об этом заботиться?

Правильная организация пакетов и модулей позволит:
- создать устойчивый внешний API для поддержки обратной совместимости;
- уменьшить время на понимание кода;
- упростить тестирование;
- облегчить повторное использование;
- уменьшить время компиляции, что немаловажно для большого приложения;
- привнести в работу программиста творчество.

Пример и несколько практических советов

В последнее время я часто встречаю в flex приложении структуру пакетов следуещего вида:
vo
view
model
control
commands
business
events
Такое разделение на пакеты пришло к нам из фреймворка Cairngorm, где, видимо его приминение оправдано. Но оно встречается и в приложениях, где Cairngorm не используется. Как показывает моя практика, такое разделение плохо развивается при разростании приложения, пакеты получаются сильно связанны и их практически невозможно использовать повторно в другом приложении.
Я использую разбиение по логике или функциональности. Попробую привести пример.

Рассмотрим приложение AdminPanel

Здесь будет показан сам принцип создания пакетов. Не надо воспринимать получившуюся структуру как эталон, в реальном приложение много допольнительных деталей и специфики.

Начальная структура

rootpackage = com.agakhov.examples.adminpanel
rootpackage.ApplicationView.mxml // определяется размещение всех компонентов приложения
rootpackage.MainDataModel.as // модель данных всего приложения
rootpackage.MainEventMap.xml // сущность из фреймворка mate, её можно заменить обычным классом контроллера
rootpackage.AdminApplucationEvent.as // событие уровня приложения, например ApplicationStart
defaultpackage.Main.xml //создает и инициализирует основные компоненты)

То, что я делал до сих пор, относилось ко всему приложению, поэтому я не выделял никаких специализированных пакетов. Приложение запускается показывает пустое окно и закрывается. Но уже работает.

Login

Допустим, что первая по приоритету задача это аутентифика


2009-07-11

09:09:39, Flash-ripper.com
FB vs FDT? Нет, FB + FDT!

У армянского радио часто спрашивают, что всё-таки лучше: FB или FDT?

В чём-то их возможности пересекаются, например, оба предоставляют минимальные средства рефакторинга (переименование), оба имеют функцию поиска референсов на поле или метод и т.д.
Однако у каждого есть и свои особенности, которые отстутствуют у конкурента. Например, у FDT есть замечательная фича Quick fix, зато у FB есть профайлер, дизайнер форм, да и вообще он лучше работает с MXML.

Отсюда возникает соблазн использовать их оба два. К счастью это не так сложно (если не учитывать, конечно, что оба платные). Рассказываю свой рецепт, как их подружить, однако это не означает, что нельзя добиться того же самого другими путями.

UPD:iceX подсказал ссылку на более подробную статью.

Твоя оценка: Нет Средняя: 3 (3 голоса )

читать далее


2009-06-03

11:45:00, Flash-разработка
Code-behind или mx:Script?
До некоторого времени, я выносил объемный AS-ккод из MXML-компонентов, используя тег <mx:Script/>:
<mx:Script source="includes/ComponentName.as"/>
Каких-либо логических недостатков такого метода я не наблюдал, однако столкнулся с постоянной глючностью автокомплита AS-редактора FlexBuilder. И вот, когда меня в конец это достало, решил взять на вооружение способ Code-behind.

Про Code-behind пишут следующее:
Code Behind
Building components by using code behind
Code-Behind in Flex 2
Code-behind gotcha in Flex Builder for AIR apps
Советы новичкам

В кратце, суть проста - наш MXML компонент ComponentName не базируется напрямую на основном компоненте, например, Canvas, а на компоненте-"прослойке" ComponentNameClass (также используется суффикс -Base). Код этого компонента размещается в ComponentNameClass.as. Его класс является потомком класса того самого основного компонента (Canvas) и содержит весь необходимый AS-код.

Все компоненты, которые имеются в ComponentName.mxml и к которым нужен доступ, должны быть объявлены в ComponentNameClass.as как public. Методы и обработчики событий - public или protected.

Вообще, конечно, это очень правильный подход. Только напрягает пара фактов - нужно возиться с объявлением класса и объявлять все компоненты, с которыми необходимо иметь дело в as-файле. Если, к примеру, я вдруг передумаю использовать в MXML вместо LinkButton (а он уже объявлен так в AS-компоненте) простой Button, получу ошибку - необходимо везде сделать замену. Выход - объявлять их дальних предков или вообще интерфейсы.

А вот интересно - есть ли средства автоматизации этого процесса? Что-то типа команды "Create Code-behind Class" или при создании MXML-компонента подобная галочка. Я не нашел...

11:45:00, Flash-разработка
Code-behind или mx:Script?
До некоторого времени, я выносил объемный AS-ккод из MXML-компонентов, используя тег <mx:Script/>:
<mx:Script source="includes/ComponentName.as"/>
Каких-либо логических недостатков такого метода я не наблюдал, однако столкнулся с постоянной глючностью автокомплита AS-редактора FlexBuilder. И вот, когда меня в конец это достало, решил взять на вооружение способ Code-behind.

Про Code-behind пишут следующее:
Code Behind
Building components by using code behind
Code-Behind in Flex 2
Code-behind gotcha in Flex Builder for AIR apps
Советы новичкам

В кратце, суть проста - наш MXML компонент ComponentName не базируется напрямую на основном компоненте, например, Canvas, а на компоненте-"прослойке" ComponentNameClass (также используется суффикс -Base). Код этого компонента размещается в ComponentNameClass.as. Его класс является потомком класса того самого основного компонента (Canvas) и содержит весь необходимый AS-код.

Все компоненты, которые имеются в ComponentName.mxml и к которым нужен доступ, должны быть объявлены в ComponentNameClass.as как public. Методы и обработчики событий - public или protected.

Вообще, конечно, это очень правильный подход. Только напрягает пара фактов - нужно возиться с объявлением класса и объявлять все компоненты, с которыми необходимо иметь дело в as-файле. Если, к примеру, я вдруг передумаю использовать в MXML вместо LinkButton (а он уже объявлен так в AS-компоненте) простой Button, получу ошибку - необходимо везде сделать замену. Выход - объявлять их дальних предков или вообще интерфейсы.

А вот интересно - есть ли средства автоматизации этого процесса? Что-то типа команды "Create Code-behind Class" или при создании MXML-компонента подобная галочка. Я не нашел...



2009-05-01

17:23:52, 33 коровы
UAFPUG 9, мой доклад о Eclipse Monkey

Непрошло и пол года как я подготовил исходники и написал пост о моем докладе на UAFPUG, который был 28 февраля, этого года.

Мой доклад назывался
“Eclipse Monkey — безграничный функционал Flex Builder’а.” как можно догадаться был посвещен прикручиванию Monkey скриптов к Flex Builder’у

В начале небольшая призентация:

По ходу призентации я приводил примеры использования скриптов. В правом углу некоторый слайдов есть метка E> это означает, что вместе со слайдом был пример кода. Примеры скриптов лежать в архиве у меня или в проекте monkey-for-flex на гугл коде. Примеры простые и не очень :).

Непростой пример посвещен использованию модели кода Flex Builder в Monkey Eclipse. Пример лежит в файле create-interface.js Данный пример генерит методы и свойства которые объявлены в выбраном интерфейсе, используя модель кода Flex Builder. Чтобы получить код нужно выделить в коде имя интерфейса и нажать Alt+m и в консоле будет выведен код. Остаеться его только скопипастить. Данный пример не является эталоном работы с моделью кода Flex Builder, это лишь иллюстрация возможностей Eclipse Monkey.

Еще я хочу обратить ваше внимание на библиотечки, которые я написал для более удобной работы.
Эти библиотеки лежат в папке com/the33cows/monkeylib

flexutil.js
Содержит методы для работы с текстовыми редакторами, как обычными так и MXML и CSS редакторов Flex Builder (Получение редактора, добавление текста, перемещение курсора). Библиотека не доделана, но с базовыми вещами справляеться нормально. Приветствуется добавление своих методов и/или советов, критики :)

templateUtils.js
Служит для работы с темплитами кода. В файл нужно прописать путь к каталогу где будут храниться файлы с темплитами

this.templateRoot = "< YourPathToTemplates >/templates/";

использование до безобразия простое

include("com/the33cows/monkeylib/templateUtils.js"); ... var tmpl = getTemplate("public-method.tpl"); // загрузили темплит из файла tmpl = tmpl.replace(/{comments}/g, coments); // заменяем переменные на значения

переменная tmpl содержит строку с кодом, дальше с можно поступать как угодно.

Если есть каки-то вопросы, задавайте. Если есть какие-то пожелания, делитесь) Удачи.


2009-04-24

08:38:19, Flash-ripper.com
Ищем молодого и талантливого Flash/Flex-разработчика на игровой online-проект в Москве

Мы ищем молодого и талантливого Flash/Flex - разработчика, для участия в игровом проекте нашей компании (разработка клиентской части online игры), которого на первое время устроят 80000р. в месяц.

Мы хотим от кандидата:
- наличие опыта работы с Action Script 3.0;
- знание Flex Framework ( скиновать стандартные компоненты, создавать свои Flex-based компоненты, очень хорошо понимать как работает DataBinding, знать про коллекции, понимать как компилируется mxml в ActionScript, знать про Flex Managers, уметь разбираться в коде Framework`а);
- опыт групповой разработки online игр будет плюсом.

Мы предлагаем:
-возможности финансового и карьерного роста (так как проект новый);
-интересную работу;
-молодой и дружный коллектив, с которым можно выполнять интересные
задачи;
-оформление по ТК;
-уютный офис, располагающийся рядом с м. Тимирязевская, Рижская, или платформа Останкино.

Если Вы хотите присоединиться к нашей команде, пожалуйста, напишите мне письмо на адрес tpalitsina@bdirect.ru!


2009-04-16

21:53:57, DL1t's blog
Повышаем читаемость кода: документирование типов данных

Несмотря на то, что ActionScript 3.0 является строго типизированным языком, в системе типов имеются некоторые “дыры” (обусловленные наличием типа Function и отсутствием дженериков (кроме Vector во Flash Player 10)), которые, с одной стороны, повышают гибкость языка, но с другой - делают код менее читаемым. В проектах, где число классов составляет несколько сотен и выше, это начинает составлять определенную проблему, особенно в случае командной разработки.

В случае массивов стандарт документирования имеется официально:

var myArray:Array/*of String*/;

Эта форма также поддерживается FlashDevelop (при ее использовании получаем автокомплит для элементов массива, что удобно). Кроме того, для mxml во Flex имеется метатег ArrayElementType, однако в чистых AS3 проектах без использования mxml он все равно не работает.

Однако массивами дело далеко не исчерпывается: для комфортной работы с кодом требуется информация о типах для Responder-ов, коллекций, в некоторых случаях  - информации о точном контракте у Function и т. п. В соответствии с этим при написании кода я проставляю дополнительные типы комментариев, характеризующих типы данных.

1) Коллекции, Dictionary

var features:ArrayCollection/*<String>*/;

var settings:Dictionary/*<String,XML>*/;

Для случая коллекций использование of выглядит неоправданным, так как массив и коллекция являются различными сущностями. Описание же в стиле дженериков Java выглядит очевидно, а также логично, в свете появления Vector с использующим угловые скобки синтаксисом.

2) тип Function

var mouseDownHandler:Function/*MouseEvent->void*/;

Функциональный тип описан по аналогии с haXe, где описание функций более полноценно. Для функций с одним входным аргументом такой вариант выглядит предельно логично, для случая нескольких входных аргументов вопрос усложняется (однако случаи, когда приходится подробно специфицировать функции с несколькими аргументами относительно редки). В этом случае можно следовать описанию типов в haXe (все аргументы и возвращаемый тип разделяются стрелками), либо использовать что-то свое. Вариант haXe для 2-3 аргументов все еще читаем, а в случае большего числа уже логичнее выносить описание функции в отдельный раздел в asDoc, так как inline комментарий станет слишком длинным, вне зависимости от используемого синтаксиса описания.

3) Уточнение типа

override public function doSomething(arg1:Object/*(MyType)*/,arg2:int):void{…}

В некоторых случаях приходится использовать в контракте функции более общий тип, несмотря на то, что в любом случае передаются объекты совершенно определенного типа. Такая ситуация часто возникает, например, когда производится override методов библиотеки, не подлежащей/не поддающейся изменению. В этом случае дополнительный комментарий позволит разработчику быстрее ориентироваться в коде.

4) Responder-ы

var sqlResponder:Responder/*<SQLResult->void,SQLError->void>*/;

Прямое следствие пунктов 1-2. Подобное описание responder-а позволяет избежать использования типа Object для обработки результатов выполнения асинхронных задач, что делает код более четким и читаемым.

Может показаться, что дополнительное комментирование  является лишней и ненужной работой, однако при работе с большим количеством кода наличие подобных уточнений позволяет получить необходимую информацию максимально быстро, что снижает количество отвлечений, и, соответственно, положительно сказывается на производительности.


07:39:05, 33 коровы
Eclipse Monkey и редакторы Flex Builder

Работа с mxml и css редактором отличается от работы с обычным редактором который нам предоставляет Eclipse Monkey. Чтобы получить доступ к любому редактору я использую такой метод

loadBundle("com.adobe.flexbuilder.editors.common"); /** * @return current text editor or null * @see org.eclipse.ui.editors.text.TextEditor */ this.getCurrentTextEditor = function() { var editor = window.getActivePage().getActiveEditor(); if (editor) { if (editor.getClass().getName() == "com.adobe.flexbuilder.editors.mxml.MXMLEditor" || editor.getClass().getName() == "com.adobe.flexbuilder.editors.css.CSSEditor") { editor = editor.getCodeEditor(); } /* //TODO add others editors that else if (){} */ } return editor; }

Данный метод отдает ссылку на инстанс класса наследованого от org.eclipse.ui.editors.text.TextEditor, вернее даже на инстанс, который реализует
org.eclipse.ui.editors.ITextEditor

дальше работаем обычными для эклипса методами:

this.TextSelection = Packages.org.eclipse.jface.text.TextSelection; this.insertToCursor = function(editor, text, moveCursor) { if (editor) { var documentProvider = editor.getDocumentProvider(); var doc = documentProvider.getDocument(editor.getEditorInput()); var offset = editor.getSelectionProvider().getSelection().getOffset(); doc.replace(offset, 0, text); if (moveCursor) { var selection = new TextSelection(doc, offset+text.length, 0); editor.getSelectionProvider().setSelection(selection); } } }

Метод вставляет текст в позицию курсора и если выставлен флаг, перемещает курсор в конец вставленного текста.


2009-04-11

09:06:34, Garbage Collector
Intellij IDEA build 9805 с поддержкой новых пространств имен Flex 4 Gumbo

Вчера вышла новая EAP-сборка Intellij IDEA 9805 с поддержкой пространств имен в MXML-разметке Flex 4 Gumbo. Если кто не в курсе, эти пространства имен появились после отказа от префикса Fx в именах компонентов Gumbo.

Редактирование пространств имен, о которых будет известно среде разработки, производится в настройках проекта (комбинация Ctrl+Alt+Shift+S) на вкладке Flex Compiller Settings. Однако добавлять в этот список стандартные пространства имен (http://ns.adobe.com/mxml/2009, library://ns.adobe.com/flex/spark, library://ns.adobe.com/flex/halo, http://www.adobe.com/2006/mxml и http://ns.adobe.com/fxg/2008) совсем необязательно — они подхватываются средой «на лету» из файла flex-config.xml.

Хочется пожелать разработчиками также побыстрее справиться с изменившимся синтаксисом стилевых блоков CSS. ;-)

Примечание: если вы используете самостоятельную сборку Flex 4 SDK и у вас не компилируется SWF-файл приложения, то это означает, что вам необходимо удалить файл IDEA_INSTALL_DIR\plugins\flex\lib\idea-fcsh-fix.jar.


09:06:34, Garbage Collector
Intellij IDEA build 9805 с поддержкой новых пространств имен Flex 4 Gumbo

Вчера вышла новая EAP-сборка Intellij IDEA 9805 с поддержкой пространств имен в MXML-разметке Flex 4 Gumbo. Если кто не в курсе, эти пространства имен появились после отказа от префикса Fx в именах компонентов Gumbo.

Редактирование пространств имен, о которых будет известно среде разработки, производится в настройках проекта (комбинация Ctrl+Alt+Shift+S) на вкладке Flex Compiller Settings. Однако добавлять в этот список стандартные пространства имен (http://ns.adobe.com/mxml/2009, library://ns.adobe.com/flex/spark, library://ns.adobe.com/flex/halo, http://www.adobe.com/2006/mxml и http://ns.adobe.com/fxg/2008) совсем необязательно — они подхватываются средой «на лету» из файла flex-config.xml.

Хочется пожелать разработчиками также побыстрее справиться с изменившимся синтаксисом стилевых блоков CSS. ;-)

Примечание: если вы используете самостоятельную сборку Flex 4 SDK и у вас не компилируется SWF-файл приложения, то это означает, что вам необходимо удалить файл IDEA_INSTALL_DIR\plugins\flex\lib\idea-fcsh-fix.jar. Более подробно об этой ошибке читайте в JetBrains JIRA.


09:06:34, Garbage Collector
Intellij IDEA build 9805 с поддержкой новых пространств имен Flex 4 Gumbo


Вчера вышла новая EAP-сборка Intellij IDEA 9805 с поддержкой пространств имен в MXML-разметке Flex 4 Gumbo. Если кто не в курсе, эти пространства имен появились после отказа от префикса Fx в именах компонентов Gumbo.

Редактирование пространств имен, о которых будет известно среде разработки, производится в настройках проекта (комбинация Ctrl+Alt+Shift+S) на вкладке Flex Compiller Settings. Однако добавлять в этот список стандартные пространства имен (http://ns.adobe.com/mxml/2009, library://ns.adobe.com/flex/spark, library://ns.adobe.com/flex/halo, http://www.adobe.com/2006/mxml и http://ns.adobe.com/fxg/2008) совсем необязательно — они подхватываются средой «на лету» из файла flex-config.xml.

Хочется пожелать разработчиками также побыстрее справиться с изменившимся синтаксисом стилевых блоков CSS. ;-)

Примечание: если вы используете самостоятельную сборку Flex 4 SDK и у вас не компилируется SWF-файл приложения, то это означает, что вам необходимо удалить файл IDEA_INSTALL_DIR\plugins\flex\lib\idea-fcsh-fix.jar. Более подробно об этой ошибке читайте в JetBrains JIRA.


09:06:34, Garbage Collector
Intellij IDEA build 9805 с поддержкой новых пространств имен Flex 4 Gumbo

Вчера вышла новая EAP-сборка Intellij IDEA 9805 с поддержкой пространств имен в MXML-разметке Flex 4 Gumbo. Если кто не в курсе, эти пространства имен появились после отказа от префикса Fx в именах компонентов Gumbo.

Редактирование пространств имен, о которых будет известно среде разработки, производится в настройках проекта (комбинация Ctrl+Alt+Shift+S) на вкладке Flex Compiller Settings. Однако добавлять в этот список стандартные пространства имен (http://ns.adobe.com/mxml/2009, library://ns.adobe.com/flex/spark, library://ns.adobe.com/flex/halo, http://www.adobe.com/2006/mxml и http://ns.adobe.com/fxg/2008) совсем необязательно — они подхватываются средой «на лету» из файла flex-config.xml.

Хочется пожелать разработчиками также побыстрее справиться с изменившимся синтаксисом стилевых блоков CSS. ;-)

Примечание: если вы используете самостоятельную сборку Flex 4 SDK и у вас не компилируется SWF-файл приложения, то это означает, что вам необходимо удалить файл IDEA_INSTALL_DIR\plugins\flex\lib\idea-fcsh-fix.jar. Более подробно об этой ошибке читайте в JetBrains JIRA.



2009-03-22

17:55:00, Flash-разработка
mx:Pause vs flash.utils.Timer. Flex
Декларативность MXML - огромное достоинство Flex.
Легкое определение переменных в MXML значительно упрощает разработку:
  • позволяет легко и наглядно определять их свойства и обработчики событий
  • автоматически делает переменные Bindable
  • позволяет их связать с другими переменными и выражениями
  • делает наглядным код

Но, на сколько я понял, не все классы можно представить в декларативном виде.

Например, класс flash.utils.Timer невозможно представить в виде MXML. Компилятор выдает ошибку "Неправильное количество аргументов". Всё от того, что конструктор этого класса содержит один обязательный параметр. Как его указать, и возможно ли это, увы, я не понял.

Но есть простое решение - использовать другой класс, хорошо подходящий по своему функционалу - mx.effects.Pause:

<mx:Pause
id="somePause"
duration="2000"
effectEnd="somePause_effectEndHandler(event)"
/>

. . .

//Стартовать задержку
this.somePause.play();

. . .

private function somePause_effectEndHandler(event:EffectEvent):void {
//Обработать окончание задержки
}


17:55:00, Flash-разработка
mx:Pause vs flash.utils.Timer. Flex
Декларативность MXML - огромное достоинство Flex.
Легкое определение переменных в MXML значительно упрощает разработку:
  • позволяет легко и наглядно определять их свойства и обработчики событий
  • автоматически делает переменные Bindable
  • позволяет их связать с другими переменными и выражениями
  • делает наглядным код

Но, на сколько я понял, не все классы можно представить в декларативном виде.

Например, класс flash.utils.Timer невозможно представить в виде MXML. Компилятор выдает ошибку "Неправильное количество аргументов". Всё от того, что конструктор этого класса содержит один обязательный параметр. Как его указать, и возможно ли это, увы, я не понял.

Но есть простое решение - использовать другой класс, хорошо подходящий по своему функционалу - mx.effects.Pause:

<mx:Pause
id="somePause"
duration="2000"
effectEnd="somePause_effectEndHandler(event)"
/>

. . .

//Стартовать задержку
this.somePause.play();

. . .

private function somePause_effectEndHandler(event:EffectEvent):void {
//Обработать окончание задержки
}



2009-03-19

18:48:00, Flash-разработка
ASDoc in MXML. Правильно комментируем MXML.
MXML для Flex-разработки имеет первостепенное значение. Однако, воспринимая его как порождение XML, до некоторых пор, я не считал его языком программирования или чем-то в этом духе.
Теперь, уже достаточно сроднившись с MXML, понимаю, что есть необходимость правильно его комментировать. Просматривая листинги MXML, глаз так же нуждается в разделении блоков, как и при чтении AS-кода.
Если с AS-кодом всё давно ясно (я его использую везде где надо и где необязательно), то вот с MXML хотелось бы разобраться. И поможет нам в этом статейка "ASDoc in MXML - Functional and Design Specification". Выделим основные мысли из нее.

Основные положения

В настоящее время не существует способа документировать MXML-компоненты. (Кстати, в лайфдоках про это вот что сказано: Documenting MXML files). Компилятор asdoc не обрабатывает комментарии в MXML-файлах. Но число компонентов, разрабатываемых на базе MXML неуклонно растет, поэтому поддержка в asdoc файлов MXML очень бы помогла разработчикам при создании документации.

ASDoc комментарий

Для того, чтобы ASDoc-комментарий был обработан asdoc-компилятором, необходимо указать 3 тире после <!:
<!--- asdoc comment -->
Для сравнения - обычный комментарий начинается с 2-х тире.

Комментирование MXML-компонентов и компонента уровня класса

Комментарии для компонентов внутри MXML должны располагаться перед компонентами.
Комментарий компонента уровня класса должен располагаться перед корневым тегом MXML:

<?xml version="1.0"?>

<!-- Standard MXML comment: events\myComponents\MyButton.mxml -->

<!---
The class level comment for the component.
This tag supports all ASDoc tags, and does not require a CDATA block.

@see mx.container.VBox
-->
<mx:VBox xmlns="http://ns.adobe.com/mxml/2009" xmlns:mx="library:adobe/flex/halo" >

<!--- Comment for button -->
<mx:Button id="myButton" label="This button has comment"/>

<!--- This comment doesn't belong to any component and will be ignored -->

</mx:VBox>

Комментарии перед тегами Script, Metadata будут игнорироваться. Перед тегами Definition, Library, Private и внутри их, комментарии так же будут игнорироваться.

Итог

В статье приводятся примеры использования ASDoc комментирования в различных его применениях. Рассматривать их подробно я не буду - всё достаточно прозрачно.

Вывод таков - MXML комментировать надо. И для этого уже существует прототип (если я правильно понял) стандарта, которого и следует придерживаться.


18:48:00, Flash-разработка
ASDoc in MXML. Правильно комментируем MXML.
MXML для Flex-разработки имеет первостепенное значение. Однако, воспринимая его как порождение XML, до некоторых пор, я не считал его языком программирования или чем-то в этом духе.
Теперь, уже достаточно сроднившись с MXML, понимаю, что есть необходимость правильно его комментировать. Просматривая листинги MXML, глаз так же нуждается в разделении блоков, как и при чтении AS-кода.
Если с AS-кодом всё давно ясно (я его использую везде где надо и где необязательно), то вот с MXML хотелось бы разобраться. И поможет нам в этом статейка "ASDoc in MXML - Functional and Design Specification". Выделим основные мысли из нее.

Основные положения

В настоящее время не существует способа документировать MXML-компоненты. (Кстати, в лайфдоках про это вот что сказано: Documenting MXML files). Компилятор asdoc не обрабатывает комментарии в MXML-файлах. Но число компонентов, разрабатываемых на базе MXML неуклонно растет, поэтому поддержка в asdoc файлов MXML очень бы помогла разработчикам при создании документации.

ASDoc комментарий

Для того, чтобы ASDoc-комментарий был обработан asdoc-компилятором, необходимо указать 3 тире после <!:
<!--- asdoc comment -->
Для сравнения - обычный комментарий начинается с 2-х тире.

Комментирование MXML-компонентов и компонента уровня класса

Комментарии для компонентов внутри MXML должны располагаться перед компонентами.
Комментарий компонента уровня класса должен располагаться перед корневым тегом MXML:

<?xml version="1.0"?>

<!-- Standard MXML comment: events\myComponents\MyButton.mxml -->

<!---
The class level comment for the component.
This tag supports all ASDoc tags, and does not require a CDATA block.

@see mx.container.VBox
-->
<mx:VBox xmlns="http://ns.adobe.com/mxml/2009" xmlns:mx="library:adobe/flex/halo" >

<!--- Comment for button -->
<mx:Button id="myButton" label="This button has comment"/>

<!--- This comment doesn't belong to any component and will be ignored -->

</mx:VBox>

Комментарии перед тегами Script, Metadata будут игнорироваться. Перед тегами Definition, Library, Private и внутри их, комментарии так же будут игнорироваться.

Итог

В статье приводятся примеры использования ASDoc комментирования в различных его применениях. Рассматривать их подробно я не буду - всё достаточно прозрачно.

Вывод таков - MXML комментировать надо. И для этого уже существует прототип (если я правильно понял) стандарта, которого и следует придерживаться.



2009-03-05

16:17:00, Flash-разработка
Дружим Flex с Flash. Заметки: загрузка, внедрение, шрифт. Flex
Закончился очередной дидлайн. После крупных проектов, которые делаются за 3-4 дня практически с нуля, остаются ощущения, схожие с состоянием после автобусного тура: в голове каша, мельком что-то увидел, урывками что-то запомнил, надо разобрать фотки. Теперь настало время немного отдышаться и закрепить полученный опыт.

Для начала, несколько заметок:

  • Перенос строки в строках MXML: символ &#xd; - мелочь, а приятно.
  • Загрузка сложных Flash-приложений в SWFLoader должна производиться в выделенный домен приложения, т.к. могут быть конфликты классов:
<mx:SWFLoader autoLoad="false" id="swfLoader" source="application.swf" />

. . .

private function creationCompleteHandler(event:Event):void {
swfLoader.loaderContext=new LoaderContext(false,new ApplicationDomain());
swfLoader.load();
}
  • Если внешнее приложение подгружается в SWFLoader, есть вероятность, что в какой-то момент SWFLoader потеряет stage, что может пагубно отразиться на функциональности этого приложения. Если приложение где-то внутри обращается к stage и не обрабатывает его недоступность, то будут генерироваться ошибки. Побороть этот недостаток я не смог - только устранив все "не защищенные" stage из внешнего приложения.
  • Внедрение шрифтов. Гораздо надежнее внедрять шрифт непосредственно из TTF файла. Внедрение из файла SWF, в котором, в свою очередь, внедрен необходимый шрифт лучше оставить для тяжелых случаев несовместимостей с Flex. Дело в том, что почему-то, внедренные в SWF разные стили (normal, bold) шрифта не корректно "извлекаются" Flex-ом. Он не дает назвать разные стили разными именами (как это можно сделать в первом случае), теряет одно из начертаний (жирный шрифт просто не выводится). Возможно, это из-за особенностей конкретных шрифтов, но первый метод срабатывает гораздо стабильнее.
@font-face
{
fontFamily: "Century Schoolbook";
fontWeight: normal;
fontStyle: normal;
src: url("file://./assets/fonts/CENSCBK.TTF");
unicodeRange:
U+000-ґU+0040, /* Punctuation, Numbers */
U+004-5U+005A, /* Upper-Case A-Z */
U+004-AU+0060, /* Punctuation and Symbols */
U+004-µU+007A, /* Lower-Case a-z */
U+004-БU+007E, /* Punctuation and Symbols */
U+00E-BU+00FD,
U+040-tU+042F, /* Cyrillic Upper-Case A-Z */
U+040-фU+0451; /* Cyrillic Lower-Case a-z */
}

@font-face
{
fontFamily: "Century Schoolbook Bold";
fontWeight: bold;
fontStyle: normal;
src: url("file://./assets/fonts/SCHLBKB.TTF");
unicodeRange:
U+000-ґU+0040, /* Punctuation, Numbers */
U+004-5U+005A, /* Upper-Case A-Z */
U+004-AU+0060, /* Punctuation and Symbols */
U+004-µU+007A, /* Lower-Case a-z */
U+004-БU+007E, /* Punctuation and Symbols */
U+00E-BU+00FD,
U+040-tU+042F, /* Cyrillic Upper-Case A-Z */
U+040-фU+0451; /* Cyrillic Lower-Case a-z */
}


  • Внедрять клип из внешней SWF так, чтобы работали его фреймовые скрипты можно следующим образом:
    source="@Embed(source='assets/Index.swf')"
    При внедрении отдельного символа, его фреймовые скрипты и скрипты всех вложенных объектов теряются:
    source="@Embed(source='assets/Index.swf'#Index)"
    Игра с параметром mimeType не помогает.

На управлении внедренным контентом я бы хотел остановиться подробнее. Если у нас много однотипного материала для внедрения вышеописанным способом, то плодить SWF-файлы не удобно, плюс, внедряя каждый файл, мы не можем обобщать графику - она будет внедряться для каждого файла заново (не проверял, но догадываюсь).

Куда удобнее создать одну большую библиотеку и из нее внедрять символы. Но, к сожалению, их скрипты уже будут не доступны.
Но у нас есть в распоряжении метки фреймов и имена клипов. Совмещая возможности
MovieClip.currentLabels и MovieClip.addFrameScript можно получить контроль над внедренным клипом и заставлять его в нужный момент выполнять необходимые нам действия: останавливать клип на нужном фрейме, генерировать события и даже передавать данные в текстовые поля клипа.

Создаем компонент - наследник SWFLoader. После инстанцирования класса внедренного клипа (конец метода load(), можно так же добавить и в обработчик события загрузки), считываются все его метки и в их фреймы добавляются необходимые скрипты. Имя каждой метки имеет ключевую составляющую, которая и определяет тип действия добавляемого скрипта.
В нужный момент можно заставить клип остановиться, перейти на другую метку, генерировать событие (с идентификатором, так же зашитым в имя метки), просканировать клип и получить срез всех визуальных объектов, чтобы делать с ними всё что угодно. Главное - этот момент устанавливается прямо в таймлайне клипа, а не путем каких-либо расчетов количества фреймов или подобных методов.


Прекрасный момент - праздник еще не настал, а дидлайны уже позади! Отдыхать и набираться сил.

И конечно, наших прекрасных женщин поздравляю с праздником 8 марта!


16:17:00, Flash-разработка
Дружим Flex с Flash. Заметки: загрузка, внедрение, шрифт. Flex
Закончился очередной дидлайн. После крупных проектов, которые делаются за 3-4 дня практически с нуля, остаются ощущения, схожие с состоянием после автобусного тура: в голове каша, мельком что-то увидел, урывками что-то запомнил, надо разобрать фотки. Теперь настало время немного отдышаться и закрепить полученный опыт.

Для начала, несколько заметок:

  • Перенос строки в строках MXML: символ &#xd; - мелочь, а приятно.
  • Загрузка сложных Flash-приложений в SWFLoader должна производиться в выделенный домен приложения, т.к. могут быть конфликты классов:
<mx:SWFLoader autoLoad="false" id="swfLoader" source="application.swf" />

. . .

private function creationCompleteHandler(event:Event):void {
swfLoader.loaderContext=new LoaderContext(false,new ApplicationDomain());
swfLoader.load();
}
  • Если внешнее приложение подгружается в SWFLoader, есть вероятность, что в какой-то момент SWFLoader потеряет stage, что может пагубно отразиться на функциональности этого приложения. Если приложение где-то внутри обращается к stage и не обрабатывает его недоступность, то будут генерироваться ошибки. Побороть этот недостаток я не смог - только устранив все "не защищенные" stage из внешнего приложения.
  • Внедрение шрифтов. Гораздо надежнее внедрять шрифт непосредственно из TTF файла. Внедрение из файла SWF, в котором, в свою очередь, внедрен необходимый шрифт лучше оставить для тяжелых случаев несовместимостей с Flex. Дело в том, что почему-то, внедренные в SWF разные стили (normal, bold) шрифта не корректно "извлекаются" Flex-ом. Он не дает назвать разные стили разными именами (как это можно сделать в первом случае), теряет одно из начертаний (жирный шрифт просто не выводится). Возможно, это из-за особенностей конкретных шрифтов, но первый метод срабатывает гораздо стабильнее.
@font-face
{
fontFamily: "Century Schoolbook";
fontWeight: normal;
fontStyle: normal;
src: url("file://./assets/fonts/CENSCBK.TTF");
unicodeRange:
U+000-ґU+0040, /* Punctuation, Numbers */
U+004-5U+005A, /* Upper-Case A-Z */
U+004-AU+0060, /* Punctuation and Symbols */
U+004-µU+007A, /* Lower-Case a-z */
U+004-БU+007E, /* Punctuation and Symbols */
U+00E-BU+00FD,
U+040-tU+042F, /* Cyrillic Upper-Case A-Z */
U+040-фU+0451; /* Cyrillic Lower-Case a-z */
}

@font-face
{
fontFamily: "Century Schoolbook Bold";
fontWeight: bold;
fontStyle: normal;
src: url("file://./assets/fonts/SCHLBKB.TTF");
unicodeRange:
U+000-ґU+0040, /* Punctuation, Numbers */
U+004-5U+005A, /* Upper-Case A-Z */
U+004-AU+0060, /* Punctuation and Symbols */
U+004-µU+007A, /* Lower-Case a-z */
U+004-БU+007E, /* Punctuation and Symbols */
U+00E-BU+00FD,
U+040-tU+042F, /* Cyrillic Upper-Case A-Z */
U+040-фU+0451; /* Cyrillic Lower-Case a-z */
}


  • Внедрять клип из внешней SWF так, чтобы работали его фреймовые скрипты можно следующим образом:
    source="@Embed(source='assets/Index.swf')"
    При внедрении отдельного символа, его фреймовые скрипты и скрипты всех вложенных объектов теряются:
    source="@Embed(source='assets/Index.swf'#Index)"
    Игра с параметром mimeType не помогает.

На управлении внедренным контентом я бы хотел остановиться подробнее. Если у нас много однотипного материала для внедрения вышеописанным способом, то плодить SWF-файлы не удобно, плюс, внедряя каждый файл, мы не можем обобщать графику - она будет внедряться для каждого файла заново (не проверял, но догадываюсь).

Куда удобнее создать одну большую библиотеку и из нее внедрять символы. Но, к сожалению, их скрипты уже будут не доступны.
Но у нас есть в распоряжении метки фреймов и имена клипов. Совмещая возможности
MovieClip.currentLabels и MovieClip.addFrameScript можно получить контроль над внедренным клипом и заставлять его в нужный момент выполнять необходимые нам действия: останавливать клип на нужном фрейме, генерировать события и даже передавать данные в текстовые поля клипа.

Создаем компонент - наследник SWFLoader. После инстанцирования класса внедренного клипа (конец метода load(), можно так же добавить и в обработчик события загрузки), считываются все его метки и в их фреймы добавляются необходимые скрипты. Имя каждой метки имеет ключевую составляющую, которая и определяет тип действия добавляемого скрипта.
В нужный момент можно заставить клип остановиться, перейти на другую метку, генерировать событие (с идентификатором, так же зашитым в имя метки), просканировать клип и получить срез всех визуальных объектов, чтобы делать с ними всё что угодно. Главное - этот момент устанавливается прямо в таймлайне клипа, а не путем каких-либо расчетов количества фреймов или подобных методов.


Прекрасный момент - праздник еще не настал, а дидлайны уже позади! Отдыхать и набираться сил.

И конечно, наших прекрасных женщин поздравляю с праздником 8 марта!



2009-02-28

23:24:00, Flash-разработка
Модули vs. компоненты. Flex

В моем опыте Flex-разработки наступает новая стадия взросления.

Ну, условно, у себя я уже могу выделить две стадии (не считая робкого потрагивания и любопытного пощупывания):

  • Код представляет собой голый MXML, на котором и построено всё приложение. Крупные вспомогательные структуры классов и обильные инклюды. В решении относительно сложных задач (либо совсем простых) я полагался только на pure AS проекты и компоненты.
  • Приложение делилось на компоненты (MXML компоненты), каждое окошко, каждый функционально законченный экран были компонентами. Обильное использование компонентов значительно упростило разработку приложений и внесло строгость и порядок, несмотря на довольно пространный список в Components -> Custom.
    Кроме того, такой подход значительно ускоряет разработку, уже засчет того, что визуальный редактор теперь не должен перерисовывать каждый раз всё приложение (а делает он это отнюдь не быстро).

Сегодня в разработке проект, который так и напрашивается на использование модулей. В общих чертах - это небольшой промо-сайт с тремя основными разделами. Три этих раздела мы и оформим как модули.

Руки так и зачесались попробовать создать модуль в FB. Открываю проект, создаю New->MXML Module. Открывается новый файл mxml, в который я добавляю, к примеру, кнопку, и текстовое поле. Сохраняю. В окошке Components->Custom появился новый компонент, по имени модуля.
Проведем эксперемент. Перетащим его в окно основного приложения. Всё как с обычным компонентом. Компилирую. Замечательно: скомпилировалось два swf - один с именем приложения, другой - с именем модуля.
Для любопытства, копируем один только swf приложения и запускаем: видим кнопку и текстовое поле. Как я и предполагал, наш модуль включен в состав swf приложения как обычный компонент.
Запустим swf модуля. Сразу получаем ошибку "Не удалось найти класс mx.core::SpriteAsset." И не мудрено - модуль не содержит классов, включенных в основное приложение.
Но нам-то от модуля нужно что? Чтобы он не был включен в приложение, а подгружался в процессе работы приложения. Хотя, возможность использовать модуль как обычный MXML-компонент тоже надо отметить.

Ознакомимся вкратце с документацией: Creating Modular Applications. Здесь всё, на достаточно понятном языке, достаточно подробно разжевывается.

Итак. Нас интересовали загрузка модуля и ее мониторинг.
Пожалуйста, смотрим: Loading and unloading modules. За загрузку отвечает класс ModuleLoader. Любопытно, что это наследник VBox. Непонятно, почему именно VBox, а не, к примеру, HBox. Уж я-то вообще ожидал увидеть в этой роли SWFLoader. Ну да ладно. Убираем из кода приложения модуль и вставляем ModuleLoader. Кстати, он присутствует в палитре компонентов Layout.
Вписываем в свойство url имя файла модуля. И что особенно приятно, визуальный редактор сразу отобразил содержимое модуля. Вводим имя другого модуля - пожалста! Отображается другой модуль. Запускаем - всё замечательно отображается и работает.
Теперь по поводу мониторинга. Смотрим Using ModuleLoader events. ModuleLoader генерирует следующие события: setup, ready, loading, unload, progress, error, и urlChanged. Но позвольте! Если progress мы наблюдаем в этом списке, то почему нет open и complete? Что помешало вместо loading генерировать open, а вместо ready - complete?
При таком раскладе, если я использую ProgressBar в режиме mode="event", загрузка успешно мониторится, но ProgressBar не генерирует событие complete, что в некоторых случаях было бы полезно. Ну что ж, никто не мешает нам устранить этот недостаток, создав своего потомка ModuleLoader. Дело поправимое.

Есть еще один компонент, управляющий загрузкой модулей: ModuleManager. Этот класс, как нам обещают, предоставляет больше возможностей по управлению загрузкой модулей чем предыдущий. Но при этом, как утверждается, техника его использования является менее абстрактной чем работа с ModuleLoader.
Да, разработчики Flex не перестают меня удивлять. ModuleManager наследуется от Object и содержит всего два статических метода, что ввело меня в небольшой ступор. Однако, после изучения предложенных примеров, всё встало на свои места. Метод ModuleManager.getModule возвращает объект, удовлетворяющий интерфейсу IModuleInfo, уникальный для каждого управляемого модуля. Этот объект, в дальнейшем, можно использовать для загрузки модуля (метод load) и мониторинга событий загрузки, а затем, для инстанцирования модуля (через свойство factory).
Более подробное изучение этого класса, погружает нас в глубины Flex, что в мои планы пока совсем не входит. Вот уж, другими словами и не скажешь - все намного менее абстрактно. И больше подходит для решения специфических задач.

Ну-с, добро пожаловать в мир модульных приложений. Начинаем действовать!


23:24:00, Flash-разработка
Модули vs. компоненты. Flex

В моем опыте Flex-разработки наступает новая стадия взросления.

Ну, условно, у себя я уже могу выделить две стадии (не считая робкого потрагивания и любопытного пощупывания):

  • Код представляет собой голый MXML, на котором и построено всё приложение. Крупные вспомогательные структуры классов и обильные инклюды. В решении относительно сложных задач (либо совсем простых) я полагался только на pure AS проекты и компоненты.
  • Приложение делилось на компоненты (MXML компоненты), каждое окошко, каждый функционально законченный экран были компонентами. Обильное использование компонентов значительно упростило разработку приложений и внесло строгость и порядок, несмотря на довольно пространный список в Components -> Custom.
    Кроме того, такой подход значительно ускоряет разработку, уже засчет того, что визуальный редактор теперь не должен перерисовывать каждый раз всё приложение (а делает он это отнюдь не быстро).

Сегодня в разработке проект, который так и напрашивается на использование модулей. В общих чертах - это небольшой промо-сайт с тремя основными разделами. Три этих раздела мы и оформим как модули.

Руки так и зачесались попробовать создать модуль в FB. Открываю проект, создаю New->MXML Module. Открывается новый файл mxml, в который я добавляю, к примеру, кнопку, и текстовое поле. Сохраняю. В окошке Components->Custom появился новый компонент, по имени модуля.
Проведем эксперемент. Перетащим его в окно основного приложения. Всё как с обычным компонентом. Компилирую. Замечательно: скомпилировалось два swf - один с именем приложения, другой - с именем модуля.
Для любопытства, копируем один только swf приложения и запускаем: видим кнопку и текстовое поле. Как я и предполагал, наш модуль включен в состав swf приложения как обычный компонент.
Запустим swf модуля. Сразу получаем ошибку "Не удалось найти класс mx.core::SpriteAsset." И не мудрено - модуль не содержит классов, включенных в основное приложение.
Но нам-то от модуля нужно что? Чтобы он не был включен в приложение, а подгружался в процессе работы приложения. Хотя, возможность использовать модуль как обычный MXML-компонент тоже надо отметить.

Ознакомимся вкратце с документацией: Creating Modular Applications. Здесь всё, на достаточно понятном языке, достаточно подробно разжевывается.

Итак. Нас интересовали загрузка модуля и ее мониторинг.
Пожалуйста, смотрим: Loading and unloading modules. За загрузку отвечает класс ModuleLoader. Любопытно, что это наследник VBox. Непонятно, почему именно VBox, а не, к примеру, HBox. Уж я-то вообще ожидал увидеть в этой роли SWFLoader. Ну да ладно. Убираем из кода приложения модуль и вставляем ModuleLoader. Кстати, он присутствует в палитре компонентов Layout.
Вписываем в свойство url имя файла модуля. И что особенно приятно, визуальный редактор сразу отобразил содержимое модуля. Вводим имя другого модуля - пожалста! Отображается другой модуль. Запускаем - всё замечательно отображается и работает.
Теперь по поводу мониторинга. Смотрим Using ModuleLoader events. ModuleLoader генерирует следующие события: setup, ready, loading, unload, progress, error, и urlChanged. Но позвольте! Если progress мы наблюдаем в этом списке, то почему нет open и complete? Что помешало вместо loading генерировать open, а вместо ready - complete?
При таком раскладе, если я использую ProgressBar в режиме mode="event", загрузка успешно мониторится, но ProgressBar не генерирует событие complete, что в некоторых случаях было бы полезно. Ну что ж, никто не мешает нам устранить этот недостаток, создав своего потомка ModuleLoader. Дело поправимое.

Есть еще один компонент, управляющий загрузкой модулей: ModuleManager. Этот класс, как нам обещают, предоставляет больше возможностей по управлению загрузкой модулей чем предыдущий. Но при этом, как утверждается, техника его использования является менее абстрактной чем работа с ModuleLoader.
Да, разработчики Flex не перестают меня удивлять. ModuleManager наследуется от Object и содержит всего два статических метода, что ввело меня в небольшой ступор. Однако, после изучения предложенных примеров, всё встало на свои места. Метод ModuleManager.getModule возвращает объект, удовлетворяющий интерфейсу IModuleInfo, уникальный для каждого управляемого модуля. Этот объект, в дальнейшем, можно использовать для загрузки модуля (метод load) и мониторинга событий загрузки, а затем, для инстанцирования модуля (через свойство factory).
Более подробное изучение этого класса, погружает нас в глубины Flex, что в мои планы пока совсем не входит. Вот уж, другими словами и не скажешь - все намного менее абстрактно. И больше подходит для решения специфических задач.

Ну-с, добро пожаловать в мир модульных приложений. Начинаем действовать!

* * *

Впечатления. Работа с модулями не разочаровала: стабильно и надежно. Единственные проблемы, с которыми я столкнулся:

  • Внедрение шрифта. CSS с внедрением TTF-шрифта определяется в главном приложении. Подгружаемые модули успешно используют эти шрифты. Но, возникла проблема с внедряемыми SWF, в которых используется другой шрифт. При вводе в динамические поля, ничего не отображалось. Тогда я внедрил этот шрифт в модуль. Шрифт стал отображаться. Но, что интересно, когда я собрал Release Build, шрифт опять перестал отображаться. Пришлось оставить Debug-версию модуля. Но это повлекло за собой следующую проблему.
  • Если основное приложение собрано в Release Build, оно некорректно подгружает модуль, собранный в Debug Build. Я думаю, что вообще, по-отдельности модули лучше не обновлять. Я обратил внимание, что размер SWF-файла модуля даже при небольших изменениях, при перекомпиляции заметно меняется. Поэтому, следует, наверное, соблюдать осторожность при компиляции и обновлении модулей.



2009-02-13

12:48:36, Flash-ripper.com
Flex CookBook: Как добавить множество визуальных потомков в свои MXML-компоненты

Олег Галабурда опубликовал во Flex Cookbook первый февральский пост который можно занести в актив UAFPUG в конкурсе "Кукбуклук".

На английском пост Олега называется так: Adding multiple sets of visual children to custom MXML components и в нем рассказывается, как с помощью состояний решить одну популярную проблему с добавлением многих дочерних компонентов к вашим собственным. Спасибо, Олег.

Напомню, что если вы публикуете пост во Flex CookBook, AIR Cookbook или Mobile Cookbook, то вы можете не ограничиваться вхождением в историю, но и получить возможность выиграть лицензию на Flex Builder 3 или Adobe CS4 Master Collection. Чтобы это стало возможным, я должен знать о вашей публикации и сообщать о ней Эду. А Эд выдаст нам серийный номер, который мы разыграем между опубликовавшими записи. Поэтому сообщайте мне на гуглопочту rostislav.siryk каждый раз, когда пишете в кукбук.


12:48:36, Flash-ripper.com
Flex CookBook: Как добавить множество визуальных потомков в свои MXML-компоненты

Олег Галабурда опубликовал во Flex Cookbook первый февральский пост который можно занести в актив UAFPUG в конкурсе "Кукбуклук".

На английском пост Олега называется так: Adding multiple sets of visual children to custom MXML components и в нем рассказывается, как с помощью состояний решить одну популярную проблему с добавлением многих дочерних компонентов к вашим собственным. Спасибо, Олег.

Напомню, что если вы публикуете пост во Flex CookBook, AIR Cookbook или Mobile Cookbook, то вы можете не ограничиваться вхождением в историю, но и получить возможность выиграть лицензию на Flex Builder 3 или Adobe CS4 (любой набор кроме Master Collection). Чтобы это стало возможным, я должен знать о вашей публикации и сообщать о ней Эду. А Эд выдаст нам серийный номер, который мы разыграем между опубликовавшими записи. Поэтому сообщайте мне на гуглопочту rostislav.siryk каждый раз, когда пишете в кукбук.


2009-02-02

14:39:45, 33 коровы
Код форматер для Flex Builder

Ура!

свершилось чудо, появился бесплатный кодоформатер для as3|mxml в Flex Builder

http://www.riaspace.net/2009/01/ctrlshiftf-for-flex-builder/

В отличаи от ранее предлагаемого в поставке InterpriseIDE имеет настройки форматирования и работает лучше (ну или мне так показалось).

Спасибо Косте за ссылку


14:39:45, 33 коровы
Код форматер для Flex Builder

Ура!

свершилось чудо, появился бесплатный кодоформатер для as3|mxml в Flex Builder

http://www.riaspace.net/2009/01/ctrlshiftf-for-flex-builder/

В отличаи от ранее предлагаемого в поставке InterpriseIDE имеет настройки форматирования и работает лучше (ну или мне так показалось).

Спасибо Косте за ссылку


2009-01-30

16:10:16, Flash-ripper.com
Доки и уроки по редактору FlashDevelop

Время от времени кто-то спрашивает, с чего начать освоение FlashDevelop, замечательного IDE для разработки Flash / Flex приложений. Некоторые туториалы и информация по флэшдевелопу:

Что-то здесь лишнее, а чего-то не хватает? Прошу высказываться и давать ссылки — облегчим правильным людям начало жизни с правильным редактором кода.


2008-12-24

18:33:45, Flash-ripper.com
Шорткаты Flex Builder'а для быстрого перемещения в блоках кода

Обнаружил, что во Flex Builder работают шорткаты, позволяющие переключаться между открывающими и закрывающими скобками в коде:

Flex Builder 3 - Braces shortcuts

Работают так, как и показано в картинке:

Ctrl+Shift+P — переключает между открывающей и закрывающей фигурными скобками при редактировании MXML- или AS3- кода.
Ctrl+B — переключает между открывающей и закрывающей фигурными или круглыми скобками при редактировании JavaScript-кода (при установленном JSEclipse, идет вместе с Flex Builder).
Ctrl+G — выделяет текст между открывающей и закрывающей скобками при редактировании JavaScript-кода (нужен JSEclipse).

Возможно, это для вас уже и не новость, но вот в Aptana IDE такого шортката нет (а там он еще нужнее при редактировании больших блоков JSON-кода).

Ссылка про теме: 10 Eclipse Navigation Shortcuts Every Java Programmer Should Know.


18:33:45, Flash-ripper.com
???????????????? Flex Builder'?? ?????? ???????????????? ?????????????????????? ?? ???????????? ????????

??????????????????, ?????? ???? Flex Builder ???????????????? ????????????????, ?????????????????????? ?????????????????????????? ?????????? ???????????????????????? ?? ???????????????????????? ???????????????? ?? ????????:

Flex Builder 3 - Braces shortcuts

???????????????? ??????, ?????? ?? ???????????????? ?? ????????????????:

Ctrl+Shift+P ??? ?????????????????????? ?????????? ?????????????????????? ?? ?????????????????????? ?????????????????? ???????????????? ?????? ???????????????????????????? MXML- ?????? AS3- ????????.
Ctrl+B ??? ?????????????????????? ?????????? ?????????????????????? ?? ?????????????????????? ?????????????????? ?????? ???????????????? ???????????????? ?????? ???????????????????????????? JavaScript-???????? (?????? ?????????????????????????? JSEclipse, ???????? ???????????? ?? Flex Builder).
Ctrl+G ??? ???????????????? ?????????? ?????????? ?????????????????????? ?? ?????????????????????? ???????????????? ?????? ???????????????????????????? JavaScript-???????? (?????????? JSEclipse).

????????????????, ?????? ?????? ?????? ?????? ?? ???? ??????????????, ???? ?????? ?? Aptana IDE ???????????? ???????????????? ?????? (?? ?????? ???? ?????? ???????????? ?????? ???????????????????????????? ?????????????? ???????????? JSON-????????).

???????????? ?????? ????????: 10 Eclipse Navigation Shortcuts Every Java Programmer Should Know.


2008-12-22

12:09:28, Flash-ripper.com
AXDT и FlexBean — в подарок линуксоиду-минималисту

Нам пишет Елена Геллер (Дортмунд, Германия):

Вы когда-то сообщали о Flexclipse как о "минималистской" среде разработки. Flexclipse, похоже, пока не развивается. Существуют, однако, два других интересных опенсорсных проекта — axdt для Eclipse от Martin Schnabel (до этого, как я понимаю, создал ASDT) и FlexBean для Netbeans.

Оба проекта до времени находились в довольно сыром состоянии. Но вот недавно AXDT (с версии 0.0.6) и FlexBean (с сегодня) относительно юзабельны. Для больших проектов не вполне годятся, но для небольших поделок руками пользователей Линукса уже применяться могут. Как дебаггер "до кучи" вполне пойдет Arthropod; я его недавно оттестировала на Opensuse 11, запущенной в live-варианте с CD еще с бета-версией AIR — работает себе.

Насколько это актуально для отечественного разработчика, часто и густо пользующего "левый" софт (и, "имея то, что имеем", осуждать людей тут не за что), я не знаю. Это несколько актуальнее для западных линуксоидов. Да и вообще, для мелких самостоятельных разработчиков, не желающих проблем с законом, но начинающих практически с нуля (имею в виду материальную базу). Но по крайней мере, Flex-разработка под Линуксом медленно становится реальностью.

Ах да: плюсы и минусы. AXDT пользует опенсорсный Flex SDK, в настоящее время поставляется с версиями 3 и 4, но самостоятельно версию поменять нельзя. Cкажем, если завтра выйдет 3.3., то надо будет ждать следующей версии AXDT, которая авось это учтет. То есть может быть там можно что-то "подточить напильником", но я пока не знаю, где именно. А вот FlexBean можно без проблем переключать между любым количеством версий Flex SDK, но:

  1. Для MXML пока что нет подсветки кода.
  2. Проект по умолчанию создается с главным mxml-файлом, поэтому, если хочешь чисто AS-проект, надо сначала позволить создать этот главный файл (все остальное невозможно), а потом подправить свойства проекта.

Разумеется, об удобствах, предоставляемых FlashDevelop, пока можно только мечтать, но мы же пока что говорим о минималистском варианте. К тому же мне пока неясно, возможно ли подключать в обоих плагинах внешние библиотеки. Пока что я вижу только одну возможность: в той же папке, где лежит главный файл проекта (назовем его main.as), добавить конфигурационный файл, который в этом случае будет называться main-config.xml (тогда при компиляции он считается по умолчанию), и в нем внести все необходимые параметры, не забыв при этом цвет фона / ширину / высоту и пр.

Елена, спасибо за этот обзор!


12:09:28, Flash-ripper.com
AXDT ?? FlexBean ??? ?? ?????????????? ????????????????????-??????????????????????

?????? ?????????? ?????????? ???????????? (????????????????, ????????????????):

???? ??????????-???? ???????????????? ?? Flexclipse ?????? ?? "????????????????????????????" ?????????? ????????????????????. Flexclipse, ????????????, ???????? ???? ??????????????????????. ????????????????????, ????????????, ?????? ???????????? ???????????????????? ?????????????????????? ?????????????? ??? axdt ?????? Eclipse ???? Martin Schnabel (???? ??????????, ?????? ?? ??????????????, ???????????? ASDT) ?? FlexBean ?????? Netbeans.

?????? ?????????????? ???? ?????????????? ???????????????????? ?? ???????????????? ?????????? ??????????????????. ???? ?????? ?????????????? AXDT (?? ???????????? 0.0.6) ?? FlexBean (?? ??????????????) ???????????????????????? ??????????????????. ?????? ?????????????? ???????????????? ???? ???????????? ??????????????, ???? ?????? ?????????????????? ?????????????? ???????????? ?????????????????????????? ?????????????? ?????? ?????????????????????? ??????????. ?????? ???????????????? "???? ????????" ???????????? ???????????? Arthropod; ?? ?????? ?????????????? ?????????????????????????? ???? Opensuse 11, ???????????????????? ?? live-???????????????? ?? CD ?????? ?? ????????-?????????????? AIR ??? ???????????????? ????????.

?????????????????? ?????? ?????????????????? ?????? ???????????????????????????? ????????????????????????, ?????????? ?? ?????????? ?????????????????????? "??????????" ???????? (??, "???????? ????, ?????? ??????????", ???????????????? ?????????? ?????? ???? ???? ??????), ?? ???? ????????. ?????? ?????????????????? ???????????????????? ?????? ???????????????? ??????????????????????. ???? ?? ????????????, ?????? ???????????? ?????????????????????????????? ??????????????????????????, ???? ???????????????? ?????????????? ?? ??????????????, ???? ???????????????????? ?????????????????????? ?? ???????? (???????? ?? ???????? ???????????????????????? ????????). ???? ???? ?????????????? ????????, Flex-???????????????????? ?????? ???????????????? ???????????????? ???????????????????? ??????????????????????.

???? ????: ?????????? ?? ????????????. AXDT ???????????????? ?????????????????????? Flex SDK, ?? ?????????????????? ?????????? ???????????????????????? ?? ???????????????? 3 ?? 4, ???? ???????????????????????????? ???????????? ???????????????? ????????????. C??????????, ???????? ???????????? ???????????? 3.3., ???? ???????? ?????????? ?????????? ?????????????????? ???????????? AXDT, ?????????????? ?????????? ?????? ??????????. ???? ???????? ?????????? ???????? ?????? ?????????? ??????-???? "?????????????????? ??????????????????????", ???? ?? ???????? ???? ????????, ?????? ????????????. ?? ?????? FlexBean ?????????? ?????? ?????????????? ?????????????????????? ?????????? ?????????? ?????????????????????? ???????????? Flex SDK, ????:

  1. ?????? MXML ???????? ?????? ?????? ?????????????????? ????????.
  2. ???????????? ???? ?????????????????? ?????????????????? ?? ?????????????? mxml-????????????, ??????????????, ???????? ???????????? ?????????? AS-????????????, ???????? ?????????????? ?????????????????? ?????????????? ???????? ?????????????? ???????? (?????? ?????????????????? ????????????????????), ?? ?????????? ???????????????????? ???????????????? ??????????????.

????????????????????, ???? ??????????????????, ?????????????????????????????? FlashDevelop, ???????? ?????????? ???????????? ??????????????, ???? ???? ???? ???????? ?????? ?????????????? ?? ???????????????????????????? ????????????????. ?? ???????? ???? ?????? ???????? ????????????, ???????????????? ???? ???????????????????? ?? ?????????? ???????????????? ?????????????? ????????????????????. ???????? ?????? ?? ???????? ???????????? ???????? ??????????????????????: ?? ?????? ???? ??????????, ?????? ?????????? ?????????????? ???????? ?????????????? (?????????????? ?????? main.as), ???????????????? ???????????????????????????????? ????????, ?????????????? ?? ???????? ???????????? ?????????? ???????????????????? main-config.xml (?????????? ?????? ???????????????????? ???? ?????????????????? ???? ??????????????????), ?? ?? ?????? ???????????? ?????? ?????????????????????? ??????????????????, ???? ?????????? ?????? ???????? ???????? ???????? / ???????????? / ???????????? ?? ????.

??????????, ?????????????? ???? ???????? ??????????!


2008-12-16

10:40:00, Flash-разработка
Кривые Безье. Подбираем движок. AS3

Передо мной стоит прозаичная задача - мини-редактор с использованием кривых Безье. Есть некая фигура, состоящая из кривых. Необходимо ее редактировать, путем изменении положения опорных точек.

Итак, прежде чем обратиться к таким авторитетным проектам как http://bezier.ru/, интересно было бы прогуляться по гуглу и посмотреть, что еще предлагают по этой теме.

Один из первых попавшихся - блог Paul Tondeur и его изыскания на эту тему: Drawing a cubic bezier curve using ActionScript3. Здесь можно ознакомиться с теоретической частью и изучить примерчик.

Дальше, получаем интересную статейку ссылкой с Drawlogic.com на labs.zeh.com.br: The search for the perfect bezier tweening syntax. Поиск решения создания пути перемещения при помощи кривых Безье. Особенно понравился пример с использованием Papervision3D - задается путь движения между фигурами.

Далее: Singularity представляет черезчур заумные классы с кучей примеров: Demos. Статья с описанием: AS 3 Parametric Curve Library.

Еще одна хорошая ссылочка: некий Cartogrammar представляет весьма доступный и очень простой в использовании класс CubicBezier.as. Здесь всего два статических метода, которые отрисовывают кривые разными способами. Кстати, очень даже заслуживает внимания. Пока ходил по ссылкам, натолкнулся на забавную демку как раз с использованием этого класса: AS3 Bezier blobs/metaballs

Интересный набор библиотек на Greensock: TweenLite, TweenMax, TweenFilterLite, TransformManager (AS3), TweenGroup. Не относится к кривым Безье (точнее их использует в некоторых случаях), но заставляет обратить на себя внимание.

Небольшое решение, которое может быть полезным: CurveToArray (AS3 class). На основании трех точек кривой Безье, выдает массив координат точек кривой.

Еще немного русскоязычного: Движение по кривой Безье.

А вот некий Flashgamer советует задвинуть "a couple good resources" и взяться все же за Degrafa. Ввиду "крупности" этого движка, оставим его на десерт.

Поглядим, таки, что нам предлагает наш http://bezier.ru/. Здесь множество документации на русском (что важно), обзорная демка и исходники. Скачать исходники можно при помощи SVN-клиента. - делаем СheckОut. Исходники по большей части представляют собой примеры использования, что конечно радует. В принципе писать тут нечего - сайт полон информации на русском, и если что, здесь же можно написать комментарий и получить ответ от хозяев. Надо просто попробовать.
Создаем проект AS3 в FD, кладем в него примеры, прописываем пути к библиотеке и компилируем. Ошибка: "Bezier.as(1488): col: 12 Error: Недопустимое присваивание переменной, которая определена как константа." Ну что ж делать, бывает. В строке "const limiter : Number = 20;" Меняем "const" на "var" и наслаждаемся демкой.
Кстати, исходный код просто перегружен ASDoc-комментариями (что, безусловно, является достоинством). Однако, ни на сайте, ни на Google Code я не смог найти ASDoc-документации Bezier. Странно...

Перейдем к Degrafa. Скачать ее можно на Google Code, но я, пожалуй, воспользуюсь SVN. Пришлось здорово повозиться, чтобы запустить примеры.
При использовании исходников, я вообще не смог избавиться от ошибок - что я не делал - везде вставала проблема некорректных namespace.
При использовании SWC, пример тоже выдавал кучу ошибок. Загвозка была в том, что в примерах указан namespace xmlns:degrafa="http://www.degrafa.com/2008", а нужно xmlns:degrafa="http://www.degrafa.com/2007".
Вывод по Degrafa - мощная и популярная система, но требует углубленного изучения.

Итак, вывод. Для себя я избрал три варианта:

  1. CubicBezier.as.
  2. Bezier.ru.
  3. Degrafa.

CubicBezier - вполне работоспособный, примитивный движок позволяющий рисовать кривые Безье с различными параметрами. Его можно сразу использовать "как есть", либо с необходимыми модификациями, которые внести совсем не сложно. Предварительного изучения не требует, для моей задачи подходит "на ура".
Bezier - Требует предварительного изучения, зато предоставляет широкий набор возможностей для решения большинства практических задач, связанных с кривыми Безье.
Degrafa - Мощный комплекс, позволяющий создавать графику декларативно, при помощи MXML. Для того, чтобы приступить к решению задачи, придется изрядно почитать документацию, которая имеется в изобилии, в формате ASDoc. За изучение есть смысл взяться, т.к. проект весьма перспективный и популяризирующийся. Однако, как всегда, под конец года времени нет, поэтому придется отложить. Но не надолго - ощутив вкус прелестей Degrafa, уже не хочется от него отказываться.


2008-12-09

13:56:50, 33 коровы
Наш ответ Чемберлену или проблемы сравнения конкурирующих платформ

Сегодня в сети появилась статья “Еще одно сравнение Adobe Flash и Silverlight 2″ , прочитав ее я понял главную ошибку авторов этих статей — каждый автор является специалистом только в одной области, или Flash|Flex или Silverlight. Поэтому страдают “конкурирующие платформы”. Как выход я вижу написание совместной статьи (но это дело долгих споров). Автор данной статья не избежал ошибок и показал всое поверхностное знание Flex/Flash технологии.

Я попытаюсь исправить его недочеты, для полноты картины )

В начале оговоримся что я не буду в ходе разговора использовать софт который находится в стадии альфа, бетта и пререлиз ).

Среда разработки и прочий инструментарий.

Для начала разберемся с инструментраем и возможностями:

FlashPlayer — это плагин который позволяет проигрывать swf файлы (байт код, который можно создавать где и как угодно, например умельцы рантайм генерят его и сразу же запускают в флешплеере).
Flash IDE/Flex Builder — это среда позволяющая создавать swf файлы.
Flex framework — это фреймворк позволяющий быстро и эффективно создавать RIA приложения. Flex Builder “заточен” для работы с Flex framework.

Использование Flash IDE как средство разработки крупных приложений, довольно опрометчивый шаг. Ее, в контекте разработы RIA лучше использовать как дополнительное средство.

Вообще не стоит говорить что вся разработка сводится к связку Flash IDE(графика)-Flex(код) — это просто частный случай варианта разработки.

а использовать только Flex сложно, поскольку ничего похожего на дизайн-вью в нем просто нет.

Ляп! пожалуйста, жмем на кнопку Design в MXML редакторе и видим дизайн вью. (единственно что он не работает в билдере под линукс). Может канечно этот дизайн вью и не такой навороченый как бленд, но он есть )

Язык программирования

ActionScript 3 являеться вариантом реализации ECMAScript-262, 4 версии http://en.wikipedia.org/wiki/ECMAScript , Я не буду искать подробности отличая от этого стандарта, они есть и это можно найти воспользовавшись гуглом ).

Язык не имеет …

Да язык часто ругают за его непродвинутость.

Язык не имеет встроенной событийной модели

но это вот ляп, событийная модель является главной фичей флешплеера 9 и выше.
– кстате автор нигде не учитывал возможности флешплеера 10 ) который уже вышел в релиз.

Отдельной строкой хочется сказать об отладчике.
Если во Flex Builder он еще куда ни шло, то во Flash им просто невозможно пользоваться – основным методом отладки до сих пор является trace.

При разработке крупных проектов боже вас упаси использовать и дебажить во Flash IDE! вы же не будете дебажить в Blend’e ;)

Поддержка ОС и браузеров:
А что есть нормальная(официальная) поддержка Linux? Как мне поница Moonlight дорос пока только до версии 1. вобщем то до релиза далеко.
К том же плеер более стабилен в различных системах. (мне порой приходится перегружать барузер или запускать ИЕ чтобы посмотреть приложение на Silverlight, Маководы жалуются что не всегда получается поставить плагин)

Возможность упаковки в исполняемый файл:

Стоит учитывать что есть продукты сторонних производителей которые позволяют делать испольняемые файлвы из флеш/флекс приложений, причем под разные платформы (например Zinс)

Изображения:
JPEG, GIF, PNG — флеш с этим работает на лету. Вектор, у флеша это в крови. Кроме того, что можно импортировать ai,пдф файлы автор забыли о поддержке SVG графики. Причем уже есть библиотреки позволяющие использовать ее рантайм. (Например degrafa http://www.degrafa.com/2007/07/27/how-complex-can-you-get-with-degrafa-very/).
Также можно реализовать поддержку практичеки любого формата графики (ByteArray+Bitmap+Drawing API).
Про скорость отрисовки я бы вообще ничего не говорил, как не крути у флешплеера она больше.
А проблемы подготовки графики это уже проблемы кривых рук.

Видео:
flv это хорошее сжатие, но и возможность лайфстриминга, перемотки и других фич
из коментариев:
+ есть поддержка HD video
Флешплеер это тоже поддерживает.
+ теоретически, поддержку flv можно реализовать самому, используя MediaStreamSource (тут есть примеры http://code.msdn.microsoft.com/ManagedMediaHelpers)
нужна практика а не теория, хотя такой возможностью флеш не может покак порадовать.
Как не крути пока приоритет на стороне флеша

Шрифты:

Имеет три встроенных шрифта, поддерживается импорт символов из шрифтов ТТF, ограниченно поддерживаются шрифты, установленные в системе.

просто глупость.
Мы можем влючить любой шрифт в наше приложение, и он будет работать везде.
3 шрифта, тоже глупость, Просто по умолчанию флекс компоненты используют заданые шрифты, и нечего более.

Формально, не импортированные шрифты поддерживаются. Однако, с текстом, напечатанным таким шрифтом, почти ничего нельзя делать: ни поворачивать, ни масштабировать, ни использовать в качестве маски.

Раньше (9 и ниже версии плеера) и вправду не позволяли таких операций как вращение, масштабирование (вытягивание по какой-то оси), в 10 плеере вы можете делать с любым шрифтом, что угодно и как угодно.

Сокеты:
незнаю что твориться в Silverlight, но в FlashPlayer к сожелению имеет некоторые ограничения :(

Работа с файлами:
Принципиальное преисущество было у Silverlight до выхода 10 версии флешплеера, теперь его нет ).

Хранение данных на клиенте:
хе хе пункту просто не зачет. никак не может влиять на оценку платформы.

Разметка:
Спорный вопрос. Я бы не ставил плюса ни одной из технологий.
Если говорить о скором будующем то будет революция ;) Ключевое слово Flash Catalyst

«Программное» рисование:
Незнаю как обстоят дела в Silverlight, но во флеш им можно творить чудеса.

«Программная» анимация:

Flash/Flex: Основана на фрэймах.

Никто не мешает использовать верменные интервалы. т.е. больше возможностей ).
Я не спец в этой области и пусть те кто работают с FlashCS3|CS4 добавят свои коменты. ).

Собственные контролы:
Автор описал только один, довольно причудливый способ :).
Да. Визуально не всегда сразу можно посмотреть на внешний вид компонента.
Опять же для спора и нахождения истены в данном вопросе нужно сначало определиться с понятием “Собственный контрол”.

Кастомизация контролов
Я незнаю как работают стили в WPF, но

ни все равно почти начисто обходит css-образные стили Flex, которые по сути не многим более чем обычные словари, которые можно хранить в отдельных файлах. Стили во Flex не поддерживают байндинга, не позволяют задавать темплейты, не имеют строгой типизации, и уж тем более не позволяют хранить внутри себя анимацию, не умеют изменятся в зависимости от каких-либо условий.

Полный бред. Для начала ознакомтесь с возможностями стилировния, затем полистайте примеры на той же Деграфе. Стили во флексе ограничиваются только фантазией, как только она закончилась, так и закончились стили )

Связывание данных

Да, во Flex не создается как таковой объект биндинга

Он то создаеться, но вот доступа мы к нему не имеем. Также есть возможность создать биндинг в коде BindingUtils

А двусторонний биндинг, единственный пока что козырь Silverlight, во Flex добавят в Gumbo.

В Flex 2|3 это также легко реализуется, как в коде так и с использованием MXML :)

Реализация MVC
Flex Framework и есть реалиация MVC просто она скрыта от глаз программистов. Поэтому они не разобравшись пугаються и пытаюстся насочинять своих фреймворков ).
А насочиняли их уже много Cairngorm/PureMVC/Mate/Guasax/Model-Glue… и так далее.

Вроде пока все, что пришло на ум.

Поэтому я бы не спешил делать такие опрометчивые выводы, незная не платформы, и незная текущего состояния вещей.
В скором вермени (2009 год) Adobe ух как пошатнет преимущества разработки под сильверлайт, И я бы не стал говорить, что “с точки зрения удобства для разработчика “серебренный свет” уже вне досегаемости”.

Единственными весомым преимуществами Silverlight является:
- большее количество “тяжолых” разработчиков, которые прошли огонь и воду в програмирование под C# и т.д. В отличаии от разработчиков Flex которые в большей части работали во Флеш
- политика отношения Microsoft к разработчикам, ее тактика “Мы везде и никто кроме нас)”. Обучение, бонусы и т.д.

ЗЫ
Неосвещенным остался вопрос производительности, но это тема для отдельного большого исследования.
Как показывает практика FlashPlayer быстрее в графике, как не крути, нельзя сказать что намного, но все же приятно :)


13:56:50, 33 коровы
Наш ответ Чемберлену или проблемы сравнения конкурирующих платформ

Сегодня в сети появилась статья “Еще одно сравнение Adobe Flash и Silverlight 2″ , прочитав ее я понял главную ошибку авторов этих статей — каждый автор является специалистом только в одной области, или Flash|Flex или Silverlight. Поэтому страдают “конкурирующие платформы”. Как выход я вижу написание совместной статьи (но это дело долгих споров). Автор данной статья не избежал ошибок и показал всое поверхностное знание Flex/Flash технологии.

Я попытаюсь исправить его недочеты, для полноты картины )

В начале оговоримся что я не буду в ходе разговора использовать софт который находится в стадии альфа, бетта и пререлиз ).

Среда разработки и прочий инструментарий.

Для начала разберемся с инструментраем и возможностями:

FlashPlayer — это плагин который позволяет проигрывать swf файлы (байт код, который можно создавать где и как угодно, например умельцы рантайм генерят его и сразу же запускают в флешплеере).
Flash IDE/Flex Builder — это среда позволяющая создавать swf файлы.
Flex framework — это фреймворк позволяющий быстро и эффективно создавать RIA приложения. Flex Builder “заточен” для работы с Flex framework.

Использование Flash IDE как средство разработки крупных приложений, довольно опрометчивый шаг. Ее, в контекте разработы RIA лучше использовать как дополнительное средство.

Вообще не стоит говорить что вся разработка сводится к связку Flash IDE(графика)-Flex(код) — это просто частный случай варианта разработки.

а использовать только Flex сложно, поскольку ничего похожего на дизайн-вью в нем просто нет.

Ляп! пожалуйста, жмем на кнопку Design в MXML редакторе и видим дизайн вью. (единственно что он не работает в билдере под линукс). Может канечно этот дизайн вью и не такой навороченый как бленд, но он есть )

Язык программирования

ActionScript 3 являеться вариантом реализации ECMAScript-262, 4 версии http://en.wikipedia.org/wiki/ECMAScript , Я не буду искать подробности отличая от этого стандарта, они есть и это можно найти воспользовавшись гуглом ).

Язык не имеет …

Да язык часто ругают за его непродвинутость.

Язык не имеет встроенной событийной модели

но это вот ляп, событийная модель является главной фичей флешплеера 9 и выше.
– кстате автор нигде не учитывал возможности флешплеера 10 ) который уже вышел в релиз.

Отдельной строкой хочется сказать об отладчике.
Если во Flex Builder он еще куда ни шло, то во Flash им просто невозможно пользоваться – основным методом отладки до сих пор является trace.

При разработке крупных проектов боже вас упаси использовать и дебажить во Flash IDE! вы же не будете дебажить в Blend’e ;)

Поддержка ОС и браузеров:
А что есть нормальная(официальная) поддержка Linux? Как мне поница Moonlight дорос пока только до версии 1. вобщем то до релиза далеко.
К том же плеер более стабилен в различных системах. (мне порой приходится перегружать барузер или запускать ИЕ чтобы посмотреть приложение на Silverlight, Маководы жалуются что не всегда получается поставить плагин)

Возможность упаковки в исполняемый файл:

Стоит учитывать что есть продукты сторонних производителей которые позволяют делать испольняемые файлвы из флеш/флекс приложений, причем под разные платформы (например Zinс)

Изображения:
JPEG, GIF, PNG — флеш с этим работает на лету. Вектор, у флеша это в крови. Кроме того, что можно импортировать ai,пдф файлы автор забыли о поддержке SVG графики. Причем уже есть библиотреки позволяющие использовать ее рантайм. (Например degrafa http://www.degrafa.com/2007/07/27/how-complex-can-you-get-with-degrafa-very/).
Также можно реализовать поддержку практичеки любого формата графики (ByteArray+Bitmap+Drawing API).
Про скорость отрисовки я бы вообще ничего не говорил, как не крути у флешплеера она больше.
А проблемы подготовки графики это уже проблемы кривых рук.

Видео:
flv это хорошее сжатие, но и возможность лайфстриминга, перемотки и других фич
из коментариев:
+ есть поддержка HD video
Флешплеер это тоже поддерживает.
+ теоретически, поддержку flv можно реализовать самому, используя MediaStreamSource (тут есть примеры http://code.msdn.microsoft.com/ManagedMediaHelpers)
нужна практика а не теория, хотя такой возможностью флеш не может покак порадовать.
Как не крути пока приоритет на стороне флеша

Шрифты:

Имеет три встроенных шрифта, поддерживается импорт символов из шрифтов ТТF, ограниченно поддерживаются шрифты, установленные в системе.

просто глупость.
Мы можем влючить любой шрифт в наше приложение, и он будет работать везде.
3 шрифта, тоже глупость, Просто по умолчанию флекс компоненты используют заданые шрифты, и нечего более.

Формально, не импортированные шрифты поддерживаются. Однако, с текстом, напечатанным таким шрифтом, почти ничего нельзя делать: ни поворачивать, ни масштабировать, ни использовать в качестве маски.

Раньше (9 и ниже версии плеера) и вправду не позволяли таких операций как вращение, масштабирование (вытягивание по какой-то оси), в 10 плеере вы можете делать с любым шрифтом, что угодно и как угодно.

Сокеты:
незнаю что твориться в Silverlight, но в FlashPlayer к сожелению имеет некоторые ограничения :(

Работа с файлами:
Принципиальное преисущество было у Silverlight до выхода 10 версии флешплеера, теперь его нет ).

Хранение данных на клиенте:
хе хе пункту просто не зачет. никак не может влиять на оценку платформы.

Разметка:
Спорный вопрос. Я бы не ставил плюса ни одной из технологий.
Если говорить о скором будующем то будет революция ;) Ключевое слово Flash Catalyst

«Программное» рисование:
Незнаю как обстоят дела в Silverlight, но во флеш им можно творить чудеса.

«Программная» анимация:

Flash/Flex: Основана на фрэймах.

Никто не мешает использовать верменные интервалы. т.е. больше возможностей ).
Я не спец в этой области и пусть те кто работают с FlashCS3|CS4 добавят свои коменты. ).

Собственные контролы:
Автор описал только один, довольно причудливый способ :).
Да. Визуально не всегда сразу можно посмотреть на внешний вид компонента.
Опять же для спора и нахождения истены в данном вопросе нужно сначало определиться с понятием “Собственный контрол”.

Кастомизация контролов
Я незнаю как работают стили в WPF, но

ни все равно почти начисто обходит css-образные стили Flex, которые по сути не многим более чем обычные словари, которые можно хранить в отдельных файлах. Стили во Flex не поддерживают байндинга, не позволяют задавать темплейты, не имеют строгой типизации, и уж тем более не позволяют хранить внутри себя анимацию, не умеют изменятся в зависимости от каких-либо условий.

Полный бред. Для начала ознакомтесь с возможностями стилировния, затем полистайте примеры на той же Деграфе. Стили во флексе ограничиваются только фантазией, как только она закончилась, так и закончились стили )

Связывание данных

Да, во Flex не создается как таковой объект биндинга

Он то создаеться, но вот доступа мы к нему не имеем. Также есть возможность создать биндинг в коде BindingUtils

А двусторонний биндинг, единственный пока что козырь Silverlight, во Flex добавят в Gumbo.

В Flex 2|3 это также легко реализуется, как в коде так и с использованием MXML :)

Реализация MVC
Flex Framework и есть реалиация MVC просто она скрыта от глаз программистов. Поэтому они не разобравшись пугаються и пытаюстся насочинять своих фреймворков ).
А насочиняли их уже много Cairngorm/PureMVC/Mate/Guasax/Model-Glue… и так далее.

Вроде пока все, что пришло на ум.

Поэтому я бы не спешил делать такие опрометчивые выводы, незная не платформы, и незная текущего состояния вещей.
В скором вермени (2009 год) Adobe ух как пошатнет преимущества разработки под сильверлайт, И я бы не стал говорить, что “с точки зрения удобства для разработчика “серебренный свет” уже вне досегаемости”.

Единственными весомым преимуществами Silverlight является:
- большее количество “тяжолых” разработчиков, которые прошли огонь и воду в програмирование под C# и т.д. В отличаии от разработчиков Flex которые в большей части работали во Флеш
- политика отношения Microsoft к разработчикам, ее тактика “Мы везде и никто кроме нас)”. Обучение, бонусы и т.д.

ЗЫ
Неосвещенным остался вопрос производительности, но это тема для отдельного большого исследования.
Как показывает практика FlashPlayer быстрее в графике, как не крути, нельзя сказать что намного, но все же приятно :)


13:56:50, 33 коровы
Наш ответ Чемберлену или проблемы сравнения конкурирующих платформ

Сегодня в сети появилась статья “Еще одно сравнение Adobe Flash и Silverlight 2″ , прочитав ее я понял главную ошибку авторов этих статей — каждый автор является специалистом только в одной области, или Flash|Flex или Silverlight. Поэтому страдают “конкурирующие платформы”. Как выход я вижу написание совместной статьи (но это дело долгих споров). Автор данной статья не избежал ошибок и показал всое поверхностное знание Flex/Flash технологии.

Я попытаюсь исправить его недочеты, для полноты картины )

В начале оговоримся что я не буду в ходе разговора использовать софт который находится в стадии альфа, бетта и пререлиз ).

Среда разработки и прочий инструментарий.

Для начала разберемся с инструментраем и возможностями:

FlashPlayer — это плагин который позволяет проигрывать swf файлы (байт код, который можно создавать где и как угодно, например умельцы рантайм генерят его и сразу же запускают в флешплеере).
Flash IDE/Flex Builder — это среда позволяющая создавать swf файлы.
Flex framework — это фреймворк позволяющий быстро и эффективно создавать RIA приложения. Flex Builder “заточен” для работы с Flex framework.

Использование Flash IDE как средство разработки крупных приложений, довольно опрометчивый шаг. Ее, в контекте разработы RIA лучше использовать как дополнительное средство.

Вообще не стоит говорить что вся разработка сводится к связку Flash IDE(графика)-Flex(код) — это просто частный случай варианта разработки.

а использовать только Flex сложно, поскольку ничего похожего на дизайн-вью в нем просто нет.

Ляп! пожалуйста, жмем на кнопку Design в MXML редакторе и видим дизайн вью. (единственно что он не работает в билдере под линукс). Может канечно этот дизайн вью и не такой навороченый как бленд, но он есть )

Язык программирования

ActionScript 3 являеться вариантом реализации ECMAScript-262, 4 версии http://en.wikipedia.org/wiki/ECMAScript , Я не буду искать подробности отличая от этого стандарта, они есть и это можно найти воспользовавшись гуглом ).

Язык не имеет …

Да язык часто ругают за его непродвинутость.

Язык не имеет встроенной событийной модели

но это вот ляп, событийная модель является главной фичей флешплеера 9 и выше.
– кстате автор нигде не учитывал возможности флешплеера 10 ) который уже вышел в релиз.

Отдельной строкой хочется сказать об отладчике.
Если во Flex Builder он еще куда ни шло, то во Flash им просто невозможно пользоваться – основным методом отладки до сих пор является trace.

При разработке крупных проектов боже вас упаси использовать и дебажить во Flash IDE! вы же не будете дебажить в Blend’e ;)

Поддержка ОС и браузеров:
А что есть нормальная(официальная) поддержка Linux? Как мне поница Moonlight дорос пока только до версии 1. вобщем то до релиза далеко.
К том же плеер более стабилен в различных системах. (мне порой приходится перегружать барузер или запускать ИЕ чтобы посмотреть приложение на Silverlight, Маководы жалуются что не всегда получается поставить плагин)

Возможность упаковки в исполняемый файл:

Стоит учитывать что есть продукты сторонних производителей которые позволяют делать испольняемые файлвы из флеш/флекс приложений, причем под разные платформы (например Zinс)

Изображения:
JPEG, GIF, PNG — флеш с этим работает на лету. Вектор, у флеша это в крови. Кроме того, что можно импортировать ai,пдф файлы автор забыли о поддержке SVG графики. Причем уже есть библиотреки позволяющие использовать ее рантайм. (Например degrafa http://www.degrafa.com/2007/07/27/how-complex-can-you-get-with-degrafa-very/).
Также можно реализовать поддержку практичеки любого формата графики (ByteArray+Bitmap+Drawing API).
Про скорость отрисовки я бы вообще ничего не говорил, как не крути у флешплеера она больше.
А проблемы подготовки графики это уже проблемы кривых рук.

Видео:
flv это хорошее сжатие, но и возможность лайфстриминга, перемотки и других фич
из коментариев:
+ есть поддержка HD video
Флешплеер это тоже поддерживает.
+ теоретически, поддержку flv можно реализовать самому, используя MediaStreamSource (тут есть примеры http://code.msdn.microsoft.com/ManagedMediaHelpers)
нужна практика а не теория, хотя такой возможностью флеш не может покак порадовать.
Как не крути пока приоритет на стороне флеша

Шрифты:

Имеет три встроенных шрифта, поддерживается импорт символов из шрифтов ТТF, ограниченно поддерживаются шрифты, установленные в системе.

просто глупость.
Мы можем влючить любой шрифт в наше приложение, и он будет работать везде.
3 шрифта, тоже глупость, Просто по умолчанию флекс компоненты используют заданые шрифты, и нечего более.

Формально, не импортированные шрифты поддерживаются. Однако, с текстом, напечатанным таким шрифтом, почти ничего нельзя делать: ни поворачивать, ни масштабировать, ни использовать в качестве маски.

Раньше (9 и ниже версии плеера) и вправду не позволяли таких операций как вращение, масштабирование (вытягивание по какой-то оси), в 10 плеере вы можете делать с любым шрифтом, что угодно и как угодно.

Сокеты:
незнаю что твориться в Silverlight, но в FlashPlayer к сожелению имеет некоторые ограничения :(

Работа с файлами:
Принципиальное преисущество было у Silverlight до выхода 10 версии флешплеера, теперь его нет ).

Хранение данных на клиенте:
хе хе пункту просто не зачет. никак не может влиять на оценку платформы.

Разметка:
Спорный вопрос. Я бы не ставил плюса ни одной из технологий.
Если говорить о скором будующем то будет революция ;) Ключевое слово Flash Catalyst

«Программное» рисование:
Незнаю как обстоят дела в Silverlight, но во флеш им можно творить чудеса.

«Программная» анимация:

Flash/Flex: Основана на фрэймах.

Никто не мешает использовать верменные интервалы. т.е. больше возможностей ).
Я не спец в этой области и пусть те кто работают с FlashCS3|CS4 добавят свои коменты. ).

Собственные контролы:
Автор описал только один, довольно причудливый способ :).
Да. Визуально не всегда сразу можно посмотреть на внешний вид компонента.
Опять же для спора и нахождения истены в данном вопросе нужно сначало определиться с понятием “Собственный контрол”.

Кастомизация контролов
Я незнаю как работают стили в WPF, но

ни все равно почти начисто обходит css-образные стили Flex, которые по сути не многим более чем обычные словари, которые можно хранить в отдельных файлах. Стили во Flex не поддерживают байндинга, не позволяют задавать темплейты, не имеют строгой типизации, и уж тем более не позволяют хранить внутри себя анимацию, не умеют изменятся в зависимости от каких-либо условий.

Полный бред. Для начала ознакомтесь с возможностями стилировния, затем полистайте примеры на той же Деграфе. Стили во флексе ограничиваются только фантазией, как только она закончилась, так и закончились стили )

Связывание данных

Да, во Flex не создается как таковой объект биндинга

Он то создаеться, но вот доступа мы к нему не имеем. Также есть возможность создать биндинг в коде BindingUtils

А двусторонний биндинг, единственный пока что козырь Silverlight, во Flex добавят в Gumbo.

В Flex 2|3 это также легко реализуется, как в коде так и с использованием MXML :)

Реализация MVC
Flex Framework и есть реалиация MVC просто она скрыта от глаз программистов. Поэтому они не разобравшись пугаються и пытаюстся насочинять своих фреймворков ).
А насочиняли их уже много Cairngorm/PureMVC/Mate/Guasax/Model-Glue… и так далее.

Вроде пока все, что пришло на ум.

Поэтому я бы не спешил делать такие опрометчивые выводы, незная не платформы, и незная текущего состояния вещей.
В скором вермени (2009 год) Adobe ух как пошатнет преимущества разработки под сильверлайт, И я бы не стал говорить, что “с точки зрения удобства для разработчика “серебренный свет” уже вне досегаемости”.

Единственными весомым преимуществами Silverlight является:
- большее количество “тяжолых” разработчиков, которые прошли огонь и воду в програмирование под C# и т.д. В отличаии от разработчиков Flex которые в большей части работали во Флеш
- политика отношения Microsoft к разработчикам, ее тактика “Мы везде и никто кроме нас)”. Обучение, бонусы и т.д.

ЗЫ
Неосвещенным остался вопрос производительности, но это тема для отдельного большого исследования.
Как показывает практика FlashPlayer быстрее в графике, как не крути, нельзя сказать что намного, но все же приятно :)


2008-11-18

23:58:04, Flash-ripper.com
Adobe Flex Plugin для Microsoft Visual Studio 2008

Вышел плагин к Visual Studio для создания Flex-приложений. Он называется Tofino Beta.

В этой бета-версии продукта уже есть отладчик с возможностью расставить точки останова как в AS3, так и в MXML, простая инсталляция (Flex SDK идет в составе плагина), поддержка SWC (в том числе в Object Browser'е). Правда, еще нет intellisense, но будет, а также будут добавлены средства интеграции Flex и .NET. Также в финальной версии производители обещают сохранить бесплатность продукта.

// узнал в .NET-блоге на habrahabr.ru от Павла Дмитриева


2008-11-17

10:08:22, Constantiner's blog
Катализаторы творческой активности

Как мы знаем, сегодня в США открывается Adobe MAX — ключевое событие, касаемое Flash-платформы и RIA-технологий от Adobe. Некоторым из русскоязычных читателей повезет, и они смогут попать на это событие (по крайней мере в декабре в Милане). Ну а остальным неудачникам (к коим я причисляю с полным правом и себя) останется лишь тихонько убить себя апстену.

Но это все лирика, а по сути можно сказать, что часть грандиозных новостей, которые готовились к этому событию, уже известны. Перечислю их вкратце:

  • Thermo, инструмент для “бесшовного” взаимодействия разработчика и дизайнера, о котором мы уже писали, отменяется. Его не будет. Thermo умер :( Да здравствует Adobe Flash Catalyst! :>

    Flash Catalyst Logo

    Говоря проще, инструмент сменил свое кодовое название на официальное. Публичная бета будет доступна в начале 2009-го года, но все посетители MAX’а получат ее раньше.

  • Также посетители MAX’а получат билд Flex Builder 4, который может работать с Gumbo. В новой версии среды будут реализованы грандиозные фичи: генерация геттеров/сеттеров (уже есть с помощью Eclipse Monkey), генерация кода для событий (Илья Панин показывал на FlexCamp’е в Москве — опять Eclipse Monkey), новый Package Explorer и тултипы для ASDoc’ов, пользовательские шаблоны для MXML, ActionScript, и CSS. Шаблоны кода a la JDT там отсутствуют. Зато есть интеграция с Thermo Flash Catalyst. Также будет монитор сетевой активности для Flex-приложений и поддержка Flex Unit (вот это интересно!). Помимо всего обещают еще сильнее упростить создание CRUD для большого количества серверов и сервисов с помощью Client Data Management (CDM).
  • Вышел Adobe AIR 1.5 для Mac и Windows. До конца года обещают для Linux. Он теперь использует новый, более производительный JavaScript-движок SquirrelFish. Среди новинок encrypted база данных для хранения приватной информации. Ну и то, чего мы ждали: поддержка новых возможностей Flash Player 10. AIR 1.5 доступен не только посетителям MAX’а, а всем. Причем уже сейчас.
  • Предварительная версия Adobe Flash Player 10 для смартфонов, созданная в рамках Open Screen Project, также будет демонстрироваться на MAX’е.
  • Adobe Flash Player 10 для 64-bit Linux.

Вся эта информация доступна в официальном пресс-релизе, посвященном MAX. Также можно прочитать новость в блоге InsideRIA.

Хочу еще также заметить, что если есть крупные конкуренты, то все новости обычно ходят парами. Мы это уже замечали при выходе Flash Player 10 на следующий день после выхода Silverlight 2. Сегодня тоже не преминули отметиться сотрудники Microsoft. Скотт Гатри написал в своем весьма авторитетном блоге пост, посвященный Silverlight 3 и не только.

Что хочется отметить?

  • Silverlight 2 вышел месяц назад и победно шествует по планете. Он загружен уже более чем на 100 миллионов машин пользователей, в чем ему помогают программы Microsoft SMS и Microsoft Update, позволяющие системным администраторам легко устанавливать среду исполнения для большого количества пользователей в корпоративных сетях.

    Скотт Гатри таже отметил, что в результате всего этого хоть какая-нибудь версия Silverlight стоит уже на каждом четвертом компьютере во Вселенной. Как видим, большой прогресс за месяц.

  • С удовлетворением хочется отметить, что ересь от Microsoft, в результате которой термин RIA там стал расшифровываться как Rich Interactive Applications (насыщенные интерактивные приложения), а не как полагается Rich Internet Application (насыщенные интернет-приложения), долго не продержалась (подробнее об этом можно прочитать у Роста). Скотт Гатри уже упоминает Rich Internet Applications. Что, в общем, радует. Бессмысленная путаница терминов на пользу не идет.
  • Silverlight 3 будет существенно расширен по части предоставления пользователю медиа-возможностей (например, кодек H.264), по части графических возможностей (заявлено 3D и аппаратная акселерация графики), расширения в области связывания данных (data binding), а также новые контролы. Скотт говорит, что в рукаве у них много чего еще (лично я готов подозревать поддержку камеры и микрофона, а также работу с битмапами). Visual Studio планирует обзавестись графическим дизайнером для разработки Silverlight-приложений.

Такие вот новости. А что у вас интересного?

Bookmark this article at


2008-11-14

00:20:50, 33 коровы
Начинаем изучать Flex 3

Hезнание английского не освобождает от ответственности

Как показывает практика, все обучение сводится к чтению и пониманию правильно расставленных буков.
А профессионалы, кроме того, что знают много разных вещей, и разбираются в правильно расставленых буквах, еще знаю где быстро и эффективно найти новые буквы чтобы ответить на то, что они еще не знают, или уже забыли.
Поэтому начало и дальнейшее изучение флекс я сведу обзору где и что можно найти.

Обзор документации и книг по Adobe Flex:

Официальную документацию по Flex 3/Flex Builder 3 от производителя можно найти на сайте адоба. http://www.adobe.com/support/documentation/en/flex/ Данная ссылка содержит большой список полезной документации, сделаем ее краткий обзор:

Первых 4 ссылки содержит документы описывающие установку флекс билдера и описание его функциональности (для тех кто незнаком с Eclipse платформой или кто хочет обновить свои знания стоит почитать Using Adobe Flex Builder 3 http://livedocs.adobe.com/flex/3/using_fb_flex3.pdf )

Adobe Flex Language Reference — документация по ActionScript3 и Flex 3. Она также есть в хелпе, который поставляется вместе с Flex Builder 3.

Flex 3 Developer Guide — глобальный и полный мануал по флекс, о разработке флекс приложений. Полностью описаны возможности фреймворка. Примеры кода, работа с компонентами, общение с сервером. 1300+ страниц наполненных информацией.

Programming ActionScript 3.0 — мануал о программирование на ActionScript 3. Начиная от описания синтаксиса, заканчивая работой с принтером и видео. Советую ознакомиться вначале, если вы незнакомы с АС3.

Также там много полезных мануалов на все случаи программирования на флекс 3 (Скинование, создание собственных компонент, оптимизация приложений…) Документации выполнена очень качественно и ее очень много, для начала изучения и работы с Flex 3 ее должно хватить с головой!

В конце страницы есть ссылка на архив со всей документацией.

Для тех, кто любит бумагу, уже написаны книги. Естественно, они все на английском, и купить у нас их проблематично :

Книги о ActionScript 3 (я их не листал, а те что листал уже не помню и коментировать не буду):

  • ActionScript 3.0 - Advanced Design Patterns (2006)
  • ActionScript 3.0 - Bible (Wiley)
  • ActionScript 3.0 - Design Patterns (OReilly.Jul.2007)
  • ActionScript 3.0 - Essential (OReilly.Jun.2007)
  • ActionScript 3.0 - Foundation Animation (FriendsofED.Apr.2007)
  • ActionScript 3.0 - Foundation With Flash CS3 and Flex (FriendsofED)
  • ActionScript 3.0 - Learning - A Beginners Guide (OReilly.Jan.2008)
  • ActionScript 3.0 - Object.Oriented (FriendsofED.Jul.2007)
  • ActionScript 3.0 - Programming
  • ActionScript 3.0 - Using Components
  • FriendsofED Foundation Flash CS3 Video
  • OReilly.Learning.Flash.Media.Server.3.Mar.2008

Книги по программированию на Flex 2/3:

Learning Flex 3 book

Learning Flex 3: Getting up to Speed with Rich Internet Applications
Веселая книжка по введению в разработку на Flex 3, обзор средств разработки, описание как их использовать, описание базовых вещей флекс-фреймворка, ничего сложного. Для новичка самое оно, чтобы получить представление о технологии и начать ее использовать.

Flex 3 - A Beginners Guide (McGraw.Hill.Mar.2008)
Первых 2 главы смело пропускаем (1. рассуждения на тему. 2. установка и настройка). Остальные можно смотреть через строчку. В книге дано краткое описание ActionScript3 и MXML. Очень кратко описаны возможности Flex 3 и Flex Builder 3. Книгу стоит почитать тем, кто только начинает свою работу с flex 3, больше ничего интересного в ней нет.

Flex 2 - Programming (OReilly) book

Flex 2 - Programming (OReilly)
Классика жанра. Немного теории о RIA, затем рассмотрены возможности ActionScript3 и Flex, много примеров кода и много картинок. То что она написана Flex 2 это не страшно. Я бы посоветовал ее как настольную книгу начинающего и продолжающего Flex-программиста.

The Essential Guide to Flex 2 with ActionScript 3.0 The Essential Guide to Flex 3

The Essential Guide to Flex 2 with ActionScript 3.0 | The Essential Guide to Flex 3 (FriendsofED)
Что похожее на Flex 2 - Programming (OReilly), но как по мне хуже. Общий обзор возможностей Flex.

AdvancED Flex Application Development: Building Rich Media X
Вначале немного рассказывается о Flex и Веб 2.0, Чем флекс хорош для создания RIA. Затем авторы на примере создания социальной сети рассматривают возможности Flex. Книга интересна тем, что в ней по порядку рассматривается разработка большого проекта, от задумки, возможностей, выбора средств разработки до реализации как клиента, так и серверной части. Естественно, что клиента они делают на Flex, а в сервер строят на основе движка Drupal. Книгу стоит почитать для развития кругозора и понимания как создается RIA . Как справочник по Flex она сильно годится.

Flex 3 Cookbook: Code-Recipes, Tips, and Tricks for RIA Developers

Flex 3 Cookbook: Code-Recipes, Tips, and Tricks for RIA Developers (OReilly.May.2008)
Список рецептов для Flex 3. Очень полезная книга, дает готовые решения большинства стандартных проблем, а также дает «отправные точки» для дальнейшего поиска. Советую держать ее под рукой.

Flex Solutions: Essential Techniques for Flex 2 and 3 Developers (FriendsofED)
Книга из разряда кукбуков, но если «Flex 3 – Cookbook» содержит советы о написании кода, то данная книга содержит еще советы и решения проблем связанных с настройками среды разработки. Все советы разложены по полочкам. Советую держать под рукой.

Foundation Flex for Developers

Foundation Flex for Developers (FriendsofED.Dec.2007)
Первая часть книги посвящена введению в флекс программирование. Вторая часть посвящена общению флекс приложений с сервером, используя ColdFusion, ASP.NET или PHP (как по мне довольно грустное описание так как все строиться на передаче ХМЛ, альтернативные способы, к сожалению, не рассмотрены). Третья часть посвящена работе LiveCycle Data Services (LCDS), ничего сказать не могу, опыта не имел и подробно не читал :)

Foundation Flex for Designers

Foundation Flex for Designers (FriendsofED.Jan.2008)
Книга о стилировании используя Flash, Photoshop, Illustrator и Fireworks и их интеграция с флекс. Использование дизайнер вью для создания приложения, форм, компонент. Ничего сказать немогу по поводу данной книги, мне не понравилась и нужна ли она дизайнерам ? :)

Данный список не является полным, книг по Flex 3 гораздо больше. При составлении я использовал только те книги копии которых я смог найти в сети (да простят меня их авторы)

Что же читать?

Читать нужно документацию от Адоба, она очень хорошая и охватывает практически все аспекты разработки РИА приложений используя Adobe Flex

В качестве старта для человека которому неведом мир Flex и ActionScript 3 советую начать изучение с прочтения книг:

  • ActionScript 3.0 - Essential (OReilly.Jun.2007)
  • Flex 3 - Learning (O’Reilly.Jun.2008)
  • Flex 2 - Programming (OReilly)
  • И незабывать про глобальный мануал от адоба
  • Также полезно иметь под рукой Flex 3 Cookbook и Flex Solutions: Essential Techniques for Flex 2 and 3 Developers

    После изучения этих книг, я думаю вы сможете уже сами продолжить свой путь в рядах флексеров! Удачи!


    2008-11-11

    15:12:00, Flash-ripper.com
    Кому, зачем и почему нужен Adobe AIR

    Жаркая дискуссия разгорелась в комментариях к скорому выходу книги "Adobe AIR" на русском. Я даже немного расстроился (совсем немного): многие, кого я считал экспертами в области, не понимают, в чем соль (Соль (СОЛЬ)) технологии Adobe AIR. А Nox Noctis здорово объясняет, что и зачем. Присовокуплю к его словамм свои нескромные соображения.

    Попробую объяснить, чем же так важен Adobe AIR. Я опущу все технические моменты: локальные БД и безопасное хранилище данных, доступ к файловой системе и драг-дропы, встроенный браузер и даже кроссплатформенность. Объясню сначала очень коротко:

    Главное в Adobe AIR — это легкость его использования. Теми, для кого он сделан. Это же — главное в Microsoft Silverlight. Раскрою мысль ниже:

    Было: хотели, но не могли!

    Было: С++ / С# программисты, которые хотели, но не могли делать веб-приложения на Flash и веб-программисты, которые хотели, но не могли делать десктоп-приложения на С#.

    Стало: хотим и можем!

    Стало: настольные програмисты могут делать веб-приложения на Microsoft Silverlight и C#, а веб-программисты могут делать десктоп-приложения на Adobe AIR и Flash / Flex / Actionscript / HTML / JavaScript.

    Но что это за статья? Мало букв. Даешь больше понятных букв на эту тему, и чтобы со смыслом.

    Adobe AIR = Microsoft Silverlight = укрепление существующих границ

    Cмысл Adobe AIR и Microsoft Silverlight заключается в расширении соотвествующих систем разработки. Каждый остается при своем, но своего становится больше: веб-программисты теперь могут делать еще и десктоп-приложения, а десктоп-программисты могут теперь делать еще и веб-приложения, и ни тем, ни другим не нужно при этом переучиваться или учить новые языки, а максимум, что им нужно сделать — это узнать новые API для языков, на которых они уже давно и с удовольствием пишут. А это легко и приятно. Поэтому каждый труъевый флэшер заценит, как классно и быстро делаются десктоп-приложения по знакомому Ctrl + Enter! Как человек, поставивший для этого три апдейта для Flash CS3 (а во Flash CS4 это уже встроено), я вам говорю: никогда еще создание десктоп-приложений не было таким кайфовым и легким!

    Еще раз: как было два мира и как осталось два мира, изменившись

    Было: две среды выполнения приложений, браузер и десктоп.
    Было: два разных мира разработчиков, программисты и дизайнеры. "Программисты" создавали настольные и серверные приложения на языках C++, C# и VisualBasic. "Дизайнеры" создавали веб-приложения на html, JavaScript, ActionScript и MXML.

    Оба мира жили по своим законам и развивались. Более молодой мир веб-программирования развивался последние 5 лет особо интенсивно, и ему было легко это делать, так как было из чего развиваться. Из детских игрушек веб-приложения перешли в ранг маркетинговых орудий.

    Они развились настолько, что по эффективности стали конкурировать с настольными приложениями. Поэтому традиционным программистам захотелось тоже так уметь, как флэшеры. Но прибегать к помощи флэшеров унизительно! Это все равно как признать в дизайнере человека разумного. Поэтому программистам очень нужна была платформа для создания веб-приложений без участия флэшеров. Теперь у них есть Microsoft Silverlight, и я уверен, что они будут с ним счастливы.

    А почувствовашие вкус серьезных проектов веб-разработчики в свою очередь тоже оказались готовы к покорению новой среды — десктопа. Через заведомо знакомый Adobe AIR.

    Вы можете сказать, что противопоставление "программист-дизайнер" неточно. Да. Как и любое другое. Но в его пользу говорит то, что до сих пор в огромном количестве программерских компаний флэш-разработчиков ставят на одну полку с дизайнерами.

    Adobe AIR в 2008 — это как Macromedia Flash в 1998

    Adobe AIR важен тем, что позволяет создавать настоящие десктоп-приложения усилиями людей, которые до Adobe AIR не могли об этом даже мечтать. Они не имели представления о том, как быстро сделать десктоп-приложение, зато они уже знают языки веба. И как Flash когда-то позволил делать анимацию для сети быстро и просто, так и AIR делает аналогичное для десктопа.

    Microsoft Silverlight делает похожее: радикально расширяет область производства веб-приложений, упрощая это для тех, кто раньше этого не делал, но имеет опыт в традиционных языках.

    Таким образом, два мира продолжают взаимное проникновение и обогащение за счет переноса традиций и языков разработки из одной среды в другую.

    И в Adobe AIR, и в Microsoft Silverlight есть большой и важный смысл — они позволяют двум разным мирам программирования расширяться, а программистам — делать больше интересных проектов для новых сред.


    2008-11-10

    14:10:07, Flash-ripper.com
    Две книги по Flex на русском языке выйдут в январе 2009 года

    В комментарях к новости об очень скором выходе книги по Adobe AIR на русском языке появились две важные ссылки. Из них я узнал, что в январе 2009 года выйдут две книги по Flex на русском.

    Книга 1: Программирование c использованием Adobe Flex

    Первая книга — по Flex 2: Программирование c использованием Adobe Flex. Из официального анонса: "Издание построено на основе многочисленных практических примеров использования Flex и одобрено компанией Adobe, как официальное пособие по использованию новой технологии. Читатель освоит основы ActionScript 3.0, язык разметки MXML..."

    Книга 2: Learning Flex 3

    Learning Flex 3Вторая книга еще не анонсирована в русскоязычных магазинах, но о ее выходе сообщает Михаил Антипин, который знает, о чем говорит. Она называется "Learning Flex 3. Getting up to Speed with Rich Internet Applications. Вот превью книги Learning Flex 3 (74 стр.)

    Я, скорее всего, куплю и ту, и другую — для сравнения и не только. Полезными могут оказаться обе. Не стоит скидывать книгу по Flex 2 со счетов. Мой опыт флекс-разработки показывает, что самое важное в изучении Flex — это не код, а базовые принципы построения приложения, архитектура. И если в книге по Flex 2 архитектурные вопросы показаны лучше, чем в книге по Flex 3, то есть смысл в ее прочтении, поскольку архитектура Flex 2-приложения не отличается от арихитектуры приложения Flex 3. Короче говоря, будет хорошо, если эти книги окажутся достаточно разными.


    2008-10-27

    22:57:40, Constantiner's blog
    FlexCamp FAQ

    Как мы уже писали ранее, 30 октября 2008-го года в Подмосковье состоится очередная встреча Русскоязычной Группы Пользователей Платформы Adobe Flash (Russian Adobe Flash Platform User Group, RAFPUG), которая пройдет в выездном формате. Для тех, кто еще ничего по данному вопросу не решил, предлагается небольшой FAQ.

    Правильно ли я понимаю, что мероприятие это очень дорогое и платное?
    Нет, вы понимаете неправильно. Мероприятие бесплатное.

    Правильно ли я понимаю, что если я флэшер, то мне там попросту неинтересно?
    И это неверно. Хоть мероприятие и называется FlexCamp, на нем будут доклады и по AIR, и многое другое. А также неформальное общение на любые интересные (и не очень) темы.

    Правильно ли я понимаю, что если я не имею отношения к Flash-платформе, то мне лучше не приходить?
    Ну а сам(а)-то ты как думаешь? Добро пожаловать в секту!

    Правильно ли я понимаю, что добираться придется самостоятельно?
    А вот это понято правильно! Едем до базы отдыха «Спутник» своим ходом.

    Правильно ли я понимаю, что программа мероприятия еще неизвестна?
    Все совсем не так. Программа известна, и она примерно такова:

    1. 11:00 - 12:00
      Serge Jespers
      «Up close and personal with the AIR API’s»

      О чем:
      By showing code snippets and real life applications, you will learn about all the API’s available in AIR and how to use them.

    2. 12:00 - 13:00
      Костантин Ковалёв aka Constantiner
      «Microsoft Silverlight и Adobe Flex: технологии для создания насыщенных интернет-приложений (RIA)»

      О чем:
      Доклад призван расширить кругозор Flex/Flash-разработчиков в области технологий для созданич насыщенных интернет-приложений (Rich Internet Applications, RIA). В нем будет дан обзор основных возможностей технологий Adobe Flex и Microsoft Silverlight в сравнительной форме, что дает лучшее представление. Будут рассмотрены краткая история технологий, особенности процесса разработки, доступный инструментарий, доставка приложений пользователю, а также сходство и различие в области API, взаимодействия с браузером, сетевого взаимодействия, медийных возможностей, программной модели, производительности, набора предоставляемых контролов и контейнеров. Более детально будут рассмотрены наиболее интересные “вкусности” (data binding, кастомизация приложений, работа с XML). Помимо этого будут показаны примеры взаимодействия Flash- и Silverlight-приложений, а также пример реализации приложения с использованием обоих технологий.

    3. 13:00 - 13:30
      Dennis Khvostionov
      «Degrafa Framework»

      О чем:
      Short introduction to Degrafa - declarative graphics framework for Flex that allows for drawing graphics via MXML markup.

    4. 13:30 - 14:30
      Товарищеский обед
    5. 14:30 - 15:50
      Минигольф, теннис, медитация и прочие массовые удовольствия
    6. 15:50 - 16:00
      Антон Волков
      «Видеотрансляция: привет из Перми»

      О чем:
      Новости Альтернативы 3D

    7. 16:00 - 17:00
      Иван Дембицкий aka iv и Евгений Потапенко aka John
      «Плагинная архитектура Flash-приложения.»

      О чем:
      На примере разрабатываемого проекта DomCAD будет рассказано о том, что такое плагинная архитектура, зачем она нужна, для каких целей используется и каким образом реализуется на Flash.

    8. 17:00 - 17:45
      Илья Панин
      «Eclipse Monkey - расширяем функционал Flex Builder»

      О чем:
      Eclipce Monkey – это плагин к Eclipse позволяющий писать рассширения к нему используя JavaScript (также Ruby, Python и Groove). В докладе рассказывается о применении Eclipse Monkey для рассширения и добавление функционала для Flex Builder.

    9. 17:45 - 18:30
      Александр Гахов
      «Тестирование Flex UI, с помощью инструмента Flexmonkey»

      О чем:
      Доклад коснется таких тем как FlexUnitTests, Automation, на примере работы с инструментом тестирования Flexmonkey.

    10. 18:30 - 19:30
      Товарищеский ужин
    11. 19:30 - 20:00
      Артемий Малков
      «Круглый стол по Adobe Flex/Flash»

      О чем:
      Усыпляющее обсуждение технологий Flash platform плавно переходящее в …

    12. 20:00 - …
      afterParty

    Уже круто! Но ведь четверг — это рабочий день!
    Не совсем так. Для тех, кто будет присутствовать на мероприятии, этот день рабочим не будет.

    Ну вот я думал-думал и решил принять участие. Что мне для этого нужно?
    Нужно поскорее послать регистрационную заявку на rafpug [dog] gmail.com. И как можно скорее! Подмосковье не резиновое! На всех мест не хватит! :>

    Где я могу прочитать дополнительную информацию?
    Тут.

    Ну, вроде, пока информации достаточно.

    Пару слов про мой доклад. Как было сказано, его цель — расширить кругозор Flex/Flash-разработчиков. На самом деле у этого доклада есть симметричный собрат, который призван расширить кругозор .NET-разработчиков. И будет он прочитан на следующий день, 31 октября на Silverlight Day в рамках встречи Питерской .NET User Group. Так что желающие могут сходить еще и туда :) Подробности в блоге Сергея Жихарева.

    Так что увидимся :)

    Bookmark this article at


    2008-10-14

    13:58:25, Flash-ripper.com
    Оказывается, itemRenderer во Flex очень легко использовать

    , если вы читаете цикл из пяти ясных статей "Рассудочное познание itemRenderer во Flex" в Adobe Flex Developer Center. Автор — Питер Энт из Adobe. Он последовательно излагает жизненно важные концепции и популярные ошибки в использовании рендереров. Познавая цикл рассудком, вы быстро поймете, почему оказался неэффективным метод панического клика, который, увы, многие применяют столь же упорно, сколь и безуспешно — снова и снова (сам не безгрешен, каюсь).

    Станет ясно, что многие часы, проведенные в попытках заставить строку датагрида светиться зеленым, могли быть минутами пользы и удовольствия, потому что работать с рендерерами действительно легко, как только вы поймете главную мысль: не нужно пытаться управлять рендерером снаружи. Рендерер невозможно удержать в руках. Рендерера не существует, ясно? Только сам рендерер может управлять собой изнутри, основываясь на своих данных (или на данных родительского компонента).

    Читайте Питера Энта. Понятнее чем он, на эту тему не писали. Итак, все пять частей:

    1. Часть первая: встроенные рендереры.
    2. Часть вторая: внешние рендереры.

      А где еще три части — спросит самый внимательный читатель? Ждите! Остальные части появятся в Adobe Developer Center совсем скоро. Не хотите ждать? Читайте прямо в блоге Питера Энта, они еще с марта и ждут очереди:

    3. Часть 3: как законтачить с рендерером.
    4. Часть 4: состояния, переходы и эффекты в рендерерах.
    5. Часть 5: эффективные рендереры.

    Peter Ent Усвоив это интеллектуальное наследие от Питера Энта, человека, ответившего на тысячи вопросов по Flex начиная с версии Flex 1 (он действительно работал в поддержке Flex, а теперь перешел в новый биг-бизнес-проект Genesis от Adobe), вы можете немного расстроиться: столько времени было потеряно зря в попытках брутфорс-атак на непокорные рендереры, когда достачно было силы мысли! Но вы не расстраивайтесь: ведь теперь-то вы все про них знаете и сможете ими управлять как только захотите.

    И не только про рендереры узнаете вы много полезного: фактически, этот цикл статей учит сразу нескольким важным концепциям Flex, таким как создание компонентов путем расширения существующих, взяимосвязь между MXML и AS3, почему интерфейсы так важны для работы приложения, как устроены состояния и переходы, и как все же покрасить строку датагрида в зелененький.

    Кстати, поскольку Питер Энт теперь за Флекс официально не отвечает, самое время прочесть его блог как в некотором смысле завершенный учебник по Flex.


    2008-10-04

    13:45:23, Flash-ripper.com
    Поддержка Flex в IntelliJ IDEA — готово!

    "Resolved: (IDEADEV-14365) Flex 2 (ActionScript + MXML) support in IDEA" — такой статус теперь имеет заказанная еще Майклом Клишиным поддержка Flex-разработки в IntelliJ IDEA. 2 октября Дмитрий Жемеров написал, что поддержка Flex в IDEA реализована; багрепорты по конкретным моментам и запросы новой функциональности размещайте отдельно.

    Как в IDEA выглядит Flex/JavaScript-дебаггер, можно увидеть на скриншотах и видео. Вот - официальный текст о поддержке редактирования Flex-кода. А вообще поддержке JavaScript и Flex в IDEA посвящена отдельная страница и немалая выдача в поиске.

    FDT опасносте! Проверим?

    Ниже в посте выражалось возмущение при упоминаниии о том, что многие мечтают работать в харьковской компании TeamDev. Открою завесу тайны: TeamDev участвует в создании IntelliJ IDEA от JetBrains и MyEclipse от Genuitec. JetBrains рекомендует продукты TeamDev. И сейчас TeamDev ищет Flex-разработчика в Харькове. Обратите внимание.


    2008-09-23

    09:08:12, 33 коровы
    Custom chrome в AIR приложении и человеческий фактор

    Пример приложения использующая исходники можно найти на сайте http://www.graviti.tv/blog/?p=46http://www.graviti.tv/blog/?p=75 )

    Но статья не о том как сделать кастомный хром, а неверном решении индийцев из адоб.

    У кастомного хрома, как и у FlexChrome (showFlexChrome=”true”) есть проблемка, при максимайзе приложения оно выступает на 3 пиксела за экран во все стороны. При showFlexChrome=”true” как раз прячется скругление заголовка окна. Великолепный ход конем! :). При showFlexChrome=”true” это еще простительно, а вот когда у вас полностью свой кастом хром, то получается ужастно.

    Как побороть это нормально я не нашел, пошел по простому выходу, вставил все приложение в отдельный компонент, а его сделал меньше текущего хрома ровно на 3 пх с каждой стороны)

    <?xml version="1.0" encoding="utf-8"?>
    <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    			showFlexChrome="false"
    			showStatusBar="false"
    			showGripper="true"
    			showTitleBar="false"
    			width="700" height="500" frameRate="45"
    			horizontalScrollPolicy="off" verticalScrollPolicy="off"
    			xmlns:local="*"
    			>
    	<local:AIRApplicationContent 	width="{width-6}"
    					height="{height-6}"
    					x="{3}" y="{3}"
    					filters="{[new DropShadowFilter(4,45,0,0.5)]}"
    					/>
    </mx:WindowedApplication>

    В качестве бонуса получил использование тени от окна не сильно напрягаясь :)


    2008-08-20

    16:58:20, Flash-ripper.com
    Eclipse Enterprise IDE Plugin&trade; для Adobe Flex Builder

    Как обещал вчера, расскажу о новом (и похоже, пока единственном, зато каком!) плагине к Flex Builder. Плагин называется Enterprise IDE Plugin™. Разработчик: компания IDE Factory.

    Enterprise IDE Plugin — это набор инструментов для архитекторов, разработчиков и менеджеров проектов, созданный для упрощения разработки приложений в среде Adobe Flex Builder 3. Плагин Enterprise IDE в данный момент выходит в публичный, ограниченный по времени beta-релиз.

    Плагин Enterprise IDE не заменяет и не вытесняет Flex Builder, но скорее наращивает его мощность. С помощью инструментов повышения производительности и встроенной поддержки основных open-source фреймворков для Flex и ActionScript, Enterprise IDE превращает Flex Builder в исключительную среду разработки приложений enterprise-уровня. Он включает в себя новые инструменты для навигации по коду, генераторы проектов, классов и методов, средства автоформатирования, документирования и создания метрик кода, а также инструменты общего назначения для повышения продуктивности Flex-разработчиков и архитекторов.

    Перечень инструментов и функций Enterprise IDE Plugin

    Почти за каждой ссылкой находятся иллюстрации, подобные нижеследующей:

    Планируемые улучшения в Enterprise IDE Plugin

    • Поддержка фреймворка PureMVC.
    • Инструмент Flex Code Coverage Explorer (что такое Code Coverage).
    • Шаблоны кода.
    • Поддержка фреймворка VisualFlexUnit.
    • Поддержка фреймворка Prana.
    • Формы редактирования файлов конфигурации Flex-проектов.
    • Задачи Ant для сбора метрик проекта и форматирования кода.

    Источник: трекер IDE Factory.

    Ссылки по Enterprise IDE Plugin

    Установил, работает.


    2008-08-14

    17:17:56, Flash-ripper.com
    Adobe AIR: как поместить окно поверх остальных окон

    Как известно, технология Adobe AIR позволяет создавать полноценные десктопные приложения и поддерживает эту возможность соответствующими классами и методами. В частности, есть полный набор функций для управления системными окнами: их положением, порядком сортировки и т.д.

    Например, для того, чтобы установить окно поверх остальных, используется метод orderToFront(). Однако я наткнулся то ли на баг, то ли на фичу этого метода: если другое окно получило фокус от мыши, то ваше окно поверх остальных не всплывет. Хотя при этом активизируется: фокус получит и будет призывно подмигивать в панели задач.

    Затем я нашел и способ обхода этой неприятности, используя свойство окна alwaysInFront, и уйдя от использования orderToFront(). Сначала окно переводится в состояние "поверх всех" (alwaysInFront = true), затем активизируется, и, если было минимизировано, то восстанавливается; затем возвращается в состояние "не поверх всех" (alwaysInFront = false). Вот что получилось:

    <?xml version="1.0" encoding="utf-8"?>
    <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:creationComplete>
    flash.utils.setTimeout(activateWindow, 2000);
    function activateWindow(): void
    {
    alwaysInFront = true;
    nativeWindow.activate();
    if(nativeWindow.displayState == NativeWindowDisplayState.MINIMIZED)
    {
    nativeWindow.restore();
    }
    alwaysInFront = false;
    }
    </mx:creationComplete>
    </mx:WindowedApplication>

    Таким образом, все работает! Но меня гложут сомнения: а что если я просто не умею это готовить? Если знаете ответ — подскажите, можно ли обойтись без хака с alwaysInFront = true?


    2008-08-13

    15:49:50, Agahov's blog
    Flex-Mojos. Пример сборки flex modules.

    Предисловие

    Flex модули на мой взгляд очень интересная и многообразная тема. Кроме разделения функциональности приложения, их можно использовать для загрузки внешних стилей и ресурсов. Если есть задача динамического изменения внешнего вида и языка или уменьшение размера основного приложения.

    Введение

    В данной статье я расскажу как собирать приложение которое использует flex modules.
    Проект так же будет использовать библиотеки и уменьшать размер flex модулей. Для этого мы не будем включать в модуль код, который уже используется в основном приложении. Итак приступим.

    Структура проекта

    Данная структура соответствует принципу один maven модуль один артефакт. Следовательно flex модуль представлен ввиде отдельного maven модуля.

    flexModulesProject/
    flexModulesProject/pom.xml - основной pom, собирающий весь проект
    //загрузчик модульного приложения.
    flexModulesProject/flexClient/… - основное flex приложение

    flexModulesProject/flexModuleRed/… - flex модуль

    flexModulesProject/flex/pom.xml - корневой pom для flex приложение.
    flexModulesProject/flexCoreLib/… - flex библиотека которая используется в проекте.

    Разбор конфигурационных файлов проекта

    на родительский pom проекта, pom библиотеки и корневой pom для flex проектов использование модуля ни как не повлияло. Более подробное описание их структуры можно посмотреть здесь.

    pom для flexClient

    XML:

    <?xml version="1.0"?>
    <project>
         <parent>
       <groupId>com.mydomain.mypackage</groupId>
             <artifactId>my-flex-super-pom</artifactId>
             <version>1.0</version>
         </parent>
      
          <modelVersion>4.0.0</modelVersion>
          <groupId>com.mydomain.mypackage</groupId>
          <artifactId>flex-client</artifactId>
          <packaging>swf</packaging>
          <name>flex client</name>
          <version>1.0</version>
          
          <build>
            <plugins>
                <plugin>
                <groupId>info.rvin.mojo</groupId>
                <artifactId>flex-compiler-mojo</artifactId>
                <configuration>
                    <debug>true</debug>
                    <sourceFile>flexClient.mxml</sourceFile>
                    <linkReport>true</linkReport>
                </configuration>
          </plugin>
            </plugins>
        </build>
          
          
            <dependencies>
                   <dependency>
                      <groupId>com.mydomain.mypackage</groupId>
                      <artifactId>flex-core-library</artifactId>
                      <version>1.0</version>
                      <type>swc</type>
                      <scope>internal</scope>
                   </dependency>
            </dependencies>
    </project>

    Здесь существенна одна дирректива:

    XML:

    <linkReport>true</linkReport>

    данная строчка создает в maven репозитории xml файл с перечнем всех классов, которые включаются в данный swf. Этот перечень будет использоваться при копмиляции flex модуля.

    pom для flexModuleRed

    XML:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
         <parent>
      <groupId>com.mydomain.mypackage</groupId>
            <artifactId>my-flex-super-pom</artifactId>
            <version>1.0</version>
          </parent>
        <groupId>com.mydomain.mypackage</groupId>
      <artifactId>flexModuleRed</artifactId>
      <packaging>swf</packaging>
      <name>flex module red</name>
      <version>1.0</version>
        <build>
            <plugins>
                <plugin>
                <groupId>info.rvin.mojo</groupId>
                <artifactId>flex-compiler-mojo</artifactId>
                <configuration>
                    <debug>true</debug>                
                    <sourceFile>FlexModuleRed.mxml</sourceFile>
                    <loadExterns>
              <MavenArtifact>
                <groupId>com.mydomain.mypackage</groupId>
                <artifactId>flex-client</artifactId>
                <version>1.0</version>
              </MavenArtifact>
                    </loadExterns>
     
     
     
                </configuration>
                </plugin>
            </plugins>
        </build>
        <dependencies>
              <dependency>
                  <groupId>com.mydomain.mypackage</groupId>
            <artifactId>flex-core-library</artifactId>
                  <version>1.0</version>
                  <type>swc</type>
                  <scope>external</scope>
              </dependency>
         </dependencies>
    </project>

    следующий код:

    Code:

    <loadExterns>
      <MavenArtifact>
          <groupId>com.mydomain.mypackage</groupId>
          <artifactId>flex-client</artifactId>
          <version>1.0</version>
       </MavenArtifact>
    </loadExterns>

    исключает классы которые включены в flex-client.

    здесь:

    Code:

    <dependency>
      <groupId>com.mydomain.mypackage</groupId>
      <artifactId>flex-core-library</artifactId>
      <version>1.0</version>
      <type>swc</type>
      <scope>external</scope>
    </dependency>

    важно включение библиотеки со scope external.

    Еще одно замечание, имя flex модуля не должно использовать дефис, в моём проекте это вызвало необъяснимый глюк.

    Сборока проекта.

    Для сборки проекта необходимо в корневой библиотеке проекта запустить команду mvn install

    Развертывание проекта.

    Строго говоря, в обязанности maven эта задача не входит. После того как проект будет собран, нужно поместить flexModuleRed.swf в одну папку с flexClient.swf.

    Исходники

    Исходники можно взять отсюда

    Bookmark this article at


    2008-07-28

    22:01:36, Flash-ripper.com
    Как отбиндить переменную во Flex

    Недавно Андрей Микитюк задал мне простой вопрос — как отменить биндинг переменной во Flex? Честно говоря, я не смог ему ответить, зато он сам нашел готовый ответ в блоге одного из индийских Flex-евангелистов Raghunath Rao Thricovil, или просто — Raghu.

    Тем, кто еще не в курсе, напомню: связывание, или биндинг данных (data binding) — одна из мощных фишек Флекса. Фишка в том, что переменная a связывается с переменной b и после этого значение a будет изменяться каждый раз, когда изменится значение b — они связаны (binded). Один из простейших примеров — текст, вводимый в поле ввода, автоматически появляется в другом месте приложения при вводе / удалении каждого нового символа. При грамотном применении биндинг позволяет сэкономить кучу кода и времени. Для начинающих (и не только) есть пара коротких уроков по биндингу — очень рекомендую.

    А как отменить связывание переменнных?

    Оказывается, отменить биндинг довольно просто в AS3 и невозможно в MXML. В AS3 это делается при создании биндинга стандартным образом с помощью метода bindProperty. Этот метод возвращает объект типа ChangeWatcher, который может "наблюдать" (watch) за самим связыванием, реагируя каждый раз при изменении переменной b. Чтобы разорвать связывание, достаточно вызвать на этом объекте-смотрителе метод unwatch(). Вот как это все выглядит в коде, а вот — как это работает.

    Вообще, у Raghu весьма полезный блог.


    2008-07-15

    01:12:31, Constantiner's blog
    Flex 4 "Gumbo" увидеть не хотите ли?

    Adobe Flex LogoВся флексовая блогосфера в страшном волнении: совсем скоро (счет на часы) станет доступен (уже доступен) билд Flex 4 SDK (кодовое название Gumbo), который можно назвать нереволюционным словом “революционный".

    На самом деле ряд старых билдов доступны для скачивания (уже недоступны :), но в них нет главного: того разнообразия новых фич, что преподнесет нам новый Flex.

    Пока билд еще в пути, я не смог посмотреть на него внимательно. Но доступна документация, которая даже при беглом осмотре дает хорошее представление о том, что изменения не косметические (как между Flex 2 и 3), а меняющие картину в целом и заставляющие нас заново учить Flex.

    Информация о новых States была доступна уже давно. Скажу прямо, очень вкусно.

    Теперь же нас ждут коренные изменения в скинизации. Насколько я смог разглядеть, это будет больше похоже на WPF/Silverlight API по части того, что ряд компонентов будут иметь свойство content, позволяющее устанавливать не только текст, как раньше (например, в качестве title компонента Panel), но вообще произвольный объект, который и будет использоваться в случае если объект графический, либо будет использоваться Label с применением к контенту toString (). Также мы можем применять различные лэйауты, что позволит, например, легко и просто сделать List расположенным по кругу. Все это будет доступно также на уровне скинов.

    Также будет добавлен язык разметки FXG (ранее именуемый MXML-G) для описания графических примитивов (например, <Rect>, <Ellipse>, <Path>). Этот язык может использоваться как в отдельных FXG-файлах, так и напрямую в MXML-разметке в качестве отдельного пространства имен. Этот формат оптимизирован под Flash Player 10 и инструмент Thermo.

    По части совместимости. Новые компоненты будут наследоваться от того же самого UIComponent, но это будет отдельная ветка, которая, к тому же, будет нацелена на Flash PLayer 10. Таким образом, в Gumbo-приложениях можно будет совмещать использование Halo-компонент и Gumbo-компонент.

    Также нас ждет двунаправленная привязка данных (Two way data binding).

    Вообще, данный релиз делает Flex-фрэймворк, что называется, гораздо более flexible. То есть достигается немыслимая гибкость в кастомизации компонент, что позволит использовать ее в соответствующем инструментарии (Thermo) и улучшить тем самым designer/developer workflow и свободу выражения дизайнерской мысли как таковой.

    Так что ждем появления SDK (а пока я это писал SDK 4.0.0.2480 уже появился), а пока читаем дополнительную информацию:

    Думаю, что в ближайшее время нас ждет множество интересных материалов по этому поводу! Следите за блогами!

    Bookmark this article at


    2008-07-04

    18:18:21, Flash-ripper.com
    URAFPUG — программа экскурсий, лекций, докладов и мастер-классов

    Друзья, вот что нас ждет на каждом дне международной встречи URAFPUG:

    Дата   Мероприятие Примечания
    07.07.2008 Пн. Заселение, знакомство друг с другом, с программой и перспективами ближайшей недели.
    08.07.2008 Вт. Обзорная экскурсия по Керчи, Музей древности, золотая кладовая
    18:00 - Лекция по Mindmapping,
    20:00 - Технология Adobe AIR: начало. Что это и куда его. Примеры. Sea AIR
    22:00 - Adobe AIR: перенос Flash приложений на десктоп.
    09.07.2008 Ср. Экскурсия на Аджимушкай и Царский курган
    18:00 - Adobe AIR: продолжение. Работа с локальной БД SQLite и локальным хранилищем зашифрованных данных LocalEncryptedStorage.
    20:00 - Аспектно-ориентированое программирование.
    10.07.2008 Чт. Экскурсия на Ени-Кале
    Страусиная ферма (не для вегитарианцев)
    Альтернативный 4Dень*
    15:00 - Доклад по Alternativa3D
    20:00 - Мастер-классы по Alternativa3D
    11.07.2008 Пт. Посещение Керченской крепости и Старокарантинских каменоломен Flex-марафон
    18:00 - Flex: попытка осмысления, примеры приложений, подводные камни, плюсы и минусы, знакомство и начало работы с Flex MXML.
    20:00 - Специфика продвижения проектов в Google.
    22:00 - Конкретный пример использования PureMVC: трансформация флекс-приложения.
    22:00 - Mate — разбираемся, как его пить во Флексе (или все же высушить и курить? :-)
    12.07.2008 Сб. Джаз / регги фестиваль.
    Пара слов представителя компании Adobe, Банкет, Обсуждения места встречи - 2009.
    18:00-Специфика продвижения проектов в Яндексе.
    13.07.2008 Вс. День рыбака в г. Керчь :)

    Возможны уточнения, изменения и пожелания — желайте! Также будем смотреть, как все пойдет и соответственно адаптировать программу.

    В следующем посте — куда идти и что делать сразу по приезду на URAFPUG.

    А ты — зарегистрировался на URAFPUG?


    06:59:45, Agahov's blog
    Сборка простого flex приложения с помощью Flex Mojos

    Разберу как собрать простой проект с помощью Flex Mojos.

    Начальные условия

    установленная java jdk 5 или выше.
    переменная окружения JAVA_HOME
    установленный maven.

    Стандартная для maven структура проекта

    project-name/pom.xml………………. конфигурационный файл сборки проекта.
    project-name/src
    project-name/src/main/
    project-name/src/main/flex…………. код flex приложения
    project-name/src/test
    project-name/src/test/flex…………. тесты flex приложения
    project-name/src/main/flex/Main.mxml

    Структура pom.xml

    pom собирающий flex приложение:

    XML:

    <?xml version="1.0"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 href="http://maven.apache.org/maven-v4_0_0.xsd">">http://maven.apache.org/maven-v4_0_0.xsd">
     
        <parent>
             <groupId>info.rvin.mojo</groupId>
             <artifactId>flex-super-pom</artifactId>
             <version>1.0</version>
        </parent>
     
        <modelVersion>4.0.0</modelVersion>
     
        <groupId>com.mydomain.mypackage</groupId>
        <artifactId>myArtifactId</artifactId>
        <packaging>swf</packaging>
        <name>myArtifactName</name>
        <version>1.0</version>
     
        
        <repositories>
                    <repository>
                            <id>flex-mojos-repository</id>
                            <url>http://svn.sonatype.org/flexmojos/repository/</url>
                            <releases>
                                    <enabled>true</enabled>
                            </releases>
                    </repository>
         </repositories>
     
        <pluginRepositories>
            <pluginRepository>
              <id>flex-mojos-repository</id>
              <url>http://svn.sonatype.org/flexmojos/repository/</url>
              <releases>
                <enabled>true</enabled>
              </releases>
              <snapshots>
                <enabled>false</enabled>
              </snapshots>
            </pluginRepository>
          </pluginRepositories>
     
    </project>

    Запуск сборки проекта с помощью maven

    Для сборки приложения необходимо набрать в командной строке,
    project-name> mvn install

    Рассмортим pom.xml по частям

    XML:

    <parent>
        <groupId>info.rvin.mojo</groupId>
        <artifactId>flex-super-pom</artifactId>
        <version>1.0</version>
    </parent>

    тег parent определяет родительский pom, для текущего pom.
    В maven, текущий проект наследует свойства родительского.
    В качестве родительского pom, для flex проекта здесь выступает flex-super-pom, который является частью flex-mojos. В нём определены многие полезные параметры, которые можно использовать по умолчанию. В своём проекте вы можете использовать собственный parent, взяв из flex-super-pom только необходимое.

    Следующие теги определяют ваш артефакт в репозитории maven. В дальнейшем вы сможете использовать данный артифакт в других проектах.

    XML:

    <groupId>com.mydomain.mypackage</groupId>
        <artifactId>myArtifactId</artifactId>
        <packaging>swf</packaging>
        <name>myArtifactName</name>
        <version>1.0</version>

    Стоит отметить

    XML:

    <packaging>swf</packaging>

    - определяет тип артифакта, для библиотеки это swc.

    XML:

    <repositories>
                    <repository>
                            <id>flex-mojos-repository</id>
                            <url>http://svn.sonatype.org/flexmojos/repository/</url>
                            <releases>
                                    <enabled>true</enabled>
                            </releases>
                    </repository>
         </repositories>

    тег repositories определяет перечень репозиториев, в которых можно осуществлять поиск артифактов.

    XML:

    <pluginRepositories>
            <pluginRepository>
              <id>flex-mojos-repository</id>
              <url>http://svn.sonatype.org/flexmojos/repository/</url>
              <releases>
                <enabled>true</enabled>
              </releases>
              <snapshots>
                <enabled>false</enabled>
              </snapshots>
            </pluginRepository>
          </pluginRepositories>

    тег pluginRepositories определяет перечень репозиториев, в которых можно осуществлять поиск maven плагинов.

    Полезные дополнения

    Удаление артефактов осуществляется командой project-name>mvn clean
    Генерация asdoc, осуществляется командой project-name>mvn asdoc:asdoc
    Команды можно комбинировать, например project-name>mvn clean install

    Что ещё может Flex mojos?

    Компелить SWF, SWC, ASWF, ASWC.
    Запускать тесты.
    Поддерживать RSL.
    Оптимизировать, шифровать swf.
    Создавать html wrapper,
    В итоге собирать сложные проекты, включающие библиотеки, стили, локализацию, flex модули.

    Плюсы использования maven для flex сборки

    По моему опыту плюсом является стандартизация структуры проекта. Для того что бы понять что откуда берёться, достаточно посмотреть pom.xml.

    Bookmark this article at


    2008-07-03

    07:45:56, Junik
    Новый Flex фреймворк - Mate

    Не так давно вышла публичная альфа версия нового Flex фреймворка Mate.

    Разработчики говорят о том, что это скорее бета, и к финальному релизу они не планируют вносить существенные изменения.

    Не секрет, что при использовании событийной модели во Flex, часто разобраться в хитросплетениях происходящих событий бывает не легко. Mate как раз поможет более наглядно организовать ваши события в приложении, причем предлагается использовать для этого mxml.

    Обработка событий станет более прозрачной. Основной частью и идеей фреймворка является карта событий, которая описывает обработку событий, происходящих в приложении.

    И приятно, что использование Mate не должно приводить к полной зависимости проекта от него. Этот фреймворк не несет в себе лишний функционал, не придется вносить существенные изменения в архитектуру, а просто станет удобнее работать с обработкой событий, ну и уменьшится связанность, за счет применения injectors.

    Из минусов я заметила то, что используя Mate, далеко не все можно проверить на этапе компиляции, что может приводить к эксепшенам в рантайме. Однако идея мне очень нравится и в целом фреймворк выглядит многообещающе.

    Bookmark this article at


    2008-07-02

    21:17:57, Flash-ripper.com
    URAFPUG — доклады, лекции и презентации встречи в Крыму

    С точки зрения флэш-разработчика, все презентации, доклады и лекции международной встречи URAFPUG, проходящей в рамках Южной конференции разработчиков ITSea, можно разбить на две части: флэшовые и не только. Начнем с флэшовых и флексовых:

    1. Доклад и мастер-классы по Alternativa3D.
    2. Технология Adobe AIR: начало. Что это такое и с каких сторон его кусать.
    3. Adobe AIR: перенос Flash приложений на десктоп.
    4. Adobe AIR: продолжение. Возможности локальные хранилищ данных: БД SQLite и локальное зашифрованное хранилище LocalEncryptedStorage.
    5. Flex: попытка осмысления технологии, примеры приложений, подводные камни, плюсы и минусы, знакомство и начало работы с Flex MXML (доклад из 2-3 частей).
    6. Конкретный пример использования PureMVC: трансформация приложения.
    7. ЧОО по PureMVC: часто отвечаемые ответы.
       
      Также будут лекции от специально приглашенных людей:
       
    8. Аспектно – ориентированное программирование.
    9. Mindmapping — Карты памяти Что это такое?
    10. Курс интернет - маркетинга и SEO от компании Promodo.

    Чтобы прочесть доклад по Alternativa3D, к нам на встречу едет ее разработчик Антон Волков, который также планирует провести по ней пару мастер-классов и ответить на вопросы.

    Также к нам мечтает присоединиться представитель компании Adobe, чтобы сказать пару слов :-)

    Список докладов дополняется; порядок изложения уточняется. Если вы хотите прочесть свой доклад на этом мероприятии — пишите мне, и все получится!

    Напоминаю детали проезда на встречу URAFPUG, а также о ее культурной программе.

    И — не забываем регистрироваться на встрече URAFPUG!


    2008-06-17

    14:48:24, Flash-ripper.com
    Яндекс приглашает разработчика приложений на ActionScript

    Открыта вакансия Flash-разработчика в Яндексе, Москва. Мы хотели бы, чтобы у Вас были:
    - опыт работы на AS 2, 3;
    - умение работать с чужим кодом;
    - понимание базовых концепций ООП;
    - умение писать читабельный и расширяемый код;
    - умение работать с флеш-анимацией на уровне технического дизайнера.

    Хорошо, если у Вас так же есть:
    - знание JavaScript, XML, HTML;
    - знание технологий: Flex 2/3, MXML, AIR;
    - знание тонкостей web-программирования (взаимодействие браузера с http-сервером, понимание основ технологии AJAX);
    - опыт использования CVS, SVN;
    - опыт командной разработки.

    Мы предлагаем:
    - дружный коллектив;
    - белую зарплату, ориентировочно от 60 до 110 тыс. руб. - в зависимости от Вашего уровня;
    - соц. пакет (мед. страховка, бесплатное питание весь день, скидка на занятия фитнесом etc.);
    - демократичную атмосферу и гибкий в разумных пределах график;
    - работу в красивом, удобном офисе в Москве.

    Резюме и вопросы можно прислать на vbryzgalina@yandex-team.ru.


    2008-06-06

    15:47:00, Flex 2 & Co
    Один ItemRenderer для нескольких колонок
    Столкнулся с задачей отображения в DataGrid одинаковых по сути данных (UNIX_TIMESTAMP), к которым нужно применить ItemRenderer так, чтобы последний знал к какой колонке он применяется. Я нашел два способа это сделать и оба связаны с использованием свойства listData. Свойство listData имеют такие элементы как Text, Label, Button, CheckBox и т.п., то есть те, которые имплементируют интерфейс IDropInListItemRenderer. В данном случае в качестве ItemRenderer мне достаточно использовать Label. Если же необходим какой-нибудь контейнер в качестве рендерера, который не имеет свойства listData по-умолчанию, его необходимо реализовать своими силами.
    Итак, первый способ - это назначать данные для рендерера в зависимости от индекса колонки таблицы. Приведу кусок кода:

    <mx:Label xmlns:mx="http://www.adobe.com/2006/mxml">
    ...
    override public function set data(value:Object):void
    {
    super.data = value;
    var myListData:DataGridListData = DataGridListData(listData);
    var colIndex:int = myListData.columnIndex;
    switch (colIndex)
    case 1: text = data.date1; break;
    case 2: text = data.date2; break;
    }
    ...
    </mx:Label>

    Здесь мы обращаемся к listData, кастим его к DataGridListData, получаем индекс колонки таблицы и в зависимости от индекса отображаем в колонках date1 или date2. Недостатком этого способа является то, что при добавлении новых колонок перед этими придется переделывать код рендерера и также нельзя перетаскивать колонки. Поэтому рассмотрим второй способ.

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Label xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
    <![CDATA[
    import mx.controls.dataGridClasses.DataGridListData;
    [Bindable] private var formattedVal:String;

    override public function set data(value:Object):void
    {
    super.data = value;
    if (value)
    {
    var myListData:DataGridListData = DataGridListData(listData);
    var dt:Date = new Date();
    var cellVal:int = int(data[myListData.dataField]);
    dt.time = cellVal*1000;
    formattedVal = dateformatter.format(dt);
    }
    }
    ]]>
    </mx:Script>
    <mx:DateFormatter id="dateformatter" formatString="DD.MM.YY J:NN"/>
    <mx:text>{formattedVal}</mx:text>
    </mx:Label>

    В данном случае мы обращаемся не к columnIndex, а к dataField, таким образом получая строку, в которой содержится название поля, из которого мы получаем данные. А с помощью data[myListData.dataField] мы получаем значение этого поля.

    15:47:00, Flex 2 & Co
    Один ItemRenderer для нескольких колонок
    Столкнулся с задачей отображения в DataGrid одинаковых по сути данных (UNIX_TIMESTAMP), к которым нужно применить ItemRenderer так, чтобы последний знал к какой колонке он применяется. Я нашел два способа это сделать и оба связаны с использованием свойства listData. Свойство listData имеют такие элементы как Text, Label, Button, CheckBox и т.п., то есть те, которые имплементируют интерфейс IDropInListItemRenderer. В данном случае в качестве ItemRenderer мне достаточно использовать Label. Если же необходим какой-нибудь контейнер в качестве рендерера, который не имеет свойства listData по-умолчанию, его необходимо реализовать своими силами.
    Итак, первый способ - это назначать данные для рендерера в зависимости от индекса колонки таблицы. Приведу кусок кода:

    <mx:Label xmlns:mx="http://www.adobe.com/2006/mxml">
    ...
    override public function set data(value:Object):void
    {
    super.data = value;
    var myListData:DataGridListData = DataGridListData(listData);
    var colIndex:int = myListData.columnIndex;
    switch (colIndex)
    case 1: text = data.date1; break;
    case 2: text = data.date2; break;
    }
    ...
    </mx:Label>

    Здесь мы обращаемся к listData, кастим его к DataGridListData, получаем индекс колонки таблицы и в зависимости от индекса отображаем в колонках date1 или date2. Недостатком этого способа является то, что при добавлении новых колонок перед этими придется переделывать код рендерера и также нельзя перетаскивать колонки. Поэтому рассмотрим второй способ.

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Label xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
    <![CDATA[
    import mx.controls.dataGridClasses.DataGridListData;
    [Bindable] private var formattedVal:String;

    override public function set data(value:Object):void
    {
    super.data = value;
    if (value)
    {
    var myListData:DataGridListData = DataGridListData(listData);
    var dt:Date = new Date();
    var cellVal:int = int(data[myListData.dataField]);
    dt.time = cellVal*1000;
    formattedVal = dateformatter.format(dt);
    }
    }
    ]]>
    </mx:Script>
    <mx:DateFormatter id="dateformatter" formatString="DD.MM.YY J:NN"/>
    <mx:text>{formattedVal}</mx:text>
    </mx:Label>

    В данном случае мы обращаемся не к columnIndex, а к dataField, таким образом получая строку, в которой содержится название поля, из которого мы получаем данные. А с помощью data[myListData.dataField] мы получаем значение этого поля.

    2008-05-23

    10:50:00, Flash-разработка
    Хороший стиль Flex-программирования. Использование языка программирования

    Продолжаем обозревать статью Flex SDK coding conventions and best practices.

    Следующий подраздел: Language Usage.

    Использование языка программирования

    Здесь будут рассмотрены вопросы использования языковых конструкций ActionScript 3. Особое внимание мы уделим ситуацям, когда для выражения одной идеи существует несколько способов.

    Параметры компиляции

    Компилируйте проекты с параметрами -strict и -show-actionscript-warnings (они заданы по умолчанию в файле flex-config.xml).

    API, базирующиеся на свойствах

    Старайтесь применять API, которые базируются на свойствах а не на методах. Такой способ наиболее подходит для декларативного стиля программирования MXML.

    Объявление типа

    Указывайте типы для каждой константы, каждой переменной, каждого аргумента функции и ее результата. Даже если они не имеют типа, указывайте ":*":

    Например:
    можно: var value:*;
    нельзя: var value;

    Используйте наиболее подходящий для конкретной ситуации тип. Например, переменную цикла "for" лучше объявлять типом int а не Number, и, конечно, не Object или *. Другой пример: в mouseDownHandler необходимо объявить аргумент в виде event:MouseEvent, но не event:Event.

    Используйте тип int для работы с целыми числами, даже если предполагается, что они будут только положительными. Тип uint используйте только для значений цветов RGB, битовых масок и в других значений, не предназначенных для вычислений.

    Используйте тип * только в случае, если значение переменной может быть undefined. Но лучше всегда использовать вместо * тип Object, значение которого равно null, в случае, если объект не существует.

    Если вы объявляете переменную типа Array, добавляйте комментарий /* of Тип */ непосредственно после слова Array, указывая тип элементов массива. Это важно, так как в будущих версиях ActionScript появятся типизированные массивы. (Интересно, такой синтаксис будет учитываться непосредственно компилятором, или это совет с расчетом на последующий рефакторинг кода?)


    Например:
    можно: var a:Array /* of String */ = [];
    нельзя: var a:Array = [];
    можно: function f(a:Array /* of Number */):Array /* of Object */ {...}
    нельзя: function f(a:Array):Array


    Литералы

    undefined
    Избегайте по возможности использования undefined. Единственный случай, когда это необходимо - использование переменных типа *.

    int и uint
    Никогда не используйте точку дроби в целочисленных значениях:
    можно: 2
    нельзя: 2.

    В шестнадцатиричных числах всегда используйте "x" в нижнем регистре:
    можно: 0xFEDCBA
    нельзя: 0XFEDCBA

    Всегда указывайте RGB-цвета в виде шестизначного шестнадцатиричного числа:
    можно: private const BLACK:uint = 0x000000;
    нельзя: private const BLACK:uint = 0;

    При работе с индексами (например указатель на элемент в массиве), всегда используйте "-1" для обозначения отсутствия индекса.


    Number
    Если предполагается, что значение переменной будет дробным (обычный случай), инициировать его нужно с использованием точки дроби, после которой ставится дробная часть, либо, при ее отсутствии, нуль:
    можно: alphaFrom = 0.0; alphaTo = 1.0;
    нельзя: alphaFrom = 0; alphaTo = 1;

    Но исключение для этого правила составляют пиксельные координаты, которые условно целые, хотя, в принципе, могут быть и дробными:
    можно: var xOffset:Number = 3;
    нельзя: var xOffset:Number = 3.0;

    При использовании знака экспоненты, применяйте "e" в нижнем регистре:
    можно: 1.0e12
    нельзя: 1.0E12

    Для Number используйте значение по умолчанию NaN - "не установлено".


    String
    Для обозначения строк всегда используйте двойные кавычки, даже если внутри строки присутствует символ кавычки:
    можно: "What's up, \"Big Boy\"?"
    нельзя: 'What\'s up, "Big Boy"?'

    При использовании escape-последовательностей, спецсимвол "\u" указывайте в нижнем регистре:
    можно: \u
    нельзя: \U


    Array
    Используйте вместо new Array() литералы массива:
    можно: [], [ 1, 2, 3 ]
    нельзя: new Array(), new Array(1, 2, 3)

    Используйте конструктор массива Array() только для определения массива заданного размера. Это важно, т.к. new Array(3) создает не [ 3 ], а [ undefined, undefined, undefined ].


    Object
    Используйте вместо new Object() литералы объекта:
    можно: {}
    нельзя: new Object(),

    можно: {}, o = { a: 1, b: 2, c: 3 };
    нельзя:
    o = new Object();
    o.a = 1;
    o.b = 2;
    o.c = 3;
    или
    o = {};
    o.a = 1;
    o.b = 2;
    o.c = 3;



    Function
    Избегайте использования литералов функции для определения анонимных функций. Вместо этого, используйте методы класса или функции пакета.

    При использовании литерала функции, обязательно указывайте возвращаемый тип, а последний оператор в теле функции заканчивайте символом точки с запятой ";":
    можно: function(i:int):void { doIt(i - 1); doIt(i + 1); }
    нельзя: function(i:int) { doIt(i - 1); doIt(i + 1) }


    RegExp

    Для определения регулярного выражения используйте представление в виде последовательности литералов, а не инстанцирование объекта RegExp с параметром String:
    можно: var pattern:RegExp = /\d+/g;
    нельзя: var pattern:RegExp = new RegExp("\\d+", "g");


    XML и XMLList
    Используйте представление в виде последовательности литералов, а не инстанцирование объекта XML с параметром String:
    можно: var node:XML = <name first="Jane" last="Doe"/>;
    нельзя: var node:XML = new XML("<name first=\"Jane\" last=\"Doe\"/>");

    Используйте только двойные кавычки для определения значений аттрибутов тегов XML:
    можно: var node:XML = <name first="Jane" last="Doe"/>;
    нельзя: var node:XML = <name first='Jane' last='Doe'/>;


    Class
    Используйте полное имя класса (включающее имена пакетов) только в том случае, когда импортируется два класса с одним и тем же именем (но из разных пакетов), и необходимо разрешить конфликт имен:
    можно:
    import mx.controls.Button;
    ...
    var b:Button = new Button();

    нельзя:
    import mx.controls.Button;
    ...
    var b:Button = new mx.controls.Button();

    Но в этом случае можно:
    import mx.controls.Button;
    import my.controls.Button;
    ...
    var b:Button = new mx.controls.Button();



    Выражения

    Круглые скобки
    При работе с операторами +, -, *, /, &&, , <, <=, >, >=, ==, и !=, не используйте круглые скобки там, где в этом нет необходимости:
    можно: var e:Number = a * b / (c + d); var e:Boolean = a && b c == d;
    нельзя: var e:Number = (a * b) / (c + d); var e:Boolean = ((a && b) (c == d));

    Для остальных операторов, правила приоритета запомнить сложнее, поэтому в этом случае круглые скобки лучше использовать.


    Приведение типов
    Не сравнивайте переменную типа Boolean с "true" или "false". Она уже является первым или вторым.
    можно: if (flag)
    нельзя: if (flag == true)
    можно: var flag:Boolean = a && b;
    нельзя: var flag:Boolean = (a && b) != false;

    Явно приводите к типу Boolean переменные типа int, uint, Number или String:
    можно: if (n != 0)
    нельзя: if (n)
    можно: if (s != null && s != "")
    нельзя: if (s)

    Переменные типа Object можно приводить к типу Boolean неявно:
    можно: if (child)
    нельзя: if (child != null)
    можно: if (!child)
    нельзя: if (child == null)

    Лучше использовать приведение к типу (кастинг), чем оператор "as". Оператор "as" используйте только в том случае, если при ошибке приведения к типу, вы хотите получить в результате значение "null", а не генерацию исключения:
    можно: IUIComponent(child).document
    нельзя: (child as IUIComponent).document


    Сравнение
    Старайтесь расставлять сравниваемые значения в естественном для прочтения порядке (более удобном для прочтения порядке):
    можно: if (n == 3) // "Если n равно 3"
    нельзя: if (3 == n) // "Если 3 равно n"


    Операторы ++ и --
    Если в какой-либо ситуации префиксная и постфиксная формы (оператор ставится до или после переменной) логически равнозначны, используйте постфиксную форму. Используйте префиксную форму только в том случае, когда требуется получить значение переменной до ее изменения.
    можно: for (var i:int = 0; i < n; i++)
    нельзя: for (var i:int = 0; i < n; ++i)


    Тернарный оператор

    Ипользуйте вместо if/else тернарный оператор в случае простых операций проверки, особенно, для проверок значений на null:
    можно: return item ? item.label : null;
    нельзя:
    if (!item) return null;
    return item.label;

    Однако, нельзя использовать вложенные тернарные операторы в сложных логических цепочках:
    можно: if (a < b)
    return -1;
    else if (a > b)
    return 1;
    return 0;
    нельзя:
    return a < b ? -1 : (a > b ? 1 : 0);


    Оператор new
    Всегда используйте круглые скобки после имени класса, даже если конструктор не требует аргументов:
    можно: var b:Button = new Button();
    нельзя: var b:Button = new Button;

    Операторы

    Всегда ставьте после операторов точку с запятой ";". ActionScript 3 не считает за ошибку отсутствие точки с запятой в конце оператора, но лучше не пользоваться этой особенностью:
    можно:
    a = 1;
    b = 2;
    c = 3;
    нельзя:
    a = 1
    b = 2
    c = 3


    Директива include
    Используйте include вместо #include. В конце ставьте точку с запятой, как и для других операторов:
    можно: include "../core/ComponentVersion.as";
    нельзя: #include "../core/ComponentVersion.as"

    Всегда используйте относительные пути вместо абсолютных.


    Директива import
    Указывайте только те классы, интерфейсы и пакетные функции, которые используйте. Не используйте спецсимвол "*":
    можно:
    import mx.controls.Button;
    import flash.utils.getTimer;
    нельзя: import mx.core.*;


    Директива use namespace
    Избегайте ее использования. Вместо этого, используйте синтаксис "::" для каждого определения вне основного пространства имен:
    можно:
    import mx.core.mx_internal;
    // Позже, в каком-либо методе...
    mx_internal::doSomething();
    нельзя:
    import mx.core.mx_internal;
    use namespace mx_internal;
    // Позже, в каком-либо методе...
    doSomething();


    Оператор if
    Если ветви оператора if/else не содержат более одного оператора, не заключайте эти операторы в блок фигурными скобками.
    можно: if (flag) doThing1();
    нельзя: if (flag) { doThing1(); }
    можно:
    if (flag)
    doThing1();
    else
    doThing2():
    нельзя:
    if (flag)
    {
    doThing1();
    }
    else
    {
    doThing2();
    }

    Однако, если одна из ветвей содержит более одного оператора, заключайте в блоки все ветви:
    можно:
    if (flag)
    {
    doThing1();
    }
    else
    {
    doThing2();
    doThing3();
    }
    нельзя:
    if (flag)
    doThing1();
    else
    {
    doThing2();
    doThing3();
    }

    Если требуется проверка большого количества ошибок, используйте последовательность операторов if, которые осуществляют проверку и при ошибке, сразу возвращают результат и выходят из метода. При этом, поток выполнения проверки движется по странице вниз. В конце метода ставится возврат результата успешного прохождения проверки.
    Не используйте вложенные тесты, при которых поток выполнения смещается поперек страницы:
    можно:
    if (!condition1)
    return false;
    ...
    if (!condition2)
    return false;
    ...
    if (!condition2)
    return false;
    ...
    return true;
    нельзя:
    if (condition1)
    {
    ...
    if (condition2)
    {
    ...
    if (condition3)
    {
    ...
    return true;
    }
    }
    }
    return false;


    Оператор for
    Всегда заключайте тело цикла в болк фигурными скобками, даже если оно состоит только из одного оператора.
    можно:
    for (var i:int = 0; i < 3; i++)
    {
    doSomething(i);
    }
    нельзя:
    for (var i:int = 0; i < 3; i++)
    doSomething(i);

    Используйте для хранения верхнего предела цикла локальную переменную. Это очень важно, поскольку верхний предел пересчитывается на каждой итерации цикла. Конечно, это не распространяется на те случаи, когда пересчет предела цикла необходим:
    можно:
    var n:int = a.length;
    for (var i:int = 0; i < n; i++)
    {
    ...
    }
    нельзя:
    for (var i:int = 0; i < a.length; i++)
    {
    ...
    }

    Определяйте переменную цикла внутри круглых скобок оператора цикла, если она не определяется где-либо повторно:
    можно: for (var i:int = 0; i < 3; i++)
    нельзя:
    var i:int;
    for (i = 0; i < 3; i++)
    {
    ...
    }


    Оператор while

    Всегда заключайте тело цикла в болк фигурными скобками, даже если оно состоит только из одного оператора:
    можно:
    while (i < n)
    {
    doSomething(i);
    }
    нельзя:
    while (i < n)
    doSomething(i);


    Оператор do
    Всегда заключайте тело цикла в болк фигурными скобками, даже если оно состоит только из одного оператора:
    можно:
    do
    {
    doSomething(i);
    }
    while (i < n);
    нельзя:
    do
    doSomething(i);
    while (i < n);


    Оператор switch

    Заключайте тело каждого выражения case и default в болк фигурными скобками. Операторы break или return ставьте внутрь блока, а не после него. Если вы используете в блоке return, не ставьте после него break. Вариант default обрабатывайте так же как и case, вызов break из него так же обязателен:
    можно:
    switch (n)
    { case 0:
    { foo();
    break;
    }
    case 1:
    {
    bar();
    return;
    }
    case 2:
    {
    baz();
    return;
    }
    default:
    {
    blech();
    break;
    }
    }
    нельзя:
    switch (n) {
    case 0:
    foo();
    break;
    case 1:
    {
    bar();
    }
    break;
    case 2:
    baz();
    return;
    break;
    default:
    blech();
    }


    Оператор return

    Не заключайте возвращаемое значение в круглые скобки:
    можно: return n + 1;
    нельзя: return (n + 1);

    Вызов оператора return разрешается из любого места тела метода.

    Объявления

    Никогда не объединяйте несколько констант/переменных в одно объявление:
    можно: var a:int = 1; var b:int = 2;
    нельзя: var a:int = 1, b:int = 2;


    Ключевое слово override
    Там, где override необходимо, указывайте его до объявления спецификатора доступа:
    можно: override protected method measure():void
    нельзя: protected override method measure():void


    Спецификаторы доступа

    Всегда указывайте спецификаторы доступа везде, где это можно сделать. Никогда не используйте то, что по умолчанию, спецификатором доступа является internal.

    Перед тем, как объявить какой-либо API как public или protected, как следует подумайте, действительно ли это нужно. Public и protected API нужно документировать в обязательном порядке. Кроме того, они должны поддерживаться в нескольких последующих релизах, прежде чем станут формально устаревшими.


    Ключевое слово static
    Там, где static необходимо, указывайте его после объявления спецификатора доступа:
    можно: public static const MOVE:String = "move";
    нельзя: static public const MOVE:String = "move";


    Ключевое слово final

    Там, где final необходимо, указывайте его после объявления спецификатора доступа:
    можно: public final class BoxDirection
    нельзя: final public class BoxDirection

    Объявляйте все классы-каталоги ("enum classes") как final.
    Также, объявляйте "базовые" свойства и методы (те, что начинаются с $) как final.


    Константы

    Все константы должны объявляться как static. Нет необходимости объявлять в классе динамические константы, поскольку всё равно все объекты этого класса будут хранить одни и те же значения:
    можно: public static const ALL:String = "all";
    нельзя: public const ALL:String = "all";


    Переменные

    Если переменную необходимо инициализировать каким-либо значением, делайте это сразу при объявлении переменной, а не в конструкторе:
    можно: private var counter:int = 1;
    нельзя:
    private var counter:int;
    ...
    public function MyClass()
    {
    super();
    ...
    counter = 1;
    }


    Локальные переменные

    Объявляйте переменны непосредственно при их применении, или перед их первым использованием. Не объявляйте все переменные в начале функции:
    можно:
    private function f(i:int, j:int):int
    {
    var a:int = g(i - 1) + g(i + 1);
    var b:int = g(a - 1) + g(a + 1);
    var c:int = g(b - 1) + g(b + 1);
    return (a * b * c) / (a + b + c);
    }
    нельзя:
    private function f(i:int, j:int):int
    {
    var a:int;
    var b:int;
    var c:int;
    a = g(i - 1) + g(i + 1);
    b = g(a - 1) + g(a + 1);
    c = g(b - 1) + g(b + 1);
    return (a * b * c) / (a + b + c);
    }

    Объявляйте локальные переменные в функции только один раз. ActionScript 3 не поддерживает объявление локальных переменных с областью видимости в одном блоке:
    можно:
    var a:int;
    if (flag)
    {
    a = 1;
    ...
    }
    else
    {
    a = 2;
    ...
    }
    нельзя:
    if (flag)
    {
    var a:int = 1;
    ...
    }
    else
    {
    var a:int = 2;
    ...
    }
    можно:
    var i:int;
    for (i = 0; i < n; i++)
    {
    ...
    }
    for (i = 0; i < n; i++)
    {
    ...
    }
    нельзя:
    for (var i:int = 0; i < n; i++)
    {
    ...
    }
    for (var i:int = 0; i < n; i++)
    {
    ...
    }


    Классы
    Если класс наследуется от Object, не нужно указывать extends Object.

    The only “bare statements” in a class should be calls to static class initialization methods, such as loadResources(). (Совсем ничего не понял в этой фразе).


    Конструкторы
    Если класс имеет какие-либо свойства или методы, необходимо написать конструктор. Обязательно вызывайте super(), даже если кроме него больше ничего нет.

    Если в конструктор передаются аргументы, давайте им имена переменных, которым они передаются.
    можно:
    public function MyClass(foo:int, bar:int) {
    this.foo = foo;
    this.bar = bar;
    }
    нельзя:
    public function MyClass(fooVal:int, barVal:int) {
    foo = fooVal;
    bar = barVal;
    }

    Не инициализируйте переменные класса в конструкторе. Делайте это при объявлении переменных. Это разрешается только в том случае, когда в наследуемых классах требуется переустановить значения переменных.

    Послесловие

    Далее перечислены темы, которые еще не в разработке:

    • Interfaces
    • Namespaces
    • Implementing properties
    • Metadata
    • Packages
    • Helper classes
    • Bare statements

    Будем иногда заглядывать СЮДА и следить за продолжением.

    Правила, конечно, порой спорные.
    Например, инициализация переменных при их объявлении допустима только при работе с простыми значениями. Например, инициализировав какую-либо переменную объектом {prop:1}, мы получим во всех объектах этого класса ссылку на один и тот же объект, но не клоны отого объекта.

    Еще пример - избавляться от лишних круглых скобок в вычислениях и логических выражениях. Не сильно я согласен с таким заявлением. Вообще, код лучше читается, когда он поделен на блоки. При многочисленных делениях и умножениях трудно будет потом разобраться что на что делется и множится... То же самое в логических выражениях.

    Остальное, в принципе, вполне законно и приемлемо.
    В следующий раз поговорим об организации файлов: File Organization.


    2008-05-21

    23:24:21, 33 коровы
    UAFPUG#2, Мой доклад.

    Призенташка (в плане информативности не особо полезная, но полистать можно)

    Презентация не содержит всехпунктов по которым я сравнивал IDE, но у меня есть маленька табличка которая содежит список фич и плюшек, и как их поддерживает та или иная ИДЕ.

    Таблица сравнения

    Из всего доклада я хочу осветить предпоследний слайд, он содержит кратенькие выводы
    • FlexBuilder — выбор пролетариата
    • FlashDevelop — малыш
    • IDEA — сырой монстр
    • FDT — дорого, местами со вкусом

    пояснения про FlexBuilder и FDT я уже дал,

    • Flex builder 3 пока можно назвать самым мощным средством разработки флекс приложений (да да именно его). Адоб медленно, но верно движется к нормальной IDE, этот вывод я озвучил
    • FDT-Enterprise я бы выбрал для разработки чисто флеш/ас3 приложений, но цена кусается (к сожалению просто забыл это озвучить в процессе доклада)
    • Большым бонусом этих IDE является то, что ни построены на базе мега IDE — Eclipse
    • FDT очень проигрывает Flex builder 3 ценой и отсутствием поддержки mxml, поэтому если намечаются разнообразные проекты (Flex|ActionScript3) то выгоднее использовать Flex Builder
    • Счастья нет — все производители очень завязаны на своих “фичах для галочек”, большом количестве готового кода, готовыми алгоритмами, протухшими решениями 10 летней давности, стереотипами и боязнью сделать что-то более удобное

    добавлю лишь, что FlexBuilder медленно и верно движется в правильном направлении и у него есть все шансы!

    FlashDevelop — малыш, его я так назвал потому, что он фактичеки не является средой разработки — это продвинутый блокнот с кучей удобных и полезных фич. Если делать маленький проект и одному, то его можно использовать если что-то больше то комфортнее использовать FlexBuilder или FDT.

    IDEA — сырой монстр. IDEA известна свои удобством среди ява(и не только) программистов. В данный момент в версии 7.0.3 поддержка flex разработки очень сырая, много мелких неприятных глюков, но разработчики IDEA их фиксят. Вобщем когда “доварят” нашего монстра, то будет видно. И еще меня волнует позиционировние самой разработки флекс проектов в IDEA — она позиционируются как дополнительная фича, т.е. существует вероятность, что поддержка флекса будет уходить на второй план по сравнению с явой(можете попробовать разубедить меня). И еще один кирпич в огород IDEA — сложноватенько, человек который придет из мира флеша будет долго въезжать во все ньансы этого “монстра”.

    Всех благ вам и удачного кода влюбой из ИДЕ:)


    17:17:00, Flash-разработка
    Хороший стиль Flex-программирования. Именование

    Хочется кодить лучше, правильнее, грамотнее, понятнее, по правилам, ... и чтобы не было стыдно кому-нибудь показать.

    Adobe любит нас, и создал для нас небольшой свод правил, который поможет не только лучше понимать Flex SDK, но и нам самим сделать свой код лучше.

    Flex SDK coding conventions and best practices

    Итак, сегодня мы поговорим об именовании (Naming).

    Именование

    Наши стандарты именования соответствуют стандартам ECMAScript и Flash Player 9.


    Использование сокращений

    Вообще, лучше их избегать. Например:
    можно: calculateOptimalValue(), нельзя: calcOptVal().

    Потому что ясность кода гораздо важнее чем минимизация количества нажимаемых клавиш. Важнее не только для нас самих, но и для тех, кому придется работать с нашим кодом.

    Однако, есть общепринятые сокращения:
    acc = accessibility (ButtonAccImpl)
    auto = automatic (autoLayout)
    eval = evaluate (EvalBindingResponder)
    impl = implementation (ButtonAccImpl)
    info = information (GridRowInfo)
    num = number (numChildren)
    min = minimum (minWidth)
    max = maximum (maxHeight)
    nav = navigation (NavBar)
    regexp = regular expression (RegExpValidator)
    util = utility (StringUtil)

    Существуют и другие сокращения. Если мы не догадаемся об их смысле, придется поискать их применение в исходном коде. Или подумать еще разок.

    Иногда можно встретить отсутствие логики в применении сокращений. Например, horizontalScrollPolicy и verticalScrollPolicy, но HBox и VBox.


    Использование аббревиатур

    Аббревиатуры довольно часто используются во Flex: AIR, CSS, HLOC, IME, MX, MXML, RPC, RSL, SWF, UI, UID, URL, WSDL, XML.

    Аббревиатуры всегда пишутся либо заглавными, либо строчными буквами:
    можно: SWF, swf, нельзя: Swf

    Строчные буквы используются только в том случае, когда весь идентификатор именуется аббревиатурой, либо идентификатор начинается с аббревиатуры и он должен начинаться со строчной буквы.

    Например:
    можно: CSSStyleDeclaration, IUID, uid, IIME, imeMode.


    Разделение слов

    Когда идентификатор состоит из двух или более слов, используется два метода разделения слов:
    - Регистром - каждое отделяемое слово пишется с большой буквы
    - Подчеркиванием - слова разделяются символом подчеркивания

    В некоторых местах может встретиться нарушение этого правила: комбинация слов становится целым словом: dropdown, popUp, pulldown.


    Имена, содержащие тип

    Если в имени нужно указать тип, поместите его, не сокращая, в конец имени. Откажитесь от использования суффиксов типа "_mc" по старой традиции ActionScript 1.

    Например:
    можно: border, borderSkin, or borderShape, нельзя: border_mc

    Часто лучшим именем для объекта является имя его типа в отличающемся регистре (не соглашусь, т.к. смысловой нагрузки никакой - годится только для тестов и примеров):
    var button:Button = new Button();


    Имена пакетов

    Начинаются со строчной буквы и для разделения слов используется регистр: controls, listClasses.

    Имена пакетов должны быть всегда существительными или отглагольными -ing формами (герундий), но не глаголами, прилагательными или наречиями.

    Пакет, включающий множество схожих элементов должен именоваться общим названием этих элементов во множественной форме: charts, collections, containers, controls, effects, events ...

    Обычно, -ing формами именуются пакеты, реализующие концепции (я бы сказал процессы): binding, logging, messaging, printing ...
    С другой стороны, это могут быть существительные, выражающие концепцию: accessibility, core, graphics, rpc ...

    Пакет, содержащий классы, которые обеспечивают работу компонента FooBar, должен называться fooBarClasses.


    Имена файлов

    Имена файлов импортируемых API должны соответствовать определениям public API. Но для include-файлов (файлов фрагментов кода) это правило не применяется.

    Имя include-файла начинается с заглавной буквы и разделение слов в имени осуществляется регистром: BorderStyles.as, ModalTransparencyStyles.as

    Имена файлов ресурсов пишутся строчными буквами, а слова разделяются символом подчеркивания: icon_align_left.png


    Имена пространств имен

    Именуются строчными буквами с разделением слов символом подчеркивания: mx_internal, object_proxy.


    Имена интерфейсов

    Начинаются с заглавной "I", разделение слов в имени осуществляется регистром: IList, IFocusManager, IUID.


    Имена классов

    Начинаются с заглавной буквы, разделение слов в имени осуществляется регистром: Button, FocusManager, UIComponent.

    Подклассы Event именуются FooBarEvent.
    Подклассы Error именуются FooBarError.
    Подкласс EffectInstance, ассоциированный с эффектом компонента FooBar именуется FooBarInstance.
    Подклассы Formatter именуются FooBarFormatter.
    Подклассы Validator именуются FooBarValidator.
    Классы скинирования компонентов именуются FooBarBackground, FooBarBorder, FooBarSkin, FooBarIcon, FooBarIndicator, FooBarSeparator, FooBarCursor, и т.д.
    Классы утилит именуются FooBarUtil (не FooBarUtils - пакет может именоваться во множественном числе, но класс - только в единственном).
    Общепринято базовый класс именовать FooBarBase: ComboBase, DateBase, DataGridBase, ListBase.


    Имена событий

    Начинаются со строчной буквы, разделение слов в имени осуществляется регистром: move, creationComplete.


    Имена стилей

    Начинаются со строчной буквы, разделение слов в имени осуществляется регистром: color, fontSize.


    Значения строковых свойств

    Начинаются со строчной буквы, разделение слов в имени осуществляется регистром: "auto", "filesOnly".


    Имена констант

    Именуются полностью заглавными буквами с разделением символом подчеркивания: OFF, DEFAULT_WIDTH.

    Если константа строковая, слова в имени константы должны соответствовать словам в строке ее значения:
    public static const FOO_BAR:String = "fooBar";


    Имена свойств (переменные и установщики)

    Начинаются со строчной буквы, разделение слов в имени осуществляется регистром: i, width, numChildren.

    Используйте "i" для имени переменной цикла "for", и "n" для имени верхнего предела цикла.
    Используйте "j" для имени переменной вложенного цикла "for", и "m" для его имени верхнего предела цикла:
    for (var i:int = 0; i < n; i++)
    {
    for (var j:int = 0; j < m; j++)
    {
    ...
    }
    }

    Используйте "p" для имени переменной цикла "for..in":
    for (var p:String in o)
    {
    ...
    }

    Бывают ситуации, когда в классе необходимо переопределить установщик, но предполагается, что базовый установщик будет продолжать использования. Для сохранения базового установщика, необходимо создать новый установщик, имя которого должно формироваться путем добавления к имени базового установщика символа "$". Полученный установщик нужно определить как "final". Он не должен ничего делать, кроме вызова базового установщика. Напимер, нам нужно перекрыть установщик numChildren, но при этом сохранить возможность вызывать базовый super.numChildren - для последнего мы создаем следующее:
    mx_internal final function get $numChildren():int {
    return super.numChildren;
    }


    Переменные для хранения данных установщиков

    К имени установщика добавляется символ подчеркивания "_":
    для foo имя переменной _foo.


    Имена методов

    Начинаются со строчной буквы, разделение слов в имени осуществляется регистром: measure(), updateDisplayList().

    Имена методов должны быть всегда глаголами.

    Лучше не использовать методы без параметров подобно getFooBar() или setFooBar(). Вместо них используйте установщики. Однако, если getFooBar() - медленный метод, требующий больших вычислений, лучше его назвать findFooBar(), calculateFooBar(), determineFooBar(), и т.д., выражая его суть, а не то, что он способен возвращать что-либо.

    Аналогично установщикам, если базовый метод перекрывается, но требуется сохраненить доступ к нему, создается метод с именем базового метода, перед которым добавляется символ "$":
    mx_internal final function $addChild(child:DisplayObject):DisplayObject
    {
    return super.addChild(child);
    }


    Обработчики событий

    Имя обработчика события формируется путем добавления к имени типа события слова "Handler": mouseDownHandler().

    Если обработчик предназначен для событий, отправленных субкомпонентами (т.е. не this), перед именем обработчика, сформированного по вышеописанному правилу, добавляется имя субкомпонента, отделенное символом подчеркивания "_": textInput_focusInHandler().


    Имена аргументов

    Всегда используйте для установщиков имя аргумента "value":
    можно - public function set label(value:String):void
    нельзя - public function set label(lab:String):void
    нельзя - public function set label(labelValue:String):void
    нельзя - public function set label(val:String):void

    Всегда используйте для обработчиков событий имя аргумента "event":
    можно - protected function mouseDownHandler(event:Event):void
    нельзя - protected function mouseDownHandler(evt:Event):void


    Имена пакетов ресурсов

    Если пакет рессурсов содержит ресурсы для определенного пакета классов, имя пакета рессурсов должно быть таким же: controls, {formatters}}, validators.


    Имена идентификаторов ресурсов

    Начинаются со строчной буквы, разделение слов в имени осуществляется регистром: pm, dayNamesShort.


    Прочая терминология

    Избегайте использование слова "object", т.к. оно вносит неопределенность.

    Слово "item" - элемент данных и никогда DisplayObject.

    Слово "renderer" - это DisplayObject, который отображает элемент данных.

    Слово "type" означает тип AS3, используйте вместо него слово "kind".

    С именованием разобрались. Теперь попытаемся придерживатся этих правил на практике. У меня есть много своих правил именования, и скорее всего часть из них я оставлю (например именовать private-свойства с префиксом в два подчеркивания, а protected-в одно), но правила, принципиально идущие вразрез с вышеприведенными надо искоренять.

    Следующий раздел "Language Usage" разберем в ближайшее время.


    2008-05-20

    08:13:36, 33 коровы
    Flex framework — это не только ценный мех, но еще и 120-150K полезного кода!

    Сенсация, сенсация, срочно в номер!

    Я знаю как уменьшить размер с 150 до 130 кб для флекс 3 приложения!

    Теперь более осмысленые слова:

    Многие жалуются, что флекс приложения имеют большой размер, и это в принципе так, 120-150 килобайт кода это не мало. Часто звучит вопрос как уменьшить размер получаемого кода.

    Давайте для начала разберемся, что нам дается с этим кодом?

    • Прелоадер (у нас он есть по умолчанию и нам просто не нужно его создавать, мелочь но приятно)
    • SystemManager — все проиницилизирует и создаст условия для комфортной работы стандартных и наших компонент (он объеденяет все нижеприведеные фичи в одно единое целое и заставляет их работать)
    • DragManager — в пол пинка позволяет делать драг”н”дроп всего из всего и во все, для List компонент это делается установкой пары флегов в mxml
    • StyleManager — работа со стилями. Во флекс фреймворке это одня из самых главных фич, дизайн можно изменить легким движением руки, и менять его в рантайме, догружая особоскомпилированые файлы стилей
    • LayoutManager — позволяет нам делать различные выранивания и позиционирования, без линних рассчетов (не правда ли удобно написать в mxml-коде width=”100%” ?)
    • PopUpManager — создаем и манипулируем со всплывающими окошками
    • ToolTipManager — наши замечательные тултипы, всегда сверху, ничего лишнего ( toolTip=”эгегей это я “, помоемому отлично)
    • CursorManager — позволит менять и создавать свои курсоры
    • HistoryManager и BrowserManager — храним историю переключения наших состояний и меняем линки в браузере, это пока единственное от чего бы я смог отказатся по умолчанию во фреймворке
    • Биндинг — автоматическое обновление данных там где это нам нужно, удобно, безумно удобно, супер удобно, только на это мне не жалко 50-60К кода )
    • Стили по умолчанию — создав и запустив приложение мы получаем
      “раскрашеные” компоненты готовые к употреблению как они есть.

    Согласитесь, что это совсем немало для для каких-то 120(150) килобайт кода! Если вы считаете, что тут много лишнего, то подумайте правильно ли выбрали среду разработки для вашего проекта, может все таки использовать Flash CS3 или голые AS3 проекты?

    Помни: средняя фотка с фликера весит 100-150К, а страница баш.орг.ру — 200-300К

    Я лично готов пожертвовать размером ради удобства и скорости разработки. Количество “динозавров” с модемами по 56кбит/с уже очень мало, стоимость мегабайта трафика уже не космическая, и задайтесь вопросом “нужно ли мое приложение всем?”, мой ответ: “кому оно нужно у того явно нет проблемы с интернетом!”

    На последок открою тайну про уменьшение размера приложения.
    В нагрузку к коду нам еще дают стиль по умолчанию, так вот если его “вырезать” ну или заменить на более легкий варинт то есть возможность съэкономить 10-20-30К кода, но зачем тратить это время? (самый простецкий способ это открыть framework.swc с помощью rar’а и почикать стили внутри него, если просто удалить их содержимое то проект запуститься но в рантайме будет ругатся, что ему нехватает запчастей)

    Каждый должен знать, что приложение по умолчанию компилится в дебаг версию поэтому для релиз версии незабудь воспользоваться Project


    2008-05-15

    11:19:00, Flash-разработка
    Делаем прелоадер для Flex-приложения. Продолжение. AS3

    Поиск привел к статейке: Making a Cooler Preloader in Flex: Part 1 of 3.

    Доступно, с примерами раскрывается процесс создания собственного прелоадера для Flex-приложения. Пожалуй, выделю основные положения, опустив приступы остроумия автора :).

    Введение.

    Для создания собственного прелоадера для Flex, необходимо всего два шага:

    1. Расширить класс DownloadProgressBar.
    2. Указать Application, в свойстве preloader, этот новый класс.

    Или подробнее:

    1. Создать MovieClip, содержащий 100 фреймов.
    2. Указать ему Linkage ID без имени класса.
    3. Скомпилиоровать SWF.
    4. Написать собственный прелоадер, использующий созданный Flash MovieClip.
    5. Указать в mxml-коде, в теге mx:Appliction свойство preloader с именем созданного класса.

    Создание Flash клипа

    Автор предлагает создать 100-фреймовый клип с анимацией отображения прогресса загрузки, и добавляет в него dynamic TextField. Полученный клип он убирает в другой клип-контейнер, содержащий таймлайн с плавной анимацией появления и скрытия прелоадера. При этом необходимо дать имена всем клипам, участвующим в доступе к 100 фреймам и текстовому полю, для того, чтобы затем обратиться к ним по принципу “dot dot down” (это оказывается у нашего брата флэшера существует такой сленг, означающий "спуск" по дереву клипов к объекту, с которым нужно взаимодействовать).

    Важно: Никаких скриптов в таймлане не пишем.

    Затем - что еще любопытнее - автор экспортирует всё это хозяйство во Flash 8, AS2 или AS1. Как он это объясняет, если делать прелоадер под AS3, то потребуется писать класс для прелоадера, а это повлечет за собой массу работы и дополнительного объема к файлу. Наш прелоадер должен быть простым и максимально легким.

    Итак, экспортируем в Flash 8, а в Linkage указываем идентификатор и ставим 1-ю и 3-ю галки. Flex должен увидеть наш Linkage ID, когда мы внедрим наш SWF.

    Класс прелоадера

    Создаем класс, экстендим его от mx.preloaders.DownloadProgressBar. Внедряем в него Flash контент мета-тегом [Embed(source="... /preloader.swf", symbol="Preloader")]. В конструкторе создаем и добавляем в дисплей-лист объект прелоадера. Затем, перекрывая свойство-установщик preloader, назначаем обработчики событий загрузки.

    Важный момент: для того, чтобы организовать плавное скрытие прелоадера, нобходимо прибегнуть к следующему трюку. Мы предусмотрели в клипе-контейнере анимацию скрытия прелоадера (которая заканчивается, к примеру, на 20-м фрейме, а фрейм 21 пуст) . По событию onFlexInitComplete, мы добавляем скрипт в фрейм 21: clip.addFrameScript(21, onDoneAnimating);. Наш скрипт останавливает анимацию прелоадера и генерирует событие Event.COMPLETE.

    Важное добавление в комментариях: В коде обработчика onDoneAnimating необходимо отписаться от всех событий, на которые подписался класс прелоадера.

    Пример и исходники прилагаются: Example Source ZIP.

    Попробуем, как это работает на практике.

    * * *

    Попробовал. Работает. Но пришлось убить часа два на следующую проблему: В примере в главном клипе скрипт устанавливается во фрейм 21. Я создал клип с таймлайном в 21 фрейм. Не заработало. Скачал пример: Download Preloader FLA. Заработало. Подменил своим - не заработало (клип крутится по кругу, но не стартует скрипт).

    В итоге, выяснилось, что необходимо добавить еще один фрейм. То есть временная шкала должна содержать не менее 22 фреймов. Причина - фреймы в параметрах метода нумеруются с нуля (источник).

    * * *

    Выяснилось, что не обязательно использовать версию Flash8 AS2. Можно указать и Flash 9 с AS3. Однако как ни крути, скрипты из тайм-лайна вызываться не будут. В целях снижения объема SWF-файла лучше всеже использовать более старые версии - лучший результат показал Flash 6/7 AS1/AS2, но не намного.

    * * *

    Еще одна важная фича - фон приложения на этапе предзагрузки. Живой Flex подсказывает нам, что это можно сделать двумя путями:

    1. Добавить в пункте "Additional compiler arguments:" строку:
      -default-background-color #336699
    2. Указать цвет фона в параметрах тегов Object и Embed при внедрении флэш-приложения в HTML-страницу:


    2008-05-14

    20:33:33, 33 коровы
    UAFPUG#2, вторые впечатления.

    Итоги, общие выводы и результаты можно посмотреть/почитать у Роста (1 , 2 , 3), у Романа, у Валерии и Сергея.

    Из этих постов становится понятным, что все удалось отлично).

    Лучше я поделюсь своими мыслями и ошибками, которые образовались в процессе подготовки и рассказа доклада (Сравнение средств разработки: FDT, FlashDevelop, IDEA, FlexBuilder. Возможности, недостатки, перспективы., http://fpug.org.ua/meeting2) :

    В процессе подготовки доклада я понял, что пытался втиснуть в небольшой доклад(всего 2 часа :)) очень много информации. Хотелось обо всем рассказать много и подробно, а получилось все в общем. Каждая из ИДЕ достойна одного и более докладов описывающих все удобства, фичи, ньюансы работы с ней. Еще желательно запустить и показать на большом экране как настроить и куда нажимать, чтобы получить нужный результат. Вывод: нужно более трезво оценивать масштабы доклада

    Незнаю как оценили мой доклад слушатели (Рост, ты обещал сделать оценивалку )), но мне кажется я местами налажал, позабывал сказать некоторые обязательные вещи и просто затянул свой доклад, из-за чего подвел Романа — он не успел рассказать вtсь доклад(.

    А еще я сильно много говорил слов паразитов, невнятных фраз и спорил со слушателями. Вывод: нужно лучше готовится, делать меньше паузы между словами, исключить из речи слова паразиты и больше спорить со слушателями )

    По самому докладу:

    Общее пожелание: не затягивайте с публикацией своих докладов. Практика показывает, что лучше сделать это прямо сейчас, иначе трудно избежать долгого “доведения до ума”.

    Это относится ко мне на 110%. Но прошу меня извенить очень много информации и нужно привести ее в более удобоваримый вид).

    Особо нетерпеливым скажу основные выводы:

    • Flex builder 3 пока можно назвать самым мощным средством разработки флекс приложений (да да именно его). Адоб медленно, но верно движется к нормальной IDE, этот вывод я озвучил
    • FDT-Enterprise я бы выбрал для разработки чисто флеш/ас3 приложений, но цена кусается (к сожалению просто забыл это озвучить в процессе доклада)
    • Большым бонусом этих IDE является то, что ни построены на базе мега IDE — Eclipse
    • FDT очень проигрывает Flex builder 3 ценой и отсутствием поддержки mxml, поэтому если намечаются разнообразные проекты (Flex|ActionScript3) то выгоднее использовать Flex Builder
    • Счастья нет — все производители очень завязаны на своих “фичах для галочек”, большом количестве готового кода, готовыми алгоритмами, протухшими решениями 10 летней давности, стереотипами и боязнью сделать что-то более удобное

    Основной доклад приводится в порядок, не пройдет и года как он выйдет в свет :)


    2008-05-01

    13:10:36, Junik
    Data Binding во Flex. Часть 1. Немного общих слов и истории

    Это первая часть моего рассказа про Data Binding во Flex, который живьем можно было послушать на 12-ого апреля 2008 года на питерской встрече Russian Adobe Flash Platform User Group.
    Презентацию можно скачать здесь, либо посмотреть в отчете Константинера о встрече RAFPUG в Питере в День Космонавтики.

    Презентация рассчитана на мой сопутствующий рассказ, поэтому некоторые слайды можно неправильно воспринять без объяснений. Отчасти поэтому я и пишу небольшой цикл постов по этой теме. Хотя главная причина в том, что тема эта очень интересная, и хочется говорить об этом снова и снова. :)

    Data Binding (связывание данных) можно назвать одной из основ разработки на Flex. Поэтому каждый уважающий себя разработчик прямо таки обязан в совершенстве владеть этим интересным и полезны механизмом.

    Если вы разрабатываете на Flex, то, скорее всего, регулярно используете data binding. Особенно органично его использование в mxml. Вообще говоря, надо сильно извратиться, чтобы, используя mxml, ни разу не использовать data binding или связывание данных.

    Data binding во Flash
    Интересно, что на Flash платформе data binding появился еще во Flash, и некоторые разработчики активно его использовали.
    Flash 8 для этого предоставлял Bindings tab и классы пакета mx.data.binding.
    Кстати, не могу сказать, что связывание данных во Flash, было удобным. Хотя, не могу сказать, что хоть что-то там было удобно. :)

    Еще более интересен тот факт, что Flash CS3 уже не предоставляет возможностей связывания данных своим разработчикам. Видимо, это очередной намек Adobe на то, что программистам надо смотреть в сторону Flex.
    В документации для Flash CS3 про Data binding classes недвусмысленно говорится о том, что можно использовать старые механизмы связывания, но тогда и компилить можно будет только под ActionScript 2.0.

    Что же такое связывание данных или data binding?
    Суть связывания в автоматической синхронизации. Слово “автоматическая” особенно приятно звучит, так как это освобождает нас от какой-то рутинной работы. А кто хочет заниматься рутинной работой? :)

    Наиболее распространенный случай - это синхронизация model и view.
    При нормальном адекватном развитии событий в приложении существуют такие слои, как view, model, controller. View отображает данные модели. В большинстве случаев при изменении данных в модели, необходимо обновлять view. Это можно осуществить вручную путем подписывания на события изменения модели и вызовом методов обновления view. Связывание данных позволяет делать это автоматически.

    Вам выбирать, что синхронизировать. Это может быть синхронизация данных, различных элементов GUI и тд и тп.

    В качестве примера синхронизации элементов GUI можно привести такой код:

    Code:

    <mx:List id="list1" dataProvider="{listExample}"></mx:List>
    <mx:List id="list2" dataProvider="{listExample}"
    selectedIndex="{list1.selectedIndex}"
    verticalScrollPosition="{list1.verticalScrollPosition}">
    </mx:List>

    Всего несколько строк кода позволяют определить сразу три синхронизации:

    • dataProvider обоих списков синхронизируются с коллекцией listExample. Это значит, что при изменении listExample, оба списка сами обновят свой внешний вид.
    • selectedIndex синхронизируется с соответствующим свойством первого списка. Таким образом, когда пользователь выделяет элементы первого списка, соотвествующие элементы автоматически выделяются во втором списке.
    • аналогично синхронизируются значения verticalScrollPosition списков. Если пользователь скролит первый список, то автоматически скролится и второй список.

    Bookmark this article at


    2008-04-30

    22:26:21, Flash-ripper.com
    Программирование под флэш платформу. Cтатья (местами спорная)

    Все, с чем я не согласен в статье "Программирование под флэш платформу", я уже сказал ее автору. Он кое-что изменил. Я продолжаю не соглашаться со многими высказанными в статье мыслями, и при этом считаю ее очень полезной.

    И мне очень интересно: а что вы скажете вы на такие слова: "Лично для себя я не вижу особой пользы от MXML, с тем же успехом можно генерировать и ActionScript-код из режима дизайнера".

    Я подозреваю, что не только автор этой статьи так считает. А может быть, он по-своему прав? В общем, читайте: "Программирование под флэш платформу" от Yzh (о нем).


    2008-04-29

    07:51:32, 33 коровы
    Плюшки для Flex Builder

    На InsideRIA появилась интересная статья о том как можно сделать работу в Flex Builder более комфортной.

    Переводить я ее не буду) — просто расскажу, что думаю:

    TODO/FIXME
    плагин — полезная вещь использую ее практически с самого ее появления (больше года). Позволяет выводить //TODO и //FIXME коментарии в соответствующей панели. Единственный недостаток в том, что если коментриуется блок кода который в свою очередь содержит такие коментарии, то эти коментарии остаются в панельке.

    Snippets
    Позволяют делать темплиты кода, как настроить это дело можно прочитать в вышеуказаной статье, есть вариант более подробный с картинками.
    Главным достоинством могу назвать то что работает как в as и в mxml файлах. К недостаткам отнесу довольно много телодвижений для вставки нужного темплита в код. Удобнее, для мелочей(и не только, если не ленится), использовать манкей скрипт, как это описано в статье у Кости Ковалева, но скрипт не работает в mxml (салют индусам за мхмл редактор).
    Если сравнивать Snippets и Monkey Script то обезьяна гораздо «умнее» и имеет множество возможностей, но создавать темплиты кода не очень удобно (нужно программировать, что требует определенных навыков :D ). Snippets’ы удобнее и легче создавать.

    Mylyn полезная штука я о ней уже упоминал. Но есть некоторые «фичи» использования ее во флекс билдере:
    Флекс билдер использует свой файл навигатор, который плохо дружит с Mylyn. Данный навигатор умеет только подсвечивать файлы из текущего контекста, но не умеет прятать ненужные файлы. Я стал использовать сочетание «стандартный навигатор»


    2008-04-01

    15:45:30, Flash-ripper.com
    Мысли по поводу будущего Flash Player

    Странный день! Вокруг все веселятся (и поют (а некоторые и танцуют)), а у меня на душе тревожно, на глазах слезы.

    Ровно два года осталось до того дня, когда Flash Player начнет постепенно исчезать, а окончательно исчезнет Он через три года (дата уточняется).

    Стадо обезьян с гранатометами

    Но разве могла фирма Adobe предвидеть последствия своих поистине необдуманных, своих поспешных, да что там говорить, попросту ин-фан-тиль-ных, я повторяю — инфантильных действий в том (уже далеком) 2006 году? Разве знали мы (разве знали ОНИ), какому монстру отдаем мы (отдают ОНИ) на растерзанье свой (НАШ) возлюбленный JIT-компилятор языка ActionScript3? Свою внутренность флэш-проигрывательную в чьи руки вверили?

    Разве знали мы (ОНИ), что проект Тамарин, изначально планировавшийся Синдикатом (картель "Microsoft-Google-Sun") как надежный и прочный гроб для всех ECMAScript-подобных языков — что проект этот выйдет из под контроля? Как стая бешеных механических обезьян, как ожившие скелеты всех мертвых языков программирования — проект Тамарин открывает новое Смутное Время доминирования ECMAScript-языков на всех (ВСЕХ) платформах. Это началось уже весьма давно.

    Кинохроника: жестокая расправа программистов над мэром интернета (видео)

    Что вы говорите? Светлые идеалы опенсорса? И где он, ваш опенсорс? Откуда он вышел? Да весь ваш опенсорс столетиями прозябал в глубоком дебаге! Банда распоясавшихся интеллектуалов, стоящая за всем этим вялотекущим якобы "программированием", была относительно безопасна, пока проект находился под контролем Синдиката! Теперь же Tamarin, получивший невиданную по силе гормональную инъекцию вытяжки из мозжечка виртуальной машины FlashPlayer AVM2 больше не находится под каким-бы то ни было бережным контролем!

    Кому, скажите мне, кому будет нужен наш возлюбленный флэш-проигрыватель, когда в Тамарине можно будет делать все то же самое, на том же самом языке ActionScript 6, с той же самой сверхэффективной MXML-(X)-разметкой, с теми же видеами-шмидеами и аудиами-шмаудиами из HTML5?

    Никому не нужен будет Flash Player 13, как бы окончательно распотрошенный, отдавший всю свою функциональность в разы более производительному браузеру, лишая ядро технологии всех известных ограничений, начиная от унылого SEO, заканчивая разухабистым 3DCanvas.

    Индексирование Доу-Джонса: то, чего не пишут в "Последних днях Интернета"

    Проект Tamarin становится по настоящему опасным. Почему эта истина открылась мне лишь сегодня. Я наверное просто идиот. Вам предстоит забыть весь этот бред. Когда я досчитаю до десяти вы все забудете. Но! Не пишите письма в Синдикат, там уже давно в курсе и поделать они увы ничего не могут (кстати, это и есть реальная причина падения индекса Доу-Джонса).

    Kharkov-Tamarin-Kingston, 2008

    ...похоже, я снова пришел в сознание. Я что-то писал уже сегодня?


    2008-03-31

    17:16:21, Constantiner's blog
    Тезисы докладов на питерской встрече RAFPUG в День Космонавтики

    AIR Rocket LaunchПоявились тезисы докладов планируемой питерской встречи RAFPUG (Russian Adobe Flash Platform User Group, Российская Группа Пользователей Flash-платформы от Adobe), о которой я уже писал. Напомню, что встреча пройдет в субботу 12 апреля. В День Космонавтики. Место проведения уже наклевывается, и о нем мы обязательно сообщим.

    Итак, начнем-с.

    Data Binding. Связывание данных во Flex 2

    Юлия “Junique” Николаева

    • Что такое data binding или связывание данных? Механизмы связывания.
    • Способы связывания данных в mxml и в actionscript.
    • О срабатывании связывания данных. Методы executeBindings() и executeChildBindings().
    • Особенности использования BindingUtils
    • Что может стать источником связывания?
    • Когда стоит использовать связывание данных?
    • Зачем нужен ChangeWatcher?
    • Опасности связывания данных. Утечки памяти; сложность отладки; ошибки времени исполнения.

    Жизненный цикл компонент во Flex (Component Lifecycle Overview)

    Павел “Vertex” Кожин.

    • Что такое жизненный цикл и для чего он нужен.
    • Фаза 1. Создание. Инстанциирование + Конфигурация.
    • Фаза 2. Рождение. Аттачмент + Инициализация + Валидация.
    • Фаза 3. Жизнь. Взаимодейстие.
    • Фаза 4. Смерть. Удаление + Сборка мусора.
    • Сравнение жизненного цикла компонентов MX 2.0 (AS2) и Flex.

    Разработка приложения с использованием технологий Flex, BlazeDS, Spring, Hibernate

    Александр “Agahov” Гахов.

    • Настройка среды: установка Tomcat, Maven.
    • BlazeDS: развертывание, устройство каталогов, структура конфигурационных файлов.
    • Принципы Dependency Injection и использование Spring для разработки приложений.
    • Хранение объектов в реляционной базе данных на основе технологии JPA (Hibernate).
    • Взаимодействие технологий на примере преобразованного flexStore.

    Как видите, скучно не будет.

    Итак, кто еще в сомнениях, может регистрироваться на мероприятие. Информация по регистрации тут или на страничке группы.

    Bookmark this article at


    2008-03-29

    21:46:00, Flash-разработка
    Первый законченый проект на Flex. Грабли и впечатления.
    Вот закончен еще один проект. И отличие его от предыдущих - это чистый Flex-проект построенный на MXML-верстке.

    О проекте

    Вкратце - результат проедставляет собой презентацию-каталог (оффлайн, версия для CD/DVD и версия для TouchScreen), в котором основной элемент - интерактивная карта России, разделенная на регионы. По клику на регионы осуществляется его увеличение и вывод городов. По клику на город, выводится панель со списком типов объектов (презентуемых заказчиком). По клику на тип объекта, открывается список самих объектов с фото-превьюшками и описаниями. По клику на описание объекта выводится более подробное описание с теми же фото-превьюшками, по клику на которые показывается крупное фото. Кроме того - два доп-раздела "О компании" и "Контакты".

    На flash-разработку проекта я выделил две недели, т.е. в реальных условиях менее 10 рабочих дней.

    На распутье

    Сначала возникло желание делать проект на моем старом (правильнее сказать - устаревшем) но отработанном презентационном движке AS2. Но структура проекта совсем не похожа на послайдовку, поэтому возник соблазн сделать презентацию другим способом, и полностью задействовать Flex.

    Дизайн-макет, на первый взгляд, показался довольно сложным, но глаз уже уловил, насколько выигрышно было бы использовать Flex-верстку. Верстать и программировать динамические списки, поставляемые выборками из XML-базы, "ручками" на AS2 - тоска.

    Опыт работы с Flex за плечами уже есть, AS3 освоен. Но имеют место сомнения: "А вдруг упрусь в какую-нибудь проблему или глюк, и сроки полетят?" "Сроки жесткие, может быть лучше по-старинке, AS2?" "Зато уверенность, стабильность и предсказуемость". После часа раздумий, решился рискнуть - Flex.

    За работу

    Моя рабочая платформа - Flex Builder 3 Plug-in for Eclipse.

    Настало время применить теорию на практике. Для начала, "порезал" макет, подготовил все "ассеты" и начал верстать экраны.

    Взаимодействие пользователя представляет собой сложную систему состояний экрана. Решил использовать систему состояний Flex (states). И сделать это так - сначала сверстать все элементы приложения в базовом состоянии, а потом создать ряд состояний для каждого этапа работы приложения, в которых скрывать/открывать и трансформировать элементы.

    При верстке проблем не возникло. Очень напоминает верстку сайтов. При помощи стилей можно творить чудеса - использовать скины даже не потребовалось. Всё необходимое было сверстано совсем без затыков за один-два дня. Впечатления самые положительные.

    Параллельно, моим коллегой готовилась флэшка с картой. Клип с картой подгружается компонентом mx:SWFLoader. Сначала мы решили сделать ее в виде большого таймлайна, и навигация по карте осуществлялась бы командами gotoAndPlay(""). Выбор такого решения (конечно не очень удачного) был обусловлен желанием сделать карту в виде видео-ролика с 3D-эффектами. В итоге сроки свели задачу к простой флэш-анимации :). Позже стало ясно, что способ тайм-лайновой анимации совсем не интересен и карту анимировали программно Tween-ом.

    Затем, после отладки навигации по состояниям (которые пока сменялись резкими переходами без анимации), настало время наложить эффекты появления и трансформации элементов. При анимировании появления/скрытия, я столкнулся с ситуацией, изложенной ниже. До конца контролировать ситуацию на получилось, но компромиссное решение было найдено.

    Зашивание проекта в Zinc особых трудностей не составило. Zinc спокойно интегрируется во Flex-проект. Использовались основные объекты глобального класса mdm:
    mdm.Application - для получения директории, из которой запускается приложение,
    mdm.Application.Library - для работы с библиотекой приложения.
    mdm.FileSystem - для тестирования наличия файлов.

    В итоге, хочется сказать, что проект завершился успешно. Скорость разработки на Flex превзошла мои ожидания, и сэкономленное время позволило дополнительно отладить и отточить приложение (переделать анимацию интерактивной карты коренным образом). Впечатления от работы с Flex остались самые положительные, и я рад, что рискнул.

    * * *

    Ниже изложено несколько нехороших ситуаций:

    Неверно спроектированная верстка

    Дизайн-макет был разработан на разрешение 1600х1200 - для TouchScreen. Позже, когда приложение было уже на этапе отладки, выяснилось, что нужна еще одна версия - предназначенная для распространения на CD/DVD, а значит, под меньшее разрешение. Пришлось срочно переверстать новую версию под 1024х768. Если бы я изначально заложился под трансформируемую верстку (благо, во Flex эта возможность реализована превосходно), лишней работы делать бы не пришлось. И версии можо было бы не плодить. На будущее - нужно изначально закладываться на гибкую верстку - стоит того.

    Внедрение шрифта формата .OTF

    При внедрении шрифта возникла следующая проблема. Мне необходимо внедрить шрифт MyriadPro. Это TrueType-шрифт формата .OTF.
    Код внедрения в стили:


    @font-face
    {
    font-family: MyriadPro;
    font-weight: normal;
    src: url("Assets/Fonts/MyriadPro-Regular.otf");
    unicode-range:
    U+000-ґU+0040, /* Punctuation, Numbers */
    U+004-5U+005A, /* Upper-Case A-Z */
    U+004-AU+0060, /* Punctuation and Symbols */
    U+004-µU+007A, /* Lower-Case a-z */
    U+004-БU+007E, /* Punctuation and Symbols */
    U+00FC-U+00FD, /* UE */
    U+040-tU+042F, /* Cyrillic Upper-Case */
    U+040-фU+0451; /* Cyrillic Lower-Case */
    }

    В окне FB Design шрифт отображается некорректно, выдает ошибку транскодирования: "Exception during transcoding: Font for alias 'MyriadPro' with plain weight was not found at: ...MyriadPro-Regular.otf ..." И то же самое для версии "bold".
    Однако, при компиляции проекта ошибки нет и в приложении шрифт отображается корректно на разных компьютерах. Отнес это к проблемам (читай - глюкам) средства визуальной разработки FB.

    Эффект появления/скрытия и states

    Пришлось повозиться с эффектом mx:Fade, используемого для появления/скрытия некоторых компонентов.

    По началу я предположил, что если я создам эффекты Fade (один для появления и другой для скрытия) и укажу его для некоторых компонентов в стилях showEffect и hideEffect, то при смене состояния, при изменении свойства visible, компоненты будут плавно появляться/исчезать. Как бы не так. При формировании состояния, выполняются (тупо, без каких либо перепроверок и оптимизаций) все действия - начиная с базовых состояний. Если в базовом состоянии visible устанавливается в false, а в текущем, базирующемся на нем, в true, то будет выполнено два действия со всеми вытекающими последствиями. Если Fade-скрытие еще не успело завершится, а уже вызывается Fade-появление, то последнее будет просто проигнорировано. Короче - полный разлад и совсем не адекватный результат. То же самое относится и к другим видам эффектов.

    Для анимации такого рода необходим другой прием. При использовании transitions всё сразу встало на свои места. Конечно, это принесло другие сложности, но зато эффект появления/скрытия работает как часы.

    Маскирование контента SWFLoader

    Проблема связана со следующей особенностью. Клип интерактивной карты в процессе работы приложения может трансформироваться (трансформируемый клип расположен в главном таймлайне загружаемой флэшки). Но он должен отображаться в строго отведенной прямоугольной области. Казалось бы, чего проще - поместить его в Box, у которого horizontalScrollPolicy="off" verticalScrollPolicy="off" clipContent="false". Не работает. Причем странно - пока клип карты перемещается, границы отсекаются. Как только клип останавливается, всё что вылезает за пределы области появляется.

    Пришлось накладывать маску программно, высчитывая координаты и размер области.

    Воспроизведение FLV

    В самом конце столкнулись со следующей проблемой. Презентация начинается с видео-заставки. Заставка - файл FLV, который подгружается в mx:VideoDisplay. Проблема заключалась в том, что компонент отказался воспроизводить внешнее видео, если презентация находится на удаленном сервере (с этим то всё ясно - включена опция -use-network=false), или на сменном носителе - записанная на CD/DVD (а вот это - критично).

    К сожалению, FLV нельзя внедрить посредством @Embed. Но это может сделать Zinc, чем я немедленно воспользовался. Но такое решение не самое красивое. В дальнейшем придется выяснить, почему не воспроизводится FLV со сменных носителей, и как этого избежать. Возможно, необходимо установить параметры безопасности, а может быть проблема связана с задержками доступа к CD/DVD приводу в связи с чем, что-то рассинхронизировалось в приложении.


    2008-03-28

    21:43:17, Flash-ripper.com
    Exception Seminar #08 - Flash, Flex, AS3, MXML

    R00z уже начал просачивать инфу в чат UAFPUG, так что придется колоться: "Exception Seminar #08 — про Flex, ActionScript и MXML".

    Об этом мероприятии пишут:

    Уважаемые коллеги! Начиная с этого момента, мы расширяем область деятельности и добавляем в свой список динамический язык программирования ActionScript, который применяется во Flash-приложениях и используется в прогрессивной технологии веб-приложений нового поколения Adobe Flex.

    Ведутся переговоры... :)


    2008-03-27

    08:15:02, 33 коровы
    FDT 3.0 Enterprise или разочарование сезона

    Вчера была выпущен в свет FDT 3.0 Enterprise. Подробности можно посмотреть на сайте производителя.

    Для меня данный релиз стал разочарованием сезона. В данной версии отсутствует редактор MXML кода, хотя его обещали. В добавленные плюшки входят лиш :

    Support
    One very important part of the Enterprise version is support. As we know, support is a core feature for companies when they decide to use a new program - we now provide immediate support. Furthermore, we offer trainings and workshops at a reasonable price, which allow you to get first class hands-on training from our Powerflasher-FDT experts.

    Debugger
    For debugging purposes FDT is going to integrate the Flex SDK Debugger into the Eclipse Debug Perspective. This will allow you debugging ways as you know them from JDT and Flex Builder.

    Advanced Refactoring
    Advanced Refactoring will add common refactoring tools like Change Method Signature, Move, Extract Interface, Extract Method to the FDT Editor.

    Дебагер это конешно хорошо, но это все только для Flash|ActionScript проектов.

    А расстроился я потому, что мне, как флекс разработчику эта тулза совсем бесполезна. А учитывая ее стоимость (599 евро|1012 долларов США|4542 гривен| 24106 рублей) становиться совсем печально(. Незнаю чем они думаю, но я останусь верен флекс билдеру, надеясь что адоб таки соизволит позаботиться об удобстве разработчиков, а не создании разной функциональности для галочки.

    И вообще дайте мне команду вменяемых ява-девелоперов (этак человек 5-8), денег и через год я переверну это мир! Или просто небольшой институт по исследованию центральной нервной системы человека и я создам матрицу.


    2008-03-25

    12:30:58, Graann's blog
    Восстановления объектов определенного класса из SharedObject

    Константин Ковалев предложил более простой и изящный вариант решения проблемы затронутой мною в предыдущем посте.
    Суть решения заключается в простом использовании метатега RemoteClass в классе сохраняемого объекта. Т.е registerClassAlias не требуется. Код ниже:

    Code:

    <mx:Application creationComplete="onCreationComplete()" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
    <![CDATA[ 
      import src.DataObject; 
      import flash.net.*; 
       
      private var so: SharedObject; 
      private var dataObject: DataObject; 
     
       
      private function onCreationComplete(): void 
      { 
        dataObject=new DataObject(); 
        registerClassAlias('src.DataObject', DataObject);     
        so = SharedObject.getLocal("test"); 
      } 
       
       
      private function dataObjectGeneration(): void 
      { 
        dataObject.generate(); 
        ta.htmlText+='GENERATION: '+dataObject.toString()+'\n'; 
      } 
       
      private function saveLocalData(): void 
      { 
        so.data.DataObject=dataObject; 
        so.flush(); 
        ta.htmlText+='SAVE: '+dataObject.toString()+'\n'; 
      } 
       
       
       
      private function loadLocalData(): void 
      { 
        so = SharedObject.getLocal('test'); 
        if(so.data.DataObject!=null) 
        { 
          dataObject=so.data.DataObject as DataObject; 
          ta.htmlText+='LOAD: '+dataObject.toString()+'\n'; 
        } else { 
          ta.htmlText+='LOAD: null\n'; 
        } 
      } 
       
    ]]> 
    </mx:Script> 
    <mx:Button x="193" y="27" label="save" id="save_" click="{saveLocalData()}"/> 
    <mx:Button x="107" y="27" label="generate" id="generate" click="{dataObjectGeneration()}"/> 
    <mx:Button x="49" y="27" label="load" id="load_" click="{loadLocalData()}"/> 
    <mx:TextArea x="49" y="57" height="141" width="618" id="ta"/> 
    </mx:Application> 

    и код класса

    1. package com.riapriority.tests
    2. {
    3.         import mx.formatters.DateFormatter;
    4.        
    5.         [Bindable]
    6.         [RemoteClass(alias="com.riapriority.tests.DataObject")]
    7.         public class DataObject
    8.         {
    9.                 public var date: Date;
    10.                 public var random: String;
    11.  
    12.                 public function generate(): void
    13.                 {
    14.                         date = new Date();
    15.                         random = "" + Math.random() * 10000;
    16.                 }
    17.  
    18.                 public function toString():String
    19.                 {
    20.                         var df:DateFormatter = new DateFormatter ();
    21.                         df.formatString = "JJ:NN:SS DD/MM/YYYY";
    22.                         return "\n  date: " + df.format(date) + "\n  random: " + random;
    23.                 }
    24.         }
    25. }


    [Bindable] здесь не обязателен, но как тонко выразился Константин,
    класс без [Bindable], что штопор без бутылки :)


    2008-03-24

    15:18:42, Graann's blog
    Использование registerClassAlias для восстановления объектов определенного класса из SharedObject

    Продолжу тему затронутую Александром Гаховым в статье “Клонирование объектов утилитой ObjectUtil.copy".
    Здесь

    я приведу пример использования registerClassAlias для восстановления объектов определенного класса из SharedObject. Суть проблемы заключалась в том, что помещенные в SharedObject экземпляры определенного класса при перезапуске возвращались, как экземпляры класса Object. Когда я столкнулась с этой проблемой, доступного для понимания примера мне нагуглить не удалось. Перед размещением же поста, я нашла вопрос по этой теме в ruFlex, однако приведенный там пример показался мне не вполне наглядным. Предлагаю вашему вниманию свой пример решения этой проблемы:

    Code:

    <mx:Application creationComplete="onCreationComplete()" xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
    <![CDATA[ 
      import src.DataObject; 
      import flash.net.*; 
       
      private var so: SharedObject; 
      private var dataObject: DataObject; 
     
       
      private function onCreationComplete(): void 
      { 
        dataObject=new DataObject(); 
        registerClassAlias('src.DataObject', DataObject);     
        so = SharedObject.getLocal("test"); 
      } 
       
       
      private function dataObjectGeneration(): void 
      { 
        dataObject.generate(); 
        ta.htmlText+='GENERATION: '+dataObject.toString()+'\n'; 
      } 
       
      private function saveLocalData(): void 
      { 
        so.data.DataObject=dataObject; 
        so.flush(); 
        ta.htmlText+='SAVE: '+dataObject.toString()+'\n'; 
      } 
       
       
       
      private function loadLocalData(): void 
      { 
        so = SharedObject.getLocal('test'); 
        if(so.data.DataObject!=null) 
        { 
          dataObject=so.data.DataObject as DataObject; 
          ta.htmlText+='LOAD: '+dataObject.toString()+'\n'; 
        } else { 
          ta.htmlText+='LOAD: null\n'; 
        } 
      } 
       
    ]]> 
    </mx:Script> 
    <mx:Button x="193" y="27" label="save" id="save_" click="{saveLocalData()}"/> 
    <mx:Button x="107" y="27" label="generate" id="generate" click="{dataObjectGeneration()}"/> 
    <mx:Button x="49" y="27" label="load" id="load_" click="{loadLocalData()}"/> 
    <mx:TextArea x="49" y="57" height="141" width="618" id="ta"/> 
    </mx:Application> 

    Собственно сам класс нашего объекта.

    1. ackage src
    2. {
    3.         import mx.formatters.DateFormatter;
    4.        
    5.         public class DataObject
    6.         {
    7.                 public var date: Date;
    8.                 public var random: String;
    9.                
    10.                 public function DataObject()
    11.                 {
    12.                        
    13.                 }
    14.                
    15.                 public function generate(): void
    16.                 {
    17.                         date=new Date();
    18.                         random=""+Math.random()*10000;
    19.                 }
    20.                
    21.                 public function toString():String
    22.                 {
    23.                         var df: DateFormatter=new DateFormatter();
    24.                         df.formatString="JJ:NN:SS DD/MM/YYYY";
    25.                         return "\n  date: "+df.format(date)+"\n  random: "+random;
    26.                 }
    27.         }
    28. }

    Прошу прощения за подобное отображение mxml-ины. Если пример вас заинтересует скопируйте его. :)


    2008-03-18

    18:39:02, DL1t's blog
    OpenDialect 0.1.0

    Появилась первая публичная версия OpenDialect - опенсорсной IDE для Flex-разработки, написаннной на C#. На данный момент работает под Windows, в ближайшее время будет портирована под Mono, т е станет работоспособна под Linux и OS X. После скачивания дистрибутива размером в 21 мегабайт и его установки обнаруживаем слегка странно выглядящий таймлайн и поле с Flex-компонентами, а также редактор mxml-кода(подстветки кода не обнаружено). Производит впечатление очень ранней альфы. Информация о проекте - здесь.


    18:10:00, Flash-разработка
    Как открыть ссылку, заданную в htmlText компонента Text. Flex
    Если задать HTML-текст как мы это делали всегда, ссылка станет активной, но открываться не будет:
    <a href='http://www.adobe.com' target='_blank'>Go Home</a>

    На лайф-доках есть статья, которая открывает нам этот новый секрет Flex. Теперь необходимо создавать обработчик, который будет осуществлять переход по ссылке:
    <?xml version="1.0"?>
    <!-- textcontrols/LabelControlLinkEvent.mxml -->
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" borderStyle="solid" backgroundGradientColors="[#FFFFFF, #FFFFFF]">
    <mx:Script>
    <![CDATA[
    import flash.events.TextEvent;
    public function linkHandler(event:TextEvent):void {
    myTA.text="The link was clicked."; // Open the link in a new browser
    window. navigateToURL(new URLRequest(event.text), '_blank')
    } ]]>
    </mx:Script>
    <mx:Label selectable="true" link="linkHandler(event);">
    <mx:htmlText>
    <![CDATA[<a href='event:http://www.adobe.com'>Navigate to Adobe.com.</a>]]>
    </mx:htmlText>
    </mx:Label>
    <mx:TextArea id="myTA"/>
    </mx:Application>

    Таким образом, мы сами контролируем открытие ссылок из текстовых блоков.

    2008-03-17

    13:09:17, 33 коровы
    Как самому отлавливать биндабл значения простым способом

    Сегодня мне задали вопрос:

    как самому отлавливать биндабл значения простым способом, я ставлю проперти в биндабл и юзаю его в mxml. а теперь я хочу сам подписаться чтобы тоже получать извещение о новом значении

    Я не забыл ответить сразу и человек ушел в оффлан. Думаю этот пример будет полезен всем ).
    В кратце — ловим эвент, смотрим, что внутри, биндим в мхмл наше значение чтобы было все почесному.
    Важно перед употреблением прочесть хелп по метатегу [Bindable] иPropertyChangeEvent

    <?xml version=“1.0″ encoding=“utf-8″?>
    <mx:Application xmlns:mx=“http://www.adobe.com/2006/mxml”
                                    creationComplete=“init()”
                                    layout=“vertical”>
            <mx:Button      label=“{’change property, property now is ‘+ testBinding}”
                                    click=“{testBinding = Math.random().toString()}”/>
            <mx:TextArea    id=“eventsLog”  width=“600″ height=“200″/>
            <mx:Script>
                    <![CDATA[
                            import mx.events.PropertyChangeEvent;
                           
                            //наша тестовая переменная
                            [Bindable]
                            public var testBinding : String;
                           
                            public function init()
                            {
                                    addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, propertyChangeEventHandler);
                            }
                           
                            public function propertyChangeEventHandler( event:PropertyChangeEvent ) : void
                            {
                                    eventsLog.text  +=\n\nPropertyChangeEvent {”
                                                                    +\n type : “+event.type
                                                                    +‘,\n property : ‘+event.property
                                                                    +‘,\n kind : ‘+event.kind
                                                                    +“,\n newValue : “+event.newValue
                                                                    +“,\n oldValue : “+event.oldValue +‘}’;
                            }
                    ]]>
            </mx:Script>
    </mx:Application>

    2008-03-03

    13:36:53, Garbage Collector
    FDT 3.0 Enterprise beta

    29 февраля для публичного тестирования была выложена бета-версия FDT 3.0 Enterprise. Из заявленных нововведений: встроенный дебаггер, с возможностью расставлять брейк-поинты, и улучшенный рефакторинг кода. MXML не поддерживается. Ссылка для установки-обновления: http://fdt.powerflasher.com/update_beta/. Если вы уже используете лицензионную версию FDT 3.0, то устанавливайте пробную версию в отдельную копию Eclipse.


    2008-02-21

    14:26:11, Flash-ripper.com
    Метапрограммирование во Flex при помощи метаданных

    Документация по Flex утверждает, что метаданные используются во Flex-приложениях для указания компилятору и парсеру дополнительных параметров классов, их свойств или методов. Например, в коде AS3-класса можно указать его события с помощью мета-тэгов [Event] (пример). После этого компилятор и парсер кода начинают "понимать" указанные события и при использовании данного AS3-класса в качестве MXML-компонента среда разработки Flex Builder будет выдавать к нему соотвествующие подсказки кода. А указав для свойства класса мета-тэг [Inspectable], вы сделаете его доступным инспектору свойств компонента (панель "Flex Properties"). Это встроенные мета-тэги, вот их полный список: Metadata tags in Flex 3. Присказка закончилась, дальше идет сказка.

    Использование собственных мета-данных в AcationScript-классах

    Со времен Flex 2 во Flash Player API встроена возможность получать доступ к мета-данным классов во время выполнения через т.н. Reflection API (метод describeType()). Это недокументированная возможность, поскольку документация говорит только об использовании мета-данных компилятором.

    Более того, можно не только получить доступ к встроенным метаданным в время выполнения, но и вводить собственные мета-данные, не предусмотренные разработчиками Flex Framework. А чтобы они вместе со встроенными мета-данными попали в откомпилированное приложение, нужно указать их в опции компилятора -keep-as3-metadata.

    Примеры использования собственных метаданных во Flex

    Открываются возможности, осознать которые — целая отдельная задача. Есть примеры. Вот Кристоф Конрац показывает, как упростить общение с базой данных. С помощью собственных мета-данных он описывает структуру таблицы БД в своем ActionScript-классе. Затем показывает, как просто можно работать с описанной в мета-данных таблицей БД, не используя никакого SQL — только ActionScript.

    Вот более свежие примеры от Эли Гринфилда, демонстрирующие, как с помощью собственных мета-данных можно вызывать функцию при каждом изменении некоего AS-выражения, или как создавать одно- и дву-направленные связывания между частями вашего компонента, или как в декларативном стиле назначить обработчик события части вашего компонента (online demo).

    И Кристоф, и Эли предоставляют исходники к своим экспериментам (не очень сложные).


    2008-02-19

    17:40:05, Flash-ripper.com
    Не так страшен Флекс, как его малютки :)

    Сегодня в Skype-чате UAFPUG прозвучала фраза флэш-разработчика Олега Галабурды:

    Собсна, я в этом месте меняю своё мнение про Флекс, а точнее про представление MXML -> AS3. :) Итого - Флекс не так уж и страшен, как его малюют, но отгребать рискую долго.

    Этот эффект вызвало прочтение короткой статьи "Flex для Флэшеров" и пара фраз в чате!


    2008-02-07

    15:23:54, Flash-ripper.com
    IntelliJ IDEA как инструмент разработки Flex-приложений

    5 февраля 2008 г. в блоге JetBrains IDEA был анонсирован выход новой версии редактора IDEA 7.0.3 с продвинутой поддержкой Flex-приложений. Участники предрелизной программы JetBrains, "Early Access Program" (EAP) уже могут это попробовать:

    • Умный автокомплит кода для MXML и AS файлов с перекрестным учетом сущностей кода (code symbols) между ними, включая значения аттрибутов и блоки mx:Script.
    • Автоформатирование, подсветка и стилизация кода (Илья?)
    • Валидация кода на лету, поддержка быстрых правок (quick-fixes).
    • Диагностика кода на предмет "бутылочных горлышек" производительности, плохих практик и других проблем.
    • Богатый рефакторинг.

    Хотите проверить, как это работает? Вот ссылки:

    1. Урок: использование IntelliJ IDEA для создания Flex-приложений (pdf).
    2. Скачать: свежий билд IDEA.
    3. Скачать: исходные коды проекта, получающегося при прохождении урока.

    Не секрет, что IDEA высоко ценится Java-разработчиками за ее превосходное качество. Многие просто называют ее лучшей. "Most Intelligent" — называеют ее авторы.

    Поддержку Flex в IDEA хотим и ждем давно. Похоже, разработчики из JetBrains решают эту задачу на "отлично". Но — кто уже пробовал эти новые возможности? Что скажете?


    2008-02-06

    11:11:00, Flash-разработка
    Событие от компонентов itemRenderer. Flex
    Есть компонент список List, элементы которого являются компонентами (MXML) и задаются через свойство itemRenderer.
    В свойство dataProvider указан [Bindable] массив ArrayCollection.
    Каждый из элементов этого массива - объект [Bindable] класса с набором свойств, который порождается от EventDispatcher. В компонентах элементов списка свойства этого объекта указаны как источники данных: text="{data.name}" и change="data.text=text_input.text;".

    При работе со списком, происходят изменения свойств любого из объектов списка. Свойства объектов элементов массива обновляются, меняют свои значения. Все хорошо.

    Теперь, требуется получать событие обновления какого-либо элемента.
    Я пошел обычным путем - подписался на прослушивание события PropertyChangeEvent.PROPERTY_CHANGE для каждого экземпляра элемента массива при его создании. Приблизительный код:

    . . .

    [Bindable]
    public var some_list:ArrayCollection;

    . . .

    var item:TSomeListItem=new TSomeListItem(some_source.name, some_source.status);
    item.addEventListener PropertyChangeEvent.PROPERTY_CHANGE,this.onPropertyChange,false,0,true);
    this.some_list.addItem(item);

    . . .

    private function onPropertyChange(event:PropertyChangeEvent):void {
    trace("Изменилось свойство", event.source, ".", event.property,"Было:", event.oldValue,"Стало:",event.newValue, "Тип изменения:", event.kind);
    }

    . . .

    <mx:HorizontalList . . . dataProvider="{some_list}" itemRenderer="SomeListItemRenderer" id="some_list_box"></mx:HorizontalList>

    Таким образом, при каждом изменении какого-либо элемента списка отрабатывает событие, предоставляющее полную информацию об изменении.
    Возможно существует другой способ получить это событие - я пока не нашел.

    2008-02-05

    15:15:00, Flash-разработка
    Параметры конструктора. MXML
    Определяя класс для последующей его вставки в MXML, при объявлении конструктора, необходимо указать для всех его параметров значения по умолчанию. Иначе возникает ошибка "1136: Incorrect number of arguments. ".
    Других способов избежать ошибки я не нашел.

    2008-02-04

    12:37:00, Flash-разработка
    ViewStack и эффекты появления/исчезания. MXML
    Компонент ViewStack удобен для строительства последовательностей диалогов. Чтобы диалоги появлялись/исчезали интереснее, можно использовать эффекты (способ применим к любым компонентам, это частный случай).
    Определяем эффекты:
    <mx:Move id="fadeIn" duration="500" xFrom="-1000"/>
    <mx:Move id="fadeOut" duration="500" xTo="-1000"/>

    Для каждого компонента указать эффекты появления/исчезания:
    <mx:ViewStack . . . selectedIndex="0">
    <mx:Canvas . . . hideEffect="{fadeOut}" showEffect="{fadeIn}">

    2008-01-31

    13:04:00, Flash-разработка
    DisplayObjectWrapper от G.Skinnerа. Flex
    Как сделать, чтобы такие ассеты как Flash-символы или изображения были совместимы с Flex-компонентами? Грант Скиннер (Grant Skinner) предлагает свой способ: "обернуть" ассет в объект UIComponent, который будет транслировать API трансформирования Flex в API трансформации Flash-объектов DisplayObject.
    Класс "обертки" можно взять здесь.
    Пимер использования в MXML:
    // mxml, syntax 1:
    <local:DisplayObjectWrapper>
    <DisplayObjectToWrap/>
    </local:DisplayObjectWrapper>
    // mxml, syntax 2:
    <local:DisplayObjectWrapper content="com.gskinner.MyClass"/>
    // where content is either a qualified class name as a string
    // mxml, synax 3:
    <local:DisplayObjectWrapper content="{ myInstance }"/>

    Пример использования в ActionScript:
    // in a script block (ex. in an initialization handler):
    var dow:DisplayObjectWrapper = new DisplayObjectWrapper();
    dow.content = new Sprite(); // or any DisplayObject instance
    myContainer.addChild(dow);

    11:08:51, Graann's blog
    Использование embed изображений в стилях

    Путь скинизации посредством css тернист и многотруден. Особенно если каждый стиль требуют собственных скинов для виджетов (иконок, кнопок и т.д). Предположим нам надо подгрузить картинку. Для примера создадим класс наследованный от UIComponent и требующий подгрузки картинки описанной в css. Назовем класс Example.as.
    Стили для него описаны в одноименном блоке стиля. (вы разумеется знаете, что стили цепляются к одноименной компоненте автоматом и не требуют каких-то дополнительных директив?)
    Казалось бы чего проще?…

    1. <mx :Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="src.*">
    2.     <!-- так конечно делать не надо, но для примера покатит :) с css будет так же!-->
    3.     <mx :Style>
    4.         Example{image: Embed("graphics/image.png");}
    5.     </mx>
    6.     <ns1 :Example x="42" y="24"/>
    7. </ns1></mx>
    8.  
    9.  
    10. package src
    11. {
    12.        import mx.core.UIComponent;
    13.        import mx.controls.Image;
    14.  
    15.        public class Example extends UIComponent
    16.        {
    17.                private var image: Image;
    18.                
    19.                public function Example()
    20.                {
    21.  
    22.                }
    23.                
    24.                override protected function createChildren(): void
    25.                {
    26.                        super.createChildren();
    27.                        image=new Image();
    28.                        image.source=getStyle("image");
    29.                        addChild(image);
    30.                }
    31.                
    32.        }
    33. }

    И после компиляции картинку благополучно не видим. Почему? Потому, что по умолчанию ее размеры составляют 0 x 0. Для того чтобы она отобразилась корректно требуется задать ей реальные размеры, каковые нам любезно предоставляют свойства measuredWidth и measuredHeight. Однако не следует забывать, что актуальные значения ширины и высоты будут доступны только после вызова (автоматического) метода protected function measure(): void UIComponent, о котором доступна подробная информация в хелпе.

    Ну и собственно результат:

    1. package src
    2. {
    3.        import mx.core.UIComponent;
    4.        import mx.controls.Image;
    5.  
    6.        public class Example extends UIComponent
    7.        {
    8.                private var image: Image;
    9.                
    10.                public function Example()
    11.                {
    12.                        super();
    13.                }
    14.                
    15.                override protected function createChildren(): void
    16.                {
    17.                        super.createChildren();
    18.                        image=new Image();
    19.                        image.source=getStyle("image");
    20.                        addChild(image);
    21.                }
    22.                
    23.                override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
    24.                {
    25.                        super.updateDisplayList(unscaledWidth, unscaledHeight);
    26.                        image.setActualSize(image.measuredWidth, image.measuredHeight);
    27.  
    28.                }
    29.        }
    30. }

    Следует отметить, что подобных проблем с размерами не возникает в mxml-e.


    2008-01-29

    13:55:00, Flash-разработка
    Тег [Bindable]. Flex
    Если нам необходимо связать два свойства так, чтобы при изменении первого (источника) Flex автоматически копировал данные во второе (приемник), мы можем использовать метатег [Bindable]. Указав [Bindable] перед свойством-источником, мы даем понять Flex, что при изменении свойства надо генерировать событие.
    [Bindable]
    [Bindable(event="eventname")]

    Если событие не указано явно, то по умолчанию создается событие propertyChange.

    Тег [Bindable] используется в трех случаях:

    1. Перед определением класса. В этом случае, для всех (только!) public свойств (и переменных, и установщиков) Flex автоматически генерирует событие propertyChange типа PropertyChangeEvent, и все эти свойства могут использоваться как источники связывания данных.
      [Bindable]
      public class TextAreaFontControl extends TextArea {}
    2. Перед public, protected, private свойствами, определенными как переменные.
      При изменении свойств, Flex автоматически генерирует событие propertyChange типа PropertyChangeEvent. Можно также указать другое имя события.
      [Bindable(event="fooChanged")]
      public var foo:String;
    3. Перед public, protected, private свойствами, определенными как установщики. Для того, чтобы свойство являлось источником связывания данных, необходимо чтобы были определены и set, и get методы.
      Если указан только set метод, создается свойство "только для записи" и его нельзя использовать в качестве источника связывания данных.
      Если же указан только get метод, создается свойство "только для чтения", которое можно использовать как источник связывания данных и без вставки метатега - аналогично переменным, определеных как const.
      При изменении свойств, Flex автоматически генерирует событие propertyChange типа PropertyChangeEvent. Можно также указать другое имя события.
      [Bindable]
      public function set shortNames(val:Boolean):void { ... }
      public function get shortNames():Boolean { ... }

    ВАЖНО: Если после изменения, свойство не приобрело новое значение, Flex не генерирует событие. Проверка осуществляется по принципу (oldValue !== value).

    ВАЖНО: Если свойство содержит ссылку на объект и эта ссылка заменяется на другую, то событие генерируется. Если же изменяется объект, на который ссылается свойство, событие генерироваться не будет.

    Свойства read-only и static по-умолчанию являются источниками связывания данных.

    В этом примере установщик обновляет значение свойства, и вызывает событие для обновления связываемых свойств.


    // Define private variable.
    private var _maxFontSize:Number = 15;

    [Bindable(event="maxFontSizeChanged")]
    // Define public getter method.
    public function get maxFontSize():Number {
    return _maxFontSize;
    }

    // Define public setter method.
    public function set maxFontSize(value:Number):void {
    if (value <= 30) { _maxFontSize = value; } else _maxFontSize = 30; // Create event object. var eventObj:Event = new Event("maxFontSizeChanged"); dispatchEvent(eventObj); }

    Работа с цепочками связываемых свойств.

    Слкдующий пример показывает довольно длинную цепочку связываемых свойств:
    <mx:Text id="myText" text="{user.name.firstName.text}"/>

    Для того, чтобы механизм связывания данных поймал изменения свойства text, достаточно сделать свойство text связываемым. Однако, если необходимо присвоить новое значение какому-либо элементу цепочки на этапе выполнения, то все они должны быть связываемыми. С другой стороны, изменение любого из элементов приведет к неспособности механизма связывания отслеживать изменение свойства text.
    В случае работы с такими цепочками, можно пользоваться методами BindingUtils.bindProperty() или BindingUtils.bindSetter() .
    Пример использования bindProperty():
    bindProperty(myText, 'text', user, ["name","firstName","text"]);

    Здесь представлена цепочка в виде ["name","firstName","text"] относительно объекта user. При этом user не является элементом цепочки.
    В MXML цепочка связываемых свойств всегда задается относительно this:
    bindProperty(myText, 'text', this, ["user", "name","firstName","text"]);

    2008-01-28

    16:38:00, Flash-разработка
    Фокус на кастомном Flex-компоненте
    Внедряется кастомный компонент, в котором задействована клавиатура.
    После того, как последовательность интерфейсов доходит до экрана с этим компонентом, он активируется. Но не принимает события от клавиатуры. Необходимо установить на него фокус:
    Либо добавить в параметры MXML-тега:
    creationComplete="setFocus();"

    Либо инициализировать в скрипте:
    this.[component_name.]setFocus();

    2008-01-25

    07:40:16, WebService //Flash
    Ожидаем выход FDT 3.0 Enterprise

    Как стало известно, мы скоро сможем познакомится с Enterprise-версией FDT 3.0 - популярной среды разработки Flash, а теперь еще и Flex - приложений. По словам разработчиков, в новой версии будет очень мощный отладчик и невероятно удобная система рефакторинга.

    Первая версия (без поддержки MXML) ожидается уже в марте 2008 года, а финальный релиз запланирован на 2-3 квартал 2008 года.

    FDT 3.0

     

    Tags: , , ,


    07:40:16, WebService //Flash
    Ожидаем выход FDT 3.0 Enterprise

    Как стало известно, мы скоро сможем познакомится с Enterprise-версией FDT 3.0 - популярной среды разработки Flash, а теперь ещё и Flex - приложений. По словам разработчиков, в новой версии будет очень мощный отладчик и невероятно удобная система рефакторинга. Первая версия (без поддержки MXML) ожидается уже в марте 2008 года, а финальный релиз запланирован на 2-3 квартал 2008 года.

    FDT 3.0

    Tags: , , ,


    2008-01-23

    13:54:31, Constantiner's blog
    Отлов событий из Item Renderer'ов

    Многие знают, что ячейки таких компонент, как List и DataGrid могут быть представлены не только в стандартном виде, но и в произвольном, определённом пользователем. Достигается это с помощью item renderer’ов. Но не освещение темы item renderer’ов как таковых меня интересует сейчас, а некоторые конкретные случаи работы с ними. Те же, кто хочет узнать про рендереры, могут это сделать самостоятельно.

    Основная задача item renderer’а - представить произвольный визуальный способ отображения и редактирования данных. То есть если речь идет об изменении данных, то renderer это делает самостоятельно. Замечу об отличии item renderer’а от item editor’а с точки зрения редактирования данных: item editor предоставляет механизм некой сессии редактирования данных, обладающей сложным устройством и возможностью отмены редактирования. Но это тоже отступление от нашей генеральной мысли об орехах.

    Я хочу рассказать о таком варианте использования рендереров, как генерация некоторого события, которое не обязательно влечёт за собой изменение данных, ассоциированных с конкретным рендерером. Простейший пример - некоторая кнопка, о нажатии на которую мы хотим знать.

    Как перехватить это событие? Сложный вопрос. В общем, есть разные варианты. Например, используя ключевые слова parent или owner. Но реально это не очень спортивный способ. Ибо сильно завязан на структуру объектов.

    Я предлагаю использовать способ, базирующийся на бабблинге событий в визуальных объектах, о котором я недавно писал.

    Итак, будем основываться на примере с List’ом и item renderer’е с кнопкой. Будем использовать простейший XML в качестве data provider’а:

    Code:

    <mx:XMLList xmlns=""><testDataElement id="1" name="test 1" label="Delete" /> 
        <testDataElement id="2" name="test 2" label="Delete" /> 
        <testDataElement id="3" name="test 3" label="Delete" /> 
        <testDataElement id="4" name="test 4" label="Delete" /> 
        <testDataElement id="5" name="test 5" label="Delete" /> 
        <testDataElement id="6" name="test 6" label="Delete" /> 
    </mx:XMLList> 

    Тогда наш простой рендерер будет выглядеть так:

    Code:

    <?xml version="1.0" encoding="utf-8"?> 
    <mx:HBox  
        xmlns:mx="http://www.adobe.com/2006/mxml"> 
        <mx:Label 
            width="100%" 
            text="{data.@name}" /> 
        <mx:Button 
            click="dispatchEvent(new Event ('insideRendererButtonClick', true))" 
            label="{data.@label}" /> 
    </mx:HBox> 

    При нажатии на кнопку мы генерим событие с бабблингом. Но как это использовать?

    Есть два основных способа:

    • Простой способ, не требующий модификации List’а.
    • Более комфортный для использования, но требующий модификации List’а.

    Первый способ прост. Мы ловим бабблинг снаружи обрабатываем его:

    This text is replaced by the Flash movie.

    Можно посмотреть в отдельном окне (исходники доступны по правой кнопке).

    Пример прост: при нажатии на кнопку в первом List’е удаляется соответствующая строка. Во втором же List’е меняется метка на кнопке (и это, теоретически, вполне можно сделать изнутри рендерера).

    Как мы видим, главный класс приложения прост. Но он требует от нас двух вещей: подписываться на события с помощью addEventListener (декларативный синтаксис не работает потому что мы не указали соответствующих метаданных события в List’е) и на всякий случай вызывать stopPropagation для нашего события (чтобы где-то наверху кто-то неожиданно его не поймал). Также мы не можем послать стандартный ListEvent так как заполнение его полей требует знания о List’е, что опять же требует owner’ов/parent’ов.

    Кстати, способ с бабблингом требует одного условия: имя события (тип) не должно совпадать ни с одним из имен событий нашего List’а.

    Приложение, реализующее второй способ, выглядит аналогично. Также по правой кнопке доступны исходники. Рендерер мы оставили без изменений. Мы лишь добавили простой кастомный класс события и соответствующую константу для нашего события в нем. Это событие отражено в метаданных нашего расширенного List’а. Оно не перекрывается с именем события, которое «пузырит» наш рендерер.

    Также в нашем List’е мы видим отключение дальнейшего бабблинга события от рендерера (чтобы оно никому уже не помешало) с использованием stopImmediatePropagation.

    Иллюстрация метода stopImmediatePropagation ()

    А также можно увидеть формирование валидного события. Все просто. И, как следствие, упростился код главного класса приложения и стал много нагляднее.

    Когда использовать эти способы? Первый способ хорошо подходит для прототипирования. Он быстрый и простой. Второй же способ лучше использовать при создании коммерческого приложения, особенно если речь идет о командной разработке.

    Примерно так. Можно задавать вопросы, делиться своими способами, критикой приведенных итд. Милости прошу в комменты.

    Ну и напоследок предлагаю скачать готовый проект приведённого примера (Flex Builder 3 beta 3).

    Ссылки по теме раз и два.

    Now playing: Аквариум - Немое кино

    09:28:27, Garbage Collector
    Условная компиляция с mxmlc версии 3.0

    Будущий релиз Flex 3 породил массу статей, посвященных новшествам и изменениям как в самом фреймворке, так и в новой версии Flex Builder. На этом фоне без внимания остались изменения, произошедшие в компиляторах, поставляемых в комплекте с Flex 3 SDK. Сегодня я предлагаю исправить эту несправедливость. :-)
    (more…)


    2008-01-16

    14:16:24, RIA crumbs
    Внешние ресурсы во Flex 3 приложениях или напильник при компиляции :)

    Давно хотел написать об этой “фишке” во Flex 3, но руки не доходили. Как известно при создании нового проекта добрый Flex 3 создает папочку src в какую складывает AS и MXML. В процессе разработки, если мы используем внешние ресурсы, нам приходится указывать пути к ним с учетом уже того, что наши исходники лежат в папке, то есть к примеру - “../assets/icons/somesuperiormegaicon.png”. И на выходе мы имеем в папке bin наш swf и папки, но пути остались с “лишним ../”, из-за чего ресурсы не загружаются в приложение.. и приходится создавать папку в которую складываешь сам swf дабы сохранить пути рабочими…
    Вопрос знатокам, как можно починить этот не приятный момент ?


    2008-01-08

    16:22:50, Flash-ripper.com
    FlexSpy — визуальная отладка Flex-приложений на лету

    FlexSpy (fxSpy, Flex Spy) делает то же самое, что делает FireBug для Firefox. FlexSpy позволяет изменять свойства компонентов Flex-приложения во время работы — например, в окне браузера. Это здорово облегчает дизайн флекс-приложений, Как FireBug облегчает отладку веб-страниц.

    Можно увидеть FlexSpy в действии. Чтобы активизировать этот визуальный дебаггер, нажмите кнопку "FlexSpy" в правом верхнем углу. Внутри приложения откроется окно, позволяющее исследовать древовидную структуру визуальных компонентов и изменять их свойства — редактируемые помечены иконкой "карандаш". Эта штуковина может стать гвоздем в крышке гроба не слишком удобного дизайнерсокого режима самого Flex Builder.

    Нужно изменить ширину контейнера и посмотреть, что получится? Пожалуйста. Увидеть, как будет выглядеть приложение с другим фоном? Без проблем.

    Помимо того, что FlexSpy позволяет редактировать свойства и стили визуальных компонентов, он также имеет функцию удобного визуального поиска компонентов и подсветки редактируемого в данный момент элемента.

    Как использовать Flex Spy в вашем Flex-приложении

    Установка FlexSpy несложна сводится к стандартному подключению библиотеки flexspy.swc к проекту и добавлении кнопки его активации:
    1. Во Flex Builder откройте окно свойств проекта (меню Project > Properties).
    2. Выберите раздел Flex Library Build Path, а в нем — закладку Library path.
    3. Нажмите кнопку Add SWC... и в открывшемся диалоге укажите файл flexspy.swc.
    4. В любом месте своего приложения добавьте кнопку вызова FlexSpy:
      <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
      ...
      <mx:Script>
      <![CDATA[
      import com.flexspy.FlexSpy;
      ]]>
      </mx:Script>
      ...
      <mx:Button id="btnFlexSpy" label="FlexSpy" click="FlexSpy.show()" />
      ...
      </mx:Application>

    Теперь и у флекс-дизайнеров есть свой отладчик. Ожидается AIR-версия для десктопа.


    2008-01-04

    14:40:14, Garbage Collector
    Бета-релиз Degrafa

    Degrafa framework — это декларативный графический фреймворк, имеющий продвинутую поддержу CSS, позволяющий при помощи MXML-разметки рисовать геометрические фигуры, сложную составную графику, создавать скины.

    (more…)


    2007-12-26

    19:58:52, Constantiner's blog
    Недоразумение

    Adobe Flex LogoМногие наивно полагают, что Flex Builder - это та прикольная IDE, что ставится в один клик, а то, что другое, - это некий плагин для Eclipse. Уверяю вас, что Flex Builder - это и есть название плагина для Eclipse. Просто поставляется он в двух вариантах: в виде плагина и завернутый вместе с усеченным Eclipse.

    Соответственно, многие в обиходной речи называют одно билдером, а другое - Эклипсом. Это неверно. Верным было бы называть Flex Builder’ом плагин, а упакованную версию - standalone Flex Builder,

    Так или иначе, но и в качестве плагина он слабенький. Не поддерживает обновления через Update Manager и не поставляется в виде zip-аржива (в виде локального update-сайта) без упакованного внутрь SDK и плеера (чтобы не качать несколько раз одно и то же).

    Не говоря уже о низком качестве IDE и потреблении ресурсов при компиляции… Так что такой продукт, в принципе, можно называть как угодно :)

    Особенно весело когда Flex Builder 3 Beta 3 на свежем AIR-проекте, состоящем из одного пока mxml-файла выдает:

    Code:

    java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Unknown Source) 
    at java.io.ByteArrayOutputStream.write(Unknown Source) 
    at flash.swf.RandomAccessBuffer.write(RandomAccessBuffer.java:59) 
    at flash.swf.RandomAccessBuffer.write(RandomAccessBuffer.java:40) 
    at flash.swf.TagEncoder.doABC(TagEncoder.java:2175) 
    at flash.swf.tags.DoABC.visit(DoABC.java:28) 
    at flash.swf.MovieEncoder.export(MovieEncoder.java:146) 
    at flex2.compiler.API.encode(API.java:4059) 
    at flex2.tools.oem.Application.encode(Application.java:1199) 
    at flex2.tools.oem.Application.link(Application.java:1158) 
    at com.adobe.flexbuilder.multisdk.compiler.internal.ASApplicationBuilder$MyBuilder.mybuild(ASApplicationBuilder.java:283) 
    at com.adobe.flexbuilder.multisdk.compiler.internal.ASApplicationBuilder.build(ASApplicationBuilder.java:122) 
    at com.adobe.flexbuilder.multisdk.compiler.internal.ASBuilder.build(ASBuilder.java:139) 
    at com.adobe.flexbuilder.multisdk.compiler.internal.ASItemBuilder.build(ASItemBuilder.java:73) 
    at com.adobe.flexbuilder.project.compiler.internal.FlexProjectBuilder.buildItem(Unknown Source) 
    at com.adobe.flexbuilder.project.compiler.internal.FlexProjectBuilder.build(Unknown Source) 
    at com.adobe.flexbuilder.project.compiler.internal.FlexIncrementalBuilder.build(Unknown Source) 
    at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:624) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:166) 
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:197) 
    at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:246) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:249) 
    at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:302) 
    at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:334) 
    at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:137) 
    at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:235) 
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) 

    При том, что памяти я как только ему не выделял :(

    Люди говорят, что в standalone-билдере все в порядке. Но не держать же мне несколько конфигураций, открывая попеременно!?

    И это при пресловутой оптимизации. При том, что по умолчанию компилится только debug-версия (чтобы якобы уменьшить время компиляции). Прекрасная работа, Adobe! Ждем зажигательных рассказов о всех великих преимуществах нового билдера в течение European Flex 3 pre-release tour.

    И, кстати, мои субъективные наблюдения говорят о том, что по части работы с памятью и ресурсами с каждой новой бетой все становится только хуже.

    Будем надеяться на лучшее.


    19:58:52, Constantiner's blog
    Недоразумение

    Adobe Flex LogoМногие наивно полагают, что Flex Builder - это та прикольная IDE, что ставится в один клик, а то, что другое, - это некий плагин для Eclipse. Уверяю вас, что Flex Builder - это и есть название плагина для Eclipse. Просто поставляется он в двух вариантах: в виде плагина и завернутый вместе с усеченным Eclipse.

    Соответственно, многие в обиходной речи называют одно билдером, а другое - Эклипсом. Это неверно. Верным было бы называть Flex Builder’ом плагин, а упакованную версию - standalone Flex Builder,

    Так или иначе, но и в качестве плагина он слабенький. Не поддерживает обновления через Update Manager и не поставляется в виде zip-аржива (в виде локального update-сайта) без упакованного внутрь SDK и плеера (чтобы не качать несколько раз одно и то же).

    Не говоря уже о низком качестве IDE и потреблении ресурсов при компиляции… Так что такой продукт, в принципе, можно называть как угодно :)

    Особенно весело когда Flex Builder 3 Beta 3 на свежем AIR-проекте, состоящем из одного пока mxml-файла выдает:

    Code:

    java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Unknown Source) 
    at java.io.ByteArrayOutputStream.write(Unknown Source) 
    at flash.swf.RandomAccessBuffer.write(RandomAccessBuffer.java:59) 
    at flash.swf.RandomAccessBuffer.write(RandomAccessBuffer.java:40) 
    at flash.swf.TagEncoder.doABC(TagEncoder.java:2175) 
    at flash.swf.tags.DoABC.visit(DoABC.java:28) 
    at flash.swf.MovieEncoder.export(MovieEncoder.java:146) 
    at flex2.compiler.API.encode(API.java:4059) 
    at flex2.tools.oem.Application.encode(Application.java:1199) 
    at flex2.tools.oem.Application.link(Application.java:1158) 
    at com.adobe.flexbuilder.multisdk.compiler.internal.ASApplicationBuilder$MyBuilder.mybuild(ASApplicationBuilder.java:283) 
    at com.adobe.flexbuilder.multisdk.compiler.internal.ASApplicationBuilder.build(ASApplicationBuilder.java:122) 
    at com.adobe.flexbuilder.multisdk.compiler.internal.ASBuilder.build(ASBuilder.java:139) 
    at com.adobe.flexbuilder.multisdk.compiler.internal.ASItemBuilder.build(ASItemBuilder.java:73) 
    at com.adobe.flexbuilder.project.compiler.internal.FlexProjectBuilder.buildItem(Unknown Source) 
    at com.adobe.flexbuilder.project.compiler.internal.FlexProjectBuilder.build(Unknown Source) 
    at com.adobe.flexbuilder.project.compiler.internal.FlexIncrementalBuilder.build(Unknown Source) 
    at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:624) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:166) 
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:197) 
    at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:246) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:249) 
    at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:302) 
    at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:334) 
    at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:137) 
    at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:235) 
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) 

    При том, что памяти я как только ему не выделял :(

    Люди говорят, что в standalone-билдере все в порядке. Но не держать же мне несколько конфигураций, открывая попеременно!?

    И это при пресловутой оптимизации. При том, что по умолчанию компилится только debug-версия (чтобы якобы уменьшить время компиляции). Прекрасная работа, Adobe! Ждем зажигательных рассказов о всех великих преимуществах нового билдера в течение European Flex 3 pre-release tour.

    И, кстати, мои субъективные наблюдения говорят о том, что по части работы с памятью и ресурсами с каждой новой бетой все становится только хуже.

    Будем надеяться на лучшее.


    18:18:00, Flex 2 & Co
    Tree vertical-scroll баг
    Столкнулся с такой проблемой.
    При открытии нода дерева с сервера приходят данные об его дочерних элементах, изменяется этот узел датапровайдера, дети отображаются. Все вроде бы ничего, но если по высоте элементы не влезают в дерево, вертикальный скроллинг появляется только после повторного открытия нода (когда он уже знает о своих детях).
    Решение - использовать кастомный dataDescriptor. Нашел в блоге Joan Lafferty здесь.

    Бажное приложение:
    treeScrollAuto.mxml
    treeScrollAuto.swf
    Решение:
    treeScrollAutoFixed.mxml
    myDescriptor.as
    treeScrollAutoFixed.swf

    2007-12-16

    23:03:00, Flash-разработка
    Первое собрание Russian Adobe Flash Platform User Group. Взгляд зрителя
    Сегодня удалось поприсутствовать на первом собрании Russian Adobe Flash Platform User Group.
    Честно говоря, это первое мероприятие, посвященное флэш-технологиям, на котором я присутствовал когда-либо.
    Впечатления противоречивы, но, думаю, отрицательные эмоции - лишь результат депрессивного состояния от накопившихся неблагоприятных обстоятельств, преследующих меня последнее время.

    Я чуть опоздал на первый доклад ("Flex + Flash = ") и пропустил имя докладчика - представителя Adobe (* Артемий Малков *). Давались основы Flex-разработки на Flex Builder 2. Очень ценный доклад лично для меня - я еще не имею практики работы с визуальным редактором Flex и MXML. Легкая и наглядная подача: на примерах, которые кодились прямо на глазах у слушателей. Доклад рассчитан на широкую аудиторию, в основном, для начинающих.

    Второй доклад ("Работа с событиями в ActionScript 3 и Flex") для тех, кто уже попробовал себя в разработке Flex-приложений на AS3. Костя Constantiner снизошел к нам из Питера и довольно доходчиво, но всё же несколько сжато рассказал про события в AS3 и Flex и их особенности.

    Обещали обнародовать все материалы докладов, и я с нетерпением жду, чтобы их покопать поподробнее.

    На второй части конференции обсуждались насущные проблемы компании Adobe, а именно - что Adobe нужно сделать, чтобы привлечь как можно больше разработчиков и пользователей к Flash-платформе ... и при этом как можно меньше потратиться... (по настроению ведущего представителя Adobe сложилось такое впечатление).

    Как-то получилось, что участники разделились на две категории:
    • те кто сидел ближе к центру и активно выражал свои мысли в микрофон - бесспорно компетентные и уважаемые товарищи,
    • и просто зрители, которые слушали, смеялись, но мнения свои выразили лишь в анкетах.
    И это нормально. Предполагаю, что народ расшевелился на неофициальной части за кружкой пива. Я, увы, не смог в этом поучаствовать, но надеюсь эта встреча не последняя - уже запланирована следующая на 14 января.

    Приятно было увидеть в живую тех, кто до сего момента существовал лишь как абстрактный образ в моем воображении. Забавно также, что на фото в блогах и форумах все выглядят симпатичнее чем в жизни...

    * * *

    Фото и видео со встречи:
    Блог flashimp,
    Результаты первой встречи User Group

    2007-12-13

    06:52:01, Constantiner's blog
    Vivat, Adobe!

    Adobe CS3 LogoAdobe нас порадовали тремя свежими релизами, один из которых - это самый значительный релиз от Adobe за последний год (не считая AIR :). На момент написания данного поста заглавная страница Adobe Labs еще не обновилась, но пусть вас это не смущает. Переходите по ссылкам прямо на страницы продуктов.

    Итак:

    • Adobe Flex 3 Beta 3 (M4) и Adobe FlexBuilder 3 Beta 3 (M4). Качаем.

    • Adobe AIR Beta 3. Качаем Runtime и SDK.

    • BlazeDS. И это и есть наш суперрелиз. Что это такое? Это заопенсорсенный формат AMF и опенсорсный сервер BlazeDS (пока бета), который реализует эту спецификацию.

      То есть, говоря проще, Adobe делает опенсорсной реализацию AMF (лицензия LGPL V3). RTMP пока не опенсорсится, но опенсорсится messaging на базе AMF, а также специальный канал DHTTPStreaming, позволяющий не закрывать HTTP-соединение для обеспечения пушинга, с помощью которого и реализуется messaging.

      Мало того, выпускается усеченная версия LCDS (собственно BlazeDS), которая поддерживает все перечисленные возможности. Этот сервер поддерживает RPC-сервисы, JMS-адаптер, Proxy-сервис. Не поддерживается, естественно, генерация PDF, серверный MXML-компилятор, Data management и ряд адаптеров (типа ColdFusion, Hibernate итд.).

      И это и есть революция. Вы мне не верите?

      Подробности можно почитать у Якова Файна.


    2007-11-30

    13:30:09, Junik
    Показ версии flex-приложения

    Часто встречается такая задача - показ информации о версии приложения в GUI. Например, пользователь нажимает кнопку About и получает информацию о том, какой версией программы пользуется.

    Пожалуй самое неудачное решение - это подгрузка информации о версии во время выполнения программы (например из конфигурационного xml). В этом случае вы никогда не можете быть уверены в том, с какой версией собственно имеете дело.

    Вывод: информация о версии должна быть зашита в приложение на этапе компиляции и быть доступна в коде.

    Способы решения:

    • захардкодить информацию о версии в коде
    • Это самый простой способ, который некоторые используют. Например, можно задействовать с этой целью несколько констант. Однако способ может быть продуктивным только, если вы полностью уверены, что в один прекрасный момент не забудете обновить значение версии. И это абсолютно не продуктивно, если у вас есть разные версии приложения, основанные на одной и той же версии кода.
    • сделать include .as-файла с необходимыми данными
    • Этот способ тоже требует ответственности от вас, так как файл тоже будет необходимо обновлять. Но этот способ достаточно удобен, если генерить as-файл автоматически при сборке. Похожий способ описан в посте Adding Build, Build Date, Revision and Revision Date in your Flex App.
    • при сборке автоматически обновлять какой-то класс с информацией о версии
    • Это просто немного другой идеологически способ, основанный на предыдущем. У вас есть какой-то класс со статическими константами, который вы автоматически корректируете при сборке. В этом случае приятно, что нет include-ов.
    • использовать resource bundle (идею этого способа сгенерил Constantiner)
    • Этот способ уже меньше похож на шаманство и больше на адекватный. Понятное дело, что автоматическая генерация properties файла принесет натоящее счастье.
    • использование условной компиляции во Flex 3
    • Этот способ безусловно самый изящный. Более подробно можно почитать об условной компиляции в посте Условная компиляция в Flex 3 beta 2 ‘Moxie’. На английском можно почитать пост Conditional compilation in Moxie.

    Приведу пример использования resource bundle.
    Вы определяете (а при реальной сборке генерите автоматически), например файл Version.properties в виде:
    version_number = 3.2.15
    release_type = alpha

    В коде используем обычный ResourceBundle API.
    Вот пример для mxml.

    Code:

    <mx:TitleWindow x="172" y="121" width="250" height="200" layout="absolute"> 
      <mx:Text x="24" y="26" text="@Resource(key='version_number', bundle='Version')" />     
    </mx:TitleWindow> 

    Если вы знаете еще какие-то решения, то будет очень интересно их обсудить. :)

    PS: Существует библиотека, которая частично помогает решить проблему. Эта библиотека описана в посте Release version API.


    2007-11-27

    08:00:10, Agahov's blog
    Flex + Maven часть1

    /maven_flex

    Для сборки flex c помощью maven необходимо произвести следующие действия:
    - установить MAVEN
    - установить flex sdk
    - создать файл проекта pom.xml
    - настроить среду
    - создать структуру проекта и Main.xml
    - запустить maven

    Создание файла проекта pom.xml
    плагин для сборки swf/swc http://www.israfil.net
    пример pom.xml для flex

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    5.                       <a href="http://maven.apache.org/xsd/maven-4.0.0.xsd"">http://maven.apache.org/xsd/maven-4.0.0.xsd&#8221;</a>>
    6.  
    7.     <name>test-flex-swf</name>
    8.     <groupid>test</groupid>
    9.     <artifactid>test-flex-swf</artifactid>
    10.     <version>1.0</version>
    11.     <modelversion>4.0.0</modelversion>
    12.     <description>test build flex with maven.
    13.                 see: http://riapriority.com/blogs/agahov.php</description>
    14.  
    15.     <packaging>swf</packaging>
    16.  
    17.         <properties>
    18.                 <flex .home>C:/FLEX_HOME/sdk/2.0.1</flex>
    19.       </properties>
    20.     <build>
    21.         <plugins>
    22.             <plugin>
    23.                 <groupid>net.israfil.mojo</groupid>
    24.                 <artifactid>maven-flex2-plugin</artifactid>
    25.                 <extensions>true</extensions>
    26.                 <configuration>
    27.                                 <flexhome>${flex.home}</flexhome>
    28.                     <mainmxmlfile>Main.mxml</mainmxmlfile>
    29.                 </configuration>
    30.             </plugin>
    31.         </plugins>
    32.     </build>
    33. </project>

    Настройка среды
    - flex.home в pom.xml должна ссылаться на flex sdk, которую вы хоти использовать для сборки

    не забудте в файле $flex.home/frameworks/flex-config.xml нужно отредактировать следующую строку:
    winFonts.ser - для windows
    macFonts.ser - для MAC

    1. <flex -config>
    2.         <compiler>
    3.                 <fonts>
    4.                         <local -fonts-snapshot>xxxFonts.ser</local>
    5.                 </fonts>
    6.         </compiler>
    7. </flex>

    структура проекта
    project-name/pom.xml
    project-name/src
    project-name/src/main/
    project-name/src/main/flex
    project-name/src/test
    project-name/src/main/flex/Main.xml

    Main.xml может быть таким:

    Code:

    <?xml version="1.0" encoding="utf-8"?> 
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
      <![CDATA[ 
        import mx.controls.Alert; 
         
        private function start():void 
        { 
          Alert.show("hi maven!"); 
        } 
      ]]> 
    </mx:Script> 
     
      <mx:Button click="start()"/> 
    </mx:Application> 

    Сборка проекта с помощю mvn
    для сборки проекта зайдите в папку [project-name] и выполните команду: mvn pakage

    исходники


    2007-11-13

    10:53:19, Constantiner's blog
    «ActionScript 3.0. Сборник рецептов» на русском!

    ActionScript 3.0. Сборник рецептовРадостное известие. В конце ноября в издательстве «Символ Плюс», которое лично мне очень нравится качеством своих изданий и качеством переводов, выходит «ActionScript 3.0. Сборник рецептов» на русском языке. К сожалению, эта книга будет не совсем полезна для Flex-разработчиков, ибо про mxml там не будет ни слова. Но так или иначе, можно много узнать про ActionScript 3 и API Flash-плеера, что тоже полезно. Желающие могут ознакомиться с содержанием.

    А уже сейчас книгу можно заказать со скидкой.

    Также напомню, что это перевод вышедшей год назад в издательстве O’Reilly книги известных личностей Joey Lott, Darron Schall и Keith Peters «ActionScript 3.0 Cookbook».


    2007-11-07

    13:05:26, Flash-ripper.com
    Communigate Systems ищет программиста в Москве

    Российское представительство компании CommuniGate Systems ищет классных программистов для работы над интересными проектами, существующими и новыми.

    Требования к кандидатам:

    • Отличное знание AS3 и MXML.
    • Умение свободно общаться на письменном английском.
    • Понимание принципов ООП.
    • Готовность держать руку на пульсе современных технологий.
    Большим плюсом будет опыт работы с Cairngorm.

    О нас: офис в Москве, отличная зарплата (в рынке и выше), свободный график и небольшая дружная команда.

    Присылайте резюме с рассказом о себе на hrundik [жэвотное] stalker.com.


    2007-11-02

    17:04:26, Flash-ripper.com
    Как устроены Модель, Вид и Управление во фреймворке PureMVC

    Друзья, данная часть цикла статей о флэш-фреймфорвке PureMVC должна называться "Как обмениваются Оповещениями участники PureMVC". Но комментарии к предыдущей части, "Фасад — ядро и лицо фреймворка PureMVC" навели на мысль, что стоит подробнее выяснить назначение и концептуальное устройство PureMVC, прежде чем переходить к более конкретной теме. Поэтому сначала еще немного о цели PureMVC, а также о крупных частях его тела: о Модели, Представлении, Контроллере и Фасаде.

    Цель флэш-фреймоворка PureMVC очень узка: разделить работу над проектом на три части. Это — 1) работа с данными, 2) работа с интерфейсом и 3) общее управление приложением. В PureMVC c данными работает Модель, с визуальным интерфейсом работает Представление, а управление производится через Контроллер. Такое разделение позволяет создавать расширяемые приложения, которые легче поддаются отладке, модификации и поддержке.

    В PureMVC Модель, Представление и Контроллер реализуются как три одноименных класса-синглтона: Model, View, Controller. В то же время, PureMVC организован так, что разработчик может использовать данные классы прозрачно, с помощью Фасада, тоже Синглтона. Этот класс знает каждого из трех главных участников системы. Такой Фасад можно назвать Центральным Фасадом приложения.

    Теперь коротко о каждом из трех главных игроков-синглтонов Pure MVC (Синглтон — это класс, гарантирующий существование только одного своего экземпляра, поэтому его также называют Одиночкой).

    Модель и ее Посредники (Model & Proxies)


    Синглетон Модели в PureMVC — это просто кэш ссылок на Посредников (Proxy). Посредники работают с моделью данных приложения: они и только они, как мы знаем из первой части "Архитектура PureMVC", работают с источниками информации. Получается так: Модель, являясь Одиночкой (Singleton), дает приложению широкий выбор своих возможностей работы с данными через Посредников.

    Представление и Медиаторы (View & Mediators)


    Синглтон Представления (View) является кэшем ссылок на Медиаторы (подобно тому, как Модель кэширует Посредников). Именно Медиаторы работают с внешним видом приложения: они и только они работают с визуализацией и обмениваются событиями с интерфейсом (например, с MXML-компонентами).

    Так в PureMVC Модель отделяется от Представления.

    Контроллер и Команды (Controller & Commands)


    Контроллер хранит ссылки на классы Команд, экземляры которых создаются на лету — по необходимости. Команды могут работать с Посредниками и Медиаторами, выполняя роль координаторов их взаимодействия, особенно когда речь идет о создании цепочек действий.

    Синглетоны Модели, Представлениея и Контроллера в PureMVC, по сути, не делают ничего, кроме выдачи ссылок на своих представителей. Именно поэтому подавляюще бОльшая часть кода при реализации PureMVC-приложения пишется именно внутри этих представителей: Посредников (представляют модель данных), Медиаторов (представляют вид приложения) и Команд (дают управление).

    И снова о Фасаде в PureMVC


    Фасад в PureMVC отдувается за безделие главных игроков и занимается тем, что инициализирует их и дает доступ ко всем их методам (которых не много).

    Разработчик PureMVC-приложения получает всю необходимую функциональность, просто расширяя Фасад PureMVC своим классом, таким образом получая Конкретный Фасад приложения. И уже через этот Конкретный Фасад происходит работа с Конкретными Посредниками, Медиаторами и Командами — то есть с данными приложения и его видом, а также общее управление им.

    Почитайте о Фасаде в PureMVC еще раз. Если стало понятнее, то эта запись не прошла зря.


    2007-10-25

    09:00:18, RIA crumbs
    Немного знаний с Flex Boot Camp.

    Ely Greenfield автор блога Quietly Scheming, опубликовал несколько примеров со своей презентации на MAX Barcelona для Flex Boot Camp.

    Сделаю краткий перевод, советую почитать более полный текст у автора:

    Пример 1: Создаем свой компонент

    Пример об основах создания своих виджетов: класса, графика, под компоненты, события, размеры, отрисовка и т.п.

    Пример 2: Что есть потомок MXML компонента

    Пример о том как определить потомков для своего MXML компонента.

    Пример 3: Мета программирование на AS и кастомными мета данными.

    Автор пишет, что это его любимая демка. В ней он показывает как можно использовать мета данные для:

    создание одно или двух стороннего биндинга между виджетами;
    назначать вызов функция после того как что-то поменялось в выражениях:
    декларативное назначение обработчика событий для вашего виджета


    2007-10-23

    12:35:01, RIA crumbs
    Подсветка кода для VIM.

    Полезняшка, для тех кто пишет свой код используя VIM, хотя может они уже про это и в курсе.

    Abdul Qabiz’s решил поделится своими наработками на поприще подсветки синтаксиса в VIM, для ActionScript и MXML. Которые он сделал, и как я понял из его поста будет еще усовершенствовать, на основе файлов подсветки для AS 2 от Richard Leider.

    Файлы с настройками подсветки:

    О том как все это дело заставить работать читать тут.


    2007-10-19

    15:45:15, Flash-ripper.com
    PV3D по-русски: перевод Papervision3D-wiki и Flex в IDEA7

    Алексей 'Yelbota' Фомкин перевел на русский язык вики к Papervision3D и выложил как PDF: FAQ для начинающих в Papervision3D.

    А ruFlex обсуждает вышедшую на днях IDEA7 с еще сырой, но уже поддержкой AS3 и MXML.


    2007-10-16

    12:13:28, LIFE.Flash
    Вакансия. Нужен AS-программер в компанию BDirect

    По просьбе Александра Козловского:

    В компанию BDirect требуется ActionScript 3 программер с опытом работы с as3 от года.

    Обязательно знание движка “Papervision 3d”,
    Отличное знание ActionScript 2.0,
    Отсутствие непреодолимого панического страха при виде двух килограммов не типизированного и не комментированного as2 кода в десятом кадре мува с именем “$r15_7_999″.

    Желателен опыт разработки онлайн - игр,
    Знание клиент - серверных отношений.

    Огромным плюсом будет знание mxml, умение писать свои mxml-компоненты, умение скинить Flex-проекты и ActionScript-проекты.

    Обратная связь

    Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

    2007-10-15

    22:15:43, 33 коровы
    AIR. Сюрпризы от File.browseForOpen

    Поставил флекс билдер 3 и решил пощупать AIR за самые интересные места, а именно за работу с файловой системой

    Взял самый простой пример их хелпа по File метод browseForOpen

    воткнул его в приложение

    <?xml version=“1.0″ encoding=“utf-8″?>
    <mx:WindowedApplication xmlns:mx=“http://www.adobe.com/2006/mxml” layout=“horizontal” title=“Hello World”>
            <mx:Script>
                    <![CDATA[
                            import mx.events.IndexChangedEvent;
                            import flash.filesystem.*;
                            import flash.events.Event;
                            import flash.net.FileFilter;
                           
                           
                           
                            public function fileOpen() : void
                            {
                                     var fileToOpen:File= File.desktopDirectory;
                                    var txtFilter:FileFilter = new FileFilter(“Text *.as;*.css;*.html;*.txt;*.xml”, “*.as;*.css;*.html;*.txt;*.xml”);
                                    try
                                    {
                        fileToOpen.addEventListener(Event.SELECT, fileSelected);
                        fileToOpen.browseForOpen(“Open”, [txtFilter]);
                                    }
                                    catch (error:Error)
                                    {
                            trace(“Failed:”, error.message)
                                    }
                            }
                           
                            public function fileSelected(event:Event) : void
                            {
                    var stream : FileStream = new FileStream();
                    stream.open(File(event.target), FileMode.READ);
                    var fileData:String = stream.readUTFBytes(stream.bytesAvailable);
                    fileList.text = fileData;
                            }
                    ]]>
            </mx:Script>
        <mx:Button id=“browse” label=“Browse…” click=“fileOpen()” />
        <mx:TextArea id=“fileList” width=“400″ height=“400″ />
    </mx:WindowedApplication>

    и получил огромный болт - при нажатии на кнопку “Browse…” появляется окошко, в нем выбираешь файл но никакого события не происходит ни cancel ни select вообще ничего не происходит.

    3 раза перечитал хелп, погуглил, нашел интересный блог от Benjamin Dobler - RichApps и там нашел описание мероприятия от адоба и его результатов (там есть весомый архив с различными примерами AIR приложений, в том числе и работы с файловой системой). Блог нужно читать всем внимательно 3 раза ибо интересно.

    Так вот его пример работал, а мой нет разница был в том что моя переменная File был объявлена локально в функции и видимо на крысу по быстрому собралась мусорщиком %).

    Правильный ответ в моей проблеме это объявить переменную как свойства класса и становиться замечательно!

    <?xml version=“1.0″ encoding=“utf-8″?>
    <mx:WindowedApplication xmlns:mx=“http://www.adobe.com/2006/mxml” layout=“horizontal” title=“Hello World”>
            <mx:Script>
                    <![CDATA[
                            import mx.events.IndexChangedEvent;
                            import flash.filesystem.*;
                            import flash.events.Event;
                            import flash.net.FileFilter;
                           
                            private var fileToOpen:File;
                           
                            public function fileOpen() : void
                            {
                                    fileToOpen = File.desktopDirectory;
                                    var txtFilter:FileFilter = new FileFilter(“Text *.as;*.css;*.html;*.txt;*.xml”, “*.as;*.css;*.html;*.txt;*.xml”);
                                    try
                                    {
                        fileToOpen.addEventListener(Event.SELECT, fileSelected);
                        fileToOpen.browseForOpen(“Open”, [txtFilter]);
                                    }
                                    catch (error:Error)
                                    {
                            trace(“Failed:”, error.message)
                                    }
                            }
                           
                            public function fileSelected(event:Event) : void
                            {
                    var stream : FileStream = new FileStream();
                    stream.open(File(event.target), FileMode.READ);
                    var fileData:String = stream.readUTFBytes(stream.bytesAvailable);
                    fileList.text = fileData;
                            }
                    ]]>
            </mx:Script>
        <mx:Button id=“browse” label=“Browse…” click=“fileOpen()” />
        <mx:TextArea id=“fileList” width=“400″ height=“400″ />
    </mx:WindowedApplication>

    22:15:43, 33 коровы
    AIR. Сюрпризы от File.browseForOpen

    Поставил флекс билдер 3 и решил пощупать AIR за самые интересные места, а именно за работу с файловой системой

    Взял самый простой пример их хелпа по File метод browseForOpen

    воткнул его в приложение

    <?xml version=“1.0″ encoding=“utf-8″?>
    <mx:WindowedApplication xmlns:mx=“http://www.adobe.com/2006/mxml” layout=“horizontal” title=“Hello World”>
            <mx:Script>
                    <![CDATA[
                            import mx.events.IndexChangedEvent;
                            import flash.filesystem.*;
                            import flash.events.Event;
                            import flash.net.FileFilter;
                           
                           
                           
                            public function fileOpen() : void
                            {
                                     var fileToOpen:File= File.desktopDirectory;
                                    var txtFilter:FileFilter = new FileFilter(“Text *.as;*.css;*.html;*.txt;*.xml”, “*.as;*.css;*.html;*.txt;*.xml”);
                                    try
                                    {
                        fileToOpen.addEventListener(Event.SELECT, fileSelected);
                        fileToOpen.browseForOpen(“Open”, [txtFilter]);
                                    }
                                    catch (error:Error)
                                    {
                            trace(“Failed:”, error.message)
                                    }
                            }
                           
                            public function fileSelected(event:Event) : void
                            {
                    var stream : FileStream = new FileStream();
                    stream.open(File(event.target), FileMode.READ);
                    var fileData:String = stream.readUTFBytes(stream.bytesAvailable);
                    fileList.text = fileData;
                            }
                    ]]>
            </mx:Script>
        <mx:Button id=“browse” label=“Browse…” click=“fileOpen()” />
        <mx:TextArea id=“fileList” width=“400″ height=“400″ />
    </mx:WindowedApplication>

    и получил огромный болт - при нажатии на кнопку “Browse…” появляется окошко, в нем выбираешь файл но никакого события не происходит ни cancel ни select вообще ничего не происходит.

    3 раза перечитал хелп, погуглил, нашел интересный блог от Benjamin Dobler - RichApps и там нашел описание мероприятия от адоба и его результатов (там есть весомый архив с различными примерами AIR приложений, в том числе и работы с файловой системой). Блог нужно читать всем внимательно 3 раза ибо интересно.

    Так вот его пример работал, а мой нет разница был в том что моя переменная File был объявлена локально в функции и видимо на крысу по быстрому собралась мусорщиком %).

    Правильный ответ в моей проблеме это объявить переменную как свойства класса и становиться замечательно!

    <?xml version=“1.0″ encoding=“utf-8″?>
    <mx:WindowedApplication xmlns:mx=“http://www.adobe.com/2006/mxml” layout=“horizontal” title=“Hello World”>
            <mx:Script>
                    <![CDATA[
                            import mx.events.IndexChangedEvent;
                            import flash.filesystem.*;
                            import flash.events.Event;
                            import flash.net.FileFilter;
                           
                            private var fileToOpen:File;
                           
                            public function fileOpen() : void
                            {
                                    fileToOpen = File.desktopDirectory;
                                    var txtFilter:FileFilter = new FileFilter(“Text *.as;*.css;*.html;*.txt;*.xml”, “*.as;*.css;*.html;*.txt;*.xml”);
                                    try
                                    {
                        fileToOpen.addEventListener(Event.SELECT, fileSelected);
                        fileToOpen.browseForOpen(“Open”, [txtFilter]);
                                    }
                                    catch (error:Error)
                                    {
                            trace(“Failed:”, error.message)
                                    }
                            }
                           
                            public function fileSelected(event:Event) : void
                            {
                    var stream : FileStream = new FileStream();
                    stream.open(File(event.target), FileMode.READ);
                    var fileData:String = stream.readUTFBytes(stream.bytesAvailable);
                    fileList.text = fileData;
                            }
                    ]]>
            </mx:Script>
        <mx:Button id=“browse” label=“Browse…” click=“fileOpen()” />
        <mx:TextArea id=“fileList” width=“400″ height=“400″ />
    </mx:WindowedApplication>

    14:13:33, LIFE.Flash
    FDT 3.0 Релиз

    Как ни странно, но сегодня официальный релиз FDT 3. Релиз появился с немецкой точностью (как и было обещано). Пока впечатлениями поделится не могу, так как еще не скачал, но как только, так сразу.

    Ну чтож, если FDT 3 работает с ActionScript 3, также как и предыдущие версии с ActionScript 2, то нас можно только поздравить.

    UPD: Цитирую Nox Noctis:

    Новая версия ФДТ поддерживает AS2.0 и AS3.0, и доступна в трех видах:
    + FDT 3.0 Basic (299 eur)
    + FDT 3.0 Professional (399 eur)
    + FDT 3.0 Enterprise (599 eur)
    (апгрейд с FDT 1.5 — дешевле)

    Для разработчиков опенсорсных проектов по-прежнему представляются бесплатные ключи.

    Описание фич по ссылке: http://fdt.powerflasher.com/index.php?page=download

    Корпоративная версия отличается от остальных тем, что
    + будет доступен продвинутый дебаггер
    + будет доступен продвинутый рефакторинг
    (который в остальных вариантах комплектации присутствует только
    на уровне переименования классов и пакетов)
    + будет доступен MXML парсер
    + будет предоставлен саппорт для разработчиков

    На сегодняшний день эти фичи еще не реализованы, находятся в разработке.

    UPD++ Для тех, кто хочет получить ключи к FDT бесплатно. Цитата из RuFlash

    >> Если мне не изменяет память, Иван( Iv ) пробивал бесплатный FDT по проекту bezier.ru.Был ли получен ожидаемый результат?
    > - нет, видимо они опенсорсными проектами считают только те, что живут на указанных ими доменах.

    Нет, с доменами это не связано. Есть ряд правил, по которым они проверяют, что проект подходит.

    Цитирую:

    Для всех запросов мы проверяем:
    - Насколько проект связан с флэш сообществом
    - Действительно ли это опенсорсный проект?
    Как распространяются исходники?
    - В случае проектов osflash.org - как мы может идентифицировать юзера?
    - Указан ли почтовый адрес разработчика на сайте проекта.
    - Не является ли проект подставой для получения халявного ключа ;)

    Если вы отправляете запрос на получение опенсорсного ключа, пожалуйста, постарайтесь облегчить нам эту проверку насколько возможно (прямые ссылки очень помогают).

    Пожалуйста, отправляйте запросы только на fdt@powerflasher.com с внятным сабжем - “Open Source Project FDT Licence Key”. Пожалуйста, не присылайте реквесты на другие адреса.

    Пожалуйста, учитывайте, что на обработку запроса уходит порядка недели. Оригинал: http://www.powerflasher.com/fdt/forum/viewtopic.php?t=139

    Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

    12:27:14, 33 коровы
    День ништяков. FDT 3.0 - свершилось. Saffron UML Tool - где ты родимая!

    Вышел релиз FDT 3.0 читать тут. Поделили продукт на 3 части, для маленьких, для средненньких и обещают для взрослых(с поддержкой mxml). Но что-то с ценами они намутили - для взрослыж 600-1 евро немного кусается, хотя если все что они заявили будте работать отлично я пожалуй скажу: “гудбай билдер”.

    Я недавно щупал бетту FDT 3.0 была очень сырая и глючная, причем эти глюки лезли просто толпами, успели ли они поправить все это? вот вчем вопрос. Нужно побыстрее пощупать релиз может там все оки.

    Вчера Рост писал о том что сегодня будет еще один ништяк под именем Saffron UML Tool. Я просто мечтаю запустить свои руки в это приложение, очень интересует - это всего лишь одна из красивых утилиток или же очень удобный инструмент.

    А вообще нас жестоко … с редакторами, плюшки которые в остальных средах считаются необходимым минимумом для существования программера, нам выдют по одной и говорят, что мол мы придумали именно ту фичу которую вы хотели, посмотрите какие мы крутые.
    Я долго думал каким же должен быть идеальный редактор, многое придумал ). Никто не хочет купить идею идеально редактора ? дорого отдам!


    12:27:14, 33 коровы
    День ништяков. FDT 3.0 - свершилось. Saffron UML Tool - где ты родимая!

    Вышел релиз FDT 3.0 читать тут. Поделили продукт на 3 части, для маленьких, для средненньких и обещают для взрослых(с поддержкой mxml). Но что-то с ценами они намутили - для взрослыж 600-1 евро немного кусается, хотя если все что они заявили будте работать отлично я пожалуй скажу: “гудбай билдер”.

    Я недавно щупал бетту FDT 3.0 была очень сырая и глючная, причем эти глюки лезли просто толпами, успели ли они поправить все это? вот вчем вопрос. Нужно побыстрее пощупать релиз может там все оки.

    Вчера Рост писал о том что сегодня будет еще один ништяк под именем Saffron UML Tool. Я просто мечтаю запустить свои руки в это приложение, очень интересует - это всего лишь одна из красивых утилиток или же очень удобный инструмент.

    А вообще нас жестоко … с редакторами, плюшки которые в остальных средах считаются необходимым минимумом для существования программера, нам выдют по одной и говорят, что мол мы придумали именно ту фичу которую вы хотели, посмотрите какие мы крутые.
    Я долго думал каким же должен быть идеальный редактор, многое придумал ). Никто не хочет купить идею идеально редактора ? дорого отдам!


    2007-10-12

    14:48:47, RIA crumbs
    Делаем процесс “скинования” проще. [Часть 2]

    Продолжаю обзор Flex Skin Design Extension, на этот раз буду повествовать об extension под Adobe Photosop CS3. Часть первая, об extension в целом и его версии под Adobe Flash CS3, находится тут.

    Flex Skin Design Extension под Photoshop представляет собой набор PSD шаблонов и два скрипта (экспорт скина и мастер создания скина).

    Установка крайне простая, копируем содержимое архива в папку “\Program Files\Adobe\Adobe Photoshop CS3\Presets“. Теперь можно запускать Photoshop и начинать зверский акт вандализма над стандартными скинами :)

    Запускаем Photoshop и запускаем мастер создания скина (File -> Scripts -> New Flex Skin…). Первое отличие, от extension под Flash, это наличие выбора создания скина для нескольких компонент или для одного выбранного компонента. При выборе опции создание скина для единичного компонента, активируется возможность выбрать диапазон применимости скина (для всех виджетов этого типа в приложении или только для тех у кого заданный styleName ;) ).

    PS - New Flex Skin

    Рассмотрим создание скина для кнопки у которой styleName=”customButton”. После выбора нужных значений и ввода styleName в мастере создание скина, жмем ок и получаем новый документ с импортированными в него заготовками для состояний кнопок (название все дано в виде Button_customButton_overSkin и т.д., по состояниям виджета), а также хитрая папка с декором фоновым и пояснениями к шаблону (ее нужно скрывать перед экспортом скина, она так и называется - “_HIDE BEFORE EXPORTING”, но об этом потом).

    PS - New Flex Skin Edit

    После того как вдоволь поиздевавшись над скином, прячем папку с названием _HIDE BEFORE EXPORTING, и запускаем скрипт экспорта (File -> Scripts -> Export Flex Skins…). Скрипт попросит вас указать куда будем создавать скины, и после нажатия OK начинает танцы с бубнами, т.е. сохранять скин. (Фотошоп желательно оставить в покое так как, скрипт устраивает всяческие махинации с создаванием документов и т.д.)

    После того как скрипт закончит злодеяния, заходим в выбранный каталог для экспорта, и смотрим что создалось. А создалось, вопреки ожиданиям на чудо css или что-то в этом духе, папка assets с четырьмя PNG-24 файлами. Теперь настал час “Ч”, импортировать весь этот artwork в Flex приложение.

    Запускаем импорт нашего скина (File -> Import -> Skin Artwork…). Выбираем нашу папку со скином, в качестве значения для поля Folder or Bitmaps, и проект внешний вид которого мы хотим изменить (также можно выбрать папку куда все будет свалено и название CSS файла, по умолчанию стоят названия assets). Next. Выведется список из доступных PNG, в котором можем выбрать что будет импортироваться а что нет. Дополнительно в списке указывается название состояния виджета на которое будет влиять PNG.

    FX - Widget states skin selection

    Finish. В папке проекта создается каталог assets в который скопировались картинки и в корне создался assets.css в котором прописан стиль для нашей кнопки, а также в main MXML файл подключили наш CSS.

    Fin.

    Впечатления, все хорошо, но:

    • В версии для Flash не хватает мультивыбора компонент и указания styleName для единичного компонента, и довольно грязный импорт во Flex, помимо скина там в списке еще масса всякого хлама, хорошо, что все что относится к скину выбрано по умолчанию, а остальное отключено;
    • В версии для Photoshop не очень удобно редактировать скины, особенно полупрозрачные градиентные заливки;
    • В версии для Photoshop один большой минус, это нельзя дизайнеру задать параметры для Scale-9 (это можно будет сделать только в коде, то есть подправить ручками CSS) и результат растровый;

    Вроде все перечислил. Если что забыл, пишите обновлю пост.


    2007-10-05

    14:32:29, Flash-ripper.com
    Silverlight, веб-технология от Microsoft: XAML = XAML = XAML
    Отчет о конференции Microsoft "Платформа Веб"—Киев, 82 сентября 7002 года. Вторая часть. (первая часть).

    От автора: я избегал как мог собственных выводов, сохраняя их для завершающей третьей части. Расскажу о конференции так, как она была. А она была крайне интересна.

    Самой захватывающей частью всей "Платформы ВЕБ" стала презентация от Юрия Артюха, посвященная продукту Microsoft Silverlight. Количество вопросов из зала это доказывает.

    Модели взаимодействия веб-дизайнера и программиста

    PSD + HTML против XAML + C#

    Юра хорошо показал превратности традиционного взаимодействия дизайнера и программиста, описать которое можно схемой PSD (дизайнер) <=> HTML (верстальщик, программист). Он объяснил, что в инструменте для создания Silver-приложений Expression Blend все будет по-новому: оба работают через единый язык разметки XAML, что может использоваться как для описания картинок, так и интерфейса приложения. Получаем схему XAML (дизайнер) <=> XAML (программист). Дизайнер создает и редактирует XAML посредством графических инструментов, и программист работает с этим же XAML посредством Javascript и C# (в будущем релизе SL 1.1). Таким образом и дизайнер, и программист работают с одним и тем же языком разметки, являющемся диалектом XML (в этом месте знающие MXML-язык Flex-разработчики понимающе улыбаются).

    Безусловно, это очень красивая концепция. Но Юра слукавил. Ведь, как ни крути, в традиционной модели речь идет о создании текстового контента, то есть веб-Сайта: как ни наворачивай дизайн, HTML остается самим собой. А в предлагаемой модели нового взаимодействия на выходе получается веб-Приложение со всеми нюансами: от проблем с индексацией поисковиками (с этим пока ничего не ясно) до всего о чем писал Якоб Нильсен в статье "Флэш—это зло". Сильверлайту предстоит пройти через все круги юзабилити-ада, через которые прошел флэш.

    И светлая мечта об устранении спора между веб-дизайнером, верстальщиком и программистом пока остается мечтой. Silverlight — средство создания приложений. Другой вопрос: грань между веб-сайтом и веб-приложением становится все тоньше. Стоп... свои соображения я отнесу в третью часть.

    Видео-проигрыватель за два клика

    Одна из самых эффектных частей Silverlight-презентации. Expression Media Encoder может не просто перегонять видео из одного формата в другой: он помогает разметить видео на главы (Chapters), для каждой из них сгенерировать превьюшки (Thumbnails). Но самое заманчивое—он может выдать готовый Silver-проект "видео-проигрыватель", который загрузит в себя видео, отобразит все элементы управления и покажет выплывающую сверху панель с картинками-превьюшками. Очень разумный ход: пользователь получает готовый для вставки в страницу/приложение видео-плейер за считаные минуты. Учитывая моду на видео, эта возможность может сделать Silverlight большую популярность.

    И очень важно, что этот видео-проект является стандартным Silverlight-проектом: его можно открыть во Expression Blend'е и отредактировать по своему усмотрению. Например, перекрасить UI-компоненты — это тоже было показано в презентации.

    Набор инструментов Expression

    1. Expression Web: для веб-дизайнеров. HTML + Javascript. Лучше, чем Dreamweaver, поддерживает веб-стандарты — со слов Юры, съевшего на веб-хаках и веб-стандартах не одну собаку.
    2. Expression Blend: для архитекторов интерфейса и аниматоров. Убийца Flash Thermo. Создает графическую часть Silverlight-приложений, описывая ее языком XAML.
    3. Expression Design: для графических дизайнеров. Векторно-растровый редактор, убийца Photoshop. Экспортирует в XAML, тем самым позволяя легко внедрять труд дизайнера в Silverlight-приложения. Было продемонстрировано на презентации, работает неплохо.
    4. Expression Media: для организации графики, видео...
    5. Expression Media Encoder: работа с видео-форматами. О нем я рассказал в предыдущем абзаце.

    Предлагаемый Microsoft цикл разработки веб-приложений

    1. Дизайн: рисуется в Expression Design и сохраняется в формате XAML.
    2. Интерфейс: дизайн в формате XAML редактируется в Expression Blend (там же может быть создан с нуля). Там создается интерфейс приложения и анимация. Результат сохраняется как проект, который может быть открыт в Visual Studio.
    3. Программирование: Silverlight-проект октрывается в Visual Studio и подвергается JavaScript-разработке — Silverlight 1.0 (или C# в SL 1.1 — еще не вышел).

    В Silverlight обещают также реализацию защиты контента, 3D и прочее — напишите, если я что-то забыл.

    Выводы

    В третьей части. Работать надо :-)


    2007-10-01

    13:02:35, Flash-ripper.com
    Adobe Flex 3 и AIR 1.0 Beta 2, поддержка Flex в IDEA и сколько стоит дизайн

    Качать Adobe AIR 1.0 Beta 2 и Flex 3 Beta 2. Читать описание миграции с AIR Beta 1 на AIR Beta 2. Основные изменения в API: ByteArray, Clipboard, Drag and Drop, Door, File API, HTML, NativeWindow, относительные URL, System. Подробно о релизе: Adobe AIR 1.0 Beta 2 Release Notes.

    Продолжается работа над поддержкой Flex 2 (ActionScript + MXML) в IDEA

    Прогресс хорошо виден в JetBrains JIRA: Flex 2 (ActionScript + MXML) support in IDEA. Финал не за горами, выполено более 70% работы (15 пунктов из 21).

    В следующем выпуске — рассказ об инициативах Microsoft под названием "Платформа Web". А пока почитайте, сколько стоит работа дизайнера по версии Design Week. В частности, флэш-дизайнер должен брать в среднем 27 фунтов стерлингов за час работы :)


    2007-09-03

    16:30:00, Flex 2 & Co
    Блог об интеграции Papervision3D и Flex
    На днях в рассылке был проанонсирован новый блог, целью которого автор ставит:
    - позволить флекс-программистам использовать MXML для построения сцен.
    - использовать стиль программирования флекс-эффектов для создания анимации.
    - добавлять 3d события для управления inline ActionScript кодом.
    - создать DisplayObject3D-обертку для внедрения 2D flex UI компонентов в 3D сцену.
    - обеспечить встроенные режимы 3d навигации?!
    Есть примерчик с кодом.
    В общем, начало интересное. Буду следить.

    16:30:00, Flex 2 & Co
    Блог об интеграции Papervision3D и Flex
    На днях в рассылке был проанонсирован новый блог, целью которого автор ставит:
    - позволить флекс-программистам использовать MXML для построения сцен.
    - использовать стиль программирования флекс-эффектов для создания анимации.
    - добавлять 3d события для управления inline ActionScript кодом.
    - создать DisplayObject3D-обертку для внедрения 2D flex UI компонентов в 3D сцену.
    - обеспечить встроенные режимы 3d навигации?!
    Есть примерчик с кодом.
    В общем, начало интересное. Буду следить.

    2007-06-27

    13:32:00, Flex 2 & Co
    List и дубликаты в датапровайдере
    Давно заметил следующую теперь уже наверно фичу:
    Сделаем маленький пример:

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
    <mx:Script>
    [Bindable]
    public var listData:Array = ["alpha", "beta", "beta", "gamma", "delta"];
    </mx:Script>
    <mx:List dataProvider="{listData}"/>
    </mx:Application>


    В данном случае, если навести мышь на второй элемент, который идентичен третьему, то отработает наведение последний. Я думал, что это баг. Отнюдь. Вычитал из Jira, что List не должен иметь одинаковых элементов - все элементы коллекции должны иметь уникальный id, например,

    public var listData:Array = [{label:"alpha", data: "01"}, {label:"beta", data: "04"}, {label:"beta", data: "90"}, {label: "gamma", data: "4"}, {label:"delta", data: "8"}];

    13:32:00, Flex 2 & Co
    List и дубликаты в датапровайдере
    Давно заметил следующую теперь уже наверно фичу:
    Сделаем маленький пример:

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
    <mx:Script>
    [Bindable]
    public var listData:Array = ["alpha", "beta", "beta", "gamma", "delta"];
    </mx:Script>
    <mx:List dataProvider="{listData}"/>
    </mx:Application>


    В данном случае, если навести мышь на второй элемент, который идентичен третьему, то отработает наведение последний. Я думал, что это баг. Отнюдь. Вычитал из Jira, что List не должен иметь одинаковых элементов - все элементы коллекции должны иметь уникальный id, например,

    public var listData:Array = [{label:"alpha", data: "01"}, {label:"beta", data: "04"}, {label:"beta", data: "90"}, {label: "gamma", data: "4"}, {label:"delta", data: "8"}];

    2007-06-17

    20:32:37, DL1t's blog
    Flex Future Features: Graphic Tags

    Кроме распланированных по стадиям релиза фич, есть вещи, время внедрения которых не определено. Пока их перечислено всего две: графические теги и импорт векторных изображений, на них же построенный. Идея такова: создание в MXML как простых, так и сложных фигур, применение к ним различных типов заливок, фильтров и т п.
    То что к этому идет, заметно, не зря же появилось Copy Motion As MXML во Flash.

    Радует, что уже существует прототип, но он, к сожалению еще “not ready for Labs”


    2007-06-05

    09:28:44, Graann's blog
    UITextField, как альтернатива Label

    При большом количестве меток (да и вообще компонент) и частой их отрисовке вы непременно столкнетесь с тормозами. В случае с метками есть альтернатива в лице mx.core.UITextField, которой и посвящен этот пост. Что нас привлекает в mx.controls.Label? Возможность отобразить некий текст и применить к нему стили. UITextField нам эти возможности предоставляет так же. Однако есть одна тонкость. Как работать со стилями если:

    public function setStyle(styleProp:String, value:*):void - Does nothing. A UITextField cannot have inline styles.

    Не очень понятно зачем вообще нужен этот метод если он ничего не делает. Была мысль, что он описан в каком-то из имплементящихся интерфейсов, но подтверждения этому в коде найти не удалось. Впрочем я отвлеклась. Ну так как же работать со стилями? Да в общем точно так же, только через свойство styleName.

    styleName:Object [read-write] - The class style used by this component. This can be a String, CSSStyleDeclaration or an IStyleClient.
    Т.е uiTextField.styleName.setStyle("color", 0xff0000); сработает, но только если к UITextField уже был применен какой-то стиль. Не поленилась написать небольшой пример:

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <mx :Application xmlns:mx="http://www.adobe.com/2006/mxml">
    3. <mx :Script>
    4. <![CDATA[
    5. import mx.core.UITextField;
    6. import mx.styles.*;
    7.  
    8. private var uiTextField: UITextField;
    9.  
    10. override protected function createChildren(): void
    11. {
    12.         super.createChildren();
    13.         uiTextField=new UITextField();
    14.         addChild(uiTextField);
    15.         uiTextField.text="mx.core.UITextField";
    16.         trace("uiTextField.styleName: "+uiTextField.styleName);
    17. // uiTextField.styleName: null
    18.         var styleCss:CSSStyleDeclaration = new CSSStyleDeclaration();
    19.         styleCss.setStyle('fontSize', 15);
    20.         styleCss.setStyle('color', picker.selectedColor);
    21.         uiTextField.styleName=styleCss;
    22. }
    23.  
    24. public function changeColor(): void
    25. {
    26.         uiTextField.styleName.setStyle("color", picker.selectedColor);
    27. }
    28.  
    29. ]]>
    30. </mx>
    31. <mx :ColorPicker id="picker" change="changeColor()"/>
    32. </mx></mx>

    2007-03-26

    14:57:30, Junik
    Легкая локализация во Flex. А будет ли runtime локализация?

    Если вы разрабатываете flex приложение, то локализация не должна отнять много времени, про что есть статьи и на русском языке (например, эта). Несколько минут и ваше приложение “заговорит” на разных языках, а если забудете что-то важное, то exception обеспечен.
    Adobe предлагает использовать [ResourceBundle] metadata в ActionScript и @Resource директиву в MXML. Лично я отдаю все-таки предпочтение использованию метатега ResourceBundle с последующим общением с объектом типа ResourceBundle, хотя бы потому что Flex не поддерживает runtime локализацию и при необходимости придется ее добавлять. И проще будет вместо ResourceBundle подсунуть класс с таким же интерфейсом, чем исправлять строки типа “@Resource(key=’keyname’, bundle=’ResourceBundleName’)” во всех mxml файлах.
    Кстати, судя по первому комменту этого поста стоит ожидать поддержки runtime локализации в первой половине 2007 года, так что ждать осталось совсем немного. :) Хочется верить, что для этого не прийдется создавать swf файл для каждого языка с последующей их подгрузкой, как сейчас предлагается создавать swf-оболочку для css.


    14:27:10, Graann's blog
    Подгрузка css на стадии компиляции

    В процессе работы над очередным проектом у нас с Junik возникла потребность в использовании каскадных стилей. Подробнее о стилях и вариантах их использования написано тут, методика подгрузки css в рантайме тут, здесь же речь пойдет о тех проблемах с которыми мы столкнулись в процессе подгрузки файла css на стадии компиляции.
    В окне свойств каждого проекта есть вкладка именуемая Flex Compiler, где в строке additional compiller arguments можно задавать опции для компиляции приложения. В перечне присутствует такая незаменимая в нашем случае опция как defaults-css-url. Собственно эту, как и все остальные, опцию можно вынести и в специальный конфигурационный xml. Хотя сейчас не об этом. Сейчас о том, что где бы вы ни задали ваш css вовсе не факт что он у вас заработает. Нам как раз посчастливилось столкнуться с этой проблемой. Изначально наш css подгружался в mxml-ине посредством тега Style и все прекрасно работало. После того как мы вынесли css в конфигурационный файл приложение работать напрочь отказывалось и постоянно генерило ошибки в рантайме.
    В хелпе ничего внятного мы не нашли. Нечто отдаленное покоится тут Активное прогугливание ответов на вопрос “что за фиг?!” тоже нам не доло. Кроме криков о помощи еще кучки товарищей различных национальностей гугл ничем не порадовал.
    Пришлось думать самим. Суть проблемы на поверку оказалась в следующем:
    Как вы вероятно знаете, по умолчанию флекс пользуется услугами default.css. (у меня c:\Program Files\Adobe\Flex Builder 2\Flex SDK 2\frameworks\defaults.css) в котором аккуратно прописывает все стили компонент. Когда вы подгружаете css в теге Style приложение первоначально грузит вышеупомянутый defaults.css и только после этого применяет к приложению правила из вашего css. В случает же когда вы прописываете defaults-css-url defaults.css замещается вашим файлом и приложению просто не хватает стилей для отображения.


    2007-03-16

    04:08:30, Korax Flash
    Готов A3 JTable

    Ребята из aswing.org выпустили на всеобщее обозрение A3 JTable

    Этот год сулит новое “программистское щастье”:

    • Flex Builder => IDEA
    • MXML => ASML
    • MX Компоненты => AsWing (Open Source Flash ActionScript GUI framework and library)

    До кучи осталось забрать производство Flash Player Runtime из нерасторопных рук Адобовских программистов и заодно повысить скорость исполнения апликух в 50-100 раз и наконец сделать мультиязычный инсталлятор.


    2007-03-03

    06:02:14, Agahov's blog
    flex-coding-guidelines

    Fabio Terracini опубликовал в рассылке FlexCoders рекомендации по оформлению кода для Flex (AS3, MXML, CSS).
    ссылка на pdf файл.

    Данный документ основан на соглашениях используемых в Adobe Flex libararies, Java
    и работе Fabio в DClick.


    |