<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-25528681162651304</id><updated>2009-11-28T07:43:32.797+03:00</updated><title type='text'>Flash-разработка</title><subtitle type='html'>Предмет: Flash-технологии, программы, редакторы, классы, библиотеки.
Методика: Изучение шаг за шагом, поиск новых решений, сбор ссылок, новостей и мнений, разбор примеров.
Цель: Сбор, обработка и накопление тематической информации.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default?start-index=26&amp;max-results=25'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>205</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-5213805468234566408</id><published>2009-10-14T16:44:00.003+04:00</published><updated>2009-10-14T16:47:41.448+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='От автора'/><title type='text'>Новый подблог "Flash-разработка. Сотрудничество"</title><content type='html'>Дублирую предисловие:&lt;div&gt;&lt;br /&gt;&lt;div&gt;"Каждый из нас рано или поздно сталкивается с ситуацией, когда работы завал, а нам ее всё подкидывают и подкидывают. Вроде бы и заманчиво, а с другой стороны - ну некуда уже - график забит. Поэтому, приглашаю к сотрудничеству всех желающих.&lt;div&gt;&lt;div&gt;&lt;div&gt;Итак, с этого момента, я буду выкладывать в этот блог всё, что уже не в силах взять на себя.&lt;/div&gt;&lt;div&gt;Надеюсь на понимание и, думаю, многим будет интересно найти здесь для себя занятие."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Блог здесь: &lt;a href="http://racer242collab.blogspot.com/"&gt;http://racer242collab.blogspot.com/&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-5213805468234566408?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/5213805468234566408/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=5213805468234566408' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/5213805468234566408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/5213805468234566408'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/10/flash.html' title='Новый подблог &quot;Flash-разработка. Сотрудничество&quot;'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-4159277461881108324</id><published>2009-10-13T12:22:00.004+04:00</published><updated>2009-10-13T12:38:54.257+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Actionscript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Грабли'/><title type='text'>Спасительный cacheAsBitmap и wmode=transparent</title><content type='html'>Небольшая галерейка. На фотки/иконки наводится мышь и всплывает окошко с информацией. Окошко с указателем. Представляет собой Sprite, в котором находятся указатель и Sprite с плашкой информации. Плашка выравнивается с учетом положения на экране - подравнивается края - изменением координаты x. Плашка со скруглениями, с 9Slice и с фильтром-тенью.&lt;div&gt;В нормальных условиях, всё работает замечательно. При &lt;i&gt;wmode=transparent&lt;/i&gt;, когда флэшка выводится поверх HTML-контента, плашка выводится усеченной, не в том смещении. Протрейсил координаты - всё нормально. При запуске - ужос. &lt;/div&gt;&lt;div&gt;Нам известны проблемы wmode=transparent - они странны и непредсказуемы. Особенно когда на прозрачность попадают фильтры.&lt;/div&gt;&lt;div&gt;Интуиция срабатывает без промашки. В коде выравнивания плашки, в конце ставим строчку &lt;code&gt;this._infoContainer.cacheAsBitmap=true;&lt;/code&gt; (&lt;i&gt;_infoContainer &lt;/i&gt;- это окошко, контейнер для плашки и указателя, DisplayObjectContainer). Теперь всё выводится корректно.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-4159277461881108324?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/4159277461881108324/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=4159277461881108324' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/4159277461881108324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/4159277461881108324'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/10/cacheasbitmap-wmodetransparent.html' title='Спасительный cacheAsBitmap и wmode=transparent'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-1232328094681586123</id><published>2009-10-05T10:26:00.006+04:00</published><updated>2009-10-05T10:53:49.111+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Actionscript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Идеи'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash IDE'/><title type='text'>Копипаст фильтров из CS во Flex</title><content type='html'>Хорошая это штука - "Copy Motion to ActionScript 3" - в IDE CS3 (речь идет именно об этой версии). Наверняка, все уже давно смекнули, какие выгоды она несет для Flex. Главная выгода - сокращается объем ручной работы и отладки.&lt;div&gt;В частности, я успешно копирую настройки фильтров для компонентов. И делаю это следующим образом:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;В тестовом файле создаем клип образца, визуально похожего на то что у нас должно быть во flex - например, текстовое поле или кнопку. Навешиваем на нее кучу фильтров, до получения нужной нам картинки.&lt;/li&gt;&lt;li&gt;На слое с клипом кликаем правой кнопкой и выбираем "Copy Motion to ActionScript 3".&lt;/li&gt;&lt;li&gt;Вставляем куда-нибудь то, что скопировалось в буфер - например, тут же в редактор Actions. &lt;/li&gt;&lt;li&gt;Находим там блок &lt;i&gt;&amp;lt;filters&amp;gt;...&amp;lt;/filters&amp;gt; &lt;/i&gt;&lt;/li&gt;&lt;li&gt;Копипастим его себе во Flex-код, в контейнер тега нужного нам визуального компонента.&lt;/li&gt;&lt;li&gt;Заменяем &lt;i&gt;filters&lt;/i&gt; на &lt;i&gt;mx:filters&lt;/i&gt; и &lt;i&gt;filters:BevelFilter&lt;/i&gt; на &lt;i&gt;mx:BevelFilter.&lt;/i&gt; (у &lt;i&gt;mx:filters&lt;/i&gt; может быть другой префикс - зависит от компонента)&lt;/li&gt;&lt;li&gt;Компилируем и получаем картину, аналогичную CS. Дотюниваем, если необходимо, параметры. &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-1232328094681586123?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/1232328094681586123/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=1232328094681586123' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/1232328094681586123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/1232328094681586123'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/10/cs-flex.html' title='Копипаст фильтров из CS во Flex'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-6948894769379486307</id><published>2009-10-01T18:01:00.003+04:00</published><updated>2009-10-01T18:05:00.638+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='От автора'/><title type='text'>Мой дорогой блог...</title><content type='html'>... скучаю, знаю что висят черновики, но плавный переход от летнего отдыха к жесточайшим дедлайнам вынуждают меня убрать тебя в самый дальний ящик моего рабочего стола...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-6948894769379486307?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/6948894769379486307/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=6948894769379486307' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/6948894769379486307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/6948894769379486307'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/10/blog-post.html' title='Мой дорогой блог...'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-7190459852529747121</id><published>2009-07-28T13:28:00.013+04:00</published><updated>2009-07-29T11:32:28.877+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Обзоры'/><category scheme='http://www.blogger.com/atom/ns#' term='Эффекты'/><title type='text'>Генерим облака</title><content type='html'>Вот понадобилось мне облака генерить. Изобретать велосипед не будем - прямиком в гугл.&lt;br /&gt;А тут красоты всякой - видимо-невидимо.&lt;br /&gt;&lt;br /&gt;Сразу хочу отметить полезный тул: &lt;a href="http://www.tarasnovak.com/lab/PerlinNoiseExplorer/PerlinNoiseExplorer.html"&gt;Perlin Noise Explorer&lt;/a&gt;. Собственно, кто еще недопонял, что такое perlin noise, может подробно изучить это явление.&lt;br /&gt;&lt;br /&gt;Замечательный пейзажик: &lt;a href="http://www.flepstudio.org/forum/tutorials/629-actionscript-3-0-perlinnoise-method.html"&gt;Actionscript 3.0 perlinNoise method&lt;/a&gt;.&lt;br /&gt;Облака с перспективой: &lt;a href="http://wonderfl.net/code/48d1d9d92261b26047b1548624627fdc94f52e17"&gt;Clouds&lt;/a&gt;.&lt;br /&gt;Целый движок: &lt;a href="http://nodename.com/blog/2008/07/11/perlin-clouds-and-frocessing-with-an-f/"&gt;Perlin Clouds and Frocessing (with an F)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Без демки, но проверены:&lt;br /&gt;&lt;a href="http://www.andrewnprice.com/node/45"&gt;Generating Pseudo Realistic Clouds In Flash (AS3 + Perlin Noise)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.kirupa.com/forum/showthread.php?t=204877"&gt;Lets make some (perlin) noise!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Не облака:&lt;br /&gt;Забавная пружинка: &lt;a href="http://nutsu.com/blog/2008/061100_as_frocessing.html"&gt;тут&lt;/a&gt;.&lt;br /&gt;Нереальные игры с электричеством: &lt;a href="http://blog.oaxoa.com/category/perlinnoise/"&gt;тут&lt;/a&gt;.&lt;br /&gt;Красивое облако: &lt;a href="http://webr3.org/blog/haxe/3d-perlin-particle-light-cloud-and-source-haxe-flash-10/"&gt;тут&lt;/a&gt;.&lt;br /&gt;Земля: &lt;a title="Permanent Link to Papervision3D clouded planet Earth tutorial and source" href="http://blog.projectnibble.org/2009/06/19/papervision3d-clouded-planet-earth-tutorial-and-source/" rel="bookmark"&gt;Papervision3D clouded planet Earth tutorial and source&lt;/a&gt;.&lt;br /&gt;Такие вот пузыри: &lt;a href="http://blog.oaxoa.com/2007/12/28/actionscript-3-blobs-lava-lamp-effect/"&gt;Actionscript 3 blobs / lava lamp effect&lt;/a&gt;&lt;br /&gt;Древесные кольца: &lt;a href="http://www.connectedpixel.com/blog/texture/wood"&gt;тут&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Да... Всё красиво, но мне, увы не подошло. Идея такова, что нужно генерировать небольшие клочки облаков, а для этого нужно на полученную текстуру наложить маску, плавно описывающую область. По всей видимости, времени не хватит. Вставлю картинками.&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;Решил поступить так. Берем пример &lt;a href="http://www.andrewnprice.com/node/45"&gt;Generating Pseudo Realistic Clouds In Flash (AS3 + Perlin Noise)&lt;/a&gt;. Подстраиваем параметры таким образом, чтобы облака были редкими.&lt;br /&gt;Для большой области, динамический рендер по производительности просто убийственный. Но мы генерируем крупный битмап один раз, не скупясь на качество, и затем, просто скроллим его циклически.&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;Сделал еще проще. Полученный битмап не скроллю, а циклически со смещением заливаю им нужную область. Это гораздо удобнее, т.к. метод заливки beginBitmapFill умеет склеивать текстуру самостоятельно при любом смещении. И по производительности это выигрышнее.&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;В примере, полученый клип с облаками накладывается с эффектом &lt;em&gt;blendMode = "screen"&lt;/em&gt;. Для производительности это не есть хорошо. Поэтому, в целях оптимизации, рабочий битмап делаем прозрачным, заливаем белым цветом и копируем в его альфа-канал любой из цветовых каналов сгенерированного битмапа с облаками. Точнее, для генерации perlinNoise используем один канал, который потом и копируем.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-7190459852529747121?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/7190459852529747121/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=7190459852529747121' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/7190459852529747121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/7190459852529747121'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/07/blog-post.html' title='Генерим облака'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-6534463560095632656</id><published>2009-07-27T09:39:00.011+04:00</published><updated>2009-07-27T11:25:16.632+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='От автора'/><category scheme='http://www.blogger.com/atom/ns#' term='Обзоры'/><title type='text'>MPS, MIoC и утро испорчено</title><content type='html'>Вот так бывает, что приезжаешь в понедельник утром на работу, погружаешь измученное летними выходными тело в кресло, включаешь позёвывая комп, лениво начинаешь кликать последние посты. За окном лето. Чего еще может быть такого нового... Все загорают и купаются.&lt;br /&gt;&lt;br /&gt;Но тут мозг натыкается на незнакомые сочетания букв. Таак. &lt;a href="http://groups.google.com/group/ruFlash/browse_thread/thread/a319f95badab69d9/8a7408965c55b69b?show_docid=8a7408965c55b69b#"&gt;Мифы MPS.&lt;/a&gt; Явно не про мазду. MPS... MPS, что-то википедия ерунду выдает. Ладно, читаем дальше. Ну пипец, ни одной ссылки, будто и правда все всё знают, а я в мазде. Ага, это редактор. Попался, голубчик. От оно чо - &lt;a href="http://blogs.jetbrains.com/mps/"&gt;Meta Programming System&lt;/a&gt;. Вот и википедия сразу &lt;a href="http://en.wikipedia.org/wiki/JetBrains_MPS"&gt;разродилась&lt;/a&gt;. Ну в общем всё ясно. Шагай в будущее с MPS первой версии. Для чего оно нужно? Для создания и работы с DSL (опять неоднозначные аббривиатуры - это не про модем, это &lt;a href="http://en.wikipedia.org/wiki/Domain-specific_programming_language"&gt;Domain-specific language&lt;/a&gt; - или лучше &lt;a href="http://ru.wikipedia.org/wiki/Предметно-ориентированный_язык_программирования"&gt;Предметно-ориентированный язык программирования&lt;/a&gt;). Теперь и пост про мифы можно почитать.&lt;br /&gt;&lt;br /&gt;Что еще у нас интересного на сегодня? Ага, &lt;a href="http://injun.ru/?p=822#comments"&gt;injun&lt;/a&gt; до Swiz добрался. Забавный принцип. Про паззлы понравилось, хоть никогда их и не любил - скучное занятие.&lt;br /&gt;Все похвалили &lt;a style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 5px; COLOR: rgb(0,102,204); PADDING-TOP: 0px; TEXT-DECORATION: underline" href="http://mioc.sourceforge.net/russian.html"&gt;MIoC&lt;/a&gt;. Вот, спасибо, для тех кто в мазде - разшифровка (Metadata-driven autowire IoC framework для ActionScript 3). Про IoC знают многие, а вот MIoC - не думаю.&lt;br /&gt;&lt;br /&gt;Напоследок. Случился бум Flash+Drupal. Мне так показалось, что пост &lt;a href="http://flash-ripper.com/book/flash-with-drupal-book-by-travis-tidwell#comments"&gt;Flash на Drupal&lt;/a&gt; произвел неизгладимое впечатление на &lt;a href="http://flexconstructor.blogspot.com/"&gt;Flex Constructor&lt;/a&gt;, и в течение последующих 3,5 часов он выдал &lt;a href="http://flexconstructor.blogspot.com/2009/07/flexdrupal_23.html"&gt;Flex+Drupal=...&lt;/a&gt; C интеграцией flash и CMS сталкивается почти каждый flash-разработчик. На моей практике, сводится она к тому, что либо сервер диктует формат обмена данными, либо это делаю я сам. Второе чаще. Здесь же этот процесс систематизируется и ставится на рельсы, по которым очень скоро покатятся составы, полные готовых drupal-модулей для flash-сайтов, flash-приложений, flash-виджетов и flash-т.п. Идея популяризации Drupal очевидна.&lt;br /&gt;&lt;br /&gt;Всё. Утро еще не кончилось, и мозги уже дымятся. А ведь еще завал работы...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-6534463560095632656?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/6534463560095632656/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=6534463560095632656' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/6534463560095632656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/6534463560095632656'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/07/mps-mioc.html' title='MPS, MIoC и утро испорчено'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-3053105977503072522</id><published>2009-06-04T19:26:00.005+04:00</published><updated>2009-06-04T19:32:35.497+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Справка'/><title type='text'>Ух ты! Binding</title><content type='html'>Случайно столкнулся с таким вариантом байндинга:&lt;br /&gt;&lt;br /&gt;Вот к примеру, обычно мы делаем вот так:&lt;br /&gt;&amp;lt;someComponent someAttribute="{someValue1+'_splitter_'+someValue2}"/&amp;gt;&lt;br /&gt;&lt;br /&gt;А оказывается можно и так:&lt;br /&gt;&amp;lt;someComponent someAttribute="{someValue1}_splitter_{someValue2}"/&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-3053105977503072522?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/3053105977503072522/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=3053105977503072522' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/3053105977503072522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/3053105977503072522'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/06/binding.html' title='Ух ты! Binding'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-311586725115120764</id><published>2009-06-04T11:02:00.006+04:00</published><updated>2009-06-04T11:52:13.382+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Обзоры'/><title type='text'>Выбираем движок для просмотра Flash-панорам</title><content type='html'>Сегодня ищем движок для просмотра flash-панорам.&lt;br /&gt;&lt;br /&gt;Для начала - немного теории панорам: &lt;span class="big2"&gt;&lt;a href="http://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BD%D0%BE%D1%80%D0%B0%D0%BC%D0%B0"&gt;Панорамная фотография&lt;/a&gt;, &lt;a href="http://www.panoramas.dk/panorama/"&gt;BASICS&lt;/a&gt;&lt;/span&gt; (здесь же можно найти и другую информацию про панорамное фото, софт, вьюверы).&lt;br /&gt;&lt;br /&gt;По flash-вьюверам панорам, Гугл выдал следующих претендентов:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://flashpanoramas.com/player/"&gt;Flash Panorama Player&lt;/a&gt; - платный, недорогой вьювер кубических панорам. Принцип прост - имя swf-файл вьювера должно соответствовать имени jpg-файлов, которые имеют соответствующие сторонам куба суффиксы. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ryubin.com/panolab/panoflash/index.shtml"&gt;Ryubin's Flash Panorama Laboratory&lt;/a&gt; - Отличный движок, без исходников, но настраиваемый через XML.&lt;/li&gt;&lt;li&gt;&lt;a href="http://krpano.com/"&gt;krpano&lt;/a&gt; - платный, недорогой вьювер с кучей дополнительных фич, типа эффект линз и тп.&lt;/li&gt;&lt;li&gt;&lt;a href="http://panosalado.com/"&gt;PanoSalado&lt;/a&gt;, &lt;a href="http://panosalado.com/spincontrol"&gt;Spincontrol&lt;/a&gt; - опенсорсный движок на базе PV3 и AIR-утилита для сборки виртуальных туров. Есть и исходники и документация. &lt;/li&gt;&lt;/ul&gt;Ну пока хватит. Наверняка есть другие, более удобные и популярные движки и программы - будем искать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-311586725115120764?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/311586725115120764/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=311586725115120764' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/311586725115120764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/311586725115120764'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/06/flash.html' title='Выбираем движок для просмотра Flash-панорам'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-3994929431426345061</id><published>2009-06-03T11:45:00.012+04:00</published><updated>2009-06-03T12:58:29.371+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex Builder'/><category scheme='http://www.blogger.com/atom/ns#' term='Обзоры'/><category scheme='http://www.blogger.com/atom/ns#' term='Справка'/><title type='text'>Code-behind или mx:Script?</title><content type='html'>До некоторого времени, я выносил объемный AS-ккод из MXML-компонентов, используя тег &amp;lt;mx:Script/&amp;gt;:&lt;br /&gt;&lt;code&gt;&amp;lt;mx:Script source="includes/ComponentName.as"/&amp;gt;&lt;/code&gt;&lt;br /&gt;Каких-либо логических недостатков такого метода я не наблюдал, однако столкнулся с постоянной глючностью автокомплита AS-редактора FlexBuilder. И вот, когда меня в конец это достало, решил взять на вооружение способ Code-behind.&lt;br /&gt;&lt;br /&gt;Про Code-behind пишут следующее:&lt;br /&gt;&lt;a href="http://learn.adobe.com/wiki/display/Flex/Code+Behind"&gt;Code Behind&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/devnet/flex/quickstart/building_components_using_code_behind/"&gt;Building components by using code behind&lt;/a&gt;&lt;br /&gt;&lt;a title="'Permanent" href="http://onflash.org/ted/2007/02/code-behind-in-flex-2.php" rel="bookmark"&gt;Code-Behind in Flex 2 &lt;/a&gt;&lt;br /&gt;&lt;a href="http://aralbalkan.com/1958"&gt;Code-behind gotcha in Flex Builder for AIR apps&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tearaway-tea.com/blog/2008/12/%d1%81%d0%be%d0%b2%d0%b5%d1%82%d1%8b-%d0%bd%d0%be%d0%b2%d0%b8%d1%87%d0%ba%d0%b0%d0%bc/ru/" rel="bookmark"&gt;Советы новичкам&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В кратце, суть проста - наш MXML компонент &lt;em&gt;ComponentName&lt;/em&gt; не базируется напрямую на основном компоненте, например, &lt;em&gt;Canvas&lt;/em&gt;, а на компоненте-"прослойке" &lt;em&gt;ComponentNameClass&lt;/em&gt; (также используется суффикс &lt;em&gt;-Base&lt;/em&gt;). Код этого компонента размещается в &lt;em&gt;ComponentNameClass.as.&lt;/em&gt; Его класс является потомком класса того самого основного компонента (&lt;em&gt;Canvas&lt;/em&gt;) и содержит весь необходимый AS-код.&lt;br /&gt;&lt;br /&gt;Все компоненты, которые имеются в &lt;em&gt;ComponentName.mxml&lt;/em&gt; и к которым нужен доступ, должны быть объявлены в &lt;em&gt;ComponentNameClass.as&lt;/em&gt; как &lt;strong&gt;public&lt;/strong&gt;. Методы и обработчики событий - &lt;strong&gt;public&lt;/strong&gt; или &lt;strong&gt;protected&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Вообще, конечно, это очень правильный подход. Только напрягает пара фактов - нужно возиться с объявлением класса и объявлять все компоненты, с которыми необходимо иметь дело в as-файле. Если, к примеру, я вдруг передумаю использовать в MXML вместо &lt;em&gt;LinkButton&lt;/em&gt; (а он уже объявлен так в AS-компоненте) простой &lt;em&gt;Button&lt;/em&gt;, получу ошибку - необходимо везде сделать замену. Выход - объявлять их дальних предков или вообще интерфейсы.&lt;br /&gt;&lt;br /&gt;А вот интересно - есть ли средства автоматизации этого процесса? Что-то типа команды "Create Code-behind Class" или при создании MXML-компонента подобная галочка. Я не нашел...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-3994929431426345061?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/3994929431426345061/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=3994929431426345061' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/3994929431426345061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/3994929431426345061'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/06/code-behind-mxscript.html' title='Code-behind или mx:Script?'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-8597286746933107559</id><published>2009-05-16T01:02:00.004+04:00</published><updated>2009-05-16T01:23:58.005+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Грабли'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Модули, синглтоны, Type Coercion Failed и спасение</title><content type='html'>&lt;p&gt;Сегодня столкнулся с такой проблемой:&lt;/p&gt;&lt;p&gt;Приложение использует модули. Один из модулей содержит ComboBox.&lt;br /&gt;Во время работы, подгружается то один модуль, то другой. Так вот.&lt;br /&gt;При первой активации, модуль с ComboBox работает корректно. Однако, при повторной активации модуля, начинаются проблемы - при нажатии на ComboBox вылетает ошибка:&lt;br /&gt;&lt;em&gt;TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать mx.managers::PopUpManagerImpl@6c0ce41 в mx.managers.IPopUpManager.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Аналогичная ошибка с компонентом List, правда немного с другими классами:&lt;br /&gt;&lt;em&gt;TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать mx.managers::DragManagerImpl@6b7ec11 в mx.managers.IDragManager.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Ужасаясь перспективе просидеть в дебаге всю ночь, полез в Гугл. И тут же нашел спасение - не один я столкнулся с таким казусом:&lt;br /&gt;&lt;a href="http://www.trap17.com/forums/Flex-Error-1034-Type-Coercion-Failed-Convert-Mxmanagers-t61175.html"&gt;Flex Error #1034: Type Coercion Failed: Cannot Convert Mx.managers&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Вот решение (я его оформил немного поизящнее):&lt;br /&gt;Нужно в коде основного приложения указать следующую строку:&lt;br /&gt;&lt;code&gt;import mx.managers.*;DragManager;HistoryManager;PopUpManager;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Одним индусам известно, что случается с этими синглтонами после выгрузки модуля, могу предположить, что таким образом, мы принуждаем компилятор внедрять эти классы в основное приложение а не в модули. В ином случае, они внедряются в модуль, и, скорее всего, в какой-то момент теряются.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-8597286746933107559?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/8597286746933107559/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=8597286746933107559' title='Комментарии: 23'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/8597286746933107559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/8597286746933107559'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/05/type-coercion-failed.html' title='Модули, синглтоны, Type Coercion Failed и спасение'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-3802679545971666056</id><published>2009-04-05T18:41:00.011+04:00</published><updated>2009-05-02T01:22:33.505+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Впечатления'/><category scheme='http://www.blogger.com/atom/ns#' term='Microphone'/><category scheme='http://www.blogger.com/atom/ns#' term='Red5'/><category scheme='http://www.blogger.com/atom/ns#' term='Обзоры'/><title type='text'>Записываем звук с помощью Red5</title><content type='html'>Этот пост - итог исследования "&lt;a href="http://racer242.blogspot.com/2009/01/blog-post.html"&gt;Сохраняем звук с микрофона на сервер&lt;/a&gt;" проведенного еще в январе. Суть проекта - &lt;a href="http://www.baushki.ru/"&gt;конкурс колыбельных&lt;/a&gt; - любой желающий может зарегистрироваться и записать песню в собственном исполнении.&lt;br /&gt;&lt;br /&gt;Как обычно бывает, с момента зарождения проекта, уходят месяцы на процесс впаривания, продажи, рисования и утверждения дизайна. И вот, наступает очередь разработчиков, и, как обычно, на flash выделяется неделя, в лучшем случае - две (какая несправедливость).&lt;br /&gt;В этот раз, правда, всё было несколько иначе - разработка началась как раз примерно за неделю до моего отлета в Египет. Поэтому, пришлось сделать максимум, чтобы без меня две недели люди всё это ставили на свои рельсы. Принцип вынесения всех настроек в FlashVars решает эту проблему на раз. Главное не забыть составить подробный мануал.&lt;br /&gt;&lt;br /&gt;Итак, мы пришли к решению, что лучше в качестве медиа-сервера использовать Red5. Процесс установки под Windows и тестирования Red5 для локальной разработки я описал здесь: &lt;a href="http://racer242install.blogspot.com/2009/04/red5-red5.html"&gt;Установка Red5 и всё что нужно для Red5-разработки&lt;/a&gt;. По сути, в этом посте изложено всё необходимое для создания минимального приложения для записи звука/видео. В качестве формата хранения звуковых данных, решили оставить FLV. Сначала планировали конвертацию FLV в MP3 на сервере, и даже были идеи как это реализовать. Но позже решили, что для нужд проекта это излишество и лишняя нагрузка на сервер. Все записи сохраняются как есть, в формате FLV, и воспроизводятся проигрывателем, который, кстати, по виду и функционалу совсем не отличается от того, что воспроизводит MP3.&lt;br /&gt;&lt;br /&gt;С flash-частью оказалось всё слишком просто. Достаточно было использовать версию Flash 8 и AS2. За основу я взял пример из ...&lt;em&gt;\Red5\swf\samples\SimpleRecorder.fla&lt;/em&gt;. С момента окончания разработки прошло уже около месяц и многое забылось, но вот пара важных заметок:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Для записи, уровень тишины необходимо ставить в 0 (setSilenceLevel). Если для голосового общения, функция активности микрофона важна для экономии трафика, то при записи речи или песни это может навредить - запись будет не идентична выступлению.&lt;/li&gt;&lt;li&gt;Необходимо ограничить время записи (например, по таймауту), иначе найдутся охотники заполнить дисковое пространство сервера бесполезным мусором. Хотя, конечно, правильнее это ограничение сделать на сервере.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;В итоге, на выходе у меня получились две версии проигрывателей звука в форматах MP3 и FLV (можно было сделать универсальный, но времени не хватило) и рекордер звука.&lt;br /&gt;На локальном Red5, под Windows, это хозяйство работало на ура. Однако, когда потребовалось поставить Red5 под FreeBSD (если не ошибаюсь), у админов возникли серьезные проблемы с настройкой нашего приложения. Подробности мне не известны, знаю только, что у них всё заработало за день до моего прилета (т.е. возились 2 недели :) ).&lt;br /&gt;Такова уж особенность Open Source - конфигурация представляет собой темный лес xml-файлов, а нормальные инструменты по настройке, так чтобы галочку поставил и всё заработало - отсутствуют. Вот и выбирайте - платить за софт, или платить специалистам за настройку бесплатного софта. Но, слава Богу, всё это уже не моя забота.&lt;/p&gt;&lt;p&gt;* * * &lt;/p&gt;&lt;p&gt;Неплохая статья в тему:&lt;br /&gt;&lt;a href="http://forum.33b.ru/viewtopic.php?p=266906606"&gt;Урок. Вебкамеры с Flex 3. Часть 2&lt;/a&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-3802679545971666056?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/3802679545971666056/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=3802679545971666056' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/3802679545971666056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/3802679545971666056'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/04/red5.html' title='Записываем звук с помощью Red5'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-1862035767771353751</id><published>2009-03-22T17:55:00.006+03:00</published><updated>2009-03-22T18:43:09.644+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Код'/><category scheme='http://www.blogger.com/atom/ns#' term='MXML'/><category scheme='http://www.blogger.com/atom/ns#' term='Идеи'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>mx:Pause vs flash.utils.Timer. Flex</title><content type='html'>Декларативность MXML - огромное достоинство Flex.&lt;br /&gt;Легкое определение переменных в MXML значительно упрощает разработку:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;позволяет легко и наглядно определять их свойства и обработчики событий&lt;/li&gt;&lt;li&gt;автоматически делает переменные Bindable&lt;/li&gt;&lt;li&gt;позволяет их связать с другими переменными и выражениями&lt;/li&gt;&lt;li&gt;делает наглядным код&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Но, на сколько я понял, не все классы можно представить в декларативном виде. &lt;/p&gt;&lt;p&gt;Например, класс &lt;em&gt;flash.utils.Timer&lt;/em&gt; невозможно представить в виде MXML. Компилятор выдает ошибку "Неправильное количество аргументов". Всё от того, что конструктор этого класса содержит один обязательный параметр. Как его указать, и возможно ли это, увы, я не понял. &lt;/p&gt;&lt;p&gt;Но есть простое решение - использовать другой класс, хорошо подходящий по своему функционалу - &lt;em&gt;mx.effects.Pause&lt;/em&gt;: &lt;div id="code" rows="5"&gt;&amp;lt;mx:Pause&lt;br /&gt;id="somePause"&lt;br /&gt;duration="2000"&lt;br /&gt;effectEnd="somePause_effectEndHandler(event)"&lt;br /&gt;/&amp;gt;&lt;br /&gt;&lt;br /&gt;. . .&lt;br /&gt;&lt;br /&gt;//Стартовать задержку&lt;br /&gt;this.somePause.play();&lt;br /&gt;&lt;br /&gt;. . .&lt;br /&gt;&lt;br /&gt;private function somePause_effectEndHandler(event:EffectEvent):void {&lt;br /&gt;//Обработать окончание задержки&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-1862035767771353751?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/1862035767771353751/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=1862035767771353751' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/1862035767771353751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/1862035767771353751'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/03/mxpause-vs-flashutilstimer-flex.html' title='mx:Pause vs flash.utils.Timer. Flex'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-4362576478928151020</id><published>2009-03-19T18:48:00.007+03:00</published><updated>2009-03-19T19:53:12.509+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MXML'/><category scheme='http://www.blogger.com/atom/ns#' term='ASDoc'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Справка'/><title type='text'>ASDoc in MXML. Правильно комментируем MXML.</title><content type='html'>MXML для Flex-разработки имеет первостепенное значение. Однако, воспринимая его как порождение XML, до некоторых пор, я не считал его языком программирования или чем-то в этом духе.&lt;br /&gt;Теперь, уже достаточно сроднившись с MXML, понимаю, что есть необходимость правильно его комментировать. Просматривая листинги MXML, глаз так же нуждается в разделении блоков, как и при чтении AS-кода.&lt;br /&gt;Если с AS-кодом всё давно ясно (я его использую везде где надо и где необязательно), то вот с MXML хотелось бы разобраться. И поможет нам в этом статейка "&lt;a href="http://opensource.adobe.com/wiki/display/flexsdk/ASDoc+in+MXML"&gt;ASDoc in MXML - Functional and Design Specification&lt;/a&gt;". Выделим основные мысли из нее.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Основные положения&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;В настоящее время не существует способа документировать MXML-компоненты. (Кстати, в лайфдоках про это вот что сказано: &lt;a href="http://livedocs.adobe.com/flex/3/html/help.html?content=asdoc_5.html"&gt;Documenting MXML files&lt;/a&gt;). Компилятор asdoc не обрабатывает комментарии в MXML-файлах. Но число компонентов, разрабатываемых на базе MXML неуклонно растет, поэтому поддержка в asdoc файлов MXML очень бы помогла разработчикам при создании документации.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ASDoc комментарий&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Для того, чтобы ASDoc-комментарий был обработан asdoc-компилятором, необходимо указать 3 тире после &amp;lt;!:&lt;br /&gt;&lt;code&gt;&amp;lt;!--- asdoc comment --&amp;gt;&lt;/code&gt;&lt;br /&gt;Для сравнения - обычный комментарий начинается с 2-х тире.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Комментирование MXML-компонентов и компонента уровня класса&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Комментарии для компонентов внутри MXML должны располагаться перед компонентами.&lt;br /&gt;Комментарий компонента уровня класса должен располагаться перед корневым тегом MXML:&lt;/p&gt;&lt;p&gt;&lt;div id="code" rows="10"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Standard MXML comment: events\myComponents\MyButton.mxml --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!---&lt;br /&gt;The class level comment for the component.&lt;br /&gt;This tag supports all ASDoc tags, and does not require a CDATA block.&lt;br /&gt;&lt;br /&gt;@see mx.container.VBox&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;mx:VBox xmlns="http://ns.adobe.com/mxml/2009" xmlns:mx="library:adobe/flex/halo" &amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--- Comment for button --&amp;gt;&lt;br /&gt;&amp;lt;mx:Button id="myButton" label="This button has comment"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--- This comment doesn't belong to any component and will be ignored --&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/mx:VBox&amp;gt;&lt;/div&gt;&lt;p&gt;Комментарии перед тегами Script, Metadata будут игнорироваться. Перед тегами Definition, Library, Private и внутри их, комментарии так же будут игнорироваться. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Итог&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;В статье приводятся примеры использования ASDoc комментирования в различных его применениях. Рассматривать их подробно я не буду - всё достаточно прозрачно.&lt;/p&gt;&lt;p&gt;Вывод таков - MXML комментировать надо. И для этого уже существует прототип (если я правильно понял) стандарта, которого и следует придерживаться.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-4362576478928151020?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/4362576478928151020/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=4362576478928151020' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/4362576478928151020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/4362576478928151020'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/03/asdoc-in-mxml-mxml.html' title='ASDoc in MXML. Правильно комментируем MXML.'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-4032843507574954493</id><published>2009-03-05T16:17:00.022+03:00</published><updated>2009-03-07T02:12:37.862+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MXML'/><category scheme='http://www.blogger.com/atom/ns#' term='Actionscript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Идеи'/><category scheme='http://www.blogger.com/atom/ns#' term='Грабли'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Дружим Flex с Flash. Заметки: загрузка, внедрение, шрифт. Flex</title><content type='html'>Закончился очередной дидлайн. После крупных проектов, которые делаются за 3-4 дня практически с нуля, остаются ощущения, схожие с состоянием после автобусного тура: в голове каша, мельком что-то увидел, урывками что-то запомнил, надо разобрать фотки. Теперь настало время немного отдышаться и закрепить полученный опыт.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Для начала, несколько заметок: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Перенос строки в строках MXML: символ &amp;amp;#xd; - мелочь, а приятно.&lt;/li&gt;&lt;li&gt;Загрузка сложных Flash-приложений в SWFLoader должна производиться в выделенный домен приложения, т.к. могут быть конфликты классов: &lt;/li&gt;&lt;/ul&gt;&lt;div id="code" rows="5"&gt;&amp;lt;mx:SWFLoader autoLoad="false" id="swfLoader" source="application.swf" /&amp;gt;&lt;br /&gt;&lt;br /&gt;. . .&lt;br /&gt;&lt;br /&gt;private function creationCompleteHandler(event:Event):void {&lt;br /&gt;swfLoader.loaderContext=new LoaderContext(false,new ApplicationDomain());&lt;br /&gt;swfLoader.load();&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Если внешнее приложение подгружается в SWFLoader, есть вероятность, что в какой-то момент SWFLoader потеряет stage, что может пагубно отразиться на функциональности этого приложения. Если приложение где-то внутри обращается к stage и не обрабатывает его недоступность, то будут генерироваться ошибки. Побороть этот недостаток я не смог - только устранив все "не защищенные" stage из внешнего приложения. &lt;/li&gt;&lt;li&gt;Внедрение шрифтов. Гораздо надежнее внедрять шрифт непосредственно из TTF файла. Внедрение из файла SWF, в котором, в свою очередь, внедрен необходимый шрифт лучше оставить для тяжелых случаев несовместимостей с Flex. Дело в том, что почему-то, внедренные в SWF разные стили (normal, bold) шрифта не корректно "извлекаются" Flex-ом. Он не дает назвать разные стили разными именами (как это можно сделать в первом случае), теряет одно из начертаний (жирный шрифт просто не выводится). Возможно, это из-за особенностей конкретных шрифтов, но первый метод срабатывает гораздо стабильнее.&lt;/li&gt;&lt;/ul&gt;&lt;div id="code" rows="20"&gt;@font-face&lt;br /&gt;{&lt;br /&gt;fontFamily: "Century Schoolbook";&lt;br /&gt;fontWeight: normal;&lt;br /&gt;fontStyle: normal;&lt;br /&gt;src: url("file://./assets/fonts/CENSCBK.TTF");&lt;br /&gt;unicodeRange:&lt;br /&gt;U+0020-U+0040, /* Punctuation, Numbers */&lt;br /&gt;U+0041-U+005A, /* Upper-Case A-Z */&lt;br /&gt;U+005B-U+0060, /* Punctuation and Symbols */&lt;br /&gt;U+0061-U+007A, /* Lower-Case a-z */&lt;br /&gt;U+007B-U+007E, /* Punctuation and Symbols */&lt;br /&gt;U+00FC-U+00FD,&lt;br /&gt;U+0410-U+042F, /* Cyrillic Upper-Case A-Z */&lt;br /&gt;U+0430-U+0451; /* Cyrillic Lower-Case a-z */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@font-face&lt;br /&gt;{&lt;br /&gt;fontFamily: "Century Schoolbook Bold";&lt;br /&gt;fontWeight: bold;&lt;br /&gt;fontStyle: normal;&lt;br /&gt;src: url("file://./assets/fonts/SCHLBKB.TTF");&lt;br /&gt;unicodeRange:&lt;br /&gt;U+0020-U+0040, /* Punctuation, Numbers */&lt;br /&gt;U+0041-U+005A, /* Upper-Case A-Z */&lt;br /&gt;U+005B-U+0060, /* Punctuation and Symbols */&lt;br /&gt;U+0061-U+007A, /* Lower-Case a-z */&lt;br /&gt;U+007B-U+007E, /* Punctuation and Symbols */&lt;br /&gt;U+00FC-U+00FD,&lt;br /&gt;U+0410-U+042F, /* Cyrillic Upper-Case A-Z */&lt;br /&gt;U+0430-U+0451; /* Cyrillic Lower-Case a-z */&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Внедрять клип из внешней SWF так, чтобы работали его фреймовые скрипты можно следующим образом:&lt;br /&gt;&lt;code&gt;source="@Embed(source='assets/Index.swf')" &lt;/code&gt;&lt;br /&gt;При внедрении отдельного символа, его фреймовые скрипты и скрипты всех вложенных объектов теряются:&lt;br /&gt;&lt;code&gt;source="@Embed(source='assets/Index.swf'#Index)" &lt;/code&gt;&lt;br /&gt;Игра с параметром mimeType не помогает.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;На управлении внедренным контентом я бы хотел остановиться подробнее. Если у нас много однотипного материала для внедрения вышеописанным способом, то плодить SWF-файлы не удобно, плюс, внедряя каждый файл, мы не можем обобщать графику - она будет внедряться для каждого файла заново (не проверял, но догадываюсь). &lt;/p&gt;&lt;p&gt;Куда удобнее создать одну большую библиотеку и из нее внедрять символы. Но, к сожалению, их скрипты уже будут не доступны.&lt;br /&gt;Но у нас есть в распоряжении метки фреймов и имена клипов. Совмещая возможности&lt;br /&gt;MovieClip.currentLabels и MovieClip.addFrameScript можно получить контроль над внедренным клипом и заставлять его в нужный момент выполнять необходимые нам действия: останавливать клип на нужном фрейме, генерировать события и даже передавать данные в текстовые поля клипа.&lt;/p&gt;&lt;p&gt;Создаем компонент - наследник SWFLoader. После инстанцирования класса внедренного клипа (конец метода load(), можно так же добавить и в обработчик события загрузки), считываются все его метки и в их фреймы добавляются необходимые скрипты. Имя каждой метки имеет ключевую составляющую, которая и определяет тип действия добавляемого скрипта.&lt;br /&gt;В нужный момент можно заставить клип остановиться, перейти на другую метку, генерировать событие (с идентификатором, так же зашитым в имя метки), просканировать клип и получить срез всех визуальных объектов, чтобы делать с ними всё что угодно. Главное - этот момент устанавливается прямо в таймлайне клипа, а не путем каких-либо расчетов количества фреймов или подобных методов.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Прекрасный момент - праздник еще не настал, а дидлайны уже позади! Отдыхать и набираться сил.&lt;/p&gt;&lt;p&gt;И конечно, наших прекрасных женщин поздравляю с праздником 8 марта! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-4032843507574954493?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/4032843507574954493/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=4032843507574954493' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/4032843507574954493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/4032843507574954493'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/03/flex-flash-flex.html' title='Дружим Flex с Flash. Заметки: загрузка, внедрение, шрифт. Flex'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-5716417617817111318</id><published>2009-02-28T23:24:00.029+03:00</published><updated>2009-03-06T22:56:22.107+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Обзоры'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Модули vs. компоненты. Flex</title><content type='html'>&lt;p&gt;В моем опыте Flex-разработки наступает новая стадия взросления.&lt;/p&gt;&lt;p&gt;Ну, условно, у себя я уже могу выделить две стадии (не считая робкого потрагивания и любопытного пощупывания): &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Код представляет собой голый MXML, на котором и построено всё приложение. Крупные вспомогательные структуры классов и обильные инклюды. В решении относительно сложных задач (либо совсем простых) я полагался только на pure AS проекты и компоненты.&lt;/li&gt;&lt;li&gt;Приложение делилось на компоненты (MXML компоненты), каждое окошко, каждый функционально законченный экран были компонентами. Обильное использование компонентов значительно упростило разработку приложений и внесло строгость и порядок, несмотря на довольно пространный список в Components -&gt; Custom.&lt;br /&gt;Кроме того, такой подход значительно ускоряет разработку, уже засчет того, что визуальный редактор теперь не должен перерисовывать каждый раз всё приложение (а делает он это отнюдь не быстро).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Сегодня в разработке проект, который так и напрашивается на использование модулей. В общих чертах - это небольшой промо-сайт с тремя основными разделами. Три этих раздела мы и оформим как модули.&lt;/p&gt;&lt;p&gt;Руки так и зачесались попробовать создать модуль в FB. Открываю проект, создаю New-&gt;MXML Module. Открывается новый файл &lt;em&gt;mxml&lt;/em&gt;, в который я добавляю, к примеру, кнопку, и текстовое поле. Сохраняю. В окошке Components-&gt;Custom появился новый компонент, по имени модуля.&lt;br /&gt;Проведем эксперемент. Перетащим его в окно основного приложения. Всё как с обычным компонентом. Компилирую. Замечательно: скомпилировалось два &lt;em&gt;swf&lt;/em&gt; - один с именем приложения, другой - с именем модуля.&lt;br /&gt;Для любопытства, копируем один только &lt;em&gt;swf&lt;/em&gt; приложения и запускаем: видим кнопку и текстовое поле. Как я и предполагал, наш модуль включен в состав &lt;em&gt;swf &lt;/em&gt;приложения как обычный компонент.&lt;br /&gt;Запустим &lt;em&gt;swf&lt;/em&gt; модуля. Сразу получаем ошибку "&lt;em&gt;Не удалось найти класс mx.core::SpriteAsset.&lt;/em&gt;" И не мудрено - модуль не содержит классов, включенных в основное приложение.&lt;br /&gt;Но нам-то от модуля нужно что? Чтобы он не был включен в приложение, а подгружался в процессе работы приложения. Хотя, возможность использовать модуль как обычный MXML-компонент тоже надо отметить.&lt;/p&gt;&lt;p&gt;Ознакомимся вкратце с документацией: &lt;a href="http://livedocs.adobe.com/flex/3/html/help.html?content=modular_1.html"&gt;Creating Modular Applications&lt;/a&gt;. Здесь всё, на достаточно понятном языке, достаточно подробно разжевывается. &lt;/p&gt;&lt;p&gt;Итак. Нас интересовали загрузка модуля и ее мониторинг.&lt;br /&gt;Пожалуйста, смотрим: &lt;a href="http://livedocs.adobe.com/flex/3/html/help.html?content=modular_5.html"&gt;Loading and unloading modules&lt;/a&gt;. За загрузку отвечает класс &lt;a href="http://livedocs.adobe.com/flex/3/langref/mx/modules/ModuleLoader.html" target="_blank"&gt;ModuleLoader&lt;/a&gt;. Любопытно, что это наследник &lt;a href="http://livedocs.adobe.com/flex/3/langref/mx/containers/VBox.html"&gt;VBox&lt;/a&gt;. Непонятно, почему именно VBox, а не, к примеру, HBox. Уж я-то вообще ожидал увидеть в этой роли SWFLoader. Ну да ладно. Убираем из кода приложения модуль и вставляем ModuleLoader. Кстати, он присутствует в палитре компонентов Layout.&lt;br /&gt;Вписываем в свойство &lt;em&gt;url&lt;/em&gt; имя файла модуля. И что особенно приятно, визуальный редактор сразу отобразил содержимое модуля. Вводим имя другого модуля - пожалста! Отображается другой модуль. Запускаем - всё замечательно отображается и работает.&lt;br /&gt;Теперь по поводу мониторинга. Смотрим &lt;a href="http://livedocs.adobe.com/flex/3/html/help.html?content=modular_6.html"&gt;Using ModuleLoader events&lt;/a&gt;. ModuleLoader генерирует следующие события:&lt;em&gt; setup, ready, loading, unload, progress, error,&lt;/em&gt; и&lt;em&gt; urlChanged&lt;/em&gt;. Но позвольте! Если &lt;em&gt;progress&lt;/em&gt; мы наблюдаем в этом списке, то почему нет &lt;em&gt;open&lt;/em&gt; и &lt;em&gt;complete&lt;/em&gt;? Что помешало вместо &lt;em&gt;loading&lt;/em&gt; генерировать &lt;em&gt;open&lt;/em&gt;, а вместо &lt;em&gt;ready&lt;/em&gt; - &lt;em&gt;complete&lt;/em&gt;?&lt;br /&gt;При таком раскладе, если я использую ProgressBar в режиме &lt;em&gt;mode="event"&lt;/em&gt;, загрузка успешно мониторится, но ProgressBar не генерирует событие &lt;em&gt;complete&lt;/em&gt;, что в некоторых случаях было бы полезно. Ну что ж, никто не мешает нам устранить этот недостаток, создав своего потомка ModuleLoader. Дело поправимое.&lt;/p&gt;&lt;p&gt;Есть еще один компонент, управляющий загрузкой модулей: &lt;a href="http://livedocs.adobe.com/flex/3/langref/mx/modules/ModuleManager.html" target="_blank"&gt;ModuleManager&lt;/a&gt;. Этот класс, как нам обещают, предоставляет больше возможностей по управлению загрузкой модулей чем предыдущий. Но при этом, как утверждается, техника его использования является менее абстрактной чем работа с ModuleLoader.&lt;br /&gt;Да, разработчики Flex не перестают меня удивлять. ModuleManager наследуется от Object и содержит всего два статических метода, что ввело меня в небольшой ступор. Однако, после изучения предложенных &lt;a href="http://livedocs.adobe.com/flex/3/html/modular_5.html#171081"&gt;примеров&lt;/a&gt;, всё встало на свои места. Метод &lt;em&gt;ModuleManager.&lt;/em&gt;&lt;a class="signatureLink" href="http://livedocs.adobe.com/flex/3/langref/mx/modules/ModuleManager.html#getModule()"&gt;&lt;em&gt;getModule&lt;/em&gt;&lt;/a&gt; возвращает объект, удовлетворяющий интерфейсу &lt;a href="http://livedocs.adobe.com/flex/3/langref/mx/modules/IModuleInfo.html"&gt;IModuleInfo&lt;/a&gt;, уникальный для каждого управляемого модуля. Этот объект, в дальнейшем, можно использовать для загрузки модуля (метод &lt;a class="signatureLink" href="http://livedocs.adobe.com/flex/3/langref/mx/modules/IModuleInfo.html#load()"&gt;load&lt;/a&gt;) и мониторинга событий загрузки, а затем, для инстанцирования модуля (через свойство &lt;a class="signatureLink" href="http://livedocs.adobe.com/flex/3/langref/mx/modules/IModuleInfo.html#factory"&gt;factory&lt;/a&gt;).&lt;br /&gt;Более подробное изучение этого класса, погружает нас в глубины Flex, что в мои планы пока совсем не входит. Вот уж, другими словами и не скажешь - все намного менее абстрактно. И больше подходит для решения специфических задач.&lt;/p&gt;&lt;p&gt;Ну-с, добро пожаловать в мир модульных приложений. Начинаем действовать!&lt;/p&gt;&lt;p&gt;* * *&lt;/p&gt;&lt;p&gt;Впечатления. Работа с модулями не разочаровала: стабильно и надежно. Единственные проблемы, с которыми я столкнулся:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Внедрение шрифта. CSS с внедрением TTF-шрифта определяется в главном приложении. Подгружаемые модули успешно используют эти шрифты. Но, возникла проблема с внедряемыми SWF, в которых используется другой шрифт. При вводе в динамические поля, ничего не отображалось. Тогда я внедрил этот шрифт в модуль. Шрифт стал отображаться. Но, что интересно, когда я собрал Release Build, шрифт опять перестал отображаться. Пришлось оставить Debug-версию модуля. Но это повлекло за собой следующую проблему.&lt;/li&gt;&lt;li&gt;Если основное приложение собрано в Release Build, оно некорректно подгружает модуль, собранный в Debug Build. Я думаю, что вообще, по-отдельности модули лучше не обновлять. Я обратил внимание, что размер SWF-файла модуля даже при небольших изменениях, при перекомпиляции заметно меняется. Поэтому, следует, наверное, соблюдать осторожность при компиляции и обновлении модулей.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-5716417617817111318?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/5716417617817111318/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=5716417617817111318' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/5716417617817111318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/5716417617817111318'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/02/vs-flex.html' title='Модули vs. компоненты. Flex'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-2651554410015646643</id><published>2009-02-25T22:12:00.010+03:00</published><updated>2009-03-07T23:33:23.992+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Код'/><category scheme='http://www.blogger.com/atom/ns#' term='Actionscript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Грабли'/><category scheme='http://www.blogger.com/atom/ns#' term='Zinc'/><title type='text'>В цинковом гробу. Перетаскиваемые окошки</title><content type='html'>Волею судеб, свалился мне проект такой. Есть несколько флэшек, так называемых виджетов, которые нужно одеть в Zinc так, чтобы еще и под Mac OSX работали.&lt;br /&gt;&lt;br /&gt;Во-первых, сразу зарекаюсь - Мак только для мак-девелоперов. Без меня. Такого количества проблем я уже давно не встречал. Возможно, основным виновником их является Zinc, который я смело могу назвать УСЛОВНО кросс-платформенным.&lt;br /&gt;&lt;br /&gt;Что сказать про Zinc 3.0? Под красивым брендовым дизайном, симпатичной оболочкой, красивыми заголовками скрывается довольно ограниченный функционал, убогая документация и море непонятностей, глюков и граблей.&lt;br /&gt;&lt;br /&gt;В данном посте, приведу один пример, как простая задача решается через "заднее место".&lt;br /&gt;Нужно, чтобы окошко нашего виджета перетаскивалось мышкой за специальную панельку. В документации, нам рассказывают про это так: &lt;a href="http://www.multidmedia.com/support/livedocs/help_docs.php?type=help&amp;amp;page=50"&gt;Creating a Draggable Form&lt;/a&gt;. И что мы получаем? Да полный отстой. Мышь теряет окошко, потом, при наведении вдруг опять подхватывается, уже без нашего на то соизволения, в общем, ужас. Как это победить? Нужно повесить 3 обработчика мыши на панельку и сделать это вот как:&lt;br /&gt;&lt;br /&gt;&lt;div rows="20"&gt;dragNDropRenderer.buttonMode = true; dragNDropRenderer.useHandCursor = true;&lt;br /&gt;dragNDropRenderer.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler);&lt;br /&gt;dragNDropRenderer.addEventListener(MouseEvent.ROLL_OUT, rollOutHandler);&lt;br /&gt;dragNDropRenderer.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);&lt;br /&gt;&lt;br /&gt;. . .&lt;br /&gt;&lt;br /&gt;private function rollOverHandler(event:MouseEvent):void {&lt;br /&gt;mdm.Forms.getFormByName("MainForm").startDrag();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function rollOutHandler(event:MouseEvent):void {&lt;br /&gt;if (!event.buttonDown) {&lt;br /&gt;mdm.Forms.getFormByName("MainForm").stopDrag();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function mouseUpHandler(event:MouseEvent):void { &lt;/div&gt;&lt;div rows="20"&gt;var renderer:DisplayObject = DisplayObject(event.target); &lt;/div&gt;&lt;div rows="20"&gt;if (!renderer.getBounds(renderer).contains(event.localX,event.localY))&lt;br /&gt;mdm.Forms.getFormByName("MainForm").stopDrag();&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Конфликт событий мыши распространяется только на нажатие. Отпускание, вполне корректно работает. Кстати, при перетаскивании, обрабатывать нажатие вообще не советую - реакция совершенно непредсказуема. Таким образом, мы отрубаем перетаскивание пир отпускании кнопки, а при отведении мыши от панели проверяем, отпущена ли в данный момент кнопка. Если отпущена - останавливаем перетаскивание. Если нет - ни в коем случае этого не делаем - мышь потеряет окошко в момент таскания.&lt;br /&gt;&lt;br /&gt;Другие баги - почему под MacOX криво работает LocalConnection, или не открываются Zinc-ом новые окошки, и не распарсивается полученный с сервера XML, мне еще предстоит выяснить. Чувствую, это будут "приятные" сюрпризы.&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;В обработчик отпускания мыши добавлена проверка на отсутствие мыши в области панели.&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;Продолаются жалобы. Под MACOX не удалось (под Windows всё Ок) передать на сервер запрос с GET-параметрами (URLRequest). Запрос проходит, параметры не передаются. Не имел возможности выяснить, виновен ли в этом Zinc или админы сервера. В итоге, стали передавать параметры через POST, что сразу дало положительный результат.&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;Прозрачность. Плашка прозрачностью 1% ложится поверх поверхности со сложным изображением сложной прозрачности. Окно приложения устанавливается прозрачным. И что вы думаете? Эта плашка видна. Она как бы добавляет прозрачности подлежащему изображению. То же самое можно сказать, если поверх ложится растр с прозрачностью. Прозрачная область растра становится видна.&lt;br /&gt;Выход - не допускать "недопрозрачностей", обтравливать растр во флэше.&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;Всё. Финиш. Zinc и MacOX - больше несовместимые понятия. Делаю полноэкранное приложение. В окне приложения, справа, где-то на 1/4 ширины, существует "мертвая" зона, в которой мышь перестает оказывать воздействие на интерактивные flash-элементы. Нет, нельзя сказать что совсем не оказывает. После 5-10 нажатий, кнопка срабатывает. Но это же бред. Элементраный пример - делаем во flash плашку размером с экран (1280x800), вставляем SWF в гроб, билдим и наблюдаем эту границу. Кошмар. Под Windows и под MacOX в Safari работает превосходно.&lt;br /&gt;Сделать многооконное приложение с Zinc также не получилось - опять же проблемы с мышью. Интерактив не откликается.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-2651554410015646643?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/2651554410015646643/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=2651554410015646643' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/2651554410015646643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/2651554410015646643'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/02/blog-post.html' title='В цинковом гробу. Перетаскиваемые окошки'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-8608697336954549744</id><published>2009-02-11T19:27:00.017+03:00</published><updated>2009-02-12T02:08:51.859+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Справка'/><title type='text'>Как отображать шрифт без сглаживания (bitmap text) во Flex</title><content type='html'>Flex имеет некоторые ограничения в работе с внедренными шрифтами.&lt;br /&gt;Если во Flash CS, мы можем просто так взять, да и указать тип рендеринга шрифтов "Bitmap text" (без антиалиасинга) и иметь полноценное отображение текста с неполной прозрачностью, наклоном и т.п., то во Flex мы можем только управлять параметрами сглаживания шрифта, или не внедрять шрифт совсем (тогда о прозрачности не может быть и речи).&lt;br /&gt;&lt;br /&gt;Но если мне, всё-таки, нужен именно несглаженный полупрозрачный шрифт?&lt;br /&gt;Проблема решается, как и многие другие во Flex, через "одно" место.&lt;br /&gt;В лайфдоках, находим такую статейку: &lt;a href="http://livedocs.adobe.com/flex/3/html/fonts_09.html"&gt;Embedding fonts from SWF files&lt;/a&gt;. Здесь рассказывается вообще о внедрении шрифта с использованием Flash CS. Пользуясь таким методом, можно внедрить любой шрифт, поддерживаемый Flash CS.&lt;br /&gt;&lt;br /&gt;Однако, здесь не сказано ни слова про внедрение шрифта Bitmap text (без антиалиасинга). И вообще, в документации Flex, про это как-то совсем ничего нет. А ведь это странно и непонятно - Flex-приложения как раз направлены на отображение данных, а всем известно, что данные отображаются лучше несглаженным шрифтом. К чему тогда все эти эффекты с фэйдом и прочими трансформациями, если невнедренный шрифт их не отображает.&lt;br /&gt;&lt;br /&gt;Нам на помощь приходит статья всеобщего друга всех флэшеров GSkinnerа &lt;a href="http://www.gskinner.com/blog/archives/2007/03/bitmap_fonts_in.html"&gt;Bitmap Fonts in Flex (via Flash)&lt;/a&gt;. Правда, в ней всё несколько усложнено, но, подозреваю, что это из-за того, что писалось это для Flex 2. Ну а мы то уже на Flex 3, поэтому всё немного проще. Идея в том, что шрифт, внедренный как Bitmap text, меняет название в некую неприглядную форму, типа "Tahoma_12pt_st".&lt;br /&gt;&lt;br /&gt;Итак, к чему мы пришли (опишу вкратце мои действия):&lt;br /&gt;&lt;br /&gt;1. Создаем SWF-файл &lt;em&gt;fonts.swf &lt;/em&gt;(можно любой другой). Версия Flash 9, ActionScript 3.0. Во всех статьях создается файл версии Flash 8, но, почему-то, у меня такой файл Flex не подцеплял/ - не может оттранскодить.&lt;br /&gt;&lt;br /&gt;2. Создаем текстовые Dynamic-поля, в каждое из которых добавляем хотя-бы один символ нужного нам начертания. Соответственно, если все начертания нам нужны, то будет 4 текстовых поля: &lt;em&gt;Normal, Bold, Italic, Bold Italic&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;3. Устанавливаем размер шрифта, который мы будем использовать в Flex-приложении. Дело в том, что в приложении, корректно может быть отображен только один размер внедренного шрифта - тот который мы сейчас укажем. Если указать другой размер, шрифт некрасиво размажется. Я указываю 12.&lt;br /&gt;&lt;br /&gt;4. Указываем в &lt;em&gt;Embed...&lt;/em&gt; диапазоны, которые нам надо внедрить.&lt;br /&gt;Кстати, можно пойти другим путем и, вместо текстовых полей, создать в библиотеке 4 символа-шрифта (&lt;em&gt;New font...&lt;/em&gt;) и всё будет точно так же, за исключением того, что шрифт внедрится весь - без ограничений, что плохо для объема.&lt;br /&gt;&lt;br /&gt;5. Компилируем и добавляем в папку проекта.&lt;br /&gt;&lt;br /&gt;6. В CSS файле проекта (я отвел для этого специальный файл &lt;em&gt;fonts.css&lt;/em&gt;) указываем следующий код:&lt;br /&gt;&lt;div id="code" rows="5"&gt;/* CSS file */&lt;br /&gt;@font-face {&lt;br /&gt;src: url("file://./assets/fonts.swf");&lt;br /&gt;fontFamily: "Tahoma_12pt_st";&lt;br /&gt;fontStyle: normal;&lt;br /&gt;fontWeight: normal;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@font-face {&lt;br /&gt;src: url("file://./assets/fonts.swf");&lt;br /&gt;fontFamily: "Tahoma_12pt_st";&lt;br /&gt;fontStyle: normal;&lt;br /&gt;fontWeight: bold;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@font-face {&lt;br /&gt;src: url("file://./assets/fonts.swf");&lt;br /&gt;fontFamily: "Tahoma_12pt_st";&lt;br /&gt;fontStyle: italic;&lt;br /&gt;fontWeight: normal;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@font-face {&lt;br /&gt;src: url("file://./assets/fonts.swf");&lt;br /&gt;fontFamily: "Tahoma_12pt_st";&lt;br /&gt;fontStyle: italic;&lt;br /&gt;fontWeight: bold;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;7. Теперь, мы можем в любом стиле указать:&lt;br /&gt;&lt;div id="code" rows="5"&gt;Text.Regular {&lt;br /&gt;fontFamily: "Tahoma_12pt_st";&lt;br /&gt;fontSize:12px;&lt;br /&gt;fontAntiAliasType:normal;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Важно указать параметр &lt;em&gt;fontAntiAliasType:normal&lt;/em&gt;. Если этого не сделать, шрифт в некоторых случаях будет отображаться размыто, а если это выделяемый текст - при его выделении будет твориться что-то невообразимое.&lt;br /&gt;Ну и конечно, не забыть уточнить размер шрифта - иначе всё поедет.&lt;br /&gt;&lt;br /&gt;8. Ну и собственно, применяем этот стиль к компоненту:&lt;br /&gt;&lt;div id="code" rows="5"&gt;&amp;lt;mx:Text&lt;br /&gt;width="100%"&lt;br /&gt;styleName="Regular"&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;lt;mx:htmlText&amp;gt;&amp;lt;![CDATA[&amp;lt;b&amp;gt;Максимальный&amp;lt;/b&amp;gt; размер загружаемого файла — 3 Мб. Допустимые форматы: GIF, JPG, BMP, TIFF, PNG.]]&amp;gt;&amp;gt;&amp;lt;/mx:htmlText&amp;gt;&lt;br /&gt;&amp;lt;/mx:Text&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Если нам понадобится шрифт другого размера - уж не поленитесь, повторите всё со второго пункта - так уж положено.&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;Да, забыл добавить про то, что здорово помогает в разборках со шрифтами такой кусочек кода (взят из статьи):&lt;br /&gt;&lt;code&gt;var fontList:Array = Font.enumerateFonts(false);&lt;br /&gt;for (var i:uint=0; i&amp;lt;fontList.length; i++) {&lt;br /&gt;    trace("font: "+fontList[i].fontName);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-8608697336954549744?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/8608697336954549744/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=8608697336954549744' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/8608697336954549744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/8608697336954549744'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/02/bitmap-antialiasing-flex.html' title='Как отображать шрифт без сглаживания (bitmap text) во Flex'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-5907680235484652895</id><published>2009-02-09T16:17:00.007+03:00</published><updated>2009-02-09T17:06:55.666+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Код'/><category scheme='http://www.blogger.com/atom/ns#' term='Идеи'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Прогресс-бар на любой вкус. Flex</title><content type='html'>Есть задачка, на первый взгляд, простая и, должно быть, хорошо изученная.&lt;br /&gt;Сделать прогресс-бар (ProgressBar) совершенно не похожим на постепенно заполняющуюся горизонтальную полосу.&lt;br /&gt;&lt;br /&gt;Скинирование позволяет заменить лишь изображения не залитой и залитой полос. Ну а если мне не нужна полоса?&lt;br /&gt;Порыскав по интернету, пришел к выводу, что все усиленно заморачивались на проблему подмены предзагрузчика flash/flex-приложений, а вот видоизменить ProgressBar, почему-то никому не понадобилось.&lt;br /&gt;&lt;br /&gt;Ну что ж, раз готового материала не нашлось, придется мастерить ручками.&lt;br /&gt;&lt;br /&gt;Продолжение следует...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-5907680235484652895?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/5907680235484652895/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=5907680235484652895' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/5907680235484652895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/5907680235484652895'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/02/flex_09.html' title='Прогресс-бар на любой вкус. Flex'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-8581910684379502387</id><published>2009-02-06T12:27:00.012+03:00</published><updated>2009-02-09T12:56:04.665+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Впечатления'/><category scheme='http://www.blogger.com/atom/ns#' term='Грабли'/><title type='text'>Неэффектные эффекты. Flex</title><content type='html'>Просто хотел сделать выезжающую/убирающуюся панельку, активирующуюся при наведении мышки на некий контейнер. И сделать это чисто средствами Flex.&lt;br /&gt;&lt;br /&gt;По началу, сделал просто появляющуюся/исчезающую панель, используя ее свойства&lt;em&gt; showEffect/hideEffect&lt;/em&gt;. По событию наведения мыши делал visible=true, при отведении - наоборот. Эффекты:&lt;br /&gt;&lt;code&gt;&amp;lt;mx:Fade id="PanelFadeIn" alphaFrom="0" alphaTo="1" duration="400"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Fade id="PanelFadeOut" alphaFrom="1" alphaTo="0" duration="400" startDelay="1000"/&amp;gt;&lt;/code&gt;&lt;br /&gt;Полная фигня получилась. Эффекты конфликтовали и панель появлялась и исчезала непредсказуемым образом.&lt;br /&gt;Чтобы образумить эффекты, пришлось их останавливать (&lt;em&gt;stop()&lt;/em&gt;) перед тем как переключать &lt;em&gt;visible&lt;/em&gt;. Так более-менее заработало.&lt;br /&gt;&lt;br /&gt;Попробовал другой способ - есть два стэйта, в которых панель находится в разных положениях. При наведении на контейнер мыши, стейт сменяется и панель перемещается в другое место, при отведении - возвращается на прежнее.&lt;br /&gt;Сначала применил свойство &lt;em&gt;moveEffect&lt;/em&gt;, в которое указывается имя эффекта &amp;lt;mx:Move id="PanelMotion" /&amp;gt; Получаю опять ерунду. В начале вроде бы всё корректно - уезжает, приезжает, но после нескольких таких движений, что-то там начинает заедать. Метод не годится.&lt;br /&gt;&lt;br /&gt;Применяем другую тактику - используем &lt;em&gt;transitions&lt;/em&gt;. Сразу всё встает на свои места:&lt;br /&gt;&lt;code&gt;&amp;lt;mx:transitions&amp;gt;&lt;br /&gt;&amp;lt;mx:Transition fromState="Normal" toState="PanelIsShown"&amp;gt;&lt;br /&gt;&amp;lt;mx:Move duration="200" target="{сontrolPanel}"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:Transition&amp;gt;&lt;br /&gt;&amp;lt;mx:Transition fromState="PanelIsShown" toState="Normal"&amp;gt;&lt;br /&gt;&amp;lt;mx:Move duration="200" target="{сontrolPanel}"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:Transition&amp;gt;&lt;br /&gt;&amp;lt;/mx:transitions&amp;gt;&lt;br /&gt;&lt;/code&gt;Можно конечно обойтись одним блоком &lt;em&gt;fromState="*" toState="*"&lt;/em&gt;, но в некоторых ситуациях, панель "промигивает" в неположенных местах. Но это, конечно, зависит от специфики конкретного приложения.&lt;br /&gt;&lt;br /&gt;В итоге, появление/убирание панели сделать средствами Flex удалось, но не так, как хотелось бы. Дело в том, что я хотел сделать небольшую паузу перед тем, как панель уберется. Сделал я следующее: второй блок &lt;em&gt;transitions&lt;/em&gt; заменил на:&lt;br /&gt;&lt;code&gt;&amp;lt;mx:Sequence target="{сontrolPanel}"&amp;gt;&lt;br /&gt;&amp;lt;mx:Pause duration="1000"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Move duration="200"/&amp;gt;&lt;br /&gt;&amp;lt;/mx:Sequence&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Это вызвало две идиотские проблемы:&lt;br /&gt;1. Такой способ наотрез отказывается работать, если в state меняется не непосредственно координата, а, к примеру, свойства right/left: &lt;em&gt;&amp;lt;mx:SetStyle target="{сontrolPanel}" name="right" value="50"/&amp;gt; &lt;/em&gt;- анимация просто отсутствует.&lt;br /&gt;&lt;br /&gt;2. Панель полностью исчезает и снова появляется, если быстро убрать мышь и опять навести ее на контейнер. А по-хорошему, панель должна оставаться на месте.&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;В общем, решая совсем простую задачу, я столкнулся с кучей дурацких проблем, которые, возможно, решаемы, но скорее всего через шаманские средства - наследование классов эффектов и модификация методов этих классов под свои нужды.&lt;br /&gt;&lt;br /&gt;Или я что-то не допонял, или работа с эффектами оставляет желать лучшего...&lt;br /&gt;Разочарован :(&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;Вот пример с аналогичной панелькой:&lt;br /&gt;&lt;a href="http://www.jonathanrowny.com/code/2008/08/sliding-canvas-with-flex.cfm"&gt;Sliding Canvas with Flex&lt;/a&gt;. Исходный код &lt;a href="http://www.jonathanrowny.com/files/examples/slidecanvas/srcview/index.html"&gt;тут&lt;/a&gt;. Работает вполне стабильно. Замечательно. И главное, у меня такие штуки проходили почему то криво... Сам виноват. Поленился сделать такую же проверку &lt;em&gt;transitionHappening&lt;/em&gt;. А проверял свойство &lt;em&gt;isPlaying&lt;/em&gt;, а оно как-то не правильно показывает если стоит &lt;em&gt;startDelay&lt;/em&gt;. Другой подход с принудительной остановкой &lt;em&gt;stop()&lt;/em&gt; тоже не проходит - надо было изначально блокировать переключение &lt;em&gt;visible&lt;/em&gt;, как в примере. А всё лень виновата - добавлять лишние скрипты не хочется :).&lt;br /&gt;Хотя, с другой стороны, управлять положением компонентов через механизм стэйтов правильнее (универсальнее).&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;В итоге, всё получилось с применением showEffect/hideEffect. Получилось вполне стабильно и без неприятных побочных эффектов:&lt;br /&gt;&lt;br /&gt;&lt;div id="code" rows="15"&gt;&lt;br /&gt;public function hideControlPanel():void {&lt;br /&gt;panelShowEffect.stop();&lt;br /&gt;panelHideEffect.stop();&lt;br /&gt;if (controlPanel.visible)&lt;br /&gt;controlPanel.visible=false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function showControlPanel():void {&lt;br /&gt;if (!this.enabled) return;&lt;br /&gt;panelShowEffect.stop();&lt;br /&gt;panelHideEffect.stop();&lt;br /&gt;if (!controlPanel.visible)&lt;br /&gt;controlPanel.visible=true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;. . .&lt;br /&gt;&lt;br /&gt;&amp;lt;mx:canvas width="{controlPanel.width}" height="100%" clipcontent="true" rollover="showControlPanel()" rollout="hideControlPanel()" creationcomplete="hideControlPanel()" backgroundcolor="#FFFFFF" backgroundalpha="0"&amp;gt;&lt;br /&gt;&lt;br /&gt;. . .&lt;br /&gt;&lt;br /&gt;&amp;lt;mx:Move id="panelShowEffect" xTo="0" duration="200"/&amp;gt;&lt;br /&gt;&amp;lt;mx:Move id="panelHideEffect" startDelay="1000" duration="200" xTo="{-controlPanel.width}"/&amp;gt;&lt;br /&gt;&lt;br /&gt;. . .&lt;br /&gt;&lt;br /&gt;&amp;lt;mx:VBox&lt;br /&gt;id="controlPanel"&lt;br /&gt;height="100%"&lt;br /&gt;showEffect="{panelShowEffect}"&lt;br /&gt;hideEffect="{panelHideEffect}"&lt;br /&gt;x="{-controlPanel.width}"&lt;br /&gt;visible="false"&lt;br /&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;. . . Содержимое панели . . .&lt;br /&gt;&lt;br /&gt;&amp;lt;/mx:VBox&amp;gt;&lt;br /&gt;&lt;br /&gt;. . .&lt;br /&gt;&lt;br /&gt;&amp;lt;/mx:Canvas&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Единственная проблема -пришлось отказаться от эффекта &lt;em&gt;WipeUp/Down,&lt;/em&gt; примененного к компоненту, вложенному в выезжающую панель, из-за его нестабильной работы.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-8581910684379502387?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/8581910684379502387/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=8581910684379502387' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/8581910684379502387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/8581910684379502387'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/02/flex.html' title='Неэффектные эффекты. Flex'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-8762992907932876219</id><published>2009-01-27T13:47:00.008+03:00</published><updated>2009-01-27T15:55:23.316+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Actionscript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Грабли'/><title type='text'>Неубиваемый звук в режиме Start. AS3</title><content type='html'>На такие грабли наткнулся:&lt;br /&gt;&lt;br /&gt;Приложение загружает один и тот же SWF в разные контейнеры, каждый из которых проигрывает загруженный клип и имеет автономное управление звуком. В таймлайне SWF стартуется звук в режиме &lt;em&gt;Start&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Контейнеры добавляются (&lt;em&gt;mx:AddChild&lt;/em&gt;) в разных стэйтах (&lt;em&gt;mx:State&lt;/em&gt;). Соответственно, при переключении стэйтов, я отслеживаю события &lt;em&gt;addedToStage/removedFromStage&lt;/em&gt; для остановки/запуска клипа и включения/выключения звука (компоненты при смене стэйтов удаляются из списка отображаемых объектов, а не из памяти). Если не останавливать клипы, они всё равно воспроизводятся, даже если их нет в списке отображаемых объектов, а так же и их звук, что, понятное дело, совсем не хорошо.&lt;br /&gt;&lt;br /&gt;Так вот. При старте звука в режиме &lt;em&gt;Start&lt;/em&gt; в одном контейнере, в другом этот звук уже не начнет воспроизводиться заново, а будет продолжать играться. Регулировка громкости так же будет влиять только на него. В остальных режимах, дело ясное, всё работает независимо.&lt;br /&gt;&lt;br /&gt;Остановка таймлайн-звука для конкретного клипа в AS3 не предусмотрена.&lt;br /&gt;Есть возможность отключить все звуки приложения при помощи &lt;em&gt;SoundMixer.stopAll();&lt;/em&gt;. Как вариант, такой подход в принципе, приемлем,  но остановить все звуки приложения - это значит исключить ситуацию, когда, к примеру, требуется остановить звук лишь одного компонента.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-8762992907932876219?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/8762992907932876219/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=8762992907932876219' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/8762992907932876219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/8762992907932876219'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/01/start-as3.html' title='Неубиваемый звук в режиме Start. AS3'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-7912418260040497788</id><published>2009-01-20T10:51:00.024+03:00</published><updated>2009-01-20T15:33:44.873+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='От автора'/><title type='text'>Последние флэшеры покидают РБК СОФТ. Прощальные заметки, итоги</title><content type='html'>Всем уже известно, как кризис обошелся с &lt;a href="http://www.rbc.ru/"&gt;РБК&lt;/a&gt;. Последние несколько месяцев, мы с любопытством наблюдали, как тонет этот гигант. Наверное, было не так уж плохо, когда, около 2х лет назад, РБК СОФТ и несколько других IT-компаний были &lt;a href="http://www.kommersant.ru/doc.aspx?DocsID=736937"&gt;отделены и собраны&lt;/a&gt; в холдинг &lt;a href="http://www.armd.ru/ru/about_group/"&gt;Армада&lt;/a&gt;. Поэтому, кризис до нас добрался не так быстро. Но он добрался до нас.&lt;br /&gt;&lt;p&gt;Об этом конечно все знали. Осенью начались сильные перемены на верхах, ушли многие из руководства. Еще не кончился 2008-й год, а РБК СОФТ провел жесткие сокращения во всех своих подразделениях. В частности, не особо церемонясь, попрощался со своим отделом дизайна &lt;a href="http://internet.rbc.ru/ru/"&gt;департамента интернет проектов&lt;/a&gt;. От прекрасной команды топовых дизайнеров осталось два-три человека. Я плохо понимаю, да и не очень хочется, что явилось причиной такого шага. Простые оправдания - кризис, убыточность, нерентабельность и т.п. Про сокращение зарплат вообще молчу, хотя, как говорят, 15% - не так уж и много.&lt;/p&gt;&lt;p&gt;Сокращения так же коснулись и отдела &lt;a href="http://presentation.rbc.ru/"&gt;мультимедиа-презентаций&lt;/a&gt;, который я, собственно, представлял до конца прошлого года. После сокращения части флэшеров и специалистов по 3D- и видео-анимации, нас осталось только двое. &lt;/p&gt;&lt;p&gt;Начало 2009 года принесло новые сокращения. И вот, вчера было объявлено решение о сокращении флэшеров. Мой напарник уходит уже через одну-две недели. Мне дали больше времени - около месяца.&lt;/p&gt;&lt;p&gt;Конечно, жаль расставаться с устоявшимся образом жизни, после 3-х лет стабильной работы. Не могу сказать, что в РБК СОФТ было плохо. За время, которое я здесь работал, я приобрел огромный опыт и знания, хороших друзей, наработал приличный портфель. Работа, которой я занимался, во многом требовала творческого подхода. Несмотря на большие объемы и часто жесткие сроки, было достаточно времени на обучение и развитие. Хотя, не скажу конечно, что компания выделяла большие средства на повышение квалификации - это делалось со скрипом. &lt;/p&gt;&lt;p&gt;Подводя итоги своей работы в РБК СОФТ, хочется сказать, что пересмотреть результаты своей деятельности приятно: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://presentation.rbc.ru/projects/presentations.php"&gt;Мультимедиа-презентации&lt;/a&gt;.&lt;br /&gt;Свою первую презентацию (не считая пары мультимедийных каталогов), я сделал еще в 2002-м для OTIS, будучи аутсорсером команды разработчиков eTeam. Позже, уже в стенах РБК СОФТ, &lt;a href="http://presentation.rbc.ru/projects/presentations.php?bc_tovar_id=11"&gt;презентация&lt;/a&gt; дорабатывалась и переделывалась без меня.&lt;br /&gt;&lt;br /&gt;Большая часть презентаций была разработана на основе движка, который я разработал еще в начале 2006-го. Одна из первых работ на этом движке - &lt;a href="http://presentation.rbc.ru/projects/presentations.php?bc_tovar_id=68"&gt;Мультимедийная презентация Fiat&lt;/a&gt; (самая первая - для компании "Начало" - говорящее название).&lt;br /&gt;&lt;br /&gt;Если говорить о работах, которыми я горжусь - это презентации &lt;a href="http://presentation.rbc.ru/projects/presentations.php?bc_tovar_id=77"&gt;Мультимедиа-презентация Лукойл&lt;/a&gt;, &lt;a href="http://presentation.rbc.ru/projects/presentations.php?bc_tovar_id=84"&gt;Мультимедийная презентация для «CeBIT 2007»&lt;/a&gt;, &lt;a href="http://presentation.rbc.ru/projects/presentations.php?bc_tovar_id=95"&gt;Росстат. Предварительные итоги ВСХП по полной программе&lt;/a&gt;, &lt;a href="http://presentation.rbc.ru/projects/presentations.php?bc_tovar_id=96"&gt;ALM-Development&lt;/a&gt;, &lt;a href="http://presentation.rbc.ru/projects/presentations.php?bc_tovar_id=105"&gt;Комитет Рекламы Правительства Москвы&lt;/a&gt;. Еще был очень интересный проект - презентация самого департамента презентаций, с каталогом работ.&lt;br /&gt;&lt;br /&gt;Хочу отметить, что моей работой в этих проектах являлись программирование и анимация. Заслуги дизайна, безусловно принадлежат нашим дизайнерам - я участвовал лишь как критик, а разрабатывал дизайн лишь некоторых слайдов. Конечно, все идеи и работы - это результат тесного сотрудничества нашей команды. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.schueco.com/specials/partner_map_ru/index.html"&gt;Моя первая презентация на Flex&lt;/a&gt;. По сути, это интерактивная карта. Здесь, это on-line версия карты (к сожалению, клиент выложил не все материалы, поэтому много фотографий отсутствует). Изначально, это была мультимедиа-презентация на CD, которую, по просьбе клиента выложили в Интернет.&lt;br /&gt;Это был не первый опыт Flex-разработки, но мой первый коммерческий проект на Flex. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Игры и открытки. Я провел много приятных часов над их разработкой. Вот некоторые из них: &lt;a href="http://presentation.rbc.ru/projects/games.php?bc_tovar_id=78"&gt;Игра для ПНП «Здоровье»&lt;/a&gt;, &lt;a href="http://presentation.rbc.ru/projects/cards.php?bc_tovar_id=89"&gt;"Ледовое шоу маленьких поросят"&lt;/a&gt;, &lt;a href="http://presentation.rbc.ru/projects/games.php?bc_tovar_id=101"&gt;ХЦ мышератор&lt;/a&gt; (первые две игры были созданы на базе физического движка моей разработки под flash 7-8, Мышератор - на &lt;a href="http://fisixengine.com/"&gt;Fisix&lt;/a&gt; под flash 9). Были и с &lt;a href="http://presentation.rbc.ru/projects/cards.php?bc_tovar_id=81"&gt;раздеванием&lt;/a&gt; (жаль хостинг прикрыли), и &lt;a href="http://presentation.rbc.ru/projects/cards.php?bc_tovar_id=103"&gt;просто заставки&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Почти все &lt;a href="http://moskids.ru/ru/training_games/tasks/index.php?from20300=1"&gt;игры&lt;/a&gt; на &lt;a href="http://moskids.ru/"&gt;Детском Портале Москвы&lt;/a&gt; - наша работа. Есть хорошие, есть не очень. Не так давно, я разработал движок для кроссвордов, на базе которого работают &lt;a href="http://moskids.ru/ru/training_games/crosswords/"&gt;Кроссворды&lt;/a&gt;. Они &lt;a href="http://www.mosteens.ru/ru/services/crosswords/"&gt;есть&lt;/a&gt; так же и на &lt;a href="http://www.mosteens.ru/"&gt;Молодежном портале Москвы&lt;/a&gt;.&lt;br /&gt;Для этого же портала, я разработал &lt;a href="http://www.mosteens.ru/ru/services/online_game/"&gt;мультиплеерные игры&lt;/a&gt; Шашки и Го с использованием Flex и SmartFox. Опыт разработки мультиплеерных игр был получен при разработке игрового проекта (не буду называть, из коммерческих соображений) который, увы, так же был погублен кризисом и не был окончательно доделан и опубликован. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Банеры - до сих пор &lt;a href="http://presentation.rbc.ru/news/"&gt;висит на сайте банер&lt;/a&gt; с шахматами, который я сделал в 2006 году. Тогда были золотые времена, когда хватало времени заморочиться на банер с 3D-эффектами.&lt;br /&gt;Могу с гордостью сказать, что вращающуюся монетку &lt;a href="http://sbrf.ru/"&gt;в логотипе сайта Сбербанка&lt;/a&gt; cделал я (не смотря на то, что смотрится она там, конечно, несколько абсурдно). &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Работы по различному интерактиву, такие как ротатор рекламы на &lt;a href="http://www.tv3russia.ru/"&gt;ТВ3&lt;/a&gt;, интерактивные карты с редактором в CMS (к сожалению, модуль карты для Raiffeisen еще не опубликован). &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Flash-сайтами мы занимались крайне редко, ввиду специфики департамента мультимедиа-презентаций.&lt;br /&gt;Самая первая моя работа в РБК СОФТ, был &lt;a href="http://steelar.com/"&gt;сайт компании Steelar&lt;/a&gt;. Мне любезно предложили доделать flash-анимацию главной страницы и сделать &lt;a href="http://steelar.com/request.php"&gt;форму заявки&lt;/a&gt; (нудная работа, от которой тогда все флэшеры открещивались), чем я и занялся с энтузиазмом, и в итоге, прикрутил даже печать формы из flash.&lt;br /&gt;&lt;br /&gt;Полностью флэшовый сайт для компании &lt;a href="http://basel.ru/"&gt;Базовый Элемент&lt;/a&gt;. Сейчас здесь уже совсем другой сайт. Но еще не так давно, это был сайт, полностью сделаный на flash 6, посаженный на CMS, с возможностью редактирования контента и deep-linking.&lt;br /&gt;&lt;br /&gt;Еще один сайт - &lt;a href="http://vi.ru/index.aspx"&gt;VI&lt;/a&gt;, создававшийся в эпоху flash 8. Здесь я по полной оторвался, используя фильтры, включая DisplacementMap. Сейчас этот сайт на поддержке других разработчиков, но кардинальных изменений нет. С сожалением отмечаю, что это сайт выглядит несколько недоделанным. Виной тому были политические и материальные причины.&lt;br /&gt;&lt;br /&gt;Один из последних проектов - главная страница &lt;a href="http://moskids.ru/"&gt;Детский портал Москвы&lt;/a&gt;. Гордиться этой работой пока не могу. Великолепный дизайн и громадная работа по разработке убиты кризисом и сроками. Несмотря на обширные работы по оптимизации, заставка забивает процессор по полной, а всё по одной причине - она не должна масштабироваться. Но она это делает, а следовательно включается сглаживание.&lt;br /&gt;Но доработка была отложена до лучших времен. Надеюсь, что эти времена настанут.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Забавно... Пост плавно преобразовался в нечто похожее на резюме или портфолио. Конечно это далеко не все работы, которые были сделаны в стенах РБК СОФТ. Кроме того, еще столько же было сделано на фрилансе, но об этом сейчас речь не идет. &lt;/p&gt;&lt;p&gt;Жизнь продолжается, ухожу в свободное плавание. Что будет дальше - время покажет...&lt;/p&gt;&lt;p&gt;Было и хорошее и плохое, и интересные проекты и не интересные, и удачи и провалы. Главное - прекрасные люди, с которыми я работал в команде. Кто-то сейчас еще в стенах РБК-СОФТ, кто-то давно ушел или попал под сокращение. Нам еще предстоит много работать вместе, но сейчас хочу сказать им всем огромное спасибо. Несмотря на развал, все кризисы и прочий негатив, в памяти остались только самые хорошие воспоминания. &lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_CaLrVaXPjyY/SXXEZ_OR25I/AAAAAAAAACc/D8GHli-nIlA/s1600-h/football.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5293352887790984082" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 248px; TEXT-ALIGN: center" alt="Я на воротах" src="http://4.bp.blogspot.com/_CaLrVaXPjyY/SXXEZ_OR25I/AAAAAAAAACc/D8GHli-nIlA/s400/football.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-7912418260040497788?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/7912418260040497788/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=7912418260040497788' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/7912418260040497788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/7912418260040497788'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/01/blog-post_20.html' title='Последние флэшеры покидают РБК СОФТ. Прощальные заметки, итоги'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_CaLrVaXPjyY/SXXEZ_OR25I/AAAAAAAAACc/D8GHli-nIlA/s72-c/football.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-8679586037656278040</id><published>2009-01-19T18:53:00.013+03:00</published><updated>2009-03-29T01:17:04.476+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wowza'/><category scheme='http://www.blogger.com/atom/ns#' term='Microphone'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash Media Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Red5'/><category scheme='http://www.blogger.com/atom/ns#' term='Обзоры'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='haXeVideo'/><title type='text'>Сохраняем звук с микрофона на сервер</title><content type='html'>&lt;p&gt;Сегодня на повестке дня стоит вопрос - как записать звук и сохранить его на сервер при помощи Flash. Задача с первого взгляда простая, попробуем-ка с ней разобраться.&lt;br /&gt;Не забываем, что снять звук напрямую в Flash Player нельзя: &lt;a class="l" onmousedown="return clk(this.href,'','','res','3','&amp;amp;sig2=lEuAfUd9XODGTNIPLBB1tA')" href="http://racer242.blogspot.com/2008/07/blog-post.html" target="_blank"&gt;Flash-разработка: Прокол с микрофоном&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Для начала, поглядим, что скажет наши самые близкие помощники - Adobe Flex 3 Help и Adobe® Flex™ 3 Language Reference:&lt;/p&gt;&lt;p&gt;&lt;a href="http://livedocs.adobe.com/flex/3/html/help.html?content=Working_with_Sound_01.html"&gt;Главная статья о работе со звуком&lt;/a&gt;. Тут мы проваливаемся в &lt;a href="http://livedocs.adobe.com/flex/3/html/Working_with_Sound_15.html#158190"&gt;Capturing sound input&lt;/a&gt; и смотрим, как получить звук с микрофона и что, собственно, можно сделать с этим звуком. &lt;/p&gt;&lt;p&gt;Итак, &lt;a href="http://livedocs.adobe.com/flex/3/langref/index.html?flash/media/Microphone.html&amp;amp;flash/media/class-list.html"&gt;Microphone&lt;/a&gt; - класс, который нам позволит записать звук с нашего микрофона.&lt;br /&gt;При использовании микрофона, необходимо, чтобы размер окна нашего приложения был не менее 215 x 138. Иначе ничего не выйдет - Flash Player должен вывести из соображений безопасности окно подтверждения использования микрофона (а как бы здорово было бы скрыть это окошко и подслушивать, что там говорят юзеры про наш сайт :). Кстати, умные люди додумались, &lt;a href="http://soft.compulenta.ru/373519/"&gt;как это сделать&lt;/a&gt;). Класс позволяет выбрать и активировать при помощи метода &lt;a class="signatureLink" href="http://livedocs.adobe.com/flex/3/langref/flash/media/Microphone.html#getMicrophone()"&gt;getMicrophone&lt;/a&gt; нужный микрофон, настроить характеристики записи. &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://livedocs.adobe.com/flex/3/html/Working_with_Sound_16.html#157496"&gt;Accessing a microphone&lt;/a&gt; - читаем и копипастим, как активировать микрофон.&lt;/li&gt;&lt;li&gt;&lt;a href="http://livedocs.adobe.com/flex/3/html/Working_with_Sound_17.html#157271"&gt;Routing microphone audio to local speakers&lt;/a&gt; - возможность транслировать звук на колонки юзера. Это наверное для того, чтобы лучше себя слышать в наушниках или сделать эдакий "громкоговоритель" :). Скорее всего, эта функция нужна для того, чтобы юзер мог убедиться собственными ушами, что его микрофон работает.&lt;/li&gt;&lt;li&gt;&lt;a href="http://livedocs.adobe.com/flex/3/html/Working_with_Sound_18.html#157913"&gt;Altering microphone audio&lt;/a&gt; - вкратце о том, как поменять громкость и частоту.&lt;/li&gt;&lt;li&gt;&lt;a href="http://livedocs.adobe.com/flex/3/html/Working_with_Sound_19.html#155569"&gt;Detecting microphone activity&lt;/a&gt; - рассказывает о таком полезном свойстве, как отключение приема звука через интервал времени &lt;a class="signatureLink" href="http://livedocs.adobe.com/flex/3/langref/flash/media/Microphone.html#silenceTimeout"&gt;silenceTimeout&lt;/a&gt;, если его уровень &lt;a class="signatureLink" href="http://livedocs.adobe.com/flex/3/langref/flash/media/Microphone.html#activityLevel"&gt;activityLevel&lt;/a&gt; менее &lt;a class="signatureLink" href="http://livedocs.adobe.com/flex/3/langref/flash/media/Microphone.html#silenceLevel"&gt;silenceLevel&lt;/a&gt;. Это экономит производительность и трафик, в общем - очень правильный подход. При отключении микрофона после тайм-аута и его включении при появлении звука, генерируется событие &lt;a href="http://livedocs.adobe.com/flex/3/langref/flash/media/Microphone.html#event:activity"&gt;ActivityEvent.ACTIVITY&lt;/a&gt;, что и помогает нам включать и выключать запись звука. Нужно также учесть, что микрофон включается не сразу, а после некоторой задержки - это плата за экономию трафика - если установить порог тишины, то микрофон отключаться не будет, но зато и задержка исчезнет.&lt;/li&gt;&lt;li&gt;&lt;a href="http://livedocs.adobe.com/flex/3/html/Working_with_Sound_20.html#157787"&gt;Sending audio to and from a media server&lt;/a&gt; - то что нам и нужно. Говорят, что нет ничего проще - приаттачить объект нашего микрофона к &lt;a href="http://livedocs.adobe.com/flex/3/langref/index.html?flash/net/NetStream.html"&gt;NetStream&lt;/a&gt; и передавать данные прямо на сервер типа &lt;a href="http://help.adobe.com/en_US/FlashMediaServer/3.5_TechOverview/"&gt;Flash Media Server&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Вот, собственно и вся теория. Переходим к практике. Для начала, пошуршим по Гуглу на предмет нашего вопроса. &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Как я понимаю, нас интересуют серверы, которые обеспечивают потоковую передачу данных по средством протокола &lt;a href="http://ru.wikipedia.org/wiki/RTMP"&gt;RTMP&lt;/a&gt; или &lt;a href="http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol"&gt;Real Time Messaging Protocol&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Вот информация о медиа-серверах:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a title="'Permanent" href="http://flash-santer.com/?p=25" rel="bookmark"&gt;Пробуем haxeVideo&lt;/a&gt; от &lt;a href="http://flash-santer.com/"&gt;Santer&lt;/a&gt;. Он записывает видео при помощи сервера &lt;a title="Официальный сайт сервера" onclick="javascript:pageTracker._trackPageview('/outbound/article/haxevideo.org');" href="http://haxevideo.org/" target="_self"&gt;haxeVideo&lt;/a&gt;. Выясняем, что сервер так же пишет и аудио-информацию.&lt;/li&gt;&lt;li&gt;&lt;a href="http://webanet.ru/flash-media-server-vs-red5.html"&gt;flash media server против red5 (сравнение)&lt;/a&gt;. Автор здорово ругает RED5, но его замечания касаются в общем-то работы с видео. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nestor.minsk.by/sr/2008/07/sr80725.html"&gt;Программирование для платформы Flash под Linux&lt;/a&gt; (&lt;a href="http://www.osp.ru/pcworld/2008/09/5643883/"&gt;другая ссылка&lt;/a&gt;). Здесь, в разделе &lt;strong&gt;медиа-серверы&lt;/strong&gt; дается общее описание современных серверов, либо просто упоминаюся: Flash Media Server, RED5, Wowza, haXeVideo, RubyIZUMI.&lt;/li&gt;&lt;li&gt;&lt;a href="http://osflash.org/projects"&gt;OSFlash&lt;/a&gt;: раздел &lt;a id="servers_and_remoting" name="servers_and_remoting"&gt;&lt;strong&gt;Servers and Remoting&lt;/strong&gt;&lt;/a&gt;. Тут куча опенсорсных продуктов. В том числе, для PHP-разработчиков, такие как &lt;a class="wikilink1" title="kaltura" href="http://osflash.org/kaltura"&gt;Kaltura&lt;/a&gt;, что может здорово пригодиться.&lt;/li&gt;&lt;li&gt;&lt;a href="http://mediaservers.ru/"&gt;Медиа серверы&lt;/a&gt;: форум про медиа-серверы. Пока не многочисленный, но довольно живой.&lt;/li&gt;&lt;li&gt;&lt;a title="Встречайте Open Source Flash Media Server — Mammoth" href="http://flash-ripper.com/archives/002586.php"&gt;Встречайте Open Source Flash Media Server — Mammoth&lt;/a&gt;. Описание и ссылки.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Итак, рассмотрем претендентов на использование в качестве сервера:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.adobe.com/ru/products/flashmediainteractive/"&gt;Flash Media Server&lt;/a&gt;:&lt;br /&gt;Семейство продуктов Flash Media Server - лидирующее решение для задач обработки потокового видео, рилтайм-коммуникаций. В общем, как всегда у Adobe всё безупречно и дорого. Лучше смотреть таблицу &lt;a href="http://www.adobe.com/products/flashmediaserver/compare/"&gt;сравнения редакций сервера&lt;/a&gt;. Для нашей задачи, вполне достаточно версии &lt;a href="http://www.adobe.com/products/flashmediastreaming/"&gt;Flash Media Streaming Server&lt;/a&gt;, ценой в пределах $1k (если не ошибаюсь, платить надо каждый год).&lt;br /&gt;Есть и такие мнения: &lt;a href="http://yzh44yzh.com/blog/fms"&gt;Не так уж и хорош Flash Media Server. Передача данных с FMS на веб-сервер.&lt;/a&gt;&lt;br /&gt;Опыта разработки крупномасштабных on-line систем у меня нет, поэтому делаю пока основанный только на воспринятой информации, чисто субъективный вывод - использовать FMS для записи звука - качественная стрельба по воробьям из ракетного комплекса.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.wowzamedia.com/index.html"&gt;Wowza&lt;/a&gt;: Относительно &lt;a href="http://riapriority.com/blogs/constantiner.php/2007/01/12/new_fms_alternative"&gt;свежий&lt;/a&gt;, годичной давности, сервер. &lt;a href="http://www.wowzamedia.com/pricing.html"&gt;Не бесплатный&lt;/a&gt;, но все же на много дешевле (&lt;a href="http://riapriority.com/blogs/constantiner.php/2007/03/31/wowza_media_server_pro"&gt;Wowza Media Server Pro...имеет более гуманную лицензионную модель&lt;/a&gt;) чем FMS медиа-сервер. Русскоязычной информации по серверу не так много, а &lt;a href="http://www.wowzamedia.com/quickstart.html#coding"&gt;документации, предоставленной на сайте&lt;/a&gt;, вполне достаточно.&lt;br /&gt;Полезная информация: &lt;a title="Permanent Link: RTMP транспорт для Flashphone.ru теперь обеспечивается Wowza Media Server" href="http://blog.flashphone.ru/index.php/2008/08/29/flashphone_wowza_zingaya/" rel="bookmark"&gt;RTMP транспорт для Flashphone.ru теперь обеспечивается Wowza Media Server&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://osflash.org/red5"&gt;RED5&lt;/a&gt;: Самый популярный опенсорсный медиа-сервис. Информации про него - море, хотя на сайтах проекта черт ногу сломит. Есть довольно кривая &lt;a href="http://www.electroteque.org/docbook/red5.pdf"&gt;документация в PDF&lt;/a&gt;.&lt;br /&gt;Начать можно, хотя бы вот - со статьи "&lt;a href="http://yarovoy.com/2007/06/27/getting_started_with_red5_server/"&gt;Начало разработки с Red5&lt;/a&gt;". Вот еще статейка, которая поможет нам начать: &lt;a href="http://www.flasher.ru/forum/showthread.php?t=103845"&gt;Изучаю Red5 с нуля =)&lt;/a&gt;. Тут же имеется &lt;a href="http://dl.fancycode.com/red5/api/index.html?overview-tree.html"&gt;ссылка на доки&lt;/a&gt;.&lt;br /&gt;Полезная информация: &lt;a href="http://ru.wikipedia.org/wiki/Red5"&gt;Red5 на Википедии&lt;/a&gt;, &lt;a href="http://www.ohloh.net/p?query=red5"&gt;RED5 на ohloh&lt;/a&gt;, &lt;a href="http://flash-communist.spb.ru/2008/07/07/red5-plugin-%d0%b4%d0%bb%d1%8f-eclipse-ide-beta-1/" rel="bookmark"&gt;Red5 Plugin для Eclipse IDE - beta 1&lt;/a&gt;, &lt;a href="http://www.red5-recorder.com/"&gt;red5-recorder&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Кстати, любопытный факт. &lt;a href="http://www.smartfoxserver.com/"&gt;SmartFox Server&lt;/a&gt; так же позволяет работать с потоковыми видео и аудио. Отвечает за это дело, некий модуль, именуемый &lt;a href="http://www.smartfoxserver.com/products/redBox.php"&gt;RedBOX&lt;/a&gt;, который базируется, как вы уже догадались, на &lt;a title="Red5 : Open Source Flash Server Open Source Flash" href="http://osflash.org/red5" target="_blank"&gt;Red5 project&lt;/a&gt;. Модуль этот, само собой, бесплатный, так что, при желании, можно организовать видео-аудио общение игроков в процессе онлайн-игры. И с &lt;a href="http://www.smartfoxserver.com/docs/"&gt;документацией&lt;/a&gt; тоже всё в порядке. Что тут говорить - молодцы, здорово подсуетились.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://haxevideo.org/"&gt;haXeVideo&lt;/a&gt;: Многопоточный сервер, осуществляющий управление FLV-видеопотоками. Это совсем свежий, конечно же бесплатный, сервер, полностью написанный на haXe, легкий, не требовательный к производительности сервера, и очень масштабируемый. Вот &lt;a title="Официальный релиз haxeVideo 1.0" href="http://flash-ripper.com/archives/002112.php"&gt;Официальный релиз haxeVideo 1.0&lt;/a&gt;. Собственно, никаких видимых сложностей для использования сервера нет - это можно наблюдать в небольшом туторе &lt;a title="'Permanent" href="http://flash-santer.com/?p=25" rel="bookmark"&gt;Пробуем haxeVideo&lt;/a&gt;. Как видно из примера, серверная часть не потребовала ни сложного конфигурирования, ни программирования. Однако, мы наблюдали появление FLV-видео, а вот как насчет, к примеру MP3? Поиски привели к какой-то почтовой переписке, но я так с ней и не разобрался. Вообще, информации пока мало, но это не значит, что сервер haXeVideo не является достойным решением.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://mammothserver.org/"&gt;Mammoth - The Open Source Flash Streaming Server&lt;/a&gt;.&lt;br /&gt;Собственно релиз от &lt;a href="http://flash-ripper.com/"&gt;Роста&lt;/a&gt; &lt;a title="Встречайте Open Source Flash Media Server — Mammoth" href="http://flash-ripper.com/archives/002586.php"&gt;Встречайте Open Source Flash Media Server — Mammoth &lt;/a&gt;раскрывает основные моменты. Кроме того, жаркая дискуссия в этом посте может здорово помочь в выборе медиа-серверов и раскрыть их сильные и слабые стороны.&lt;/p&gt;&lt;p&gt;А вот к примеру, интересно посмотреть, как реализуется простой PHP-streaming.&lt;br /&gt;Есть способ с исходниками, &lt;a href="http://www.flashcomguru.com/index.cfm/2005/11/2/Streaming-flv-video-via-PHP-take-two"&gt;'Streaming' flv video via PHP, take two&lt;/a&gt;. Правда он работает не на запись видео а на воспроизведение. Совсем старый... Но посмотрите, внизу есть пара апдейтов конца 2007-го. Попробуем качнуть. Действительно, здесь довольно замысловатый, но аккуратный PHP код и два fla (под FP7 и FP8) с проигрывателями всего этого безобразия.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://corp.kaltura.com/"&gt;Kaltura&lt;/a&gt;. Это целая опенсорсная видео-платформа (как нам рассказывает &lt;a href="http://osflash.org/kaltura"&gt;OSFlash&lt;/a&gt;). Она позволяет интегрировать в любой сайт множество интерактивных медийных наворотов с полной поддержкой онлайн-видео. Говорят, можно легко инсталлировать модули на такие веб-платформы как MediaWiki, WordPress, Drupal, Joomla и тд. И на ней сидят такие сайты как MySpace, YouTube, Flickr, ccMixter, Jamendo, и даже The New York Public Library.&lt;br /&gt;&lt;a href="http://corp.kaltura.com/"&gt;Сайт&lt;/a&gt; тоже очень качественный, что даже странно для опенсорсной платформы.&lt;br /&gt;Kaltura посвящен раздел &lt;a href="http://ru.wikipedia.org/wiki/Kaltura"&gt;Википедии на русском&lt;/a&gt;.&lt;br /&gt;&lt;strong&gt;KalturaServer &lt;/strong&gt;отвечает за управление контентом и правами, хранени, доставку, обработку, видео- и аудио- кодирование и прочее.&lt;br /&gt;&lt;strong&gt;Клиентская часть (Flex),&lt;/strong&gt; KalturaCVF, Kaltura Collaborative Video Framework, представляется тремя уровнями: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Core - ядро (управление видео, событиями, метаданными и т.д.).&lt;/li&gt;&lt;li&gt;KalturaPresentationLayer - уровень визуализации (набор библиотек управления стилями, скинами, связыванием данных и т.п.).&lt;/li&gt;&lt;li&gt;KalturaWidgets - богатый набор Flex-приложений, который, действительно впечатляет.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Интересно, на сколько всё это понятно и бесплатно. Короче, надо смотреть, тут море информации. В русскоязычном интернете я кроме новостей и анонсов ничего толком не нашел. Может быть не там искал?&lt;/p&gt;&lt;p&gt;На этом пока обзор закончу, но по мере появления информации, буду делать апдейты. Выводы делать еще рано, но в любом случае, какое-то решение будет принято.&lt;/p&gt;&lt;p&gt;* * *&lt;/p&gt;&lt;p&gt;Понемножку просматриваю ресурсы по медиа-серверам. Читая про Red5, выяснил, что писать звук с клиента в формате MP3 он не умеет, по причине того, что Flash player поддерживает только аудио-формат &lt;a href="http://ru.wikipedia.org/wiki/Nellymoser"&gt;NellyMoser&lt;/a&gt;, а сервер всего лишь снимает входящий поток. Утилит под Linux для транскодирования NellyMoser по-видимому нет.&lt;br /&gt;При таком раскладе, haxeVideo вполне равноценно Red5 в плане записи mp3.&lt;br /&gt;Однако, часто упоминается некий проект &lt;a href="http://www.ffmpeg/"&gt;ffmpeg&lt;/a&gt;, и как про него &lt;a href="http://ru.wikipedia.org/wiki/FFmpeg"&gt;говорят&lt;/a&gt;, он поддерживает FLV. Кроме того, есть упоминание о разработке потокового сервера ffserver. И &lt;a href="http://www.ffmpeg.org/projects.html"&gt;проекты&lt;/a&gt;, где использовался.&lt;/p&gt;&lt;p&gt;Еще информация по записи звука Red5: &lt;a href="http://denniehoopingarner.com/fms/"&gt;Flash Media Server and Red5 Resources&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;* * *&lt;/p&gt;&lt;p&gt;Добрался до конвертации flv -&gt; mp3. По этой теме есть следующие идеи: &lt;a href="http://www.red5tutorials.net/index.php/Red5Tutorials:FAQ#Converting_audio_FLV_file_to_MP3.3F"&gt;Converting audio FLV file to MP3?&lt;/a&gt;, где предлагается конвертировать NellyMoser в WAV, а затем уж в MP3, что не вызывает проблем. А решается это при помощи следующего инструмента: &lt;a href="http://www.thoughtcrime.org/software/nellynomore/"&gt;nellynomore&lt;/a&gt;. Работает ли это или нет - не могу сказать. Скоро узнаем.&lt;/p&gt;&lt;p&gt;* * *&lt;/p&gt;&lt;p&gt;Информация о установке RED5 на FreeBSD:&lt;br /&gt;&lt;a href="http://osflash.org/red5/suse"&gt;http://osflash.org/red5/suse&lt;/a&gt; (говорят, что вроде работает)&lt;br /&gt;&lt;a href="http://www.opennet.ru/openforum/vsluhforumID1/77112.html"&gt;http://www.opennet.ru/openforum/vsluhforumID1/77112.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://portsmon.freebsd.org/portoverview.py?category=www&amp;amp;portname=red5"&gt;http://portsmon.freebsd.org/portoverview.py?category=www&amp;amp;portname=red5&lt;/a&gt;&lt;/p&gt;&lt;p&gt;* * *&lt;/p&gt;&lt;p&gt;haxeVideo и FreeBSD:&lt;br /&gt;&lt;a href="http://haxe.ru/node/151#comments"&gt;http://haxe.ru/node/151#comments&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;* * *&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/p/rubyizumi/"&gt;rubyizumi&lt;/a&gt;&lt;br /&gt;RTMP Server(MP4/H.264) for Flash video/audio streaming written in Ruby&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-8679586037656278040?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/8679586037656278040/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=8679586037656278040' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/8679586037656278040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/8679586037656278040'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/01/blog-post.html' title='Сохраняем звук с микрофона на сервер'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-6957965990399331888</id><published>2009-01-18T12:05:00.012+03:00</published><updated>2009-01-19T10:08:12.590+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Actionscript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Обзоры'/><category scheme='http://www.blogger.com/atom/ns#' term='Bitmap'/><title type='text'>Как сохранить из Flash изображение II</title><content type='html'>&lt;p&gt;Продолжаем совершенствование технологий, и подбираем новый метод сохранения изображений на сервер.&lt;br /&gt;Последний раз мы это делали здесь: &lt;a href="http://racer242.blogspot.com/2007/11/flash-jpg.html"&gt;Как сохранить из Flash изображение в формате JPG&lt;/a&gt;. Посмотрим, насколько с той поры наука шагнула вперед. &lt;/p&gt;&lt;p&gt;Шуршим по гуглу и отвергаем посты, старше 2007-го года.&lt;/p&gt;&lt;p&gt;Итак, ссылок море, но все сводится к одному простому решению:&lt;br /&gt;&lt;a href="http://henryjones.us/articles/using-the-as3-jpeg-encoder"&gt;Using the AS3 Jpeg Encoder&lt;/a&gt; от &lt;a href="http://henryjones.us/"&gt;Henry Jones&lt;/a&gt;.&lt;br /&gt;Более коротко это описано здесь: &lt;a href="http://mattkenefick.com/blog/2008/11/saving-jpegs-with-flash/"&gt;Saving JPEGs with Flash&lt;/a&gt;,&lt;br /&gt;довольно развернуто здесь: &lt;a href="http://actionscript-blog.imaginationdev.com/5/save-jpg-jpeg-png-bmp-image-action-script-3/"&gt;Save JPG JPEG PNG BMP Image Action Script 3&lt;/a&gt;.&lt;br /&gt;Тут flash используется для конвертации и загрузки изображений на сервер: &lt;a href="http://labs.findsubstance.com/2008/04/03/as3-upload-encode-images/"&gt;Using AS3 to Upload and Encode Images&lt;/a&gt;.&lt;br /&gt;А вот здесь, даже разработали класс &lt;a href="http://blog.stroep.nl/2008/08/as3-imagesaver-class-v10/"&gt;AS3 ImageSaver Class v1.0&lt;/a&gt;, который сохраняет изображения на сервер. &lt;a href="http://projects.stroep.nl/imageSaver.zip"&gt;Можно пользоваться&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Смысл прост - снимается BitmapData с интересующего нас клипа, кодируется в JPEG/PNG, что дает ButeArray, который затем и отправляется на сервер.&lt;/p&gt;&lt;p&gt;Но почему, все они используют &lt;a href="http://code.google.com/p/as3corelib/" target="_blank"&gt;Adobe AS3 Corelib&lt;/a&gt; классы, а в частности &lt;em&gt;com.adobe.images.JPGEncoder&lt;/em&gt;? Ведь FlexSDK уже давно имеет &lt;em&gt;mx.graphics.codec.JPEGEncoder&lt;/em&gt; и &lt;em&gt;mx.graphics.codec.PNGEncoder. &lt;/em&gt;Попробуем разобраться.&lt;/p&gt;&lt;p&gt;Если с классами SDK всё понятно - все они в документации Flex SDK, то для исследования Corelib ознакомимся с документацией. Здесь множество других интересных классов, но в данный момент нас не интересующих. Возможно, какая-то часть этих классов была включена в SDK позже. Других объяснений я не нахожу.&lt;br /&gt;Другое подозрение: в этой статье &lt;a title="Permanent Link: New Flash 10 Class: SavingBitmap" href="http://www.bit-101.com/blog/?p=1415" rel="bookmark"&gt;New Flash 10 Class: SavingBitmap&lt;/a&gt; так же используются эти классы, и автор делает упор, что нужен Flash Player 10. Но вот небольшой обзор &lt;a href="http://gorbatov.blogspot.com/2007/06/imagesnapshot-flex-sdk-3.html"&gt;Класс ImageSnapshot (Flex SDK 3)&lt;/a&gt;, в котором никаких подобных требований не оглашается. В общем, разберемся в процессе разработки - благо, поменять кодеки можно в любой момент. (&lt;em&gt;Позже выясняется, спасибо BlooDHounD - что б я без него делал :), что CoreLib пользуют, "из-за отсутвия в нём флекса"&lt;/em&gt;).&lt;/p&gt;&lt;p&gt;Кстати, Еще одна статья "&lt;a title="Permanent Link to as3corelib Tutorial:How to Use JPEGEncoder and PNGEncoder Class in Flex" href="http://ntt.cc/2009/01/09/as3corelib-tutorialhow-to-use-jpegencoder-and-pngencoder-class-in-flex.html" rel="bookmark"&gt;as3corelib Tutorial:How to Use JPEGEncoder and PNGEncoder Class in Flex&lt;/a&gt;" с &lt;a href="http://ntt.cc/ext/as3corelib-Tutorial:How-to-Use-JPEGEncoder-and-PNGEncoder-Class-in-Flex/ImageEncoderDemoView.swf"&gt;демкой&lt;/a&gt; дает нам возможность сравнить кодирование при помощи кодеков Corelib и Adobe. &lt;/p&gt;&lt;p&gt;Хочется отметить, что процесс сохранения изображения заметно упростился и появилось много новых возможностей. И это радует.&lt;/p&gt;&lt;p&gt;Итак, берем за основу один из примеров, и пробуем. &lt;/p&gt;&lt;p&gt;* * *&lt;/p&gt;&lt;p&gt;Получить BitmapData и закодировать его нужным кодеком (от Flex SDK) - дело пяти минут. А вот сохранить изображение - это уже задача не простая.&lt;/p&gt;&lt;p&gt;Я начал с примера &lt;a href="http://labs.findsubstance.com/2008/04/03/as3-upload-encode-images/"&gt;Using AS3 to Upload and Encode Images&lt;/a&gt; и на 4-м пункте, столкнулся с неким классом, именуемым UploadPostHelper. Ссылка вывела на еще один пост о сохранении из flash изображений на сервер: &lt;a href="http://marstonstudio.com/2007/08/19/how-to-take-a-snapshot-of-a-flash-movie-and-automatically-upload-the-jpg-to-a-server-in-three-easy-steps/"&gt;how to impress your friends by taking an image snapshot of a flash movie and automatically uploading the jpg to a server in three easy steps&lt;/a&gt;. Оказалось, что это очень полезный класс, который позволяет заключить в один запрос, помимо данных с изображением, набор передаваемых через POST переменных в виде пар &lt;em&gt;Имя=Значение&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;В моем случае, такой необходимости нет, всё что мне нужно, я буду передавать через GET. Но на будущее, запомним UploadPostHelper - это очень полезный инструмент. В целях упрощения, я беру код, относящийся к сохранению из &lt;a href="http://actionscript-blog.imaginationdev.com/5/save-jpg-jpeg-png-bmp-image-action-script-3/"&gt;Save JPG JPEG PNG BMP Image Action Script 3&lt;/a&gt;. Он довольно избыточен, но рабочий (скачал и проверил на своем хосте), и основные моменты можно вполне позаимствовать.&lt;/p&gt;&lt;p&gt;* * *&lt;/p&gt;&lt;p&gt;Код работает отлично, проблем не возникало, за исключением PHP, который при ошибке возвращает не пару "имя/значение" а простую строку, что вызывало ошибку. Но это было при отладке, так что когда я заменил эту строку на пару типа "status=Error", всё встало на свое место.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-6957965990399331888?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/6957965990399331888/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=6957965990399331888' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/6957965990399331888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/6957965990399331888'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/01/flash-ii.html' title='Как сохранить из Flash изображение II'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-1175449090589812577</id><published>2009-01-09T01:51:00.013+03:00</published><updated>2009-01-11T00:29:31.100+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Actionscript 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Идеи'/><title type='text'>Что можно сделать с классом из подгружаемой SWF-библиотеки</title><content type='html'>А вот меня давно интересовал такой вопрос: можно ли подменить/модифицировать класс из подгруженного SWF, который был ассоциирован (или не был ассоциирован но определен по умолчанию) с клипом по средством "Export for ActionScript"?&lt;br /&gt;Если не ошибаюсь, в ActionScript 2 такая возможность была.&lt;br /&gt;&lt;br /&gt;Цель моей задачи такова: в некотором таймлайне подгружаемого SWF периодически появляется клип. При его появлении, с ним необходимо проделать какие-то действия.&lt;br /&gt;В обычных условиях, с этим клипом ассоциируется класс (лежащий по соседству с FLA), в конструкторе которого и производятся эти действия.&lt;br /&gt;Но вся прелесть-то в том, чтобы не было никаких скриптов ни в таймлайне, ни рядом с FLA. А всё что нужно делало бы загружающее этот SWF приложение - добавляло необходимый функционал подгруженному клипу.&lt;br /&gt;&lt;br /&gt;Перерыл хелп и гугл - безрезультатно... Может быть не там искал. В итоге, модифицировать класс внешней библиотеки во время исполнения (бестолковое свойство prototype не в счет), либо подменить его не получилось, и ничего подходящего найти не смог.&lt;br /&gt;&lt;br /&gt;Пока пойду обычным путем - класс клипа в конструкторе будет кидать событие с бабблингом: "&lt;a href="http://racer242.blogspot.com/2008/06/swf-as3.html"&gt;Как получать сообщения от внедряемых/подгружаемых SWF. AS3&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;&lt;br /&gt;Огромное спасибо BlooDHounD (см. комментарии). Его совет действительно работает.&lt;br /&gt;Опробовал два метода:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Класс, в подгружаемом SWF, задается в поле "&lt;em&gt;Class&lt;/em&gt;" диалога "Linkage properties" для нашего клипа:&lt;br /&gt;&lt;code&gt;classes.intrinsic.AssetCreationDispatcher&lt;/code&gt;&lt;br /&gt;При этом, никаких файлов классов поблизости с FLA создавать не требуется - класс создается "по умолчанию" (&lt;em&gt;intrinsic&lt;/em&gt; - я назвал пакет этим словом, т.к. представленный метод мне отдаленно напомнил одноименный механизм в ActionScript 2.0).&lt;br /&gt;Затем, в загружающем приложении, я определяю класс &lt;code&gt;classes.intrinsic.AssetCreationDispatcher&lt;/code&gt; но уже реальный, с необходимым кодом в AS-файле (в моем случае, это извещение приложения о создании клипа).&lt;br /&gt;Приложение загружает SWF, и при каждом появлении клипа в таймлайне ловит события от создающегося клипа, что показывает &lt;code&gt;trace(&lt;br /&gt;ObjectUtil.getClassInfo(event.target).name)&lt;/code&gt;:&lt;br /&gt;&lt;em&gt;classes.intrinsic::AssetCreationDispatcher&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Класс, в подгружаемом SWF, задается в поле "&lt;em&gt;Base class&lt;/em&gt;" диалога "Linkage properties" для нашего клипа:&lt;br /&gt;&lt;code&gt;classes.intrinsic.AssetCreationDispatcher&lt;/code&gt;&lt;br /&gt;Поле "&lt;em&gt;Class&lt;/em&gt;" содержит имя класса "TestClip1".&lt;br /&gt;Создаю также другой клип с именем класса "TestClip2", и тем же "&lt;em&gt;Base class&lt;/em&gt;".&lt;br /&gt;Приложение загружает SWF, и при каждом появлении вышеперечисленных клипов в таймлайне, в ловит события от создающегося клипа. Trace показывает уже:&lt;br /&gt;&lt;em&gt;TestClip1&lt;br /&gt;TestClip2&lt;/em&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Еще одна приятная возможность, которую дает нам такой прием:&lt;br /&gt;Мы можем определить в классе-заглушке клипа загружаемого SWF ряд пустых методов (можно сказать интерфейс), а в рабочем классе загружающего приложения - этот же набор методов со всем необходимым кодом. В таймлайне наших клипов мы можем вызывать эти методы в любом месте, где только захотим, и они будут отрабатываться нашим главным приложением в соответствии с его кодом.&lt;br /&gt;Конечно, для случая №1, все-таки нужно будет создать соответствующий AS-файл, иначе компилятор не пропустит вызовы неопределенных методов. Однако, для случая №2, создавать методы-заглушки даже не потребуется - компилятор пропускает такие вызовы. Ошибка времени исполнения будет генерироваться только в случае автономного выполнения загружаемого SWF. Но при выполнении его, будучи загруженным в приложение (которое, конечно, реализует весь набор методов), всё работает корректно.&lt;/p&gt;&lt;p&gt;Кроме того, важно, чтобы "совмещаемые" классы имели полностью эквивалентные имена, пакеты и цепочки вложенности пакетов. Иначе, они будут расцениваться как разные классы и не будут "совмещаться". И, конечно, загрузка производится в &lt;em&gt;ApplicationDomain.currentDomain&lt;/em&gt;.&lt;br /&gt;Еще одно важное замечание. Версия класса, которая включается в приложение, должна быть задействована каким-либо образом в коде приложения, иначе класс при компиляции не будет включен в приложение. Для этого, я сделал статический метод &lt;em&gt;register()&lt;/em&gt;, который вызываю при инициализации приложения. Этот метод может ничего не делать - важно, что при наличии его вызова, класс будет внедрен в приложение при компиляции.&lt;/p&gt;&lt;p&gt;Еще одна достопримечательность этого метода: различные приложения, загружающие подготовленные таким способом SWF, могут реализовывать заготовленные в нем интерфейсы по-своему.&lt;/p&gt;&lt;p&gt;Еще раз спасибо BlooDHounD :). Вот что интересно - ведь такой подход имеет место быть не случайно, иначе, наверняка бы было предусмотренно какое-нибудь исключение, сообщающее о конфликте имен классов. Скорее всего, эта возможность даже имеет какое-нибудь название. Объяснение работоспособности этого подхода объясняется в документации к &lt;em&gt;LoaderContext.applicationDomain&lt;/em&gt; (возможно объяснение есть где-то еще):&lt;br /&gt;"&lt;em&gt;&lt;strong&gt;Loader's own ApplicationDomain.&lt;/strong&gt;&lt;br /&gt;You use this application domain when using ApplicationDomain.currentDomain. When the load is complete, parent and child can use each other's classes directly. If the child attempts to define a class with the same name as a class already defined by the parent, the parent class is used and the child class is ignored.&lt;/em&gt;" Другими словами, если существует конфликт имен классов, класс из загружаемого контента игнорируется.&lt;/p&gt;&lt;p&gt;* * *&lt;/p&gt;&lt;p&gt;Любопытная бага (предвидел, что будет что-то неладное). Оказывается слово &lt;strong&gt;intrinsic&lt;/strong&gt; во Flex всё еще является ключевым (хотя в ActionScript 2.0 Migration про него написано, что его удалили) и выделяется жирным шрифтом. Любопытно, что автокомплит никак не хочет нормально работать с пакетами, обозванными этим именем, а в import-ах вообще начинает творится бардак. Лучше от него избавиться - может оно и к лучшему - тут подойдет что-нибудь типа &lt;em&gt;classes.templates&lt;/em&gt;.&lt;br /&gt;Кстати, порой приходится долго ломать голову над тем, как назвать тот или иной пакет/класс/метод/переменную. Иногда, размышляя над какой-нибудь сущностью (и вкапываясь в Lingvo), можно убить больше часа. Но оно стоит того.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-1175449090589812577?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/1175449090589812577/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=1175449090589812577' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/1175449090589812577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/1175449090589812577'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2009/01/swf.html' title='Что можно сделать с классом из подгружаемой SWF-библиотеки'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25528681162651304.post-3095064773481412421</id><published>2008-12-23T11:54:00.007+03:00</published><updated>2008-12-23T13:50:25.989+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SmartFoxServer'/><category scheme='http://www.blogger.com/atom/ns#' term='Грабли'/><title type='text'>Сокеты, политика безопасности и SmartFox</title><content type='html'>Наконец-то я вплотную столкнулся с вопросом безопасности.&lt;br /&gt;А собственно, когда настало время выложить многопользовательскую игру под SmartFox, я столкнулся со следующей проблемой: игра лежит на некотором доменном имени (&lt;em&gt;somegame.ru&lt;/em&gt;). Сокетное соединение к SmartFoxServer (&lt;em&gt;XX.XX.XX.XX:9339&lt;/em&gt;) просто не проходит:&lt;br /&gt;"&lt;em&gt;Ошибка: Запрос ресурса на xmlsocket://XX.XX.XX.XX:9339 источника запроса из h_ttp://somegame.ru.../Name.swf отклонен из-за отсутствия разрешений в файле политики.&lt;/em&gt;"&lt;br /&gt;"&lt;em&gt;*** Нарушение безопасности изолированной среды *** Подключение к XX.XX.XX.XX:9339 прервано – нет разрешения от h_ttp://somegame.ru.../Name.swf&lt;/em&gt;".&lt;br /&gt;Причем, при локальном запуске всё работает превосходно.&lt;br /&gt;&lt;br /&gt;Долго я рыл статьи, форумы по кроссдоменным проблемам, особенности политики безопасности сокетных соединений, нашел много полезного:&lt;br /&gt;&lt;a href="http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_14213"&gt;External data not accessible outside a Flash movie's domain&lt;/a&gt; - общепознавательная статейка.&lt;br /&gt;&lt;a href="http://groups.google.com/group/ruflex/browse_thread/thread/6ab72c19c403a23c"&gt;Про crossdomain.xml&lt;/a&gt; и как продолжение -&lt;br /&gt;&lt;a href="http://groups.google.com/group/ruFlash/browse_thread/thread/e8859e616c0908ef/c262429ea926d49f"&gt;Security policy. Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation.&lt;/a&gt; Поисследовал данные вопросы, ознакомился со статьей -&lt;br /&gt;&lt;a href="http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html"&gt;Setting up a socket policy file server&lt;/a&gt;.&lt;br /&gt;Затем не обнаружив ничего подходящего, поискал аналогичные вопросы на ресурсе SmartFox:&lt;br /&gt;&lt;a class="nav" href="http://www.smartfoxserver.com/forums/viewtopic.php?t=2233&amp;amp;start=0&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;highlight=&amp;amp;sid=902a9b1c7e26ade0f7c16587182f4b5d"&gt;bluebox problem&lt;/a&gt;, &lt;a class="nav" href="http://www.smartfoxserver.com/forums/viewtopic.php?t=2236&amp;amp;start=0&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;highlight="&gt;donot connect&lt;/a&gt; - имеют косвенное отношение к проблеме, но могут пригодиться.&lt;br /&gt;&lt;a href="http://www.smartfoxserver.com/docs/docPages/running/troubleshooting.htm"&gt;Troubleshooting common runtime problems&lt;/a&gt; дает общее представление о проблемах связи и наводит на главную статью по теме:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.smartfoxserver.com/whitepapers/fp_security/index.html"&gt;&lt;strong&gt;Flash Security Policy guidelines&lt;/strong&gt;&lt;/a&gt;.&lt;br /&gt;После поверхностного ознакомления со статьей, у меня сразу закралось подозрение - я проверил файл конфигурации &lt;strong&gt;config.xml&lt;/strong&gt; и в секции&lt;br /&gt;&lt;strong&gt;PolicyAllowedDomains&lt;/strong&gt; конечно же не обнаружил записи &lt;strong&gt;AllowedDomain&lt;/strong&gt;, соответствующей нужного мне домена. Админы, включили какие угодно домены, но только не тот который мне был нужен.&lt;br /&gt;Прописываем нужный домен, рестартуем сервер и мгновенно получаем соединение.&lt;br /&gt;Проблема, к счастью, является простейшей. Получаем урок: прежде чем отчаиваться и глубоко вкапываться в интернет и документацию, хорошо для начала просто еще раз проверить конфигурацию сервера.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25528681162651304-3095064773481412421?l=racer242.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://racer242.blogspot.com/feeds/3095064773481412421/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=25528681162651304&amp;postID=3095064773481412421' title='Комментарии: 16'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/3095064773481412421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25528681162651304/posts/default/3095064773481412421'/><link rel='alternate' type='text/html' href='http://racer242.blogspot.com/2008/12/smartfox.html' title='Сокеты, политика безопасности и SmartFox'/><author><name>Racer</name><uri>http://www.blogger.com/profile/13778770709453656580</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11358085348415876404'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>16</thr:total></entry></feed>