четверг, марта 11, 2010
четверг, января 28, 2010
Баг при переименовании класса во Flex Builder
Заметил интересный баг: если переименовать класс в одном проекте, то старательный Flex Builder переименует одноименные классы в других проектах. Точнее названия файлов он оставит старые, а внутри все перелопатит.
вторник, января 12, 2010
Утечка памяти в IE 8
Столкнулся со следующей проблемой. Есть простое приложение, использующее ExternalInterface.addCallback:
Флешка вставлена через swfobject. В IE8 при перезагрузке страницы видно, что память отданная под страничку с флешом не освобождается, что приводит к падению браузера через несколько перезагрузок. Немного поискав, нашел в swfobject 2.2 метод:
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.
И помогло :)
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
applicationComplete="appCompleteHandler();">
<mx:Script>
<![CDATA[
private function appCompleteHandler():void {
if (ExternalInterface.available) {
ExternalInterface.addCallback("getWidth", getWidth);
}
}
private function getWidth():Number {
return width;
}
]]>
</mx:Script>
</mx:Application>
Флешка вставлена через swfobject. В IE8 при перезагрузке страницы видно, что память отданная под страничку с флешом не освобождается, что приводит к падению браузера через несколько перезагрузок. Немного поискав, нашел в swfobject 2.2 метод:
swfobject.removeSWF(objElemIdStr) Removes a SWF from your web page. Is especially built to safely (only remove a SWF after it has been loaded, to avoid broken references) and completely (nullify references to avoid memory leaks) remove a SWF in Internet Explorer.
И помогло :)
понедельник, декабря 14, 2009
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
Есть флекс-приложение, имеющее внутри себя AS3-компонент, использующий fl.controls кнопки и лейблы. При вызове какого-либо поп-апа флекс-приложение начинало неадекватно реагировать на перемещение фокуса по нажатию Tab:
Поискав в сети подобную ошибку, наткнулся на несколько постов, в которых во всем винили флешовые компоненты, что и понятно из ссылок на fl.managers::FocusManager. В итоге пришлось переделывать флеш-компонент, подписываясь на Event.ADDED_TO_STAGE его кнопок и выключая в этом событии focusManager - button.focusManager.deactivate().
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/getChildIndex()
at mx.core::Container/getChildIndex()
at mx.containers::Panel/getChildIndex()
at fl.managers::FocusManager/::getChildIndex()
at fl.managers::FocusManager/::sortByDepth()
at fl.managers::FocusManager/::sortByTabIndex()
at Array$/Array::_sort()
at Array/http://adobe.com/AS3/2006/builtin::sort()
at fl.managers::FocusManager/::sortFocusableObjectsTabIndex()
at fl.managers::FocusManager/::sortFocusableObjects()
at fl.managers::FocusManager/::keyDownHandler()Поискав в сети подобную ошибку, наткнулся на несколько постов, в которых во всем винили флешовые компоненты, что и понятно из ссылок на fl.managers::FocusManager. В итоге пришлось переделывать флеш-компонент, подписываясь на Event.ADDED_TO_STAGE его кнопок и выключая в этом событии focusManager - button.focusManager.deactivate().
суббота, августа 08, 2009
суббота, февраля 21, 2009
Adobe организует субботник
28 марта Adobe в Сиэтле организует субботник по правке багов во Flex SDK. Приглашаются все желающие. Можно еще участвовать через Connect, ссылку отправят всем зарегистрированным. Будут присутствовать разработчики из Adobe. В общем достаточно любопытное меропрятие.
четверг, февраля 05, 2009
Использование Flex Charting в локализованном приложении
Как известно, флекс-приложения можно локализовывать для разных языков, прописав в параметрах компиляции в атрибуте locale нужную локаль. Но перед этим нужно создать пакет необходимых библиотек для этой локали с помощью команды copylocale (располагается в папке [flexsdk]\bin ):
copylocale en_US ru_RU
Но данная команда игнорирует бандлы для Flex Charting. Это известный баг. И как следствие, наш проект откажется компилироваться для отличной от en_US локали.
Есть несколько способов все исправить.
Первый способ:
1. Найти datavisualization_rb.swc для английской локали:
Например, для Wiwndows:
C:\Program Files\Adobe\Flex Builder 3\sdks\3.2.0\frameworks\locale\en_US\
2. Скопировать его в папку с нужной локалью
3. Открыть с помощью архиватора
4. Переименовать папку "\locale\en_US" в "\locale\ru_RU" (или в какую нужно)
5. Отредактировать catalog.xml – заменить все строки en_US на нужную локаль
6. Вызвать во Flex Builder Project -> Clean.
Минус этого метода в том, что для каждой новой локали нужно повторять эту операцию.
Второй способ (типа официальный):
1. Получить исходники Flex Charting. Обычно они распаковываются в папку [flexsdk]\fbpro.
2. Зайти в папку [flexsdk]\frameworks\projects\ и создать тут структуру папок datavisualization\bundles\en_US\src
3. Зайти в папку [flexsdk]\fbpro\projects\datavisualization\bundles\en_US и скопировать все файлы .properties в новоиспеченную папку из п.2
Теперь copylocale будет работать правильно всегда.
Правда, сравнив архивы из первого способа и из второго можно заметить, что во втором бандлов меньше.
copylocale en_US ru_RU
Но данная команда игнорирует бандлы для Flex Charting. Это известный баг. И как следствие, наш проект откажется компилироваться для отличной от en_US локали.
Есть несколько способов все исправить.
Первый способ:
1. Найти datavisualization_rb.swc для английской локали:
Например, для Wiwndows:
C:\Program Files\Adobe\Flex Builder 3\sdks\3.2.0\frameworks\locale\en_US\
2. Скопировать его в папку с нужной локалью
3. Открыть с помощью архиватора
4. Переименовать папку "\locale\en_US" в "\locale\ru_RU" (или в какую нужно)
5. Отредактировать catalog.xml – заменить все строки en_US на нужную локаль
6. Вызвать во Flex Builder Project -> Clean.
Минус этого метода в том, что для каждой новой локали нужно повторять эту операцию.
Второй способ (типа официальный):
1. Получить исходники Flex Charting. Обычно они распаковываются в папку [flexsdk]\fbpro.
2. Зайти в папку [flexsdk]\frameworks\projects\ и создать тут структуру папок datavisualization\bundles\en_US\src
3. Зайти в папку [flexsdk]\fbpro\projects\datavisualization\bundles\en_US и скопировать все файлы .properties в новоиспеченную папку из п.2
Теперь copylocale будет работать правильно всегда.
Правда, сравнив архивы из первого способа и из второго можно заметить, что во втором бандлов меньше.
понедельник, января 12, 2009
Будем знакомы - Pivot
Pivot - это открытая платформа для разработки RIA на Java. Она сочетает в себе производительность и юзабилити всех современных RIA-фреймворков и мощь Java-платформы.
Как Flex и Silverlight, Pivot обладает свойствами, благодаря которым создавать GUI приложения достаточно легко: декларативный UI, связывание данных, различные эффекты, интеграцию с веб-сервисами и т.п.
Страница проекта
Демки
Загрузки
Уроки
Более подробный обзор.
Использование JavaScript внутри Pivot
Как Flex и Silverlight, Pivot обладает свойствами, благодаря которым создавать GUI приложения достаточно легко: декларативный UI, связывание данных, различные эффекты, интеграцию с веб-сервисами и т.п.
Страница проекта
Демки
Загрузки
Уроки
Более подробный обзор.
Использование JavaScript внутри Pivot
среда, ноября 19, 2008
Оживление Flex Debugger
Непонятно почему перестал работать Debug-режим. Приложение запускалось, но после долгой попытки соединится, выводилось сообщение о том, что это невозможно и советовали проверить действительно ли у меня стоит debug-версия плеера.
Вылечилось это так: после запуска приложения вызываем контекстное меню плеера, выбираем там debugger, пишем в адрес 127.0.0.1, подключаемся и приложение благополучно соединяется с отладчиком. После этой процедуры отладчик стал запускаться без лишних движений по старинке.
Может ли кто-нибудь объяснить такое поведение?
Вылечилось это так: после запуска приложения вызываем контекстное меню плеера, выбираем там debugger, пишем в адрес 127.0.0.1, подключаемся и приложение благополучно соединяется с отладчиком. После этой процедуры отладчик стал запускаться без лишних движений по старинке.
Может ли кто-нибудь объяснить такое поведение?
пятница, октября 17, 2008
FlexMonkey - тестирование UI
FlexMonkey - это фреймворк, автоматизирующий тестирование функциональности пользовательского интерфейса Flex-приложений. С его помощью можно записывать и воспроизводить взаимодействия с UI приложения. Также можно генерировать ActionScript-код с тестами. Использует Flex Automation API. Вот небольшой пример.
среда, октября 15, 2008
Adobe FlexTeam будут в Москве
Совершенно случайно узнал о том, что во второй половине октября FlexTeam будут в Москве на следующих мероприятиях:
- The 4th Software Engineering Conference (Russia) 2008 SEC(R) 2008 (Enrique Duvos).
- Russian Internet Week - http://www.riw2008.ru/program/
- User Experience Conference (Serge Jespers)
- Russian Flex User Group (30 октября) - тоже обещали заехать.
среда, сентября 17, 2008
Unit-тесты в ActionScript
Недавно заинтересовался созданием тестов в процессе разработки. На тот момент я знал только одну тулзу для создания unit-тестов - это FlexUnit, который переехал под крыло Adobe. Немного поискав, я открыл для себя fluint. Fluint поддерживает
А кто еще что-нибудь использует и как относится к тестированию в процессе разработки?
- множественные асинхронные операции;
- поддержку setup и teardown для задания каких-то начальных параметров и их очистки;
- поддержку тестирования UIComponent;
- поддержку тестирования команд и контроллеров Cairngorm;
- вывод результатов в виде XML;
- поддержку тестов в модулях.
А кто еще что-нибудь использует и как относится к тестированию в процессе разработки?
пятница, сентября 12, 2008
напоминание != remember
Кто интересно локализовывал 10 плеер для русского языка? В контекстном меню плеера в разделе разрешения использования микрофона есть 2 пункта - разрешить и запретить, а внизу галка Remember, то есть запомнить и в следующий раз не спрашивать, а на русский перевели как Напоминание, то есть получается надо напоминать каждый раз, если галка отмечена?
среда, августа 20, 2008
Обновление класса Filereference в 10 плеере
В новой десятке класс Filereference стал более "безопасным". Теперь метод FileReference.browse() нельзя будет вызвать программно, а только в ответ на нажатие клавиатуры или мыши. В связи с этим возникнет необходимость переделывать флешовые аплоадеры для Flickr, SWFUpload и Wordpress.
Как говорят в Adobe, данная мера вызвана необходимостью повышения безопасности - якобы пользователя может ввести в заблуждение внезапно появившееся окошко и он случайно сохранит не то, что нужно:)
Источник
Как говорят в Adobe, данная мера вызвана необходимостью повышения безопасности - якобы пользователя может ввести в заблуждение внезапно появившееся окошко и он случайно сохранит не то, что нужно:)
Источник
Во Flash-видео скоро появится новый тип метаданных
В скором времени Adobe Systems представит на обозрение новую фичу видео - voice-to-text. Это означает, что вся произносимая речь будет переведена в метаданные и внедрена в видео-ролик с помощью средств для редактирование видео от Adobe. Внедрение данной разработки окажет огромное влияние на индексацию видео-контента и видео-рекламу.
Jim Guerard, заведующий всем rich media в Adobe, говорит, что данный функционал мы сможем увидеть уже в этом году.
Jim Guerard, заведующий всем rich media в Adobe, говорит, что данный функционал мы сможем увидеть уже в этом году.
четверг, августа 14, 2008
Откуда у функции length?
На днях столкнулся с такой проблемой.
После переноса цикла в функцию, в последней остался параметр length, который был локально обозначен перед циклом и был успешно там забыт. Но ошибки компилятор не выдал и косяк не был замечен сразу. Потом я обратил внимание на этот загадочный length.
Откуда же он взялся?
А взялся он от функции и равен количеству аргументов, заданных в сигнатуре функции. Он отличается от arguments.length тем, что arguments.length равен реально переданному количеству аргументов. Например, если компилировать в standard mode:
После переноса цикла в функцию, в последней остался параметр length, который был локально обозначен перед циклом и был успешно там забыт. Но ошибки компилятор не выдал и косяк не был замечен сразу. Потом я обратил внимание на этот загадочный length.
Откуда же он взялся?
А взялся он от функции и равен количеству аргументов, заданных в сигнатуре функции. Он отличается от arguments.length тем, что arguments.length равен реально переданному количеству аргументов. Например, если компилировать в standard mode:
function traceLength(x:uint, y:uint):void
{
trace("получено: " + arguments.length);
trace("ожидалось: " + traceLength.length); // или просто length
}
traceLength(3, 5, 7, 11);
/* output:
получено: 4
ожидалось: 2 */
Ссылка на доку
пятница, августа 01, 2008
Поддержка AMF cкоро будет в Zend Framework
Так называемый Zend_Amf_Server обеспечит поддержку формата AMF для Zend Framework. Участвовать в проекте будет Wade Arnold - человек, ведущий проект AMFPHP. Надеюсь эта новость оправдает тормоза в релизах AMFPHP, который завис на бете в сентябре 2007 года.
среда, июля 30, 2008
14 июля начато строительство моста ...
...между Adobe Air и Java под названием Merapi.
Merapi - это фреймворк, объединяющий оба типа приложений, запущенных на десктопе и выступающий так называемым мостом между ними. Взаимодействие реализовано с помощью класса merapi.Bridge, реализованного как для Air, так и для Java. С помощью Merapi Air-приложение может выступать интерфейсом к Java-приложению, что позволит расширить возможности приложения до бесконечности. В общем, кому интересно - добро пожаловать на сайт проекта.
Merapi - это фреймворк, объединяющий оба типа приложений, запущенных на десктопе и выступающий так называемым мостом между ними. Взаимодействие реализовано с помощью класса merapi.Bridge, реализованного как для Air, так и для Java. С помощью Merapi Air-приложение может выступать интерфейсом к Java-приложению, что позволит расширить возможности приложения до бесконечности. В общем, кому интересно - добро пожаловать на сайт проекта.
вторник, июня 10, 2008
Small Worlds
Никогда особо не интересовался всякими онлайн-играми, но недавно пришло приглашение в бета-версию игры Small Worlds и, зарегистрировавшись там, я был мягко говоря поражен ее крутотой.
SmallWorlds - это виртуальный 3D мир, который создается самими игроками. Это флексовый проект, созданный студией Outsmart из Новой Зеландии. С серверной стороны используется Java. Также используется вебсервис Amazon’а Elastic Compute Cloud, также известный как EC2. Этот виртуальный сервер позволяет SmallWorlds масштабироваться на 1000 серверов в считанные минуты.
Пользователи могут создавать своих героев. Причем опций для настройки очень много и есть вероятность при желании повторить себя в виртуальном мире:)

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

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

В планах на будущее:
В общем лучше один раз увидеть, как говорится.
SmallWorlds - это виртуальный 3D мир, который создается самими игроками. Это флексовый проект, созданный студией Outsmart из Новой Зеландии. С серверной стороны используется Java. Также используется вебсервис Amazon’а Elastic Compute Cloud, также известный как EC2. Этот виртуальный сервер позволяет SmallWorlds масштабироваться на 1000 серверов в считанные минуты.
Пользователи могут создавать своих героев. Причем опций для настройки очень много и есть вероятность при желании повторить себя в виртуальном мире:)

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

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

В планах на будущее:
- куча опций для аватаров
- API для Flash разработчиков
- множество игр
- виджеты
В общем лучше один раз увидеть, как говорится.
пятница, июня 06, 2008
Один ItemRenderer для нескольких колонок
Столкнулся с задачей отображения в DataGrid одинаковых по сути данных (UNIX_TIMESTAMP), к которым нужно применить ItemRenderer так, чтобы последний знал к какой колонке он применяется. Я нашел два способа это сделать и оба связаны с использованием свойства listData. Свойство listData имеют такие элементы как Text, Label, Button, CheckBox и т.п., то есть те, которые имплементируют интерфейс IDropInListItemRenderer. В данном случае в качестве ItemRenderer мне достаточно использовать Label. Если же необходим какой-нибудь контейнер в качестве рендерера, который не имеет свойства listData по-умолчанию, его необходимо реализовать своими силами.
Итак, первый способ - это назначать данные для рендерера в зависимости от индекса колонки таблицы. Приведу кусок кода:
Здесь мы обращаемся к listData, кастим его к DataGridListData, получаем индекс колонки таблицы и в зависимости от индекса отображаем в колонках date1 или date2. Недостатком этого способа является то, что при добавлении новых колонок перед этими придется переделывать код рендерера и также нельзя перетаскивать колонки. Поэтому рассмотрим второй способ.
В данном случае мы обращаемся не к columnIndex, а к dataField, таким образом получая строку, в которой содержится название поля, из которого мы получаем данные. А с помощью data[myListData.dataField] мы получаем значение этого поля.
Итак, первый способ - это назначать данные для рендерера в зависимости от индекса колонки таблицы. Приведу кусок кода:
<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml">
...
override public function set data(value:Object):void
{
super.data = value;
var myListData:DataGridListData = DataGridListData(listData);
var colIndex:int = myListData.columnIndex;
switch (colIndex)
case 1: text = data.date1; break;
case 2: text = data.date2; break;
}
...
</mx:Label>
Здесь мы обращаемся к listData, кастим его к DataGridListData, получаем индекс колонки таблицы и в зависимости от индекса отображаем в колонках date1 или date2. Недостатком этого способа является то, что при добавлении новых колонок перед этими придется переделывать код рендерера и также нельзя перетаскивать колонки. Поэтому рассмотрим второй способ.
<?xml version="1.0" encoding="utf-8"?>
<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.controls.dataGridClasses.DataGridListData;
[Bindable] private var formattedVal:String;
override public function set data(value:Object):void
{
super.data = value;
if (value)
{
var myListData:DataGridListData = DataGridListData(listData);
var dt:Date = new Date();
var cellVal:int = int(data[myListData.dataField]);
dt.time = cellVal*1000;
formattedVal = dateformatter.format(dt);
}
}
]]>
</mx:Script>
<mx:DateFormatter id="dateformatter" formatString="DD.MM.YY J:NN"/>
<mx:text>{formattedVal}</mx:text>
</mx:Label>
В данном случае мы обращаемся не к columnIndex, а к dataField, таким образом получая строку, в которой содержится название поля, из которого мы получаем данные. А с помощью data[myListData.dataField] мы получаем значение этого поля.
Подписаться на:
Сообщения (Atom)