<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>В поисках успеха &#187; flex</title>
	<atom:link href="http://sheremetov.com/category/flex/feed/" rel="self" type="application/rss+xml" />
	<link>http://sheremetov.com</link>
	<description>Блог оптимистичного менеджера проектов</description>
	<lastBuildDate>Sun, 22 Aug 2010 06:53:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Использование FlexUnit для тестирования асинхронных вызовов</title>
		<link>http://sheremetov.com/flash/flexunit-async/</link>
		<comments>http://sheremetov.com/flash/flexunit-async/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 18:10:42 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[action script]]></category>
		<category><![CDATA[flexunit]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=514</guid>
		<description><![CDATA[Я немного писал уже о важности написания тестов, правда для php программистов, но написанное в равной степени касается любого программирования, если в разработку вовлечены более одного человека, релизы довольно часты и логика приложения не может быть протестирована вручную очень быстро. В  таком случае, мы рано или поздно захотим автоматизировать процесс, собственно об этом и пойдет [...]]]></description>
			<content:encoded><![CDATA[<p>Я немного писал уже о <a href="http://sheremetov.com/oop/test-driven-development/">важности написания тестов</a>, правда для php программистов, но написанное в равной степени касается любого программирования, если в разработку вовлечены более одного человека, релизы довольно часты и логика приложения не может быть протестирована вручную очень быстро. В  таком случае, мы рано или поздно захотим автоматизировать процесс, собственно об этом и пойдет речь. Тестировать приложения написанные на php мы научились, хотя конечно постиигать эту науку можно всю жизнь, но те задачи которые перед нами стояли мы с успехом решаем, благодаря UnitTest'ам, а вот с автоматизированным тестированием Flex/Flash, пока не складывалось. Появилось немного времени и было решено взглянуть на FlexUnit, и вот что из этого вышло.</p>
<p>Поскольку на flash/flex мы чаще всего делаем  интерфейсы, мне в первую очередь было интересно как тестировать асинхронные вызовы, элементы UI, и проч. Я написал небольшой класс, представляющий из себя сильно упрощенную версию конвеера <a href="http://potapenko.com">Жени Потапенко</a>. Вот код двух классов:</p>
<pre class="actionscript"><span style="color: #808080; font-style: italic;">// Task.as</span>
&nbsp;
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Task <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _func: <span style="color: #000000; font-weight: bold;">Function</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _time: <span style="color: #0066CC;">int</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _params: <span style="color: #0066CC;">Object</span>;		
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Task<span style="color: #66cc66;">&#40;</span>func: <span style="color: #000000; font-weight: bold;">Function</span>, <span style="color: #0066CC;">time</span>: <span style="color: #0066CC;">int</span>, params: <span style="color: #0066CC;">Object</span> = <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			_func = func;
			_time = <span style="color: #0066CC;">time</span>;
			_params = params;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> <span style="color: #0066CC;">caller</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">Object</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #0066CC;">caller</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> params<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">Object</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> _params;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> <span style="color: #0066CC;">time</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">int</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> _time;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> func<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #000000; font-weight: bold;">Function</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">return</span> _func;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<pre class="actionscript"><span style="color: #808080; font-style: italic;">// Conveyor.as</span>
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">TimerEvent</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">utils</span>.<span style="color: #006600;">Timer</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Conveyor <span style="color: #66cc66;">&#123;</span> 
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _queue: <span style="color: #0066CC;">Array</span>;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _timer: Timer;
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _paused: <span style="color: #0066CC;">Boolean</span> = <span style="color: #000000; font-weight: bold;">false</span>;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> Conveyor<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			_queue = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Array</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			_timer = <span style="color: #000000; font-weight: bold;">new</span> Timer<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
			_timer.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>TimerEvent.<span style="color: #006600;">TIMER</span>, onTaskFinished<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">add</span><span style="color: #66cc66;">&#40;</span>task:Task<span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			_queue.<span style="color: #0066CC;">push</span><span style="color: #66cc66;">&#40;</span>task<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>		
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">play</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			runCurrent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">stop</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			_timer.<span style="color: #0066CC;">stop</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> runCurrent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>_queue.<span style="color: #0066CC;">length</span> &gt; <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">var</span> task: Task = _queue.<span style="color: #006600;">shift</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">params</span> != <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
					task.<span style="color: #006600;">func</span><span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">params</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
					task.<span style="color: #006600;">func</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
				_timer.<span style="color: #006600;">delay</span> = task.<span style="color: #0066CC;">time</span>;
				_timer.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onTaskFinished<span style="color: #66cc66;">&#40;</span>event: TimerEvent<span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			runCurrent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>Первое с чего надо начать для тестирования этого кода это TestSuite и TestRunner, который будет его запускать:</p>
<pre class="actionscript"><span style="color: #808080; font-style: italic;">// ConveyorTestSuite.as</span>
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">tests</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #66cc66;">&#91;</span>Suite<span style="color: #66cc66;">&#93;</span>
           <span style="color: #66cc66;">&#91;</span>RunWith<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;org.flexunit.runners.Suite&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConveyorTestSuite <span style="color: #66cc66;">&#123;</span>		
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> conveyorTest: ConveyorTest;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> taskTest: TaskTest;
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ConveyorTestSuite<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>Runner.mxml</p>
<pre class="actionscript">&nbsp;
&lt; ?<span style="color: #0066CC;">xml</span> <span style="color: #0066CC;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?&gt;
&lt;mx :Application
    xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span>
    xmlns:flexunit=<span style="color: #ff0000;">&quot;flexunit.flexui.*&quot;</span>
    xmlns:flexUnitUIRunner=<span style="color: #ff0000;">&quot;http://www.adobe.com/2009/flexUnitUIRunner&quot;</span>
    creationComplete=<span style="color: #ff0000;">&quot;creationCompleteHandler(event)&quot;</span>
&gt;
&lt;/mx&gt;&lt;mx :Script&gt;
		&lt; !<span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>
			<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">tests</span>.<span style="color: #006600;">ConveyorTestSuite</span>;
			<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">events</span>.<span style="color: #006600;">FlexEvent</span>;
&nbsp;
			<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">flexunit</span>.<span style="color: #006600;">listeners</span>.<span style="color: #006600;">UIListener</span>;
			<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">flexunit</span>.<span style="color: #006600;">runner</span>.<span style="color: #006600;">FlexUnitCore</span>;
&nbsp;
			<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> flexUnitCore:FlexUnitCore;
&nbsp;
			protected <span style="color: #000000; font-weight: bold;">function</span> creationCompleteHandler<span style="color: #66cc66;">&#40;</span>event:FlexEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
 				flexUnitCore = <span style="color: #000000; font-weight: bold;">new</span> FlexUnitCore<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
 				flexUnitCore.<span style="color: #0066CC;">addListener</span><span style="color: #66cc66;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> UIListener<span style="color: #66cc66;">&#40;</span> testRunner <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
 				flexUnitCore.<span style="color: #006600;">run</span><span style="color: #66cc66;">&#40;</span> ConveyorTestSuite <span style="color: #66cc66;">&#41;</span>;
 			<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span>&gt;
	&lt;/mx&gt;
	&lt;flexunituirunner :TestRunnerBase id=<span style="color: #ff0000;">&quot;testRunner&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;100%&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;100%&quot;</span> /&gt;
&lt; /mx:Application&gt;
&nbsp;</pre>
<p>Обратите внимание на теги метаданных, которыми могут конфигурироваться классы TestSuite и TestCase. Вот полный список, поддерживаемых метатегов:</p>
<ul>
<li>[Suite] - указывает на класс Suite</li>
<li>[Test] - указывает на метод теста, заменяет префикс test для метода. Поддерживает аттрибуты expected, async, order, timeout, ui</li>
<li>[RunWith] - указывает на Runner с которым должен быть запущен TestSuite</li>
<li>[Ignore] - Вместо комментирования метода теста достаточно указать этот метатег</li>
<li>[Before] - заменяет setup() во FlexUnit и позволяет использовать несколько методов. Поддерживает аттрибуты: async, timeout, order, ui.</li>
<li>[After] - заменяет teardown(), поддерживает: async, timeout, order and ui аттрибуты.</li>
<li>[BeforeClass] - позволяет определить метод, вызываемый перед запуском класса теста, поддерживает аттрибут order</li>
<li>[AfterClass] - помечает метод выполняемый, после запуска всех тестов в классе, поддерживает аттрибут order</li>
</ul>
<p>Тест класса Task представляет из себя классический unit-test:</p>
<pre class="actionscript">&nbsp;
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">tests</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">Task</span>;
	<span style="color: #0066CC;">import</span> flexunit.<span style="color: #006600;">framework</span>.<span style="color: #006600;">TestCase</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TaskTest <span style="color: #0066CC;">extends</span> TestCase <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> TaskTest<span style="color: #66cc66;">&#40;</span>methodName:<span style="color: #0066CC;">String</span>=<span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span>methodName<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> testNew<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">var</span> param:<span style="color: #0066CC;">Object</span> = <span style="color: #66cc66;">&#123;</span>test:<span style="color: #ff0000;">&quot;passed&quot;</span><span style="color: #66cc66;">&#125;</span>;
			<span style="color: #000000; font-weight: bold;">var</span> func:<span style="color: #000000; font-weight: bold;">Function</span> = testNew;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> task: Task = <span style="color: #000000; font-weight: bold;">new</span> Task<span style="color: #66cc66;">&#40;</span>func, <span style="color: #cc66cc;">100</span>, param<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			assertTrue<span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">func</span> == func<span style="color: #66cc66;">&#41;</span>;
			assertEquals<span style="color: #66cc66;">&#40;</span>task.<span style="color: #0066CC;">time</span>, <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span>;
			assertEquals<span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">params</span>, param<span style="color: #66cc66;">&#41;</span>;			
&nbsp;
			task = <span style="color: #000000; font-weight: bold;">new</span> Task<span style="color: #66cc66;">&#40;</span>func, <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span>;
			assertNull<span style="color: #66cc66;">&#40;</span>task.<span style="color: #006600;">params</span><span style="color: #66cc66;">&#41;</span>;
			assertEquals<span style="color: #66cc66;">&#40;</span>task.<span style="color: #0066CC;">caller</span>, <span style="color: #0066CC;">this</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>А вот класс для тестирования асинхронных вызовов выглядит интереснее:</p>
<pre class="actionscript">&nbsp;
package com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">tests</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">Conveyor</span>;
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">sheremetov</span>.<span style="color: #006600;">manager</span>.<span style="color: #006600;">Task</span>;
&nbsp;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">Event</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">TimerEvent</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">utils</span>.<span style="color: #006600;">Timer</span>;
&nbsp;
	<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">flexunit</span>.<span style="color: #006600;">asserts</span>.<span style="color: #006600;">assertEquals</span>;
	<span style="color: #0066CC;">import</span> org.<span style="color: #006600;">flexunit</span>.<span style="color: #006600;">async</span>.<span style="color: #006600;">Async</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConveyorTest <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> conveyor: Conveyor;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> counter: <span style="color: #0066CC;">int</span>;		
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ConveyorTest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#91;</span>Before<span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> runBeforeEveryTest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
		    conveyor = <span style="color: #000000; font-weight: bold;">new</span> Conveyor<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		    counter = <span style="color: #cc66cc;">0</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#91;</span>After<span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> runAfterEveryTest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			conveyor = <span style="color: #000000; font-weight: bold;">null</span>;
		<span style="color: #66cc66;">&#125;</span>       
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> dummy<span style="color: #66cc66;">&#40;</span>param: <span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			counter++;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #66cc66;">&#91;</span>Test<span style="color: #66cc66;">&#40;</span>async,timeout=<span style="color: #ff0000;">&quot;250&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> testPlay<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			assertEquals<span style="color: #66cc66;">&#40;</span>counter, <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;
			conveyor.<span style="color: #0066CC;">add</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Task<span style="color: #66cc66;">&#40;</span>dummy, <span style="color: #cc66cc;">100</span>, <span style="color: #ff0000;">&quot;one&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> timer1: Timer = <span style="color: #000000; font-weight: bold;">new</span> Timer<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
			timer1.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>TimerEvent.<span style="color: #006600;">TIMER</span>, Async.<span style="color: #006600;">asyncHandler</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">this</span>, onAfterFirst, <span style="color: #cc66cc;">120</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
			timer1.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			conveyor.<span style="color: #0066CC;">add</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Task<span style="color: #66cc66;">&#40;</span>dummy, <span style="color: #cc66cc;">100</span>, <span style="color: #ff0000;">&quot;two&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;										
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> timer2: Timer = <span style="color: #000000; font-weight: bold;">new</span> Timer<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">150</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
			timer2.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>TimerEvent.<span style="color: #006600;">TIMER</span>, Async.<span style="color: #006600;">asyncHandler</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">this</span>, onAfterSecond, <span style="color: #cc66cc;">220</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
			timer2.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			conveyor.<span style="color: #0066CC;">play</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onAfterSecond<span style="color: #66cc66;">&#40;</span>event: Event, params: <span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			assertEquals<span style="color: #66cc66;">&#40;</span>counter, <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<span style="color: #66cc66;">&#125;</span>			
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onAfterFirst<span style="color: #66cc66;">&#40;</span>event: Event, params: <span style="color: #0066CC;">Object</span><span style="color: #66cc66;">&#41;</span>: <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			assertEquals<span style="color: #66cc66;">&#40;</span>counter, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>В этом классе вызовы типа Async.asyncHandler( this, onAfterFirst, 120) возвращают callback, этот вызов в случае если вызов не произойдет в течении 120 миллисекунд, сработает таймаут, и тест будет считаться проваленным.<br />
Надеюсь код достаточно красноречив и понятен. А для тех кто захочет глубже разобраться с фреймворком, я рекомендую прочитать очень хорошую <a href="http://www.insideria.com/2009/05/flashbuilder4-will-support-fle.html">статью о использовании FlexUnit</a>, неисчерпаемым источником информации являются 220 мегабайт кода репозитория проекта, вы легко можете экспотрировать его скачав <a href="http://subversion.tigris.org/files/documents/15/39559/svn-1.4.5-setup.exe">svn</a>, и сделав:</p>
<pre>
svn checkout http://opensource.adobe.com/svn/opensource/flexunit [путь-куда-вы-хотите-экспортировать]
</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/flash/flexunit-async/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Анализируем отчет о килобайтах во флекс приложении</title>
		<link>http://sheremetov.com/flex/size-report-analyse/</link>
		<comments>http://sheremetov.com/flex/size-report-analyse/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 18:12:54 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=430</guid>
		<description><![CDATA[Бывает надо разобраться куда&#160;же уходят сотни килобайт и&#160;без того огромного флекс приложения. Классический способ,&#160;&#8212; сгенерировать репорт добавив ключ компиляции типа &#171;-link-report=report.xml&#187; в&#160;&#171;Menu&#160;&#8212; Project&#160;&#8212; Properties&#160;&#8212; Flex Compiler&#160;&#8212; Additional compiler arguments&#187;. После компиляции имеем огромный XML&#160;вида:
&#160;
&#60;report&#62;
  &#60;scripts&#62;
    &#60;script name=&#34;...\framework.swc(mx/core/EventPriority)&#34; mod=&#34;1201055703673&#34; size=&#34;755&#34; optimizedsize=&#34;400&#34;&#62;
      &#60;def id=&#34;mx.core:EventPriority&#34; /&#62;
&#60;pre id=&#34;Object&#34; /&#62;
  [...]]]></description>
			<content:encoded><![CDATA[<p>Бывает надо разобраться куда&nbsp;же уходят сотни килобайт и&nbsp;без того огромного флекс приложения. Классический способ,&nbsp;&mdash; сгенерировать репорт добавив ключ компиляции типа &laquo;-link-report=report.xml&raquo; в&nbsp;&laquo;Menu&nbsp;&mdash; Project&nbsp;&mdash; Properties&nbsp;&mdash; Flex Compiler&nbsp;&mdash; Additional compiler arguments&raquo;. После компиляции имеем огромный XML&nbsp;вида:</p>
<pre class="xml">&nbsp;
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;report<span style="font-weight: bold; color: black;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;scripts<span style="font-weight: bold; color: black;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;script</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;...\framework.swc(mx/core/EventPriority)&quot;</span> <span style="color: #000066;">mod</span>=<span style="color: #ff0000;">&quot;1201055703673&quot;</span> <span style="color: #000066;">size</span>=<span style="color: #ff0000;">&quot;755&quot;</span> <span style="color: #000066;">optimizedsize</span>=<span style="color: #ff0000;">&quot;400&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;def</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;mx.core:EventPriority&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;pre</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;Object&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;mx.core:mx_internal&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;AS3&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/script<span style="font-weight: bold; color: black;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;script</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;_plainStyle.as&quot;</span> <span style="color: #000066;">mod</span>=<span style="color: #ff0000;">&quot;9223372036854775807&quot;</span> <span style="color: #000066;">size</span>=<span style="color: #ff0000;">&quot;798&quot;</span> <span style="color: #000066;">optimizedsize</span>=<span style="color: #ff0000;">&quot;640&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;def</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;_plainStyle&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;pre</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;Object&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;mx.core:IFlexModuleFactory&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;mx.styles:StyleManager&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;AS3&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
      <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dep</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;mx.styles:CSSStyleDeclaration&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/script<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/scripts<span style="font-weight: bold; color: black;">&gt;</span></span></span><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/report<span style="font-weight: bold; color: black;">&gt;</span></span></span></pre>
<p>Анализировать его не очень то и просто. Гугл подсказал несколько вариантов разбора этого XML:</p>
<ol>
<li><a href="http://blog.iconara.net/2007/02/25/visualizing-mxmlcs-link-report/">При помощи XSLT</a></li>
<li>С помощью <a href="http://joeberkovitz.com/blog/2007/04/08/secret-life-of-swfs/">небольшого приложения</a></li>
</ol>
<p>Я предлагаю альтернативный и&nbsp;наглядный способ анализа, при помощи excel:</p>
<ul>
<li>Первое что надо сделать,&nbsp;&mdash; это добавить первой строкой &laquo;< ?xml version="1.0" encoding="UTF-8" ?>&raquo;</li>
<li>Открываем XML</li>
<li>Выбираем в&nbsp;диалоге &laquo;As&nbsp;an&nbsp;XML&nbsp;table&raquo;. Имеем все данные в&nbsp;таблице.</li>
<li>Имело&nbsp;бы смысл сгруппировать модули и&nbsp;посмотреть суммарный размер каждого.</li>
<li>Выделяем интересующие нас данные.</li>
<li>Нажимаем Insert&nbsp;&mdash; Pivot Table (сводная тадлица).</li>
<li>В&nbsp;появившемся окне кликаем чекбокс возле name и&nbsp;перетяиваем optimizedsize в&nbsp;Values. В&nbsp;Value Field Settings меняем функцию с&nbsp;Count (сейчас показывает количество группировок для каждого модуля) на&nbsp;Sum</li>
<li>Сортируем по&nbsp;убыванию размера модулей.</li>
</ul>
<p>Должно получится что-то типа такого:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/01/screen.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/01/screen.gif" alt="screen" title="screen" width="800" height="516" class="alignnone size-full wp-image-431" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/flex/size-report-analyse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Дайджест ссылок №6</title>
		<link>http://sheremetov.com/links/6/</link>
		<comments>http://sheremetov.com/links/6/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 07:05:53 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[ссылки]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=227</guid>
		<description><![CDATA[
flex приложение, наглядно показывающее разницу в скорости выполнения типовых конструкций as3, с исходниками. Очень удобно и доходчиво.
puremvc.tv, хороший ресурс для тех кто «стартует» с фреймворком puremvc. Напомню, что основное применение этот фреймворк нашел в flash/flex разработке, но также с успехом применяется и с java, .net, php, ruby, python.
Ёмкий обзор флешовых движков для создания панорам на вашем сайте от Racer, гуру флеш разработки.
Trevor McCauley делится отличным lifehack'ом: [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://businessintelligence.me/projects/performance_tester/performanceTester.html">flex приложение</a>, наглядно показывающее разницу в скорости выполнения типовых конструкций <abbr title="Action Script 3">as3</abbr>, с исходниками. Очень удобно и доходчиво.</li>
<li><a href="http://puremvc.tv/">puremvc.tv</a>, хороший ресурс для тех кто «стартует» с фреймворком <a>puremvc</a>. Напомню, что основное применение этот фреймворк нашел в flash/flex разработке, но также с успехом применяется и с java, .net, php, ruby, python.</li>
<li><a href="http://racer242.blogspot.com/2009/06/flash.html">Ёмкий обзор флешовых движков для создания панорам</a> на вашем сайте от <a href="http://www.blogger.com/profile/13778770709453656580">Racer</a>, гуру флеш разработки.</li>
<li><a href="http://www.senocular.com/">Trevor McCauley</a> делится отличным <a href="http://www.senocular.com/?id=2.75">lifehack'ом</a>: если у вас установлена debug версия flash player, вы частенько можете наблюдать нежелательное окно отладки, в случае возникновения исключений (exceptions), во flash приложении. Подавить назойливое окно можно добавлением в <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=logging_04.html">mm.cfg</a> строки: «SuppressDebuggerExceptionDialogs=1».</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/links/6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Дайджест ссылок №2</title>
		<link>http://sheremetov.com/links/2/</link>
		<comments>http://sheremetov.com/links/2/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 06:20:29 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[ссылки]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[catalyst]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[potapenko]]></category>
		<category><![CDATA[Асхат Уразбаев]]></category>
		<category><![CDATA[Джеэль Спольски]]></category>
		<category><![CDATA[Женя Потапенко]]></category>
		<category><![CDATA[мотивация]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=76</guid>
		<description><![CDATA[Менеджерское:

Перевод отличной статьи Джеэля Спольски (Joel Spolsky) о&#160;недостатках &#171;мотивирования рублём&#187;.
Еще одна статья о&#160;денежной мотивации. Эта статья во&#160;многом пересекается с&#160;предыдущей, в&#160;ней Асхат Уразбаев раскрывает &#171;подводные камни&#187; бонусного пощрения разработчиков и&#160;дает полезные советы.

Технологическое:

Flash Builder 4&#160;&#8212; долгожданный релиз нового Flex Builder&#8217;a,&#160;сменившего свое название.
Flash Catalyst&#160;&#8212; еще один долгожданный релиз. Этот продукт должен стать промежуточным между flash и&#160;flex. Основная задача&#160;&#8212; [...]]]></description>
			<content:encoded><![CDATA[<h3>Менеджерское:</h3>
<ul>
<li><a href="http://www.it4business.ru/lib/1869/">Перевод отличной статьи</a> Джеэля Спольски (Joel Spolsky) о&nbsp;недостатках &laquo;мотивирования рублём&raquo;.</li>
<li>Еще одна <a href="http://agilerussia.ru/files/articles/Urazbaev.MoneyMotivation.pdf">статья о&nbsp;денежной мотивации</a>. Эта статья во&nbsp;многом пересекается с&nbsp;предыдущей, в&nbsp;ней Асхат Уразбаев раскрывает &laquo;подводные камни&raquo; бонусного пощрения разработчиков и&nbsp;дает полезные советы.</li>
</ul>
<h3>Технологическое:</h3>
<ul>
<li><a href="http://labs.adobe.com/technologies/flashbuilder4/">Flash Builder 4</a>&nbsp;&#8212; долгожданный релиз нового Flex Builder&#146;a,&nbsp;сменившего свое название.</li>
<li><a href="http://labs.adobe.com/technologies/flashcatalyst/">Flash Catalyst</a>&nbsp;&#8212; еще один долгожданный релиз. Этот продукт должен стать промежуточным между flash и&nbsp;flex. Основная задача&nbsp;&#8212; простая, визуальная среда для построения <acronym title="rich internet application">RIA</acronym> <acronym title="graphical user interface">GUI</acronym>. Лично для меня его основная ценность в&nbsp;быстром прототипировании, хотя, думаю найдется еще немало применений. </li>
<li>И последняя по порядку, но не по значимости, новость от <a href="http://potapenko.com/">Жени Потапенко</a>, одного из&nbsp;&laquo;отцов&raquo; среди русскоговорящих флеш разработчиков. Женя поделился с&nbsp;нами информацией о&nbsp;том что сейчас занимается разработкой новой IDE для разработки на&nbsp;<acronym title="Action Script 3">AS3</acronym>. <a href="http://potapenko.com/tmp/mps_as.m4v">Скринкаст</a> можно посмотреть уже сейчас. Первый релиз будет к&nbsp;началу августа, так что посмотрим, кто зарелизится раньше <a href="http://potapenko.com/">Женя</a> или <a href="http://adobe.om">Adobe</a>. Известно что IDE будет распространяться бесплатно и&nbsp;доступно для платформ Windows, Linux, Mac.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/links/2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
