Показаны сообщения с ярлыком Впечатления. Показать все сообщения
Показаны сообщения с ярлыком Впечатления. Показать все сообщения

воскресенье, апреля 05, 2009

Записываем звук с помощью Red5

Этот пост - итог исследования "Сохраняем звук с микрофона на сервер" проведенного еще в январе. Суть проекта - конкурс колыбельных - любой желающий может зарегистрироваться и записать песню в собственном исполнении.

Как обычно бывает, с момента зарождения проекта, уходят месяцы на процесс впаривания, продажи, рисования и утверждения дизайна. И вот, наступает очередь разработчиков, и, как обычно, на flash выделяется неделя, в лучшем случае - две (какая несправедливость).
В этот раз, правда, всё было несколько иначе - разработка началась как раз примерно за неделю до моего отлета в Египет. Поэтому, пришлось сделать максимум, чтобы без меня две недели люди всё это ставили на свои рельсы. Принцип вынесения всех настроек в FlashVars решает эту проблему на раз. Главное не забыть составить подробный мануал.

Итак, мы пришли к решению, что лучше в качестве медиа-сервера использовать Red5. Процесс установки под Windows и тестирования Red5 для локальной разработки я описал здесь: Установка Red5 и всё что нужно для Red5-разработки. По сути, в этом посте изложено всё необходимое для создания минимального приложения для записи звука/видео. В качестве формата хранения звуковых данных, решили оставить FLV. Сначала планировали конвертацию FLV в MP3 на сервере, и даже были идеи как это реализовать. Но позже решили, что для нужд проекта это излишество и лишняя нагрузка на сервер. Все записи сохраняются как есть, в формате FLV, и воспроизводятся проигрывателем, который, кстати, по виду и функционалу совсем не отличается от того, что воспроизводит MP3.

С flash-частью оказалось всё слишком просто. Достаточно было использовать версию Flash 8 и AS2. За основу я взял пример из ...\Red5\swf\samples\SimpleRecorder.fla. С момента окончания разработки прошло уже около месяц и многое забылось, но вот пара важных заметок:
  • Для записи, уровень тишины необходимо ставить в 0 (setSilenceLevel). Если для голосового общения, функция активности микрофона важна для экономии трафика, то при записи речи или песни это может навредить - запись будет не идентична выступлению.
  • Необходимо ограничить время записи (например, по таймауту), иначе найдутся охотники заполнить дисковое пространство сервера бесполезным мусором. Хотя, конечно, правильнее это ограничение сделать на сервере.

В итоге, на выходе у меня получились две версии проигрывателей звука в форматах MP3 и FLV (можно было сделать универсальный, но времени не хватило) и рекордер звука.
На локальном Red5, под Windows, это хозяйство работало на ура. Однако, когда потребовалось поставить Red5 под FreeBSD (если не ошибаюсь), у админов возникли серьезные проблемы с настройкой нашего приложения. Подробности мне не известны, знаю только, что у них всё заработало за день до моего прилета (т.е. возились 2 недели :) ).
Такова уж особенность Open Source - конфигурация представляет собой темный лес xml-файлов, а нормальные инструменты по настройке, так чтобы галочку поставил и всё заработало - отсутствуют. Вот и выбирайте - платить за софт, или платить специалистам за настройку бесплатного софта. Но, слава Богу, всё это уже не моя забота.

* * *

Неплохая статья в тему:
Урок. Вебкамеры с Flex 3. Часть 2

пятница, февраля 06, 2009

Неэффектные эффекты. Flex

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

По началу, сделал просто появляющуюся/исчезающую панель, используя ее свойства showEffect/hideEffect. По событию наведения мыши делал visible=true, при отведении - наоборот. Эффекты:
<mx:Fade id="PanelFadeIn" alphaFrom="0" alphaTo="1" duration="400"/>
<mx:Fade id="PanelFadeOut" alphaFrom="1" alphaTo="0" duration="400" startDelay="1000"/>

Полная фигня получилась. Эффекты конфликтовали и панель появлялась и исчезала непредсказуемым образом.
Чтобы образумить эффекты, пришлось их останавливать (stop()) перед тем как переключать visible. Так более-менее заработало.

Попробовал другой способ - есть два стэйта, в которых панель находится в разных положениях. При наведении на контейнер мыши, стейт сменяется и панель перемещается в другое место, при отведении - возвращается на прежнее.
Сначала применил свойство moveEffect, в которое указывается имя эффекта <mx:Move id="PanelMotion" /> Получаю опять ерунду. В начале вроде бы всё корректно - уезжает, приезжает, но после нескольких таких движений, что-то там начинает заедать. Метод не годится.

Применяем другую тактику - используем transitions. Сразу всё встает на свои места:
<mx:transitions>
<mx:Transition fromState="Normal" toState="PanelIsShown">
<mx:Move duration="200" target="{сontrolPanel}"/>
</mx:Transition>
<mx:Transition fromState="PanelIsShown" toState="Normal">
<mx:Move duration="200" target="{сontrolPanel}"/>
</mx:Transition>
</mx:transitions>
Можно конечно обойтись одним блоком fromState="*" toState="*", но в некоторых ситуациях, панель "промигивает" в неположенных местах. Но это, конечно, зависит от специфики конкретного приложения.

В итоге, появление/убирание панели сделать средствами Flex удалось, но не так, как хотелось бы. Дело в том, что я хотел сделать небольшую паузу перед тем, как панель уберется. Сделал я следующее: второй блок transitions заменил на:
<mx:Sequence target="{сontrolPanel}">
<mx:Pause duration="1000"/>
<mx:Move duration="200"/>
</mx:Sequence>

Это вызвало две идиотские проблемы:
1. Такой способ наотрез отказывается работать, если в state меняется не непосредственно координата, а, к примеру, свойства right/left: <mx:SetStyle target="{сontrolPanel}" name="right" value="50"/> - анимация просто отсутствует.

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

* * *

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

Или я что-то не допонял, или работа с эффектами оставляет желать лучшего...
Разочарован :(

* * *

Вот пример с аналогичной панелькой:
Sliding Canvas with Flex. Исходный код тут. Работает вполне стабильно. Замечательно. И главное, у меня такие штуки проходили почему то криво... Сам виноват. Поленился сделать такую же проверку transitionHappening. А проверял свойство isPlaying, а оно как-то не правильно показывает если стоит startDelay. Другой подход с принудительной остановкой stop() тоже не проходит - надо было изначально блокировать переключение visible, как в примере. А всё лень виновата - добавлять лишние скрипты не хочется :).
Хотя, с другой стороны, управлять положением компонентов через механизм стэйтов правильнее (универсальнее).

* * *

В итоге, всё получилось с применением showEffect/hideEffect. Получилось вполне стабильно и без неприятных побочных эффектов:


public function hideControlPanel():void {
panelShowEffect.stop();
panelHideEffect.stop();
if (controlPanel.visible)
controlPanel.visible=false;
}

public function showControlPanel():void {
if (!this.enabled) return;
panelShowEffect.stop();
panelHideEffect.stop();
if (!controlPanel.visible)
controlPanel.visible=true;
}

. . .

<mx:canvas width="{controlPanel.width}" height="100%" clipcontent="true" rollover="showControlPanel()" rollout="hideControlPanel()" creationcomplete="hideControlPanel()" backgroundcolor="#FFFFFF" backgroundalpha="0">

. . .

<mx:Move id="panelShowEffect" xTo="0" duration="200"/>
<mx:Move id="panelHideEffect" startDelay="1000" duration="200" xTo="{-controlPanel.width}"/>

. . .

<mx:VBox
id="controlPanel"
height="100%"
showEffect="{panelShowEffect}"
hideEffect="{panelHideEffect}"
x="{-controlPanel.width}"
visible="false"
>

. . . Содержимое панели . . .

</mx:VBox>

. . .

</mx:Canvas>



Единственная проблема -пришлось отказаться от эффекта WipeUp/Down, примененного к компоненту, вложенному в выезжающую панель, из-за его нестабильной работы.

суббота, марта 29, 2008

Первый законченый проект на Flex. Грабли и впечатления.

Вот закончен еще один проект. И отличие его от предыдущих - это чистый Flex-проект построенный на MXML-верстке.

О проекте

Вкратце - результат проедставляет собой презентацию-каталог (оффлайн, версия для CD/DVD и версия для TouchScreen), в котором основной элемент - интерактивная карта России, разделенная на регионы. По клику на регионы осуществляется его увеличение и вывод городов. По клику на город, выводится панель со списком типов объектов (презентуемых заказчиком). По клику на тип объекта, открывается список самих объектов с фото-превьюшками и описаниями. По клику на описание объекта выводится более подробное описание с теми же фото-превьюшками, по клику на которые показывается крупное фото. Кроме того - два доп-раздела "О компании" и "Контакты".

На flash-разработку проекта я выделил две недели, т.е. в реальных условиях менее 10 рабочих дней.

На распутье

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

Дизайн-макет, на первый взгляд, показался довольно сложным, но глаз уже уловил, насколько выигрышно было бы использовать Flex-верстку. Верстать и программировать динамические списки, поставляемые выборками из XML-базы, "ручками" на AS2 - тоска.

Опыт работы с Flex за плечами уже есть, AS3 освоен. Но имеют место сомнения: "А вдруг упрусь в какую-нибудь проблему или глюк, и сроки полетят?" "Сроки жесткие, может быть лучше по-старинке, AS2?" "Зато уверенность, стабильность и предсказуемость". После часа раздумий, решился рискнуть - Flex.

За работу

Моя рабочая платформа - Flex Builder 3 Plug-in for Eclipse.

Настало время применить теорию на практике. Для начала, "порезал" макет, подготовил все "ассеты" и начал верстать экраны.

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

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

Параллельно, моим коллегой готовилась флэшка с картой. Клип с картой подгружается компонентом mx:SWFLoader. Сначала мы решили сделать ее в виде большого таймлайна, и навигация по карте осуществлялась бы командами gotoAndPlay(""). Выбор такого решения (конечно не очень удачного) был обусловлен желанием сделать карту в виде видео-ролика с 3D-эффектами. В итоге сроки свели задачу к простой флэш-анимации :). Позже стало ясно, что способ тайм-лайновой анимации совсем не интересен и карту анимировали программно Tween-ом.

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

Зашивание проекта в Zinc особых трудностей не составило. Zinc спокойно интегрируется во Flex-проект. Использовались основные объекты глобального класса mdm:
mdm.Application - для получения директории, из которой запускается приложение,
mdm.Application.Library - для работы с библиотекой приложения.
mdm.FileSystem - для тестирования наличия файлов.

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

* * *

Ниже изложено несколько нехороших ситуаций:

Неверно спроектированная верстка

Дизайн-макет был разработан на разрешение 1600х1200 - для TouchScreen. Позже, когда приложение было уже на этапе отладки, выяснилось, что нужна еще одна версия - предназначенная для распространения на CD/DVD, а значит, под меньшее разрешение. Пришлось срочно переверстать новую версию под 1024х768. Если бы я изначально заложился под трансформируемую верстку (благо, во Flex эта возможность реализована превосходно), лишней работы делать бы не пришлось. И версии можо было бы не плодить. На будущее - нужно изначально закладываться на гибкую верстку - стоит того.

Внедрение шрифта формата .OTF

При внедрении шрифта возникла следующая проблема. Мне необходимо внедрить шрифт MyriadPro. Это TrueType-шрифт формата .OTF.
Код внедрения в стили:


@font-face
{
font-family: MyriadPro;
font-weight: normal;
src: url("Assets/Fonts/MyriadPro-Regular.otf");
unicode-range:
U+0020-U+0040, /* Punctuation, Numbers */
U+0041-U+005A, /* Upper-Case A-Z */
U+005B-U+0060, /* Punctuation and Symbols */
U+0061-U+007A, /* Lower-Case a-z */
U+007B-U+007E, /* Punctuation and Symbols */
U+00FC-U+00FD, /* UE */
U+0410-U+042F, /* Cyrillic Upper-Case */
U+0430-U+0451; /* Cyrillic Lower-Case */
}

В окне FB Design шрифт отображается некорректно, выдает ошибку транскодирования: "Exception during transcoding: Font for alias 'MyriadPro' with plain weight was not found at: ...MyriadPro-Regular.otf ..." И то же самое для версии "bold".
Однако, при компиляции проекта ошибки нет и в приложении шрифт отображается корректно на разных компьютерах. Отнес это к проблемам (читай - глюкам) средства визуальной разработки FB.

Эффект появления/скрытия и states

Пришлось повозиться с эффектом mx:Fade, используемого для появления/скрытия некоторых компонентов.

По началу я предположил, что если я создам эффекты Fade (один для появления и другой для скрытия) и укажу его для некоторых компонентов в стилях showEffect и hideEffect, то при смене состояния, при изменении свойства visible, компоненты будут плавно появляться/исчезать. Как бы не так. При формировании состояния, выполняются (тупо, без каких либо перепроверок и оптимизаций) все действия - начиная с базовых состояний. Если в базовом состоянии visible устанавливается в false, а в текущем, базирующемся на нем, в true, то будет выполнено два действия со всеми вытекающими последствиями. Если Fade-скрытие еще не успело завершится, а уже вызывается Fade-появление, то последнее будет просто проигнорировано. Короче - полный разлад и совсем не адекватный результат. То же самое относится и к другим видам эффектов.

Для анимации такого рода необходим другой прием. При использовании transitions всё сразу встало на свои места. Конечно, это принесло другие сложности, но зато эффект появления/скрытия работает как часы.

Маскирование контента SWFLoader

Проблема связана со следующей особенностью. Клип интерактивной карты в процессе работы приложения может трансформироваться (трансформируемый клип расположен в главном таймлайне загружаемой флэшки). Но он должен отображаться в строго отведенной прямоугольной области. Казалось бы, чего проще - поместить его в Box, у которого horizontalScrollPolicy="off" verticalScrollPolicy="off" clipContent="false". Не работает. Причем странно - пока клип карты перемещается, границы отсекаются. Как только клип останавливается, всё что вылезает за пределы области появляется.

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

Воспроизведение FLV

В самом конце столкнулись со следующей проблемой. Презентация начинается с видео-заставки. Заставка - файл FLV, который подгружается в mx:VideoDisplay. Проблема заключалась в том, что компонент отказался воспроизводить внешнее видео, если презентация находится на удаленном сервере (с этим то всё ясно - включена опция -use-network=false), или на сменном носителе - записанная на CD/DVD (а вот это - критично).

К сожалению, FLV нельзя внедрить посредством @Embed. Но это может сделать Zinc, чем я немедленно воспользовался. Но такое решение не самое красивое. В дальнейшем придется выяснить, почему не воспроизводится FLV со сменных носителей, и как этого избежать. Возможно, необходимо установить параметры безопасности, а может быть проблема связана с задержками доступа к CD/DVD приводу в связи с чем, что-то рассинхронизировалось в приложении.

воскресенье, февраля 17, 2008

3-я встреча RAFPUG. Рабочие будни

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

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

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

Начал встречу, как всегда, Артемий, и анонсировал проект Adobe и иже с ним - портал Flashawards - несколько кривовато работающий (позже понял почему такое ощущение - объект флэш криво вставлен в HTML и в IE появляется злочастная рамочка), но вполне симпатичный, посвященный Первому профессиональному flash-конкурсу в России. Для начала, нашему вниманию был представлен призванный вдохновить всех флэшеров, забавный видео-ролик с зомбирующим образом быстро сменяющимися кадрами под чудесную музыку Save the Robots (Members Of Mayday), представляющий работы победителей предыдущего конкурса. Затем были вручены подарочки (обещаные на второй встрече) и Артемий обмолвился о скором выходе 3го FlexBuilder!

Цель моего сегодняшнего визита - послушать доклад Александра Козловского "Простой путь создания трёхмерного AIR приложения". Анонс был настолько завлекателен, что, казалось, только ради одного этого доклада стоило сорваться - анонсировалось и Papervision3D и создание AIR-приложения.

Я не буду обсуждать сам доклад - не имею такого права, т.к. сам не набрался сил и смелости что-либо вообще подготовить и докладывать.
В ходе доклада довольно подробно было продемонстрировано создание AIR-приложения и несколько поверхностно - использование Papervision3D.

Основные (лично для меня) моменты по созданию AIR приложения:
  1. Конфигурирование AIR-приложения. Все настройки хранятся в файле PROJECTNAME-app.xml. Важные для нас теги:
    filename - имя генерируемого файла.
    name - имя приложения (ВНИМАНИЕ - оно где-то в конце файла дублируется, что может вызвать недопонимание в процессе отладки).
    visible - будет ли видимым главное окно после старта.
    И другие - аналогично - пояснения есть для каждого в комментариях.
  2. Если нам нужно приложение в виде окна с тулбаром и тому подобными примочками, мы наследуем главный класс нашего приложения от mx.WindowedApplication. Если же нам всё это не нужно и мы хотим отсутствия всякого фона между нашей графикой и десктопом - просто от mx.Application.
  3. Создание tray-иконок для Windows и Apple платформ отличается. Если в Windows это место называется tray, то в Apple - это Dock. Соответственно, Александр предлагает нам проверять такие параметры как NativeApplication.supportsDockIcon и NativeApplication.supportsSystemTrayIcon. Затем, используя класс NativeMenu и иже с ним, мы создаем меню. ВАЖНО: Иконку лучше убирать принудительно, т.к. операционная система не всегда это делает самостоятельно. Для этого достаточно сделать NativeApplication.icon.bitmaps=[];.
  4. Для доступа к главному окну, используем SystemManager.Stage.NativeWindow.
  5. Для отлова Drag'n'Drop нам понадобятся события для ViewPort3D:
    NATIVE_DRAG_ENTER - вход мыши с драг'н'дроп-содержимым.
    NATIVE_DRAG_DROP - отпускание мыши с драг'н'дроп-содержимым.
    Кроме того, пользуется событие ADDED_TO_STAGE для инициализации.
  6. Важное замечание по Drag'n'Drop: используя объект события NativeDragEvent.Clipboard.getData(); можно получить переданное драг'н'дроп-содержимое. Дело в том, что при Drag'n'Drop-перетаскивании, данные складируются в буфере Clipboard, хотя, при этом данные, запомненные, к примеру, по Contrl+C не теряют своей актуальности.
  7. Сохранение файла:
    Stream=new FileStream();
    f=new File(File.applicationDirectory.nativePath+'...'); Где File.applicationDirectory.nativePath - текущая директория исполняемого приложения.
    Stream.open(f, FileMode.WRITE);
    Stream.WriteMultiByte("...data...");
    Stream.close();

По Papervision3D следующие заметки:

  1. Основные компоненты, которые необходимо создать и инициализировать: BasicRendererEngine - движок.
    Viewport3D - наследник Sprite для рендера изображения.
    Другие объекты - Scene3D, Camera (Camera.target - устанавливает объект, за которым будет наблюдать камера)

Другие заметки:

  1. Для прелоадера/сплэш-скрина используем объект-потомок ProgressBar. По окончании загрузки, диспатчим событие COMPLETE, после чего приложение Application получит событие PRELOADER_DONE.
  2. Для обновления приложения используем класс Updater. Класс выполняет лишь следующую функцию - сообщает AIR, что необходимо после закрытия приложения обновить его. Александр предложил самостоятельно скачивать и обновлять приложения с использованием библиотек ZIP-архивации.

Конечно, хотелось бы увидеть более подробное изложение, и, я думаю, если бы у Александра всё получилось так, как он планировал, так бы оно и было, но - обстоятельства выше нас. Несмотря на все трудности, доклад получился очень ценным и интересным.

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

В итоге, впечатление от встречи однозначно - Коллеги, хватит веселиться - настало время потрудиться. Наступили рабочие будни.

* * *

Исходники того, что демонстрировал Александр на RAFPUG-3 здесь. Про обновление AIR-приложения статья здесь (уже в "Чужой тетради").

пятница, февраля 08, 2008

Заметки по программированию серверных скриптов. SmartFoxServer

Серверные скрипт поддерживают стандарт ActionScript 1.0. Отсюда вытекают следующие последствия:
  • Функция trace() еще не поддерживает множественные параметры. После AS3 так трудно это принять!
  • Не нужно в описании переменных указывать тип. Когда я написал строчку var zone:Zone; SmartFox меня просто не понял... и проигнорировал.

вторник, января 15, 2008

Вторая встреча RAFPUG. Дети - наше будущее.

Владелец "Быстроупака" был чрезвычайно доволен. "Красиво составлено, - решил он, - под таким соусом и деньги дать можно. В случае удачи - почет! Не вышло - мое дело шестнадцатое. Помогал детям, и дело с концом".
Двенадцать стульев. Илья Ильф, Евгений Петров

Вторая встреча состоялась 14 января 2008. Несколько ключевых моментов: комьюнити, доклады, место проведения, дети.

Место проведения

Место нашли быстро, благодаря фотографиям, размещенным в анонсе. Иначе, можно было бы долго плутать между длинных заборов. Итак, к 17 часам мы оказались в заведении, именуемом "Московская физико-математическая школа №2". Кстати, впечатление вполне положительное - всё чисто, ухожено и культурно. Рядом со входом уже курили участники встречи в том числе Рост, Иван, Константинер, Таня и другие сотоварищи. Поздоровались - уухх руку не буду неделю мыть!

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

Доклады

После вступительного слова о пользе и благодарности компании Adobe, микрофон взял Andrew Shorten. Несколько раз оглушенный высокочастотными писками и скрипами из динамиков, он произнес хвалебную речь новым достижениям Adobe в области RIA. Доклад сопровождался переводом, что было хорошо для понимания, но убийственно для времени проведения мероприятия. Зато дети не скучали и внимательно слушали. После доклада много времени убилось на вопросы слушателей, в принципе не сильно важные и интересные.
Лично для меня, доклад внес ясность в некоторые вопросы касательно AIR. В остальном - просто обновил и подкорректировал общую картину продукции Adobe.

После буфета, последовал доклад про Flex 3. На этот раз обошлись без перевода и мне пришлось включить свой английский. Дети начали потихоньку линять.
Andrew на примерах рассказал о том, как сделать компонент, создать скин для компонента, показал новые фичи. Сильно подпортил картину тормозной компьютер, за который Andrew постоянно извинялся и краснел. Кроме того, примеры были уже "заготовлены", что смотрелось менее познавательно и убедительно чем в докладе Артемия Малкова на первой встрече. Но в итоге лично я остался доволен. Нас собрали, бесплатно рассказали о важных и познавательных вещах, да еще и покормили.

После нескольких вопросов-ответов, слово взял Enrique Duvos. Доклад читался на английском с испанским акцентом. Этот чертов испанец, в свойственной им манере, так зашустрил, что пришлось включить свой быстрый английский. А он у меня еще не доделан. Поэтому, информация усваивалась частично и большей частью читалась с экрана. Но на экране тоже было всё мелко и с нашего ряда неразборчиво.
И всё же, урывками, я получил общее представление о том, какие продукты являются open-source, какие нет, чем это всем грозит и как всё это замечательно. Дата-сервисы дались труднее. Впечатлила демонстрация синхронной работы двух флекс-приложений, причем, синхронизация осуществлялась мгновенно посредством сокетов через веб-сервис.
Почти все дети ушли. Остались самые стойкие. Точнее стойким был один. Он сидел в ряду перед нами и внимательно слушал. Его вид настолько меня впечатлил, что мне даже за себя стало стыдно что я половину читаемого не понимаю... Рядом дальше сидели два его товарища. Нет - они полулежали, полукрутились, полуспали и упирались лбами в спинки впереди стоящих стульев. Короче, создавали контраст, что вселяло еще больше уважения к первому стойкому. Не... если б мне обломился приз на розыгрыше, я б наверное отдал приз ему.

Перекусив парой-тройкой булок в буфете, мы перешли к заключительной части. Заключительная часть была сильно скомкана. И не удивительно. Уже был 10й час. Constantiner, уложившись в 10 минут поведал о RIA. Что можно рассказать о RIA за 10 минут? Только общие фразы, которые в основном нам всем уже известны. Жаль, что мероприятие началось так поздно - я убежден, что Костя хотел нам рассказать гораздо больше и интереснее.
Иван Дембицкий еще раз доказал свою компетентность и заслуженное уважение во flash-сообществе. Как я краем уха слышал без подготовки, Ваня выразил наше общее настроение, по сути, подведя резюме первой встречи.
Артемий Малков завершил выступления. Мысль его была направлена на внедрение flash в систему образования. Презентация его была украшена забавной анимацией, наглядно показывающей, как здорово на флэш смотрятся физические опыты. Однако, большое черное пятно в левом нижнем углу выглядело на экране проектора как тень от чьей-то прострелянной головы, что было еще забавнее.

В конце мероприятия провели розыгрыш призов. Все участники заполнили анкеты, из которых и выбирались счастливчики. Призы были действительно ценные - коробки с Flash CS3 (или Master Collection?), Flex Professional, iPhone nano, ну и по мелочи - рюкзаки. Правда призы застряли где-то по дороге, но обещали что их доставят почтой.
Мы-то знаем для чего нужен розыгрыш в конце мероприятия - чтоб народ до конца досидел и анкеты заполнил. Лишняя мотивация - перестраховались что ли? Сомневаюсь, что кто-то сидел ради призов.

А вообще, ребята из Adobe вызвали только положительные эмоции. Веселые, симпатичные парни, вызывающие доверие и располагающие к разговору. Всё шутили, но на вопросы отвечали довольно серьезно. И не удивительно - специально обученые бойцы Adobe.
Кто-то говорил, что будет Суми Лим (глобализейшн менеджер). Но, то ли я ее не заметил, то ли я что-то не догнал, то ли ее не было.

Впечатления

  • Жаль что поздно начали. Во второй половине дня уже мозг плохо воспринимает информацию и зовут домашние дела. И времени явно не хватило.
  • Доклады, несмотря на многие недостатки, оказались очень ценными и я нисколько не жалею о потраченном времени.
  • Идею преподавать программирование на Flash в школах лично я поддерживаю, т.к. у флэша есть одно главное преимущество - с ним интересно работать. Детям это будет увлекательнее чем бэйсик. Кроме того, в комплексе могут быть даны основы графики и анимации.
    Но есть одно НО. Преподавать надо соблюдая правила программирования, чтобы не запудрить детям мозг нетипизированными переменными, глобальными _root-ами и другими вредными особенностями ActionScript. А еще точнее - преподавать надо не ActionScript, а программирование согласно стандарта ECMAScript. Иначе можно "попортить" наших программистов.
  • Насчет вопроса о преподавании Flex в ВУЗах сомневаюсь. Точнее, преподавать нужно, но факультативно. Пусть учащиеся сами выбирают кем они хотят быть и на чем хотят программировать. Создавать факультет Flex-разработчиков или кафедру Flash, на мой взгляд, мало кто согласится. Это узкая специализация. Хотя, кто знает... RIA-специалист, возможно вполне реальная специальность. Но она много чего в себя должна включать. А Flash/Flex-разработка лишь как составляющая.
    Вызвало недоумение утверждение Артемия Малкова по поводу преподавания Flash/Flex - (по памяти) - "Если кто-то рисует хорошо - будет рисовать, кто-то похуже - будет программировать". Как-то однобоко. А если и программировать не умеет? В расход пускать?
  • Ждем следующей встречи!

* * *

Поправки.

По-видимому до нашего ряда иноязычная речь дошла с искажениями и вот, появились уточнения и коррекции. Призы - Flex Builder 3 Professional, Creative Suite 3 Web Premium, iPod Nano.

вторник, декабря 25, 2007

От AS3 к AS2. Впечатления.

Вышеупомянутый проект в срочном порядке пришлось переносить на AS2 - благо он не сложный и это заняло 2-3 часа.
В итоге интересные замечания:


  1. Сортировка массива методом sortOn(): не проходит сортировка по полям-возвращателям get.
  2. Работа с классом Tween не изменилась кроме обработки событий.
  3. При работе с классом EventDispatcher возникла любопытная путаница. В AS3 в addEventListener вторым параметром идет метод обработчика, а в AS2 - объект, который содержит метод с именем события. Так вот, если оставить имя метода во втором параметре, именно этот метод и вызовется. Но область видимости будет принадлежать объекту, пославшему событие.
  4. Готовность классов клипов: в AS3, из конструктора класса (к примеру MovieClip) сразу полностью доступны все содержащиеся в нем клипы. В AS2 же, из конструктора не доступны свойства классов (с которыми ассоциированы клипы) внутрилежащих клипов, и доступ к ним будет возможен только на этапе события onLoad.

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

Кроме того. Возникли странные проблемы с закэшированными в таймлайне клипами. Если клип с cacheAsBitmap=true менялся внешне (rotation,tint и т.п.):

  • При AS3 с компиляцией под FP9 всё Ок.
  • При AS2 с компиляцией под FP8, всё Ок.
  • При AS2 с компиляцией под FP9 с ним просто ничего не происходит.

воскресенье, декабря 16, 2007

Первое собрание Russian Adobe Flash Platform User Group. Взгляд зрителя

Сегодня удалось поприсутствовать на первом собрании Russian Adobe Flash Platform User Group.
Честно говоря, это первое мероприятие, посвященное флэш-технологиям, на котором я присутствовал когда-либо.
Впечатления противоречивы, но, думаю, отрицательные эмоции - лишь результат депрессивного состояния от накопившихся неблагоприятных обстоятельств, преследующих меня последнее время.

Я чуть опоздал на первый доклад ("Flex + Flash = ") и пропустил имя докладчика - представителя Adobe (* Артемий Малков *). Давались основы Flex-разработки на Flex Builder 2. Очень ценный доклад лично для меня - я еще не имею практики работы с визуальным редактором Flex и MXML. Легкая и наглядная подача: на примерах, которые кодились прямо на глазах у слушателей. Доклад рассчитан на широкую аудиторию, в основном, для начинающих.

Второй доклад ("Работа с событиями в ActionScript 3 и Flex") для тех, кто уже попробовал себя в разработке Flex-приложений на AS3. Костя Constantiner снизошел к нам из Питера и довольно доходчиво, но всё же несколько сжато рассказал про события в AS3 и Flex и их особенности.

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

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

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

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

* * *

Фото и видео со встречи:
Блог flashimp,
Результаты первой встречи User Group

среда, августа 15, 2007

FlashDevelop. Первые впечатления

Теперь попробуем редактор в действии.
Для начала, я взял пример с роботом из архива APE alpha 0.45.
Создаем новый проект: Project > New Project > ActionScript 3 - Default Project. Здесь мы даем название проекту и указываем где будет располагаться рабочий каталог.
После создания проекта, в указанном каталоге появились подкаталоги bin, classes, library. В каталоге classes появился файл Main.as, в котором описывается пустой класс "Main".
Внимание! Программа выдает сообщение, что в каталоге есть файлы. Если там уже есть файл Main.as, что бы в нем не было, он будет заменен на файл пустого класса (и я на это попался).

Итак, справа в закладке "Project" отображаются все рабочие файлы проекта. Удаляем Main.as и отмечаем для RobotDemo.as во всплывающем меню "Always Compile". Таким образом, этот файл при компиляции будет основным. Имя результирующего SWF, по команде "Test movie" и "Build Project" будет соответствовать названию проекта.

В свойствах проекта множество настроек. Понравилась возможность указывать командные строки до и после компиляции. Рекомендую сразу установить "Open SWF in" = "External", чтобы "Test movie" открывалось в проигрывателе а не новой закладкой в основном окне редактора.

Немного поигрался настройками робота и довел его до полной самодеструкции на первых же секундах движения.

Впечатления по редактору. Чувствую себя комфортно. Решил бросить свой старый устоявшийся еще с турбо-паскаля стиль программирования (точнее форматирования) и перейти на стандартный. Здесь в этом есть смысл - табуляции отображаются пунктирной линией, что четко отражает структуру кода.
Автоподстановка работает прекрасно, ловко предугадывая, где надо предложить варианты. И делает это без "фанатизма", если в ее услугах не нуждаются. Сама подстанавливает при необходимости директивы "Import Имя класса" над описанием класса. Кроме того, автоподстановка хватает на лету только что созданные классы, их методы и свойства.
Важно - комментируя методы использовать ключевые слова"@param", "@private". Тогда автоподстановка станет еще умнее.


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

Очень понравилась система "Snippet" - вставки шаблонов кода.
Если зайти в "C:\Program Files\FlashDevelop\FirstRun\Snippets\as3\", там лежит набор стандартных шаблонов. Я тут же забил туда кучу новых шаблонов и вскоре успешно ими воспользовался. В шаблонах предусмотренны ключевые слова типа $(EntryPoint). Список всех ключевых слов здесь. Нажимаем Ctrl+B и пишем что-либо. В появившемся списке отбираются названия (или имена файлов) шаблонов, содержащих это что-либо. Выбираем нужный шаблон и ... получаем нужный фрагмент кода.
Таким образом, мы здорово облегчаем себе жизнь и ускоряем рабочий процесс.

Пока не совсем всё понятно с отладкой. Я нашел только trace и это возможно так:
  • Используем fscommand("trace", message);
  • Используем методы классов из "C:\Program Files\FlashDevelop\FirstRun\Library\AS3\classes\org\flashdevelop\utils\" - FlashConnect, FlashViewer, TraceLevel.

Завтра будем пробовать плагины для FlashDevelop.