<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>blog.joa-ebert.com - Blog of Joa Ebert</title>
	
	<link>http://blog.joa-ebert.com</link>
	<description>Actionscript3, Flash, Scala, Java, C#, C++, Algorithms &amp; Imageprocessing</description>
	<lastBuildDate>Wed, 28 Jul 2010 16:47:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/je2050" /><feedburner:info uri="je2050" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Apparat RC6: Say Hello To An Old Friend</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/xifk7iAzHHY/</link>
		<comments>http://blog.joa-ebert.com/2010/07/28/apparat-rc6-say-hello-to-an-old-friend/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 16:43:53 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[apparat]]></category>
		<category><![CDATA[as3c]]></category>
		<category><![CDATA[inline asm]]></category>
		<category><![CDATA[patrick le clec'h]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=628</guid>
		<description><![CDATA[Patrick Le Clec'h is an active committer to the Apparat [...]]]></description>
			<content:encoded><![CDATA[<p>Patrick Le Clec&#8217;h is an <a href="https://www.ohloh.net/p/apparat/contributors" target="_blank" title="Apparat Contributors">active committer</a> to the <a href="http://apparat.googlecode.com/" target="_blank" title="Apparat on Googlecode">Apparat</a> project and recently we just merged his work into the main branch. With a couple of other changes this is now a good time for another release candidate. Patrick added a good old friend to Apparat: The <code>__asm</code> function. You might remember <code>__asm</code> from my work on the now deprecated <a href="http://as3c.googlecode.com/" target="_blank" title="AS3C on Googlecode">AS3C</a> project.</p>
<p>However the Apparat version is much better. First of all we have put a lot of work into Apparat to make such transformations rock-solid. AS3C had its issues and was never a reliable tool. But there are a lot of new great features Patrick implemented. You can mix AS3 in your bytecode as well. <code>__as3</code> is the best friend of <code>__asm</code>. Because sometimes writing pure bytecode is very verbose and not necessary.</p>
<p>A simple <code>trace('Hello World!')</code> with pure bytecode would look like this. Please note the <code>FindPropStrict</code> and <code>CallPropVoid</code> operations which reference <code>trace</code>.</p>
<p><code>
<pre>__asm(
  FindPropStrict(AbcQName('trace', AbcNamespace(NamespaceKind.PACKAGE, ''))),
  PushString('Hello World!'),
  CallPropVoid(AbcQName('trace', AbcNamespace(NamespaceKind.PACKAGE, '')), 1)
);</pre>
<p></code></p>
<p>Finding the object in the correct namespace is often a very cumbersome task. Thanks to <code>__as3</code> we can also write this in a much more conciese way.</p>
<p><code>
<pre>__asm(
  FindPropStrict(__as3(trace)),
  PushString('Hello World!'),
  CallPropVoid(__as3(trace), 1)
);</pre>
<p></code></p>
<p>Note that the ASM compiler will try to guess the required name once it is requested by an operation. You can use <code>__as3</code> also for other tasks.</p>
<p><code>
<pre>
var x: int = 1;
__asm(
  FindPropStrict(__as3(trace)),
  __as3(x < 10),
  CallPropVoid(__as3(trace), 1)
);
</pre>
<p></code></p>
<p>This would trace "true" for instance. If you are curious about the ASM syntax I can recommend you using the dump tool. It produces code which is nearly <code>__asm</code>-ready. We will probably write another output so you can directly transform existing code to <code>__asm</code> calls.</p>
<p>If you are interested in some more examples the Apparat Math replacements make use of <code>__asm</code> now as well. <a href="http://code.google.com/p/apparat/source/browse/apparat-ersatz/src/main/as3/apparat/math/IntMath.as" target="_blank" title="Apparat IntMath">IntMath</a> is a good example for an inlined class where you are using maybe a simple method like <code>IntMath.abs</code> and the heavy lifting is done behind the scenes using inline assembler. To use the ASM expansion you have to process your SWF file with TDSI. It is by default turned on.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F07%2F28%2Fapparat-rc6-say-hello-to-an-old-friend%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F07%2F28%2Fapparat-rc6-say-hello-to-an-old-friend%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/07/28/apparat-rc6-say-hello-to-an-old-friend/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/07/28/apparat-rc6-say-hello-to-an-old-friend/</feedburner:origLink></item>
		<item>
		<title>LZMA compression in Apparat RC5</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/F2T2ORJYPQo/</link>
		<comments>http://blog.joa-ebert.com/2010/07/15/lzma-matryoshka/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 21:23:12 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[apparat]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[deflate]]></category>
		<category><![CDATA[lzma]]></category>
		<category><![CDATA[matryoshka]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=614</guid>
		<description><![CDATA[
I have released Apparat RC5 at GoogleCode. It contain [...]]]></description>
			<content:encoded><![CDATA[<div align="center"><img src="/wp-content/images/matryoshka.png" width="480" height="371" alt="Matryoshka avec moustache"/></div>
<p>I have released <a href="http://apparat.googlecode.com/" target="_blank" title="Apparat">Apparat</a> RC5 at GoogleCode. It contains a really cool feature which is called <a href="http://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Markov_chain_algorithm" target="_blank" title="Lempel-Ziv-Markov chain algorithm">LZMA</a> compression.</p>
<p>Reducer has advanced a lot during the last couple of weeks. It is now also a strong SWF compression tool even if you do not have any PNG files it can compress. You may ask: &#8220;What is that Matryoshka doing there? And why the hell the top hat?&#8221; The top hat: <a href="http://www.youtube.com/watch?v=SL-BTMEDEs4" target="_blank" title="42">I do not know</a>. The Matryoshka: I can explain.</p>
<p>The Flash Player does not understand LZMA. SWF files are compressed using good old <a href="http://en.wikipedia.org/wiki/Deflate" target="_blank" title="DEFLATE">DEFLATE</a>. So what happens? Apparat extracts your original SWF. It compresses it again using the LZMA algorithm. The compressed SWF is injected into another SWF that contains an LZMA decoder. Size, background color, frame rate, etc. get adjusted. Finally you get a new SWF that contains your old SWF and a decoder to extract it at runtime. The overhead of the decoder is currently at around 5kb and I hope I can get it even smaller.</p>
<p>When you open that SWF with the Flash Player it will extract your original file and load it. Another nice feature is that I created different versions of the runtime decoder. One is using a classic preloader which is great if your SWF is a little bit bigger. And hey: it is a preloader for free so you do not have to deal with the [Frame] hassle. But here is the catch. We at <a href="http://www.audiotool.com/" target="_blank">audiotool.com</a> always write our SWF files in the same style and I can just hope you do the same or use the great <a href="http://va.lent.in/blog/2010/07/08/initinjector-0-2b/" target="_blank" title="InitInjector 0.2b">InitInjector</a> by Valentin Simonov.</p>
<p>Your main SWF class or the so called DocumentClass must make sure that a <code>stage</code> is available before accessing it. This is really easy:</p>
<p><code>
<pre>public function Main() {
  addEventListener(Event.ADDED_TO_STAGE, init)
  if(null != stage) init()
}

private function init(event: Event = null): void {
  removeEventListener(Event.ADDED_TO_STAGE, init)
  // your original constructor code goes here ...
}</pre>
<p></code></p>
<p>Stick to that rule or InitInjector can automate it for you. Otherwise you will get a runtime exception that the <code>stage</code> is <code>null</code>. So this is one new feature. The other one is actually pretty standard. If you compile and link against a SWC file all classes will come in their own ABC file. Each ABC file has a constant pool. So if you link against 1000 classes you get 1000 constant pools. Reducer can merge all those files into a single one with some minor exceptions. It can also sort the constant pool so that constants which are used frequently consume less bytes when accessed. The <a href="http://funk-as3.googlecode.com" target="_blank" title="funk-as3">funk-as3</a> test runner which links against FlexUnit and the Flex framework is only loosing 3.01% of its weight with the old Reducer. The new version reduces it by 17.81% already thanks to the ABC merging. Combine that with some LZMA love and we get <b>35.34%</b>.</p>
<p>Besides you can call the LZMA compression as often as you want for some basic obfuscation. The LZMA compression alone is already a (weak) obfuscation of your bytecode.</p>
<p>Last but not least: <a href="http://www.youtube.com/watch?v=1D1cap6yETA" target="_blank" title="Good News">Good news everyone</a>! <a href="http://www.scala-lang.org/downloads" title="Scala Downloads" target="_blank">Scala 2.8</a> arrived so this is the last time you will have to update it for a while.</p>
<p>You can <a href="http://code.google.com/p/apparat/downloads/list" title="Apparat Downloads" target="_blank">download</a> the latest Apparat version at <a href="http://apparat.googlecode.com/" title="Apparat" target="_blank">GoogleCode</a>. Scala 2.8.0 is required.</p>
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F07%2F15%2Flzma-matryoshka%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F07%2F15%2Flzma-matryoshka%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/07/15/lzma-matryoshka/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/07/15/lzma-matryoshka/</feedburner:origLink></item>
		<item>
		<title>Apparat And Maven</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/DPbrTdCNBmw/</link>
		<comments>http://blog.joa-ebert.com/2010/07/03/apparat-and-maven/#comments</comments>
		<pubDate>Sat, 03 Jul 2010 09:10:06 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[apparat]]></category>
		<category><![CDATA[flexmojos]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=610</guid>
		<description><![CDATA[Two days ago I made a major change to the Apparat repos [...]]]></description>
			<content:encoded><![CDATA[<p>Two days ago I made a major change to the Apparat repository. I completely restructured the layout and fully integrated Apparat with Maven. We have now a plugin and archetypes for easy tooling. I also synchronized Apparat with the Maven central repository two weeks ago.</p>
<p>You might ask what the hell this is about. So in the current state you can download Apparat from Google Code. Then you have to have a working Scala installation which has been used to build Apparat. Whenever Scala is updated, I have to updated Apparat, and you will have to download Apparat again and install a new Scala version. This is absolutely cumbersome. This will change of course when Scala 2.8 is officially released.</p>
<p>I know that some people will always require command line access for Apparat. I am sorry for you at the moment that we have to play this game until 2.8 is out.</p>
<p>For the rest this is good news. If you have a working Maven 3.x version you can use the Apparat plugin and get automatic updates. This means you have to configure your project only once and do not bother with Scala and Apparat anymore. In fact if you want to you could also use the Apparat snapshot repository and get live updates.</p>
<p>Project configuration and setup is something one should not have to deal with. Therefore you can use the archetypes. I have built one for TurboDieselSportInjection.</p>
<pre><code>mvn archetype:generate \
  -DarchetypeRepository=http://oss.sonatype.org/content/repositories/snapshots \
  -DarchetypeGroupId=com.googlecode.apparat \
  -DarchetypeArtifactId=apparat-archetype-tdsi \
  -DarchetypeVersion=1.0-SNAPSHOT</code></pre>
<p>This terminal command is all you need to do to create a new project that is ready to compile &#8212; with TurboDieselSportInjection enabled. And it will automatically use the latest Apparat version.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F07%2F03%2Fapparat-and-maven%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F07%2F03%2Fapparat-and-maven%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/07/03/apparat-and-maven/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/07/03/apparat-and-maven/</feedburner:origLink></item>
		<item>
		<title>FITC San Francisco 2010</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/528Hp6ngpq4/</link>
		<comments>http://blog.joa-ebert.com/2010/07/01/fitc-san-francisco-2010/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 13:27:24 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[apparat]]></category>
		<category><![CDATA[fitc 2010]]></category>
		<category><![CDATA[san francisco]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=608</guid>
		<description><![CDATA[When you have people like Scott Dadich, Ben Fry, Kevin  [...]]]></description>
			<content:encoded><![CDATA[<p>When you have people like <a href="http://www.wired.com/" target="_blank">Scott Dadich</a>, <a href="http://www.processing.org/" target="_blank">Ben Fry</a>, <a href="http://www.adobe.com" target="_blank">Kevin Lynch</a> and <a href="http://www.yugop.com/" target="_blank">Yugo Nakamura</a> gathered at one conference you can be sure to expect nothing less than a stunning event.</p>
<p><a href="http://www.fitc.ca/" target="_blank">Shawn Pucknell</a> is obviously raising the bar. This will be a tough time for an ordinary speaker like me. However I have no other intentions than giving a <a href="http://www.fitc.ca/events/presentations/presentation.cfm?event=110&#038;presentation_id=1213" target="_blank">lecture</a> that proves itself worthy of this event.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F07%2F01%2Ffitc-san-francisco-2010%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F07%2F01%2Ffitc-san-francisco-2010%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/07/01/fitc-san-francisco-2010/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/07/01/fitc-san-francisco-2010/</feedburner:origLink></item>
		<item>
		<title>FATC Awards</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/5F0_k_Ghx54/</link>
		<comments>http://blog.joa-ebert.com/2010/06/10/fatc-awards/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 13:19:28 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[news]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[assurf]]></category>
		<category><![CDATA[fatc]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=601</guid>
		<description><![CDATA[ A couple of weeks ago the FlashAndTheCity conference t [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/images/fatc_award.jpg" alt="Lucky Me!" width="200" height="322" border="0" style="float: left; padding-right: 8px"/> A couple of weeks ago the <a href="http://www.flashandthecity.com/" target="_blank" title="FlashAndTheCity">FlashAndTheCity</a> conference took place in New York. Part of the program was also the FATC Awards ceremony. I am really happy, proud and thankful for winning two awards: &#8220;Most Talended Flash Developer of 2010&#8243; and &#8220;Best Contributor of 2010&#8243;. </p>
<p>A big thank you goes out to the organizers and the Flash community. It really shows that the opensource work I do is appreciated and not meaningless.</p>
<p>Part of the prize I already received has been donated to <a href="http://blog.inspirit.ru/" target="_blank" title="Eugene Zatepyakin">Eugene Zatepyakin</a>. I think he is doing great work on <a href="http://code.google.com/p/in-spirit/wiki/ASSURF" target="_blank" title="ASSURF">ASSURF</a> and was in desperate need of an FDT license ;)</p>
<p>Thank you. I hope I will be able to surprise you with some new stuff later this year.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F06%2F10%2Ffatc-awards%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F06%2F10%2Ffatc-awards%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/06/10/fatc-awards/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/06/10/fatc-awards/</feedburner:origLink></item>
		<item>
		<title>New Apparat Example</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/FqvpKgKcnW4/</link>
		<comments>http://blog.joa-ebert.com/2010/05/26/new-apparat-example/#comments</comments>
		<pubDate>Wed, 26 May 2010 11:50:54 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[experiments]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[apparat]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[inline]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=595</guid>
		<description><![CDATA[Good news everyone. The Apparat inline expansion works  [...]]]></description>
			<content:encoded><![CDATA[<p>Good news everyone. The Apparat inline expansion works now to full extent after fixing some minor bugs. A complete example is also available. Just change the paths in the <code>build.properties</code> file and compile everything using Ant.</p>
<div align="center"><img src="http://blog.joa-ebert.com/wp-content/images/apparat-shot.png" width="399" height="183" alt="Apparat Example"/></div>
<p>Use the inline feature with care. Apparat does not try to optimize your code and performs nothing but dead simple inlining. This can lead to <b>slower</b> code due to the creation of lots of local registers. Your code gets also much bigger and will require more space in memory. I am actually not a fan of manual inlining at all. I think it makes only sense to inline code if you have a powerful optimizer available that will cleanup the whole mess.</p>
<p>The fun story about this example is that the inlined version is slower using the lastes Flash Player release candidate if you have only 40.000 particles. That is why I increased the number of particles to 80.000 ;). I developed the example using an old standalone player and the inlined version was nearly twice as fast. However when I watched the example in the browser with the latest release candidate the game was completely different. Kudos to Adobe for significantly improving the Flash Player performance!</p>
<ul>
<li><a href="http://www.joa-ebert.com/swfs/apparat-example/as3" target="_blank" title="Pure AS3 version">AS3-only Version</a></li>
<li><a href="http://www.joa-ebert.com/swfs/apparat-example/apparat" target="_blank" title="Inline version">Inline Version</a></li>
<li><a href="http://code.google.com/p/apparat/downloads/detail?name=apparat-ant-example.zip" target="_blank" title="Source">Source</a></li>
</ul>
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F05%2F26%2Fnew-apparat-example%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F05%2F26%2Fnew-apparat-example%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/05/26/new-apparat-example/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/05/26/new-apparat-example/</feedburner:origLink></item>
		<item>
		<title>Inline Expansion</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/09YHMy6J9j4/</link>
		<comments>http://blog.joa-ebert.com/2010/05/24/inline-expansion/#comments</comments>
		<pubDate>Mon, 24 May 2010 18:12:57 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[apparat]]></category>
		<category><![CDATA[inline expansion]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=593</guid>
		<description><![CDATA[In addition to macro expansion Apparat has now inline e [...]]]></description>
			<content:encoded><![CDATA[<p>In addition to macro expansion Apparat has now inline expansion as well. It works nearly the same way as macro expansion but without most of its limitations. To define a class for inline usage it must extend <code>apparat.inline.Inlined</code> and all its methods must be static. However the cool thing is that you can also return values in contrast to macro expansion. You can also pass normal parameters. For instance <code>FastMath.sin(FastMath.sqrt(2.0))</code> is valid code using inline expansion. It is enabled by default in TDSI.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F05%2F24%2Finline-expansion%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F05%2F24%2Finline-expansion%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/05/24/inline-expansion/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/05/24/inline-expansion/</feedburner:origLink></item>
		<item>
		<title>Apparat For Scala 2.8 RC2</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/CVbl2GnqVKI/</link>
		<comments>http://blog.joa-ebert.com/2010/05/24/apparat-for-scala-2-8-rc2/#comments</comments>
		<pubDate>Mon, 24 May 2010 13:44:37 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[7z]]></category>
		<category><![CDATA[apparat]]></category>
		<category><![CDATA[scala 2.8-rc2]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=591</guid>
		<description><![CDATA[Apparat is now available using the Scala 2.8-RC2 build. [...]]]></description>
			<content:encoded><![CDATA[<p>Apparat is now available using the Scala 2.8-RC2 build. You can <a href="http://code.google.com/p/apparat/downloads/list?q=label:scala-2.8.0.RC2" target="_blank" title="Apparat on Google Code">find appropriate downloads</a> now on Google Code by searching for the Scala version of your choice. 7z compression on OS X should work now as well.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F05%2F24%2Fapparat-for-scala-2-8-rc2%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F05%2F24%2Fapparat-for-scala-2-8-rc2%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/05/24/apparat-for-scala-2-8-rc2/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/05/24/apparat-for-scala-2-8-rc2/</feedburner:origLink></item>
		<item>
		<title>Macro Expansion</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/sogwBdFPlTw/</link>
		<comments>http://blog.joa-ebert.com/2010/05/10/macro-expansion/#comments</comments>
		<pubDate>Mon, 10 May 2010 17:31:34 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[apparat]]></category>
		<category><![CDATA[inline]]></category>
		<category><![CDATA[macro expansion]]></category>
		<category><![CDATA[taas]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=588</guid>
		<description><![CDATA[Apparat has another new feature called Macro Expansion. [...]]]></description>
			<content:encoded><![CDATA[<p>Apparat has another new feature called <a href="http://code.google.com/p/apparat/wiki/MacroExpansion" title="Macro Expansion" target="_blank">Macro Expansion</a>. I talked about this with Nico Zimmermann at FFK in Cologne. Nico was using TDSI for a project but he was not very satisfied with it because you have to inline all inverse-square root tricks manually.<br />
This is why Apparat has now macro expansion. I am actually not a big fan of it. I think a good compiler would do this for you without you having to go through all the steps. Unfortunately writing this compiler will take longer than the couple of hours I have spent on the macro expansion today.</p>
<p>So if you want to have quick and dirty inlining capabilities: <a href="http://code.google.com/p/apparat/wiki/MacroExpansion" target="_blank" title="Macro Expansion">this is for you</a>. It is an easy fix for a feature a lot of people have asked for. I will continue working on TAAS to implement this much better in the future.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F05%2F10%2Fmacro-expansion%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F05%2F10%2Fmacro-expansion%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/05/10/macro-expansion/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/05/10/macro-expansion/</feedburner:origLink></item>
		<item>
		<title>Apparat: Crunching SWF Files Since 2009</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/e5Lp_TRFuHs/</link>
		<comments>http://blog.joa-ebert.com/2010/05/07/apparat-crunching-swf-files-since-2009/#comments</comments>
		<pubDate>Fri, 07 May 2010 15:37:04 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[projects]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=578</guid>
		<description><![CDATA[Apparat has a great new feature that allows you to crea [...]]]></description>
			<content:encoded><![CDATA[<p>Apparat has a great new feature that allows you to create even smaller files. Basic SWF files are compressed using Java&#8217;s standard <code>java.util.zip.Deflater</code> class. This is perfectly fine. And I would even go with no compression at all during development.</p>
<p>However when deploying you can spend some extra time compressing your SWF files with the best tools available. <a href="http://www.7-zip.org/" target="_blank" title="7-Zip">7-Zip</a> is for instance such a tool and achieves a great compression ratio.</p>
<p>If you have the 7z executable on your <code>PATH</code> Apparat will make use of it to achieve the best compression for your SWF files. More configuration options are available <a href="http://code.google.com/p/apparat/wiki/HiddenGems" target="_blank" title="HiddenGems">here</a>.</p>
<p>This feature is currently only implemented for SWF files and not SWCs. However every tool will make use of it by default. So if you are running Reducer and have no graphics in your SWF files you can still get a better compression.</p>
<p>An example is straight from the sources:</p>
<blockquote><p><code>
<pre>reducer -i as3\Apparat.Tests.AS3\bin\Test07.swf
[i] Apparat -- http://apparat.googlecode.com/
[i] Launching tool: Reducer
[i] Waiting for 7z ...
[i] Compression ratio: <b>18.224573%</b>
[i] Total bytes: 310
[i] Completed in 547ms.</pre>
<p></code></p></blockquote>
<p>Note please that this SWF file does not contain any graphical assets and we got still a ratio of 18%. Our main <code>audiotool.swf</code> file is compressed by about 10% &#8212; about 200kb &#8212; and contains no graphical assets either.</p>
<p>You can download the latest Apparat on <a href="http://code.google.com/p/apparat/downloads/detail?name=apparat.zip"  target="_blank" title="Download Apparat">Google Code</a>. Please note that you will need <a href="http://www.scala-lang.org/downloads" target="_blank" title="Scala Downloads">Scala 2.8 RC1</a> as well.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F05%2F07%2Fapparat-crunching-swf-files-since-2009%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F05%2F07%2Fapparat-crunching-swf-files-since-2009%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/05/07/apparat-crunching-swf-files-since-2009/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/05/07/apparat-crunching-swf-files-since-2009/</feedburner:origLink></item>
		<item>
		<title>We All Have To Agree</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/5Ev674s-hq4/</link>
		<comments>http://blog.joa-ebert.com/2010/04/11/we-all-have-to-agree/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 09:52:17 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[news]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[section311]]></category>
		<category><![CDATA[unity3d]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=568</guid>
		<description><![CDATA[
We’ve been there before, and intermediate layers be [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
We’ve been there before, and intermediate layers between the platform and the developer ultimately produces sub-standard apps and hinders the progress of the platform.
</p></blockquote>
<p>That is so right. The first thing that comes to my mind is Java on the Mac: sub-standard, castrated and broken. The second argument is even better. Intermediate layers can hinder the progress of a platform. So true. Apple, the intermediate layer between you and the iPhone, stops you from improving the platform. You have built something cool &#8212; like Unity3D &#8212; and can empower creative people with better tools? Sorry, you are out.</p>
<p>The only way to improve the progress of a platform is by opening it up. Yes, I think we have been there before.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F04%2F11%2Fwe-all-have-to-agree%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F04%2F11%2Fwe-all-have-to-agree%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/04/11/we-all-have-to-agree/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/04/11/we-all-have-to-agree/</feedburner:origLink></item>
		<item>
		<title>What Apple Just Did…</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/wkOPDNDddOw/</link>
		<comments>http://blog.joa-ebert.com/2010/04/09/what-apple-just-did/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 13:41:11 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[news]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[appstore]]></category>
		<category><![CDATA[free software]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=549</guid>
		<description><![CDATA[Musician: Hey Apple, I just had to accept a new license [...]]]></description>
			<content:encoded><![CDATA[<p><b>Musician:</b> Hey Apple, I just had to accept a new license agreement for your iTunes platform.<br />
<b>Apple:</b> So what? You have been really reading through it?<br />
<b>Musician:</b> It says that I have to use GarageBand if I want to see any music I produce on iTunes.<br />
<b>Apple:</b> Correct.<br />
<b>Musician:</b> Well but I do not like GarageBand. I would like to use Ableton Live.<br />
<b>Apple:</b> Sorry but you are not allowed to use that.<br />
<b>Musician:</b> But it is suited very well for electronic music.<br />
<b>Apple:</b> Use GarageBand then. It is a magical and amazing product!<br />
<b>Musician:</b> Okay fair enough, but what if I would like to play the piano? An instrument I have practiced since more than eight years. I think I am creating better music on a piano than with GarageBand.<br />
<b>Apple:</b> Then you invested your time in the wrong instrument.<br />
<b>Musician:</b> Okay. What about the Audiotool? Can I use it?<br />
<b>Apple:</b> That application does not even run on our devices. Those developers are lazy.<br />
<b>Musician:</b> Errr, okay. So if I use GarageBand I can do what I want?<br />
<b>Apple:</b> No. If you use the F-word in a song for example it won&#8217;t be distributed via iTunes.<br />
<b>Musician:</b> You are kidding. Why?<br />
<b>Apple:</b> Because we think that it is not appropriate.<br />
<b>Musician:</b> That must be a joke.<br />
<b>Apple:</b> Not at all. Your child could listen to that song &#8212; think about it.<br />
<b>Musician:</b> Well, I think I know best what&#8217;s good for my child. Besides, would some parental control system not help here?<br />
<b>Apple:</b> Next question please.<br />
<b>Musician:</b> Okay, assume I use GarageBand and that my content is &#8220;appropriate&#8221;. Can I be sure it will make it to the iTunes store?<br />
<b>Apple:</b> First we will check it.<br />
<b>Musician:</b> How long will that take?<br />
<b>Apple:</b> Up to two months.<br />
<b>Musician:</b> Are you serious?<br />
<b>Apple:</b> Yes. There is plenty of music being created and we want to filter only whats best for our users.<br />
<b>Musician:</b> And you think you can decide that?<br />
<b>Apple:</b> Sure.<br />
<b>Musician:</b> Okay, let me sum this up quickly: I have to use GarageBand to create any music for iTunes. It has to be &#8220;appropriate&#8221; and then you let me wait for quite some time to tell me whether you like it or not?<br />
<b>Apple:</b> Now you make it sound like as if we were evil. Google is evil. We are the good guys! And look, the new iPad. Isn&#8217;t it beautiful?<br />
<b>Musician:</b> Oh, yeah. I really want that overpriced product. Where can I buy it?<br />
<b>Apple:</b> In our certified Apple retail stores.<br />
<b>Musician:</b> And you will not pull me over this time like you did with the iPhone when you dropped the price dramatically two weeks after its release?<br />
<b>Apple:</b> No. Not exactly. We will release an iPad with a webcam soon. And we will charge $200 extra for that.<br />
<i>[...]</i></p>
<p>Sounds strange doesn&#8217;t it? Thank god this was just a fictional interview and will never become reality.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F04%2F09%2Fwhat-apple-just-did%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F04%2F09%2Fwhat-apple-just-did%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/04/09/what-apple-just-did/feed/</wfw:commentRss>
		<slash:comments>58</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/04/09/what-apple-just-did/</feedburner:origLink></item>
		<item>
		<title>Audiotool 1.0</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/dXWpLuKMrgk/</link>
		<comments>http://blog.joa-ebert.com/2010/03/25/audiotool-1-0/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 17:34:19 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[audiotool]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=541</guid>
		<description><![CDATA[We have finally released the first version of the Audio [...]]]></description>
			<content:encoded><![CDATA[<p>We have finally released the first version of the <a href="http://www.audiotool.com/" target="_blank" title="Audiotool">Audiotool</a>. I am very thankful for all the kind tweets and happy that our work is now available to the public.</p>
<p>However the current version is named Fire<b>starter</b> for a reason. What you see online is just the tip of the iceberg. I can not wait to start implementing all the cool features that will separate us from traditional software ;)
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F03%2F25%2Faudiotool-1-0%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F03%2F25%2Faudiotool-1-0%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/03/25/audiotool-1-0/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/03/25/audiotool-1-0/</feedburner:origLink></item>
		<item>
		<title>Compiling ActionScript In The Enterprise</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/AHRGF2kHgrk/</link>
		<comments>http://blog.joa-ebert.com/2010/03/06/compiling-actionscript-in-the-enterprise/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 13:29:16 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[asc]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[fdt]]></category>
		<category><![CDATA[fsch]]></category>
		<category><![CDATA[intellij idea]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=537</guid>
		<description><![CDATA[If you ask me if ActionScript is ready for the enterpri [...]]]></description>
			<content:encoded><![CDATA[<p>If you ask me if ActionScript is ready for the enterprise then this question is hard to answer. Every fairly huge codebase requires some maintenance. You will have to figure out a strategy to identify modules and separate them. You will also have to handle the dependencies between modules. Last but not least you have to compile those.</p>
<p>An important aspect is that when I am talking about modules  I am not talking about &#8220;Flex Modules&#8221; but the more generic term for a part of a project.</p>
<p>First of all you have to make sure to fulfill some requirements. You can not assume that every developer is working on the same platform using the same IDE with the same settings. But you must assume that your project will not be built from an IDE. You must also assure that the dependencies between projects are up to date across different platforms and IDEs. Once you have figured out how to do that you might want to think about a strategy to compile your modules.</p>
<p>Today I want to explore the idea of parallel compilation across a cluster of machines to yield optimal compile speed for ActionScript projects. First of all, you can not assume that a developer can always keep all modules up to date. Depending on the dependency graph of your projects compilation migh take very long. For instance we have 103 modules at Hobnox. This means we have 103 different compile targets with different dependencies, each yielding its own SWF/SWC file. We also have a &#8220;standard library&#8221; that is included in nearly every project. Changing this library will require the developer to recompile all 103 modules to update them.</p>
<p>To illustrate this example I want to explain what we went through.</p>
<ol>
<li>We used FDT to develop our project. Since FDT is Eclipse based every module was represented as a separate project with dependencies to other projects. FDT however compiles your project only once you launch it. And it does not do this automatically for your dependency graph. As a result you have to manually compile 103 modules in the correct order. This would not be the problem if FDT&#8217;s live error highlightning and code analysis would not work on a SWC basis. But since the actual source-code between projects is not analyzed we had to launch all 103 modules to propagate a possible error or change. This was for us the point when we had to make a switch.</li>
<li>Ant was our second idea to build our FDT projects automatically. However we had to keep module dependencies up to date in all the different Ant files because the FCSH requires that you include external libraries of a library also in a successor of another library. This means if A requires B and C requires A. Then C requires also B. So we had to keep 103 Ant targets up to date for each change.</li>
<li>A custom build. We started working with a custom build tool I have developed in Scala. This build tool was smart enough to figure out which modules have to be recompiled without launching the ActionScript compiler. It also figured out which projects could be compiled in parallel since the ActionScript compiler is written in a way that IO is not the only bottleneck. We had an enormous improvement in compile time and usability for the developer since module dependencies where handled automatically.</li>
<li>We switched from FDT to IntelliJ IDEA since it offered us more features that we needed. IntelliJ came also with a much better strategy to compile modules. Basically it had the feature we always missed for FDT to automatically include libraries and to compile modules in the correct order automatically. However the guys at JetBrains made a mistake by counting on FCSH. The short story is that FCSH is absolutely not capable of handling a large codebase. What happened to us was that when we started a build FCSH would take up as much memory as it could, getting much slower until it finally crashed. Then FCSH started from scratch, consumed the maximum amount of memory again and crashed. This happend until a project was finally compiled but took also more than 15 minutes for a single change we made. This was of course unacceptable. Fortunately JetBrains implemented a feature request from us into IntelliJ IDEA which comes close to our custom build. From now on projects are compiled in parallel without using FCSH and without asking launching the compiler if no change has been made. This way we are able to work again. However only if we compile just a short amount of all modules since the main bottleneck is still the compiler.</li>
<li>A continuous integration server was our last option. This is a custom build server and we are using it until today. After each SVN commit we are building the required modules and their dependencies now automatically on a dedicated server. A change in the standard library takes about four minutes to complete now on a quad core. But the good thing is that we have set our main project to exclude a lot of libraries. The custom build takes care of that and we are loading now modules from the server. That way we can still compile local and include libraries we frequently change. Other libraries are loaded from the server and included at runtime.</li>
</ol>
<p>So the question is if this is now the ultimate solution. A custom continuous integration server that takes more than 4 minutes to propagate a change after a SVN commit? I do not think so. And here comes Scala into the game again. There is a project available called <a href="http://code.google.com/p/swarm-dpl/" target="_blank" title="Swarm">Swarm</a>. It makes use of Scala&#8217;s support for serializable delimited continuations. This means you can pause the state of your current program, send it to a different node in your cluster and continue with the program on that machine. And Swarm makes this task extremely simple. So for now a new research project is to take advantage of this feature. We can basically have one master server like Hudson or TeamCity and write a plugin for it that makes use of Scala Swarm. Swarm could be based on nodes in the office, normal computers and maybe a couple of dedicated servers to compile modules in parallel on multiple nodes. Each node would have to keep the VCS up to date. That way we should be able to compile projects much quicker and have a much better workflow in a large codebase. Besides that if you work with a CI server than you could also have the task of code analysis using FlexPMD for instance done on another machine as well.</p>
<p>I am really looking forward to this project when I have some time to work on it. My goal is to develop a plug-in for <a href="http://www.jetbrains.com/teamcity/" target="_blank" title="TeamCity">TeamCity</a> that we will use internally first. I expect to reduce the time for a full rebuild from about 4min to something like 30sec. This would be a huge benefit. I also hope that we will be able to make that plug-in available to the public.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F03%2F06%2Fcompiling-actionscript-in-the-enterprise%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F03%2F06%2Fcompiling-actionscript-in-the-enterprise%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/03/06/compiling-actionscript-in-the-enterprise/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/03/06/compiling-actionscript-in-the-enterprise/</feedburner:origLink></item>
		<item>
		<title>The Advantage Of ActionScript</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/DjUZKa-AbAU/</link>
		<comments>http://blog.joa-ebert.com/2010/02/11/the-advantage-of-actionscript/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 11:40:24 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[personal]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actor]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=530</guid>
		<description><![CDATA[Despite the fact that ActionScript has a couple of majo [...]]]></description>
			<content:encoded><![CDATA[<p>Despite the fact that ActionScript has a couple of major glitches and missconceptions I think there are also a couple of great key features that force you to write better applications due to the language design.</p>
<p>First of all we have to aknowledge that ActionScript has some great features. Those include implicit getters and setters or method closures for instance. Java 7 will have method closures finally after a lot of argy-bargy about their complexity et cetera. ActionScript developers are used to method closures and are buddy-buddy with them since Flash 4 I think.</p>
<p>But what is the real advantage of ActionScript? Here are my thoughts.</p>
<ol>
<li>
<h4>Poor Performance</h4>
<p>Yes. We have been educated  to optimize the hell out of our code. We have been educated to think about our code and how it performs. We have been educated to be creative with our tools, to tinker around. I know that this is not something to be essentially proud of but it led to a lot of creative and astonishing experiments. If you would tell a Java programmer you are still developing object pools they will laugh at you for a good reason. This is where the poor performance is annoying but something is very important: the potential. Think with the mind of a carpetbagger. Shares on the stock-market that never have a downturn are less interesting because there is less profit potential. So why am I talking about this? It is quite simple: Flash has still a lot of potential for growth. Flash did not pass its zenith already like other virtual machines. This makes me very optimistic for the future. There is still so much potential for the growth in performance and I think that <a href="http://apparat.googlecode.com/" target="_blank">Apparat</a> has shown this as well.</li>
<li>
<h4>Forced Asynchronism</h4>
<p>ActionScript has no ability to perform blocking operations (despite of AIR). This makes every application responsive. If you load files from an external source like a URL your application will stay responsive because you have to add listeners that react on certain events. I know this is somtimes cumbersome but every good application should make use of asynchronous IO for instance. If people are lazy they will simply spawn a new thread to perform blocking operations which is also okay but less performant. Usually the simple example is a server where you would spawn a new thread for every client. This is the worst you can do and Java tackles this issue with its <a href="http://en.wikipedia.org/wiki/New_I/O" target="_blank">NIO</a>. However a lot of people do not make use of NIO because they think it is hard to use for common tasks.</li>
<li>
<h4>Events</h4>
<p>Events are a great way to achieve concurrency. Some people call this immutable message passing. If your events do not contain state or are immutable, you have a powerful system to tackle concurrency. Basically this is what the EventDispatcher is all about. You add listeners for certain messages to a dispatcher and then you react on a message when it is dispatched to you. Again we have been educated to use a system which forces us to write responsive applications that is not based on synchronization and locks like Java or C++. If Adobe decides to implement multithreading in the Flash Player I hope they will choose to implement the approach of Erlang which is all about immutable events and event dispatchers. The only difference is that Erlang programmers call them <a href="http://www.javaworld.com/javaworld/jw-02-2009/jw-02-actor-concurrency1.html" target="_blank">actors</a>.</li>
</ol>
<p>This post is not an ode to ActionScript. There are still major issues like the lack of parameterized types. But I do think that there is a lot of potential. We can grow with the language and we can tackle upcomming issues. Concurrency is one of them, limited resources on a mobile device are another one.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F02%2F11%2Fthe-advantage-of-actionscript%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F02%2F11%2Fthe-advantage-of-actionscript%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/02/11/the-advantage-of-actionscript/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/02/11/the-advantage-of-actionscript/</feedburner:origLink></item>
		<item>
		<title>Infinite Lies</title>
		<link>http://feedproxy.google.com/~r/je2050/~3/jFlp5rds3P4/</link>
		<comments>http://blog.joa-ebert.com/2010/01/31/infinite-lies/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 21:25:22 +0000</pubDate>
		<dc:creator>joa</dc:creator>
				<category><![CDATA[personal]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[lies]]></category>

		<guid isPermaLink="false">http://blog.joa-ebert.com/?p=512</guid>
		<description><![CDATA[What you have told us is rubbish. The "open web" is rea [...]]]></description>
			<content:encoded><![CDATA[<p>What you have told us is rubbish. The &#8220;open web&#8221; is really an acronym for Apple&#8217;s cash cow supported on the back of a giant <del datetime="2010-01-31T21:17:02+00:00">tortoise</del> lie. <em>But Steve Jobs said that Flash is responsible for most of the OS X crashes!</em> You are very clever, young man, very clever. But it is lies all the way down.
<div class="tweetmeme_button" style="float: right; margin-right: 10px; margin-top: 38px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F01%2F31%2Finfinite-lies%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.joa-ebert.com%2F2010%2F01%2F31%2Finfinite-lies%2F&amp;source=joa&amp;style=normal&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.joa-ebert.com/2010/01/31/infinite-lies/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://blog.joa-ebert.com/2010/01/31/infinite-lies/</feedburner:origLink></item>
	</channel>
</rss>
