Flex и RIA блоги
2014-12-09 |
Дима Гранецкий — 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 |
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 |
Как отделить мух от колет? Рано или поздно любой flex-разработчик понимает, что нужно что-то сделать с собственным “винегретом” в коде, состоящим из mxml-разметки вперемешку с inline-кодом. А, собственно, что с ним не так? Если кратко, то:
<?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>
Вместо того, чтобы пропагандировать “здоровое кодирование”, а также потому, что не смогла, Не будем о грустном. Так как же можно отделить просо от гречки? Если хорошо поискать, то Adobe предлагает следующие варианты:
<s:Button label="Convert" click="celsius.text=String(Math.round((Number(fahrenheit.text)-32)/1.8 * 10)/10);"/>
Много кода в инлайн обработчике не напишешь. Нельзя использовать операторы сравнения. Да и не похож этот вариант на разделение, скорее наоборот. Проходим мимо. Описывание кода в отдельном 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 кода не получится. А так как именно эту проблему мы и решаем, то вариант с подпиской на событие в разметке в данном случае подходит лучше. Используем тот вариант, который решает нашу задачу лучше. Таким образом, мы частично решили поставленные в начале статьи задачи, и даже получили некоторые другие преимущества:
Но, как и у любого другого шаблона, у CodeBehind есть не только плюсы, но и минусы:
Другим вариантом реализации отделения логики от разметки является приём, называемый 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 |
2013-12-06 |
Жизненный цикл Spark компонентов Flex фреймворка и базовые правила наследования компонентов Для правильной работы со Spark компонентами и создания собственных компонентов, необходимо иметь понятие о том, как и по каким правилам они работают. Сегодня мы рассмотрим базовые принципы, без знания которых невозможно эффективно использовать этот мощный фреймворк. Итак, жизненный цикл каждого компонента во Flex фреймворке проходит следующие этапы:
Когда мы добавляем компонент с помощью mxml разметки <local:MyComponent fontSize="12" width="100"/> происходит следующее. Сначала запускается этап создания, и инстанциируется экземпляр класса MyComponent. Затем происходит конфигурация, в течение которой компоненту выставляются свойства и стили, объявленные при добавлении компонента (применяются они позже). Пока внутри компонента не доступны свойства 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(); } } Теперь движемся дальше (до применений изменений мы дойдем чуть позже). Наступает этап подключения, в котором компонент добавляется на сцену, после чего происходит инициализация. Инициализацию рассмотрим подробнее. Фазы инициализации:
При переопределении метода 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 фреймворка используют отложенную валидацию изменений. Аналогично как мы делали выше с полем
Для применения изменения свойств будет вызван метод override function protected commitProperties():void { super.commitProperties(); if (this._dataChanged) { this._dataChanged = false; // Применение изменения поля this._data } } Отметим, что, так как валидация происходит после инициализации, то в методе При валидации размеров будет вызван метод 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; } Валидация размеров вызывает метод По окончании инвалидации рассылается событие « Когда компонент уже не нужен – он удаляется со сцены (методами удаления или выставлением флага Полезные ссылки
|
2013-04-03 |
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 Тэги: |
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 |
Open Souls Несколько дней назад вернулся с 10ти дневного похода, побывал на самой высокогорной метеостанции родины Кара-Тюрек, немного простыл, чутку обморозил щеку, живой. Новый год встречал в 15ти дневном походе, ногами прошли более 150км. Удивительный выбор , вместо теплой Черногории, лететь в морозный Алтай, помещать себя в суровые условия выживания. Возможность осознать действительно значимое в жизни и отсеять шелуху Включается понимание не умом, не логическое, более глубокое, настоящее. Возможно такой способ понимания изменений происходящих с платформой flash будет лучшим :)
Уже не так слежу за новостями платформы, на днях почитал хештег #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 |
Резюме -> интервью -> зарплата Как составить резюме так, чтобы его прочли, а не выбросили? Зачем вообще нужно резюме? Какое резюме лучше: всеохватное с перечислением всех регалий или лаконичное? Если пригласили на собеседование, то к чему готовиться? О чем стоит, а о чем не стоит говорить? Оказывается, не все наши знают ответы на эти вопросы. Более того, не все догадываются о существовании этих вопросов. Попытаемся заполнить этот пробел. Зачем нужно резюмеКроме перечисления ваших профессиональных достижений, ваше резюме -- это способ за 5 минут понять, насколько вы адекватны собственной среде. Если вы не можете составить резюме, то это уже многое о вас говорит. Если вы не хотите это делать -- то о вас понятно еще больше. А что именно понятно? А кое-что. Каждый работодатель поймет немного по-своему, он сделает выводы о вашей коммуникабельности и умении излагать. Если вы ничего не можете о себе сказать -- понятно. Если говорите слишком много и флудите -- понятно. Попробуйте сами взять кого-то незнакомого на работу и вы поймете то, что понятно лишь работодателям, и ваше видение изменится. И станет ясно, как важно правильное резюме. Так говорит БудамТема адекватного интервью в американской компании раскрыта в подкастах Будама. Если вы обновляете свое резюме или готовитесь к собеседованию, то их прослушивание может доставить вам как пользу, так и возможность приятно провести время, узнав конкретные и ясные мысли о карьере.
Зачем вы пишете резюме?Первый вопрос, на который вы должны ответить перед составлением резюме: что и зачем я хочу сказать о себе работодателю, чтобы получить максимум пользы для себя и для всех? Второй вопрос: что я хочу сказать о себе в первую очередь? Ответы на эти вопросы приведут к переделке резюме, и это правильно. Для каждого случая поиска работы лучше всего редактировать резюме так, чтобы приоритеты в резюме были ориентированы на запросы вашего работодателя. Представьте это как проекции трехмерного предмета на двумерные плоскости: в зависимости от свойств пространства, более привлекательной будет та или иная проекция, тут лучше показать вид сверху, а там -- лучше вид справа. Ваше самое полное резюме, со всеми вашими достижениями, хобби и котятами - это трехмерный объект. Созданная из него версия, адаптированная под конкретную вакансию -- это его редуцированная проекция. Часто адаптация резюме заключается в том, чтобы вырезать лишнее и дать читателю-работодателю лишь то, что его интересует. Не тратьте его время зря. Расскажите о себе главное, и sapienti sat. Лаконичное резюме или полное?Пару лет назад я начал использовать сверх-лаконичное резюме, где мои приоритеты выделены размером, как тэги в облаке: _____________________________________________________________________________________ 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.
По такому резюме легко увидеть, что именно вы о себе думаете (или что вы хотите, чтобы о вас думали). Это -- схема ваших возможностей, и ее также легко редактировать, т. к. она охватывается одним взглядом. Полное резюме можно включить в текст лаконичного как ссылку. Посмотрите на это так: составление резюме -- это упражнение в креативности и смелости. Это ваш шанс сразу понравиться или ваш риск сразу показаться унылым задротом. И это -- первый шаг к новой зарплате :- ) Тэги: |
2012-03-31 |
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 |
К вопросу об архитектурных фреймворках в Adobe AIR Пишет Адилет Абылов: Недавно столкнулся с проблемой выбора архитектурного фреймворка для разработки под мобильные устройства на Adobe AIR. У меня довольно большой опыт использования Cairngorm, но терзают смутные сомнения в том, что Cairngorm - это хороший выбор для мобильных приложений, с учетом рекомендаций Adobe по экономии памяти и ресурсов процессора. Поиск в сети на эту тему не дал однозначного результата. Где-то читал, что Mate подходит для мобильных устройств, но Adobe рекомендует меньше использовать mxml, а Mate очень активно использует его. Возможно, мобильные приложения по определению не могут быть большими и сложными, поэтому использование фреймворком и не требуется. Хотелось бы спросить мнения у более опытных коллег. С уважением, Адилет Абылов |
2011-10-04 |
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" […] |
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" [...] |
Скажи «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 |
Как быстро свести с ума Flex-компилятор Я помогаю Павлу изучать Flex и сегодня он попросил меня разобраться с одной странной ошибкой, которая возникла в его коде "непонятно откуда". Ошибка возникает во время выполнения и в сокращенном виде гласит такое:
Официальная документация об этой и некоторых других ошибках ActionScript времени выполнения говорит, что они возникают в случае повреждения SWF-файла. Или в случаях сбоя работы компилятора, о чем надо сообщать в Adobe. То есть компилятор может создать неправильный файл, который не может быть корректно выполнен, но ошибки компиляции при этом мы не получим - только ошибку времени выполнения. Разбираясь с причинами возникновенния этой ошибки, мы сначала мы убедились, что SWF-файл не поврежден: очистили и пересобрали проект во Flash Builder, очистили кэш браузера, перезапустили. Повторили два раза. Не помогло. Получается, что ошибка -- где-то в исходном кодеПокопавшись немного, мы нашли проблему, из-за которой компилятор делал неправильный Отбросив все несущественное, получим такой исходный код приложения, целиком воссоздающий данную проблему: <?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 |
Видео: работа с языком MXML в редакторе Realaxy IDE Евгений Потапенко таки оказался быстрее ребят из FDT и FlashDevelop и реализовал поддержку MXML в редакторе RASE (Realaxy ActionScript Editor) в разы быстрее, чем это сделали они. Вот скринкаст о том, как работать с MXML в редакторе RASE - Realaxy ActionScript Editor. Видео, как и редактор, пока в бете - так что пока без звука:
Выходит, что название редактора уже устарело, ведь вторая и третья буквы в аббревиатуре "RASE" обозначают "ActionScript" в названии "Realaxy ActionScript Editor". Теперь весь функционал редактора уже не помещается в его названии, так как MXML теперь тоже можно писать. Можно начинать думать над новым названием и новой аббревиатурой. Предлагаю название "Realaxy IDE" с аббревиатурой "RIDE!", что переводится как "Погнали!" Лайк? Дизлайк? Предложите в комментариях свой вариант названия для этого редактора! |
2010-05-22 |
Доступна альфа версия UML редактора UML4AS Сегодня разработчики UML редактора UML4AS выложили альфа версию в публичный доступ для скачивания.
и много чего ещё... |
2010-03-16 |
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 там, где такое сравнение имеет смысл. Итак, эта статья предназначена для:
Чего нет в этой статье? Мое намерение не в том, чтобы превратить вас во флексеров, и не в том, чтобы убедить вас в превосходстве Flex над X или Y. Я твердо верю, что существуют различные типы проектов, и что они могут и должны быть реализованы с помощью различных инструментов. Когда производительность, максимальная отдача от инвестиций и удобство являются главными приоритетами, то нет такой вещи, как универсальный инструмент. В то же время, эта статья не является полной документацией к Flex или ActionScript3. Существуют десятки книг, охватывающих эту тему сотнями страниц. Есть тысячи статей о Flex. Моя цель – дать вам достаточно информации по наиболее важным темам и там, где это имеет смысл, связать концепции Flex с аналогичными понятиями из PHP. Чтобы статья была полезной, я структурировал ее и постарался не вдаваться слишком глубоко в детали. В конце я даю краткое введение в Adobe AIR и ссылки на дополнительные ресурсы, если вам нужна подробная информация по этим вопросам. Для большинства примеров я выбрал Flex 3, на то есть пара причин. Во-первых, во время написания этой статьи Flex 4 все еще не вышел. Во-вторых, Flex 4 в основном является эволюцией Flex 3, так что большая часть описываемых вещей может быть применена к Flex 4 с минимальными изменениями, если они вообще понадобятся. В некоторых случаях я укажу на эти отличия. Что касается PHP, то я использую версию PHP 5.3. Теперь посмотрим содержание, а затем – погрузимся в материал!
Что такое 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.
|
2010-03-10 |
Фильтруем ArrayCollection Так случилось, что фильтрация коллекций ни разу не беспокоила меня. А тут коллега задал вопрос, который послужил толчком к тому, что вы сейчас прочитаете. =) Коллеге необходимо показать во view отфильтрованную ArrayCollection. Сама ArrayCollection находится в модели. Когда во view применяется фильтр, то данные модели очень сильно выглядят измененными. Что делать? Как быть? Конечно, мы с вами знаем, что данные на самом деле не меняются. source коллекции так и остается исходным. Но не работать же в модели с source? Конечно, не работать! И уж конечно, не делать копии коллекций! Тут спасибо Константинеру за наводку. =) Можно использовать ListCollectionView в качестве обертки нашей исходной коллекции уже на уровне view. Тогда довольная модель работает с ArrayCollection, как и прежде, а view показывает, что захочет. В качестве примера использую пример из доков Adobe для фильтрации коллекций. XML:
Тут у нас два выпадающих списка: один с source коллекции, а второй с самой коллекцией. Что же мы делаем? Тут и далее использован беглый стиль программирования, потому что все-таки пример. =) Code:
После создания приложения создаем эту нашу обертку: Code:
Фильтруем уже эту обертку, ее же показываем во втором выпадающем списке. Вот как выглядит код после изменений: XML:
В результате получаем фильтрацию исключительно на уровне view. А модель живет своей счастливой и долгой жизнью. =) Этот же подход можно использовать и при необходимости показывать одну и ту же коллекцию в разных контролах с разными фильтрами. |
2010-01-12 |
Утечка памяти в IE 8 Столкнулся со следующей проблемой. Есть простое приложение, использующее ExternalInterface.addCallback:
Флешка вставлена через 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. И помогло :) |
Утечка памяти в IE 8 Столкнулся со следующей проблемой. Есть простое приложение, использующее ExternalInterface.addCallback:
Флешка вставлена через 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 |
Знакомство с Mate Вступление. Этот пост начал свое существование 7 месяцев назад. Именно тогда я решил взять на вооружение Mate Flex Framework. Но злостный непрекращающийся дидлайн никак не давал мне закончить статью. Год выдался трудным и на работе и дома (в конце ноября у нас родился 3й ребятёнок). Сейчас, на праздниках (Всех с Новым Годом и Рождеством!) появилась свободная минутка, чтобы оглянуться назад. Начало этого поста писалось в режиме осваивания Mate, т.е. с распухающим мозгом, силящимся понять принципы фреймворка и пытающимся подстроиться под новый стиль программирования. Затем, втягиваясь, я понемногу добавлял небольшие комментарии (курсивом) и заметки. Сейчас я просто всё это немного причешу, добавлю небольшие комментарии, подведу итоги, и увидим, что получится. Забегая вперед, хочу с удовольствием отметить, что освоение прошло успешно и пол-десятка проектов были запущены на каркасе Mate. Теоретическое знакомство с Mate Наконец-то у меня появилось время копнуть Mate.
Для начала посмотрим видео: Mate Helloworld. Впечатления позитивные. Всё довольно очевидно и изящно. Здесь рассказывают про Mate на примере работы с простейшим сервисом при использовании AMFPHP. Мне это дело так понравилось, что я решил немедленно себе поставить эту штуку - но об этом позже. А пока - продолжаем изучать Mate. Читаем про Mate на Go!Verla Flex Blog:
Все эти статьи действительно здорово помогли освоить Mate, и особенно наличием исходного кода. На сайте Mate также есть куча примеров с исходниками, которые здорово помогли понять основы и принципы. Неудачно перехожу от теории к практике Пока изучал Mate, решил испробовать на реальном проекте (проект небольшой многослойной карты с маркерами и с подгрузкой данных). Подготовил все компоненты к виду Model/View и... всё получилось само собой, но только без Mate. На байндинге и событиях. Делаем вывод - Mate не для простых проектов. Точнее, не имеет смысла его использовать в простых проектах. Хотя, в примерах числятся очень простые приложения типа "Weather Widget". Сейчас, оглядываясь на этот проект, я понимаю, что сделать его на Mate было бы очень удобно и просто. Но принципы Mate требуют изменить свои устоявшиеся привычки разработки. На тот момент я еще не был готов к этому. Кстати, хочу отметить, что мое решение ничуть не проиграло бы Mate-решению. Чисто-Flex-разработка обладает богатым набором возможностей, и вовсе не обязательно всем сломя голову пересаживаться на Mate. Но попробовать, точно, стоит. Но меня просто переполняет желание освоить этот фреймворк. Попробую начать с нуля. Теперь хорошо бы создать структуру пакетов (проще говоря, папок) проекта. После обзора примеров, выявляется устоявшаяся структура: Основной пакет проекта помещается в папку: В проекте содержатся следующие пакеты:
Само собой разумеется, что каждый волен пользоваться собственной структурой. Но по мне, так лучше присоединиться к общественности и следовать какому-то общему правилу. Хотя бы самому обобщенно общему. Для лучшего понимания собственного и чужого кода. Такая структура хорошо подходит для относительно простого проекта. Однако, работая над крупным проектом, я убедился, что этого мало. Нужна также смысловая структуризация. То есть, в пакете проекта я располагаю пакеты функционально обособленных модулей, а уже каждый пакет модуля содержит обозначенную выше структуру. Общие для всех модулей сущности складируются в пакет "common". Такой способ особенно оправдан в проектах с использованием подгружаемых модулей.Первое Mate-приложение А о чем будет наше приложение? После некоторых изысканий, я окончательно убедился, что фреймворк рассчитан на работу с данными. Позже я делал настраиваемый анимационный движок для виджета, где данные играли не самую первую роль, но, всё же, в приложениях без необходимости обработки данных Mate действительно не нужен. И тут подвернулся как раз подходящий проект - еще одна интерактивная карта с подгружаемыми данными маркеров и списка объектов. Ну теперь нужно не облажаться и все-же применить новое учение. Опишу приблизительный процесс создания приложения с использованием Mate. Все действующие лица не вымышлены, но и приводятся не в полном составе, без усложнений, связанных с особенностями проекта. 1. Создаем все Views Их у меня получилось два:
Экраны оформляю так, чтобы все детали ушли в компоненты, а полученные компоненты "плавали на поверхности". Таким образом, InformationView содержит компоненты:
Каждый из них имеет dataProvider, в который передается список данных объектов карты informationDataProvider и список маршрутов routesDataProvider. А LayerView содержит компоненты:
Всё это лежит в папке views. 2. Создаем VO Теперь создадим объекты данных, которые будут выводить наши views. Это обычные потомки EventDispatcher с Bindable-свойствами:
Размещаем их в папке vos. 3. Создаем файлы данных Имея представление о данных, которые мы выводим, можно создать XML-файл с данными. Данные будем получать по HTTP-запросу, и нам не важно, будет ли их кто-то генерировать или это будет простой XML файл. Сейчас главное, чтобы наше приложение их получало, обрабатывало и выводило. Создаю в src папку data, в которой размещаю XML-файл с данными. Структуру выбираю произвольно - так как мне удобно - тех-требований на формат обмена данными нет, поэтому их диктую я сам. URL файла данных приложение получает через переменные FlashVars (без подробностей). 4. Создаем поставщиков данных InformationDataProvider - так я его назвал. Он получает загруженные данные, обрабатывает их и размещает у себя. Собственно, этим занимается его метод aquire(data:XML), который помещает данные в полях:
В случае ошибки при разборе данных, или сервер возвратил информацию об ошибке, поставщик генерирует событие, информирующее об ошибке - 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 обязательно помещаем в корне приложения. Заметки Столкнулся со следующими проблемами: 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 дает прочный каркас приложению, быстрый старт разработки, помогает больше сосредоточиться на логике приложения, не отвлекаясь на рутину. |
Знакомство с Mate Вступление. Этот пост начал свое существование 7 месяцев назад. Именно тогда я решил взять на вооружение Mate Flex Framework. Но злостный непрекращающийся дидлайн никак не давал мне закончить статью. Год выдался трудным и на работе и дома (в конце ноября у нас родился 3й ребятёнок). Сейчас, на праздниках (Всех с Новым Годом и Рождеством!) появилась свободная минутка, чтобы оглянуться назад. Начало этого поста писалось в режиме осваивания Mate, т.е. с распухающим мозгом, силящимся понять принципы фреймворка и пытающимся подстроиться под новый стиль программирования. Затем, втягиваясь, я понемногу добавлял небольшие комментарии (курсивом) и заметки. Сейчас я просто всё это немного причешу, добавлю небольшие комментарии, подведу итоги, и увидим, что получится. Забегая вперед, хочу с удовольствием отметить, что освоение прошло успешно и пол-десятка проектов были запущены на каркасе Mate. Теоретическое знакомство с Mate Наконец-то у меня появилось время копнуть Mate.
Для начала посмотрим видео: Mate Helloworld. Впечатления позитивные. Всё довольно очевидно и изящно. Здесь рассказывают про Mate на примере работы с простейшим сервисом при использовании AMFPHP. Мне это дело так понравилось, что я решил немедленно себе поставить эту штуку - но об этом позже. А пока - продолжаем изучать Mate. Читаем про Mate на Go!Verla Flex Blog:
Все эти статьи действительно здорово помогли освоить Mate, и особенно наличием исходного кода. На сайте Mate также есть куча примеров с исходниками, которые здорово помогли понять основы и принципы. Неудачно перехожу от теории к практике Пока изучал Mate, решил испробовать на реальном проекте (проект небольшой многослойной карты с маркерами и с подгрузкой данных). Подготовил все компоненты к виду Model/View и... всё получилось само собой, но только без Mate. На байндинге и событиях. Делаем вывод - Mate не для простых проектов. Точнее, не имеет смысла его использовать в простых проектах. Хотя, в примерах числятся очень простые приложения типа "Weather Widget". Сейчас, оглядываясь на этот проект, я понимаю, что сделать его на Mate было бы очень удобно и просто. Но принципы Mate требуют изменить свои устоявшиеся привычки разработки. На тот момент я еще не был готов к этому. Кстати, хочу отметить, что мое решение ничуть не проиграло бы Mate-решению. Чисто-Flex-разработка обладает богатым набором возможностей, и вовсе не обязательно всем сломя голову пересаживаться на Mate. Но попробовать, точно, стоит. Но меня просто переполняет желание освоить этот фреймворк. Попробую начать с нуля. Теперь хорошо бы создать структуру пакетов (проще говоря, папок) проекта. После обзора примеров, выявляется устоявшаяся структура: Основной пакет проекта помещается в папку: В проекте содержатся следующие пакеты:
Само собой разумеется, что каждый волен пользоваться собственной структурой. Но по мне, так лучше присоединиться к общественности и следовать какому-то общему правилу. Хотя бы самому обобщенно общему. Для лучшего понимания собственного и чужого кода. Такая структура хорошо подходит для относительно простого проекта. Однако, работая над крупным проектом, я убедился, что этого мало. Нужна также смысловая структуризация. То есть, в пакете проекта я располагаю пакеты функционально обособленных модулей, а уже каждый пакет модуля содержит обозначенную выше структуру. Общие для всех модулей сущности складируются в пакет "common". Такой способ особенно оправдан в проектах с использованием подгружаемых модулей.Первое Mate-приложение А о чем будет наше приложение? После некоторых изысканий, я окончательно убедился, что фреймворк рассчитан на работу с данными. Позже я делал настраиваемый анимационный движок для виджета, где данные играли не самую первую роль, но, всё же, в приложениях без необходимости обработки данных Mate действительно не нужен. И тут подвернулся как раз подходящий проект - еще одна интерактивная карта с подгружаемыми данными маркеров и списка объектов. Ну теперь нужно не облажаться и все-же применить новое учение. Опишу приблизительный процесс создания приложения с использованием Mate. Все действующие лица не вымышлены, но и приводятся не в полном составе, без усложнений, связанных с особенностями проекта. 1. Создаем все Views Их у меня получилось два:
Экраны оформляю так, чтобы все детали ушли в компоненты, а полученные компоненты "плавали на поверхности". Таким образом, InformationView содержит компоненты:
Каждый из них имеет dataProvider, в который передается список данных объектов карты informationDataProvider и список маршрутов routesDataProvider. А LayerView содержит компоненты:
Всё это лежит в папке views. 2. Создаем VO Теперь создадим объекты данных, которые будут выводить наши views. Это обычные потомки EventDispatcher с Bindable-свойствами:
Размещаем их в папке vos. 3. Создаем файлы данных Имея представление о данных, которые мы выводим, можно создать XML-файл с данными. Данные будем получать по HTTP-запросу, и нам не важно, будет ли их кто-то генерировать или это будет простой XML файл. Сейчас главное, чтобы наше приложение их получало, обрабатывало и выводило. Создаю в src папку data, в которой размещаю XML-файл с данными. Структуру выбираю произвольно - так как мне удобно - тех-требований на формат обмена данными нет, поэтому их диктую я сам. URL файла данных приложение получает через переменные FlashVars (без подробностей). 4. Создаем поставщиков данных InformationDataProvider - так я его назвал. Он получает загруженные данные, обрабатывает их и размещает у себя. Собственно, этим занимается его метод aquire(data:XML), который помещает данные в полях:
В случае ошибки при разборе данных, или сервер возвратил информацию об ошибке, поставщик генерирует событие, информирующее об ошибке - 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 обязательно помещаем в корне приложения. Заметки Столкнулся со следующими проблемами: 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 |
Flash Builder 4: Проблема с запуском приложения из Flex Builder 3 Столкнулся с проблемой запуска добавленных, не созданных в этом же билдере, mxml application файлов в проект. решение описал в Flex Cookbook |
Flash Builder 4: Проблема с запуском добавленного mxml приложения Столкнулся с проблемой запуска добавленных, не созданных в этом же билдере, mxml application файлов в проект. решение описал в Flex Cookbook |
2009-10-26 |
Двухдневный марафон завершен: субботний флекс во Львове плюс воскресный флэш в Киеве Во Львове мы имели пиковые по плотности флекс-доклады. Первый, "Практики большого флекс-проекта" от Андрея Табачина из 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:
Это не отчет, а мои впечатления по горячим следам. Дополняйте или поправляйте в комменатариях |
Двухдневный марафон завершен: субботний флекс во Львове плюс воскресный флэш в Киеве Во Львове мы имели пиковые по плотности флекс-доклады. Первый, "Практики большого флекс-проекта" от Андрея Табачина из 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:
Это не отчет, а мои впечатления по горячим следам. Дополняйте или поправляйте в комменатариях |
2009-10-15 |
Проблемы с Flash Builder 4 и Flex Library проектом На днях пришла необходимость попробовать перенести библиотеки с flex sdk 3.2 на flex sdk 4. Заодно повтыкать в Flash Builder 4 и различные радости которые нам принес Gumbo. Все было хорошо и ничто не предвещало беды ). После создания проекта компилятор сразу начал ругаться. “Почему бы и нет” - подумал я, ведь различия в сдк большие. Начал выяснять почему. Первым сюрпризом было то, что он ругался на mxml класс, который обращался к AS классу лежащему в том же пакете. “Едить колотить, какая та лажа” - подумал я. И волевым движением руки добавил в mxml импорт, этого нужного класса. Начал выдумывать почему такое происходит. Вариантов у меня было три:
Покапал в сторон “старых классов”, ничего! Нет никаких упоминаний о том что с ними, что-то нитак, поклацал галочки типа “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” (я еще в старых проектах не раз попадался когда вновь созданые классы не включались в либу) и я поспешил воспользоваться ей. Всё. Всё перестало работать и вернулось на круги своя! Убрал галочку, все работает. Люди, вы понимаете, что это полная ЖОПА? Это полный маразм! Из-за левой, выставляемой по умолчанию, кажущейся мега удобной галочкой, которую не один здраво-ленивый человек не захочет просто так снимать (а если снимет, то только при важных обстоятельствах), я протрахался 2 дня! Я исчерпал все свои ругательства, заговоры, шаманства, волшебные слова и веру в людей. Если бы не пример. И если не случай(! просто неочевидное стечение обстоятельств), то я бы вообще ничего не собрал. ![]() Не используйте пока эту опцию! Никогда, забудьте про нее или дождитесь релиза ) Поняв причину, я смог найти на bugs.adobe.com баги связаные с этой опцией (и я, как оказалось, повторил их все!). Подумав немного над возможной причиной я пришел к выводу, что все связано с неверной генерацией кода, так сказать первопричина. Поэтому я запостил баг FB-23453 в котором попытался описать первопричину. |
2009-10-08 |
Передача версии flex приложения при компиляции (Flex 3) Когда давно я писала о вариантах передачи версии в приложение. Там упоминалось возможное использования для этого сonditional compilation, но тогда еще Flex 3 не вышел. Сейчас уже давным давно вышел Flex 3 и даже 4 не за горами. Сейчас расскажу про то, как легко и непринужденно передать версию вашего приложения при компиляции, а потом и запросто использовать ее в приложении. Передать константы в приложение можно, используя опцию компилятора compiler.define. Константы могут быть типов Boolean, String, Number или выражения, которые могут быть преобразованы в ActionScript в процессе компиляции. Далее эти константы доступны в приложении как глобальные. Используя опцию define, необходимо для константы определить: namespace, имя и значение:
Пример:
Доступ из приложения доступен пока только из as-классов. В скором будущем, возможно будет работать и доступ из mxml-классов. Говорят, что в mxml-классах можно использовать только Boolean. Но зачем нам? Мы же код в mxml не пишем.
Подробнее про использование conditional compilation в доках. |
2009-09-24 |
О Code Behind во Flex — еще раз Наглядные официальные статьи по Code Behind во Flex уже есть, включая статьи о Code Behind на русском и украинском, рекомендующие этот подход новичкам во Flex. Напишем о нем еще раз, так как мы о нем толком еще не писали. Это упущение, ведь Code Behind относится к лучшим практикам! "Code Behind" означает, что код находится за чем-то. А зачем это нужно?Code Behind помогает стройно разделить код приложения по задачам. Код, в котором задается дизайн находится в одном классе, а код с собственно логикой работы — в другом, том самом, который "Behind". Во Flex это выражается в том, что Actionscript находится за кодом MXML. Один из возможных (и хорошо работающих, проверенных подходов) к Code Behind реализуется с помощью т.н. Base-классов. Начнем с главного приложения проекта: 1. Для приложения создается базовый Actionscript-класс, в простейшем случае расширяющий родной флексовый класс package core { public class ApplicationBase extends Application { ... } } 2. Этот класс затем и используется как базовый в коде MXML-класса самого приложения: <?xml version="1.0" encoding="utf-8"?> <core:ApplicationBase ... > ... </core:ApplicationBase>
Что мы получили: есть Actionscript-класс В таком подходе использование тэга Таким образом достигается четкое разделение вычислительной логики и дизайна приложения. Логика идет в Actionscript, дизайн — остается в MXML-коде. |
2009-09-04 |
Как поймать все события в визуальных компонентах Flex-приложения? Используя dispatchEventHook! Удивительно: для того, чтобы перехватить все события в интерфейсе Flex-приложения, нужно написать всего одну строку кода, и она весьма проста: UIComponent.mx_internal::dispatchEventHook = myEventsHook; Здесь Еще удивительнее то, как мало об этой простой технике написано в сети. Гугл в основном находит применение к Cairngorm (снова это имя!), короткую запись на японском и занятный пост о задании поведения флекс-компонентов по умолчанию. Обратите внимание, речь идет не обо всех событиях флекса, но именно о событиях визуальных компонентов, а точнее — всех компонентов, унаследованнх от класса Но уже это открывает интересные возможности по исследованию работы флекс-приложения. Важно: именно по исследованию его работы, а не вторжению в нее, которое возможно, но рекомендуется лишь в крайних случаях — пахнет дурным кодом и хаками. А вот изучить, как работают флексовые события при тех или иных ваших действиях в коде — самое оно. Например, посмотрим, что происходит при перемещении компонента # 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, чтобы получить эту элегантную картину Данная техника помогает оптимизировать код. Например, если задать панелям и текстовому полю из вышеприведенного кода явные размеры (width, height), то событий будет почти в два раза меньше — отпадают всякие ресайзы, ведь размеры указаны явно, и у вас есть еще один повод сделать выводы. |
Как поймать все события в визуальных компонентах Flex-приложения? Используя dispatchEventHook! Удивительно: для того, чтобы перехватить все события в интерфейсе Flex-приложения, нужно написать всего одну строку кода, и она весьма проста: UIComponent.mx_internal::dispatchEventHook = myEventsHook; Здесь Еще удивительнее то, как мало об этой простой технике написано в сети. Гугл в основном находит применение к Cairngorm (снова это имя!), короткую запись на японском и занятный пост о задании поведения флекс-компонентов по умолчанию. Обратите внимание, речь идет не обо всех событиях флекса, но именно о событиях визуальных компонентов, а точнее — всех компонентов, унаследованнх от класса Но уже это открывает интересные возможности по исследованию работы флекс-приложения. Важно: именно по исследованию его работы, а не вторжению в нее, которое возможно, но рекомендуется лишь в крайних случаях — пахнет дурным кодом и хаками. А вот изучить, как работают флексовые события при тех или иных ваших действиях в коде — самое оно. Например, посмотрим, что происходит при перемещении компонента # 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, чтобы получить эту элегантную картину Данная техника помогает оптимизировать код. Например, если задать панелям и текстовому полю из вышеприведенного кода явные размеры (width, height), то событий будет почти в два раза меньше — отпадают всякие ресайзы, ведь размеры указаны явно, и у вас есть еще один повод сделать выводы. |
2009-08-14 |
Package organizationОрганизация кода в пакетыСловарьРефакторинг - Класическая книга описывающая практики рефакторинга - http://www.ozon.ru/context/detail/id/1308678/ ВведениеПакеты это механизм для организации кода и разрешения конфликта уникальности наименования классов. Это техническое определение, но по какому принципу создавать наименования? Какими критериями руководствоваться? И зачем вообще об этом задумываться? Общие принципыМожно сформулировать следующие архитектурные принципы:
Далее о каждом их них более подробно: Избегать циклических зависимостей между пакетамиЦиклическая зависимость это когда два пакета ссылаются друг на друга. Обычно такая зависимость не планируется и появляется в последстивии. Часто это может быть признаком ухудшения общего состояния кода. Создание пакетов - динамический процесс. Со временем приложение меняется, появляется новая функциональность, старая переосмысливается. Возможно вам придется разделить пакеты по разным приложениям(библиотекам) и компелировать по отдельности. Цикличиская зависимость усложняет понимание и развитие кода. Не дает его повторно использовать. Избегать дублированияЧасто альтернативой циклической зависимости является дублирование кода. Но такой код уже плохо пахнет. Дублирование заграмождает код и затрудняет его модификацию. Попробуйте переосмыслить местоположение нового кода и не прятать его глобоко в иерархии. Формировать модулиМодуль это концептуальная сущность содержащая один или несколько дочерних пакетов. Модуль определяет границы для используемых в нем пакетов. Стремиться создавать слабо связанные модули
Выбирать модули на основе логической, концептуальной организации (домена)Часто модули разделяют на основе типов, например: Зачем об этом заботиться?Правильная организация пакетов и модулей позволит: Пример и несколько практических советовВ последнее время я часто встречаю в flex приложении структуру пакетов следуещего вида: Рассмотрим приложение AdminPanelЗдесь будет показан сам принцип создания пакетов. Не надо воспринимать получившуюся структуру как эталон, в реальном приложение много допольнительных деталей и специфики. Начальная структураrootpackage = com.agakhov.examples.adminpanel То, что я делал до сих пор, относилось ко всему приложению, поэтому я не выделял никаких специализированных пакетов. Приложение запускается показывает пустое окно и закрывается. Но уже работает. LoginДопустим, что первая по приоритету задача это аутентифика |
2009-07-11 |
FB vs FDT? Нет, FB + FDT! У армянского радио часто спрашивают, что всё-таки лучше: FB или FDT? В чём-то их возможности пересекаются, например, оба предоставляют минимальные средства рефакторинга (переименование), оба имеют функцию поиска референсов на поле или метод и т.д. Отсюда возникает соблазн использовать их оба два. К счастью это не так сложно (если не учитывать, конечно, что оба платные). Рассказываю свой рецепт, как их подружить, однако это не означает, что нельзя добиться того же самого другими путями. UPD:iceX подсказал ссылку на более подробную статью. |
2009-06-03 |
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-компонента подобная галочка. Я не нашел... |
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 |
UAFPUG 9, мой доклад о Eclipse Monkey Непрошло и пол года как я подготовил исходники и написал пост о моем докладе на UAFPUG, который был 28 февраля, этого года. Мой доклад назывался В начале небольшая призентация: Eclipse Monkey
View more presentations from ilja.panin.
По ходу призентации я приводил примеры использования скриптов. В правом углу некоторый слайдов есть метка E> это означает, что вместе со слайдом был пример кода. Примеры скриптов лежать в архиве у меня или в проекте monkey-for-flex на гугл коде. Примеры простые и не очень :). Непростой пример посвещен использованию модели кода Flex Builder в Monkey Eclipse. Пример лежит в файле create-interface.js Данный пример генерит методы и свойства которые объявлены в выбраном интерфейсе, используя модель кода Flex Builder. Чтобы получить код нужно выделить в коде имя интерфейса и нажать Alt+m и в консоле будет выведен код. Остаеться его только скопипастить. Данный пример не является эталоном работы с моделью кода Flex Builder, это лишь иллюстрация возможностей Eclipse Monkey. Еще я хочу обратить ваше внимание на библиотечки, которые я написал для более удобной работы. flexutil.js templateUtils.js
использование до безобразия простое
переменная tmpl содержит строку с кодом, дальше с можно поступать как угодно. Если есть каки-то вопросы, задавайте. Если есть какие-то пожелания, делитесь) Удачи. |
2009-04-24 |
Ищем молодого и талантливого Flash/Flex-разработчика на игровой online-проект в Москве Мы ищем молодого и талантливого Flash/Flex - разработчика, для участия в игровом проекте нашей компании (разработка клиентской части online игры), которого на первое время устроят 80000р. в месяц. Мы хотим от кандидата: Мы предлагаем: Если Вы хотите присоединиться к нашей команде, пожалуйста, напишите мне письмо на адрес tpalitsina@bdirect.ru! |
2009-04-16 |
Повышаем читаемость кода: документирование типов данных Несмотря на то, что 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 для обработки результатов выполнения асинхронных задач, что делает код более четким и читаемым. Может показаться, что дополнительное комментирование является лишней и ненужной работой, однако при работе с большим количеством кода наличие подобных уточнений позволяет получить необходимую информацию максимально быстро, что снижает количество отвлечений, и, соответственно, положительно сказывается на производительности. |
Eclipse Monkey и редакторы Flex Builder Работа с mxml и css редактором отличается от работы с обычным редактором который нам предоставляет Eclipse Monkey. Чтобы получить доступ к любому редактору я использую такой метод
Данный метод отдает ссылку на инстанс класса наследованого от org.eclipse.ui.editors.text.TextEditor, вернее даже на инстанс, который реализует дальше работаем обычными для эклипса методами:
Метод вставляет текст в позицию курсора и если выставлен флаг, перемещает курсор в конец вставленного текста. |
2009-04-11 |
Intellij IDEA build 9805 с поддержкой новых пространств имен Flex 4 Gumbo Вчера вышла новая EAP-сборка Intellij IDEA 9805 с поддержкой пространств имен в MXML-разметке Flex 4 Gumbo. Если кто не в курсе, эти пространства имен появились после отказа от префикса Редактирование пространств имен, о которых будет известно среде разработки, производится в настройках проекта (комбинация Ctrl+Alt+Shift+S) на вкладке Flex Compiller Settings. Однако добавлять в этот список стандартные пространства имен ( Хочется пожелать разработчиками также побыстрее справиться с изменившимся синтаксисом стилевых блоков CSS. Примечание: если вы используете самостоятельную сборку Flex 4 SDK и у вас не компилируется SWF-файл приложения, то это означает, что вам необходимо удалить файл |
Intellij IDEA build 9805 с поддержкой новых пространств имен Flex 4 Gumbo Вчера вышла новая EAP-сборка Intellij IDEA 9805 с поддержкой пространств имен в MXML-разметке Flex 4 Gumbo. Если кто не в курсе, эти пространства имен появились после отказа от префикса Редактирование пространств имен, о которых будет известно среде разработки, производится в настройках проекта (комбинация Ctrl+Alt+Shift+S) на вкладке Flex Compiller Settings. Однако добавлять в этот список стандартные пространства имен ( Хочется пожелать разработчиками также побыстрее справиться с изменившимся синтаксисом стилевых блоков CSS. Примечание: если вы используете самостоятельную сборку Flex 4 SDK и у вас не компилируется SWF-файл приложения, то это означает, что вам необходимо удалить файл |
Intellij IDEA build 9805 с поддержкой новых пространств имен Flex 4 Gumbo Вчера вышла новая EAP-сборка Intellij IDEA 9805 с поддержкой пространств имен в MXML-разметке Flex 4 Gumbo. Если кто не в курсе, эти пространства имен появились после отказа от префикса Редактирование пространств имен, о которых будет известно среде разработки, производится в настройках проекта (комбинация Ctrl+Alt+Shift+S) на вкладке Flex Compiller Settings. Однако добавлять в этот список стандартные пространства имен ( Хочется пожелать разработчиками также побыстрее справиться с изменившимся синтаксисом стилевых блоков CSS. Примечание: если вы используете самостоятельную сборку Flex 4 SDK и у вас не компилируется SWF-файл приложения, то это означает, что вам необходимо удалить файл |
Intellij IDEA build 9805 с поддержкой новых пространств имен Flex 4 Gumbo Вчера вышла новая EAP-сборка Intellij IDEA 9805 с поддержкой пространств имен в MXML-разметке Flex 4 Gumbo. Если кто не в курсе, эти пространства имен появились после отказа от префикса Редактирование пространств имен, о которых будет известно среде разработки, производится в настройках проекта (комбинация Ctrl+Alt+Shift+S) на вкладке Flex Compiller Settings. Однако добавлять в этот список стандартные пространства имен ( Хочется пожелать разработчиками также побыстрее справиться с изменившимся синтаксисом стилевых блоков CSS. Примечание: если вы используете самостоятельную сборку Flex 4 SDK и у вас не компилируется SWF-файл приложения, то это означает, что вам необходимо удалить файл |
2009-03-22 |
mx:Pause vs flash.utils.Timer. Flex Декларативность MXML - огромное достоинство Flex. Легкое определение переменных в MXML значительно упрощает разработку:
Но, на сколько я понял, не все классы можно представить в декларативном виде. Например, класс 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 { //Обработать окончание задержки } |
mx:Pause vs flash.utils.Timer. Flex Декларативность MXML - огромное достоинство Flex. Легкое определение переменных в MXML значительно упрощает разработку:
Но, на сколько я понял, не все классы можно представить в декларативном виде. Например, класс 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 |
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 тире после <!: Комментирование 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 комментировать надо. И для этого уже существует прототип (если я правильно понял) стандарта, которого и следует придерживаться. |
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 тире после <!: Комментирование 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 |
Дружим Flex с Flash. Заметки: загрузка, внедрение, шрифт. Flex Закончился очередной дидлайн. После крупных проектов, которые делаются за 3-4 дня практически с нуля, остаются ощущения, схожие с состоянием после автобусного тура: в голове каша, мельком что-то увидел, урывками что-то запомнил, надо разобрать фотки. Теперь настало время немного отдышаться и закрепить полученный опыт. Для начала, несколько заметок:
<mx:SWFLoader autoLoad="false" id="swfLoader" source="application.swf" /> . . . private function creationCompleteHandler(event:Event):void { swfLoader.loaderContext=new LoaderContext(false,new ApplicationDomain()); swfLoader.load(); }
@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-файлы не удобно, плюс, внедряя каждый файл, мы не можем обобщать графику - она будет внедряться для каждого файла заново (не проверял, но догадываюсь). Куда удобнее создать одну большую библиотеку и из нее внедрять символы. Но, к сожалению, их скрипты уже будут не доступны. Создаем компонент - наследник SWFLoader. После инстанцирования класса внедренного клипа (конец метода load(), можно так же добавить и в обработчик события загрузки), считываются все его метки и в их фреймы добавляются необходимые скрипты. Имя каждой метки имеет ключевую составляющую, которая и определяет тип действия добавляемого скрипта. Прекрасный момент - праздник еще не настал, а дидлайны уже позади! Отдыхать и набираться сил. И конечно, наших прекрасных женщин поздравляю с праздником 8 марта! |
Дружим Flex с Flash. Заметки: загрузка, внедрение, шрифт. Flex Закончился очередной дидлайн. После крупных проектов, которые делаются за 3-4 дня практически с нуля, остаются ощущения, схожие с состоянием после автобусного тура: в голове каша, мельком что-то увидел, урывками что-то запомнил, надо разобрать фотки. Теперь настало время немного отдышаться и закрепить полученный опыт. Для начала, несколько заметок:
<mx:SWFLoader autoLoad="false" id="swfLoader" source="application.swf" /> . . . private function creationCompleteHandler(event:Event):void { swfLoader.loaderContext=new LoaderContext(false,new ApplicationDomain()); swfLoader.load(); }
@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-файлы не удобно, плюс, внедряя каждый файл, мы не можем обобщать графику - она будет внедряться для каждого файла заново (не проверял, но догадываюсь). Куда удобнее создать одну большую библиотеку и из нее внедрять символы. Но, к сожалению, их скрипты уже будут не доступны. Создаем компонент - наследник SWFLoader. После инстанцирования класса внедренного клипа (конец метода load(), можно так же добавить и в обработчик события загрузки), считываются все его метки и в их фреймы добавляются необходимые скрипты. Имя каждой метки имеет ключевую составляющую, которая и определяет тип действия добавляемого скрипта. Прекрасный момент - праздник еще не настал, а дидлайны уже позади! Отдыхать и набираться сил. И конечно, наших прекрасных женщин поздравляю с праздником 8 марта! |
2009-02-28 |
Модули vs. компоненты. Flex В моем опыте Flex-разработки наступает новая стадия взросления. Ну, условно, у себя я уже могу выделить две стадии (не считая робкого потрагивания и любопытного пощупывания):
Сегодня в разработке проект, который так и напрашивается на использование модулей. В общих чертах - это небольшой промо-сайт с тремя основными разделами. Три этих раздела мы и оформим как модули. Руки так и зачесались попробовать создать модуль в FB. Открываю проект, создаю New->MXML Module. Открывается новый файл mxml, в который я добавляю, к примеру, кнопку, и текстовое поле. Сохраняю. В окошке Components->Custom появился новый компонент, по имени модуля. Ознакомимся вкратце с документацией: Creating Modular Applications. Здесь всё, на достаточно понятном языке, достаточно подробно разжевывается. Итак. Нас интересовали загрузка модуля и ее мониторинг. Есть еще один компонент, управляющий загрузкой модулей: ModuleManager. Этот класс, как нам обещают, предоставляет больше возможностей по управлению загрузкой модулей чем предыдущий. Но при этом, как утверждается, техника его использования является менее абстрактной чем работа с ModuleLoader. Ну-с, добро пожаловать в мир модульных приложений. Начинаем действовать! |
Модули vs. компоненты. Flex В моем опыте Flex-разработки наступает новая стадия взросления. Ну, условно, у себя я уже могу выделить две стадии (не считая робкого потрагивания и любопытного пощупывания):
Сегодня в разработке проект, который так и напрашивается на использование модулей. В общих чертах - это небольшой промо-сайт с тремя основными разделами. Три этих раздела мы и оформим как модули. Руки так и зачесались попробовать создать модуль в FB. Открываю проект, создаю New->MXML Module. Открывается новый файл mxml, в который я добавляю, к примеру, кнопку, и текстовое поле. Сохраняю. В окошке Components->Custom появился новый компонент, по имени модуля. Ознакомимся вкратце с документацией: Creating Modular Applications. Здесь всё, на достаточно понятном языке, достаточно подробно разжевывается. Итак. Нас интересовали загрузка модуля и ее мониторинг. Есть еще один компонент, управляющий загрузкой модулей: ModuleManager. Этот класс, как нам обещают, предоставляет больше возможностей по управлению загрузкой модулей чем предыдущий. Но при этом, как утверждается, техника его использования является менее абстрактной чем работа с ModuleLoader. Ну-с, добро пожаловать в мир модульных приложений. Начинаем действовать! * * * Впечатления. Работа с модулями не разочаровала: стабильно и надежно. Единственные проблемы, с которыми я столкнулся:
|
2009-02-13 |
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 каждый раз, когда пишете в кукбук. |
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 |
Код форматер для Flex Builder Ура! свершилось чудо, появился бесплатный кодоформатер для as3|mxml в Flex Builder http://www.riaspace.net/2009/01/ctrlshiftf-for-flex-builder/ В отличаи от ранее предлагаемого в поставке InterpriseIDE имеет настройки форматирования и работает лучше (ну или мне так показалось). Спасибо Косте за ссылку |
Код форматер для Flex Builder Ура! свершилось чудо, появился бесплатный кодоформатер для as3|mxml в Flex Builder http://www.riaspace.net/2009/01/ctrlshiftf-for-flex-builder/ В отличаи от ранее предлагаемого в поставке InterpriseIDE имеет настройки форматирования и работает лучше (ну или мне так показалось). Спасибо Косте за ссылку |
2009-01-30 |
Доки и уроки по редактору FlashDevelop Время от времени кто-то спрашивает, с чего начать освоение FlashDevelop, замечательного IDE для разработки Flash / Flex приложений. Некоторые туториалы и информация по флэшдевелопу:
Что-то здесь лишнее, а чего-то не хватает? Прошу высказываться и давать ссылки — облегчим правильным людям начало жизни с правильным редактором кода. |
2008-12-24 |
Шорткаты Flex Builder'а для быстрого перемещения в блоках кода Обнаружил, что во Flex Builder работают шорткаты, позволяющие переключаться между открывающими и закрывающими скобками в коде: Работают так, как и показано в картинке: Ctrl+Shift+P — переключает между открывающей и закрывающей фигурными скобками при редактировании MXML- или AS3- кода. Возможно, это для вас уже и не новость, но вот в Aptana IDE такого шортката нет (а там он еще нужнее при редактировании больших блоков JSON-кода). Ссылка про теме: 10 Eclipse Navigation Shortcuts Every Java Programmer Should Know. |
???????????????? Flex Builder'?? ?????? ???????????????? ?????????????????????? ?? ???????????? ???????? ??????????????????, ?????? ???? Flex Builder ???????????????? ????????????????, ?????????????????????? ?????????????????????????? ?????????? ???????????????????????? ?? ???????????????????????? ???????????????? ?? ????????: ???????????????? ??????, ?????? ?? ???????????????? ?? ????????????????: Ctrl+Shift+P ??? ?????????????????????? ?????????? ?????????????????????? ?? ?????????????????????? ?????????????????? ???????????????? ?????? ???????????????????????????? MXML- ?????? AS3- ????????. ????????????????, ?????? ?????? ?????? ?????? ?? ???? ??????????????, ???? ?????? ?? Aptana IDE ???????????? ???????????????? ?????? (?? ?????? ???? ?????? ???????????? ?????? ???????????????????????????? ?????????????? ???????????? JSON-????????). ???????????? ?????? ????????: 10 Eclipse Navigation Shortcuts Every Java Programmer Should Know. |
2008-12-22 |
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, но:
Разумеется, об удобствах, предоставляемых FlashDevelop, пока можно только мечтать, но мы же пока что говорим о минималистском варианте. К тому же мне пока неясно, возможно ли подключать в обоих плагинах внешние библиотеки. Пока что я вижу только одну возможность: в той же папке, где лежит главный файл проекта (назовем его Елена, спасибо за этот обзор! |
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, ????:
????????????????????, ???? ??????????????????, ?????????????????????????????? FlashDevelop, ???????? ?????????? ???????????? ??????????????, ???? ???? ???? ???????? ?????? ?????????????? ?? ???????????????????????????? ????????????????. ?? ???????? ???? ?????? ???????? ????????????, ???????????????? ???? ???????????????????? ?? ?????????? ???????????????? ?????????????? ????????????????????. ???????? ?????? ?? ???????? ???????????? ???????? ??????????????????????: ?? ?????? ???? ??????????, ?????? ?????????? ?????????????? ???????? ?????????????? (?????????????? ?????? ??????????, ?????????????? ???? ???????? ??????????! |
2008-12-16 |
Кривые Безье. Подбираем движок. 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. Не относится к кривым Безье (точнее их использует в некоторых случаях), но заставляет обратить на себя внимание. Еще немного русскоязычного: Движение по кривой Безье. А вот некий Flashgamer советует задвинуть "a couple good resources" и взяться все же за Degrafa. Ввиду "крупности" этого движка, оставим его на десерт. Поглядим, таки, что нам предлагает наш http://bezier.ru/. Здесь множество документации на русском (что важно), обзорная демка и исходники. Скачать исходники можно при помощи SVN-клиента. - делаем СheckОut. Исходники по большей части представляют собой примеры использования, что конечно радует. В принципе писать тут нечего - сайт полон информации на русском, и если что, здесь же можно написать комментарий и получить ответ от хозяев. Надо просто попробовать. Перейдем к Degrafa. Скачать ее можно на Google Code, но я, пожалуй, воспользуюсь SVN. Пришлось здорово повозиться, чтобы запустить примеры. Итак, вывод. Для себя я избрал три варианта: CubicBezier - вполне работоспособный, примитивный движок позволяющий рисовать кривые Безье с различными параметрами. Его можно сразу использовать "как есть", либо с необходимыми модификациями, которые внести совсем не сложно. Предварительного изучения не требует, для моей задачи подходит "на ура". |
2008-12-09 |
Наш ответ Чемберлену или проблемы сравнения конкурирующих платформ Сегодня в сети появилась статья “Еще одно сравнение Adobe Flash и Silverlight 2″ , прочитав ее я понял главную ошибку авторов этих статей — каждый автор является специалистом только в одной области, или Flash|Flex или Silverlight. Поэтому страдают “конкурирующие платформы”. Как выход я вижу написание совместной статьи (но это дело долгих споров). Автор данной статья не избежал ошибок и показал всое поверхностное знание Flex/Flash технологии. Я попытаюсь исправить его недочеты, для полноты картины ) В начале оговоримся что я не буду в ходе разговора использовать софт который находится в стадии альфа, бетта и пререлиз ). Среда разработки и прочий инструментарий. Для начала разберемся с инструментраем и возможностями: FlashPlayer — это плагин который позволяет проигрывать swf файлы (байт код, который можно создавать где и как угодно, например умельцы рантайм генерят его и сразу же запускают в флешплеере). Использование Flash IDE как средство разработки крупных приложений, довольно опрометчивый шаг. Ее, в контекте разработы RIA лучше использовать как дополнительное средство. Вообще не стоит говорить что вся разработка сводится к связку Flash IDE(графика)-Flex(код) — это просто частный случай варианта разработки.
Ляп! пожалуйста, жмем на кнопку Design в MXML редакторе и видим дизайн вью. (единственно что он не работает в билдере под линукс). Может канечно этот дизайн вью и не такой навороченый как бленд, но он есть ) Язык программирования ActionScript 3 являеться вариантом реализации ECMAScript-262, 4 версии http://en.wikipedia.org/wiki/ECMAScript , Я не буду искать подробности отличая от этого стандарта, они есть и это можно найти воспользовавшись гуглом ).
Да язык часто ругают за его непродвинутость.
но это вот ляп, событийная модель является главной фичей флешплеера 9 и выше.
При разработке крупных проектов боже вас упаси использовать и дебажить во Flash IDE! вы же не будете дебажить в Blend’e Поддержка ОС и браузеров: Возможность упаковки в исполняемый файл: Стоит учитывать что есть продукты сторонних производителей которые позволяют делать испольняемые файлвы из флеш/флекс приложений, причем под разные платформы (например Zinс) Изображения: Видео: Шрифты:
просто глупость.
Раньше (9 и ниже версии плеера) и вправду не позволяли таких операций как вращение, масштабирование (вытягивание по какой-то оси), в 10 плеере вы можете делать с любым шрифтом, что угодно и как угодно. Сокеты: Работа с файлами: Хранение данных на клиенте: Разметка: «Программное» рисование: «Программная» анимация:
Никто не мешает использовать верменные интервалы. т.е. больше возможностей ). Собственные контролы: Кастомизация контролов
Полный бред. Для начала ознакомтесь с возможностями стилировния, затем полистайте примеры на той же Деграфе. Стили во флексе ограничиваются только фантазией, как только она закончилась, так и закончились стили ) Связывание данных
Он то создаеться, но вот доступа мы к нему не имеем. Также есть возможность создать биндинг в коде BindingUtils
В Flex 2|3 это также легко реализуется, как в коде так и с использованием MXML Реализация MVC Вроде пока все, что пришло на ум. Поэтому я бы не спешил делать такие опрометчивые выводы, незная не платформы, и незная текущего состояния вещей. Единственными весомым преимуществами Silverlight является: ЗЫ |
Наш ответ Чемберлену или проблемы сравнения конкурирующих платформ Сегодня в сети появилась статья “Еще одно сравнение Adobe Flash и Silverlight 2″ , прочитав ее я понял главную ошибку авторов этих статей — каждый автор является специалистом только в одной области, или Flash|Flex или Silverlight. Поэтому страдают “конкурирующие платформы”. Как выход я вижу написание совместной статьи (но это дело долгих споров). Автор данной статья не избежал ошибок и показал всое поверхностное знание Flex/Flash технологии. Я попытаюсь исправить его недочеты, для полноты картины ) В начале оговоримся что я не буду в ходе разговора использовать софт который находится в стадии альфа, бетта и пререлиз ). Среда разработки и прочий инструментарий. Для начала разберемся с инструментраем и возможностями: FlashPlayer — это плагин который позволяет проигрывать swf файлы (байт код, который можно создавать где и как угодно, например умельцы рантайм генерят его и сразу же запускают в флешплеере). Использование Flash IDE как средство разработки крупных приложений, довольно опрометчивый шаг. Ее, в контекте разработы RIA лучше использовать как дополнительное средство. Вообще не стоит говорить что вся разработка сводится к связку Flash IDE(графика)-Flex(код) — это просто частный случай варианта разработки.
Ляп! пожалуйста, жмем на кнопку Design в MXML редакторе и видим дизайн вью. (единственно что он не работает в билдере под линукс). Может канечно этот дизайн вью и не такой навороченый как бленд, но он есть ) Язык программирования ActionScript 3 являеться вариантом реализации ECMAScript-262, 4 версии http://en.wikipedia.org/wiki/ECMAScript , Я не буду искать подробности отличая от этого стандарта, они есть и это можно найти воспользовавшись гуглом ).
Да язык часто ругают за его непродвинутость.
но это вот ляп, событийная модель является главной фичей флешплеера 9 и выше.
При разработке крупных проектов боже вас упаси использовать и дебажить во Flash IDE! вы же не будете дебажить в Blend’e Поддержка ОС и браузеров: Возможность упаковки в исполняемый файл: Стоит учитывать что есть продукты сторонних производителей которые позволяют делать испольняемые файлвы из флеш/флекс приложений, причем под разные платформы (например Zinс) Изображения: Видео: Шрифты:
просто глупость.
Раньше (9 и ниже версии плеера) и вправду не позволяли таких операций как вращение, масштабирование (вытягивание по какой-то оси), в 10 плеере вы можете делать с любым шрифтом, что угодно и как угодно. Сокеты: Работа с файлами: Хранение данных на клиенте: Разметка: «Программное» рисование: «Программная» анимация:
Никто не мешает использовать верменные интервалы. т.е. больше возможностей ). Собственные контролы: Кастомизация контролов
Полный бред. Для начала ознакомтесь с возможностями стилировния, затем полистайте примеры на той же Деграфе. Стили во флексе ограничиваются только фантазией, как только она закончилась, так и закончились стили ) Связывание данных
Он то создаеться, но вот доступа мы к нему не имеем. Также есть возможность создать биндинг в коде BindingUtils
В Flex 2|3 это также легко реализуется, как в коде так и с использованием MXML Реализация MVC Вроде пока все, что пришло на ум. Поэтому я бы не спешил делать такие опрометчивые выводы, незная не платформы, и незная текущего состояния вещей. Единственными весомым преимуществами Silverlight является: ЗЫ |
Наш ответ Чемберлену или проблемы сравнения конкурирующих платформ Сегодня в сети появилась статья “Еще одно сравнение Adobe Flash и Silverlight 2″ , прочитав ее я понял главную ошибку авторов этих статей — каждый автор является специалистом только в одной области, или Flash|Flex или Silverlight. Поэтому страдают “конкурирующие платформы”. Как выход я вижу написание совместной статьи (но это дело долгих споров). Автор данной статья не избежал ошибок и показал всое поверхностное знание Flex/Flash технологии. Я попытаюсь исправить его недочеты, для полноты картины ) В начале оговоримся что я не буду в ходе разговора использовать софт который находится в стадии альфа, бетта и пререлиз ). Среда разработки и прочий инструментарий. Для начала разберемся с инструментраем и возможностями: FlashPlayer — это плагин который позволяет проигрывать swf файлы (байт код, который можно создавать где и как угодно, например умельцы рантайм генерят его и сразу же запускают в флешплеере). Использование Flash IDE как средство разработки крупных приложений, довольно опрометчивый шаг. Ее, в контекте разработы RIA лучше использовать как дополнительное средство. Вообще не стоит говорить что вся разработка сводится к связку Flash IDE(графика)-Flex(код) — это просто частный случай варианта разработки.
Ляп! пожалуйста, жмем на кнопку Design в MXML редакторе и видим дизайн вью. (единственно что он не работает в билдере под линукс). Может канечно этот дизайн вью и не такой навороченый как бленд, но он есть ) Язык программирования ActionScript 3 являеться вариантом реализации ECMAScript-262, 4 версии http://en.wikipedia.org/wiki/ECMAScript , Я не буду искать подробности отличая от этого стандарта, они есть и это можно найти воспользовавшись гуглом ).
Да язык часто ругают за его непродвинутость.
но это вот ляп, событийная модель является главной фичей флешплеера 9 и выше.
При разработке крупных проектов боже вас упаси использовать и дебажить во Flash IDE! вы же не будете дебажить в Blend’e Поддержка ОС и браузеров: Возможность упаковки в исполняемый файл: Стоит учитывать что есть продукты сторонних производителей которые позволяют делать испольняемые файлвы из флеш/флекс приложений, причем под разные платформы (например Zinс) Изображения: Видео: Шрифты:
просто глупость.
Раньше (9 и ниже версии плеера) и вправду не позволяли таких операций как вращение, масштабирование (вытягивание по какой-то оси), в 10 плеере вы можете делать с любым шрифтом, что угодно и как угодно. Сокеты: Работа с файлами: Хранение данных на клиенте: Разметка: «Программное» рисование: «Программная» анимация:
Никто не мешает использовать верменные интервалы. т.е. больше возможностей ). Собственные контролы: Кастомизация контролов
Полный бред. Для начала ознакомтесь с возможностями стилировния, затем полистайте примеры на той же Деграфе. Стили во флексе ограничиваются только фантазией, как только она закончилась, так и закончились стили ) Связывание данных
Он то создаеться, но вот доступа мы к нему не имеем. Также есть возможность создать биндинг в коде BindingUtils
В Flex 2|3 это также легко реализуется, как в коде так и с использованием MXML Реализация MVC Вроде пока все, что пришло на ум. Поэтому я бы не спешил делать такие опрометчивые выводы, незная не платформы, и незная текущего состояния вещей. Единственными весомым преимуществами Silverlight является: ЗЫ |
2008-11-18 |
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 |
Катализаторы творческой активности Как мы знаем, сегодня в США открывается Adobe MAX — ключевое событие, касаемое Flash-платформы и RIA-технологий от Adobe. Некоторым из русскоязычных читателей повезет, и они смогут попать на это событие (по крайней мере в декабре в Милане). Ну а остальным неудачникам (к коим я причисляю с полным правом и себя) останется лишь тихонько убить себя апстену. Но это все лирика, а по сути можно сказать, что часть грандиозных новостей, которые готовились к этому событию, уже известны. Перечислю их вкратце:
Вся эта информация доступна в официальном пресс-релизе, посвященном MAX. Также можно прочитать новость в блоге InsideRIA. Хочу еще также заметить, что если есть крупные конкуренты, то все новости обычно ходят парами. Мы это уже замечали при выходе Flash Player 10 на следующий день после выхода Silverlight 2. Сегодня тоже не преминули отметиться сотрудники Microsoft. Скотт Гатри написал в своем весьма авторитетном блоге пост, посвященный Silverlight 3 и не только. Что хочется отметить?
Такие вот новости. А что у вас интересного? |
2008-11-14 |
Начинаем изучать 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 (я их не листал, а те что листал уже не помню и коментировать не буду):
Книги по программированию на Flex 2/3: Learning Flex 3: Getting up to Speed with Rich Internet Applications Flex 3 - A Beginners Guide (McGraw.Hill.Mar.2008) Flex 2 - Programming (OReilly) The Essential Guide to Flex 2 with ActionScript 3.0 | The Essential Guide to Flex 3 (FriendsofED) AdvancED Flex Application Development: Building Rich Media X Flex 3 Cookbook: Code-Recipes, Tips, and Tricks for RIA Developers (OReilly.May.2008) Flex Solutions: Essential Techniques for Flex 2 and 3 Developers (FriendsofED) Foundation Flex for Developers (FriendsofED.Dec.2007) Foundation Flex for Designers (FriendsofED.Jan.2008) Данный список не является полным, книг по Flex 3 гораздо больше. При составлении я использовал только те книги копии которых я смог найти в сети (да простят меня их авторы) Что же читать?Читать нужно документацию от Адоба, она очень хорошая и охватывает практически все аспекты разработки РИА приложений используя Adobe Flex В качестве старта для человека которому неведом мир Flex и ActionScript 3 советую начать изучение с прочтения книг: Также полезно иметь под рукой Flex 3 Cookbook и Flex Solutions: Essential Techniques for Flex 2 and 3 Developers После изучения этих книг, я думаю вы сможете уже сами продолжить свой путь в рядах флексеров! Удачи! |
2008-11-11 |
Кому, зачем и почему нужен 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 в 1998Adobe AIR важен тем, что позволяет создавать настоящие десктоп-приложения усилиями людей, которые до Adobe AIR не могли об этом даже мечтать. Они не имели представления о том, как быстро сделать десктоп-приложение, зато они уже знают языки веба. И как Flash когда-то позволил делать анимацию для сети быстро и просто, так и AIR делает аналогичное для десктопа.Microsoft Silverlight делает похожее: радикально расширяет область производства веб-приложений, упрощая это для тех, кто раньше этого не делал, но имеет опыт в традиционных языках. Таким образом, два мира продолжают взаимное проникновение и обогащение за счет переноса традиций и языков разработки из одной среды в другую. И в Adobe AIR, и в Microsoft Silverlight есть большой и важный смысл — они позволяют двум разным мирам программирования расширяться, а программистам — делать больше интересных проектов для новых сред. |
2008-11-10 |
Две книги по 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
Я, скорее всего, куплю и ту, и другую — для сравнения и не только. Полезными могут оказаться обе. Не стоит скидывать книгу по Flex 2 со счетов. Мой опыт флекс-разработки показывает, что самое важное в изучении Flex — это не код, а базовые принципы построения приложения, архитектура. И если в книге по Flex 2 архитектурные вопросы показаны лучше, чем в книге по Flex 3, то есть смысл в ее прочтении, поскольку архитектура Flex 2-приложения не отличается от арихитектуры приложения Flex 3. Короче говоря, будет хорошо, если эти книги окажутся достаточно разными. |
2008-10-27 |
FlexCamp FAQ Как мы уже писали ранее, 30 октября 2008-го года в Подмосковье состоится очередная встреча Русскоязычной Группы Пользователей Платформы Adobe Flash (Russian Adobe Flash Platform User Group, RAFPUG), которая пройдет в выездном формате. Для тех, кто еще ничего по данному вопросу не решил, предлагается небольшой FAQ. Правильно ли я понимаю, что мероприятие это очень дорогое и платное? Правильно ли я понимаю, что если я флэшер, то мне там попросту неинтересно? Правильно ли я понимаю, что если я не имею отношения к Flash-платформе, то мне лучше не приходить? Правильно ли я понимаю, что добираться придется самостоятельно? Правильно ли я понимаю, что программа мероприятия еще неизвестна?
Уже круто! Но ведь четверг — это рабочий день! Ну вот я думал-думал и решил принять участие. Что мне для этого нужно? Где я могу прочитать дополнительную информацию? Ну, вроде, пока информации достаточно. Пару слов про мой доклад. Как было сказано, его цель — расширить кругозор Flex/Flash-разработчиков. На самом деле у этого доклада есть симметричный собрат, который призван расширить кругозор .NET-разработчиков. И будет он прочитан на следующий день, 31 октября на Silverlight Day в рамках встречи Питерской .NET User Group. Так что желающие могут сходить еще и туда Так что увидимся |
2008-10-14 |
Оказывается, itemRenderer во Flex очень легко использовать , если вы читаете цикл из пяти ясных статей "Рассудочное познание itemRenderer во Flex" в Adobe Flex Developer Center. Автор — Питер Энт из Adobe. Он последовательно излагает жизненно важные концепции и популярные ошибки в использовании рендереров. Познавая цикл рассудком, вы быстро поймете, почему оказался неэффективным метод панического клика, который, увы, многие применяют столь же упорно, сколь и безуспешно — снова и снова (сам не безгрешен, каюсь). Станет ясно, что многие часы, проведенные в попытках заставить строку датагрида светиться зеленым, могли быть минутами пользы и удовольствия, потому что работать с рендерерами действительно легко, как только вы поймете главную мысль: не нужно пытаться управлять рендерером снаружи. Рендерер невозможно удержать в руках. Рендерера не существует, ясно? Только сам рендерер может управлять собой изнутри, основываясь на своих данных (или на данных родительского компонента). Читайте Питера Энта. Понятнее чем он, на эту тему не писали. Итак, все пять частей:
И не только про рендереры узнаете вы много полезного: фактически, этот цикл статей учит сразу нескольким важным концепциям Flex, таким как создание компонентов путем расширения существующих, взяимосвязь между MXML и AS3, почему интерфейсы так важны для работы приложения, как устроены состояния и переходы, и как все же покрасить строку датагрида в зелененький. Кстати, поскольку Питер Энт теперь за Флекс официально не отвечает, самое время прочесть его блог как в некотором смысле завершенный учебник по Flex. |
2008-10-04 |
Поддержка 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 |
Custom chrome в AIR приложении и человеческий фактор Пример приложения использующая исходники можно найти на сайте http://www.graviti.tv/blog/?p=46 (и http://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 |
Eclipse Enterprise IDE Plugin™ для Adobe Flex Builder Как обещал вчера, расскажу о новом 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
Источник: трекер IDE Factory. Ссылки по Enterprise IDE Plugin
Установил, работает. |
2008-08-14 |
Adobe AIR: как поместить окно поверх остальных окон Как известно, технология Adobe AIR позволяет создавать полноценные десктопные приложения и поддерживает эту возможность соответствующими классами и методами. В частности, есть полный набор функций для управления системными окнами: их положением, порядком сортировки и т.д. Например, для того, чтобы установить окно поверх остальных, используется метод Затем я нашел и способ обхода этой неприятности, используя свойство окна <?xml version="1.0" encoding="utf-8"?> Таким образом, все работает! Но меня гложут сомнения: а что если я просто не умею это готовить? Если знаете ответ — подскажите, можно ли обойтись без хака с |
2008-08-13 |
Flex-Mojos. Пример сборки flex modules.ПредисловиеFlex модули на мой взгляд очень интересная и многообразная тема. Кроме разделения функциональности приложения, их можно использовать для загрузки внешних стилей и ресурсов. Если есть задача динамического изменения внешнего вида и языка или уменьшение размера основного приложения. ВведениеВ данной статье я расскажу как собирать приложение которое использует flex modules. Структура проектаДанная структура соответствует принципу один maven модуль один артефакт. Следовательно flex модуль представлен ввиде отдельного maven модуля. flexModulesProject/ Разбор конфигурационных файлов проектана родительский pom проекта, pom библиотеки и корневой pom для flex проектов использование модуля ни как не повлияло. Более подробное описание их структуры можно посмотреть здесь. pom для flexClientXML:
Здесь существенна одна дирректива: XML:
данная строчка создает в maven репозитории xml файл с перечнем всех классов, которые включаются в данный swf. Этот перечень будет использоваться при копмиляции flex модуля. pom для flexModuleRedXML:
следующий код: Code:
исключает классы которые включены в flex-client. здесь: Code:
важно включение библиотеки со scope external. Еще одно замечание, имя flex модуля не должно использовать дефис, в моём проекте это вызвало необъяснимый глюк. Сборока проекта.Для сборки проекта необходимо в корневой библиотеке проекта запустить команду mvn install Развертывание проекта.Строго говоря, в обязанности maven эта задача не входит. После того как проект будет собран, нужно поместить flexModuleRed.swf в одну папку с flexClient.swf. ИсходникиИсходники можно взять отсюда |
2008-07-28 |
Как отбиндить переменную во Flex Недавно Андрей Микитюк задал мне простой вопрос — как отменить биндинг переменной во Flex? Честно говоря, я не смог ему ответить, зато он сам нашел готовый ответ в блоге одного из индийских Flex-евангелистов Raghunath Rao Thricovil, или просто — Raghu. Тем, кто еще не в курсе, напомню: связывание, или биндинг данных (data binding) — одна из мощных фишек Флекса. Фишка в том, что переменная А как отменить связывание переменнных?Оказывается, отменить биндинг довольно просто в AS3 и невозможно в MXML. В AS3 это делается при создании биндинга стандартным образом с помощью методаbindProperty . Этот метод возвращает объект типа ChangeWatcher, который может "наблюдать" (watch) за самим связыванием, реагируя каждый раз при изменении переменной b . Чтобы разорвать связывание, достаточно вызвать на этом объекте-смотрителе метод unwatch() . Вот как это все выглядит в коде, а вот — как это работает.
Вообще, у Raghu весьма полезный блог. |
2008-07-15 |
Flex 4 "Gumbo" увидеть не хотите ли?
На самом деле ряд старых билдов доступны для скачивания (уже недоступны Пока билд еще в пути, я не смог посмотреть на него внимательно. Но доступна документация, которая даже при беглом осмотре дает хорошее представление о том, что изменения не косметические (как между 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 уже появился), а пока читаем дополнительную информацию:
Думаю, что в ближайшее время нас ждет множество интересных материалов по этому поводу! Следите за блогами! |
2008-07-04 |
URAFPUG — программа экскурсий, лекций, докладов и мастер-классов Друзья, вот что нас ждет на каждом дне международной встречи URAFPUG:
Возможны уточнения, изменения и пожелания — желайте! Также будем смотреть, как все пойдет и соответственно адаптировать программу. В следующем посте — куда идти и что делать сразу по приезду на URAFPUG. А ты — зарегистрировался на URAFPUG? |
Сборка простого flex приложения с помощью Flex MojosРазберу как собрать простой проект с помощью Flex Mojos.Начальные условияустановленная java jdk 5 или выше. Стандартная для maven структура проекта project-name/pom.xml………………. конфигурационный файл сборки проекта. Структура pom.xmlpom собирающий flex приложение: XML:
Запуск сборки проекта с помощью mavenДля сборки приложения необходимо набрать в командной строке, Рассмортим pom.xml по частямXML:
тег parent определяет родительский pom, для текущего pom. Следующие теги определяют ваш артефакт в репозитории maven. В дальнейшем вы сможете использовать данный артифакт в других проектах. XML:
Стоит отметить XML:
- определяет тип артифакта, для библиотеки это swc. XML:
тег repositories определяет перечень репозиториев, в которых можно осуществлять поиск артифактов. XML:
тег pluginRepositories определяет перечень репозиториев, в которых можно осуществлять поиск maven плагинов. Полезные дополненияУдаление артефактов осуществляется командой project-name>mvn clean Что ещё может Flex mojos?Компелить SWF, SWC, ASWF, ASWC. Плюсы использования maven для flex сборкиПо моему опыту плюсом является стандартизация структуры проекта. Для того что бы понять что откуда берёться, достаточно посмотреть pom.xml. |
2008-07-03 |
Новый Flex фреймворк - Mate Не так давно вышла публичная альфа версия нового Flex фреймворка Mate. Разработчики говорят о том, что это скорее бета, и к финальному релизу они не планируют вносить существенные изменения. Не секрет, что при использовании событийной модели во Flex, часто разобраться в хитросплетениях происходящих событий бывает не легко. Mate как раз поможет более наглядно организовать ваши события в приложении, причем предлагается использовать для этого mxml. Обработка событий станет более прозрачной. Основной частью и идеей фреймворка является карта событий, которая описывает обработку событий, происходящих в приложении. И приятно, что использование Mate не должно приводить к полной зависимости проекта от него. Этот фреймворк не несет в себе лишний функционал, не придется вносить существенные изменения в архитектуру, а просто станет удобнее работать с обработкой событий, ну и уменьшится связанность, за счет применения injectors. Из минусов я заметила то, что используя Mate, далеко не все можно проверить на этапе компиляции, что может приводить к эксепшенам в рантайме. Однако идея мне очень нравится и в целом фреймворк выглядит многообещающе. |
2008-07-02 |
URAFPUG — доклады, лекции и презентации встречи в Крыму С точки зрения флэш-разработчика, все презентации, доклады и лекции международной встречи URAFPUG, проходящей в рамках Южной конференции разработчиков ITSea, можно разбить на две части: флэшовые и не только. Начнем с флэшовых и флексовых:
Чтобы прочесть доклад по Alternativa3D, к нам на встречу едет ее разработчик Антон Волков, который также планирует провести по ней пару мастер-классов и ответить на вопросы. Также к нам мечтает присоединиться представитель компании Adobe, чтобы сказать пару слов :-) Список докладов дополняется; порядок изложения уточняется. Если вы хотите прочесть свой доклад на этом мероприятии — пишите мне, и все получится! Напоминаю детали проезда на встречу URAFPUG, а также о ее культурной программе. |
2008-06-17 |
Яндекс приглашает разработчика приложений на ActionScript Открыта вакансия Flash-разработчика в Яндексе, Москва. Мы хотели бы, чтобы у Вас были: Хорошо, если у Вас так же есть: Мы предлагаем: Резюме и вопросы можно прислать на vbryzgalina@yandex-team.ru. |
2008-06-06 |
Один ItemRenderer для нескольких колонок Столкнулся с задачей отображения в DataGrid одинаковых по сути данных (UNIX_TIMESTAMP), к которым нужно применить ItemRenderer так, чтобы последний знал к какой колонке он применяется. Я нашел два способа это сделать и оба связаны с использованием свойства listData. Свойство listData имеют такие элементы как Text, Label, Button, CheckBox и т.п., то есть те, которые имплементируют интерфейс IDropInListItemRenderer. В данном случае в качестве ItemRenderer мне достаточно использовать Label. Если же необходим какой-нибудь контейнер в качестве рендерера, который не имеет свойства listData по-умолчанию, его необходимо реализовать своими силами. Итак, первый способ - это назначать данные для рендерера в зависимости от индекса колонки таблицы. Приведу кусок кода:
Здесь мы обращаемся к listData, кастим его к DataGridListData, получаем индекс колонки таблицы и в зависимости от индекса отображаем в колонках date1 или date2. Недостатком этого способа является то, что при добавлении новых колонок перед этими придется переделывать код рендерера и также нельзя перетаскивать колонки. Поэтому рассмотрим второй способ.
В данном случае мы обращаемся не к columnIndex, а к dataField, таким образом получая строку, в которой содержится название поля, из которого мы получаем данные. А с помощью data[myListData.dataField] мы получаем значение этого поля. |
Один ItemRenderer для нескольких колонок Столкнулся с задачей отображения в DataGrid одинаковых по сути данных (UNIX_TIMESTAMP), к которым нужно применить ItemRenderer так, чтобы последний знал к какой колонке он применяется. Я нашел два способа это сделать и оба связаны с использованием свойства listData. Свойство listData имеют такие элементы как Text, Label, Button, CheckBox и т.п., то есть те, которые имплементируют интерфейс IDropInListItemRenderer. В данном случае в качестве ItemRenderer мне достаточно использовать Label. Если же необходим какой-нибудь контейнер в качестве рендерера, который не имеет свойства listData по-умолчанию, его необходимо реализовать своими силами. Итак, первый способ - это назначать данные для рендерера в зависимости от индекса колонки таблицы. Приведу кусок кода:
Здесь мы обращаемся к listData, кастим его к DataGridListData, получаем индекс колонки таблицы и в зависимости от индекса отображаем в колонках date1 или date2. Недостатком этого способа является то, что при добавлении новых колонок перед этими придется переделывать код рендерера и также нельзя перетаскивать колонки. Поэтому рассмотрим второй способ.
В данном случае мы обращаемся не к columnIndex, а к dataField, таким образом получая строку, в которой содержится название поля, из которого мы получаем данные. А с помощью data[myListData.dataField] мы получаем значение этого поля. |
2008-05-23 |
Хороший стиль Flex-программирования. Использование языка программирования Продолжаем обозревать статью Flex SDK coding conventions and best practices. Следующий подраздел: Language Usage. Использование языка программирования Здесь будут рассмотрены вопросы использования языковых конструкций ActionScript 3. Особое внимание мы уделим ситуацям, когда для выражения одной идеи существует несколько способов. Параметры компиляции Компилируйте проекты с параметрами API, базирующиеся на свойствах Старайтесь применять API, которые базируются на свойствах а не на методах. Такой способ наиболее подходит для декларативного стиля программирования MXML. Объявление типа Указывайте типы для каждой константы, каждой переменной, каждого аргумента функции и ее результата. Даже если они не имеют типа, указывайте ":*": Например: Используйте наиболее подходящий для конкретной ситуации тип. Например, переменную цикла "for" лучше объявлять типом int а не Number, и, конечно, не Object или *. Другой пример: в mouseDownHandler необходимо объявить аргумент в виде Используйте тип int для работы с целыми числами, даже если предполагается, что они будут только положительными. Тип uint используйте только для значений цветов RGB, битовых масок и в других значений, не предназначенных для вычислений. Используйте тип * только в случае, если значение переменной может быть undefined. Но лучше всегда использовать вместо * тип Object, значение которого равно null, в случае, если объект не существует. Если вы объявляете переменную типа Array, добавляйте комментарий Например: Литералы undefined int и uint В шестнадцатиричных числах всегда используйте "x" в нижнем регистре: Всегда указывайте RGB-цвета в виде шестизначного шестнадцатиричного числа: При работе с индексами (например указатель на элемент в массиве), всегда используйте "-1" для обозначения отсутствия индекса. Number Но исключение для этого правила составляют пиксельные координаты, которые условно целые, хотя, в принципе, могут быть и дробными: При использовании знака экспоненты, применяйте "e" в нижнем регистре: Для Number используйте значение по умолчанию NaN - "не установлено". String При использовании escape-последовательностей, спецсимвол "\u" указывайте в нижнем регистре: Array Используйте конструктор массива Object можно: {}, o = { a: 1, b: 2, c: 3 };
При использовании литерала функции, обязательно указывайте возвращаемый тип, а последний оператор в теле функции заканчивайте символом точки с запятой ";":
Используйте только двойные кавычки для определения значений аттрибутов тегов XML: Class нельзя: Но в этом случае можно:
Круглые скобки Для остальных операторов, правила приоритета запомнить сложнее, поэтому в этом случае круглые скобки лучше использовать. Приведение типов Явно приводите к типу Boolean переменные типа int, uint, Number или String: Переменные типа Object можно приводить к типу Boolean неявно: Лучше использовать приведение к типу (кастинг), чем оператор "as". Оператор "as" используйте только в том случае, если при ошибке приведения к типу, вы хотите получить в результате значение "null", а не генерацию исключения: Сравнение Операторы ++ и --
Однако, нельзя использовать вложенные тернарные операторы в сложных логических цепочках: Оператор new
Операторы Всегда ставьте после операторов точку с запятой ";". ActionScript 3 не считает за ошибку отсутствие точки с запятой в конце оператора, но лучше не пользоваться этой особенностью: Директива include Всегда используйте относительные пути вместо абсолютных. Директива import Директива use namespace Оператор if Однако, если одна из ветвей содержит более одного оператора, заключайте в блоки все ветви: Если требуется проверка большого количества ошибок, используйте последовательность операторов if, которые осуществляют проверку и при ошибке, сразу возвращают результат и выходят из метода. При этом, поток выполнения проверки движется по странице вниз. В конце метода ставится возврат результата успешного прохождения проверки. Оператор for Используйте для хранения верхнего предела цикла локальную переменную. Это очень важно, поскольку верхний предел пересчитывается на каждой итерации цикла. Конечно, это не распространяется на те случаи, когда пересчет предела цикла необходим: Определяйте переменную цикла внутри круглых скобок оператора цикла, если она не определяется где-либо повторно:
Вызов оператора return разрешается из любого места тела метода.
Объявления Никогда не объединяйте несколько констант/переменных в одно объявление:
Перед тем, как объявить какой-либо API как public или protected, как следует подумайте, действительно ли это нужно. Public и protected API нужно документировать в обязательном порядке. Кроме того, они должны поддерживаться в нескольких последующих релизах, прежде чем станут формально устаревшими.
Объявляйте все классы-каталоги ("enum classes") как final.
Объявляйте локальные переменные в функции только один раз. ActionScript 3 не поддерживает объявление локальных переменных с областью видимости в одном блоке:
The only “bare statements” in a class should be calls to static class initialization methods, such as loadResources(). (Совсем ничего не понял в этой фразе).
Если в конструктор передаются аргументы, давайте им имена переменных, которым они передаются. Не инициализируйте переменные класса в конструкторе. Делайте это при объявлении переменных. Это разрешается только в том случае, когда в наследуемых классах требуется переустановить значения переменных.
Послесловие Далее перечислены темы, которые еще не в разработке:
Будем иногда заглядывать СЮДА и следить за продолжением. Правила, конечно, порой спорные. Еще пример - избавляться от лишних круглых скобок в вычислениях и логических выражениях. Не сильно я согласен с таким заявлением. Вообще, код лучше читается, когда он поделен на блоки. При многочисленных делениях и умножениях трудно будет потом разобраться что на что делется и множится... То же самое в логических выражениях. Остальное, в принципе, вполне законно и приемлемо. |
2008-05-21 |
UAFPUG#2, Мой доклад. Призенташка (в плане информативности не особо полезная, но полистать можно) Презентация не содержит всехпунктов по которым я сравнивал IDE, но у меня есть маленька табличка которая содежит список фич и плюшек, и как их поддерживает та или иная ИДЕ. Из всего доклада я хочу осветить предпоследний слайд, он содержит кратенькие выводы
пояснения про FlexBuilder и FDT я уже дал,
добавлю лишь, что FlexBuilder медленно и верно движется в правильном направлении и у него есть все шансы! FlashDevelop — малыш, его я так назвал потому, что он фактичеки не является средой разработки — это продвинутый блокнот с кучей удобных и полезных фич. Если делать маленький проект и одному, то его можно использовать если что-то больше то комфортнее использовать FlexBuilder или FDT. IDEA — сырой монстр. IDEA известна свои удобством среди ява(и не только) программистов. В данный момент в версии 7.0.3 поддержка flex разработки очень сырая, много мелких неприятных глюков, но разработчики IDEA их фиксят. Вобщем когда “доварят” нашего монстра, то будет видно. И еще меня волнует позиционировние самой разработки флекс проектов в IDEA — она позиционируются как дополнительная фича, т.е. существует вероятность, что поддержка флекса будет уходить на второй план по сравнению с явой(можете попробовать разубедить меня). И еще один кирпич в огород IDEA — сложноватенько, человек который придет из мира флеша будет долго въезжать во все ньансы этого “монстра”. Всех благ вам и удачного кода влюбой из ИДЕ:) |
Хороший стиль Flex-программирования. Именование Хочется кодить лучше, правильнее, грамотнее, понятнее, по правилам, ... и чтобы не было стыдно кому-нибудь показать. Adobe любит нас, и создал для нас небольшой свод правил, который поможет не только лучше понимать Flex SDK, но и нам самим сделать свой код лучше. Flex SDK coding conventions and best practices Итак, сегодня мы поговорим об именовании (Naming). Именование Наши стандарты именования соответствуют стандартам ECMAScript и Flash Player 9. Использование сокращений Вообще, лучше их избегать. Например: Потому что ясность кода гораздо важнее чем минимизация количества нажимаемых клавиш. Важнее не только для нас самих, но и для тех, кому придется работать с нашим кодом. Однако, есть общепринятые сокращения: Существуют и другие сокращения. Если мы не догадаемся об их смысле, придется поискать их применение в исходном коде. Или подумать еще разок. Иногда можно встретить отсутствие логики в применении сокращений. Например, horizontalScrollPolicy и verticalScrollPolicy, но HBox и VBox. Использование аббревиатур Аббревиатуры довольно часто используются во Flex: AIR, CSS, HLOC, IME, MX, MXML, RPC, RSL, SWF, UI, UID, URL, WSDL, XML. Аббревиатуры всегда пишутся либо заглавными, либо строчными буквами: Строчные буквы используются только в том случае, когда весь идентификатор именуется аббревиатурой, либо идентификатор начинается с аббревиатуры и он должен начинаться со строчной буквы. Например: Разделение слов Когда идентификатор состоит из двух или более слов, используется два метода разделения слов: В некоторых местах может встретиться нарушение этого правила: комбинация слов становится целым словом: dropdown, popUp, pulldown. Имена, содержащие тип Если в имени нужно указать тип, поместите его, не сокращая, в конец имени. Откажитесь от использования суффиксов типа "_mc" по старой традиции ActionScript 1. Например: Часто лучшим именем для объекта является имя его типа в отличающемся регистре (не соглашусь, т.к. смысловой нагрузки никакой - годится только для тестов и примеров): Имена пакетов Начинаются со строчной буквы и для разделения слов используется регистр: controls, listClasses. Имена пакетов должны быть всегда существительными или отглагольными -ing формами (герундий), но не глаголами, прилагательными или наречиями. Пакет, включающий множество схожих элементов должен именоваться общим названием этих элементов во множественной форме: charts, collections, containers, controls, effects, events ... Обычно, -ing формами именуются пакеты, реализующие концепции (я бы сказал процессы): binding, logging, messaging, printing ... Пакет, содержащий классы, которые обеспечивают работу компонента 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. Имена событий Начинаются со строчной буквы, разделение слов в имени осуществляется регистром: move, creationComplete. Имена стилей Начинаются со строчной буквы, разделение слов в имени осуществляется регистром: color, fontSize. Значения строковых свойств Начинаются со строчной буквы, разделение слов в имени осуществляется регистром: "auto", "filesOnly". Имена констант Именуются полностью заглавными буквами с разделением символом подчеркивания: OFF, DEFAULT_WIDTH. Если константа строковая, слова в имени константы должны соответствовать словам в строке ее значения:
Начинаются со строчной буквы, разделение слов в имени осуществляется регистром: i, width, numChildren. Используйте "i" для имени переменной цикла "for", и "n" для имени верхнего предела цикла.Используйте "j" для имени переменной вложенного цикла "for", и "m" для его имени верхнего предела цикла: for (var i:int = 0; i < n; i++) Используйте "p" для имени переменной цикла "for..in": Бывают ситуации, когда в классе необходимо переопределить установщик, но предполагается, что базовый установщик будет продолжать использования. Для сохранения базового установщика, необходимо создать новый установщик, имя которого должно формироваться путем добавления к имени базового установщика символа "$". Полученный установщик нужно определить как "final". Он не должен ничего делать, кроме вызова базового установщика. Напимер, нам нужно перекрыть установщик numChildren, но при этом сохранить возможность вызывать базовый super.numChildren - для последнего мы создаем следующее: Переменные для хранения данных установщиков К имени установщика добавляется символ подчеркивания "_":
Начинаются со строчной буквы, разделение слов в имени осуществляется регистром: measure(), updateDisplayList(). Имена методов должны быть всегда глаголами. Лучше не использовать методы без параметров подобно getFooBar() или setFooBar(). Вместо них используйте установщики. Однако, если getFooBar() - медленный метод, требующий больших вычислений, лучше его назвать findFooBar(), calculateFooBar(), determineFooBar(), и т.д., выражая его суть, а не то, что он способен возвращать что-либо. Аналогично установщикам, если базовый метод перекрывается, но требуется сохраненить доступ к нему, создается метод с именем базового метода, перед которым добавляется символ "$":
Имя обработчика события формируется путем добавления к имени типа события слова "Handler": mouseDownHandler(). Если обработчик предназначен для событий, отправленных субкомпонентами (т.е. не this), перед именем обработчика, сформированного по вышеописанному правилу, добавляется имя субкомпонента, отделенное символом подчеркивания "_": textInput_focusInHandler().
Всегда используйте для установщиков имя аргумента "value": Всегда используйте для обработчиков событий имя аргумента "event":
Если пакет рессурсов содержит ресурсы для определенного пакета классов, имя пакета рессурсов должно быть таким же: controls, {formatters}}, validators.
Начинаются со строчной буквы, разделение слов в имени осуществляется регистром: pm, dayNamesShort.
Избегайте использование слова "object", т.к. оно вносит неопределенность. Слово "item" - элемент данных и никогда DisplayObject. Слово "renderer" - это DisplayObject, который отображает элемент данных. Слово "type" означает тип AS3, используйте вместо него слово "kind".
С именованием разобрались. Теперь попытаемся придерживатся этих правил на практике. У меня есть много своих правил именования, и скорее всего часть из них я оставлю (например именовать private-свойства с префиксом в два подчеркивания, а protected-в одно), но правила, принципиально идущие вразрез с вышеприведенными надо искоренять. Следующий раздел "Language Usage" разберем в ближайшее время. |
2008-05-20 |
Flex framework — это не только ценный мех, но еще и 120-150K полезного кода! Сенсация, сенсация, срочно в номер! Я знаю как уменьшить размер с 150 до 130 кб для флекс 3 приложения! Теперь более осмысленые слова: Многие жалуются, что флекс приложения имеют большой размер, и это в принципе так, 120-150 килобайт кода это не мало. Часто звучит вопрос как уменьшить размер получаемого кода. Давайте для начала разберемся, что нам дается с этим кодом?
Согласитесь, что это совсем немало для для каких-то 120(150) килобайт кода! Если вы считаете, что тут много лишнего, то подумайте правильно ли выбрали среду разработки для вашего проекта, может все таки использовать Flash CS3 или голые AS3 проекты?
Я лично готов пожертвовать размером ради удобства и скорости разработки. Количество “динозавров” с модемами по 56кбит/с уже очень мало, стоимость мегабайта трафика уже не космическая, и задайтесь вопросом “нужно ли мое приложение всем?”, мой ответ: “кому оно нужно у того явно нет проблемы с интернетом!” На последок открою тайну про уменьшение размера приложения. Каждый должен знать, что приложение по умолчанию компилится в дебаг версию поэтому для релиз версии незабудь воспользоваться Project |
2008-05-15 |
Делаем прелоадер для Flex-приложения. Продолжение. AS3 Поиск привел к статейке: Making a Cooler Preloader in Flex: Part 1 of 3. Доступно, с примерами раскрывается процесс создания собственного прелоадера для Flex-приложения. Пожалуй, выделю основные положения, опустив приступы остроумия автора :). Введение. Для создания собственного прелоадера для Flex, необходимо всего два шага:
Или подробнее:
Создание 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: Важное добавление в комментариях: В коде обработчика onDoneAnimating необходимо отписаться от всех событий, на которые подписался класс прелоадера. Пример и исходники прилагаются: Example Source ZIP. Попробуем, как это работает на практике. * * * Попробовал. Работает. Но пришлось убить часа два на следующую проблему: В примере в главном клипе скрипт устанавливается во фрейм 21. Я создал клип с таймлайном в 21 фрейм. Не заработало. Скачал пример: Download Preloader FLA. Заработало. Подменил своим - не заработало (клип крутится по кругу, но не стартует скрипт). В итоге, выяснилось, что необходимо добавить еще один фрейм. То есть временная шкала должна содержать не менее 22 фреймов. Причина - фреймы в параметрах метода нумеруются с нуля (источник). * * * Выяснилось, что не обязательно использовать версию Flash8 AS2. Можно указать и Flash 9 с AS3. Однако как ни крути, скрипты из тайм-лайна вызываться не будут. В целях снижения объема SWF-файла лучше всеже использовать более старые версии - лучший результат показал Flash 6/7 AS1/AS2, но не намного. * * * Еще одна важная фича - фон приложения на этапе предзагрузки. Живой Flex подсказывает нам, что это можно сделать двумя путями:
|
2008-05-14 |
UAFPUG#2, вторые впечатления. Итоги, общие выводы и результаты можно посмотреть/почитать у Роста (1 , 2 , 3), у Романа, у Валерии и Сергея. Из этих постов становится понятным, что все удалось отлично). Лучше я поделюсь своими мыслями и ошибками, которые образовались в процессе подготовки и рассказа доклада (Сравнение средств разработки: FDT, FlashDevelop, IDEA, FlexBuilder. Возможности, недостатки, перспективы., http://fpug.org.ua/meeting2) : В процессе подготовки доклада я понял, что пытался втиснуть в небольшой доклад(всего 2 часа :)) очень много информации. Хотелось обо всем рассказать много и подробно, а получилось все в общем. Каждая из ИДЕ достойна одного и более докладов описывающих все удобства, фичи, ньюансы работы с ней. Еще желательно запустить и показать на большом экране как настроить и куда нажимать, чтобы получить нужный результат. Вывод: нужно более трезво оценивать масштабы доклада Незнаю как оценили мой доклад слушатели (Рост, ты обещал сделать оценивалку )), но мне кажется я местами налажал, позабывал сказать некоторые обязательные вещи и просто затянул свой доклад, из-за чего подвел Романа — он не успел рассказать вtсь доклад(. А еще я сильно много говорил слов паразитов, невнятных фраз и спорил со слушателями. Вывод: нужно лучше готовится, делать меньше паузы между словами, исключить из речи слова паразиты и больше спорить со слушателями ) По самому докладу:
Это относится ко мне на 110%. Но прошу меня извенить очень много информации и нужно привести ее в более удобоваримый вид). Особо нетерпеливым скажу основные выводы:
Основной доклад приводится в порядок, не пройдет и года как он выйдет в свет |
2008-05-01 |
Data Binding во Flex. Часть 1. Немного общих слов и истории Это первая часть моего рассказа про Data Binding во Flex, который живьем можно было послушать на 12-ого апреля 2008 года на питерской встрече Russian Adobe Flash Platform User Group. Презентация рассчитана на мой сопутствующий рассказ, поэтому некоторые слайды можно неправильно воспринять без объяснений. Отчасти поэтому я и пишу небольшой цикл постов по этой теме. Хотя главная причина в том, что тема эта очень интересная, и хочется говорить об этом снова и снова. Data Binding (связывание данных) можно назвать одной из основ разработки на Flex. Поэтому каждый уважающий себя разработчик прямо таки обязан в совершенстве владеть этим интересным и полезны механизмом. Если вы разрабатываете на Flex, то, скорее всего, регулярно используете data binding. Особенно органично его использование в mxml. Вообще говоря, надо сильно извратиться, чтобы, используя mxml, ни разу не использовать data binding или связывание данных. Data binding во Flash Еще более интересен тот факт, что Flash CS3 уже не предоставляет возможностей связывания данных своим разработчикам. Видимо, это очередной намек Adobe на то, что программистам надо смотреть в сторону Flex. Что же такое связывание данных или data binding? Наиболее распространенный случай - это синхронизация model и view. Вам выбирать, что синхронизировать. Это может быть синхронизация данных, различных элементов GUI и тд и тп. В качестве примера синхронизации элементов GUI можно привести такой код: Code:
Всего несколько строк кода позволяют определить сразу три синхронизации:
|
2008-04-30 |
Программирование под флэш платформу. Cтатья (местами спорная) Все, с чем я не согласен в статье "Программирование под флэш платформу", я уже сказал ее автору. Он кое-что изменил. Я продолжаю не соглашаться со многими высказанными в статье мыслями, и при этом считаю ее очень полезной. И мне очень интересно: а что вы скажете вы на такие слова: "Лично для себя я не вижу особой пользы от MXML, с тем же успехом можно генерировать и ActionScript-код из режима дизайнера". Я подозреваю, что не только автор этой статьи так считает. А может быть, он по-своему прав? В общем, читайте: "Программирование под флэш платформу" от Yzh (о нем). |
2008-04-29 |
Плюшки для Flex Builder На InsideRIA появилась интересная статья о том как можно сделать работу в Flex Builder более комфортной. Переводить я ее не буду) — просто расскажу, что думаю: Snippets Mylyn полезная штука я о ней уже упоминал. Но есть некоторые «фичи» использования ее во флекс билдере: |
2008-04-01 |
Мысли по поводу будущего 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 |
Тезисы докладов на питерской встрече RAFPUG в День Космонавтики
Итак, начнем-с. Data Binding. Связывание данных во Flex 2
Жизненный цикл компонент во Flex (Component Lifecycle Overview)Павел “Vertex” Кожин.
Разработка приложения с использованием технологий Flex, BlazeDS, Spring, Hibernate
Как видите, скучно не будет. Итак, кто еще в сомнениях, может регистрироваться на мероприятие. Информация по регистрации тут или на страничке группы. |
2008-03-29 |
Первый законченый проект на 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). И сделать это так - сначала сверстать все элементы приложения в базовом состоянии, а потом создать ряд состояний для каждого этапа работы приложения, в которых скрывать/открывать и трансформировать элементы. При верстке проблем не возникло. Очень напоминает верстку сайтов. При помощи стилей можно творить чудеса - использовать скины даже не потребовалось. Всё необходимое было сверстано совсем без затыков за один-два дня. Впечатления самые положительные. Параллельно, моим коллегой готовилась флэшка с картой. Клип с картой подгружается компонентом Затем, после отладки навигации по состояниям (которые пока сменялись резкими переходами без анимации), настало время наложить эффекты появления и трансформации элементов. При анимировании появления/скрытия, я столкнулся с ситуацией, изложенной ниже. До конца контролировать ситуацию на получилось, но компромиссное решение было найдено. Зашивание проекта в Zinc особых трудностей не составило. Zinc спокойно интегрируется во Flex-проект. Использовались основные объекты глобального класса В итоге, хочется сказать, что проект завершился успешно. Скорость разработки на 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 Пришлось повозиться с эффектом По началу я предположил, что если я создам эффекты Fade (один для появления и другой для скрытия) и укажу его для некоторых компонентов в стилях showEffect и hideEffect, то при смене состояния, при изменении свойства visible, компоненты будут плавно появляться/исчезать. Как бы не так. При формировании состояния, выполняются (тупо, без каких либо перепроверок и оптимизаций) все действия - начиная с базовых состояний. Если в базовом состоянии visible устанавливается в false, а в текущем, базирующемся на нем, в true, то будет выполнено два действия со всеми вытекающими последствиями. Если Fade-скрытие еще не успело завершится, а уже вызывается Fade-появление, то последнее будет просто проигнорировано. Короче - полный разлад и совсем не адекватный результат. То же самое относится и к другим видам эффектов. Для анимации такого рода необходим другой прием. При использовании Маскирование контента SWFLoader Проблема связана со следующей особенностью. Клип интерактивной карты в процессе работы приложения может трансформироваться (трансформируемый клип расположен в главном таймлайне загружаемой флэшки). Но он должен отображаться в строго отведенной прямоугольной области. Казалось бы, чего проще - поместить его в Box, у которого Пришлось накладывать маску программно, высчитывая координаты и размер области. Воспроизведение FLV В самом конце столкнулись со следующей проблемой. Презентация начинается с видео-заставки. Заставка - файл FLV, который подгружается в К сожалению, FLV нельзя внедрить посредством |
2008-03-28 |
Exception Seminar #08 - Flash, Flex, AS3, MXML R00z уже начал просачивать инфу в чат UAFPUG, так что придется колоться: "Exception Seminar #08 — про Flex, ActionScript и MXML". Об этом мероприятии пишут: Уважаемые коллеги! Начиная с этого момента, мы расширяем область деятельности и добавляем в свой список динамический язык программирования ActionScript, который применяется во Flash-приложениях и используется в прогрессивной технологии веб-приложений нового поколения Adobe Flex. Ведутся переговоры... :) |
2008-03-27 |
FDT 3.0 Enterprise или разочарование сезона Вчера была выпущен в свет FDT 3.0 Enterprise. Подробности можно посмотреть на сайте производителя. Для меня данный релиз стал разочарованием сезона. В данной версии отсутствует редактор MXML кода, хотя его обещали. В добавленные плюшки входят лиш :
Дебагер это конешно хорошо, но это все только для Flash|ActionScript проектов. А расстроился я потому, что мне, как флекс разработчику эта тулза совсем бесполезна. А учитывая ее стоимость (599 евро|1012 долларов США|4542 гривен| 24106 рублей) становиться совсем печально(. Незнаю чем они думаю, но я останусь верен флекс билдеру, надеясь что адоб таки соизволит позаботиться об удобстве разработчиков, а не создании разной функциональности для галочки. И вообще дайте мне команду вменяемых ява-девелоперов (этак человек 5-8), денег и через год я переверну это мир! Или просто небольшой институт по исследованию центральной нервной системы человека и я создам матрицу. |
2008-03-25 |
Восстановления объектов определенного класса из SharedObject Константин Ковалев предложил более простой и изящный вариант решения проблемы затронутой мною в предыдущем посте. Code:
и код класса
|
2008-03-24 |
Использование registerClassAlias для восстановления объектов определенного класса из SharedObject Продолжу тему затронутую Александром Гаховым в статье “Клонирование объектов утилитой ObjectUtil.copy". Code:
Собственно сам класс нашего объекта.
Прошу прощения за подобное отображение mxml-ины. Если пример вас заинтересует скопируйте его. |
2008-03-18 |
OpenDialect 0.1.0 Появилась первая публичная версия OpenDialect - опенсорсной IDE для Flex-разработки, написаннной на C#. На данный момент работает под Windows, в ближайшее время будет портирована под Mono, т е станет работоспособна под Linux и OS X. После скачивания дистрибутива размером в 21 мегабайт и его установки обнаруживаем слегка странно выглядящий таймлайн и поле с Flex-компонентами, а также редактор mxml-кода(подстветки кода не обнаружено). Производит впечатление очень ранней альфы. Информация о проекте - здесь. |
Как открыть ссылку, заданную в 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 |
Как самому отлавливать биндабл значения простым способом Сегодня мне задали вопрос:
Я не забыл ответить сразу и человек ушел в оффлан. Думаю этот пример будет полезен всем ). <?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 |
FDT 3.0 Enterprise beta 29 февраля для публичного тестирования была выложена бета-версия FDT 3.0 Enterprise. Из заявленных нововведений: встроенный дебаггер, с возможностью расставлять брейк-поинты, и улучшенный рефакторинг кода. MXML не поддерживается. Ссылка для установки-обновления: http://fdt.powerflasher.com/update_beta/. Если вы уже используете лицензионную версию FDT 3.0, то устанавливайте пробную версию в отдельную копию Eclipse. |
2008-02-21 |
Метапрограммирование во 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. А чтобы они вместе со встроенными мета-данными попали в откомпилированное приложение, нужно указать их в опции компилятора Примеры использования собственных метаданных во FlexОткрываются возможности, осознать которые — целая отдельная задача. Есть примеры. Вот Кристоф Конрац показывает, как упростить общение с базой данных. С помощью собственных мета-данных он описывает структуру таблицы БД в своем ActionScript-классе. Затем показывает, как просто можно работать с описанной в мета-данных таблицей БД, не используя никакого SQL — только ActionScript.Вот более свежие примеры от Эли Гринфилда, демонстрирующие, как с помощью собственных мета-данных можно вызывать функцию при каждом изменении некоего AS-выражения, или как создавать одно- и дву-направленные связывания между частями вашего компонента, или как в декларативном стиле назначить обработчик события части вашего компонента (online demo). И Кристоф, и Эли предоставляют исходники к своим экспериментам (не очень сложные). |
2008-02-19 |
Не так страшен Флекс, как его малютки :) Сегодня в Skype-чате UAFPUG прозвучала фраза флэш-разработчика Олега Галабурды: Собсна, я в этом месте меняю своё мнение про Флекс, а точнее про представление MXML -> AS3. :) Итого - Флекс не так уж и страшен, как его малюют, но отгребать рискую долго. Этот эффект вызвало прочтение короткой статьи "Flex для Флэшеров" и пара фраз в чате! |
2008-02-07 |
IntelliJ IDEA как инструмент разработки Flex-приложений 5 февраля 2008 г. в блоге JetBrains IDEA был анонсирован выход новой версии редактора IDEA 7.0.3 с продвинутой поддержкой Flex-приложений. Участники предрелизной программы JetBrains, "Early Access Program" (EAP) уже могут это попробовать:
Хотите проверить, как это работает? Вот ссылки:
Не секрет, что IDEA высоко ценится Java-разработчиками за ее превосходное качество. Многие просто называют ее лучшей. "Most Intelligent" — называеют ее авторы. Поддержку Flex в IDEA хотим и ждем давно. Похоже, разработчики из JetBrains решают эту задачу на "отлично". Но — кто уже пробовал эти новые возможности? Что скажете? |
2008-02-06 |
Событие от компонентов 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 |
Параметры конструктора. MXML Определяя класс для последующей его вставки в MXML, при объявлении конструктора, необходимо указать для всех его параметров значения по умолчанию. Иначе возникает ошибка "1136: Incorrect number of arguments. ". Других способов избежать ошибки я не нашел. |
2008-02-04 |
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 |
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); |
Использование embed изображений в стилях Путь скинизации посредством css тернист и многотруден. Особенно если каждый стиль требуют собственных скинов для виджетов (иконок, кнопок и т.д). Предположим нам надо подгрузить картинку. Для примера создадим класс наследованный от UIComponent и требующий подгрузки картинки описанной в css. Назовем класс Example.as.
И после компиляции картинку благополучно не видим. Почему? Потому, что по умолчанию ее размеры составляют 0 x 0. Для того чтобы она отобразилась корректно требуется задать ей реальные размеры, каковые нам любезно предоставляют свойства measuredWidth и measuredHeight. Однако не следует забывать, что актуальные значения ширины и высоты будут доступны только после вызова (автоматического) метода protected function measure(): void UIComponent, о котором доступна подробная информация в хелпе. Ну и собственно результат:
Следует отметить, что подобных проблем с размерами не возникает в mxml-e. |
2008-01-29 |
Тег [Bindable]. Flex Если нам необходимо связать два свойства так, чтобы при изменении первого (источника) Flex автоматически копировал данные во второе (приемник), мы можем использовать метатег [Bindable]. Указав [Bindable] перед свойством-источником, мы даем понять Flex, что при изменении свойства надо генерировать событие. [Bindable] Если событие не указано явно, то по умолчанию создается событие propertyChange. Тег [Bindable] используется в трех случаях:
ВАЖНО: Если после изменения, свойство не приобрело новое значение, Flex не генерирует событие. Проверка осуществляется по принципу ВАЖНО: Если свойство содержит ссылку на объект и эта ссылка заменяется на другую, то событие генерируется. Если же изменяется объект, на который ссылается свойство, событие генерироваться не будет. Свойства 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 |
Фокус на кастомном Flex-компоненте Внедряется кастомный компонент, в котором задействована клавиатура. После того, как последовательность интерфейсов доходит до экрана с этим компонентом, он активируется. Но не принимает события от клавиатуры. Необходимо установить на него фокус: Либо добавить в параметры MXML-тега: creationComplete="setFocus();" Либо инициализировать в скрипте: this.[component_name.]setFocus();
|
2008-01-25 |
Ожидаем выход FDT 3.0 Enterprise Как стало известно, мы скоро сможем познакомится с Enterprise-версией FDT 3.0 - популярной среды разработки Flash, а теперь еще и Flex - приложений. По словам разработчиков, в новой версии будет очень мощный отладчик и невероятно удобная система рефакторинга. Первая версия (без поддержки MXML) ожидается уже в марте 2008 года, а финальный релиз запланирован на 2-3 квартал 2008 года.
|
Ожидаем выход FDT 3.0 Enterprise Как стало известно, мы скоро сможем познакомится с Enterprise-версией FDT 3.0 - популярной среды разработки Flash, а теперь ещё и Flex - приложений. По словам разработчиков, в новой версии будет очень мощный отладчик и невероятно удобная система рефакторинга. Первая версия (без поддержки MXML) ожидается уже в марте 2008 года, а финальный релиз запланирован на 2-3 квартал 2008 года. |
2008-01-23 |
Отлов событий из Item Renderer'ов Многие знают, что ячейки таких компонент, как Основная задача item renderer’а - представить произвольный визуальный способ отображения и редактирования данных. То есть если речь идет об изменении данных, то renderer это делает самостоятельно. Замечу об отличии item renderer’а от item editor’а с точки зрения редактирования данных: item editor предоставляет механизм некой сессии редактирования данных, обладающей сложным устройством и возможностью отмены редактирования. Но это тоже отступление от нашей генеральной мысли об орехах. Я хочу рассказать о таком варианте использования рендереров, как генерация некоторого события, которое не обязательно влечёт за собой изменение данных, ассоциированных с конкретным рендерером. Простейший пример - некоторая кнопка, о нажатии на которую мы хотим знать. Как перехватить это событие? Сложный вопрос. В общем, есть разные варианты. Например, используя ключевые слова Я предлагаю использовать способ, базирующийся на бабблинге событий в визуальных объектах, о котором я недавно писал. Итак, будем основываться на примере с List’ом и item renderer’е с кнопкой. Будем использовать простейший XML в качестве data provider’а: Code:
Тогда наш простой рендерер будет выглядеть так: Code:
При нажатии на кнопку мы генерим событие с бабблингом. Но как это использовать? Есть два основных способа:
Первый способ прост. Мы ловим бабблинг снаружи обрабатываем его: This text is replaced by the Flash movie.
Можно посмотреть в отдельном окне (исходники доступны по правой кнопке). Пример прост: при нажатии на кнопку в первом List’е удаляется соответствующая строка. Во втором же List’е меняется метка на кнопке (и это, теоретически, вполне можно сделать изнутри рендерера). Как мы видим, главный класс приложения прост. Но он требует от нас двух вещей: подписываться на события с помощью Кстати, способ с бабблингом требует одного условия: имя события (тип) не должно совпадать ни с одним из имен событий нашего List’а. Приложение, реализующее второй способ, выглядит аналогично. Также по правой кнопке доступны исходники. Рендерер мы оставили без изменений. Мы лишь добавили простой кастомный класс события и соответствующую константу для нашего события в нем. Это событие отражено в метаданных нашего расширенного List’а. Оно не перекрывается с именем события, которое «пузырит» наш рендерер. Также в нашем List’е мы видим отключение дальнейшего бабблинга события от рендерера (чтобы оно никому уже не помешало) с использованием ![]()
А также можно увидеть формирование валидного события. Все просто. И, как следствие, упростился код главного класса приложения и стал много нагляднее. Когда использовать эти способы? Первый способ хорошо подходит для прототипирования. Он быстрый и простой. Второй же способ лучше использовать при создании коммерческого приложения, особенно если речь идет о командной разработке. Примерно так. Можно задавать вопросы, делиться своими способами, критикой приведенных итд. Милости прошу в комменты. Ну и напоследок предлагаю скачать готовый проект приведённого примера (Flex Builder 3 beta 3). |
Условная компиляция с mxmlc версии 3.0 Будущий релиз Flex 3 породил массу статей, посвященных новшествам и изменениям как в самом фреймворке, так и в новой версии Flex Builder. На этом фоне без внимания остались изменения, произошедшие в компиляторах, поставляемых в комплекте с Flex 3 SDK. Сегодня я предлагаю исправить эту несправедливость. |
2008-01-16 |
Внешние ресурсы во Flex 3 приложениях или напильник при компиляции :) Давно хотел написать об этой “фишке” во Flex 3, но руки не доходили. Как известно при создании нового проекта добрый Flex 3 создает папочку src в какую складывает AS и MXML. В процессе разработки, если мы используем внешние ресурсы, нам приходится указывать пути к ним с учетом уже того, что наши исходники лежат в папке, то есть к примеру - “../assets/icons/somesuperiormegaicon.png”. И на выходе мы имеем в папке bin наш swf и папки, но пути остались с “лишним ../”, из-за чего ресурсы не загружаются в приложение.. и приходится создавать папку в которую складываешь сам swf дабы сохранить пути рабочими… |
2008-01-08 |
FlexSpy — визуальная отладка Flex-приложений на лету FlexSpy (fxSpy, Flex Spy) делает то же самое, что делает FireBug для Firefox. FlexSpy позволяет изменять свойства компонентов Flex-приложения во время работы — например, в окне браузера. Это здорово облегчает дизайн флекс-приложений, Как FireBug облегчает отладку веб-страниц. Можно увидеть FlexSpy в действии. Чтобы активизировать этот визуальный дебаггер, нажмите кнопку "FlexSpy" в правом верхнем углу. Внутри приложения откроется окно, позволяющее исследовать древовидную структуру визуальных компонентов и изменять их свойства — редактируемые помечены иконкой "карандаш". Эта штуковина может стать гвоздем в крышке гроба не слишком удобного дизайнерсокого режима самого Flex Builder. Нужно изменить ширину контейнера и посмотреть, что получится? Пожалуйста. Увидеть, как будет выглядеть приложение с другим фоном? Без проблем. Помимо того, что FlexSpy позволяет редактировать свойства и стили визуальных компонентов, он также имеет функцию удобного визуального поиска компонентов и подсветки редактируемого в данный момент элемента. Как использовать Flex Spy в вашем Flex-приложенииУстановка FlexSpy несложна сводится к стандартному подключению библиотеки flexspy.swc к проекту и добавлении кнопки его активации:
Теперь и у флекс-дизайнеров есть свой отладчик. Ожидается AIR-версия для десктопа. |
2008-01-04 |
Бета-релиз Degrafa Degrafa framework — это декларативный графический фреймворк, имеющий продвинутую поддержу CSS, позволяющий при помощи MXML-разметки рисовать геометрические фигуры, сложную составную графику, создавать скины. |
2007-12-26 |
Недоразумение
Соответственно, многие в обиходной речи называют одно билдером, а другое - Эклипсом. Это неверно. Верным было бы называть Flex Builder’ом плагин, а упакованную версию - standalone Flex Builder, Так или иначе, но и в качестве плагина он слабенький. Не поддерживает обновления через Update Manager и не поставляется в виде zip-аржива (в виде локального update-сайта) без упакованного внутрь SDK и плеера (чтобы не качать несколько раз одно и то же). Не говоря уже о низком качестве IDE и потреблении ресурсов при компиляции… Так что такой продукт, в принципе, можно называть как угодно Особенно весело когда Flex Builder 3 Beta 3 на свежем AIR-проекте, состоящем из одного пока mxml-файла выдает: Code:
При том, что памяти я как только ему не выделял Люди говорят, что в standalone-билдере все в порядке. Но не держать же мне несколько конфигураций, открывая попеременно!? И это при пресловутой оптимизации. При том, что по умолчанию компилится только debug-версия (чтобы якобы уменьшить время компиляции). Прекрасная работа, Adobe! Ждем зажигательных рассказов о всех великих преимуществах нового билдера в течение European Flex 3 pre-release tour. И, кстати, мои субъективные наблюдения говорят о том, что по части работы с памятью и ресурсами с каждой новой бетой все становится только хуже. Будем надеяться на лучшее. |
Недоразумение
Соответственно, многие в обиходной речи называют одно билдером, а другое - Эклипсом. Это неверно. Верным было бы называть Flex Builder’ом плагин, а упакованную версию - standalone Flex Builder, Так или иначе, но и в качестве плагина он слабенький. Не поддерживает обновления через Update Manager и не поставляется в виде zip-аржива (в виде локального update-сайта) без упакованного внутрь SDK и плеера (чтобы не качать несколько раз одно и то же). Не говоря уже о низком качестве IDE и потреблении ресурсов при компиляции… Так что такой продукт, в принципе, можно называть как угодно Особенно весело когда Flex Builder 3 Beta 3 на свежем AIR-проекте, состоящем из одного пока mxml-файла выдает: Code:
При том, что памяти я как только ему не выделял Люди говорят, что в standalone-билдере все в порядке. Но не держать же мне несколько конфигураций, открывая попеременно!? И это при пресловутой оптимизации. При том, что по умолчанию компилится только debug-версия (чтобы якобы уменьшить время компиляции). Прекрасная работа, Adobe! Ждем зажигательных рассказов о всех великих преимуществах нового билдера в течение European Flex 3 pre-release tour. И, кстати, мои субъективные наблюдения говорят о том, что по части работы с памятью и ресурсами с каждой новой бетой все становится только хуже. Будем надеяться на лучшее. |
Tree vertical-scroll баг Столкнулся с такой проблемой. При открытии нода дерева с сервера приходят данные об его дочерних элементах, изменяется этот узел датапровайдера, дети отображаются. Все вроде бы ничего, но если по высоте элементы не влезают в дерево, вертикальный скроллинг появляется только после повторного открытия нода (когда он уже знает о своих детях). Решение - использовать кастомный dataDescriptor. Нашел в блоге Joan Lafferty здесь. Бажное приложение: treeScrollAuto.mxml treeScrollAuto.swf Решение: treeScrollAutoFixed.mxml myDescriptor.as treeScrollAutoFixed.swf |
2007-12-16 |
Первое собрание Russian Adobe Flash Platform User Group. Взгляд зрителя Сегодня удалось поприсутствовать на первом собрании Russian Adobe Flash Platform User Group. Честно говоря, это первое мероприятие, посвященное флэш-технологиям, на котором я присутствовал когда-либо. Впечатления противоречивы, но, думаю, отрицательные эмоции - лишь результат депрессивного состояния от накопившихся неблагоприятных обстоятельств, преследующих меня последнее время. Я чуть опоздал на первый доклад ("Flex + Flash = Второй доклад ("Работа с событиями в ActionScript 3 и Flex") для тех, кто уже попробовал себя в разработке Flex-приложений на AS3. Костя Constantiner снизошел к нам из Питера и довольно доходчиво, но всё же несколько сжато рассказал про события в AS3 и Flex и их особенности. Обещали обнародовать все материалы докладов, и я с нетерпением жду, чтобы их покопать поподробнее. На второй части конференции обсуждались насущные проблемы компании Adobe, а именно - что Adobe нужно сделать, чтобы привлечь как можно больше разработчиков и пользователей к Flash-платформе ... и при этом как можно меньше потратиться... (по настроению ведущего представителя Adobe сложилось такое впечатление). Как-то получилось, что участники разделились на две категории:
Приятно было увидеть в живую тех, кто до сего момента существовал лишь как абстрактный образ в моем воображении. Забавно также, что на фото в блогах и форумах все выглядят симпатичнее чем в жизни... * * * Фото и видео со встречи: Блог flashimp, Результаты первой встречи User Group |
2007-12-13 |
Vivat, Adobe!
Итак:
|
2007-11-30 |
Показ версии flex-приложения Часто встречается такая задача - показ информации о версии приложения в GUI. Например, пользователь нажимает кнопку About и получает информацию о том, какой версией программы пользуется. Пожалуй самое неудачное решение - это подгрузка информации о версии во время выполнения программы (например из конфигурационного xml). В этом случае вы никогда не можете быть уверены в том, с какой версией собственно имеете дело. Вывод: информация о версии должна быть зашита в приложение на этапе компиляции и быть доступна в коде. Способы решения:
Приведу пример использования resource bundle. В коде используем обычный ResourceBundle API. Code:
Если вы знаете еще какие-то решения, то будет очень интересно их обсудить. PS: Существует библиотека, которая частично помогает решить проблему. Эта библиотека описана в посте Release version API. |
2007-11-27 |
Flex + Maven часть1 Для сборки flex c помощью maven необходимо произвести следующие действия: Создание файла проекта pom.xml
Настройка среды
структура проекта Main.xml может быть таким: Code:
Сборка проекта с помощю mvn |
2007-11-13 |
«ActionScript 3.0. Сборник рецептов» на русском!
А уже сейчас книгу можно заказать со скидкой. Также напомню, что это перевод вышедшей год назад в издательстве O’Reilly книги известных личностей Joey Lott, Darron Schall и Keith Peters «ActionScript 3.0 Cookbook». |
2007-11-07 |
Communigate Systems ищет программиста в Москве Российское представительство компании CommuniGate Systems ищет классных программистов для работы над интересными проектами, существующими и новыми. Требования к кандидатам:
О нас: офис в Москве, отличная зарплата (в рынке и выше), свободный график и небольшая дружная команда. Присылайте резюме с рассказом о себе на hrundik [жэвотное] stalker.com. |
2007-11-02 |
Как устроены Модель, Вид и Управление во фреймворке 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 |
Немного знаний с Flex Boot Camp. Ely Greenfield автор блога Quietly Scheming, опубликовал несколько примеров со своей презентации на MAX Barcelona для Flex Boot Camp. Сделаю краткий перевод, советую почитать более полный текст у автора: Пример 1: Создаем свой компонент Пример об основах создания своих виджетов: класса, графика, под компоненты, события, размеры, отрисовка и т.п. Пример 2: Что есть потомок MXML компонента Пример о том как определить потомков для своего MXML компонента. Пример 3: Мета программирование на AS и кастомными мета данными. Автор пишет, что это его любимая демка. В ней он показывает как можно использовать мета данные для: создание одно или двух стороннего биндинга между виджетами; |
2007-10-23 |
Подсветка кода для VIM. Полезняшка, для тех кто пишет свой код используя VIM, хотя может они уже про это и в курсе. Abdul Qabiz’s решил поделится своими наработками на поприще подсветки синтаксиса в VIM, для ActionScript и MXML. Которые он сделал, и как я понял из его поста будет еще усовершенствовать, на основе файлов подсветки для AS 2 от Richard Leider. Файлы с настройками подсветки: О том как все это дело заставить работать читать тут. |
2007-10-19 |
PV3D по-русски: перевод Papervision3D-wiki и Flex в IDEA7 Алексей 'Yelbota' Фомкин перевел на русский язык вики к Papervision3D и выложил как PDF: FAQ для начинающих в Papervision3D. А ruFlex обсуждает вышедшую на днях IDEA7 с еще сырой, но уже поддержкой AS3 и MXML. |
2007-10-16 |
Вакансия. Нужен AS-программер в компанию BDirect По просьбе Александра Козловского: В компанию BDirect требуется ActionScript 3 программер с опытом работы с as3 от года. Обязательно знание движка “Papervision 3d”, Желателен опыт разработки онлайн - игр, Огромным плюсом будет знание mxml, умение писать свои mxml-компоненты, умение скинить Flex-проекты и ActionScript-проекты. job |
2007-10-15 |
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> |
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> |
FDT 3.0 Релиз Как ни странно, но сегодня официальный релиз FDT 3. Релиз появился с немецкой точностью (как и было обещано). Пока впечатлениями поделится не могу, так как еще не скачал, но как только, так сразу. Ну чтож, если FDT 3 работает с ActionScript 3, также как и предыдущие версии с ActionScript 2, то нас можно только поздравить. UPD: Цитирую Nox Noctis: Новая версия ФДТ поддерживает AS2.0 и AS3.0, и доступна в трех видах: Для разработчиков опенсорсных проектов по-прежнему представляются бесплатные ключи. Описание фич по ссылке: http://fdt.powerflasher.com/index.php?page=download Корпоративная версия отличается от остальных тем, что На сегодняшний день эти фичи еще не реализованы, находятся в разработке. UPD++ Для тех, кто хочет получить ключи к FDT бесплатно. Цитата из RuFlash >> Если мне не изменяет память, Иван( Iv ) пробивал бесплатный FDT по проекту bezier.ru.Был ли получен ожидаемый результат? Нет, с доменами это не связано. Есть ряд правил, по которым они проверяют, что проект подходит. Цитирую: Для всех запросов мы проверяем: Если вы отправляете запрос на получение опенсорсного ключа, пожалуйста, постарайтесь облегчить нам эту проверку насколько возможно (прямые ссылки очень помогают). Пожалуйста, отправляйте запросы только на fdt@powerflasher.com с внятным сабжем - “Open Source Project FDT Licence Key”. Пожалуйста, не присылайте реквесты на другие адреса. Пожалуйста, учитывайте, что на обработку запроса уходит порядка недели. Оригинал: http://www.powerflasher.com/fdt/forum/viewtopic.php?t=139 fdt3 |
День ништяков. FDT 3.0 - свершилось. Saffron UML Tool - где ты родимая! Вышел релиз FDT 3.0 читать тут. Поделили продукт на 3 части, для маленьких, для средненньких и обещают для взрослых(с поддержкой mxml). Но что-то с ценами они намутили - для взрослыж 600-1 евро немного кусается, хотя если все что они заявили будте работать отлично я пожалуй скажу: “гудбай билдер”. Я недавно щупал бетту FDT 3.0 была очень сырая и глючная, причем эти глюки лезли просто толпами, успели ли они поправить все это? вот вчем вопрос. Нужно побыстрее пощупать релиз может там все оки. Вчера Рост писал о том что сегодня будет еще один ништяк под именем Saffron UML Tool. Я просто мечтаю запустить свои руки в это приложение, очень интересует - это всего лишь одна из красивых утилиток или же очень удобный инструмент. А вообще нас жестоко … с редакторами, плюшки которые в остальных средах считаются необходимым минимумом для существования программера, нам выдют по одной и говорят, что мол мы придумали именно ту фичу которую вы хотели, посмотрите какие мы крутые. |
День ништяков. FDT 3.0 - свершилось. Saffron UML Tool - где ты родимая! Вышел релиз FDT 3.0 читать тут. Поделили продукт на 3 части, для маленьких, для средненньких и обещают для взрослых(с поддержкой mxml). Но что-то с ценами они намутили - для взрослыж 600-1 евро немного кусается, хотя если все что они заявили будте работать отлично я пожалуй скажу: “гудбай билдер”. Я недавно щупал бетту FDT 3.0 была очень сырая и глючная, причем эти глюки лезли просто толпами, успели ли они поправить все это? вот вчем вопрос. Нужно побыстрее пощупать релиз может там все оки. Вчера Рост писал о том что сегодня будет еще один ништяк под именем Saffron UML Tool. Я просто мечтаю запустить свои руки в это приложение, очень интересует - это всего лишь одна из красивых утилиток или же очень удобный инструмент. А вообще нас жестоко … с редакторами, плюшки которые в остальных средах считаются необходимым минимумом для существования программера, нам выдют по одной и говорят, что мол мы придумали именно ту фичу которую вы хотели, посмотрите какие мы крутые. |
2007-10-12 |
Делаем процесс “скинования” проще. [Часть 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 Рассмотрим создание скина для кнопки у которой styleName=”customButton”. После выбора нужных значений и ввода styleName в мастере создание скина, жмем ок и получаем новый документ с импортированными в него заготовками для состояний кнопок (название все дано в виде Button_customButton_overSkin и т.д., по состояниям виджета), а также хитрая папка с декором фоновым и пояснениями к шаблону (ее нужно скрывать перед экспортом скина, она так и называется - “_HIDE BEFORE EXPORTING”, но об этом потом). После того как вдоволь поиздевавшись над скином, прячем папку с названием _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. Finish. В папке проекта создается каталог assets в который скопировались картинки и в корне создался assets.css в котором прописан стиль для нашей кнопки, а также в main MXML файл подключили наш CSS. Fin. Впечатления, все хорошо, но:
Вроде все перечислил. Если что забыл, пишите обновлю пост. |
2007-10-05 |
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
Предлагаемый Microsoft цикл разработки веб-приложений
В Silverlight обещают также реализацию защиты контента, 3D и прочее — напишите, если я что-то забыл. ВыводыВ третьей части. Работать надо :-) |
2007-10-01 |
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 |
Блог об интеграции Papervision3D и Flex На днях в рассылке был проанонсирован новый блог, целью которого автор ставит: - позволить флекс-программистам использовать MXML для построения сцен. - использовать стиль программирования флекс-эффектов для создания анимации. - добавлять 3d события для управления inline ActionScript кодом. - создать DisplayObject3D-обертку для внедрения 2D flex UI компонентов в 3D сцену. - обеспечить встроенные режимы 3d навигации?! Есть примерчик с кодом. В общем, начало интересное. Буду следить. |
Блог об интеграции Papervision3D и Flex На днях в рассылке был проанонсирован новый блог, целью которого автор ставит: - позволить флекс-программистам использовать MXML для построения сцен. - использовать стиль программирования флекс-эффектов для создания анимации. - добавлять 3d события для управления inline ActionScript кодом. - создать DisplayObject3D-обертку для внедрения 2D flex UI компонентов в 3D сцену. - обеспечить встроенные режимы 3d навигации?! Есть примерчик с кодом. В общем, начало интересное. Буду следить. |
2007-06-27 |
List и дубликаты в датапровайдере Давно заметил следующую теперь уже наверно фичу: Сделаем маленький пример: <?xml version="1.0" encoding="utf-8"?> В данном случае, если навести мышь на второй элемент, который идентичен третьему, то отработает наведение последний. Я думал, что это баг. Отнюдь. Вычитал из 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"}];
|
List и дубликаты в датапровайдере Давно заметил следующую теперь уже наверно фичу: Сделаем маленький пример: <?xml version="1.0" encoding="utf-8"?> В данном случае, если навести мышь на второй элемент, который идентичен третьему, то отработает наведение последний. Я думал, что это баг. Отнюдь. Вычитал из 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 |
Flex Future Features: Graphic Tags Кроме распланированных по стадиям релиза фич, есть вещи, время внедрения которых не определено. Пока их перечислено всего две: графические теги и импорт векторных изображений, на них же построенный. Идея такова: создание в MXML как простых, так и сложных фигур, применение к ним различных типов заливок, фильтров и т п. Радует, что уже существует прототип, но он, к сожалению еще “not ready for Labs” |
2007-06-05 |
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.
|
2007-03-26 |
Легкая локализация во Flex. А будет ли runtime локализация? Если вы разрабатываете flex приложение, то локализация не должна отнять много времени, про что есть статьи и на русском языке (например, эта). Несколько минут и ваше приложение “заговорит” на разных языках, а если забудете что-то важное, то exception обеспечен. |
Подгрузка css на стадии компиляции В процессе работы над очередным проектом у нас с Junik возникла потребность в использовании каскадных стилей. Подробнее о стилях и вариантах их использования написано тут, методика подгрузки css в рантайме тут, здесь же речь пойдет о тех проблемах с которыми мы столкнулись в процессе подгрузки файла css на стадии компиляции. |
2007-03-16 |
Готов A3 JTable Ребята из aswing.org выпустили на всеобщее обозрение A3 JTable Этот год сулит новое “программистское щастье”:
До кучи осталось забрать производство Flash Player Runtime из нерасторопных рук Адобовских программистов и заодно повысить скорость исполнения апликух в 50-100 раз и наконец сделать мультиязычный инсталлятор. |
2007-03-03 |
flex-coding-guidelines Fabio Terracini опубликовал в рассылке FlexCoders рекомендации по оформлению кода для Flex (AS3, MXML, CSS). Данный документ основан на соглашениях используемых в Adobe Flex libararies, Java |