<?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>Farata Systems &#187; Anatole Tartakovsky</title>
	<atom:link href="http://flexblog.faratasystems.com/author/anatole-tartakovsky/feed" rel="self" type="application/rss+xml" />
	<link>http://flexblog.faratasystems.com</link>
	<description>A blog about our experience with Adobe Flex</description>
	<lastBuildDate>Tue, 31 Aug 2010 01:46:01 +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>What is the best way to integrate with native Android interface</title>
		<link>http://flexblog.faratasystems.com/2010/08/16/what-is-the-best-way-to-integrate-with-native-android-interface</link>
		<comments>http://flexblog.faratasystems.com/2010/08/16/what-is-the-best-way-to-integrate-with-native-android-interface#comments</comments>
		<pubDate>Mon, 16 Aug 2010 04:23:01 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=897</guid>
		<description><![CDATA[As the time passes by without commercial release of AIR for Android, the case to integrate all devices (phone, tablets, laptops and servers) directly becomes more important for enterprise and consumer markets. That is currently done by managing services in the cloud but that architecture has obvious implications with performance, bandwidth, cost and security. Much [...]]]></description>
			<content:encoded><![CDATA[<p>As the time passes by without commercial release of AIR for Android, the case to integrate all devices (phone, tablets, laptops and servers) directly becomes more important for enterprise and consumer markets. That is currently done by managing services in the cloud but that architecture has obvious implications with performance, bandwidth, cost and security. Much simpler solution would be to implement p2p communications, but it has some uncommon obstacles:<br />
1. Implementing direct socket bridge based on BlazeDS or Merapi on Android is tough as it misses most of java.bean.* package related to introspection thus making port very tough &#8211; unless you migrate additional 500KB of JDK code or limit the scope of exchange objects.<br />
2. Placing proxy server embedded in AIR application would definitely solve the problem by translating AMF in Java ObjectStream or similar lightweight technology but it would require your desktop to run either tomcat or merapi like solution.<br />
3. Implementing code generator to handle each request signature translating from AMF request into specialized reader/writer. For most cases it would be quite simple as most request will have standard intent/dataUR/extras request coming in and well structured responses coming out</p>
<p>WIth commercial release of Android the need for socket server might go away as long as AIR provides extended URLRequest object to send all information needed for Android interprocess communications as well as mode for execution of such requests. Would be much simpler task to implement on AIR level of course then building full blown bridge and class loader.</p>
<p>Sincerely<br />
Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2010/08/16/what-is-the-best-way-to-integrate-with-native-android-interface/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Time for Open Source Java Alliance</title>
		<link>http://flexblog.faratasystems.com/2010/08/13/time-for-open-source-java-alliance</link>
		<comments>http://flexblog.faratasystems.com/2010/08/13/time-for-open-source-java-alliance#comments</comments>
		<pubDate>Fri, 13 Aug 2010 20:28:05 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=893</guid>
		<description><![CDATA[Oracle managers are clearly out of their minds. Rather then embrace huge potential Android brings to Java market thanks to Google they are trying to kill it again &#8211; the same way they killed it on Microsoft and Apple platform &#8211; by inserting themselves as &#8220;guides&#8221; on innovation. Turning Java from legacy to red-hot environment [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle managers are clearly out of their minds. Rather then embrace huge potential Android brings to Java market thanks to Google they are trying to kill it again &#8211; the same way they killed it on Microsoft and Apple platform &#8211; by inserting themselves as &#8220;guides&#8221; on innovation. Turning Java from legacy to red-hot environment again was not an easy task. </p>
<p>After 4 month of Android development I have to complement Google on cleverness and quality of their work. There is more innovation in the way applications, security, and new technologies (voice, messaging, small factor UI) become practical than I have seen in all other technologies combined including iPhone (used it for 3 years), Linux on mobile (have 3 different devices), Java ME, etc. </p>
<p>The patents Google allegedly infringed on are laughable from technology perspective as they are not anywhere close to the core technologies. In short term I believe they can be easily bypassed (with actual benefit to the platform!) by minor changes to the VM and transforming engine that repackages Java byte code to the appropriate ARM level, or handle repackaging on the device itself. That would easily solve formal infringement issues but I do not know if it would matter for legal system.      </p>
<p>There are few outcomes none of which seems to be good &#8211; licensing or forcing Oracles approval on the changes. Second option is even worse as in my mind Oracle stopped being technology company over decade ago. At this time it is holding company that buys and &#8220;milks&#8221; legacy products &#8211; with appropriate mind set and people.</p>
<p>One thing is clear &#8211; there is a need to create Java Open Source Alliance to replace Oracle dependency. It has to examine all Oracle patents and steer away in VM implementation that is based on patents that can be challenged by Oracle. That is the only way to keep momentum Android built in Java space and provide Oracle with expiration notice on their stronghold on Java technology. I would also strong backlash from Java community back at Oracle &#8211; I would really doubt any Java professional facing Oracle&#8217;s strategy that diminishes ones ability to make living would recommend or support their products. </p>
<p>Sincerely<br />
Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2010/08/13/time-for-open-source-java-alliance/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Few notes on iPhone replacement</title>
		<link>http://flexblog.faratasystems.com/2010/06/01/few-notes-on-iphone-replacement</link>
		<comments>http://flexblog.faratasystems.com/2010/06/01/few-notes-on-iphone-replacement#comments</comments>
		<pubDate>Wed, 02 Jun 2010 01:29:07 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=839</guid>
		<description><![CDATA[As many Flex developers waiting for release of Flex on iPhone for over a year, last 2 months were Denial, Anger, Bargaining, Depression and finally Acceptance. The acceptance came in the form of the Android phone and new battlefields/pastures.
Apple and Google are in open war right now &#8211; over tv/media, virtual assistants, navigation and ads. [...]]]></description>
			<content:encoded><![CDATA[<p>As many Flex developers waiting for release of Flex on iPhone for over a year, last 2 months were Denial, Anger, Bargaining, Depression and finally Acceptance. The acceptance came in the form of the Android phone and new battlefields/pastures.</p>
<p>Apple and Google are in open war right now &#8211; over tv/media, virtual assistants, navigation and ads. Lately it became obvious that workspace and social networking are also becoming part of the battle &#8211; and that is the fields we specialize, so we need to adopt. </p>
<p>I picked up Nexus One recently to do some research work. N1 is a bit better as research device then particular carriers ones as you can share the same providers card with your iPhone (no extra contract). I am quite used of swapping AT&#038;T cards from iPhone with other phones (50$ Samsung phone +iPhone account = better phone + bluetooth/usb network hotspot, etc). It also has no provider&#8217;s protection so updating software and rooting is a bit simpler. </p>
<p>Let&#8217;s make sure you have been warned: N1 is not a replacement for iPhone for consumer or either status seekers/heavy phone users. It has some significant pluses &#8211; better Navigation, voice integration and web experience are superb. Hardware spec beats 3GS easily, but the actual hardware quality is sub par:<br />
- quality of the phone subsystem (signal reception, sound quality, integration with provider) is much lower<br />
- quality of the screen is bad ( easily greased, bad touchscreen recognition, predictable typing is not working as expected)<br />
- touchscreen and buttons do not always respond as expeced.</p>
<p>Once you accept that Google phone is development device and not your primary phone, you can appreciate really great features it provides for software enthusiasts:<br />
- open development environment including AIR with reasonable debugging and diagnostics<br />
- top of the line hardware stack including fast CPU<br />
- standard open OS</p>
<p>The last few weeks spent with physical device were a lot of fun. The development cycle is much faster then with iPhone and the applications perform MUCH better. There are quite few adjustments you need to make to your development in order to deploy application on the phone, but I will talk about it in the next post. For now, grab your Android phone and experience new platform for yourself.</p>
<p>Sincerely,<br />
Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2010/06/01/few-notes-on-iphone-replacement/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Missing AMF requests/responses</title>
		<link>http://flexblog.faratasystems.com/2010/05/15/missing-amf-requestsresponses</link>
		<comments>http://flexblog.faratasystems.com/2010/05/15/missing-amf-requestsresponses#comments</comments>
		<pubDate>Sat, 15 May 2010 17:03:38 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=801</guid>
		<description><![CDATA[Every month we get calls from new Flex clients with exactly the same question: can we help to fix strange networking problems. The application they fully tested exhibits very strange problems for some users once released in the wild. Here is a brief list of the problems they have seen:
1. Missing packages coming from client [...]]]></description>
			<content:encoded><![CDATA[<p>Every month we get calls from new Flex clients with exactly the same question: can we help to fix strange networking problems. The application they fully tested exhibits very strange problems for some users once released in the wild. Here is a brief list of the problems they have seen:<br />
1. Missing packages coming from client going to the serer (majority of the problem cases)<br />
2. Missing responses ( coming from server to client)<br />
3. Out of sequence execution of the server calls<br />
4. Duplicate requests to the server<br />
Interesting enough, the popular belief is that TCP/IP protocol takes care of all these problems and it is not responsibility of the developers to deal with these issues.</p>
<p>Unfortunately, living with the problems above is a typical WAN way of life, and TCP/IP protocol provides reliability on LANs only. To make the matters worse, applications are tested on LANs and extremely reliable &#8220;local WANs&#8221;. As a result, they are not tested at all for this type of the issues. And with thousands of small AMF requests per session even fraction of percent of lost packages affects the reliability of application.     </p>
<p>Once application is in this state, typical response from development teams is to add application error handling and do more testing. Unfortunately, this testing is also done on LAN, and reliable WANS. Plus due to the non-deterministic nature of the lost packages conventional testing does not help much.</p>
<p>The advice I usually give to our clients is to fix the problem on communication protocol level (in a layer between the  Flex Framework and Application) rather then in the application code. Usually it involves creation &#8220;ReliableAMFChannel&#8221; ActionScript class on the client side and customized Java Endpoint on the server side. These classes are primarily responsible for the following:<br />
1. Keeping copies of the original requests(client) and responses (server) till they are confirmed or answered by the other side.<br />
2. Managing resending of unconfirmed requests/responses after certain timeout.<br />
3. Filtering out duplicate/already executed requests/responses<br />
4. Fixing the order of requests/responses to prevent execution &#8220;out of order&#8221;</p>
<p>Usually it is implemented as 5-10 days project to integrate reference implementation code with the client codebase, provide resynchronization logic (login/reconnect) and timeouts&#8217; optimization. I usually recommend to move long running requests to messaging as a part of the same effort as those have a long list of their own related issues, which I&#8217;ll cover in the next post.</p>
<p>If you are new to Flex, consider taking this <a href="http://www.eventbrite.com/event/690230498">5-day live online training course</a>.</p>
<p>Sincerely,<br />
Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2010/05/15/missing-amf-requestsresponses/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oops, Apple did it again</title>
		<link>http://flexblog.faratasystems.com/2010/04/11/oops-apple-did-it-again</link>
		<comments>http://flexblog.faratasystems.com/2010/04/11/oops-apple-did-it-again#comments</comments>
		<pubDate>Sun, 11 Apr 2010 15:03:23 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Apple]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=767</guid>
		<description><![CDATA[Here it goes &#8211; Apple officially locked itself out from majority of development community again. While people are trying to find justification for such move ( http://www.taoeffect.com/blog/2010/04/steve-jobs-response-on-section-3-3-1/ ) and while it came as a shock to some Adobe developers ( http://theflashblog.com/?p=1888 ) I actually have deja vu of 1991 / NeXT Computer fiasco. NeXT was [...]]]></description>
			<content:encoded><![CDATA[<p>Here it goes &#8211; Apple officially locked itself out from majority of development community again. While people are trying to find justification for such move ( http://www.taoeffect.com/blog/2010/04/steve-jobs-response-on-section-3-3-1/ ) and while it came as a shock to some Adobe developers ( http://theflashblog.com/?p=1888 ) I actually have deja vu of 1991 / NeXT Computer fiasco. NeXT was the best PC of 1991. First browsers/servers were developed on NeXT platform. I took time to learn Objective-C and developed for that platform. But proprietary language and hardware lock drove the company in the ground.  The truth being told, people make the same mistakes again and again, and Steve Jobs is no different. So the only question remains &#8211; will it will be fixed soon enough via Adobe/Apple negotiations and public outrage or Apple will win this battle and loose the war to Google, RIM and Microsoft. </p>
<p>Technically Apple&#8217;s terms and reasonings are absurd. The quality of the code is not related to the language. Specialized p-code languages sometimes outperform native ones by highly optimizing (even writing in assembly for specific CPUs) critical parts. In case of Flash/AIR a lot was done to support GPU that would take ages for regular C++ developers to even approach. P-code toolkit can include generation of C/C++ code &#8211; however it would be just a waste of developers time to do so.</p>
<p>I have been using Apple products exclusively for the last 3 years and I really enjoyed ability not to deal Windows problems during the development process and still reliably deploy (thanks to Adobe) on 100% of PCs regardless of OS. Performance was never an issue for our apps, and we had steady job helping others to achieve good/excellent performance.</p>
<p>Apple has 3 month to fix this mistake. After that developers will make choice &#8211; Adobe or Apple. It will mean significant boost for Google, RIM and Microsoft &#8211; and end of Apple growth. At that time, if not resolved, I will be selling my Apple stock. Reasons are simple : in the last 3 years I personally spent about $15K on Apple products, planning to spend at least the same amount over the next 3 years. I was planning to replace my development machine Mac Pro dual Xeon/20GB/10TB for faster one by the end of the summer &#8211; looks like it will be Linux server as without platform neutrality it will be easier to at least have development and deployment platforms the same. With developers fallout getting tools and new software for OSX will be even more difficult, so developers need to move toward growing platform. It is really a shame, as Apple really had a chance to become the biggest player in the new market.</p>
<p>In meanwhile, it is time to shop for Nexus phone and Linux development machine.</p>
<p>Sincerely<br />
Anatole Tartakovsky </p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2010/04/11/oops-apple-did-it-again/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Adobe Sneak Previews: Really Impressive!</title>
		<link>http://flexblog.faratasystems.com/2009/10/07/adobe-sneak-previews-really-impressive</link>
		<comments>http://flexblog.faratasystems.com/2009/10/07/adobe-sneak-previews-really-impressive#comments</comments>
		<pubDate>Wed, 07 Oct 2009 06:46:52 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=454</guid>
		<description><![CDATA[I want to congratulate Adobe on the very impressive show they put tonight called &#8220;Adobe Sneaks&#8221;. The message they conveyed was that these outstanding pieces of technology were actually &#8220;play code&#8221; written by Adobe engineers either in spare time or as proof of concept. And the audience was very clear on both power of Adobe [...]]]></description>
			<content:encoded><![CDATA[<p>I want to congratulate Adobe on the very impressive show they put tonight called &#8220;Adobe Sneaks&#8221;. The message they conveyed was that these outstanding pieces of technology were actually &#8220;play code&#8221; written by Adobe engineers either in spare time or as proof of concept. And the audience was very clear on both power of Adobe Platform and ability of Adobe engineering to deliver extraordinary results.</p>
<p>Couple of smaller sneaks really puzzled me. I am sucker for development productivity and the teaser that allowed you to do code editing while still in debugger session seemed like the greatest productivity boost while providing better developer experience then (my previous benchmark) VisualBasic 6 in-place debugging.  For large projects it SAVES HOURS EVERY DAY and allow developer to stay focused on the code writing and debugging instead of going through lengthly mindless process. This is the top feature I want in the next Flash Builder. It took me 3 beers during bash to figure it out &#8211; was not trivial (I hope &#8211; can&#8217;t be sure till tomorrow morning;))  :</p>
<p>The replacement unit is the modified function and not the statement itself or class. Adobe would have to modify compiler/debugger to do MIR or LLVM  of the AS3 code  and in-place JIT, but once it is done you can do the magic. In case of the modified function being on execution stack, revert the function context to the last entrance point in the modified function and fast forward to the breakpoint &#8211; you have in-place editing while debugging. MIR/JIT integration is coming to the FlashBuilder as a part of Mobile Kit integration, and can be incorporated as a layer of compiler callbacks in debugger context. Depending on the integration of native compiler into tool chain it can be feasible enough to do it to the code in constructors or code that gets into _init sections but even pure function replacements will get 99% of the expected functionality. </p>
<p>The best side effect is that in debugging you really need to re-run the last executed statements and scoping to function does just that. Great job, Adobe.</p>
<p>There is no doubt in my mind that Adobe is very close of turning this platform into software revolution over the next few years. I am certain enough that I bought Adobe stock today regardless of the current economic situation as long term impact of their platform is so great.</p>
<p>Sincerely,<br />
Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2009/10/07/adobe-sneak-previews-really-impressive/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex 4 Critical Pieces – Data Centric Development</title>
		<link>http://flexblog.faratasystems.com/2009/10/06/flex-4-for-developers-critical-pieces-%e2%80%93-data-centric-development</link>
		<comments>http://flexblog.faratasystems.com/2009/10/06/flex-4-for-developers-critical-pieces-%e2%80%93-data-centric-development#comments</comments>
		<pubDate>Tue, 06 Oct 2009 21:27:09 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=453</guid>
		<description><![CDATA[Flex 4 is a huge upgrade – after all it is a complete rewrite of virtually every bit of Flex code. It requires formal retraining or at least completely open mind and few weeks of going through samples that come with Flex 4 and understanding the differences and capabilities of the NEW platform.
This morning I [...]]]></description>
			<content:encoded><![CDATA[<p>Flex 4 is a huge upgrade – after all it is a complete rewrite of virtually every bit of Flex code. It requires formal retraining or at least completely open mind and few weeks of going through samples that come with Flex 4 and understanding the differences and capabilities of the NEW platform.</p>
<p>This morning I went to the session Model-Driven Development with Flash Builder and LiveCycle Data Services. It was presented using newly minted Flex 4 beta and unlike the beta 1 that I had to fight through to make the sample to build, the wizards and code generators in beta 2 generally worked. There were some “gotchas” in the process but they were either simple to figure out or even had understandable error message so it is quite passable for the Beta product.</p>
<p>But the thing that was crucial for me to watch people in the room. Aside from typical problems of the front-end developers with Eclipse, a surprising number of people sailed through examples with reasonable understanding of the process. The crucial piece in making the non-trivial process of developing a multi-tier application manageable was correct placing of integration in the middle, and visual integration of the functionality directly into Flash Builder painters and property sheets.</p>
<p>There are other non-engineering components like pricing, but this release finally has potential of making LCDS easy enough for developers – assuming it works. It also gets Flash into top rank of RAD tools – for those who will adopt this development model.</p>
<p>As soon as I complete my current Flex projects in release stage, I am switching every new one to Flex 4/LCDS modeling. Flex community can expect the following new goodies from in a Clear Toolkit framework:</p>
<p>•	Farata Systems will provide a native (SQL) adapter for data management compatible with Flex 4 later this year.<br />
•	Clear Data Builder will have a plugin to synchronize the data model and SQL adapters<br />
•	The missing features like client driven transactions will be added to Flex 4 code generators<br />
•	Forms and controls artifacts that are not to my liking as this is definitely the first version of this technology will be merged with the Clear Data Builder stack</p>
<p>Sincerely<br />
Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2009/10/06/flex-4-for-developers-critical-pieces-%e2%80%93-data-centric-development/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash on iPhone at last? Well, not really</title>
		<link>http://flexblog.faratasystems.com/2009/10/05/flash-on-iphone-at-last-well-not-really</link>
		<comments>http://flexblog.faratasystems.com/2009/10/05/flash-on-iphone-at-last-well-not-really#comments</comments>
		<pubDate>Mon, 05 Oct 2009 23:21:09 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=450</guid>
		<description><![CDATA[Adobe announced Flash code generator for iPhone and I am very confused. I do not care if it makes trivial port of Flash games &#8211; iPhone does not really lack games. While people call it half step in the right direction, it does nothing for me or any Flex developer. Kevin Lynch communicated the amount [...]]]></description>
			<content:encoded><![CDATA[<p>Adobe announced Flash code generator for iPhone and I am very confused. I do not care if it makes trivial port of Flash games &#8211; iPhone does not really lack games. While people call it half step in the right direction, it does nothing for me or any Flex developer. Kevin Lynch communicated the amount of frustration Adobe had with this integration, but I believe that keeping pressure on Apple and continue working on competitive platforms would be more productive.</p>
<p>However, it is announced and will be out in few month (still to be defined) and we need to start working with it ASAP &#8211; as people do need mobile computers. I went through few sessions that talk about challenges in development for mobile platform and I do understand that challenges of Mobile platform are too great to hope for simple port. So we will need to add this tool and start thinking/practicing using this model so we can help developers when the product is released.</p>
<p>Underlying technology is not disclosed , just shown add-hoc &#8220;Save As&#8221; target in Flash Pro CS5 to generate ARM/iPhone code. From the presentation, it looks like they built very limited player as bootstrap code for iPhone, connected ARM codegenerator to MIR/LLVM processor, applied that to generated SWF, linked to bootstrap and produce now native iPhone application. Till I load these applications in my iPhone and find time to look at it more carefully I would  assume it is the process. </p>
<p>But here is the second problem &#8211; and that is more of personal issue. Are we ready to let Apple force us to compile HTML page and submit it to Apple store every time we decide to write something?</p>
<p>Today 9 out of 10 attendes of Adobe MAX carries iPhone &#8211; including me. The percentage of early adopters and trend setters is very high here. IMHO, right now Adobe holds the key to success to Palm/Blackberry/Google platforms.</p>
<p>Sincerely<br />
Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2009/10/05/flash-on-iphone-at-last-well-not-really/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What&#8217;s the design&#8217;s share in RIA?</title>
		<link>http://flexblog.faratasystems.com/2009/06/22/what-is-the-percentage-of-design-work-in-the-ria</link>
		<comments>http://flexblog.faratasystems.com/2009/06/22/what-is-the-percentage-of-design-work-in-the-ria#comments</comments>
		<pubDate>Mon, 22 Jun 2009 20:42:55 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=427</guid>
		<description><![CDATA[This weekend I read a blog by Ted Patrick and found very interesting phrase:&#8221;If you take a careful look at Catalyst it flips the % of design and development work within an app. Where development was 80% of an app, it is now 20% and Design/Interaction was 20% is now 80%&#8221;.
Sorry for taking it out [...]]]></description>
			<content:encoded><![CDATA[<p>This weekend I read a blog by <a href="http://onflash.org/ted/2009/06/design.php">Ted Patrick</a> and found very interesting phrase:&#8221;If you take a careful look at Catalyst it flips the % of design and development work within an app. Where development was 80% of an app, it is now 20% and Design/Interaction was 20% is now 80%&#8221;.</p>
<p>Sorry for taking it out of context, but I think it will be taken out of context or even becomes a mantra for new development process the same way UML 10 years ago was suppose to produce 80% of the application out of structured requirements. I am certain that this interpretation was not intention of Theodore Patrick or anyone at Adobe.</p>
<p>I would suggest that 80% &#8211; 20% separation has to be clarified as it might be used by some as Adobe&#8217;s recommendation of budget/time allocation and it could be problematic for the current state of the industry.</p>
<p>Less generalized statement IMHO would be this:<br />
In order for applications to be successful in consumer / occasional user market you will need to increase your typical “functionality based” budget few times for usability, design and testing. You will also need to keep lid on features in order to achieve usability staying within budget constrains.</p>
<p>Applications targeting mobile devices and occasional users on conventional ones are definitely a growing trend that Flash platform is best positioned to take over. Enterprise and niche application will still be out of reach of UX due to budget / features constrains – so the following notes might not apply.</p>
<p>I agree that most of the current design work goes into packaging (opening page(s) and stylesheets) and does not affect the quality of the application. I would argue that cinematic experience is more important than design. For example, in the movie industry films based on beauty rather than the character have higher attrition rates and lower retention. </p>
<p>IMHO, there should be stronger distinction between visual design (how it looks) and &#8220;interaction&#8221; design (how it does things).</p>
<p>People will adapt to anything that is simple and easy to understand. Current UX wave is driven by people who have taste, which can be acquired over time&#8230; even by developers. Time is of essence here &#8211; developers just need the same tools and reasonable project deadlines as the rest of the team rather then cram their time toward the end of the project. </p>
<p>In my experience it takes less then 6 month for a developer moved from PC to MAC OSX to “forget” old way of doing things and acquire the same taste for simplicity the designers historically enjoy by using designers products. Adobe developers have long history of using non-Microsoft systems and it is definitely reflected in the way the build applications with or without designers.</p>
<p>At this point any serious Flex developer working on consumer-facing project must go through at least some training in Web Design to the extent that they can modify Photoshop,  Illustrator or Flash files to annotate/fix a design flaw and communicate it properly to the designers. That implies to a large extent that 60-80% of the overall time is still in the development as developers extended their reach into modern UI. It also greatly reduces overall project time and mis-communications. </p>
<p>I certainly hope that Flash Catalyst will be bridging the gap for the rest, but expect mixed results if people would not expose themselves significantly to the other side of the fence.  Finally, as client portion of RIA becomes simple and intuitive, more work needs to be done on the server to prepare and support such predictable and intuitive behavior.</p>
<p>I lived through few projects of complete picture perfect designs made upfront. Unfortunately, those static pictures are full of loopholes. Good developers are just as good as good designers in interactivity and much better with data models and overall process. In the end, negligible percentage of the picture-perfect upfront design is usable and could be counterproductive for the project lifecycle as compared to conventional wireframes as a common ground. Only from common understanding (the more visual the better, but not ONLY visual – you need to make sure it is also in words so you can ensure common understanding, provide comments and establish two-way process) you can start real team work on your next RIA project.</p>
<p>Sincerely,<br />
Anatole Tartakovsky<br />
Farata Systems</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2009/06/22/what-is-the-percentage-of-design-work-in-the-ria/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe and TV &#8211; ready for prime time?</title>
		<link>http://flexblog.faratasystems.com/2009/04/26/adobe-and-tv-ready-for-prime-time</link>
		<comments>http://flexblog.faratasystems.com/2009/04/26/adobe-and-tv-ready-for-prime-time#comments</comments>
		<pubDate>Mon, 27 Apr 2009 02:53:35 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flash Player]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex Consulting]]></category>
		<category><![CDATA[Flex+Job]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=416</guid>
		<description><![CDATA[On Monday, Adobe announced Flash Lite 3 platform to be a part of new TV sets/cable boxes &#8211; coming mid 09. It can be big breakthrough &#8211; even revolution &#8211; for the consumers. Or, without enough independent players, it can just be a neat way for cable providers to minimize the cost of targeted advertisement/services [...]]]></description>
			<content:encoded><![CDATA[<p>On Monday, Adobe announced Flash Lite 3 platform to be a part of new TV sets/cable boxes &#8211; coming mid 09. It can be big breakthrough &#8211; even revolution &#8211; for the consumers. Or, without enough independent players, it can just be a neat way for cable providers to minimize the cost of targeted advertisement/services at the cost of upgrade of set-top boxes &#8211; most of them are being replaced this year anyway. </p>
<p>Giving programmable environment to the TV will be as freeing and devastating as Internet publishing for the traditional paper one. Traditional TV is best described by George in early Seinfield  : &#8220;People will watch the show about nothing because it is on TV&#8221;.  New environment can completely change not only HOW we receive the entertainment but WHAT and WHEN and HOW MUCH we will watch. Here is how it it works for me.<br />
(Disclaimer: I have not been Cable TV subscriber for the last 8 years &#8211; after all I have kid at home. I watch movies that I choose, listen to music libraries collected for over 20 years, and share photos with my friends going back to black and white film. My base entertainment system is built around Macs network with  every possible audio and video component not to mention musical instruments).</p>
<p>So last weekend I went to my brother birthday and gave him his first Mac Mini as a present. However, I did not plug it into his office monitor. Instead, it went straight into FIOS connection and HDTV unit. It had bluetooth Logitech DiNovo Edge keyboard and WII remote for mouse (kids preferred  to use iPod). Most importantly, it had archive of family resources and was pre configured to securely access my &#8220;shared&#8221; libraries and gave me access to his &#8220;shared&#8221; ones. Plus instant video communications, screen sharing and VM remoting. For advanced uses, grid computing and documents backup. </p>
<p>The result was very enthusiastic from mostly skeptic (burned by Vista/Media Center fiasco)  audience. Seeing that small box actually working  caused quite a stir. I am pretty much set with birthday wish list for the next year. The simple fact that I can share my media and have &#8220;family&#8221; network and broadcasting, play human games like chess/cards/backgammon while seeing/talking to the opponent has great value to me &#8211; with friends and family all over the globe. </p>
<p>There is one small problem &#8211; the price for average family. The modern unit with backup drive and all extras costs ~$900. Flash on set-top allows for $0 cost (Ok, $200-300 for  decent wireless keyboard and mouse and terabyte storage) while delivering most of the functionality of the above unit. Giving top boxes with HDTV ability to replace computers and TV programming can be a tipping point for the new media and relationship software.</p>
<p>Recently, just about 50% of Americans said that TV is &#8220;necessity&#8221; &#8211; more then 15% drop from 10 years ago. Most of the drop is accounted by the fact that younger generation is getting their entertainment via different (computer based) sources. As growth in facebook and myspace population is currently fueled by people around retirement age, HDTV based living room offers much more comfortable environment for mainstream adoption</p>
<p>I do not really care for twitter from anyone &#8211; especially paid editors to bombard me with clever sales pitches of 140 characters or less. If they have some thoughts to share, lets keep it real &#8211; 300 words at least, I would rather read or better yet listen to podcast/youtube from the people I trust.  Trust is the key here. Once there is enough alternative information, the whole media structure is going to change.  Advertisement as we know it will not work if people have alternative and more trusted source of information. In the end who do you trust &#8211; Amazon reviews or magazine editors dependent on the advertisement of the products they review?</p>
<p>Internet has not fulfilled so many predictions of the past millennium &#8211; like destroying the malls and making home shopping personalized and fun experience &#8211; but it will happen soon enough with the current economy. With so many people becoming disposed by Wall Street and Madison Ave the Silicon Alley gets all necessary talent and technology. It is going to be fun year, with more startups getting into RIA and streaming technologies &#8211; and I am looking forward with playing with new ideas and approaches to make programming more humane experience.</p>
<p>Sincerely,<br />
Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2009/04/26/adobe-and-tv-ready-for-prime-time/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Search Engine as the most valuable enterprise application component.</title>
		<link>http://flexblog.faratasystems.com/2009/03/06/search-engine-as-the-most-valuable-enterprise-application-component</link>
		<comments>http://flexblog.faratasystems.com/2009/03/06/search-engine-as-the-most-valuable-enterprise-application-component#comments</comments>
		<pubDate>Fri, 06 Mar 2009 21:13:47 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=400</guid>
		<description><![CDATA[I have been very quiet for very long time. It was not because I have nothing interesting to report. On the contrary, it was a roller coaster ride of application development. This year can be labeled something like  “Rich Internet Applications meet Enterprise Database by the way of full text search”.
I have been working [...]]]></description>
			<content:encoded><![CDATA[<p>I have been very quiet for very long time. It was not because I have nothing interesting to report. On the contrary, it was a roller coaster ride of application development. This year can be labeled something like  “Rich Internet Applications meet Enterprise Database by the way of full text search”.<br />
I have been working on the projects to help enterprise subject matter experts do their work. It was very addictive and ever changing process that required reaching certain level of results followed by a cool review to make it believable to a “sane” developer.<br />
We are slowly getting used to the fact that of-the-shelf and free software can find related data out of million records within a second. The fact that the found data can be ordered and presented in a form of the definite answer recognizable by user in a single glance is nothing short of magic.<br />
Enterprises store vast amount of information comparable in size to the public accessible web – some of the clients few years ago were actually bragging how much more data they have over Google. However, most of the workers cannot access it due to data size and “system walls”. As a result, subject matter experts are mainly being used in their historical capacity – people who memorize the facts and working within those constrains. Full text search, combined with some metrics on the quality of the data, challenges both what we “know” and how we perceive our “knowledge”.<br />
The way the knowledge is processed is about change in the next few years, as the companies really have to open up these databases for use if they want to maintain competitive edge. It will lead to a revolution in the enterprise application development. Let us see few side effects of that process so we can recognize the change.<br />
The use of full text search will have a major impact on how the applications interact with the data. Instead of actively looking for information by digging for information with tons of drill downs and clicks, you just type what you want or highlight what matters to you.<br />
The system uses those queues to search, rate and present information back to you with highlighted things that match your request. Moreover, with proper training systems can also identify what might be the reason why it is not applicable in the context.<br />
Properly designed “data driven” application adapts to the things you usually search for as well as data it searches on. It can let user to add as many qualifications or “disqualifications” to the search as you seem appropriate without usual constraints of the structured data.  Once a certain level of experience is established, the system easily outperforms the subject matter experts in the speed and quality of data retrieval and statistical qualifications. The main role of the human shifts to use of their analytical and pattern recognition skills.<br />
Flex is really ideal environment for this type of applications, as you really want not only “refresh-free” experience but really “seamless” one. The ability of creating seamless environment is crucial, as the natural system implies user experience that adapts to the process AND context.  As a result, visualization and transparency of the context and state are as important as quality of the search engine.<br />
“Seamless” also implies natural flow of things. The push technology that Adobe was promoting for so long is finally coming to enterprise applications.<br />
I will cover in next parts few components that are coming from all that development. Good news is that SEO2 are within the reach and in the eyesight of the new crop of applications.<br />
Sincerely,<br />
Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2009/03/06/search-engine-as-the-most-valuable-enterprise-application-component/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open Sourcing LCDS</title>
		<link>http://flexblog.faratasystems.com/2008/08/10/open-sourcing-lcds</link>
		<comments>http://flexblog.faratasystems.com/2008/08/10/open-sourcing-lcds#comments</comments>
		<pubDate>Mon, 11 Aug 2008 03:55:55 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[Adobe Flex training]]></category>
		<category><![CDATA[Data Management]]></category>
		<category><![CDATA[Data Services]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex Builder]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=353</guid>
		<description><![CDATA[I finally finished the slides for one day Enterprise Flex Symposium on August 19, 2008 in New York City. The first session I will be presenting goes through the differences between BlazeDS and LCDS and explains how to get all the functionality offered by LCDS with BlazeDS combined with some open source solutions.
The idea of this [...]]]></description>
			<content:encoded><![CDATA[<p>I finally finished the slides for one day <a href="http://www.eventbrite.com/event/126384018" target="_blank">Enterprise Flex Symposium </a>on August 19, 2008 in New York City. The first session I will be presenting goes through the differences between BlazeDS and LCDS and explains how to get all the functionality offered by LCDS with BlazeDS combined with some open source solutions.</p>
<p>The idea of this presentation came to me during one of the Flex conferences about 6 months ago. The presenter asked the audience of about 100+ Flex developers if they used Data Management Services. Only handful of them did. Hefty price, learning curve and general attitude toward payware seem to be  winning over advantages of excellent productivity and robustness of LCDS solution that is years ahead of commonly used techniques. Interesting enough, during subsequent conferences, similar question revealed that many more developers lean toward using BlazeDS.</p>
<p>So in that first session I will cover how to fill the BlazeDS gaps in the most important areas for enterprise developers:</p>
<p>– how to get virtually unlimited push scalability ( AMFStreamingEndpoints using new Servlet 3 NIO API )</p>
<p>– how to create Managed Data Collections and provide seamless integration of the data update / push through multiple clients</p>
<p>– enabling server-to-client RPC –  “the server calls the client”</p>
<p>– How to add quality of service, reliability and application protocols to both LCDS and BlazeDS</p>
<p>– how to generate PDF on the client ( I may move this part to another session devoted to reporting and data entry solutions for application developers)</p>
<p>All my code examples work with Adobe’s sample applications, with minimal changes on the server side  thus minimizing the need to re-train developers and providing an easy migration path.</p>
<p>I will post the slides after the event.</p>
<p>Hope to see you there,</p>
<p>Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2008/08/10/open-sourcing-lcds/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flex 4 States Syntax Changes</title>
		<link>http://flexblog.faratasystems.com/2008/05/05/flex-4-states-syntax-changes</link>
		<comments>http://flexblog.faratasystems.com/2008/05/05/flex-4-states-syntax-changes#comments</comments>
		<pubDate>Tue, 06 May 2008 03:46:29 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex Builder]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=323</guid>
		<description><![CDATA[New specification on GMXML syntax for state&#160;has been posted http://opensource.adobe.com/wiki/display/flexsdk/Enhanced+States+Syntax
The idea is to&#160;make states more declarative and&#160;eliminate scripting as much as possible (completely in most cases). That should allow better model for programmatic skins for designers and simplify integration points.
Personally I think it is much simpler model, and it is going to get&#160;better acceptance just [...]]]></description>
			<content:encoded><![CDATA[<p>New specification on GMXML syntax for state&nbsp;has been posted <a href="http://opensource.adobe.com/wiki/display/flexsdk/Enhanced+States+Syntax">http://opensource.adobe.com/wiki/display/flexsdk/Enhanced+States+Syntax</a></p>
<p>The idea is to&nbsp;make states more declarative and&nbsp;eliminate scripting as much as possible (completely in most cases). That should allow better model for programmatic skins for designers and simplify integration points.</p>
<p>Personally I think it is much simpler model, and it is going to get&nbsp;better acceptance just because of that.&nbsp;I would reserve my final review till the time new code generator is available so I can&nbsp;see integration points for really cinematographic applications our clients learned to love. </p>
<p>It looks also that MXML compiler goes through major overhaul. Please note &ldquo;color.down&rdquo; syntax &ndash; finally we see departure from old conventional XML markup toward DMXML ( Dynamic MXML). Seriously, if the new compiler is going to depart from pure XML syntax, let us talk about the new MXML syntax now &ndash;&nbsp;including color.runtime.down and other data related things that go way over simplistic CSS model.</p>
<p>I would also expect States have extensions for substate or at least device formats given Flex 4 release timeline. In other words, &nbsp;what works for desktop is different from console and definetly from the phone &ndash; including selection of the controls, events and scripting. I would expect compiler to emit different SWFs for different format with full support through hierarchical states.</p>
<p>For majority of applications it is very significant change in the way customization and skinning is done. Switching to programmatic skins approach allows significantly reduce the size of flex applications and provide &ldquo;streamable&rdquo; applications with core functionality loadable fast. I do believe that major overhaul of tools to support it even with current model has to be done way before Flex 4 release.&nbsp;For&nbsp;large applications I have seen benefit in 30%&ndash;40% size application reduction and main problem for wide adoption is &ldquo;dark programming&rdquo; that makes it art of few.</p>
<p>Well, thanks to Flex team for &ldquo;heads up&rdquo; &ndash;&nbsp;back to daily tasks</p>
<p>&nbsp;</p>
<p>Sincerely,</p>
<p>Anatole Tartakovsky</p>
<p>Farata &nbsp;Systems</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2008/05/05/flex-4-states-syntax-changes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Browsers give AJAX gets new lease on life &#8211; and change RIA architecture somewhat as well. Part 1</title>
		<link>http://flexblog.faratasystems.com/2008/04/05/browsers-give-ajax-gets-new-lease-on-life-and-change-ria-architecture-somewhat-as-well-part-1</link>
		<comments>http://flexblog.faratasystems.com/2008/04/05/browsers-give-ajax-gets-new-lease-on-life-and-change-ria-architecture-somewhat-as-well-part-1#comments</comments>
		<pubDate>Sat, 05 Apr 2008 19:18:17 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=315</guid>
		<description><![CDATA[The latest betas of IE and Mozilla increased default number of simultaneous parallel HTTP requests per domain/window from 2 to 6. It is the biggest new feature in AJAX world I have heard in the last 3 years. For current crop of AJAX sites serving real WAN connections it means doubling the load speed, fewer [...]]]></description>
			<content:encoded><![CDATA[<p>The latest betas of IE and Mozilla increased default number of simultaneous parallel HTTP requests per domain/window from 2 to 6. It is the biggest new feature in AJAX world I have heard in the last 3 years. For current crop of AJAX sites serving real WAN connections it means doubling the load speed, fewer timeouts/reliability issues. By the way, most of Opera and Safari performance gains over IE and Mozilla are attributed to the fact that they use 4 connections instead of standards recommended 2 by default.</p>
<p>The fact that increasing the number of parallel connections increases throughoutput is very simple to understand. Today&rsquo;s Request/response approach to communications is very similar to village bike concept &ndash; you have few very limited resources that travel back and forth, you wait till it is your turn, and hope that the guy before you does not get lost &ndash; otherwise you need to wait till all hopes are gone (called timeout) and the community provides you with a sparkling new bike circa 1996. In most cases it is too late anyway and user moved to a different page/site. As the travel destinations become more distant (WAN) you are exposed to real world troubles of commuting &#8211; latency (500ms for geostatic satellite network), bandwidth limitations, jitter (errors), congestions (your local ISP is also trying to be TV broadcaster AND new AT&amp;T), unrecoverable losses, etc. </p>
<p>Obviously, more bikes mean that with some work on street and traffic planning you can get much better performance and reliability. You might even go crazy and allocate one bike to sheriff/fireman/village doctor so he will provide information on conditions and lost/damaged goods. You can route important goods in parallel so they would not get lost or damaged that easy. You can really start utilizing long running connection for real &ldquo;push&rdquo; now.&nbsp; But before we do go crazy let us look carefully what has been happening in the last 10 years &ndash; how early adopters of AJAX/RIA survived.</p>
<p>Increasing the number of HTTP connections was ugly trick most of enterprises we worked with quietly rolled out in the browser builds/service packs in the beginning of the century. In IE you apply changes to registry keys:<br />HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings <br />MaxConnectionsPer1_0Server&nbsp;&nbsp;&nbsp; 10<br />MaxConnectionsPerServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br />With Mozilla you recompile the whole browser and apply few other performance tricks along the way. It does solve most of performance and reliability issues for a SHORT WHILE. The main reason is that without imposed limits, software increases in size faster than Moore&rsquo;s law for electronics. And , unlike private networks in enterprises, without proper &ldquo;city framework&rdquo; rampant requests will cause overall Internet meltdown as initial rollout of more capable browser will give them unfair advantage in terms of bandwidth share &ndash; 3 times as much compare to current crop, causing QoS problems on older and slower networks. In other words, it potentially has very real potential to cause more of the same problems it tries to solve.</p>
<p>Most enterprises had to control QoS of communication for their clients. They created and adopted number of p2p solutions that provide more efficient communication models. Basically they fall into 3 categories:<br />1. HTTP Batching<br />2. Binary components dealing with sockets directly<br />3. Pluggable protocols</p>
<p>The last option did not really catch up in popularity, even though it allows moving most of the problems from the browser level to OS level. We will cover only the first 2 options.</p>
<p>HTTP Batching is combination of few technologies with close resemblance of Tokyo metro ushers working on family motorbikes. As an example, Flex/Flash AMF protocol tries to squeeze every bit of bandwidth and optimize queuing of the requests in the most efficient way &ndash; both on client and server. The result is very good &ndash; you use maximum bandwidth, and lines are kept short. As a matter of fact, the results were so good, that most of our clients, even if they need to use WebServices or conventional HTTPServices, use AMF to proxy requests via AMF enabled server, making it deliver results from legacy servers more efficiently. It is loads better than non-batched requests/responses. And it plays nicely with current infrastructure as it piggybacks on the existing browser HTTP requests. However, for critical applications or plain bad infrastructures the problem remains: there are no QoS or QoE (quality of experience) built on HTTP level, so there are potential problems with queues overruns or lost packages. </p>
<p>From purist point of view it was a mistake to let mathematicians and physicists mess with communications and come up with HTTP model. Binary &#8220;always on&#8221; (re)connected socket protocols are way more logical and efficient. Unlike request/response model typical socket connection is like 2 way highway, with data moving in opposite directions independently.&nbsp; But before we would fully depart into Communications 2.0 world, let us talk a bit how HTTP shapes up these days.</p>
<p>As I was saying, disconnected model of HTTP 1.0 was not practical. Overhead of connecting/disconnecting was not tolerable, and for the last 8 years I have not seen single desktop browser using it. It has been completely replaced by HTTP 1.1 &ndash; the protocol that keeps connections open beyond request/response so next communications happen faster. Underneath, of course, there are 2-way sockets that stays open &ndash; but browsers diligently follow old model and ignore the possibilities.</p>
<p>As browsers started to get into real applications, the need for real-time data forced people to look into better solutions then polling for data &ndash; and few &ldquo;push&rdquo; solutions appeared. While they were different in implementations, the main theme was the same &ndash; browser gets requests, holds it for long time, flushing packages down when it becomes available. The packages reach the browser and are either interpreted by programs upon arrival or executed (if packaged as &lt;script/&gt; sections). The important part is that people started to see that server driven model is valid and better for some applications. </p>
<p>J2EE final specification and standards (JSR 315: Java Servlet 3.0 Specification) are planned for the end of the year, however, there is a number of open source and commercial implementations of proposed &ldquo;Comet&rdquo; model today (including Python-based and others). They can be very different in approach and implementation &ndash; capitalizing on new non-blocking io, optimized threads or more efficient native sockets implementations &#8211; but they are fundamentally common in breaking request/response paradigm. The idea is that the server provides second model for requests handlers in addition to conventional one. Handlers that are marked to support that model will receive 4 events &ndash; &ldquo;connect&rdquo;, &ldquo;read&rdquo;, &ldquo;error&rdquo; and &ldquo;disconnect&rdquo;. Adding event model to the server side brings symmetry to the client/server programming model and greatly simplifies asynchronous programming code. &ldquo;Connect&rdquo; and &ldquo;Disconnect&rdquo; events define lifespan of the &ldquo;connection&rdquo; object available for communications. &ldquo;Error&rdquo; event notifies of low-level errors in the transmission protocol. &ldquo;Read&rdquo; event means that there is request coming from the server and allows server to read and process it. Server keeps &ldquo;connection&rdquo; and &ldquo;response&rdquo; objects and writes/flushes information to the client as needed. </p>
<p>Let us see how this model is different for fine granularity requests common for today&rsquo;s AJAX applications. Pretend you are sitting ( like me now ) at a coffee shop with lousy Wi-Fi connection sporting 1 sec latency for typical webservice eBay response, watching for 30 items. With current browser settings, it takes you 15 seconds to refresh all 30 items. With 6 connections, it will reduce it to 5 seconds &ndash; but will require 3 times infrastructure in between. With &ldquo;Comet&rdquo; type requests you can send all 30 requests without waiting for single response ( the same will be done with AMF HTTP batching) and will receive all 30 responses asynchronously &ndash; usually within 2 seconds. With HTTP Batching, you would get all 30 responses at once, and need &ldquo;sorting&rdquo; adapters on both sides to distribute pieces to proper responders. </p>
<p>Great advance, and just in time when other commonly available technologies were about to make the whole&nbsp; model&nbsp; obsolete. Surprisingly,&nbsp; it also strengthen the position of competitive technologies &#8211; but that is to be covered in Part&nbsp; 2.</p>
<p>Sincerely,<br />Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2008/04/05/browsers-give-ajax-gets-new-lease-on-life-and-change-ria-architecture-somewhat-as-well-part-1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing applications for real world</title>
		<link>http://flexblog.faratasystems.com/2008/03/27/testing-applications-for-real-world</link>
		<comments>http://flexblog.faratasystems.com/2008/03/27/testing-applications-for-real-world#comments</comments>
		<pubDate>Thu, 27 Mar 2008 05:14:59 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=312</guid>
		<description><![CDATA[RIA applications are extremely susceptible to network problem. Even small probability of the lost/misdelivered packages, becomes significan when multiplied by the sheer amount of the small packages. Lost/duplicate/reordered packages and high latency/low bandwidth cause significant issues for applications fully tested on 100% reliable intranets and then released in the wild of unreliable WAN communications.
For the last 2 years we have [...]]]></description>
			<content:encoded><![CDATA[<p>RIA applications are extremely susceptible to network problem. Even small probability of the lost/misdelivered packages, becomes significan when multiplied by the sheer amount of the small packages. Lost/duplicate/reordered packages and high latency/low bandwidth cause significant issues for applications fully tested on 100% reliable intranets and then released in the wild of unreliable WAN communications.</p>
<p>For the last 2 years we have been using different linux boxes (VMs and physical ones) to simulate different WAN problems. The setup process is tedious, and has limited resolution as most of the linux kernels are working on 100/250Hz. Fortunately, finally there is a product that solves most of setup problems with simple portable appliance that has to be in the toolbox of any Web 2.0 professional.</p>
<p><a title="brief introduction/datasheet" href="http://www.iwl.com/mini-maxwell-emulation/index.php?Itemid=123" target="_blank">Mini Maxwell &#8211; Easy to Use, Portable, Network Emulator</a></p>
<p>Bringing latency up to realistic 200ms and package loss to unrealistic 10% would quickly expose problems in error handling code. It will also give you quick feel for robustness of the code. Next to check if duplicate/out-of-sequence packages affect the application. Financial applications also need to check for effect of corrupted data.</p>
<p>Depending on the protocols used by application, different remedies are available. Obviously, if you are using WebServices and similar old high-level protocols you have very loosely bound communications making implementation of QoS layer impossible. As number of HTTPRequests is limited by browser (2 for IE), latency can cause performances slowdown and timeouts. Missing packages escalate the issue with connection startving even further.</p>
<p>If you are using any AMF implementation, your case improves significantly. First, latency is less of a problem as Flex would automatically batch the requests together. Implementing symmetrical checkpoints on both client and server endpoints allows trivial package recovery in case of loss and duplicates. Nevertheless, lost packages are still a problem as they cause timeouts.</p>
<p>Robustness gets much better if you move to connected protocols – either RTMP or new BlazeDS long pull. Usually you can service anywhere between 80% to 100% of the users with them. Using opened connections and 2 way sockets is ideal for high performance and reliable protocols. Comparing them to HTTPRequests is like comparing highway with multiple lines going in each directions to single-line road. More applications started using connected solutions for tasks different from regular RPC to modules loading implementing streaming the same way you stream movies. As they evolve, we should see more open source products that provide transparent implementations using mixture of protocols. In meanwhile, we can do most of it using Flex built-in fallback channels.</p>
<p>Hope this helps,</p>
<p>Anatole</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2008/03/27/testing-applications-for-real-world/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>From 360Flex Atlanta Show</title>
		<link>http://flexblog.faratasystems.com/2008/02/25/from-360flex-atlanta-show</link>
		<comments>http://flexblog.faratasystems.com/2008/02/25/from-360flex-atlanta-show#comments</comments>
		<pubDate>Mon, 25 Feb 2008 22:31:00 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex Builder]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=303</guid>
		<description><![CDATA[John and Tom produced the best 360Flex show up to date. Great location, sessions that are long enough to&#160;cover aspects&#160;ever expanding platform and&#160;great timing with Flex 3 release. Definetly the best Flex developers conference to go to.
This morning started with keynote by Adobe &#8211; obviously product announcement, but also detailed explanation of things going OS. [...]]]></description>
			<content:encoded><![CDATA[<p>John and Tom produced the best 360Flex show up to date. Great location, sessions that are long enough to&nbsp;cover aspects&nbsp;ever expanding platform and&nbsp;great timing with Flex 3 release. Definetly the best Flex developers conference to go to.</p>
<p>This morning started with keynote by Adobe &ndash; obviously product announcement, but also detailed explanation of things going OS. You can not underestimate the importance of that step. It removes a lot of obstacles in wide adoption of Flex platform &ndash; both in developer and tool making communities. As a matter of fact, it makes almost impossible for anyone in toolmaking market not to provide open source version of their product now. So we will have few announcements to make about changes in pricing model ( how does FREEE sound ?) this week.&nbsp;</p>
<p>My session had a late start &ndash; keynote was running late and projector would not connect to my MacBook Pro&nbsp;( next time I will pack my trusted thinkpad along). Interesting enough, the questions asked after the session were from the slides I had not have time to go through. So I will run the same session on Wednesday, 2:30 &ndash; will go through the remaining slides, and I will also add a lot of stuff based on the questions asked. Bring or send the questions &ndash; I will make post show video with the sessions materials.</p>
<p>&nbsp;</p>
<p>Oh well, time to go to another party&hellip;.</p>
<p><a href="http://flexblog.faratasystems.com/wp-content/uploads/2008/02/360flexAtlanta.ppt">File Attachment: 360flexAtlanta.ppt (1569 KB)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2008/02/25/from-360flex-atlanta-show/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex local dates/time transfer issue</title>
		<link>http://flexblog.faratasystems.com/2008/02/05/flex-local-datestime-transfer-issue</link>
		<comments>http://flexblog.faratasystems.com/2008/02/05/flex-local-datestime-transfer-issue#comments</comments>
		<pubDate>Tue, 05 Feb 2008 07:12:49 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=289</guid>
		<description><![CDATA[First, let me explain how Flex deals with Date transfer. Dates are transfered to/from Flex client as UTC date &#8211; no timezone information available. Transfer to the UTC/local time happens automatically on protocol level. As a result, if the server does not know client&#8217;s timezone, it can not derive the entered time &#8211; rather it [...]]]></description>
			<content:encoded><![CDATA[<p>First, let me explain how Flex deals with Date transfer. Dates are transfered to/from Flex client as UTC date &#8211; no timezone information available. Transfer to the UTC/local time happens automatically on protocol level. As a result, if the server does not know client&#8217;s timezone, it can not derive the entered time &#8211; rather it operates on Global time only. It means that if I am on the East coast and entered 1PM, person in Denver will see 11AM.<br />
Depending on the type of application it can be desirable behavior &#8211; however in most of the applications it is not. Sometimes I want to enter time in the client&#8217;s local time &#8211; regardless of the timezone I am in at the time of data entry. It means that application has to operate without timezone &#8211; or for that matter in one timezone. Usually it is solved either on the server side by keeping client timezone information in session and adjusting dates on each transfer or by communicating date as String. In either case it requires a lot of code and constant tracking of the issue.</p>
<p>However, it can be solved much easier with usage of transient tag/keyword during data transfer:</p>
<p>AS3:</p>
<p>package com.farata.datasource.dto<br />
{<br />
        import flash.events.EventDispatcher;<br />
        [RemoteClass(alias="com.farata.datasource.dto.LineItemDTO")]<br />
        [Bindable(event="propertyChange")]<br />
        public dynamic class LineItemDTO extends EventDispatcher //implements IManaged<br />
        {</p>
<p>           private var _myDate : Date;</p>
<p>           public function get myDateUTC() : Date{<br />
                        return _myDate ==null?null:new Date(_myDate.valueOf() &#8211;  _myDate.getTimezoneOffset()*60000);<br />
                }<br />
                public function set myDateUTC( value : Date ):void{<br />
                        var oldValue:Object = _myDate;<br />
                        if (oldValue !== value)   {<br />
                                this._myDate = value == null?null:new Date(value.valueOf() + value.getTimezoneOffset()*60000);<br />
                        }<br />
                }<br />
		[Transient]</p>
<p>                public function get myDate() : Date{<br />
                        return _myDate;<br />
                }<br />
                public function set myDate( value : Date ):void{<br />
                        var oldValue:Object = this._myDate;<br />
                        if (oldValue !== value)   {<br />
                                this._myDate = value;<br />
                                dispatchUpdateEvent(&#8220;myDate&#8221;, oldValue, value);<br />
                        }<br />
                }</p>
<p> Java:<br />
package com.farata.datasource.dto;</p>
<p>import java.io.Serializable;<br />
import java.util.*;</p>
<p>public class LineItemDTO implements Serializable<br />
{</p>
<p>transient 		public java.util.Date myDate;<br />
        public java.util.Date getMyDateUTC()<br />
        {<br />
                return        myDate;<br />
        }</p>
<p>        public void setMyDateUTC(java.util.Date value)<br />
        {<br />
                this.myDate = value;<br />
        }<br />
}</p>
<p>That is all &#8211; you have normal public variables on both sides, and serialization works transparently, keeping Date in UTC zone on both sides (you also need to set JAVA VM timezonne to UTC) &#8211; and now you are always in the servers timezone.</p>
<p>Enjoy,<br />
Anatole Tartakovsky</p>
<p>PS Please evaluate your need for local vs global time  &#8211; otherwise you would have cases like Dell&#8217;s support center in India when they were asking for feedback on service 8 hours before it was suppose to happen &#8211; I once got a call @ 2AM about delivery set up for 10AM &#8211; plan carefully.</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2008/02/05/flex-local-datestime-transfer-issue/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>My prediction for 2008 (for developers)</title>
		<link>http://flexblog.faratasystems.com/2007/12/31/my-prediction-for-2008-for-developers</link>
		<comments>http://flexblog.faratasystems.com/2007/12/31/my-prediction-for-2008-for-developers#comments</comments>
		<pubDate>Mon, 31 Dec 2007 22:18:27 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=281</guid>
		<description><![CDATA[Here is my prediction for the &#8220;Killer App&#8221; for 2008. Ok, I am cheating here a little bit &#8211; some things are happening now, but are not exposed by the media. You know, the best investments are the one it is almost impossible to get into, unless you build them yourself.
On average, I am working [...]]]></description>
			<content:encoded><![CDATA[<p>Here is my prediction for the &#8220;Killer App&#8221; for 2008. Ok, I am cheating here a little bit &#8211; some things are happening now, but are not exposed by the media. You know, the best investments are the one it is almost impossible to get into, unless you build them yourself.</p>
<p>On average, I am working with technologies that are from 2 to 4 years ahead of mass adoption. With that in mind I think 2008 will be the year we start the &#8220;personal assistant&#8221; war. The short term goal of the game is to make people heavily dependent on the simple and convenient services provided by slightly upgraded gadgets.</p>
<p>The first grand frontier (2008-2009) will be the battle for your cell telephone. 2007 was year of IP telephony making into the masses. Skype was good example of building proprietary platform and luring a lot of people in it. There were bunch of companies that make Skype look like Scrooge &#8211; offering similar services at fraction of the Skype&#8217;s price. My favorite scheme is MagicJack &#8211; for $20 bucks a year you can have unlimited phone service in the US or anywhere on the planet for that matter &#8211; while robbing AT&#038;T and other telecoms. There is a number of products coming to market that are going to be just as good for you and just as bad for telecoms. Obviously, it will be followed with legal changes in the next few years that will change the way we pay for regular phones. Second, we will stop using old phones altogether.</p>
<p>It is not too futuristic, and Google and cable/media companies are in the midst of taking over the telecommunications as we know it. It will be replaced with DVRs with VoIP servers in them.<br />
To see it, just look what happens around you. GSM is moving in, with a lot of upgraded infrastructure. I travel a lot, and in my experience I get much better 3G speed/coverage on AT&#038;T then on Sprint or Verizon. With that also comes freedom &#8211; unlocked phones, different OS, ability to choose from the much wider range of product. In US the &#8220;main&#8221; operating systems &#8211; Windows, RIM and Apple have 90% of the PDA market. Worldwide, they are less then 20% combined &#8211; about as much as Linux ones.</p>
<p>My cell phone is Linux smartphone with a touch screen and VoIP/802.11g. It is in a regular candy bar format, with a normal phone keyboard  I can use while driving. It is a bit smaller then iPhone and fits into the same holder. When I am at work or home, calls are automatically  routed to VoIP providing better call quality and extra features like unified messaging to boot. When I am on the go or outside of the 3G/WiFi coverage &#8211; I have a cell port on the VoIP appliance &#8211; so all my calls are routed for free as well. There is no comparison to the Blackberry or Windows devices &#8211; at about 50% of the cost with the plan. I would estimate that move to &#8220;aggressive&#8221; VoIP saves me personally about $1000 in telecom charges &#8211; and about as much per telecommuting employee for the company.</p>
<p>Google is about half way there in terms of service offering with GrandCentral VoIP solution. It needs just enough bandwidth &#8211; either on its own or with cable/media companies &#8211; to offer Gizmo ( standards based/open source Skype alternative) like service in well rounded package for the mass adoption &#8211; with &#8220;free&#8221; adapters converging your phones and PCs into &#8220;gvoice&#8221; service.  If played well, Skype would either have to give in its &#8220;lock&#8221;/switch to VoIP or face massive drop out rate in the phone area &#8211; the main source of their income.</p>
<p>With &#8220;always on&#8221; network devices in our pockets we are looking at almost unlimited set of applications &#8211; personal automated voice driven assistants that would help you to choose (from the &#8220;advertisers and rating lists&#8221;) all the services and products based on location, preferences and &#8220;history&#8221; that you might have for better or worth. And  believe me, these are very addictive &#8211; more then music or video on the go. That means more c/java me for selected few and a lot of Flex apps for convergence UI for the rest of us.</p>
<p>Happy New Year!</p>
<p>Sincerely,</p>
<p>Anatole</p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/12/31/my-prediction-for-2008-for-developers/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A Quick Analysis of BlazeDS Offering</title>
		<link>http://flexblog.faratasystems.com/2007/12/20/quick-analysis-of-blazeds-offering</link>
		<comments>http://flexblog.faratasystems.com/2007/12/20/quick-analysis-of-blazeds-offering#comments</comments>
		<pubDate>Thu, 20 Dec 2007 14:28:31 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=277</guid>
		<description><![CDATA[Release of BlazeDS is a great help from the Flex enterprise adoption perspective. The high licensing costs of the server side components has been a major obstacle for Flex adoption for some of our clients over the last 2 years. As most solution providers, we had to roll out third-party replacements of Adobe&#8217;s AMF implementation [...]]]></description>
			<content:encoded><![CDATA[<p>Release of BlazeDS is a great help from the Flex enterprise adoption perspective. The high licensing costs of the server side components has been a major obstacle for Flex adoption for some of our clients over the last 2 years. As most solution providers, we had to roll out third-party replacements of Adobe&#8217;s AMF implementation &#8211; mostly built around openAMF and other open source products. With BlazeDS available within few month, the performance, support and the future of the codebase is no longer a concern, and should greatly simplify Flex adoption by enterprises.</p>
<p>On the technical side, BlazeDS provides a lightweight replacement for LiveCycle Data Services ES. The remoting part seems to be identical to the LCDS offering. If you just use BlazeDS WAR, just roll out a regular &#8220;LCDS-like&#8221; deployment, and the chances are it will work without the need to do any changes.  For the messaging and data management services, however,  there are significant differences. You might want to analyze those before plunging into either product.</p>
<p>The client-side of the messaging stays very much the same &#8211; you use the same Producers and Consumers, so there are virtually no changes in the client code. The BlazeDS is packaged with a pre-configured Tomcat server with messaging built-in (an open source ActiveMQ), greatly reducing the complexity of the initial setup.</p>
<p>The implementation of the server piece is very different though. Unlike LCDS that launches an independent Java socket server within each application, BlazeDS uses the regular Web server sockets. LCDS uses non-blocking IO that offers better scalability (we had it @ 10000 users / CPU till we maxed out on the outgoing bandwidth). With LCDS, you need either a separate port or an IP address to handle the data stream. BlazeDS does not use non-blocking IO &#8211; so you can not expect to have  more than a few hundreds users per CPU at best. On the positive side, it makes the process of application development a bit simpler as the session context becomes available.</p>
<p>With BlazeDS going open source and abundance of Java expertise in the market place you can expect non-blocking I/O offerings from third parties shortly after the BlazeDS release. It would also mean faster recoverability of the connections that is important for the real-time applications.</p>
<p>The Data Management Services interface is COMPLETELY omitted from the current BlazeDS offering. This SUCKS. While it is understandable from the marketing standpoint, it will hurt Adobe in the long run. Some trivial, non-functional classes have to be included in both client and server version of BlazeDS libraries. All datatypes that go over the wire and allow users to maintain compatibility between BlazeDS and LCDS are desperately needed. A short list would include  ChangeObject interface, DataSyncException and such that are used in the custom server and client code.</p>
<p>I could care less about a Hibernate Assembler and implementation classes but high-level WIRE PROTOCOL has to be the same.  As a solution provider, I have to go with the lowest denominator of what is available across platforms, and lack of common classes interfaces hurts the code portability. Given the current license restrictions on the &#8220;mx&#8221; and &#8220;flex&#8221; namespaces in the current open source sdk it makes impossible to provide such solution in the nearest future.</p>
<p>Other thing people often forget about the PDF support in LCDS, which won&#8217;t be available in BlazeDS. The printing support in Flex is very light, and PDF generation is often a preferred solution for printable documents. Fortunately, you can split your application deployment now and have dedicated &#8220;print server&#8221; with LCDS or any other Adobe enterprise product that includes that capability.</p>
<p>Sincerely,<br />
Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/12/20/quick-analysis-of-blazeds-offering/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shopping for GPhone this holiday season.</title>
		<link>http://flexblog.faratasystems.com/2007/12/13/shopping-for-gphone-this-holiday-season</link>
		<comments>http://flexblog.faratasystems.com/2007/12/13/shopping-for-gphone-this-holiday-season#comments</comments>
		<pubDate>Thu, 13 Dec 2007 20:09:20 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=270</guid>
		<description><![CDATA[I know, it is not supposed to be out till late next year. But I can&#8217;t wait, so in the next couple of months or so I will try to whip up a perfect phone for myself from the available components.
Recently we&#8217;ve got a number of calls from both startups and established IP telephony companies [...]]]></description>
			<content:encoded><![CDATA[<p>I know, it is not supposed to be out till late next year. But I can&#8217;t wait, so in the next couple of months or so I will try to whip up a perfect phone for myself from the available components.</p>
<p>Recently we&#8217;ve got a number of calls from both startups and established IP telephony companies looking to put RIA into work for the phone market. The telephone industry is going through a major shift in the next year. 3G becomes a standard feature of the cell phones, very much like cameras 3-4 years ago. Combined with GPS and phone service, and upcoming voice/text automation it becomes a very powerful device.</p>
<p>I will run this project as a research one, to see the problems and opportunities. My initial set of &#8220;phones&#8221; will include a reasonably small set, but I welcome any suggestions of what will get us close to the perfect phone. I will run the &#8220;mini&#8221; review, pros and cons, what works (for me), designs, etc.</p>
<p>Here is the initial set:</p>
<p>AT&#038;T Tilt Windows smartphone</p>
<p>Sprint Blackberry  &#8211; current &#8220;business phone&#8221;<br />
E28 Linux Smartphone</p>
<p>Nokia tablet</p>
<p>iPhone &#8211; UI design concept</p>
<p>Also will see what can be done with personal gateway  &#8211; basically will use  SIP Asterisk PBX connected with cell gateway as an application platform for SIP/Telephone integration</p>
<p>I will start sharing my initial thoughts on the perfect business cell phone and home automation this week.</p>
<p>Hope it will be fun</p>
<p>Anatole</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/12/13/shopping-for-gphone-this-holiday-season/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quick solution for Flex deployment with  SSL Accelerators / Proxies</title>
		<link>http://flexblog.faratasystems.com/2007/12/13/quick-solution-for-flex-deployment-with-ssl-accelerators-proxies</link>
		<comments>http://flexblog.faratasystems.com/2007/12/13/quick-solution-for-flex-deployment-with-ssl-accelerators-proxies#comments</comments>
		<pubDate>Thu, 13 Dec 2007 20:06:09 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=275</guid>
		<description><![CDATA[Once you developed and tested Flex application locally you need to move it to the secured hosting environment to share it with the world. Usually, for simplicity/performance enterprises deploy J2EE servers behind standalone SSL accelerators/load balancers/proxies. It means that client sends data via SSL channel to SSL appliance, which in turn calls your server on [...]]]></description>
			<content:encoded><![CDATA[<p>Once you developed and tested Flex application locally you need to move it to the secured hosting environment to share it with the world. Usually, for simplicity/performance enterprises deploy J2EE servers behind standalone SSL accelerators/load balancers/proxies. It means that client sends data via SSL channel to SSL appliance, which in turn calls your server on the  intranet via unsecured HTTP to minimize the processing cost.<br />
You can configure the channel/endpoint in services-config.xml, but it would mean separate build for deployment. Here is an alternative &#8220;runtime&#8221; approach:</p>

<div class="wp_codebox_msgheader"><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p275code2'); return false;">Run-time redirection of AMF calls to HTTPS</a> </span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2752"><td class="code" id="p275code2"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">messaging</span>.<span style="color: #006600;">config</span>.<span style="color: #006600;">ServerConfig</span>;
&nbsp;
<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> preinitializeApplication<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
   const reUrl:RegExp  = <span style="color: #66cc66;">/</span><span style="color: #66cc66;">&#40;</span>http<span style="color: #66cc66;">|</span>https<span style="color: #66cc66;">&#41;</span>:\<span style="color: #66cc66;">/</span>\<span style="color: #66cc66;">/</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>^:<span style="color: #66cc66;">&#93;</span>+<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>:<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>^<span style="color: #66cc66;">@</span><span style="color: #66cc66;">&#93;</span>+<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>?<span style="color: #66cc66;">@</span><span style="color: #66cc66;">&#41;</span>?<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>^:\<span style="color: #66cc66;">/</span><span style="color: #66cc66;">&#93;</span>+<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>:<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span>-<span style="color: #cc66cc;">9</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#123;</span><span style="color: #cc66cc;">2</span>,<span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>?<span style="color: #66cc66;">&#40;</span>\<span style="color: #66cc66;">/</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>\w<span style="color: #808080; font-style: italic;">#!:.?+=&amp;%@!\-\/]+))?/;</span>
   const appUrl:<span style="color: #0066CC;">String</span> = Application.<span style="color: #006600;">application</span>.<span style="color: #0066CC;">url</span>;
   const parts:<span style="color: #0066CC;">Array</span>   = reUrl.<span style="color: #006600;">exec</span><span style="color: #66cc66;">&#40;</span>appUrl<span style="color: #66cc66;">&#41;</span>;
   <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">!</span>parts<span style="color: #66cc66;">&#41;</span>
      <span style="color: #0066CC;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">Error</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Invalid URL: &quot;</span> + appUrl<span style="color: #66cc66;">&#41;</span>;
      <span style="color: #808080; font-style: italic;">/*
      (&quot;Protocol:&quot; + parts[1]);
      (&quot;User: &quot;    + parts[3]);
      (&quot;Pass: &quot;    + parts[5]);
      (&quot;Host: &quot;    + parts[6]);
      (&quot;Port: &quot;    + parts[8]);
      (&quot;Path: &quot;    + parts[10]);
      */</span>
      <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>parts<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span> == <span style="color: #ff0000;">&quot;https&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
         const channels:XMLList  = ServerConfig.<span style="color: #0066CC;">xml</span>..<span style="color: #006600;">channels</span>.<span style="color: #006600;">channel</span>;
         <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> channel:<span style="color: #0066CC;">String</span> <span style="color: #b1b100;">in</span> channels<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>channels<span style="color: #66cc66;">&#91;</span>channel<span style="color: #66cc66;">&#93;</span>.<span style="color: #66cc66;">@</span><span style="color: #0066CC;">type</span>==<span style="color: #ff0000;">&quot;mx.messaging.channels.AMFChannel&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            channels<span style="color: #66cc66;">&#91;</span>channel<span style="color: #66cc66;">&#93;</span>.<span style="color: #66cc66;">@</span><span style="color: #0066CC;">type</span>=<span style="color: #ff0000;">&quot;mx.messaging.channels.SecureAMFChannel&quot;</span>
            <span style="color: #000000; font-weight: bold;">var</span> endpoint : <span style="color: #0066CC;">XML</span> = channels<span style="color: #66cc66;">&#91;</span>channel<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">endpoint</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span>;
            <span style="color: #000000; font-weight: bold;">var</span> uri:<span style="color: #0066CC;">String</span> = endpoint.<span style="color: #66cc66;">@</span>uri
            uri = uri.<span style="color: #006600;">replace</span><span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">/</span>^http:<span style="color: #66cc66;">/</span>, <span style="color: #ff0000;">&quot;https:&quot;</span> <span style="color: #66cc66;">&#41;</span>;
            uri = uri.<span style="color: #006600;">replace</span><span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">/</span>\<span style="color: #66cc66;">&#123;</span>server.<span style="color: #006600;">port</span>\<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">/</span>, <span style="color: #ff0000;">&quot;443&quot;</span> <span style="color: #66cc66;">&#41;</span>;
            endpoint.<span style="color: #66cc66;">@</span>uri = uri;
         <span style="color: #66cc66;">&#125;</span>
      <span style="color: #66cc66;">&#125;</span>
   <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>As you can see, we check if the application is deployed over https and redirect regular remoting requests to https thus modifying deployment descriptors in the runtime.</p>
<p>Enjoy,</p>
<p>Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/12/13/quick-solution-for-flex-deployment-with-ssl-accelerators-proxies/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data Binding with Objects</title>
		<link>http://flexblog.faratasystems.com/2007/11/28/data-binding-with-objects</link>
		<comments>http://flexblog.faratasystems.com/2007/11/28/data-binding-with-objects#comments</comments>
		<pubDate>Wed, 28 Nov 2007 18:48:05 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=272</guid>
		<description><![CDATA[Recently I started to see more and more cases when people have to abandon strongly typed classes but want to keep an ability to keep binding working. Here is a brief recap of typical problem/solution.
Flex Framework usage of binding is one of the most important productivity features. Ability to declaratively define reaction to the changes [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I started to see more and more cases when people have to abandon strongly typed classes but want to keep an ability to keep binding working. Here is a brief recap of typical problem/solution.</p>
<p>Flex Framework usage of binding is one of the most important productivity features. Ability to declaratively define reaction to the changes in the data or components state greatly simplifies programming and reduces errors related to low-level coding.</p>
<p>In order for binding to work you need to make sure changes to the data are known to the framework. Unlike most of dynamic languages implementations, ActionScript 3 is built for speed and heavily utilizes direct access to the properties and methods. In this situation the only way for data to notify the world about the changes is to embed the code to fire chamge events.</p>
<p>Flex compiler helps in a big way by introducing [Bindable] and [Managed] tags. If you prefix your variable with [Bindable] tag, compiler does the following:<br />
1. Inspects every public property and setter of you variables class and generates wrapper getters/setters that adds event notification.<br />
2. Every time &#8220;bindable&#8221; property is being used, compiler references these getters/setters instead of original properties</p>
<p>Obviously it does not work too well with dynamic data of type &#8220;Object&#8221; coming from server. The problem is alleviated a bit by the fact that Flex would automatically wrap the Object in the ObjectProxy if default value of &#8220;makeObjectBindable=true&#8221; of the service is not modified. However, it will wrap only the top level and not the individual array members making changes to those undetectable. For example, if you are passing set of the objects from assembler, and the members can have arrays, the changes to the rows are not going to fire change events unless you explicitly wrap every array element in the object proxy.</p>
<p>Here is an example:<br />
private function onResult(r:ResultEvent) : void {<br />
var quotes:ArrayCollection = r.result.quotes;<br />
var wrappedQuotes = new ArrayCollection();<br />
for each (var quote in quotes)<br />
wrappedQuotes.addItem(new ObjectProxy(quote))<br />
view.dataProvider = wrappedQuotes;<br />
}</p>
<p>ObjectProxy is very expensive and should not be used with large amount of data. For large datasets please consider strongly typed classes that will support [Bindable] on members level.</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/11/28/data-binding-with-objects/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex Roadmap – Building a highway, Part 2</title>
		<link>http://flexblog.faratasystems.com/2007/10/20/flex-roadmap-%e2%80%93-building-a-highway-part-2</link>
		<comments>http://flexblog.faratasystems.com/2007/10/20/flex-roadmap-%e2%80%93-building-a-highway-part-2#comments</comments>
		<pubDate>Sat, 20 Oct 2007 21:19:04 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=260</guid>
		<description><![CDATA[The second most interesting notion I got from the MAX was subtle feeling that Adobe is playing completely different game this year. MAX got bigger – that was expected. MAX brought a lot of different kinds of people, and  the previous events did not – also expected. What was less expected was the feeling that [...]]]></description>
			<content:encoded><![CDATA[<p><font size="3" face="Calibri">The second most interesting notion I got from the MAX was subtle feeling that Adobe is playing completely different game this year. MAX got bigger – that was expected. MAX brought a lot of different kinds of people, and  the previous events did not – also expected. What was less expected was the feeling that Adobe targets Flex to the mass market that was almost not present @ MAX. </font></p>
<p><font size="3" face="Calibri">I am talking about PHP, Rails and the likes developers, which are being treated as first class citizens in the new Adobe world. There were very few of them in the audience. Most of them work as independents – the cost of the show was prohibitive to many.  Nevertheless the sessions were stacked in favor of “lighter” server and protocols integration. New announced Flex pricing also lowers the entrance cost for non-enterprise developers.</font></p>
<p><font size="3" face="Calibri">That is also evident in the way Flex tooling progresses. New wizards for server binding are “classical” for PHP/old ASP folks that recently moved to AJAX world. They are nowhere close to the enterprise-level DataServices introduced in Flex 2. The communication libraries have been separated recently, with a lot of work being done to make WebServices and other XML-based technologies viable for larger Flex applications and mash-ups.</font></p>
<p><font size="3" face="Calibri">So far, Flex adopted  was mainly driven by very few groups – Flash programmers and J2EE developers. Resources are scarce, and Adobe marketed Flex as a new generation of Flash – very high risk proposition in this situation. It is common believe that programmers can’t do good design.  It is equally harsh on Flash designers to write the programs. There is a limit beyond which art-oriented people find themselves  in a completely foreign territory. Companies that hire Flash developers to lead Flex projects will learn it hard way.</font></p>
<p><font size="3" face="Calibri">How will it affect Flex adoption and positioning in enterprises and mid-sized businesses?  The next year will be interesting one.  Finally there is a competition from Microsoft. Keep your flame mails to yourself &#8211; it does not matter how much better or worse their product is – it is up to people to choose the tool and build something with it. People go either for easy or familiar first. I do believe that tools will be just as important as the player ubiquity or appeal. </font></p>
<p><font size="3" face="Calibri">As far as tooling goes, Flex usability is definitely improving. Aside from the performance, Java developers can use Flex 3 almost “naturally”. Great job, Flex Team.  Making working environment easier is what Flex really needs in the coming year. The only “deciding” complaint I have heard from Eclipse and MS Visual Studio users was not about framework or integration, but about the environment.</font></p>
<p><font size="3" face="Calibri">That brings in the third “main” Flex theme of the MAX – going Open Source(OS).  Open Source appeals to a lot of people, and Adobe certainly hopes to increase community involvement in their products. With the end of J2EE era, it is expected that companies and individuals who championed OS 5-10 years ago will come aboard.  Again, MAX might have been running ahead of their attendants here – not too many showed up at OS gatherings.</font></p>
<p><font size="3" face="Calibri">There were very few sessions on the open source (the most complete was done by Matt Chotin, need to publish my notes or find link online), and they did not bring large crowds. Interesting news were circulated in form of rumors, which means that we can expect big announcements in this area in 3-4 months. </font></p>
<p><font size="3" face="Calibri">There are high hopes of the OS movement for Flex. But this time around it might be a different game. Reliance on OS to win enterprise and businesses adoption seems to me the most difficult and risky part of Adobe strategy.</font></p>
<p><font size="3" face="Calibri">Do not get me wrong. I love open source – it is definitely a relief after 20 years of breaking and fighting “black boxes”.  I gladly read and “adopt” open source libraries and contribute the results back. As a company we release significant part of our research and development as open source as a way to insure we can reuse our code for different clients as well as share it with the community. Releasing something as an open source product and driving adoption is the simplest way to protect IP for small companies and insure they keep control of the process.</font></p>
<p><font size="3"><font face="Calibri">Businesses grew a bit tired of OS over the time, and going in with OS solution sometimes means more trouble than it is worth.  </font></font></p>
<p><font size="3" face="Calibri">First thing is the licensing. Relationships between enterprises, developers, distributors, etc are often “interesting”. Quite often the companies require you to not have or use OS software in your product. </font></p>
<p><font size="3" face="Calibri">Second is the effect of old switch-and-bait game. Open source was at its peak when software industry was in recession; selling support for OS products was the only source of money. Industry moved from software as a product (cheap and working) to software as a service (needs a little push from knowledgeable person, info is scarce) – and the real cost of software for enterprises skyrocketed.  Even if the intentions are good this time and we get commercial grade software as OS the perceptions are there.</font></p>
<p><font size="3" face="Calibri">I am looking forward to get my hands dirty with Flex compiler as soon as it goes OS – we have loads of things we need to expand there or have to keep “external” for now. The goal is to make it usable for our enterprise and business clients. Large applications need better tools for modularity and build process, performance, diagnostics, language extensions, etc. It will be very interesting to see how this last big “problematic” piece is going to sail through the community process.</font></p>
<p><font size="3" face="Calibri"> </font></p>
<p><font size="3" face="Calibri">Sincerely,</font></p>
<p><font size="3" face="Calibri">Anatole Tartakovsky</font></p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/10/20/flex-roadmap-%e2%80%93-building-a-highway-part-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex Roadmap – Back to the Future, Part 1</title>
		<link>http://flexblog.faratasystems.com/2007/10/08/flex-roadmap-%e2%80%93-back-to-the-future-part-1</link>
		<comments>http://flexblog.faratasystems.com/2007/10/08/flex-roadmap-%e2%80%93-back-to-the-future-part-1#comments</comments>
		<pubDate>Mon, 08 Oct 2007 16:35:31 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex 2]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=255</guid>
		<description><![CDATA[One of the most interesting sessions during Max 2007 was Ely Greenfield’s “Flex RoadMap” .  It actually had a flair of developer-to-developer conversation rather than a demo or promotion – more on “why” Flex Team is moving in this direction. Unfortunately, the feedback from the audience was rather weak as most of the people [...]]]></description>
			<content:encoded><![CDATA[<p><font face="Calibri"><font size="3">One of the most interesting sessions during Max 2007 was Ely Greenfield’s “Flex RoadMap” .  It actually had a flair of developer-to-developer conversation rather than a demo or promotion – more on “why” Flex Team is moving in this direction. Unfortunately, the feedback from the audience was rather weak as most of the people were stunned by the approach taken.  I felt compelled to compose my thoughts and re-evaluate my experience before I will come with any feedback on the subject. </font></font></p>
<p><font face="Calibri"><font size="3">The reason being that we walked that road in the past; we still are using that methodology in our Flex work. Having support for it from the tool vendor will change both adoption rate and the way people approach it.</font></font><font face="Calibri"><font size="3">The idea behind new set of tools in development is pretty powerful and simple:  </font></font></p>
<p><strong><font face="Calibri"><font size="3">Take large controls that we have in frameworks and libraries and layer them in relatively small and specialized layers of loosely bound reference implementations.  </font></font></strong></p>
<p><font face="Calibri"><font size="3">The layers can be UI elements, skinning, layout, data binding, view controllers, etc that compose a typical framework control.  Each layer is completely replaceable or better yet each control is being assembled for an application from “parts” by a team of designers, programmers, model designers, etc. As long as it can be expressed as an XML markup, design tools can produce these layers thus providing interchangeable implementation of design or other aspects.</font></font><font face="Calibri"><font size="3"> </font></font></p>
<p><font face="Calibri"><font size="3">We used this approach as core methodology in the past and were very happy with the results.  In the beginning of RIA era (1999) IE version of DHTML had so-called “behaviors”. You could have attached these XML/script combo components to any tag or create your own tags. They could be small – just to add a presentation/effect like rollover or provide intelligent links or tooltips. We also had the &#8220;monster&#8221; ones representing DataGrid, Report, Tree, and TabFolder to name a few.  You could have attached multiple behaviors to a single tag providing control with a superset of functions – the same rollover/selection effect would work on DataGrid and Tree in the same way.</font></font></p>
<p><font face="Calibri"><font size="3"> Data binding was just another behavior shared across multiple controls. Within a year after adoption our home-grown framework had over a hundred of such components that we customized and delivered to clients in a way that was the most beneficial to them. We&#8217;ve also built an IDE to support these components, but for me it was simpler to “notepad” it with a smart XML editor.</font></font></p>
<p><font face="Calibri"><font size="3">It was a very simple model as it was built on top of C++/OLE world supporting multiple inheritance/vtables. Each behavior would automatically expose its public methods, event model and properties. The order of attachments would define the priority. If you wanted to specify particular behavior, you just use behavior name as intermediate selector before property/method name.  You can even layer different languages as behaviors  &#8211; we would use XSLT styling as one of the behaviors. That was the simplest aggregation model I ever seen in world of C++/OLE or anywhere – even in the modern dynamic languages.</font></font></p>
<p><font face="Calibri"><font size="3">Flash 9 VM does neither supports multiple inheritance nor dynamic resolvers (to the best of my knowledge), and Proxy approach might not be good for regular application developers. Now it might be a good time to start adding that functionality back in Flash 9 sub releases and definitely in the Flash 10 to go head-to-head with rails and other modern languages. You really need to apply aspect based programming methodology on system level to afford this approach – or have tools to do it under the cover. However, I feel that the tools approach will take longer and will cause slower adoption.</font></font></p>
<p><font face="Calibri"><font size="3">The power of externalizing the functionality is just awesome. You clean up a lot of code, and get more choices in the process.  Reusability of the code becomes obvious. It takes some time to learn, but it makes you a better thinker. All cumbersome patterns go away as you concentrate on one thing at a time.</font></font></p>
<p><font face="Calibri"><font size="3"> We never gave up on this architecture, and it proves to be the most powerful feature of our current framework of Flex components. I will publish some samples this week to show how trivial the code looks like in comparison to typical Flex programs yet delivering more functionality.</font></font></p>
<p><font face="Calibri"><font size="3">Ely presented architectural diagrams illustrating how things are interconnected now and how they can change in the new architecture, and I could not help seeing it as a live biological  system going through a major transformation.  Application components are the cells of the living and breathing application. In the current development we are integrating more and more specialized creatures without their own DNA (hence viruses) directly in the cells using ever extending set of backdoors. Managing viruses is a nasty business, taking all kinds of the resources. Proposed  architecture is more of bacterial helpers, attaching to the cells, but not breaking in, exchanging energy and processing waste. It holds better promise over brutal methodology of “gene engineering” and provides open space of growing specialized “cultures”. Count me in.</font></font></p>
<p><font face="Calibri"><font size="3">Sincerely,</font></font></p>
<p><font face="Calibri"><font size="3">Anatole Tartakovsky</font></font></p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/10/08/flex-roadmap-%e2%80%93-back-to-the-future-part-1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why people believe the code generators are bad?</title>
		<link>http://flexblog.faratasystems.com/2007/10/05/why-people-believe-the-code-generators-are-bad</link>
		<comments>http://flexblog.faratasystems.com/2007/10/05/why-people-believe-the-code-generators-are-bad#comments</comments>
		<pubDate>Fri, 05 Oct 2007 05:27:03 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex 2]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=254</guid>
		<description><![CDATA[That came about during the best practices show. One of the panel speakers, while making a disclaimer that he is not hands-on, said that he does not believe in code generators. At that point I just thought it was funny as it goes along the line “Why people who do not wash dishes think that [...]]]></description>
			<content:encoded><![CDATA[<p><font size="3" face="Calibri">That came about during the best practices show. One of the panel speakers, while making a disclaimer that he is not hands-on, said that he does not believe in code generators. At that point I just thought it was funny as it goes along the line “Why people who do not wash dishes think that  dish washing machines are not needed?”. But after the show I met a few people and some thought that application generators should be avoided. I was not able to find out “why” though &#8211; it was more of the way they felt rather than a argument. So why do they <strong><em><u>feel</u></em></strong> that way?</font></p>
<p><font size="3" face="Calibri">I do not know.  Let us do a mall exercise first.  Open a new Flex project and create a new FDS application project. Before you even write a single line of code Flex creates 30 files and  120+KB of code in background. You can see them by adding –keep switch to the compilers command line.  Before you are finished with login screen you have 100 files in the generated folder.  Is it good or bad?</font></p>
<p><font size="3" face="Calibri">It is expected. It is good in a sense that you do not have to write this code yourself. It is good that it will be compiled rather the interpreted giving you the best performance possible. </font></p>
<p><font size="3" face="Calibri">Code generators are essential part of every IDE product and there is not need to debate this. Every productivity language/compiler (starting from Assemblers to C to C++ and the modern ones) has some code generators built into it. Most of software development tools I know are using code generators of some kind. Another example – if you are the programmer who are just filling the blanks in someone&#8217;s framework as oppesoed to being a  creative writer &#8211; you are also a code generator to some degree. </font></p>
<p><font size="3" face="Calibri">There are good and bad code generators, but they are not solving their problems, but rather helping you in solving your application&#8217;s problems. They are just the power tools that implement best practices for solving domain problems. </font></p>
<p><font size="3" face="Calibri">People take domain-specific problems (either in the form of code annotations or just a as a standalone resource like UML in which you embed a host language) and generate the code that you can see and modify. You are doing it every day. For example, Flex processes annotations embedded in the ActionScript and MXML. So when you use [Bindable], [Managed] , [Event] or just include CSS references you are telling Flex code generators that you want certain patterns applied to this code fragment, and Flex generates a bunch of files in the background. You really have to be hands-off to use and denounce code generators in the same time.</font></p>
<p><font size="3" face="Calibri">Code generators are getting better and better. Bugs are eliminated, the language flexibility increases, new domain problems are added and automated. The best optimizing compiler produce better code (efficient, compact or anything in between) then any human.  With alphas and betas of Flex, I&#8217;ve been studying the code in the folder </font><font size="3" face="Calibri">generated </font><font size="3" face="Calibri">. After a wile, the entire process became completely transparent to me. </font></p>
<p><font size="3" face="Calibri">Our code generators belong to the 3<sup>rd</sup> generation. They work in background, generate and insert the into “invisible” locations. You do not need to see this code or build the resulting code separately. They perform hot deployment and provide automated and visual test code. You apply your code changes directly in the mix of the application code and domain annotations. You never have to see generated files – or at least not more often then you have to see files generated by Flex. For certain types of applications one person can be as productive as 3-4 developers. He does it faster and with less effort. The concepts of code visibility and rules of generated code invocation are identical with Flex even though the products are coming from different environments, but after all these are common best practices of the modern software development.</font></p>
<p><font size="3" face="Calibri">I think the problem is that most of the people think of generated code as source. Let me give you another example. We take a Java file with some SQL or other annotations and run it through our code generator. It produces the DAO and Assembler classes, multiple DTOs, deployment descriptors, deploys the jars and places all low level artifacts that you do not need to touch (ever) in your Flex project. That is where most code generators stop. We made sure that our generators are fully open; you can add templates for generating other type of code and modify the existing ones. </font></p>
<p><font size="3" face="Calibri">Over time, your reference implementations will have templates for databound datagrids, forms, master/details forms, reports, TreeGrids and other <strong><em><u>TEST</u></em></strong>  samples for people to try the power of  really fast development. The main target with the products are metalanguage files disguised as MXML extensions. However, people can take test the code and happily embed it in application. The changes come and they have to propagate these changes manually – and they say the process does not work. </font></p>
<p><font size="3" face="Calibri">That process indeed does not work – but it&#8217;s not the code generator’s fault. It just means that while the tool was working with annotations in <strong><em><u>Java</u></em></strong> and users somehow expected it work transparently on Flex side (and we did not have any annotations there yet). In order to achieve the  synchronization between Flex and Java,  you need another code generator that would allow you to process Flex annotations in the Flex compiler. We requested that feature in compiler over a year ago, and I was told it is in the plans for Flex 4 <img src='http://flexblog.faratasystems.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . However, as soon as Flex compiler goes open source, it should be fairly simple to embed your own code generators that would enable synchronization. For now, when we need to augment Flex with business domain functionality like business expressions a la Excel or Powerbuilder, we run source-to-source generators that are transparent to the developer.</font></p>
<p><font size="3" face="Calibri">Sincerely,</font></p>
<p><font size="3" face="Calibri">Anatole Tartakovsky</font></p>
<p><font size="3" face="Calibri">PS. I wrote these notes on the flight home. These morning I thought about other things, and I believe I got an idea why some people  do not believe in code generators:</font></p>
<p><font size="3" face="Calibri">1.</font>       <font size="3" face="Calibri">They were much younger than me. Coming from the times when bytecode referred to bytecode of CPU, quest for Productivity Holy Grail is automatic for me. And experience with preprocessors, RADs, 4GLs and metalanguages allows me to see different implementations of generators as probably the most powerful way to incorporate best practices . Here is how I see it: It is ok to teach people how to recognize patterns and communicate among themselves using these patterns. A code generator is a way to communicate these patterns to the computer in the best possible implementation using the input provided by people using the patterns.</font></p>
<p><font size="3" face="Calibri">2.</font>       <font size="3" face="Calibri">Somebody needs to explain people the difference between code generators and <strong><em><u>source</u></em></strong> code generators. A lot of people went to preceding Flex 3 sessions where they saw dialogs based code generation for PHP. They automatically associate (that’s what people do best after all) the CRUDe source  generator with the similar functionality provided by domain extensions of our code generators. Well, if I&#8217;ll ever be invited to participate in a keynote, I&#8217;ll try to explain it to more people so there won&#8217;t be any confusion <img src='http://flexblog.faratasystems.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </font></p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/10/05/why-people-believe-the-code-generators-are-bad/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Best Flex Practices at Adobe Max 2007 – Recap</title>
		<link>http://flexblog.faratasystems.com/2007/10/03/best-flex-practices-at-adobe-max-2007-%e2%80%93-recap</link>
		<comments>http://flexblog.faratasystems.com/2007/10/03/best-flex-practices-at-adobe-max-2007-%e2%80%93-recap#comments</comments>
		<pubDate>Wed, 03 Oct 2007 13:52:44 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=252</guid>
		<description><![CDATA[I really enjoyed being on the panel of “Flex Best Practices”. The room was packed, so I have to guess some people did not have chance to get in. This is my recollection ( if memory serves me right – it is 11PM here in Chicago, after Adobe party and quite a few beers. I [...]]]></description>
			<content:encoded><![CDATA[<p>I really enjoyed being on the panel of “Flex Best Practices”. The room was packed, so I have to guess some people did not have chance to get in. This is my recollection ( if memory serves me right – it is 11PM here in Chicago, after Adobe party and quite a few beers. I am planning to keep it short, so I will stick just to Joe Berkovitz questions and my answers. I will add small points here and there that I might skipped during the panel due to the time constrain. I will post links here when other panel participants will blog their takes on the subject.<br />
<em><strong>Joe Berkovitz:</strong> …I have Steven Webster, from Adobe Consulting, known for his advocating and work on Cairngorm framework, Dave Wolf, VP of Consulting at Cynergy Systems, he heads Flex Consulting Practice, David Colleta is Principal Software Engineer at Virtual Ubiquity which created Buzzword software as you have seen in the presentations today and Anatole Tartakovsky, he is a Managing Principal at FarataSystems, they are doing a lot of great work on frameworks, Flex tools and products, very ambitious and interesting things. I am working as VP of engineering at Allurent, you might have seen RIA demo of our work at keynote presentation today and it is a work of the company I am working for. … So the first question is when to use MXML vs ActionScript, more traditional object oriented language?</em></p>
<p><strong>Anatole Tartakovsky: </strong>We are trying to balance it by type of the functionality and type of the people writing the code. As David said, with pure UI markup you are better off with MXML as it generates tons of ActionScript behind the scene you would have to write by hand otherwise. MXML is painless and easy. For framework and reusable layer you are usually better served with ActionScipt as it gives you better control of object oriented features and forces you to think in more traditional environment. Also, based on the people involved in the project, I want to throw few more things in the mix. First, you might want to add CSS to your MXML files so designers can start playing too. Then you might want to extend MXML with data driven UI or business functionality so business analysts or end-user directly affect UI and behavior of the application. Data-driven is extremely important as it really enables personalization and gives a lot of control either to the systems administrators or end-users. Finally, Java back-end developers really prefer ActionScript classes before they become comfortable with the MXML, especially with automatic code generation of these proxy objects directly from Java code. These criteria’s allow having more people working together without stepping on each other’s toes. In the end, it will all be either compiled or interpreted by ActionScript, but it maximizes the reuse and makes process more manageable.<br />
…<br />
<em><strong>JB:</strong> On the subject of bindings – it is such an interesting feature and it adds so much to language &#8211; one person in the company said that binding is feature that violates encapsulation in very special way. You think you are making just an assignment and all sequence of changes start to happen throughout the application. And I want to hear from the panel what kind of the problems they encountered by using the binding?<br />
</em><strong>AT:</strong> There are cases when binding is not very useful – cases with XML data structures or data that is not strongly typed. Binding of dynamic data classes require you to use descendents of ObjectProxy and that is often more challenging then what it is worth. Another case when it is difficult is when you use controller on the data object and it is not coded properly – you usually want to have either binding or controller – and I personally usually go with binding.<br />
On the other hand, for majority of the applications binding is true blessing as it allows you to write very generic helpers that will do state management, synchronize data with the server, and generally write less code. Flex compiler/framework will generate quite a lot in background, and I encourage you to look in generated code to understand how it will impact your application.<br />
But having automatic end-to-end data binding is a very important feature. Having the ability to load data, modify it and apply on the server represents significant portion of the code you write daily. We are using code generators to produce most of the code on both server and client side: deployment descriptors, DTOs, actual DAO and View MXML, etc..<br />
Code generators support both [Bindable] and [Managed] versions of code binding. We also roll out few our own versions of the implementation, adding events that are part of the client’s requirements or changing timing of the standard events as an example – sometimes it is more appropriate to use them in asynchronous models.<br />
The key is to keep binding “contained” and Flex uses [Array]Collection and their descendents to encapsulate data and act as thin controller that will consume most of the events, and will propagate “aggregated” events to the listening object. It is perfect place to put both generic (like state management) and business (like calculating totals) functionality. Small framework allows you to isolate your application from data binding implementation – including data retrieval and synchronization. We actually provided “open source” implementation of flex data services client in the book and articles.</p>
<p><em><strong>JB:</strong> Moving on other topic, I would like to talk on frameworks. Cairngorm and some other frameworks that I call “shallow” frameworks. They are not necessarily provide a lot of functionality in a sense that Flex frameworks does. It provides what you might call Superpad – a set of interlocking patterns. I wonder if a shallow framework provides cure or actually causes disease by blocking developers from providing solutions and analyzing the problems.<br />
</em><strong>AT:</strong> That is exactly the problem we are seeing. People come to us to rewrite Cairngorm projects. Cairngorm is answering to “how” question, but “why” or “what” just is not in the picture at that point. We believe that you should take some patterns – and enhance them on individual basis for a particular application, but the “meat” of the solution is in the developer’s framework. People need to have big pieces of an application available as components, customizable products that can perform common functions and transparently be used in the application. They are tested and give you the functionality that you want right away. You can start with small, single function components like logger or “caching logging” screen David mentioned, or you can try deep waters with complete set of components that very much fill the gaps in the current Flex frameworks. Over the years, we added objects like Report, DataForm, TreeGrid, OlapTreeGrid, etc. We added the functionality that is important for reliability of your applications like robustness layers for communications. Architectural frameworks are very much like skeleton of the application, and Application Framework is actually adds muscle – you can’t have one and not the other.<br />
<strong><span />JB:</strong> <em>The next question is if you use default HTML template in Flex builder or you feel it is necessary to customize?</em><br />
<strong> AT:</strong> We usually customize the template – primarily for interoperability with external applications or system functions. Typical example is when you need to transfer data to Excel, mashup/history/Search Engine Integration and other system functions. The other sample would be to pass extra flash version specific parameter – for example, the code that would allow application to go full screen.<br />
<span /><em><strong>JB: </strong>What do you think of Designer/Developer workflow?<br />
</em><strong>AT:</strong> I believe that while there are cases when you have designer and developer working “sequentially”, it can greatly extend the development time, which should not be a problem for consulting companies <img src='http://flexblog.faratasystems.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .. If you take this process to extreme, a developer will also wait for the back-end developer to complete code. In turn, a designer would have to wait on business analyst and back-end developer waits on architects/model designer. Given the way things usually are Flex developer will have a tiny fraction of the time to actually implement the application.<br />
The other option is to start working from the functional spec in parallel. It is very much like digging a tunnel from both ends. While there is a chance of meeting somewhere in the middle, it is not easy.<br />
I actually think that you should start from something that is agreed by everyone – start in the middle and dig out. We use Flex in a way that every person on the project can work in parallel. You start with a rather crude version of the generated screen and model, and you do refinements as you go. It is more manageable then it sounds and it is the direction taken by Flex Team for the next versions of the product.<br />
<strong><span /></strong><em><strong>Question from the floor:</strong> How do you deal with the problems with tag like event handling, debugging, etc.<br />
</em><strong>AT:</strong> Modules are designed to be separate applications and while you can establish some patterns via use of interfaces any attempt to make them &#8220;friendlier&#8221; will require more custom code on both sides. We do not to use mx:Module but rather create <strong>library</strong> projects and turn them into “self-initialized” libraries/swfs with automated build process. Every library becomes “swc library” for references from outside code so you can reference classes, get strong data types resolved, etc., It is also compiled and deployed by mxmlc compiler you use to compile Modules as application. The auto generated main object is inherited from SimpleApplication object to save space ( but can be inherited from Module) to be loaded instead of module. In that case you have advantages of referencing the code the same way you would reference object in any other SWC library (you just need to mark it &#8220;external), have strong type support, and load it on demand.<br />
This technique is described in <a href="http://www.theriabook.com">our book</a> and in Flex Developer’s Journal – it&#8217;s available online – just google it.</p>
<p><span /></p>
<p><em>I will be posting on some random thoughts I had during that sessions &#8211; hopefully tonight on the way back</em></p>
<p><span /></p>
<p>Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/10/03/best-flex-practices-at-adobe-max-2007-%e2%80%93-recap/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Custom MetaTags Access &#8211; Thing I did not know about Flex – thanks to Christophe Coenraets in his very inspiring “Local Data Synchronization in AIR” talk this morning</title>
		<link>http://flexblog.faratasystems.com/2007/10/02/custom-metatags-access-thing-i-did-not-know-about-flex-%e2%80%93-thanks-to-christophe-coenraets-in-his-very-inspiring-%e2%80%9clocal-data-synchronization-in-air%e2%80%9d-talk-this-morning</link>
		<comments>http://flexblog.faratasystems.com/2007/10/02/custom-metatags-access-thing-i-did-not-know-about-flex-%e2%80%93-thanks-to-christophe-coenraets-in-his-very-inspiring-%e2%80%9clocal-data-synchronization-in-air%e2%80%9d-talk-this-morning#comments</comments>
		<pubDate>Wed, 03 Oct 2007 03:31:37 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex 2]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=251</guid>
		<description><![CDATA[One cool thing I wished I knew a year and a half ago was a question on how to keep / get additional metatags from the class definition. I actually asked Flex Team members last summer about that feature, but did not get the answer then.
This is embarrassing as you can kind of derive it [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><span style="font-size: 12pt; line-height: 115%">One cool thing I wished I knew a year and a half ago was a question on how to keep / get additional metatags from the class definition. I actually asked Flex Team members last summer about that feature, but did not get the answer then.</span></p>
<p class="MsoNormal"><span style="font-size: 12pt; line-height: 115%">This is embarrassing as you can kind of derive it from documentation if you know it is there, but I asked few Flex experts if they knew about this compiler feature – feel much better now as nobody knew as well.</span></p>
<p style="margin-bottom: 0pt" class="MsoNormal"><span style="font-size: 12pt; line-height: 115%">OK, we are talking about <code>&lt;strong&gt;keep-as3-metadata&lt;/strong&gt;</code><code>=&lt;em&gt;class_name&lt;/em&gt; [&#46;..] option -&nbsp;&nbsp;here is excerpt from help:</code></span></p>
<p style="margin-bottom: 0pt" class="MsoNormal"><span style="font-size: 8.5pt; line-height: 115%">Specifies metadata that you want to keep.</span></p>
<p style="margin-bottom: 0pt; line-height: normal" class="MsoNormal"><span style="font-size: 8.5pt">By default, the compiler keeps the following metadata:</span></p>
<p style="margin: 0in 0in 0pt 12pt; text-indent: -0.25in; line-height: normal" class="MsoNormal"><span style="font-size: 10pt; color: black; font-family: Symbol"> ·         </span><span style="font-size: 8.5pt">Bindable </span></p>
<p style="margin: 0in 0in 0pt 12pt; text-indent: -0.25in; line-height: normal" class="MsoNormal"><span style="font-size: 10pt; color: black; font-family: Symbol"> ·         </span><span style="font-size: 8.5pt">Managed </span></p>
<p style="margin: 0in 0in 0pt 12pt; text-indent: -0.25in; line-height: normal" class="MsoNormal"><span style="font-size: 10pt; color: black; font-family: Symbol">·         </span><span style="font-size: 8.5pt">ChangeEvent </span></p>
<p style="margin: 0in 0in 0pt 12pt; text-indent: -0.25in; line-height: normal" class="MsoNormal"><span style="font-size: 10pt; color: black; font-family: Symbol">·         </span><span style="font-size: 8.5pt">NonCommittingChangeEvent </span></p>
<p style="margin: 0in 0in 0pt 12pt; text-indent: -0.25in; line-height: normal" class="MsoNormal"><span style="font-size: 10pt; color: black; font-family: Symbol">·         </span><span style="font-size: 8.5pt">Transient </span></p>
<p style="margin-bottom: 0pt; line-height: normal" class="MsoNormal"><span style="font-size: 8.5pt">If you want to preserve the default metadata, you should use the += operator to append your new metadata, rather than the = operator which replaces the default metadata.</span></p>
<p style="margin-bottom: 0pt; line-height: normal" class="MsoNormal"><span style="font-size: 8.5pt">This is an advanced option.</span></p>
<p class="MsoNormal"><span style="font-size: 12pt; line-height: 115%" /></p>
<p class="MsoNormal"><span style="font-size: 12pt; line-height: 115%">That means that you can ask compiler to keep information about events your objects declare. You can define your own metatags, and they can be persisted in the class definition as part of objects XML definition.</span></p>
<p class="MsoNormal"><span style="font-size: 12pt; line-height: 115%">You still cannot use metatags at the compile time as compiler stays closed till (and then some time after they open sources it due to standard “acceptance” process), but you can use these annotations in runtime. That opens a whole new world of embedding and using metadata information – that is really a major feature for any framework/component developer. </span></p>
<p class="MsoNormal"><span style="font-size: 12pt; line-height: 115%">I need to do some performance and usability tests, but the way it looks like now it is the most straightforward and efficient way to embed/carry the metadata.</span></p>
<p class="MsoNormal"><span style="font-size: 12pt; line-height: 115%" /></p>
<p class="MsoNormal"><span style="font-size: 12pt; line-height: 115%">Sincerely,<br />
Anatole Tartakovsky</span></p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/10/02/custom-metatags-access-thing-i-did-not-know-about-flex-%e2%80%93-thanks-to-christophe-coenraets-in-his-very-inspiring-%e2%80%9clocal-data-synchronization-in-air%e2%80%9d-talk-this-morning/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MAX Ignite Session &#8211; Making Enterprises Apps Development  Fun with Flex or something like that</title>
		<link>http://flexblog.faratasystems.com/2007/10/01/max-ignite</link>
		<comments>http://flexblog.faratasystems.com/2007/10/01/max-ignite#comments</comments>
		<pubDate>Mon, 01 Oct 2007 14:05:40 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=248</guid>
		<description><![CDATA[  I am making small (5 minutes) presentation at Ignite / Welcome Reception  at Adobe MAX 2007 later today &#8211; talking about making enterprise workspace fun again. I will talk about what works and what does not. 5 minutes is really short time, especially for people who code faster then speak.
Come say hello [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://tinyurl.com/youze7" />  I am making small (5 minutes) presentation at Ignite / Welcome Reception  at Adobe MAX 2007 later today &#8211; talking about making enterprise workspace fun again. I will talk about what works and what does not. 5 minutes is really short time, especially for people who code faster then speak.</p>
<p>Come say hello if you are at MAX, I will also be in the &#8220;ring&#8221; for &#8220;Best Practices&#8221; session on Tuesday.</p>
<p>Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/10/01/max-ignite/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advocating the high-end code generators</title>
		<link>http://flexblog.faratasystems.com/2007/09/04/advocating-the-high-end-code-generators</link>
		<comments>http://flexblog.faratasystems.com/2007/09/04/advocating-the-high-end-code-generators#comments</comments>
		<pubDate>Tue, 04 Sep 2007 19:02:45 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex 2]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=238</guid>
		<description><![CDATA[Recently, I watched  two presentations on the Flex integration with the back-end applications. The presenters have shown how to build a database-enabled applications in &#8211; oh, well &#8211; 55 minutes. And they were using pre-built code and other &#8220;magic&#8221; tricks. In one case, an XML contained SQL that was interprted in the service. The [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I watched  two presentations on the Flex integration with the back-end applications. The presenters have shown how to build a database-enabled applications in &#8211; oh, well &#8211; 55 minutes. And they were using pre-built code and other &#8220;magic&#8221; tricks. In one case, an XML contained SQL that was interprted in the service. The presenter had a  visual wizard to generate code. Both were very generic and dead simple.<br />
That&#8217;s exactly what I did not like. Please don&#8217;t get me wrong. I like it simple. I am also big fan of things that work. Neither of this approaches works <em>for me.</em></p>
<p>I am an old user of SQL tools that allow you to use SQL as a language, provide metrics, execution plans, use statistics, etc. A typical enterprise query can take seconds or hours &#8211; it is up to the programmer in most cases. As far as updates go, they never come by themselves. Transactions, workflow triggers and messaging are just a beginning.</p>
<p>You can try to wrap the generated code or service with additional assemblers. You loose development transparency as these are the wrappers for thing that are going to be re-generated. Additional management, build and fixing errors eats up all time saved by the code generation.</p>
<p>The second problem is with generics. I love to do more stuff with collections, arrays and lists. I also like Object and HashMaps &#8211; <em><strong>in some portions </strong></em>of the code. But strong typing provides performance, size and coding benefits that are hard to overlook.</p>
<p>I am guilty of building both types of code generators in the past. After using them for different industries and applications, I can say that their applicability is very limited: these code generators work for the low-end systems that have very limited use for them in the first place. For most of the systems you have to have a two-way tool, which allows you to write your own code in addition to the generated one.</p>
<p>The productivity environments that interpret back-end data  are mixing SQL as first-class citizens with the application code. That is the only way to reach required flexibility. With compiled languages like Java it is not that simple. In order to achieve high performance and flexibility you need to mix the code but generate artifacts to work with SQL during the compilation stage. Java annotations (and SQL embedding for C++) are <strong><a title="Clear Data Builder" target="_blank" href="http://www.myflex.org">typical technologies that we use</a></strong><br />
The concept is very simple &#8211; you use abstract classes to mix your application code with the abstract methods for SQL code. This abstract methods are annotated with SQL. You can code against strongly typed classes and if the code generation fails, your compiler complains about abstract methods.</p>
<p>With the single point of maintenance we eliminate most of the integration/build issues. You can get the same 55 minutes application done in 5, but important point is that you will not be stuck for days afterwards.</p>
<p>If you have just five (not fifty five) minutes, please watch <strong><a href="http://myflex.org/screencast/cdb_example/cdb_example.html">this pre-recorded demo</a> </strong>of our code generator called Clear Data Builder.</p>
<p>Sincerely,</p>
<p>Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/09/04/advocating-the-high-end-code-generators/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating PDF documents from Flex applications</title>
		<link>http://flexblog.faratasystems.com/2007/08/22/creating-pdf-documents-from-flex-applications</link>
		<comments>http://flexblog.faratasystems.com/2007/08/22/creating-pdf-documents-from-flex-applications#comments</comments>
		<pubDate>Wed, 22 Aug 2007 15:51:45 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=237</guid>
		<description><![CDATA[There are three ways of creating PDF documents from Adobe Flex applications:
• by using the forms/LiveCycle designer &#8211; this process is well documented and requires someone to create XDP form (an Acrobat XML Data Package file), the data model and establish a process of synchronizing Flex application with LiveCycle
• by treating PDF printing as one [...]]]></description>
			<content:encoded><![CDATA[<p>There are three ways of creating PDF documents from Adobe Flex applications:<br />
• by using the forms/LiveCycle designer &#8211; this process is well documented and requires someone to create XDP form (an Acrobat XML Data Package file), the data model and establish a process of synchronizing Flex application with LiveCycle</p>
<p>• by treating PDF printing as one of the features of your Flex application, seamlessly providing printing functionality (with or without LiveCycle Designer)</p>
<p>• by using Snapshots available in LCDS, which uses bitmaps to represent Flash content<br />
While the first process provides guaranteed quality and predictable results, it also requires a double effort of developing XDP and Flex forms and introduces the model and communications that can be foreign to the application domain.<br />
The third type of printing is good for screen-only PDFs due to low DPI used by the screen snapshots. Flex 3 should provide control over the DPI resolution.<br />
The second process is more applicable when the document structure is dynamic (like the end-user customizable report or form). It often produces better printing quality with the current version of LiveCycle Data Services ES (formerly Flex Data Services) Flex. The idea is to send the server not the data for merging with the form, but already merged compressed document in XDP format containing both data and formatting.  In this case LCDS layer just needs to process it with XDPXFAHelper class and returns it as a PDF stream to the browser for displaying.<br />
The next code sample is the server side part written as JavaServer Page (createPDF.jsp). Note, that you need to have a commercial license of LCDS as its Express version does not support PDF generation.<br />
&lt;%@ page language=&#8221;java&#8221;<br />
import=&#8221;java.io.IOException,<br />
javax.servlet.http.HttpServletRequest,<br />
flex.acrobat.pdf.XDPXFAHelper,<br />
java.util.zip.Inflater,<br />
java.util.zip.InflaterInputStream&#8221;<br />
%><br />
&lt;jsp:directive.page import=&#8221;java.io.InputStream&#8221;/><br />
&lt;jsp:directive.page import=&#8221;java.io.ByteArrayInputStream&#8221;/><br />
&lt;jsp:directive.page import=&#8221;java.io.FileInputStream&#8221;/><br />
&lt;jsp:directive.page import=&#8221;java.io.FileOutputStream&#8221;/><br />
&lt;%<br />
//Load compressed XDP stream (received from client)<br />
//into a byte array<br />
byte[] result = new byte[5000000];<br />
int resultLength =0 ;<br />
try {<br />
Inflater decompresser = new Inflater(  );<br />
byte[] ba = new byte[500000];<br />
ServletInputStream si = request.getInputStream();<br />
int k = 0;<br />
int i = 0;<br />
while (true ) {<br />
k = si.read(ba, i, 500000);<br />
i +=k;<br />
if (k&lt;=0) break;<br />
}<br />
try {//Uncompress data into result<br />
decompresser.setInput(ba);<br />
resultLength  = decompresser.inflate(result);<br />
} catch (Exception e) {<br />
System.out.println(e.getMessage());<br />
}<br />
} catch (IOException e) {<br />
throw new ServletException(e);<br />
}</p>
<p>//The next line won’t work unless you have a commercial<br />
// LCDS. It’s not available in Express edition<br />
XDPXFAHelper helper = new XDPXFAHelper();</p>
<p>try { //load the input into PDF convertor<br />
helper.openFromByteArray( result );<br />
} catch (Exception e) {<br />
e.printStackTrace();<br />
}</p>
<p>// Save new PDF as a byte array<br />
byte[] bytes = helper.saveToByteArray();</p>
<p>//Send PDF to the client(GZIP compression can be<br />
// provided by an external filter)<br />
ServletOutputStream out2 = response.getOutputStream();<br />
response.setContentType(&#8220;application/pdf&#8221;);<br />
response.setContentLength(bytes.length);<br />
out2.write(bytes);<br />
out2.flush();<br />
out2.close();<br />
%></p>
<p>On the client (Flex) side, you need a few simple classes. First you would need an ActionScript class that sends generated XDP to the server and opens the browser page for displaying the incoming PDF:<br />
import flash.net.*;<br />
import flash.utils.ByteArray;</p>
<p>public class FormRenderer<br />
{<br />
public static function openPdf(xdp:String,<br />
target:String=&#8221;_blank&#8221;):void<br />
{<br />
var req:URLRequest = new URLRequest(&#8220;/createPDF.jsp&#8221;);    req.method = URLRequestMethod.POST;<br />
var ba :ByteArray = new ByteArray();;<br />
ba.writeMultiByte(xdp, &#8220;iso-8859-1&#8243;);<br />
ba.compress();<br />
ba.position = 0;<br />
req.data = ba;<br />
navigateToURL(req, target);<br />
}<br />
}<br />
}<br />
Now all we need is an XDP file with the data and presentation. While it is feasible to make an XDP file programmatically we usually recommend to start with blank templates made in LiveCycle Designer (comes with Acrobat Professional) matching the printer’s paper size/corporate stationary. XDP documents are XML objects, and EcmaScript for XML (e4x) makes the XDP building process in Flex a breeze. For example:<br />
1. Declare a variable of type XML, and using e4x syntax read the XDP template that matches the document and the paper size. A fragment of XDP template may look like this:<br />
&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?><br />
&lt;?xfa generator=&#8221;AdobeLiveCycleDesigner_V8.0&#8243; APIVersion=&#8221;2.5.6290.0&#8243;?><br />
&lt;xdp:xdp xmlns:xdp=&#8221;http://ns.adobe.com/xdp/&#8221; timeStamp=&#8221;2007-01-25T10:40:38Z&#8221; uuid=&#8221;784f469b-2fd0-4555-a905-6a2d173d0ee1&#8243;><br />
&lt;template xmlns=&#8221;http://www.xfa.org/schema/xfa-template/2.5/&#8221;><br />
&lt;subform name=&#8221;form1&#8243; layout=&#8221;tb&#8221; restoreState=&#8221;auto&#8221; locale=&#8221;en_US&#8221;><br />
&lt;pageSet><br />
&lt;pageArea name=&#8221;Page1&#8243; id=&#8221;Page1&#8243;><br />
&lt;contentArea x=&#8221;0.25in&#8221; y=&#8221;0.25in&#8221; w=&#8221;8in&#8221; h=&#8221;10.5in&#8221;/><br />
&lt;medium stock=&#8221;letter&#8221; short=&#8221;8.5in&#8221; long=&#8221;11in&#8221;/><br />
&lt;?templateDesigner expand 1?>&lt;/pageArea><br />
&lt;?templateDesigner expand 1?>&lt;/pageSet><br />
&lt;subform w=&#8221;8in&#8221; h=&#8221;10.5in&#8221; name=&#8221;YourPageAttachedHere&#8221;/><br />
&lt;proto/><br />
&lt;desc><br />
&lt;text name=&#8221;version&#8221;>8.0.1291.1.339988.308172&lt;/text><br />
&lt;/desc><br />
&lt;/subform><br />
&lt;/template><br />
…<br />
2. Select a Flex container or control that you are going to print, i.e. a Panel, a DataGrid et al.<br />
3. Query the object from step 2, get its attributes and children and create the XML preparing this object for printing. Attach the XML to the template as a page. If you have your own presentation framework, all components can implement your own interface (the code below shows IXdpContent with the only getter function xmlContent) that allows to traverse the list of elements on the screen for their XDP content. You can also have a processor that would provide the XML for standard classes. Here is implementation of generic DataGridItemRenderer to illustrate how you can prepare for printing just one datagrid cell:<br />
package printing<br />
{<br />
import com.theriabook.controls.superGridClasses.DataGridItemRenderer;</p>
<p>public class DataGridItemRendererXdp extends DataGridItemRenderer<br />
implements IXdpElement<br />
{<br />
public  function get xmlContent():Object<br />
{<br />
var o:XML = &lt;draw  x={convert(x)} w={convert(width)}<br />
h={convert(height)}><br />
&lt;ui><br />
&lt;textEdit><br />
&lt;/textEdit><br />
&lt;/ui><br />
&lt;value>&lt;text>{text}&lt;/text>&lt;/value><br />
&lt;font typeface={getStyle(&#8220;fontFamily&#8221;)}<br />
size={(getStyle(&#8220;fontSize&#8221;)*4/5)+&#8221;pt&#8221;}<br />
weight={getStyle(&#8220;fontWeight&#8221;)}<br />
posture={getStyle(&#8220;fontStyle&#8221;)}<br />
underline={getStyle(&#8220;textDecoration&#8221;)==&#8221;normal&#8221;?1:0}<br />
><br />
&lt;fill><br />
&lt;color value={rgb(getStyle(&#8220;color&#8221;))}/><br />
&lt;/fill><br />
&lt;/font><br />
&lt;margin topInset=&#8221;0.5mm&#8221; bottomInset=&#8221;0.5mm&#8221; leftInset=&#8221;0.5mm&#8221; rightInset=&#8221;0.5mm&#8221;/></p>
<p>&lt;border><br />
&lt;edge presence=&#8221;hidden&#8221;/><br />
&lt;edge presence=&#8221;visible&#8221;/><br />
&lt;edge presence=&#8221;hidden&#8221;/><br />
&lt;edge presence=&#8221;hidden&#8221;/><br />
&lt;/border><br />
&lt;/draw>;</p>
<p>return o;<br />
}<br />
private function convert(val:Number) : String {<br />
return val/96 + &#8220;in&#8221;; //convert 96 dpi to inches<br />
}<br />
private function rgb(val:Number) : String {</p>
<p>return (val >> 16 &#038; 255) + &#8220;,&#8221; + (val >> 8 &#038; 255) + &#8220;,&#8221; + (val  &#038; 255);<br />
}</p>
<p>}<br />
}<br />
4. Repeat the process of attaching XML to the XDP template using E4X until all print pages are ready.</p>
<p>In my opinion, this method of printing from Flex requires less efforts for reporting and creation of dynamic layouts. It might also provide better printing quality and searchability within printed document.</p>
<p>The method<br />
Hope this helps,<br />
Anatole</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/08/22/creating-pdf-documents-from-flex-applications/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Is your application ready for the real world?</title>
		<link>http://flexblog.faratasystems.com/2007/07/31/is-your-application-ready-for-the-real-world</link>
		<comments>http://flexblog.faratasystems.com/2007/07/31/is-your-application-ready-for-the-real-world#comments</comments>
		<pubDate>Tue, 31 Jul 2007 05:44:50 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex 2]]></category>
		<category><![CDATA[Flex Consulting]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=232</guid>
		<description><![CDATA[I spent this weekend testing some of our clients new applications in the wild &#8211; literally. In these parts of the woods Internet is bad enough on sunny days, and it gets MUCH worse when it rains. So I was getting all kind of errors on &#8220;production-ready&#8221; application that was fully tested on intranet.
Well, that [...]]]></description>
			<content:encoded><![CDATA[<p>I spent this weekend testing some of our clients new applications in the wild &#8211; literally. In these parts of the woods Internet is bad enough on sunny days, and it gets MUCH worse when it rains. So I was getting all kind of errors on &#8220;production-ready&#8221; application that was fully tested on intranet.</p>
<p>Well, that does not really mean much in the real world. Here I was getting random disconnects, lost, out of sequence, corrupted and duplicate packages. The application was very much confused at best.</p>
<p>By the time it stopped raining I was ready for more. So I set up a Linux server, installed <strong>netem&#8217;s</strong> network emulation software and deployed my application there. By doing that I was finally able to put in order some chaos of disruptive networking issues. Netem allows you to provide any permutation of the latency, out-of-sequence packages, lost and erroneous ones, duplicates over local network &#8211; in this case, within VMWare on my laptop.</p>
<p>By the end of the day I am able to make the system work on par with the last century cell phone modem connection. That is just a pure luck that the system was designed with all the hooks for custom QoS and did not require rewrite of the communication server.</p>
<p>Quick setup of that VM as a bridge ( VMWare provides virtual adapters, you can just route your local traffic via that VM), and I am testing publicly available AJAX and Flex sites. Very few survivors out there &#8211; most of the applications die quietly at best.</p>
<p>Rich Internet Applications are being positioned to replace their client/server peers. It is extremely important that they can deal with disruptions in a robust manner,  so the business operation can continue uninterrupted in a slow mode. Breaking transactions is not an option. Given utmost priority to this will affect design of your production-grade application and development schedule.</p>
<p>Sincerely,</p>
<p>Anatole Tartakovsky</p>
<p>Personal note: I noticed today that I am spending less then 30% of my time in Microsoft OS and most of the time in Linux. It appears that all 3rd party system developers are abandoning the platform &#8211; there is virtually no shareware/inexpensive or just decent tools for network simulation. As for usability, few times this week I was about to remove Vista from my desktop. It is definitely time to switch from Microsoft  to Linux/Mac for base OS. Too bad Apple can&#8217;t fulfill on the promise to make OS available on high-end PCs &#8211; it just does not make sense to go from thinkpad t60p to Mac laptop &#8211; they are virtually identical, with better expandability on thinkpad side.</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/07/31/is-your-application-ready-for-the-real-world/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex SDK is not open sourced until Adobe opens compiler&#8217;s templates and code generators</title>
		<link>http://flexblog.faratasystems.com/2007/07/23/flex-sdk-is-not-open-sourced-until-adobe-opens-compilers-templates-and-code-generators</link>
		<comments>http://flexblog.faratasystems.com/2007/07/23/flex-sdk-is-not-open-sourced-until-adobe-opens-compilers-templates-and-code-generators#comments</comments>
		<pubDate>Mon, 23 Jul 2007 20:54:15 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=228</guid>
		<description><![CDATA[The fact that Adobe is open sourcing Flex is good but not good enough. The whole idea of open sourcing any software is to bring more brain power to the development process, which leads to a better quality product. But today my hands are tied.
I wasted a whole day on what should have been a [...]]]></description>
			<content:encoded><![CDATA[<p>The fact that Adobe is open sourcing Flex is good but not good enough. The whole idea of open sourcing any software is to bring more brain power to the development process, which leads to a better quality product. But today my hands are tied.</p>
<p>I wasted a whole day on what should have been a trivial task &#8211; adding and ability to send some client context information alongside with an AMF request. Passing the request&#8217;s header information (i.e. information that is not passed with the RPC call but can be picked up by querying context mechanism) is quite common in Java programming.</p>
<p>I started by trying to pass the user name across the wire. With RTMP or HTTP requests you just add the objects you need to pass along to the HTTP header.</p>
<p>Setting up the Java side literally took 10 minutes &#8211; subclassing the FDS endpoints, creating the context class that would be used for keeping the information within thread execution:</p>
<p>package com.farata.remoting;<br />
import java.util.Hashtable; import flex.messaging.endpoints.*;<br />
import flex.messaging.MessageBroker;<br />
import flex.messaging.config.ChannelSettings;<br />
import flex.messaging.messages.Message;</p>
<p>public class CustomAMFEndpoint extends AMFEndpoint {</p>
<p>public CustomAMFEndpoint(MessageBroker broker, ChannelSettings cs) {super(broker, cs);}</p>
<p>public CustomAMFEndpoint(MessageBroker broker, ChannelSettings cs, boolean enableManagement) {super(broker, cs, enableManagement);}</p>
<p>public Message serviceMessage(Message message) {</p>
<p>Hashtable ht = new Hashtable();</p>
<p>ht.put(&#8220;context&#8221;, message.getHeaders());</p>
<p>MessageContext.setParams(ht);</p>
<p>return super.serviceMessage(message);<br />
}<br />
}</p>
<p>Here&#8217;s the &#8220;by the book&#8221; implementation of the Context object using Java&#8217;s ThreadLocal class:</p>
<p>package com.farata.remoting;<br />
import java.util.Hashtable;</p>
<p>public class MessageContext {</p>
<p>public static void setParams(Hashtable session) { sessions.set(session); }</p>
<p>public static Hashtable getParams() { return (Hashtable)sessions.get(); }</p>
<p>private static ThreadLocal sessions = new ThreadLocal();</p>
<p>}</p>
<p>Let&#8217;s use a classical HelloWorld.java for testing:</p>
<p>package com.farata.test;</p>
<p>import java.util.HashMap;<br />
import java.util.Hashtable;<br />
import com.farata.remoting.MessageContext;<br />
public class HelloWorld {</p>
<p>public String hello() {<br />
Hashtable ht = MessageContext.getParams();<br />
HashMap context = (HashMap)ht.get(&#8220;context&#8221;);<br />
return &#8220;Hello &#8220;+ (String)context.get(&#8220;user&#8221;);<br />
}<br />
}</p>
<p>Done with Java, here comes the Flex turn. Now we need to subclass the ActionScript class Operation to update the message headers when the operation is being invoked:</p>
<p>package {</p>
<p>import mx.rpc.remoting.mxml.Operation;<br />
import mx.core.mx_internal;<br />
use namespace mx_internal;<br />
import mx.rpc.AsyncToken;<br />
import mx.messaging.messages.IMessage;<br />
import mx.rpc.remoting.mxml.RemoteObject;</p>
<p>public class ContextOperation extends Operation {</p>
<p>public function ContextOperation(svc:RemoteObject = null, name:String = null):void {</p>
<p>super(svc, name);</p>
<p>}</p>
<p>mx_internal override function invoke(msg:IMessage, token:AsyncToken=null):AsyncToken {</p>
<p>msg.headers.context = {user : &#8220;Anatole&#8221;};</p>
<p>return super.invoke(msg, token);<br />
}<br />
}<br />
}</p>
<p>Now the client&#8217;s test application:</p>
<p>&lt;mx:Application xmlns:mx=&#8221;http://www.adobe.com/2006/mxml&#8221; xmlns:local=&#8221;*&#8221;> &lt;mx:Button label=&#8221;hw&#8221; click=&#8221;ro.hello()&#8221;/></p>
<p>&lt;mx:RemoteObject id=&#8221;ro&#8221; operationClass=&#8221;{ContextOperation}&#8221; destination=&#8221;com.farata.test.HelloWorld&#8221; result=&#8221;Alert.show(event.result)&#8221; /> &lt;/mx:Application></p>
<p>So far so good, we are getting back &#8220;Hello Anatole&#8221; as expected. Here comes trouble &#8211; you can not use mx:method with this solution &#8211; operationClass is not being used with the template used by Flex compiler, which generates the following ActionScript code (you can see it with the help of -keep compiler&#8217;s option):</p>
<p>private function _RemoteObject1_i() : mx.rpc.remoting.mxml.RemoteObject<br />
{<br />
var temp : mx.rpc.remoting.mxml.RemoteObject = new mx.rpc.remoting.mxml.RemoteObject();<br />
ro = temp;<br />
temp.destination = &#8220;com.farata.test.HelloWorld&#8221;;<br />
temp.operations = {hello: _Operation1_c()};<br />
temp.initialized(this, &#8220;ro&#8221;)return temp;<br />
}</p>
<p>private function _Operation1_c() : mx.rpc.remoting.mxml.Operation{</p>
<p>var temp : mx.rpc.remoting.mxml.Operation = new mx.rpc.remoting.mxml.Operation();<br />
temp.name = &#8220;hello&#8221;;temp.addEventListener(<br />
&#8220;result&#8221;, ___Operation1_result);<br />
temp.addEventListener(&#8220;fault&#8221;, ___Operation1_fault);</p>
<p>return temp; }</p>
<p>I did not expect to see &#8220;new mx.rpc.remoting.mxml.Operation()&#8221;, but rather new ContextOperation.  This is clearly a bug in the template used by the code generator, which I could have fixed myself and returned the fixed version back to Flex developer&#8217;s community. Unfortunately, the code of the templates is not available.</p>
<p>Frameworks that use code generators need to open templates so enterprise developers can extend them. Extension of the framework means symmetrical changes in templates, so if you allow one, you should allow the other. Also, in order to take an application framework to the next level, the preprocessor/code generation passes need to be extendable by developers as well .</p>
<p>Please open up AMF/RPC and Flex compiler or at least set up the community process to let us quickly fix such bugs.</p>
<p>Thank you,<br />
Anatole</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/07/23/flex-sdk-is-not-open-sourced-until-adobe-opens-compilers-templates-and-code-generators/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Full-screen mode and compatibility with older versions of Flash Player</title>
		<link>http://flexblog.faratasystems.com/2007/07/17/full-screen-mode-and-compatibility-with-older-versions-of-flash-player</link>
		<comments>http://flexblog.faratasystems.com/2007/07/17/full-screen-mode-and-compatibility-with-older-versions-of-flash-player#comments</comments>
		<pubDate>Tue, 17 Jul 2007 22:09:29 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[Apollo]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex 2]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=227</guid>
		<description><![CDATA[We&#8217;ve implemented in Flex a Web application that supports full screen mode (note a small icon in  the top right corner at  www.myflex.org).  This blogs explains the issue you may run into while implementing the full-screen mode. The process consists of two steps:
1. Identify if the player is capable of displaying the [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve implemented in Flex a Web application that supports full screen mode (note a small icon in  the top right corner at  <a href="http://www.myflex.org">www.myflex.org</a>).  This blogs explains the issue you may run into while implementing the full-screen mode. The process consists of two steps:</p>
<p>1. Identify if the player is capable of displaying the Web application on the full screen.<br />
2. Apply &#8216;fullScreen&#8217; to displayState property of the stage</p>
<p>The first step is usually done by parsing the version numbers (major, minor and build) of the player using Flex regular expressions:</p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#0033ff">public</font></strong><font size="2"> </font><strong><font size="2" color="#0033ff">static</font></strong><font size="2"> </font><strong><font size="2" color="#339966">function</font></strong><font size="2"> fullScreenEnabled ():Boolean {</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#6699cc">  var</font></strong><font size="2"> versionString:String = Capabilities.version;</font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#6699cc">  var</font></strong><font size="2"> version:RegExp = </font><strong><font size="2" color="#990000">/\w\s+(?P&lt;major>\d+),(?P&lt;minor>\d+),(?P&lt;build>\d+),\d+/</font></strong><font size="2">;</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#6699cc">  var</font></strong><font size="2"> result:Array = version.exec (versionString);</font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#6699cc">  var</font></strong><font size="2"> majorVersion:Number = Number (result.major);</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#6699cc">  var</font></strong><font size="2"> minorVersion:Number = Number (result.minor);</font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#6699cc">  var</font></strong><font size="2"> buildVersion:Number = Number (result.build);</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">  enabled = (majorVersion >= 9) &#038;&#038; ((minorVersion > 0) || (buildVersion >= 28));</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#0033ff">  return</font></strong><font size="2"> enabled;</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">}</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">If you&#8217;ll follow some online suggestions on implementing  the second </font></font><font size="2"><font size="2"><font size="2"><font size="2">step, you&#8217;ll run into problems:</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     this.systemManager.stage.displayState = state?&#8221;fullScreen&#8221;:&#8221;normal&#8221; ;// wrong</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     this.systemManager.stage["displayState"] = state?&#8221;fullScreen&#8221;:&#8221;normal&#8221; ;// won&#8217;t work either<br />
</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">Developers in Java and Flex world usually assume that if the code passes compilation ( and here we have strict references ) the linkage issues are resolved. However, this code will throw an exception if executed in older versions of Flash.</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">Either of the following two approaches will work :</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     if (&#8220;displayState&#8221; in systemManager.stage) this.systemManager.stage.displayState = state?&#8221;fullScreen&#8221;:&#8221;normal&#8221; ;// OK</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">try {</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">         if (&#8220;displayState&#8221; in systemManager.stage) this.systemManager.stage.displayState = state?&#8221;fullScreen&#8221;:&#8221;normal&#8221; ;// OK</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     } catch (e:Exception) {}</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">It becomes even more relevant when developing components that are reused by both Flex and Adobe AIR.</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">Thank you,</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">Anatole</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"> </font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font> </font></font></font></font></font></font></font></font></font></font></font></font> </font></font></font></font></font></font></font></font></font></font></font></font></p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/07/17/full-screen-mode-and-compatibility-with-older-versions-of-flash-player/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why you should care about AIR</title>
		<link>http://flexblog.faratasystems.com/2007/07/07/why-you-should-care-about-air-2</link>
		<comments>http://flexblog.faratasystems.com/2007/07/07/why-you-should-care-about-air-2#comments</comments>
		<pubDate>Sat, 07 Jul 2007 17:11:46 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=218</guid>
		<description><![CDATA[I have been reading a lot about AIR lately and it seems that most of long time Macromedia users are missing the point of the product. The best Flash/Flex developers do not see enough of the difference with existing browser solutions�and HTML guys do not understand why would they need another browser/compatibility test for their [...]]]></description>
			<content:encoded><![CDATA[<p>I have been reading a lot about AIR lately and it seems that most of long time Macromedia users are missing the point of the product. The best Flash/Flex developers do not see enough of the difference with existing browser solutions�and HTML guys do not understand why would they need another browser/compatibility test for their overstressed sites.<br />
Here�are�2 major�points:<br />
1. Flash/Flex programming/authoring are limiting explosive grows of the Rich Internet Applicaions &#8211; mash-ups with easy publishing is the must if you want to get support of millions of IT people that were &#8216;Thinking in HTML&#8217;.<br />
2. HTML without reliable communication model, fast pre-compiled code (every time you load page JavaScript is being compiled) and better media support is a &#8220;no-go&#8221;. Low bandwidth, latency and unreliable communications break AJAX sites easily.<br />
Low-level performance and lowest denominator of the features available across the browsers limit the complexity of the applications and skyrocket the costs.</p>
<p>AIR is THE SOLUTION to these problems.</p>
<p>We have been developing large AJAX applications for enterprises between 1999 and 2005.<br />
Along the way, we had to &#8220;upgrade&#8221; the browsers our clients used with extended HTTP protocol for reliability and performance.<br />
We had to complement browser security model to allow business printing and controlled file access.<br />
We had to provide framework of high level controls like datagrids, treeviews and tabfolders to make AJAX programming more productive.<br />
And we made JavaScript pre-compilation available so large applications can load and interact faster. Most of AJAX frameworks are still in infancy because the bandwidth and JavaScript performance /precompilation limit what they can do.<br />
In short, by building real-world application we had to build proprietary AIR/Flex platform for our clients.<br />
When we talked to Microsoft 3 years ago of what the next version of IE could be &#8211; and explained our vision &#8211; they bluntly said that it would be a competition to Vista. They wanted the browser dead and Vista replacing everything as an application platform.<br />
Here is a funny part &#8211; since then they spent billion of dollars buying technology to catch up in their AJAX offering. They did it for a reason &#8211; AJAX is what businesses are spending on NOW. It is GROWING not because of the technical merits, but because of the KISS (keep it simple stupid) aproach and speed of delivery using existing trained staff. We are spending time and money making our Flex controls like interactive reporting tool to be available as Flex component for AJAX &#8211; there is huge market there as AJAX can&#8217;t compare with the power and reliability of mash-ups.<br />
Marketing at Adobe needs to take higher aim with this product�- they need to appeal to the right people�NOW to make the product success &#8211; and these are the people way outside of Macromedia / Adobe camps.<br />
Sincerely,<br />
Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/07/07/why-you-should-care-about-air-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Right Protocol for Enterprise Applications &#8211; introducing RTMP/C &#8211; reliable and easy combination of RPC and RTMP</title>
		<link>http://flexblog.faratasystems.com/2007/06/28/right-protocol-for-enterprise-applications-introducing-rtmpc-reliable-and-easy-combination-of-rpc-and-rtmp</link>
		<comments>http://flexblog.faratasystems.com/2007/06/28/right-protocol-for-enterprise-applications-introducing-rtmpc-reliable-and-easy-combination-of-rpc-and-rtmp#comments</comments>
		<pubDate>Fri, 29 Jun 2007 01:33:48 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex 2]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=215</guid>
		<description><![CDATA[Enterprise (especially financial) applications are different from the Web ones. The formers are distributed beasts sprawling across multiple servers/systems to provide real-time, rich, multi-format data. Here you have two key words &#8211; distributed and data.  Distributed means unpredictable response time. That is a showstopper for conventional RPC methodology &#8211; you need to consider messaging. [...]]]></description>
			<content:encoded><![CDATA[<p>Enterprise (especially financial) applications are different from the Web ones. The formers are <strong>distributed</strong> beasts sprawling across multiple servers/systems to provide real-time, rich, multi-format <strong>data</strong>. Here you have two key words &#8211; <strong>distributed</strong> and <strong>data.  Distributed</strong> means unpredictable response time. That is a showstopper for conventional RPC methodology &#8211; you need to consider messaging. Also, it means that the client is a part of distributed chain &#8211; not all the Web restrictions are applicable, but QoS (Quality of Service), reliability and performance are part of the design.The  <strong>data </strong>means that it comes in variety of formats that might be foreign to the Web server platform or client &#8211; some massaging is required.What the developers need is something to absolve them from all the issues of Internet communications and Server infrastructure. Something that works like RemoteObject but is scalable, support server push, is reliable, provides automatic QoS, reconnection of the transport, has better performance then regular RPC.  On the logical level, it should deliver results in strongly typed ActionScript objects and should be accomplishable with a couple of lines of the application code. This is just a tip of the iceberg of what an actual enterprise bus communication needs, but it should be good enough for the introduction of the concept.</p>
<p>The implementation shown below is based on FDS 2.0.1.  I might have separate entry on implementation with MidnightCoders product or openAMF/Tomcat with non-blocking IO Connector later this Summer.</p>
<p>Step 1. Teach Messaging to understand RPC calls:</p>
<p>This code is a slight variation of the BatchGateway AMF &#8220;batch handler&#8221; from the <a title="The Ria Book" target="_blank" href="http://www.riabook.com">book</a>. Optimization is removed for brevity. You create new descendent of RTMPEndpoint class  that would watch for message coming through RTMP channel to be &#8220;RemoteCall&#8221;  :</p>
<p><strong><font size="2" color="#7f0055">private</font></strong><font size="2"> Object processCall(String destinationName, String methodName, List parameters) </font><strong><font size="2" color="#7f0055">throws</font></strong><font size="2"> IllegalAccessException, IllegalArgumentException, Throwable {</font><font size="2">   Object result = </font><strong><font size="2" color="#7f0055">null</font></strong><font size="2">;</font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">   initRemoting();</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">   RemotingDestination remotingDestination = (RemotingDestination)</font><em><font size="2" color="#0000c0">srv</font></em><font size="2">.getDestinationByName(destinationName);</font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">   FactoryInstance factoryInstance = remotingDestination.getFactoryInstance();</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">   Object instance = factoryInstance.lookup();</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"> </font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">   MethodMatcher methodMatcher = remotingDestination.getMethodMatcher();</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">   Method method = methodMatcher.getMethod(instance.getClass(), methodName, parameters);</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#7f0055">   try</font></strong><font size="2"> {</font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">      result = method.invoke(instance, parameters.toArray());</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">   }</font><strong><font size="2" color="#7f0055">finally</font></strong><font size="2"> {</font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">       factoryInstance.operationComplete(instance);</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">   }</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#7f0055">    return</font></strong><font size="2"> result;</font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">}</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" color="#7f0055">public</font><font size="2"> Message serviceMessage(Message message) {</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" color="#7f0055">   if (message is AsyncMessage and message.body is RemoteCall)</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font color="#7f0055"><font size="2" /><font color="#7f0055"><font size="2"><font color="#7f0055"><font color="#7f0055"><font size="2" /></font></font></font><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font color="#7f0055"><font size="2" /></font></font></font></font></font></font></font><font color="#7f0055"><font size="2"><font color="#7f0055"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font color="#7f0055"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font color="#7f0055"><font size="2"><font color="#7f0055"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font color="#7f0055"><font size="2">   RemoteCall bm = (RemoteCall)((AsyncMessage)message).getBody();</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font color="#7f0055"><font size="2"><font color="#7f0055"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font color="#7f0055"><font size="2" color="#7f0055">   try</font><font size="2"> {</font></font><font size="2"><font size="2"><font size="2" /><font size="2" /></font></font><font size="2" /></font></font></font></font></font><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"> </font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><strong>      </strong>Object o = processCall(bm.</font><font size="2" color="#0000c0">destinationName</font><font size="2">, bm.</font><font size="2" color="#0000c0">methodName</font><font size="2">, bm.</font><font size="2" color="#0000c0">parameters</font><font size="2">);</font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">      AsyncMessage am = asyncMessage(message);</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">      am.setClientId(/*you need to pass rtmp consumer id here &#8211; will add later*/ &#8220;1&#8243;);</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /><font size="2"><font size="2"><font size="2" /></font></font><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">      am.setBody(o);</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     rtmpServer.<font size="2">push(am, am.getClientId() );</font><font size="2"><font size="2">   }catch(Exception e) {&#8230;}</font></font><font size="2"><font size="2"><font size="2"><font size="2" color="#7f0055">else </font></font></font><font size="2"><font size="2"><font size="2"><font size="2" color="#7f0055">    return</font><font size="2"> </font><font size="2" color="#7f0055">super</font><font size="2">.serviceMessage(message);</font></font></font></font></font></font><font size="2"><font size="2"><font size="2">}</font></font></font></font></font><font size="2"><font size="2"><font size="2" color="#7f0055">private</font><font size="2"> AsyncMessage asyncMessage(Message message) {</font><font size="2">    AsyncMessage am = </font><font size="2" color="#7f0055">new</font><font size="2"> AsyncMessage(); </font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">    am.setClientId(message.getClientId());</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">    am.setCorrelationId(message.getMessageId());</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">    am.setMessageId(UUIDUtils.<em>createUUID</em>(</font><strong><font size="2" color="#7f0055">false</font></strong><font size="2">));</font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /><font size="2"><font size="2"><font size="2" /></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">    am.setDestination(message.getDestination()<font size="2">);</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" color="#7f0055">    return</font><font size="2"> a;</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">}</font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"> </font></font></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">Now register new RTMPEndpoint in services-config.xml and you can execute POJO calls over RTMP.</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">Now register new RTMPEndpoint in services-config.xml and you can execute POJO calls over RTMP.</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">Step 2. Call to the server is implemented  with single API in descendant of Producer:</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">public static function call(rc:RemoteCall, r:Responder = null, noneOneMany:String = &#8220;none&#8221;) : AsyncToken {</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     Messsage m = new AsyncMessage(rc); </font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     var t : AsyncToken =  new AsyncToken(m);</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     ConsumerForRPC.calls[m.messageId] = t;    </font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     send(m);</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     return t;</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">}</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">Step 3. On the client side, establish Consumer receiving point. You will need just descendent of Consumer object to be connected to the same destiantion so you can start receiving the messages. You will also need to provide Producer/Consumer association to the RTMPEndpoint (see commets in the code) so the responses are sent to the appropriate client.</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">Here is a piece of code in the consumer that allows you to do RPC from the server to the client:</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#0033ff">private</font></strong><font size="2"> </font><strong><font size="2" color="#0033ff">static</font></strong><font size="2"> </font><strong><font size="2" color="#339966">function</font></strong><font size="2"> processMessage(message:IMessage) : </font><strong><font size="2" color="#0033ff">void</font></strong><font size="2"> {</font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">   if</font><font size="2"> (message.body </font><strong>is</strong></font><font size="2"> RemoteCall) {</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#6699cc">            var</font></strong><font size="2"> rc : RemoteCall = message.body </font><strong><font size="2" color="#0033ff">as</font></strong><font size="2"> RemoteCall;</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"> <strong>            var</strong></font><font size="2"> obj : Object = destinations[bm.destinationName]; // you register live objects as targets for RPC, factories/safety missing for brevity          </font></font></font></font><font size="2"><font size="2"><font size="2">          obj[bm.methodName].apply(obj, [bm.parameters.source]);</font><font size="2"><font size="2"><font size="2"> </font></font></font><font size="2"><font size="2"> </font></font></font><font size="2"><font size="2" /></font><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     }</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong>else</strong></font><font size="2"> {</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"> </font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"> </font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"> </font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">// standard processing &#8211; the data is most likely result from RPC call &#8211; see if it is and call the responders:</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#6699cc">    var</font></strong><font size="2"> corId : String = (message </font><strong><font size="2" color="#0033ff">as</font></strong><font size="2"> AsyncMessage).correlationId;</font><font size="2"><font size="2">    var</font><font size="2"> t : AsyncToken = calls[ corId ];</font><font size="2" /></font></font><font size="2"><font size="2"><font size="2" /></font></font></font></font></font><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     if</font><font size="2"> (t == </font><strong>null</strong></font><font size="2">) </font><strong><font size="2" color="#0033ff">return</font></strong><font size="2"> ;</font><em><font size="2" color="#009900">// regular push via messaging</font></em></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"> </font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#0033ff">     for</font></strong><font size="2"> (</font><strong><font size="2" color="#6699cc">var</font></strong><font size="2"> i:int = 0; i < t.responders.length; i++) {</font><font size="2"><font size="2"><font size="2"> </font></font></font></font></font><font size="2"><font size="2"><font size="2" /></font></font></font><font size="2"><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#6699cc">         var</font></strong><font size="2"> r:Responder = t.responders[ i ];        r.result(</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong><font size="2" color="#0033ff">new</font></strong><font size="2"> ResultEvent(</font><strong><font size="2" color="#990000">&#8220;result&#8221;</font></strong><font size="2">, </font><strong><font size="2" color="#0033ff">false</font></strong><font size="2">, </font><strong><font size="2" color="#0033ff">true</font></strong><font size="2">, message.body, t, message));</font><font size="2"><font size="2"><font size="2" /></font><font size="2"><font size="2" /></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">     }</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><strong>      if</strong></font><font size="2"> (t.runOnce)</font><font size="2">        delete calls[ corId ];      </font></font><font size="2">}</font></font></font><font size="2">}</font></font></font></font></font><font size="2">}</font></font></font></font></font></font></font></font></font><font size="2">}</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">}</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">}</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">That provides RPC like communications &#8211; you register either Responder for result/error or directly call methods on the objects. You also pass through regular messages pushed from server without processing.</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">Finally, if you decide to code a server RPC response via server side event model you just move the code with the return in the appropriate event handler.</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">That&#8217;s all, folks <img src='http://flexblog.faratasystems.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2">PS. I left out QoS and reliability information as every client  has different requirements &#8211; but essentially you queue the messages and set up headers to provide out-of-band QoS and reliability info.</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"> </font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
<p align="left"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font color="#7f0055"><font size="2"><font color="#7f0055"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"><font size="2"> </font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/06/28/right-protocol-for-enterprise-applications-introducing-rtmpc-reliable-and-easy-combination-of-rpc-and-rtmp/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to get off Startbuck and overall development in Flex</title>
		<link>http://flexblog.faratasystems.com/2007/05/21/how-to-get-off-startbuck-and-overall-development-in-flex</link>
		<comments>http://flexblog.faratasystems.com/2007/05/21/how-to-get-off-startbuck-and-overall-development-in-flex#comments</comments>
		<pubDate>Mon, 21 May 2007 20:03:48 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=198</guid>
		<description><![CDATA[After at least 10 years of daily trips to Starbucks for my daily fix I am finally off. It happened gradually over the last three months after they installed one of those fancy Italian automatic espresso machines in the office. It started as just convenience to provide the same or better espresso. Well, coffee came [...]]]></description>
			<content:encoded><![CDATA[<p>After at least 10 years of daily trips to Starbucks for my daily fix I am finally off. It happened gradually over the last three months after they installed one of those fancy Italian automatic espresso machines in the office. It started as just convenience to provide the same or better espresso. Well, coffee came out way better, especially when our perfectionists got into raw materials like fresh/freshly roasted coffee and few experiments of their own. Suddenly, Starbucks coffee is not much different from .70$ one from a  newsstand at the corner. Over the years we tried everything – single-serving machines, hot sand plates for Turkish coffee, manually operated espresso, presses – you name it. All previous methods sacrificed either on quality of the results or manual labor and failed to please everybody’s taste. Routine job can be done automatically.</p>
<p>Over the last half year I started handful of projects in Flex for our clients. They came for a taste of Flex development and see how it will fit their application domain. After a day or two of “prototyping” with pure Flex controls and methodology I would find myself facing the wall of code I had to write to make clients specs “alive”. At that point TIME AFTER TIME I took our home-made libraries and plug-ins to break that wall. I was really surprised to see how automated tools and components were able to adopt themselves across very different domains.</p>
<p>Here is the list of the tools I believe no Flex project can survive without – they are not a part of standard Flex: Controls – TreeGrid, MaskedInputs, EnhancedButtons(all radio/checkbox/tabs go there), DataCollection (maintaining state), UIResources,</p>
<p>Data entry – DataForm – merge-in of DataGrid concept with Form container – do not start your Flex project without one. Proxy/deployment generator for your host environment – I use <a href="http://www.myflex.org">Clear Data Builder</a> as it has extensible set of code generators for all common tasks. Reporting – both plug-ins that allow to build reports and end-user wizards to provide layout, grouping, filtering and sorting. Also, for the productive automated environment you need these plug-ins – <a href="http://www.myflex.org">Ant script generator, documenter, logger</a> (if you use “trace” statement you need one).</p>
<p>Back to the coffee machines. After doing the math it seems that automatic coffee machine is less expensive (including operational costs) then cheaper manual ones. I got one at home now, and hopefully, will be able to blog more from now on.</p>
<p>Sincerely, Anatole</p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/05/21/how-to-get-off-startbuck-and-overall-development-in-flex/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Will framework survive RIA? I hope not.</title>
		<link>http://flexblog.faratasystems.com/2007/03/11/will-framework-survive-ria-i-hope-not</link>
		<comments>http://flexblog.faratasystems.com/2007/03/11/will-framework-survive-ria-i-hope-not#comments</comments>
		<pubDate>Mon, 12 Mar 2007 13:36:24 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=173</guid>
		<description><![CDATA[Everybody knows that frameworks are the best way to develop large applications, aren&#8217;t they? This type of the common knowledge is dangerous &#8211; good indication that cycle is over and it is going to become obstacle. So, is framework friend or foe in the age of RIA applications?
I think frameworks can be bad for application [...]]]></description>
			<content:encoded><![CDATA[<p>Everybody knows that frameworks are the best way to develop large applications, aren&#8217;t they? This type of the common knowledge is dangerous &#8211; good indication that cycle is over and it is going to become obstacle. So, is framework friend or foe in the age of RIA applications?</p>
<p>I think frameworks can be bad for application development.  Here are some of the reasons:</p>
<ul>
<li>They enforce certain patterns, code generation and separation that may be not appropriate &#8211; you end up of more code that should not be there to begin with</li>
<li>More difficult to debug and maintain as you have a lot of framework code processing your flow &#8211; longer stacks, unpredictable reactions, extra bugs.</li>
<li>Forces thinking of &#8220;adoption&#8221; of the framework sample application as your application prototype</li>
</ul>
<p>Most importantly, patterns like MVC are not necessarily best implemented as external framework. In RIA world, intelligent controls like <u>Super</u>DataGrid, <u>Data</u>Form, etc can have databinding, all the way to the back-end and provide MVC patterns INSIDE of the control &#8211; giving you all the hooks dictated by pattern, but removing the complexity and extra code. In the age of RIA, more controls of that sort will emerge, forcing you to make a choice between conventional frameworks and controls that take care of you. When was the last time you thought of using framework on the top of Excel or Word or any other component that is self-sufficient for the <u>end-user</u>?<br />
For me, frameworks that force to separate programs in views, commands, etc. are like forcing everybody to build/use cars with manual transmission. Manual transmissions are more efficient, have advantages in performance and easier to maintain/repair. They have most vocal advocates ( for record, never convinced the guy who is responsible for &#8220;usability&#8221; here at Farata that clutch is a good way to do it). They suck on small projects like in-town commute. As for the future (and present for some of us) &#8211; good luck finding one in the hybrid or electric cars. Platform is changing, more functions are in platform, less control needed on outside &#8211; just enjoy the ride.<br />
Sincerely,</p>
<p>Anatole Tartakovsky</p>
<p>PS:  I will spend next month collecting statistics on the projects that use frameworks and not use them &#8211; including code size per function and success / failure rates. I can be biased as I derive my current sentiment from the projects done 10-15 years ago and few &#8220;Save our project&#8221; kind of assigments I got involved lately. If you have good or bad experience using frameworks please send me your comments so I can include them.</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/03/11/will-framework-survive-ria-i-hope-not/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>360Flex &#8211; The Most Impressive Stuff (subjective)</title>
		<link>http://flexblog.faratasystems.com/2007/03/08/360flex-most-impressive-stuff-subjective</link>
		<comments>http://flexblog.faratasystems.com/2007/03/08/360flex-most-impressive-stuff-subjective#comments</comments>
		<pubDate>Thu, 08 Mar 2007 18:53:58 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=172</guid>
		<description><![CDATA[360Flex was not an typical conference. This was the conference for developers and by developers, indeed. That set the tone for all  presentations and aftertalks.
Here is my list of the most impressive presentations I had chance to listen to (sorry if I missed anyone &#8211; I had chance to be only @ one place @ a time) :
1. David Zuckerman provided [...]]]></description>
			<content:encoded><![CDATA[<p>360Flex was not an typical conference. This was the conference for developers and by developers, indeed. That set the tone for all  presentations and aftertalks.</p>
<p>Here is my list of the most impressive presentations I had chance to listen to (sorry if I missed anyone &#8211; I had chance to be only @ one place @ a time) :</p>
<p>1. David Zuckerman provided an invaluable insight into FlexBuilder undocumented (or under-documented) features. He will be publishing it shortly (keep an eye on <a href="http://davidzuckerman.com/adobe/">http://davidzuckerman.com/adobe/</a>). Grab it and learn it by heart &#8211; this will save you countless of wasted hours in the FB environment.</p>
<p>2. Joe Berkovitz provided 2 sessions: one on automating FlexBuilder builds with ANT, and one on the lightweight framework. Both sessions should have been recorded and published as an excellent overview and hands-on training on the subjects. I felt compelled to make some adjustments in the way we generate ANT files in our Flex2Ant plugin &#8211; will blog on it separately.</p>
<p>As to frameworks, I hope their time with RIA will be limited &#8211; will explain why in one of the future blogs. It was interesting to watch the audience during Joe&#8217;s talk - he&#8217;s definetely is one of the best thinkers and speakers in Flex community. If someone can make things simple &#8211; he is the one.</p>
<p>3. Mark Piller of Midnight coders showed very compelling solution for a non-Java Flex development and deployment. Their code generators and class libraries provide efficient and comprehensive solution for all data layer functions and communications. If you work in a .NET shop and exploring Flex, they are your first (and honestly the only) choice. I will be watching closely their commercial offering for PHP and Ruby.</p>
<p>4. In his third day keynote, Ted presented refactoring and usage reference view in Flex 3, which is great help.  For me, profiler is the most important feature &#8211; I am tired of getting requests like, &#8220;Can you make our application mush faster and use less memory&#8221; &#8211; and spend hours to pinpoint the problems. It will go long way in also improving quality and reliability of the apps.</p>
<p>Here comes a little self-promotion.</p>
<p>I have been showing <a href="http://flexblog.faratasystems.com/?p=148">a bunch of Flex Builder plugins</a> that we&#8217;ve developed and are about to start marketing. They are facilitating crucial areas of the application development &#8211; data layer, reporting, data entry, visual logging, documentation, building and hot deployments. These plugins complement FlexBuilder and FDS and make Java applications more &#8220;aware&#8221; of the new kid on the block. As a result, we established environment in which Flex and Java are active participants in each others spaces eliminating double coding and miscommunications. I also showed our FlexBI report writer working inside Eclipse as a 2-way approach to code reports with aggregates, expressions and computed styles. Reports can be edited by hand as a bunch of mxml tags and simultaneously you edit and test it visually directly in Eclipse. Reports also can be created by the end users on the fly.<br />
We are proud to say that FlexBI was selected and presented by Adobe at the third day&#8217;s keynote.</p>
<p>That&#8217;s all for now &#8211; don&#8217;t miss your second chance to attend 360Flex in August in Boston. We are definitely be there &#8211; if not as presenters then as attendees.</p>
<p>Sincerely,</p>
<p>Anatole Tartakovsky</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/03/08/360flex-most-impressive-stuff-subjective/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Post Mortem on hopefully, not your project</title>
		<link>http://flexblog.faratasystems.com/2007/02/17/post-mortum-on-hopefully-not-yours-project</link>
		<comments>http://flexblog.faratasystems.com/2007/02/17/post-mortum-on-hopefully-not-yours-project#comments</comments>
		<pubDate>Sat, 17 Feb 2007 05:17:26 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex 2]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ria]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=167</guid>
		<description><![CDATA[I have finished &#8220;fixes&#8221; on some project that was developed by typical J2EE team and needed to made work before it enters official beta. It has been extremely difficult to navigate and resolve and I would like to provide a brief checklist of symptoms you might want to review to see if your project is [...]]]></description>
			<content:encoded><![CDATA[<p>I have finished &#8220;fixes&#8221; on some project that was developed by typical J2EE team and needed to made work before it enters official beta. It has been extremely difficult to navigate and resolve and I would like to provide a brief checklist of symptoms you might want to review to see if your project is heading for trouble:</p>
<p><strong>Symptom #1.</strong> The sizable project is built very much on Flex framework without layer of UI controls for common business and UI functionality. Typical of shops that think of MXML as another xHTML.</p>
<p><strong>Problem:</strong> Impossible to enforce consistent behavior across multiple screens, cumbersome user input, complicated formatting and validation, tons of &#8220;cut and paste&#8221; spaghetti code and millions of bugs.</p>
<p><strong>Solution:</strong> Extend MXML controls into business controls that would make reusable UI elements with ROBUST and SIMPLE interface. Make sure that your controls are perfect to the end-users of your application. Strive for data-driven application programming.</p>
<p><strong>Symptom #2.</strong>  Conventional J2EE middle tier that does nothing but repackages data for DB/XML communications.</p>
<p><strong>Problem: </strong>It usually does something in reality. It might prevent you from using transactional capabilities in database. It can hide errors from the back-end. It might contain bugs. Cause performance degradation and scalability issues.</p>
<p><strong>Solution:</strong> Either go directly to the datasource or base your data entry systems on the model with client-centric updates. Provide direct feedback on the errors, transactional control, eliminate duplication and integration problems.</p>
<p><strong>Symptom #3:</strong> Cairngorm framework for large application. I am going to get a lot of flame mail on that one.</p>
<p><strong>Problem:</strong> Nevertheless, I  was saying it 15 years ago, and I say it again &#8211; do not use framework unless you build application identical to the one the framework was built for. Unfortunately, RIA area is much wider than old &#8220;shopping cart/content management&#8221; Web we know of &#8211; there is slim chance that any framework will be more of help then a burden unless you indeed are building shopping cart. Framework is not a silver bullet, but rather a way to postpone design stage.</p>
<p><strong>Solution: </strong>Start with class libraries. Build and verify reusable components early. You are in object-oriented, event-driven, real-world facing environment that has to be intelligent and friendly to the end-user. Break your application into libraries and modules as early as you can &#8211; it will pay off faster then you think.</p>
<p><strong>Symptom 4#: </strong>Excessive use of binding.</p>
<p><strong>Problem: </strong>You try to see dependencies, and it just never ends. Cycles, breaks, using binding for initialization, wrong timing &#8211; you name it. Debugging becomes time consuming and very challenging. As a result &#8211; untested code that seems to work.</p>
<p><strong>Solution: </strong>Understand the difference between binding, initialization and types of the events you really want to listen to. Handle events locally in the business domain UI components. Do not force system to do more then it needs. In the event driven environment you really want to keep the noise down -especially for large applications.</p>
<p><strong>Symptom 5#: </strong>No error handling, no logging statement and assertions in the code.</p>
<p><strong>Problem: </strong>I can be wrong here. It is possible that the code is perfect and nothing is going to break ever. Otherwise, you are doomed. Seriously, bringing support phone into your bedroom is not thing you want to do. Postponing the problems after release date will get you in trouble.</p>
<p><strong>Solution: </strong>I will blog a bit more next week and make sure we will release some of the internal tools in the circulation this month. There is no excuse not to use logging API and assertion in Flex.</p>
<p>Sincerely,</p>
<p>Anatole Tartakovsky</p>
<p>�</p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/02/17/post-mortum-on-hopefully-not-yours-project/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Figaro qua, Figaro là &#8211; 360flex.org and http://www.eclipsecon.org/2007/ are running side-by-side</title>
		<link>http://flexblog.faratasystems.com/2007/02/14/figaro-qua-figaro-la-360flexorg-and-httpwwweclipseconorg2007-are-running-side-by-side</link>
		<comments>http://flexblog.faratasystems.com/2007/02/14/figaro-qua-figaro-la-360flexorg-and-httpwwweclipseconorg2007-are-running-side-by-side#comments</comments>
		<pubDate>Thu, 15 Feb 2007 02:43:25 +0000</pubDate>
		<dc:creator>Anatole Tartakovsky</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex 2]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://flexblog.faratasystems.com/?p=149</guid>
		<description><![CDATA[Two conferences are running side-by-side competing for better developers. Looks like I will be staying in CA for extra day &#8211; Eclipse one is running through March 8th. It would be interesting to see what new tools will be available to Flex developers sharing Eclipse IDE with the rest of the world.
At Eclipse conference, I [...]]]></description>
			<content:encoded><![CDATA[<p>Two conferences are running side-by-side competing for better developers. Looks like I will be staying in CA for extra day &#8211; Eclipse one is running through March 8th. It would be interesting to see what new tools will be available to Flex developers sharing Eclipse IDE with the rest of the world.</p>
<p>At Eclipse conference, I will be doing hands-on for a chance to &#8220;Show the light of Flex&#8221;  to very advanced group of Java developers/toolmakers: <a href="http://www.eclipsecon.org/2007/index.php?not_accepted=0&#038;page=sub/&#038;id=4009&#038;conference=2007">http://www.eclipsecon.org/2007/index.php?not_accepted=0&#038;page=sub/&#038;id=4009&#038;conference=2007</a> These are the people who define what next generation of Enterprise tools are going to be &#8211; with very interesting possibilities coming out of merging different technologies. Architecture of the future frameworks will depend on how well and seamlessly they would integrate with the current trends.</p>
<p>At 360Flex.org one I will be doing &#8220;Enterprise Applications&#8221; demo &#8211; how to build the &#8220;meat and potato&#8221; systems quickly and reliably having the resources available in the corporate world. The approach is very different, but the result is the same &#8211; the RAD development based on proven ideas of client-server programming applied to distributed/network-based topology. I&#8217;ll call the approach &#8220;getting-rich-quick&#8221; or some other name people feel good about.</p>
<p>It&#8217;s going to be a fun week &#8211; see you there and there.</p>
<p>Regards,</p>
<p>Anatole Tartakovsky</p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://flexblog.faratasystems.com/2007/02/14/figaro-qua-figaro-la-360flexorg-and-httpwwweclipseconorg2007-are-running-side-by-side/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
