Flex и RIA блоги
2008-02-09 |
UAFPUG — гости из Москвы :) На встречу флэш-разработчиков в Харькове приехала Татьяна '0xFFFFFF' Белая. Вот это сюрприз! Мы вас ждем :) |
2008-02-08 |
Заметки по программированию серверных скриптов. SmartFoxServer Серверные скрипт поддерживают стандарт ActionScript 1.0. Отсюда вытекают следующие последствия:
|
Класс Zone. Server Side API. SmartFoxServer Класс Zone представляет методы управления и доступа к данным зоны сервера SmartFoxServer. addBuddy(who, buddyName) Добавляет друга (buddyName) в список друзей пользователя (who) . checkBuddy(buddyName) Проверяет, что друг (buddyName) авторизован в текущей зоне. возвращает boolean. clearBuddyList(who) Очищает список друзей пользователя с именем who. getAutoJoinRoom() Возвращает идентификатор комнаты для автоматического входа в текущей зоне. getEmptyNames() Возвращает true, если в текущей зоне включена опция "EmptyNames". getCountUpdate() Возвращает true, если в текущей зоне влючена опция "uCountUpdate". getMaxRooms() Возвращает максимальное число комнат, доступное в текущей зоне. getMaxUsers() Возвращает максимальное число пользователей, доступное в текущей зоне. getName() Возвращает имя текущей зоны. getRoom(roomId) Возвращает объект комнаты с идентификатором roomId. getRoomByName(roomName) Возвращает объект комнаты с именем roomName. getRoomCount() Возвращает текущее количество комнат в зоне. getRooms() Возвращает список объектов Room всех комнат зоны. getStatus() Возвращает true, если зона в состоянии активности. getUserCount() Возвращает текущее число пользователей зоны. getUserList() Возвращает список java.util.List, содержащий всех пользователей, авторизованных в зоне. hasBuddyList() Возвращает true, если для текущей зоны включена поддержка списков друзей buddyList. removeBuddy(who, buddyName) Удаляет друга (buddyName) из списка друзей пользователя (who). setPubMsgInternalEvent(flag) Если установить в true, каждый раз, при поступлении публичного сообщения на сервер, будет генерироваться внутреннее событие. Это полезно для ведения журнала сообщений. По умоляанию false. |
UAFPUG: новое место встречи — ХИРЭ Внимание всем, кто едет на UAFPUG. В связи с большим количеством желающих место проведения встречи сильно изменилось, чтобы все смогли уместиться. Встреча состоится в то же время (14:00) в помещении ХИРЭ (ХНУРЭ) — Харьковского Университета Радиоэлектроники (Технопарк “Intellectronics”). Станция метро "Научная", пр. Ленина 16 (перекресток ул. Бакулина и пр. Ленина). Плюсы: в разы ближе к центру Харькова (в общем-то, это и есть центр). Есть проектор, ноутбук, доска с маркерами, мебель для удобного размещения тел участиков (наличие WiFi уточняется). Вот обновленная схема прохода к месту встречи UAFPUG от ст. метро "Научная". Пожалуйста, сообщите эту информацию всем, кому сможете. |
Взаимодействие с клиентом. SmartFoxServer Главным управляющим объектом серверного скрипта SmartFoxServer является _server. Для общения с криентом, в основном используется метод sendResponse(). _server.sendResponse(response, fromRoom, sender, recipients, type) response - объект, который содержит все свойства и объекты, которые необходимо передать клиенту. По соглашению, объект должен содержать свойство _cmd с именем команды. fromRoom - здесь можно указать идентификатор комнаты, из которой сообщение поступает. Если это ненужно, указывается -1. sender - объект User пользователя, которого мы хотим указать в качестве отправителя сообщения. recipients - массив, содержащий один или более объектов User пользователей-получателей type - формат передаваемых данных. По умолчанию "xml". Для передачи в виде строковой сериализации - "str". Другой метод sendGenericMessage() может служить для реализации собственных или модифицированных версий стандартных сообщений сервера. Например, можно отключить некоторые сообщения сервера и создать свои собственные версии этих сообщений. _server.sendGenericMessage(xmlMsg, sender, recipientList) xmlMsg - XML-сообщение. sender - объект User пользователя-отправителя. recipientList - список объектов User пользователей-получателей. Пример ниже показывает как отправить клиенту данные комнаты, где он в данный момент авторизован: function sendSmallRoomList(r, who) { var msg = "<msg t='sys'><body action='rmList' r='-1'>" msg += "<rmList><rm id='" + r.getId() msg += "' priv='" + (r.isPrivate() ? "1" : "0")] msg += "' temp='" + (r.isTemp() ? "1" : "0") msg += "' game='" + (r.isGame() ? "1" : "0") msg += "' ucnt='" + (r.getUserCount()) msg += "' maxu='" + r.getMaxUsers() msg += "' maxs='" + r.getMaxSpectator() msg += "'><n><![CDATA[" + r.getName() + "]]></n></rm></rmList>" msg += "</body></msg>" _server.sendGenericMessage(msg, null, [who]) } Другие команды для более узкого применения: _server.dispatchPublicMessage(message, room, user) - послать публичное сообщение. message - текст сообщения room - объект Room комнаты, в которую посылается сообщение user - объект User пользователя-отправителя _server.dispatchPrivateMessage(message, room, sender, recipient) - послать приватное сообщение. message - текст сообщения room - объект Room комнаты, в которую посылается сообщение sender - объект User пользователя-отправителя recipient- объект User пользователя-получателя _server.sendModeratorMessage(message, sender, type, id) - послать сообщение модератора. message - текст сообщения. sender - объект User пользователя-отправителя. type - масштаб рассылки: _server.MOD_MESSAGE_TO_ZONE - всем пользователям зоны. _server.MOD_MESSAGE_TO_ROOM - всем пользователям комнаты. _server.MOD_MESSAGE_TO_USER - конкретному пользователю. id - к этому параметру нет объяснения. _server.sendRoomList(who) - послать список комнат пользователю. who - объект User пользователя-получателя. Кроме явно отправляющих ответы методов, есть ряд других, опционально отправлящих сообщения, информирующие клиента о каких-либо действиях: _server.createRoom(roomObj, user, sendUpdate, broadcastEvt, roomVars, varsOwner, setOwnership) _server.joinRoom(user, currRoomId, leaveRoom, newRoom, pwd, isSpec, sendUpdate) _server.leaveRoom(user, roomId, broadcastAll) _server.setUserVariables(who, varList, sendUpdate) _server.switchSpectator(user, roomId, broadcastAll) Следующие функции пока оставим без внимания - назначение их специфично: _server.requestAddBuddyPermission(sender, targetUserName, optionalMessage) _server.sendBuddyListUpdate(user) _server.sendMail(from, to, subject, message) _server.setBuddyBlockStatus(user, buddyName, isBlocked) _server.setBuddyVariables(user, variables) |
ДНК Macromedia в Adobe: первые результаты Из статьи о пути директора Макромедии Стефана Элопа мы знаем: склоняя президента Макромедии к слиянию с Адоби, сейчас уже бывший президент Адоби Брюс Чизен утверждал, что ему нужны не столько деньги и популярность Макромедии, сколько дух инновации, ДНК гениев технологии. Потом было слияние и встреченные паникой старожилов-адобовцев назначения макромедийцев на высокие посты в Адоби; затем было не-назначение президентом Адоби и уход Элопа, а также уход от президентства самого "скорее маркетолога" Чизена, на смену которому пришел "скорее технарь" Шантану Нарайен. В январе 2008 Элоп присоединился к проекту Microsoft Office. А что с Adobe? Большой поворот в Adobe: Кевин Линч управляет Платформой5 февраля 2008 г. Кевин Линч из должности Chief Software Architect был переведен в должность Chief Technical Officer. Это не повышение: скорее, это расширение, сопровождающееся повышением. Но никак не банальное движение вверх по служебной лестнице. Теперь Кевин Линч будет управлять судьбой продуктов Adobe в целом. Ему надлежит согласовывать действия всех ключевых подразедений. Частью роли Линча остается его предыдущая роль — управление технологиями Adobe для дизайнеров и разработчиков, что включает в себя Adobe® Flash® Player, Adobe Flex® и Adobe AIR™, PDF, Adobe® Reader®, а также совместимость серверных решений с остальным. Adobe Labs также находится под его контролем. Но что меняется? Доля RIA-технологий в Adobe становится доминирующейБольшие компании типа Adobe — это существа весьма громоздкие, чтобы их можно было в один миг развернуть в новом направлении. Но Кевину Линчу предстоит именно эта работа. Фактически, он уже проделал большую ее часть, и переход на новую должность — это неизбежное следствие его действий. Наверное, Кевин делал больше, чем от него ожидали. Из зарплаты своей вылез, что ли :) Adobe меняется. И сейчас, когда паника после объединения компаний уже ушла, и ушли даже инициаторы этой паники — начинается новый отсчет времени для Adobe. И вам я советую — начните новый отсчет для этой компании и ее продуктов, будете лучше понимать происходящее с вашими любимыми программами. JD, старожил и оракул Макромедии, по этому поводу говорит: "Как я понимаю, задачей Chief Software Architect является построение структуры, в то время как задача [новой должности Линча] Chief Technology Officer — определять природу выстраиваемой структуры. Приобретение Macromedia было азартным ходом; мы поставили на возможность объединения документов с видео и с экранной интерактивностью. Сейчас я понимаю: да, мы видели цель, и обязаны достичь ее. Я вижу Платформу, на которой стоит все, что мы попытаемся построить, начиная с этого момента. И это крайне волнующий момент." |
Распределенные вычисления “нахаляву” Навеяно http://stary71.livejournal.com/5875.html и постом Роста “Две идеи на мильон”. Несмотря на то, что я буду немножко критиковать вышеупомянутые идеи, для меня это всего лишь повод рассказать о моих реальных приключениях на ниве распределенных вычислений. Итак, идея. Есть ОЧЕНЬ БОЛЬШОЙ объем вычислений, который можно распараллелить для их исполнения на множестве машин. Соответственно, тот, кому надо эти вычисления выполнить, согласен за это заплатить. Как это можно использовать: 1. Продавать в MMORPG время машин юзеров, которые в неё играют, и таким образом окупать игру. 2. Заставить считать сложные вычисления флеш-баннеры. Радует, что идеи очень позитивные и оригинальные Начнем с того, что есть. А есть открытая (Open Source) платформа BOINC от института Berkeley, которая позволяет производить распределенные вычисления на разных машинах. Лично я принимал участие в проекте Rosetta@home в команде TSC! Russia. Платформа имеет клиент-серверную архитектуру. Сервер раздает задания, клиент их выполняет, в порядке очереди. Особое внимание стоит уделить тому, что просчет одного задания занимает в районе нескольких часов (первое ограничение для флеш-баннеров). Во-вторых, BOINC-платформа исполняет native-код. В свое время, во время курса “Параллельная обработка данных” мне засела в голову мысль, что можно написать более удобную платформу, чем BOINC, а именно, на базе AIR. Главным преимуществом могли стать система автообновления, встроенные примитивы для работы с сетевыми протоколами, а также универсальный клиент для разных операционных систем. Увы, первые же эксперименты меня серьезно отрезвили. В качестве задачи была взят взлом MD5-хеша (задача: дан MD5-хеш от строки, найти строку. Решается полным перебором, обратная функция на данный день неизвестна). Задача очень легко параллелится. Native-программа, которую я взял для сравнения, считала хеши в 1000(!) раз быстрее, чем написанная мною на AIR. Т.е. при распределенных вычислениях, когда основной проблемой является привлечение пользователей, мне для достижения той же эффективности, что и BOINC, придется привлечь в 1000 раз больше пользователей. Нереально И, наконец, третье. Я уже упоминал, что свои вычисления проводил в рамках некоей команды (TSC! Russia). За вычисления в системе дают некоторые очки, которые создают спортивный момент мероприятия. Последнее - немаловажный фактор, благодаря чему отдельные люди объединяются в команды. Соответственно, наиболее рьяные вычислители, чтобы получить побольше очков, подключают все машины, которые находятся в их ведении, например, на работе или в институте, когда машины простаивают. И, насколько я мог судить, именно эти машины обеспечивают главную долю вычислительных ресурсов. Увы, если я прав, вариант с MMORPG тоже отпадает. Ну, и наконец, сладкое. Считал я в Rosetta@home дней 7, подключил две машины, наслаждался вкладом в общемировой прогресс |
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 решают эту задачу на "отлично". Но — кто уже пробовал эти новые возможности? Что скажете? |
Серверные скрипты (Extensions). SmartFoxServer Серверные скрипты (я так обозвал термин Extensions, т.к. дословный перевод, типа расширение или серверное расширение, на мой взгляд, менее точны и понятны) - это Java или Actionscript 1.0 (Javascript/ECMA-262) код, для реализации серверной логики. Применительно к ActionScript (другие варианты я рассматривать не буду), скрипты содержатся в файлах типа .as, размещенных в директории sfsExtensions (для Windows это "C:\Program Files\SmartFoxServerPRO_1.6.0\Server\sfsExtensions\"). Для того, чтобы сервер обрабатывал скрипт, необходимо зарегистрировать его в файле конфигурации config.xml. Выглядит это примерно так: <Extensions> <extension name="myExt" className="myExtension.as" type="script" /> </Extensions> Здесь name - имя скрипта, к которому осуществляет обращение клиент, className - имя файла скрипта. Кроме того, можно динамически закрепить скрипт за динамически создаваемой комнатой (см. SmartFoxClient.createRoom). Теперь можно из клиента посылать запрос на выполнение скрипта (см. SmartFoxClient.sendXtMessage): server.sendXtMessage("myExt", "helloWorld", obj); Сообщения, получаемые клиентом от серверного скрипта обрабатываются примерно так: smartfox.onExtensionResponse = function(resObj:Object, type:String) { var cmd:String = resObj._cmd if (cmd == "myCommand") { // Handle the response here } } Роль серверных скриптов в архитектуре сервера хорошо видна на диаграмме: ![]() Как видно из схемы, серверные скрипты могут размещаться на двух уровнях: уровень зоны и уровень комнаты. Скрипты уровня зоны имеют доступ ко всем комнатам и клиентам, подключенным к любой из комнат. На уровне комнаты, скрипты оперируют только с конкретной комнатой и ее пользователями. Скрипты уровня зоны можно применять для реализации межкомнатных взаимодействий. Скрипт уровня комнаты хорошо использовать для создания игровой логики в пределах одной комнаты, а затем применять его к любой из игровых комнат. Для сложных игровых серверов, лучше применить подход с использованием скриптов уровня зоны. Для простых игр, удобнее использовать скрипты уровня комнат. Основные функции серверных скриптов: init() - инициализация серверного скрипта. Вызывается автоматически, как только сервер загрузил скрипт. destroy() - вызывается перед уничтожением серверного скрипта. handleRequest(cmd, params, user, fromRoom) cmd - имя запроса. При формировании запроса, для снижения трафика, рекомендуется делать имена короткими. params - объект с данными, котторые передал клиент серверу. user - объект пользователя. fromRoom - идентификатор комнаты, из которой поступил запрос. handleInternalEvent(eventObject) - реагирует на внутренние события сервера. Список событий сервера: userJoin - пользователь вошел в зону/комнату. userExit - пользователь вышел из комнаты. userLost - пользователь отключился newRoom - создана новая комната roomLost - в зоне была уничтожена комната loginRequest - пользователь послал запрос на авторизацию spectatorSwitched - в игровой комнате, наблюдатель переключился в игрока. Проверим на практике. Создаем свой серверный скрипт и попробуем посмотреть, как он будет реагировать на события. Создаем скрипт test.as в вышеописанной директории: function init() { trace("Initialization") } function destroy() { trace("Destruction") } function handleRequest(cmd, params, user, fromRoom) { trace("cmd="+cmd+" params="+params+" user="+user+" fromRoom="+fromRoom); } function handleInternalEvent(evt) { trace("eventName="+evt.name); } Поместим в Config.xml в нашу созданную ранее зону запись: <Extensions> <extension name="tst" className="test.as" type="script" /> </Extensions> Теперь рестартуем сервер. Или нажимаем "Reload Zones" для перезагрузки зон (?). Чтобы просмотреть результаты трейсов, можно использовать окно консоли или зайти в SFS Admin Tool в раздел Zone Browser -> Extensions View -> Trace Window. В серверной консоли можно посмотреть результат трейсов из init и destroy. Просмотреть эти трейсы в реальных условиях в Admin Tool невозможно, так как скрипты, прописанные в конфигурации инициализируются сразу после старта сервера и удаляются непосредственно перед выключением. Однако рядом есть кнопочка "Reload Ext.", где скрипт убивается и опять инициализируется. Здесь то мы и видим наши трейсы. Что ж, наш скрипт исправно работает, и трейсит все события. Он даже принимает наш запрос: smartfox.sendXtMessage("tst", "testCommand", {value:1}, "xml"); Интересная особенность - сервер не обрабатывает запрос, если третий параметр (объект с данными запроса) установлен в null. Если некорректно задать другие параметры, это еще объяснимо, но если мне не нужно передавать никакие данные? Теперь попробуем получить ответ от сервера. Добавим в серверный скрипт в метод handleRequest новый код: function handleRequest(cmd, params, user, fromRoom) { trace("cmd="+cmd+" params="+params+" user="+user+" fromRoom="+fromRoom); var response = {} response._cmd = "response" _server.sendResponse(response, -1, null, [user]) } И в свою очередь, добавим клиенту обработчик события onExtensionResponse: . . . this.__sfs.addEventListener(SFSEvent.onExtensionResponse, this.onExtensionResponse); . . . public function onExtensionResponse(evt:SFSEvent):void { trace("Пришел ответ от серверного скрипта: "+evt.params.dataObj); } Теперь наш клиент получает на свой запрос ответ от серверного скрипта. |
2008-02-06 |
Карта сокровищь или как ехать на UAFPUG #1 Небольшой план месности в фотографиях: фоток ж/д вокзала нету ( на ЖД вокзале садимся на метро и едем на станцию метро “советская” и выходим на поверхность или такое (стрелка — дом со скрипачем на крыше, скрипча почти отсюдого невидно) добиваемся эффекта приведенного на следующих фотках (нужно идти пешком 30-120 секунд): перед лицом дома сзади стоят танки должны увидеть очереди на маршрутки: или или ( видны 265 маршрутки) Садимся на маршрутки (286, 278, 265) и просим высадить возле Проходной института ХАИ (или возле Хартрона, или возле спорткомплекса ХАИ), ехать минут 30 5. Хартрон (красная стрелка показывает направление откуда едет маршрутка) Красная большая хрень с названием “Спорткомплекс ХАИ” тут видна часть проходной и сама проходная Вот под этим фонарем мы вас ждем! UPD: Читаем подробно о мероприятии: |
FPUG: Самообучающееся сообщество разработчиков? Запросто! Встреча RAFPUG-2 в Москве началась для меня немного раньше, чем я прибыл в Москву. Во-первых, с некоторыми я был уже знаком через сеть. Во-вторых, в поезде я ехал не сам, а с Эльдаром 'Pirrest' Прилуцким. Уже два года мы собирались на пиво в Харькове, а пили его в поезде Харьков-Москва (Эльдар помог мне с билетом практически за час до отправления — без его советов по мобильному я мог не попасть на поезд). По дороге в Москву Эльдар дебажил флекс-проект на своем ноутбуке. В перерывах мы курили, общались и встречали Старый Новый Год втроем — Эльдар, Ноутбук и я. Общение, как мы ни стремились этого избежать :), происходило на профессиональные темы. От Эльдара узнал много для себя интересного (хорошую беседу не заменить ничем) и, что важно, ноутбук Эльдара также открыл мне несколько тем. Подробнее о роли ноутбука в среде разработчиковУ меня было предвзятое отношение к ноутам, как к некоему излишеству. Но тут, когда Эльдар при мне отлаживал свой проект (флэш-интим:), делясь по ходу собственными мыслями, я понял: ноутбук очень полезен именно в таких ситуациях! Оперативно поделиться друг с другом личными практиками разработки, на живых примерах — как раз то, что нужно. Поэтому, собираясь на встречу с флэш-девелоперами, не забудьте взять с собой ноут; возможно, для этого вам придется его купить — купите. В преддверии встреч в Харькове 9 февраля (регистрируемся!) и в Москве 17 февраля 2008 г. — подумайте, что вы можете показать брату флэшеру на своем ноуте. Два применения ноутбука в сообществе девелоперов
Лишение флекс-девственности при помощи ноутбукаНе секрет, что множество флэш-разработчиков даже не смотрели в cторону Flex, хотя уже активно осваивают или совсем освоили AS3. Общаясь с такими людьми, я заметил — многие отвергают Флекс не потому, что он им не нравится, а потому, что они ни разу не пробовали его использовать. Даже не устанавливали Flex Builder и не скачивали его, у многих в офисе / дома есть лимит трафика (увы)! Таким образом, эти потенциальные флекс-девелоперы даже не знают, что они теряют. Хорошо, что некоторые из них посещают встречи, видят там флекс на презентациях, а также читают о нем в блогах. Но они не щупают его. И окажись рядом с таким фатально несостоявшимся флекс-девелопером Эльдар с ноутбуком — многое меняется. Дайте человеку потрогать технологию руками, и он уже не будет воспринимать ее как нечто абстрактное, его личный контакт с флексом состоялся! Он вернется домой и попробует Flex дома. В его арсенале станет на один главный инструмент больше. Это же относится и к знакомству с фреймворками. Часто человек просто не знает, с чего начать. Показав ему на ноуте создание простейшего проекта, дав ему увидеть это воочию — получаем разработчика, выросшего на голову. Такой процесс распространения знаний внутри сообщества назовем микроевангелизацией — мы учим друг друга, и мало тех, кому нечему поучиться у других. Подробнее о микроевангелизации и ее путях — в следующей записи цикла "FPUG для нескучных ребят". Кстати, свой проект Эльдар в поезде отладил успешно. |
Флэшеры! Обратите внимание на Social Graph API Как известно, Брэд Фицпатрик (создатель ЖЖ, перешедший в Гугл) завершает разработку своего нового проекта — так называемого социального графа (на русском). Почитайте внимательно, публичный API будет доступен совсем скоро, а вытворять на этом можно будет такое, что мама не горюй. Уже сейчас можно поиграть с Social Graph. |
Регистрация участников встречи в Харькове, 9 февраля 2008 г. Друзья! Как вам известно, 9 февраля (в эту субботу) в Харькове пройдет встреча флэш- и флекс- разработчиков. Напоминаю, что первая часть встречи будет проходить в ХАИ. Возникла необходимость регистрации всех участников встречи. Пожалуйста, оставьте в этой записи группы uaFlash свои имя и фамилию, если вы будете присутствовать (можно также вписать никнейм, адрес сайта, название компании и город). |
Flash сайт FIFA Street 3
Или, опять об использовании 3D во Flash сайтахНу что ж, снова здраствуйте. Сегодня речь пойдёт о новом сайте новой не Flash игры FIFA Street 3. Честно говоря, когда я его увидел, немножко офигел, если вы мне позволите такие выражения. Просто всё ну уж очень круто сделано, особенно сильные впечатления от первых минут просмотра, когда надеешься, что вот, наконец-то, хоть кто-то сделал 3D игру с отличной графикой во Flash, но не тут то было. Как обычно и бывает, вся 3D анимация на сайте — это грамотно вставленное видео. Но, кстати, элементы 3D сделанные программно тоже присутствуют, но об этом позже... |
Событие от компонентов 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 |
Авиаторы готовы к выпуску инструментов онлайн-дизайна Совсем скоро Авиаторы, готовящие к выпуску 14 онлайновых дизайнерских инструментов для браузера, запустят свои истребители дизайна-один-ноль. Многие пиксели будут истекать прошлым, да. Работать это будет вот так (прошу прощения за
Самое опасное в Авиаторах: у них в активе сонмище голодных фотожаберов, готовых вести целые эскадрильи новых истребителей дизайна, каким мы его знали. (Я писал). И еще одна дикая штука топчется у порогаЖелающих поиграться безумными таблицами приглашает Blist — онлайновая база данных, построенная вокруг мутаций Flex DataGrid (как мне кажицо) (пару слов от Шаграта).Такие вот сумасшедшие флэшово-флексовые апликации. Держите крышу, господа. |
Параметры конструктора. MXML Определяя класс для последующей его вставки в MXML, при объявлении конструктора, необходимо указать для всех его параметров значения по умолчанию. Иначе возникает ошибка "1136: Incorrect number of arguments. ". Других способов избежать ошибки я не нашел. |
День выборов? В жопу политиков, голосуем за исправление багов!
1. Идите в систему учета Flex-багов: http://bugs.adobe.com/flex Не забывайте, что можно также добавлять новые баги — но убедитесь сначала, что его еще нет в системе. Друзья! Давайте, вместо того, чтобы жаловаться на индусов, поможем разработчикам Flex найти самые злобные баги! Попиарьте это, пожалуйста. |
Дмитрий Краснов — с места во Флекс На Потрошителе стали появляться комментарии некоего 'Kradar'a. Комменты со вкусом — соотношение перца и соли выдержано. Что делает человек, пишущий все больше полезных комментариев? Он открывает свой блог. Встречайте: Дмитрий 'Kradar' Краснов (RSS), человек с опытом в Java, пришедший во Flex. Он пишет об управлении компиляцией и доступе к SWC-библиотекам в FDT — емкая статья для всех, кто хочет начать дружбу с Flex. А также пишет о MODx, серверной составляющей Flash-сайта. Это система управления содержимым для Flash-сайтов (CMS), выглядит привлекательно: поддержка плагинов, создание HTML-версии — почитайте оригинал. |
2008-02-04 |
9-10 февраля 2008 г. — встреча разработчиков в Харькове Update: вот это совпадение! В этот же день, в Харькове, планируется еще одна встреча разработчиков (не флэш). В эти выходные, 9-10 февраля пройдет встреча флэш- и флекс- разработчиков в Харькове. Эта встреча, по сути — учредительное собрание, один из последних шагов на пути к UAFPUG (сайт уже есть). Программа уточняется, вероятен формат нескольких компактных докладов. Встреча пройдет в аудитории ХАИ (Харьковский Авиационный Университет). Емкость аудитории: 15-20 человек. Время: 14:00, суббота, 9 февраля 2008 г. Место: г. Харьков, ул. Чкалова, 17, ХАИ. Как проехать: Автобусами 278, 286 и 287, троллейбусом 2 — до остановки Хартрон. Большая просьба всем желающим — отпишитесь об участии в комментариях. Очень хочется увидеть гостей из России :) |
Извилистый маршрут директора Макромедии Стефана Элопа Сначала немного дат:
Возникает вопрос — почему Стефан Элоп ушел из Adobe? Вернемся к моменту слияния Adobe и Macromedia. Как рассказывал сам Элоп, дело было так: Брюс Чизен, президент Adobe, встретился со Стефаном Элопом в итальянском ресторане. Брюс признался Стефану, что Адоби нуждается в Макромедии. И нуждается не столько во флагманском ПО Макромедии (Flash и Dreamweaver) и их маркетинговых связях, сколько в инновационном ДНК команды макромедийцев. В их способности принимать смелые решения, генерировать интересные идеи — этого не хватало Adobe. Действительно, назвать Adobe инновационной компанией можно, но только не зная Macromedia. Что дальше? После слияния Брюс Чизен уделил много внимания тому, чтобы ключевые Макромедийцы заняли ключевые посты в Adobe. Это вызвало не очень бодрое настроение у старожилов Адоби — и это понятно. Так что Брюсу Чизену пришлось умерить раздачу должностей Макромедийцам. Главным поворотным моментом в "откате" Adobe после слияния стало назначение на пост нового президента Adobe не Стефана Элопа (который на этот пост рассчитывал), а старого соратника Брюса Чизена, технаря Шантану Нарайена. Поэтому неудивительно, что Стефан Элоп, всегда стремившийся к карьерному росту прирожденный директор, ушел из Adobe. Затем он поработал главным в Juniper Networks, а затем принял предложение от Microsoft. Теперь он будет рулить Microsoft Office. |
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-02-03 |
ZOOM’бала, она же загатовка для масштабируемой Flash карты
Вопрос:Привет. Спасибо за ресурс. Впервые нормально оформлен, отлично описан, доходчиво рассказан, что для чего и почему. Что очень радует. И ещё раз спасибо. Хотел бы предложить наверное ещё одну тему из всеобщего обсуждения, "а как это сделать?" ;) А именно, флеш карта... С прокруткой, зумом описанием обьектов и других примочек. Ответ:А что я могу сказать? =) Конечно полностью масштабируемую Flash карту делать за вас я не буду, но заготовочку, как пищу для размышлений, подкину. Кстати, хочется сказать, что это чуть-ли не единственное письмо, которое я опубликовал без исправлений/сокращений, приятно и понятно всё написано, вы уж не обессуйте, что я полторы недели вас заставлял ждать, уж совсем не было времени. |
Карманная Библия AS3-кодера от Семиглазого Знаю, что боян, но наверняка не все видели, а из видевших многие поленились прочесть: на флэшере давно уже выложены 100 советов по ActionScript 3 (скачать одним архивом). Это перевод серии "ActionScript 3 Tips and Tricks" от Senocular — человека, чья компетентность сравнима с профессиональным просветлением. Все эти советы являются полным ответом на вопрос "А что из нового в AS3 мне реально нужно и как это применить?". Семиглаз — лучший! Почему Семиглаз? Так расшифровывается Senocular. Кстати, у него ведь еще есть хороший туториал для начинающих во Flash — Getting Started with ActionScript 3.0 in Adobe Flash CS3 (5 частей). Тоже вполне достойный перевода материал, ведь начинающие во Flash будут всегда, пока жива технология (God Save The Flash!), так пусть они начинают правильно, там в 5 части ООП есть. Кстати, друзья, а что если эти 100 советов по AS3 загнать в один файл, будь то PDF или CHM? Великая польза от того должна получиться, как минимум с точки зрения печати. Верно? |
2008-02-02 |
Flash Player 9 на мобильном - уже скоро? Казалось бы, относительно недавно была анонсирована виртуальная машина QVM для мобильных устройств, да и даже FlashLite 3 практически недоступен. Но факты начинают говорить об обратном, а именно - о появлении поддержки Flash 9 в мобильных устройствах на базе Symbian/Windows Mobile уже относительно скоро. На презентации Flex 3 prerelease tour в списке платформ уже упоминается Mobile. А теперь мы видим Skyfire - новый мобильный браузер, на приватную бету которого можно подписаться на соответствующем сайте, и которая ожидается к выходу в ближайшие месяцы. Среди многих замечательных особенностей отмечена поддержка Flash 9. Итак, ждать осталось совсем немного? |
Можно скачать BlazeDS Release Candidate Технология BlazeDS, которая все чаще будет ассоциироваться со словами "Remoting" и "Messaging", вошла в свою предрелизную фазу. Напомню, BlazeDS — это Java-Flex фреймворк для обмена данными, командами и сообщениями между клиентом и сервером с высокой производительностью. У Кристофа Конраца есть интересные замечания об этой технологии. И, кстати, уже открыт сайт BlazeDS — полка совсем пустой. Adobe отдала BlazeDS в Open Source и призывает разработчиков портировать ее на популярные платформы, для чего пригодится спецификация формата сообщений AMF (см. внизу). Качаю новую версию, пробую в действии. Update 1: Когда скачаете архив с BlazeDS, обратите внимание на Update 2: Это не каталог с пустым именем. На самом деле, внутри архива есть файл с именем "\blazeds-turnkey-readme.htm". Обратный слэш в имени файла — это вообще недопустимый символ. Увидеть его удалось через WinRar, а также при попытке переименования файла в Total'е. Однако, кто-то сумел вписать слэш в имя файла. В результате, в Total Commander вы увидите внутри архива лишний "каталог" с именем "[]" — да, именно пустая строка. Игнорируйте его. Кстати, Windows Explorer вообще не отображает ни файла с "битым" именем, ни "каталога" и не распаковывает этот файл. Используйте Total Commander, он распаковал все (но не трогайте "каталог []"). Update 3: для описанного бага создан багрепорт в Adobe JIRA. За него можно голосовать — быстрее пофиксят. |
Flash сайт с 3D навигацией
KomodomediaКак-то, просматривая список работ на |
2008-02-01 |
Класс User. SmartFoxServer Класс User- класс, осуществляющий доступ к информации пользователя SmartFoxServer. Полное определение класса: it.gotoandplay.smartfoxserver.data.User Методы:getId () : int Возвращает идентификатор пользователя. getName () : String Возвращает имя пользователя. getVariable (varName:String) : * Возвращает переменную пользователя. Name - имя переменной. getVariables () : Array Возвращает ассоциативный массив переменных пользователя. Ключевые значения массива - имена переменных. isSpectator () : Boolean Пользователь является наблюдателем. isModerator () : Boolean Пользователь является модератором. getPlayerId () : int Идентификатор игрока пользователя. Отсчитывается от 1, для наблюдателей равен -1. Работает только для пользователей игровых комнат. |
Класс Room. SmartFoxServer Класс Room- класс, осуществляющий доступ к информации комнаты SmartFoxServer. Полное определение класса: it.gotoandplay.smartfoxserver.data.Room Методы: getUserList (): Array Возвращает ассоциативный массив объектов User пользователей комнаты. В качестве ключевых значений массива выступают идентификаторы пользователей. getUser (userId:*) : User Возвращает параметры пользователя, находящегося в комнате. userId : идентификатор (int) или имя (String) пользователя. getVariable (varName:String) : * Возвращает переменную комнаты. varName : имя запрашиваемой переменной. getVariables () : Array Возвращает ассоциативный список переменных, где в качестве ключей используются имена переменных. getName () : String Возвращает имя комнаты. getId () : int Возвращает идентификатор комнаты. isTemp () : Boolean Если true, комната является временной. Всегда true для комнат, созданных во время работы приложения на стороне клиента (?). isGame () : Boolean Комната является игровой. isPrivate () : Boolean Комната является приватной. getUserCount () : int Возвращает число пользователей в комнате. getSpectatorCount () : int Возвращает число наблюдателей в комнате. (Только для игровых комнат). getMaxUsers () : int Возвращает максимальное число пользователей, которые могут войти в комнату. getMaxSpectators () : int Возвращает максимальное число наблюдателей, которые могут войти в комнату. (Только для игровых комнат). getMyPlayerIndex () : int Возвращает идентификатор игрока текущего пользователя в комнате. Отсчитывается от 1, для наблюдателей равен -1. isLimbo () : Boolean Комната работает в режиме "limbo" (рассчитана на очень большое количество пользователей). |