<?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>w3blog &#187; AS3</title>
	<atom:link href="http://wahlers.com.br/claus/blog/category/webdev/as3/feed/" rel="self" type="application/rss+xml" />
	<link>http://wahlers.com.br/claus/blog</link>
	<description>Claus Wahlers on Application Development, Web Standards, SWF and what not</description>
	<lastBuildDate>Mon, 06 Feb 2012 19:53:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>ActionScript 3 Bitmap Tracer (Vectorizer): as3potrace</title>
		<link>http://wahlers.com.br/claus/blog/as3-bitmap-tracer-vectorizer-as3potrace/</link>
		<comments>http://wahlers.com.br/claus/blog/as3-bitmap-tracer-vectorizer-as3potrace/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 05:23:35 +0000</pubDate>
		<dc:creator>Claus Wahlers</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://wahlers.com.br/claus/blog/?p=262</guid>
		<description><![CDATA[Ever wanted to convert a bitmap to vector shapes, at runtime, in Flash? Look no further. Let me introduce you to as3potrace, an ActionScript 3 library to trace bitmaps. As the name suggests, this is a port of the well known C library potrace by Peter Selinger. To be more exact, it is a AS3 [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwahlers.com.br%252Fclaus%252Fblog%252Fas3-bitmap-tracer-vectorizer-as3potrace%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Fgw6qJI%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22ActionScript%203%20Bitmap%20Tracer%20%28Vectorizer%29%3A%20as3potrace%22%20%7D);"></div>
<p>Ever wanted to convert a bitmap to vector shapes, at runtime, in Flash? Look no further. Let me introduce you to <a href="https://github.com/PowerflasherBR/as3potrace">as3potrace</a>, an ActionScript 3 library to trace bitmaps.</p>
<p>As the name suggests, this is a port of the well known C library <a href="http://potrace.sourceforge.net/">potrace</a> by Peter Selinger. To be more exact, it is a AS3 port of <a href="http://www.drawing3d.de/Downloads.aspx">Vectorization</a>, a C# port of potrace 1.8 by Wolfgang Nagl.</p>
<p>Like potrace, as3potrace is released under GPL. The SWC and source code are available on GitHub:</p>
<p><a href="https://github.com/PowerflasherBR/as3potrace">https://github.com/PowerflasherBR/as3potrace</a></p>
<p><strong>Demo</strong></p>
<p>
<object width="475" height="475">
<param name="movie" value="http://wahlers.com.br/claus/blog/wp-content/uploads/POTrace.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<param name="allowScriptAccess" value="always"></param>
<embed type="application/x-shockwave-flash" width="475" height="475" src="http://wahlers.com.br/claus/blog/wp-content/uploads/POTrace.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</p>
<p>Demo source code: <a href="https://gist.github.com/940219">https://gist.github.com/940219</a> (Warning: ugly)</p>
<p><strong>Usage example</strong></p>
<p>A minimal example of how to trace a bitmap with as3potrace, and draw the result into a <code>Shape</code>:</p>
<p><script src="https://gist.github.com/940180.js?file=gistfile1.as"></script></p>
<p>Note that you can write your own backends to ease handling/processing of generated shapes. The one backend that i already wrote, <code>GraphicsDataBackend</code>, produces <code>GraphicsData</code> structures that you can immediately draw using <code>Graphics.drawGraphicsData()</code>.</p>
<p><strong>Alternatives</strong></p>
<p>And as always, after i finished porting this little beauty, i found out that this has been done before by the amazing folks at LibSpark. Check out nitoyon&#8217;s <a href="http://www.libspark.org/wiki/nitoyon/PotrAs">PotrAs</a> (also GPL&#8217;ed).</p>

]]></content:encoded>
			<wfw:commentRss>http://wahlers.com.br/claus/blog/as3-bitmap-tracer-vectorizer-as3potrace/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Flash IDE Inspired Flex 4 Timeline Component</title>
		<link>http://wahlers.com.br/claus/blog/flash-ide-inspired-flex-4-timeline-component/</link>
		<comments>http://wahlers.com.br/claus/blog/flash-ide-inspired-flex-4-timeline-component/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 18:45:29 +0000</pubDate>
		<dc:creator>Claus Wahlers</dc:creator>
				<category><![CDATA[Air]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex 4]]></category>
		<category><![CDATA[SWF]]></category>
		<category><![CDATA[WebDev]]></category>

		<guid isPermaLink="false">http://wahlers.com.br/claus/blog/?p=225</guid>
		<description><![CDATA[Here&#8217;s a little demo of a Flex 4 component i wrote that displays a Flash IDE-like timeline for any SWF you load into it. The timeline data is reconstructed by as3swf (i discuss how that works in a previous blog post, SWF Timeline Reconstruction with as3swf). The timeline is not interactive in this demo, and [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwahlers.com.br%252Fclaus%252Fblog%252Fflash-ide-inspired-flex-4-timeline-component%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Fdllx07%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Flash%20IDE%20Inspired%20Flex%204%20Timeline%20Component%22%20%7D);"></div>
<p>Here&#8217;s a little demo of a Flex 4 component i wrote that displays a Flash IDE-like timeline for any SWF you load into it. The timeline data is reconstructed by <a href="http://github.com/claus/as3swf">as3swf</a> (i discuss how that works in a previous blog post, <a href="http://wahlers.com.br/claus/blog/timeline-reconstruction-with-as3swf/">SWF Timeline Reconstruction with as3swf</a>). The timeline is not interactive in this demo, and only the root timeline is shown.</p>
<p><span id="more-225"></span></p>
<p>
<object width="470" height="230">
<param name="movie" value="http://wahlers.com.br/claus/blog/wp-content/uploads/timeline/TestTimelineComponent.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<param name="allowScriptAccess" value="always"></param>
<embed type="application/x-shockwave-flash" width="470" height="230" src="http://wahlers.com.br/claus/blog/wp-content/uploads/timeline/TestTimelineComponent.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</p>
<p>The component is a subclassed Spark List with a custom virtual layout and item renderer, capable of rendering SWF timelines with a lot of frames/layers in a high performance and memory efficient way.</p>
<p>I have no plans to publish the source code anytime soon, but in case you are interested in using this or anything related in your own projects, please feel free to <a href="http://wahlers.com.br/claus/">contact me</a> for licensing/consulting.</p>

]]></content:encoded>
			<wfw:commentRss>http://wahlers.com.br/claus/blog/flash-ide-inspired-flex-4-timeline-component/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>My Silly Gist Collection</title>
		<link>http://wahlers.com.br/claus/blog/my-silly-gist-collection/</link>
		<comments>http://wahlers.com.br/claus/blog/my-silly-gist-collection/#comments</comments>
		<pubDate>Sat, 25 Sep 2010 04:13:09 +0000</pubDate>
		<dc:creator>Claus Wahlers</dc:creator>
				<category><![CDATA[Air]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[SWF]]></category>
		<category><![CDATA[WebDev]]></category>

		<guid isPermaLink="false">http://wahlers.com.br/claus/blog/?p=198</guid>
		<description><![CDATA[I&#8217;ve been quite busy lately on both client and personal projects (can&#8217;t talk about the former, other than it being a big ass Flex 4 enterprise application i&#8217;ve been working on for the fine folks at Powerflasher; and it&#8217;s too early to talk about the latter.. stay tuned). In the last few weeks i silently [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwahlers.com.br%252Fclaus%252Fblog%252Fmy-silly-gist-collection%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Fb55Llp%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22My%20Silly%20Gist%20Collection%22%20%7D);"></div>
<p>I&#8217;ve been quite busy lately on both client and personal projects (can&#8217;t talk about the former, other than it being a big ass Flex 4 enterprise application i&#8217;ve been working on for the fine folks at Powerflasher; and it&#8217;s too early to talk about the latter.. stay tuned).</p>
<p>In the last few weeks i silently released random little experiments on Gist &#8211; mostly fallout from personal projects of mine. Nothing super impressive, all pretty rough, but i thought some of you might be interested.</p>
<p><span id="more-198"></span></p>
<p>So here it is, my silly Gist collection.</p>
<p><strong>1. Show the compile date of a SWF</strong></p>
<p>You are developing a Flex application. You frequently publish the application to a staging server for QA to test. You want to ensure that QA always tests the latest version of your application, because aggressive cache settings in browser or proxy servers may result in QA seeing outdated, cached SWFs.</p>
<p>To make sure that QA looks at the latest version of the SWF, you can have the SWF inspect itself and search for a <code>ProductInfo</code> tag, which contains the compile date (<code>ProductInfo</code> is an undocumented SWF tag, i explain it in more detail <a href="http://wahlers.com.br/claus/blog/undocumented-swf-tags-written-by-mxmlc/">here</a>). You can then have your Flex application display this date in order to be able to verify that QA sees the latest version.</p>
<p>Here&#8217;s how to do that:</p>
<p><a href="http://gist.github.com/594367">http://gist.github.com/594367</a></p>
<p><strong>2. Bin Packer</strong></p>
<p>For a project i am working on, i needed an algorithm to fit as many randomly sized rectangles as possible into a given, larger rectangle (the bin). Turned out, there are a lot of different approaches out there (unfortunately none of the more elaborate ones is much better than O(argh) &#8211; the more rectangles you try to fit, the slower the algorithms get).</p>
<p>I found one resource particularly helpful: <a href="http://clb.demon.fi/">clb.demon.fi</a> explains some selected Bin Packer algorithms in great detail, and provides many links to others. They also provide a <a href="http://clb.demon.fi/projects/even-more-rectangle-bin-packing">C implementation</a> for a bunch of algorithms.</p>
<p>I ported their Max Rect Bin Packer implementation to ActionScript 3, and added the option to have it execute asynchronously:</p>
<p><a href="http://gist.github.com/543176">http://gist.github.com/543176</a></p>
<p>Demo (click to restart):</p>
<p>
<object width="400" height="256">
<param name="movie" value="http://wahlers.com.br/claus/blog/wp-content/uploads/BinPacker.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<param name="allowScriptAccess" value="always"></param>
<embed type="application/x-shockwave-flash" width="400" height="256" src="http://wahlers.com.br/claus/blog/wp-content/uploads/BinPacker.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</p>
<p><strong>3. De Casteljau: Move a point along a quadratic bezier</strong></p>
<p>Recently i needed an algorithm to split a quadratic bezier curve in two. The solution was <a href="http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html">De Casteljau&#8217;s algorithm</a>.</p>
<p><a href="http://gist.github.com/524163">http://gist.github.com/524163</a></p>
<p>Demo (click to restart):</p>
<p>
<object width="400" height="400">
<param name="movie" value="http://wahlers.com.br/claus/blog/wp-content/uploads/DeCasteljau.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<param name="allowScriptAccess" value="always"></param>
<embed type="application/x-shockwave-flash" width="400" height="400" src="http://wahlers.com.br/claus/blog/wp-content/uploads/DeCasteljau.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</p>
<p><strong>4. Silly font glyph plotter</strong></p>
<p>This Flash movie parses itself, grabs the first glyph of an embedded font and draws it on screen (uses <a href="http://github.com/claus/as3swf">as3swf</a> to parse itself, so you need <a href="http://github.com/claus/as3swf/tree/master/bin/">as3swf.swc</a>). Kinda silly.</p>
<p><a href="http://gist.github.com/523033">http://gist.github.com/523033</a></p>
<p>Demo:</p>
<p>
<object width="400" height="420">
<param name="movie" value="http://wahlers.com.br/claus/blog/wp-content/uploads/FontGlyph.swf"></param>
<param name="quality" value="high"></param>
<param name="wmode" value="window"></param>
<param name="menu" value="false"></param>
<param name="bgcolor" value="#FFFFFF"></param>
<param name="allowScriptAccess" value="always"></param>
<embed type="application/x-shockwave-flash" width="400" height="420" src="http://wahlers.com.br/claus/blog/wp-content/uploads/FontGlyph.swf" quality="high" bgcolor="#FFFFFF" wmode="window" menu="false" ></embed>
</object>
</p>
<p><strong>5. Convert HTML to XML and use E4X to access DOM (AIR required)</strong></p>
<p>Here&#8217;s a little utility function i wrote. <a href="http://github.com/claus/as3utils/blob/master/src/com/codeazur/utils/XMLUtil.as"><code>XMLUtils.jsDomToE4X()</code></a> converts HTML loaded via HTMLLoader (or the HTML DOM to be exact) into an AS3 XML object, so you can use simple E4X queries to scrape a HTML page. Evil.</p>
<p>And here&#8217;s the source code for a minimalistic web browser built upon the Adobe AIR Flex HTML component, that dumps out the URLs of SWFs embedded into the loaded HTML document.</p>
<p>The basic idea:</p>
<pre><code>var x:XML = XMLUtil.jsDomToE4X(htmlControl.domWindow.document);
var ns:Namespace = Namespace("http://www.w3.org/1999/xhtml");
var embeds:XMLList = <strong>x..ns::embed.@src</strong>;</code></pre>
<p>The full source:</p>
<p><a href="http://gist.github.com/456130">http://gist.github.com/456130</a></p>
<p><strong>That&#8217;s all, folks!</strong></p>
<p>I hope you enjoyed my silly little collection. Please also check out my &#8220;serious&#8221; work on <a href="http://github.com/claus">GitHub</a>, and feel free to <a href="http://twitter.com/cwahlers">follow me</a> on Twitter.</p>

]]></content:encoded>
			<wfw:commentRss>http://wahlers.com.br/claus/blog/my-silly-gist-collection/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Realtime MP3 Decoding in Actionscript 3</title>
		<link>http://wahlers.com.br/claus/blog/realtime-mp3-decoding-in-actionscript-3/</link>
		<comments>http://wahlers.com.br/claus/blog/realtime-mp3-decoding-in-actionscript-3/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 09:27:49 +0000</pubDate>
		<dc:creator>Claus Wahlers</dc:creator>
				<category><![CDATA[AS3]]></category>

		<guid isPermaLink="false">http://wahlers.com.br/claus/blog/?p=144</guid>
		<description><![CDATA[So did you ever try to play Shoutcast streams in Flash? Did you run into memory leaks? Did the playback sound pitched or otherwise screwed? Fear no more. Let me introduce you to <a href="http://github.com/claus/as3icy">as3icy</a>.]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwahlers.com.br%252Fclaus%252Fblog%252Frealtime-mp3-decoding-in-actionscript-3%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FbYAwng%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Realtime%20MP3%20Decoding%20in%20Actionscript%203%22%20%7D);"></div>
<p>So did you ever try to play Shoutcast streams in Flash? Did you run into memory leaks? Did the playback sound pitched or otherwise screwed? Fear no more. Let me introduce you to <a href="http://github.com/claus/as3icy">as3icy</a>.</p>
<p><a href="http://github.com/claus/as3icy">as3icy</a> is a drop-in replacement for the Flash Player&#8217;s Sound object that can reliably play Shoutcast, Icecast and Limewire MP3 streams. And it extracts metadata info from the stream in real time. It also reliably plays VBR MP3.</p>
<p><span id="more-144"></span></p>
<p>DISCLAIMER IN CAPITAL LETTERS. This is experimental code. I basically threw this code together in two 24 hour coding sessions. Also, i know as much about sound engineering as i know about pottery &#8211; i blind-ported a big chunk of Java code (the excellent <a href="http://www.javazoom.net/javalayer/javalayer.html">JLayer MP3</a> decoder, originally ported from C if i&#8217;m not mistaken) to Actionscript 3 without really knowing what i was doing. So expect a few WTF moments when reading through the code, and do not expect everything to work perfectly just yet.</p>
<p><strong>Some known issues</strong></p>
<ul>
<li><span style="color: red;">IT IS SLOW AND STRESSES YOUR CPU</span>. Depending on the encoding, i get around 20-50% load on my 2.4GHz Core 2 Duo (Vista), which is way too much. On my MacBook Air 2.16 GHz: full load and playback chokes, which is unacceptable. There is plenty of room for optimization though, the code is currently not optimized at all. It&#8217;s probably worth taking a look at Apparat, or Alchemy in general for more performant alternatives to decode MP3..</li>
<li>Only Layer III is supported (Layer I and II decoders not ported yet).</li>
<li>Only 44100Hz playback is supported (up/down-sampling to 44100Hz not implemented yet).</li>
<li>Only stereo modes are supported (mono not implemented yet).</li>
<li>The stream parser seems to be with problems yet, sometimes it happens that it runs out of sync for some reason.</li>
</ul>
<p>Also, Adobe AIR is recommended to play Shoutcast streams, for two reasons: The meta data interval is passed back to the client via HTTP response headers, which are not available in the plugin version of the Flash Player, and as soon as you put the thing online you need the streaming server to host a crossdomain.xml file. If you happen to have access to the streaming server, you can of course solve these issues by hardcoding the meta data interval and have the streaming server serve an appropriate crossdomain.xml, or by using a proxy script of some sort. Also, this only applies to playing Shoutcast streams. You can play static MP3 files (for example VBR MP3s) using as3swf in the plugin version of the Flash Player without any problem (security restrictions still apply of course).</p>
<p><strong>A simple example: Shoutcast stream playback</strong></p>
<pre><code>package
{
  import com.codeazur.as3icy.ICYSound;
  import com.codeazur.as3icy.events.ICYMetaDataEvent;

  import flash.display.Sprite;
  import flash.events.HTTPStatusEvent;
  import flash.net.URLRequest;
  import flash.net.URLRequestHeader;

  public class SimpleShoutcastPlayer extends Sprite
  {
    protected static const URL:String = "http://72.233.14.70/hype";

    protected var icySound:ICYSound;

    public function SimpleShoutcastPlayer()
    {
      var req:URLRequest = new URLRequest(URL);
      req.requestHeaders = [ new URLRequestHeader("Icy-Metadata", "1") ];
      icySound = new ICYSound();
      icySound.addEventListener(ICYMetaDataEvent.METADATA, metaDataHandler);
      icySound.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, httpResponseStatusHandler);
      icySound.load(req);
      icySound.play();
    }

    protected function httpResponseStatusHandler(e:HTTPStatusEvent):void {
      // The HTTP_RESPONSE_STATUS event is fired when the stream is opened and starting to load.
      var s:String = "Connected!";
      if (icySound.icyName.length > 0) { s += "\rName: " + icySound.icyName; }
      if (icySound.icyDescription.length > 0) { s += "\rDescription: " + icySound.icyDescription; }
      if (icySound.icyUrl.length > 0) { s += "\rURL: " + icySound.icyUrl; }
      if (icySound.icyServer.length > 0) { s += "\rServer: " + icySound.icyServer; }
      if (icySound.icyMetaInterval > 0) { s += "\rMeta Interval: " + icySound.icyMetaInterval; }
      trace(s);
    }

    protected function metaDataHandler(e:ICYMetaDataEvent):void {
      // The METADATA event is fired when new metadata is available.
      if (e.metaData.length > 0) {
        trace("Now playing: " + e.metaData.slice(13, -2));
      }
    }
  }
}</code></pre>
<p>This code (Adobe AIR required) plays the <a href="http://hypem.com/#/radio/live">Hype Machine live radio stream</a>, and traces out general information about the station, as well as the names of currently playing songs.</p>
<p>Note that we set a custom request header, <code>Icy-Metadata: 1</code>. This tells the server to periodically send meta data with the stream. Under the hood, as3icy transparently extracts this meta data from the stream in real time and passes it to the application via the ICYMetaDataEvent. This event won&#8217;t be fired when the request header above is not sent.</p>
<p>The trace output should look something like this:</p>
<pre><code>Connected!
Name: Hype Radio
Description: Radio powered by music blogs
URL: http://hypem.com/radio/
Server: Icecast 2.3.1
Meta Interval: 16000
Now playing: Collider - Time Concerns
Now playing: Rogue Wave - Birds (Neil Young cover)
Now playing: The Big Pink – Dominos
[..]</code></pre>

]]></content:encoded>
			<wfw:commentRss>http://wahlers.com.br/claus/blog/realtime-mp3-decoding-in-actionscript-3/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>SWFtrospection</title>
		<link>http://wahlers.com.br/claus/blog/swftrospection/</link>
		<comments>http://wahlers.com.br/claus/blog/swftrospection/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 21:58:10 +0000</pubDate>
		<dc:creator>Claus Wahlers</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[SWF]]></category>

		<guid isPermaLink="false">http://wahlers.com.br/claus/blog/?p=151</guid>
		<description><![CDATA[Open Flash CS4, create new AS3 FLA, add as3swf.swc and paste this on frame 1: import com.codeazur.as3swf.SWF; var swf:SWF = new SWF(root.loaderInfo.bytes); trace(swf); Trace output: [SWF] Header: Version: 10 FileLength: 149405 FileLengthCompressed: 149405 FrameSize: (550,400) FrameRate: 24 FrameCount: 1 Tags: [69:FileAttributes] AS3: true, HasMetadata: false, UseDirectBlit: false, UseGPU: false, UseNetwork: false [09:SetBackgroundColor] Color: #FFFFFF [86:DefineSceneAndFrameLabelData] [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwahlers.com.br%252Fclaus%252Fblog%252Fswftrospection%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22SWFtrospection%22%20%7D);"></div>
<p>Open Flash CS4, create new AS3 FLA, add <a href="http://github.com/claus/as3swf/blob/master/bin/as3swf.swc">as3swf.swc</a> and paste this on frame 1:</p>
<pre><code>import com.codeazur.as3swf.SWF;
var swf:SWF = new SWF(root.loaderInfo.bytes);
trace(swf);</code></pre>
<p>Trace output:</p>
<pre><code>[SWF]
  Header:
    Version: 10
    FileLength: 149405
    FileLengthCompressed: 149405
    FrameSize: (550,400)
    FrameRate: 24
    FrameCount: 1
  Tags:
    [69:FileAttributes] AS3: true, HasMetadata: false,
      UseDirectBlit: false, UseGPU: false, UseNetwork: false
    [09:SetBackgroundColor] Color: #FFFFFF
    [86:DefineSceneAndFrameLabelData]
      Scenes:
        [0] Frame: 0, Name: Scene 1
    [82:DoABC] Lazy: true, Length: 149219
    [76:SymbolClass]
      Symbols:
        [0] TagID: 0, Name: Untitled_fla.MainTimeline
    [01:ShowFrame]
    [00:End]</code></pre>
<p>Excercise: Draw something on stage, and run the code again.</p>
<p>Want more? Drop by my session <a href="http://www.fitc.ca/events/presentations/presentation.cfm?event=101&#038;presentation_id=1078">Hacking SWF</a> at <a href="http://www.fitc.ca/events/about/?event=101">FITC Amsterdam</a> (Feb 22th, 16:00).</p>
<p>[Edit] <a href="http://twitter.com/jimcheng">Jim Cheng</a> deserves credits. He was the one who whispered &#8220;root.loaderInfo.bytes&#8221; into my virtual ear on IM.</p>

]]></content:encoded>
			<wfw:commentRss>http://wahlers.com.br/claus/blog/swftrospection/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Undocumented SWF Tags written by MXMLC</title>
		<link>http://wahlers.com.br/claus/blog/undocumented-swf-tags-written-by-mxmlc/</link>
		<comments>http://wahlers.com.br/claus/blog/undocumented-swf-tags-written-by-mxmlc/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 20:45:51 +0000</pubDate>
		<dc:creator>Claus Wahlers</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[SWF]]></category>
		<category><![CDATA[WebDev]]></category>

		<guid isPermaLink="false">http://wahlers.com.br/claus/blog/?p=89</guid>
		<description><![CDATA[While testing my AS3 SWF library as3swf yesterday, i found that MXMLC (the compiler that comes with the Flex SDKs)  writes undocumented SWF tags to the SWFs it produces. I was able to identify two so far: ProductInfo (Tag ID 41) The ProductInfo tag contains infos about the tool used to generate the SWF, as [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwahlers.com.br%252Fclaus%252Fblog%252Fundocumented-swf-tags-written-by-mxmlc%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Undocumented%20SWF%20Tags%20written%20by%20MXMLC%22%20%7D);"></div>
<p>While testing my AS3 SWF library <a href="http://github.com/claus/as3swf/tree/master">as3swf</a> yesterday, i found that MXMLC (the compiler that comes with the Flex SDKs)  writes undocumented SWF tags to the SWFs it produces.</p>
<p>I was able to identify two so far:</p>
<p><strong>ProductInfo</strong> (Tag ID 41)</p>
<p>The ProductInfo tag contains <em>infos about the tool used to generate the SWF</em>, as well as the <em>date and time the SWF was compiled</em>. It also contains info about the &#8220;Edition&#8221; of the software used (see below), and although this seems to be always set to &#8220;None&#8221; in Flex Builder 3 and Flash Builder 4, it potentially could become a privacy issue, especially being an undocumented feature (you better know about this tag just in case you accidentally publish commercial work with your non commercial Flash Builder license).</p>
<ul>
<li>ProductID (UI32)<br />
0: Unknown<br />
1: Macromedia Flex for J2EE<br />
2: Macromedia Flex for .NET<br />
3: Adobe Flex</li>
<li>Edition (UI32)<br />
0: Developer Edition<br />
1: Full Commercial Edition<br />
2: Non Commercial Edition<br />
3: Educational Edition<br />
4: Not For Resale (NFR) Edition<br />
5: Trial Edition<br />
6: None</li>
<li>MajorVersion (UI8)</li>
<li>MinorVersion (UI8)</li>
<li>BuildLow (UI32)</li>
<li>BuildHigh (UI32)</li>
<li>CompilationDate (UI64)<br />
Milliseconds since 1.1.1970</li>
</ul>
<p>Examples:</p>
<p>Flex 4.0 &#8211; [41:ProductInfo] ProductID: 3, Edition: 6, Version: 4.0.0.7791, CompileDate: Fri Aug 21 05:18:21 GMT-0300 2009</p>
<p>Flex 3.2 &#8211; [41:ProductInfo] ProductID: 3, Edition: 6, Version: 3.2.0.3958, CompileDate: Fri Aug 21 05:23:22 GMT-0300 2009</p>
<p><strong>DebugID</strong> (Tag ID 63)</p>
<p>This tag is written to SWFs that are enabled for debugging. It contains a 16 byte UUID.</p>
<ul>
<li>UUID (UI8[16])</li>
</ul>
<p>Example:</p>
<p>[63:DebugID] UUID: b8f36d6a-c735-a340-daa7-44730af92505</p>
<p><strong>Reference</strong></p>
<p>Flex SDK:</p>
<ul>
<li><a href="http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/modules/swfutils/src/java/flash/swf/TagValues.java">TagValues.java</a></li>
<li><a href="http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/modules/swfutils/src/java/flash/swf/tags/ProductInfo.java">ProductInfo.java</a></li>
<li><a href="http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/modules/swfutils/src/java/flash/swf/tags/DebugID.java">DebugID.java</a></li>
</ul>
<p>Community:</p>
<ul>
<address><span style="line-height: 33px; font-size: 21px; color: #3e3e3e;"> </span></address>
</ul>
<ul>
<li>Igor Costa: <a href="http://www.igorcosta.org/?p=220">Reading the compilation date of SWF with the magic of ByteArray</a></li>
<li>Judah Frangipane: <a href="http://www.judahfrangipane.com/blog/?p=252">Cache busting your Flex SWF and the SWF Compilation Date</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://wahlers.com.br/claus/blog/undocumented-swf-tags-written-by-mxmlc/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Custom Installer For Adobe AIR Applications</title>
		<link>http://wahlers.com.br/claus/blog/custom-installer-for-adobe-air-applications/</link>
		<comments>http://wahlers.com.br/claus/blog/custom-installer-for-adobe-air-applications/#comments</comments>
		<pubDate>Sat, 20 Oct 2007 07:47:28 +0000</pubDate>
		<dc:creator>Claus Wahlers</dc:creator>
				<category><![CDATA[Air]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex 2]]></category>
		<category><![CDATA[WebDev]]></category>

		<guid isPermaLink="false">http://wahlers.com.br/claus/blog/custom-installer-for-adobe-air-applications/</guid>
		<description><![CDATA[I need a custom installer for an AIR application i&#8217;m currently developing. That&#8217;s because my AIR app needs additional functionality that the AIR runtime doesn&#8217;t provide (specifically: detecting USB storage devices, act as a TCP socket server, talk to Last.fm scrobbler plugins). For that purpose i wrote a local RPC socket server gateway in C [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwahlers.com.br%252Fclaus%252Fblog%252Fcustom-installer-for-adobe-air-applications%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Custom%20Installer%20For%20Adobe%20AIR%20Applications%22%20%7D);"></div>
<p>I need a custom installer for an AIR application i&#8217;m currently developing. That&#8217;s because my AIR app needs additional functionality that the AIR runtime doesn&#8217;t provide (specifically: detecting USB storage devices, act as a TCP socket server, talk to Last.fm scrobbler plugins). For that purpose i wrote a local RPC socket server gateway in C (one for Mac OS X and one for Windows) which always runs once the user logs in to her OS. The AIR application can then call methods on that local gateway, or receive events.</p>
<p>The problem is that the user needs to install the RPC server before she installs the actual AIR application. The install process should be seamless (one installer installs RPC server, AIR runtime if needed, and the application itself in one go)  and the installer should be as small as possible. Currently there is no info available from Adobe on how to write custom installers that automatically download/install the AIR runtime if needed (is there?).</p>
<p>Artemis is another project aiming at extending AIR using a local socket server, but it seems that the project has been shut down because of the reasons stated above.</p>
<p>So i have been pulling out my hair lately on how to solve that problem.</p>
<p>I think i found a feasible solution. I am not sure because i haven&#8217;t tested all this, but i wanted to throw it online for discussion. The drawback is that the user needs to install your application with a OS native custom installer.</p>
<p>First you write standard installers for both Mac OS X and Windows, that install the local socket server either as a service/daemon or as an agent so that the server always starts at system launch or user login. Nothing special here yet.</p>
<p>The trick would be to write a simple SWHX application that basically implements the code included with the AIR Installer badge. That helper application can then be included with the installer, which executes it after the local socket server has been installed.</p>
<p>As i said i haven&#8217;t tested this yet (will do soonish), but this should work, no?</p>
<p>The question remains why i don&#8217;t just use SWHX for the main app and screw AIR alltogether.</p>

]]></content:encoded>
			<wfw:commentRss>http://wahlers.com.br/claus/blog/custom-installer-for-adobe-air-applications/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>FZip Alpha Release: Create And Modify ZIP Archives</title>
		<link>http://wahlers.com.br/claus/blog/fzip-alpha-release-create-and-modify-zip-archives/</link>
		<comments>http://wahlers.com.br/claus/blog/fzip-alpha-release-create-and-modify-zip-archives/#comments</comments>
		<pubDate>Mon, 08 Oct 2007 20:08:25 +0000</pubDate>
		<dc:creator>Claus Wahlers</dc:creator>
				<category><![CDATA[Air]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex 2]]></category>
		<category><![CDATA[WebDev]]></category>

		<guid isPermaLink="false">http://wahlers.com.br/claus/blog/fzip-alpha-release-create-and-modify-zip-archives/</guid>
		<description><![CDATA[FZip has been around for some time now, and people seem to like it. However one feature has been asked for repeatedly: In addition to reading ZIP archive, people want to be able to create new (and modify existing) archives. So i finally sat down this weekend and added that. The code is not tested [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwahlers.com.br%252Fclaus%252Fblog%252Ffzip-alpha-release-create-and-modify-zip-archives%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22FZip%20Alpha%20Release%3A%20Create%20And%20Modify%20ZIP%20Archives%22%20%7D);"></div>
<p>FZip has been around for some time now, and people seem to like it. However one feature has been asked for repeatedly: In addition to reading ZIP archive, people want to be able to create new (and modify existing) archives.</p>
<p>So i finally sat down this weekend and added that.</p>
<p>The code is not tested very well (it works for me but may not work for you)  and has no ASDocs yet, so i release it as an alpha version, with the hope of massive bug feedback.. :)</p>
<p>Download: <a href="http://codeazur.com.br/lab/fzip/download/fzip_1_0_52_alpha.zip" style="text-decoration: line-through" title="FZip 1.0.52 Alpha">fzip_1_0_52_alpha.zip</a> <a href="http://codeazur.com.br/lab/fzip/download/fzip.zip" title="FZip">fzip.zip</a></p>
<p>New methods in class FZip:</p>
<ul>
<li>addFile(name:String, date:Date, content:ByteArray)</li>
<li>addFileAt(index:uint, name:String, date:Date, content:ByteArray)</li>
<li>removeFileAt(index:uint)</li>
<li>serialize(stream:IDataOutput)</li>
</ul>
<p>Sample code:</p>
<pre style="margin-left: 20px"><code><span style="color: #808080; font-style: italic">// Create file contents</span>
<span style="color: #000000; font-weight: bold">var</span> ba:ByteArray = <span style="color: #000000; font-weight: bold">new</span> ByteArray<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span>;
ba.<span style="color: #006600">writeUTFBytes</span><span style="color: #66cc66">(</span><span style="color: #ff0000">"Hello World!"</span><span style="color: #66cc66">)</span>;
<span style="color: #808080; font-style: italic">// Create ZIP archive and add file</span>
<span style="color: #000000; font-weight: bold">var</span> zip:FZip = <span style="color: #000000; font-weight: bold">new</span> FZip<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span>;
zip.<span style="color: #006600">addFile</span><span style="color: #66cc66">(</span><span style="color: #ff0000">"hello.txt"</span>, <span style="color: #000000; font-weight: bold">null</span>, ba<span style="color: #66cc66">)</span>;
<span style="color: #808080; font-style: italic">// Serialize ZIP into a new file</span>
<span style="color: #808080; font-style: italic">// (we use the Adobe AIR specific class FileStream here,</span>
<span style="color: #808080; font-style: italic">// but you can as well use ByteArray </span></code><code><span style="color: #808080; font-style: italic">or anything that</span></code><code><span style="color: #808080; font-style: italic"></span>
<span style="color: #808080; font-style: italic">// implements IDataOutput)</span>
<span style="color: #000000; font-weight: bold">var</span> file:File = File.<span style="color: #006600">applicationStorageDirectory</span>;
file = file.<span style="color: #006600">resolvePath</span><span style="color: #66cc66">(</span><span style="color: #ff0000">"hello.zip"</span><span style="color: #66cc66">)</span>;
<span style="color: #000000; font-weight: bold">var</span> stream:FileStream = <span style="color: #000000; font-weight: bold">new</span> FileStream<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span>;
stream.<span style="color: #006600">open</span><span style="color: #66cc66">(</span>file, FileMode.<span style="color: #006600">WRITE</span><span style="color: #66cc66">)</span>;
zip.<span style="color: #006600">serialize</span><span style="color: #66cc66">(</span>stream<span style="color: #66cc66">)</span>;
stream.<span style="color: #0066cc">close</span><span style="color: #66cc66">(</span><span style="color: #66cc66">)</span>;</code></pre>

]]></content:encoded>
			<wfw:commentRss>http://wahlers.com.br/claus/blog/fzip-alpha-release-create-and-modify-zip-archives/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>FZip, AIRRemoteUpdater Upgraded for AIR Beta 2</title>
		<link>http://wahlers.com.br/claus/blog/fzip-airremoteupdater-upgraded-for-air-beta-2/</link>
		<comments>http://wahlers.com.br/claus/blog/fzip-airremoteupdater-upgraded-for-air-beta-2/#comments</comments>
		<pubDate>Thu, 04 Oct 2007 11:28:04 +0000</pubDate>
		<dc:creator>Claus Wahlers</dc:creator>
				<category><![CDATA[Air]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex 2]]></category>
		<category><![CDATA[WebDev]]></category>

		<guid isPermaLink="false">http://wahlers.com.br/claus/blog/fzip-airremoteupdater-upgraded-for-air-beta-2/</guid>
		<description><![CDATA[Just a quick FYI: FZip and AIRRemoteUpdater upgrades for AIR Beta 2 are now available for download. FZip now uses ByteArray.uncompress(CompressionAlgorithm.DEFLATE) instead of the now deprecated ByteArray.inflate(). I also tweaked FZip to throw an exception when a parsing error occurs and no event listener is registered for FZipErrorEvent.PARSE_ERROR events. AIRRemoteUpdater now gets the local descriptor [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwahlers.com.br%252Fclaus%252Fblog%252Ffzip-airremoteupdater-upgraded-for-air-beta-2%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22FZip%2C%20AIRRemoteUpdater%20Upgraded%20for%20AIR%20Beta%202%22%20%7D);"></div>
<p>Just a quick FYI: <a href="http://codeazur.com.br/lab/fzip/" title="FZip">FZip</a> and <a href="http://codeazur.com.br/lab/airremoteupdater/" title="AIRRemoteUpdater">AIRRemoteUpdater</a> upgrades for AIR Beta 2 are now available for download.</p>
<p>FZip now uses <code>ByteArray.uncompress(CompressionAlgorithm.DEFLATE)</code> instead of the now deprecated <code>ByteArray.inflate()</code>. I also tweaked FZip to throw an exception when a parsing error occurs and no event listener is registered for <code>FZipErrorEvent.PARSE_ERROR events</code>.</p>
<p>AIRRemoteUpdater now gets the local descriptor XML via <code>Shell.shell.applicationDescriptor</code> which was added in AIR Beta 2, and uses the upgraded FZip sources.</p>
<p>Enjoy, and please let me know if you run into any problems with this new release.</p>

]]></content:encoded>
			<wfw:commentRss>http://wahlers.com.br/claus/blog/fzip-airremoteupdater-upgraded-for-air-beta-2/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Automating remote software updates in Adobe AIR applications</title>
		<link>http://wahlers.com.br/claus/blog/automating-remote-software-updates-in-adobe-air-applications/</link>
		<comments>http://wahlers.com.br/claus/blog/automating-remote-software-updates-in-adobe-air-applications/#comments</comments>
		<pubDate>Wed, 08 Aug 2007 14:01:43 +0000</pubDate>
		<dc:creator>Claus Wahlers</dc:creator>
				<category><![CDATA[Air]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex 2]]></category>
		<category><![CDATA[WebDev]]></category>

		<guid isPermaLink="false">http://wahlers.com.br/claus/blog/automating-remote-software-updates-in-adobe-air-applications/</guid>
		<description><![CDATA[I just released the first version of AIR Remote Updater, an AS3 class to automate remote software updates in Adobe AIR applications. It transparently checks version numbers, downloads the .AIR installer file if needed and triggers the AIR-native update process. It grabs the version number directly from the remote .AIR file without having to download [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwahlers.com.br%252Fclaus%252Fblog%252Fautomating-remote-software-updates-in-adobe-air-applications%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Automating%20remote%20software%20updates%20in%20Adobe%20AIR%20applications%22%20%7D);"></div>
<p>I just released the first version of <a href="http://codeazur.com.br/lab/airremoteupdater/">AIR Remote Updater</a>, an AS3 class to  automate remote software updates in Adobe AIR applications.</p>
<p>It transparently checks version numbers, downloads the .AIR installer  file if needed and triggers the AIR-native update process.</p>
<p>It grabs the version number directly from the remote .AIR file without  having to download the entire file, eliminating the potential error  prone need of having to put a separate descriptor file online along with  the .AIR installer file.</p>
<p>Background:</p>
<p>An .AIR installer file is a PKZIP archive containing metadata files  along with the packaged application files. The files contained in a .AIR  installer file are, in this order:</p>
<ol>
<li>/mimetype</li>
<li>/META-INF/AIR/application.xml (contains version info)</li>
<li>/META-INF/AIR/hash</li>
<li>/META-INF/signatures.xml</li>
<li>packaged application files</li>
</ol>
<p>The file we are interested in, /META-INF/AIR/application.xml (the  &#8220;application descriptor file&#8221; that contains the version number), is  always the second file in the archive. AIR Remote Updater uses FZip to  stream in the remote .AIR until (and only until) the application  descriptor file has loaded. We can then close the stream, uncompress  that file and extract the version number.</p>
<p>More info and download here:<br />
<a href="http://codeazur.com.br/lab/airremoteupdater/" class="moz-txt-link-freetext">http://codeazur.com.br/lab/airremoteupdater/</a></p>

]]></content:encoded>
			<wfw:commentRss>http://wahlers.com.br/claus/blog/automating-remote-software-updates-in-adobe-air-applications/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

