<?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>Taytay.com</title>
	<atom:link href="http://taytay.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://taytay.com</link>
	<description>Where our hero blogs about Flex, AIR, Actionscript, and budgeting software.</description>
	<lastBuildDate>Sun, 19 Feb 2012 10:45:09 +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>PMP: &#8220;(Some App)&#8221; has requested access to your contacts! (No, it hasn&#8217;t)</title>
		<link>http://taytay.com/?p=324</link>
		<comments>http://taytay.com/?p=324#comments</comments>
		<pubDate>Sun, 19 Feb 2012 10:45:09 +0000</pubDate>
		<dc:creator>Taytay</dc:creator>
				<category><![CDATA[Flex/AIR]]></category>

		<guid isPermaLink="false">http://taytay.com/?p=324</guid>
		<description><![CDATA[A couple of days ago we got an angry letter from a customer wondering why our iPhone app was accessing his contacts. (Actually, it was a &#8220;furious&#8221; letter. I know because he said, &#8220;I am absolutely furious.&#8221;) We looked around at each other and scratched our heads. Our budgeting app has no need for contacts. [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of days ago we got an angry letter from a customer wondering why our iPhone app was accessing his contacts. (Actually, it was a &#8220;furious&#8221; letter. I know because he said, &#8220;I am absolutely furious.&#8221;)</p>
<p>We looked around at each other and scratched our heads. Our budgeting app has no need for contacts. Why did he think we did? What voodoo is this? Turns out he was running &#8220;PMP&#8221; (Protect My Privacy), on a jailbroken iPhone. It alerts you when an app accesses your contacts, your UDID, and your location. </p>
<p>We scanned our source code and that of our 3rd party libraries, and we determined that we never access contacts! I wrote to the <a href="http://protectmyprivacy.org">authors of PMP</a> and asked them what our app did to make them angry. Turns out that <strong><em>any</em></strong> app that accesses they keyboard will be flagged as accessing the contacts. I&#8217;m assuming that&#8217;s because Apple is probably getting the contacts behind the scenes so that it can autocomplete. The authors said they&#8217;ll have a fix pushed out soon. That&#8217;s cool, but in the meantime they are making a LOT of people a lot more paranoid, wondering why their favorite apps are &#8220;stealing their contacts&#8221;. <img src='http://taytay.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://taytay.com/?feed=rss2&#038;p=324</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SOLVED: Flash Builder error in Problem Pane won&#8217;t go away?</title>
		<link>http://taytay.com/?p=316</link>
		<comments>http://taytay.com/?p=316#comments</comments>
		<pubDate>Thu, 16 Feb 2012 15:11:43 +0000</pubDate>
		<dc:creator>Taytay</dc:creator>
				<category><![CDATA[Flex/AIR]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[FB]]></category>
		<category><![CDATA[FlashBuilder]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://taytay.com/?p=316</guid>
		<description><![CDATA[Sometimes errors seem to get &#8220;stuck&#8221; in the Problem pane of Flash Builder. Cleans don&#8217;t always help, nor does restarting Flash Builder. In those situations, I just rename my &#8220;src&#8221; folder (or whatever folder contains the file with the error/warning you are trying to clear) to something like &#8220;src2&#8243;. Wait a bit for Flash Builder [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes errors seem to get &#8220;stuck&#8221; in the Problem pane of Flash Builder. Cleans don&#8217;t always help, nor does restarting Flash Builder. In those situations, I just rename my &#8220;src&#8221; folder (or whatever folder contains the file with the error/warning you are trying to clear) to something like &#8220;src2&#8243;. Wait a bit for Flash Builder to realize that the src folder just went away. You&#8217;ll also notice that your error/warning has disappeared too. Now rename &#8220;src2&#8243; back to &#8220;src&#8221; and you&#8217;ll have a clean Problems pane. There are probably more elegant ways, but I couldn&#8217;t find them!</p>
]]></content:encoded>
			<wfw:commentRss>http://taytay.com/?feed=rss2&#038;p=316</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SOLVED: VerifyError: Error #1024: Stack underflow occurred</title>
		<link>http://taytay.com/?p=319</link>
		<comments>http://taytay.com/?p=319#comments</comments>
		<pubDate>Mon, 13 Feb 2012 11:34:18 +0000</pubDate>
		<dc:creator>Taytay</dc:creator>
				<category><![CDATA[Flex/AIR]]></category>

		<guid isPermaLink="false">http://taytay.com/?p=319</guid>
		<description><![CDATA[I just got this when compiling our app in release mode in Flex 4.5.1 (AIR 3.1). Lots of googling turned up this helpful post. It mentions having trace statements in a catch block. I looked an sure enough, here was a trace block in a catch block I was using: I commented the trace statement [...]]]></description>
			<content:encoded><![CDATA[<p>I just got this when compiling our app in release mode in Flex 4.5.1 (AIR 3.1). Lots of googling turned up <a href="http://www.slegg.net/using-pushbutton-engine-with-flex4">this helpful post</a>. It mentions having trace statements in a catch block. I looked an sure enough, here was a trace block in a catch block I was using:</p>
<pre class="brush: plain; title: ; notranslate">
catch (e:TypeError) {
			trace(e.getStackTrace());
			throw new Error(&quot;Unexpected type encountered&quot;);
		}
</pre>
<p>I commented the trace statement out, and all was well. Compiler bugs are fun. Luckily this one didn&#8217;t take too long to find!</p>
]]></content:encoded>
			<wfw:commentRss>http://taytay.com/?feed=rss2&#038;p=319</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Error #2004: One of the parameters is invalid. in isSetAsDefaultApplication and verifyKnownExtension</title>
		<link>http://taytay.com/?p=317</link>
		<comments>http://taytay.com/?p=317#comments</comments>
		<pubDate>Mon, 13 Feb 2012 11:00:22 +0000</pubDate>
		<dc:creator>Taytay</dc:creator>
				<category><![CDATA[Flex/AIR]]></category>

		<guid isPermaLink="false">http://taytay.com/?p=317</guid>
		<description><![CDATA[I just got this crash in the release version of my app: Turns out that I didn&#8217;t have the fileType for the extension in my app descriptor that I was passing to &#8220;isSetAsdefaultApplication&#8221; . Without that, you get the above exception! Make sure to add the right &#8220;fileType&#8221; entry to the fileTypes in your app [...]]]></description>
			<content:encoded><![CDATA[<p>I just got this crash in the release version of my app:</p>
<pre class="brush: plain; title: ; notranslate">

ArgumentError: Error #2004: One of the parameters is invalid.
	at Error$/throwError()
	at flash.desktop::NativeApplication/verifyKnownExtension()
	at flash.desktop::NativeApplication/isSetAsDefaultApplication()
</pre>
<p>Turns out that I didn&#8217;t have the fileType for the extension in my app descriptor that I was passing to &#8220;isSetAsdefaultApplication&#8221; . Without that, you get the above exception! Make sure to add the right &#8220;fileType&#8221; entry to the fileTypes in your app descriptor!</p>
]]></content:encoded>
			<wfw:commentRss>http://taytay.com/?feed=rss2&#038;p=317</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SOLVED: Gradle optional ant tasks. SSHExec was not found</title>
		<link>http://taytay.com/?p=309</link>
		<comments>http://taytay.com/?p=309#comments</comments>
		<pubDate>Thu, 09 Feb 2012 13:29:13 +0000</pubDate>
		<dc:creator>Taytay</dc:creator>
				<category><![CDATA[Flex/AIR]]></category>

		<guid isPermaLink="false">http://taytay.com/?p=309</guid>
		<description><![CDATA[Hopefully this shows up in someone&#8217;s Google search for this error. I use Gradle to import a legacy ant build.xml script and run the deploy step, which relies upon SSHExec (scp) to do its deployment. I was getting the following error: Here is what I added to my build.gradle to fix it: I found the [...]]]></description>
			<content:encoded><![CDATA[<p>Hopefully this shows up in someone&#8217;s Google search for this error. <img src='http://taytay.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I use Gradle to import a legacy ant build.xml script and run the deploy step, which relies upon SSHExec (scp) to do its deployment. I was getting the following error:</p>
<pre class="brush: plain; title: ; notranslate">Execution failed for task ':YNABParser:antDeployCaptive'.
Cause: Problem: failed to create task or type sshexec
Cause: the class org.apache.tools.ant.taskdefs.optional.ssh.SSHExec was not found.
        This looks like one of Ant's optional components.
Action: Check that the appropriate optional JAR exists in
        -ANT_HOME/lib
        -the IDE Ant configuration dialogs

Do not panic, this is a common problem.
The commonest cause is a missing JAR.

This is not a bug; it is a configuration problem
</pre>
<p>Here is what I added to my build.gradle to fix it:</p>
<pre class="brush: plain; title: ; notranslate">

//Note I put this outside of &quot;buildscript {}&quot; but I don't know where it should really go. I'm new to Gradle. 

//BEGIN make sure that the optional ant stuff works:

	configurations { antssh } 

	dependencies {
		//'ant-contrib:ant-contrib:20020829', 'org.apache.ant:ant-junit:1.8.1'
		antssh group: 'org.apache.ant', name: 'ant-jsch', version: '1.8.2'
	} 

	// add additional jars to the AntBuilder classpath for use within the imported build.
	ClassLoader antClassLoader = org.apache.tools.ant.Project.class.classLoader 

	configurations.antssh.each { File f -&gt;
		antClassLoader.addURL(f.toURI().toURL())
	}
//END: Make sure that the optional ant stuff work
</pre>
<p>I found the gist of this <a href="http://gradle.1045684.n5.nabble.com/Calling-ant-test-target-fails-with-junit-classpath-issue-newbie-td4385167.html">in this post</a>.<br />
<a href="http://gradle.1045684.n5.nabble.com/optional-task-in-ant-build-xml-td1434718.html">This is the old and busted answer that didn&#8217;t work</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://taytay.com/?feed=rss2&#038;p=309</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing CoThreadAS3: A library to easily write threads in AS3/Flash/Flex/AIR</title>
		<link>http://taytay.com/CoThreadAS3</link>
		<comments>http://taytay.com/CoThreadAS3#comments</comments>
		<pubDate>Sun, 29 Jan 2012 19:59:30 +0000</pubDate>
		<dc:creator>Taytay</dc:creator>
				<category><![CDATA[Flex/AIR]]></category>

		<guid isPermaLink="false">http://taytay.com/?p=273</guid>
		<description><![CDATA[TL;DR; CoThread lets you to create cooperative &#8220;threads&#8221; and coroutines in Actionscript 3 (Flex/AIR). With CoThread, you can easily break up any task, including recursive functions, so that your UI stays responsive even while your application is doing significant processing. Asynchronous code that uses CoThread is easy to read and write. CoThreadAS3 is hosted on [...]]]></description>
			<content:encoded><![CDATA[<p><strong>TL;DR;</strong><br />
CoThread lets you to create cooperative &#8220;threads&#8221; and coroutines in Actionscript 3 (Flex/AIR).</p>
<p>With CoThread, you can easily break up any task, including recursive functions, so that your UI stays responsive even while your application is doing significant processing. Asynchronous code that uses CoThread is easy to read and write.</p>
<p>CoThreadAS3 is <a href="https://github.com/Taytay/CoThreadAS3">hosted on GitHub</a> and <a href="https://bitbucket.org/Taytay/cothreadas3">mirrored on BitBucket</a>. </p>
<p>The below is the wordy behind-the-scenes version of the README file.</p>
<h3>Motivation for CoThread</h3>
<p>I have been looking for a way to write &#8220;threaded&#8221; Actionscript code for a while. All of the examples I have seen require you to manually break up your code into discreet blocks, and also require you to manually maintain the state of your operation between calls. Not only is this difficult and error-prone, it is extremely difficult to write recursive functions that can be arbitrarily paused and resumed. </p>
<p>To show how hard this is, imagine that you need to process every pixel in a large image:</p>
<pre class="brush: plain; title: ; notranslate">
function processAllPixels(pixels : Array) : void
{
	var numPixels : int = pixels.length;
	for (x=0; x&lt;numPixels; ++x)
	{
		var pixel : int = pixels[x];
		processPixel(pixel);
	}
}</pre>
<p>That&#8217;s fine, but you discover it takes 5 seconds to process all the pixels, and your boss doesn&#8217;t want the program to lock up while it&#8217;s working. Oh, and he wants a progress bar. Other examples I&#8217;ve seen told me to write a function that just processes some of the pixels with each call:</p>
<pre class="brush: plain; title: ; notranslate">
var whereLeftOffLastTime : int = 0;
static const int NUM_PIXELS_TO_PROCESS_EACH_FRAME = 500;
function continueProcessingPixels(pixels : Array) : Boolean
{
	var isDoneYet : Boolean = false;
	var numPixels : int = pixels.length;
	var indexToStop = whereLeftOffLastTime + NUM_PIXELS_TO_PROCESS_EACH_FRAME;
	if (indexToStop &gt;= numPixels)
	{
		indexToStop = numPixels;
		isDoneYet = true;
	}
	for (x=whereLeftOffLastTime; x&lt;indexToStop; ++x)
	{
		var pixel : int = pixels[x];
		processPixel(pixel);
	}
	whereLeftOffLastTime = indexToStop;
	return isDoneYet;
}</pre>
<p>Anyway, you get the basic idea. I wrote the above code in a readme file, so it&#8217;s probably got compile errors and logic errors, and I&#8217;m sure it could be cleaner, but that&#8217;s also kinda my point. Just to split a for loop, I find myself keeping track of a lot of extra state. It&#8217;s slow and error-prone. </p>
<p>After I familiarized myself with the above techniques, I decided to apply it to my XML file saving code. It took a long time to write my files to disk, and I wanted to break it up. There was just one problem: My XML saving code was recursive! If I want to make sure that my XML processor only ran for 30ms each call, I might want it to arbitrarily stop when it was 20 function calls deep. How would I save and restore that state?  Let me give you a simple recursive example:</p>
<pre class="brush: plain; title: ; notranslate">
//Recursively pretty-prints XML, indenting each deeper level
public function printXML(xml : XML, indentString : String) : void
{
	if ((xml == null) || (xml.name() == null))
	{
		return;
	}
	else
	{
		indentString += &quot;\t&quot;;
		_textWriter.writeLine(indentString + xml.name()+&quot;:&quot;+xml.text());
		for each(var child : XML in xml.children())
		{
			printXML(child, indentString);
		}
		_textWriter.writeLine(indentString + &quot;/&quot;+xml.name());
	}
}
</pre>
<p>(Yeah, I know this could be written without recursion, but the code to save a file to XML could not easily be, and this is a simple recursive example to illustrate my point.)</p>
<p>So imagine that you discover it takes 5 seconds to process your 250MB XML file. What are you going to do? How are you going to split this task up so that when you&#8217;re 20 function calls deep, your code knows how to stop what it&#8217;s doing, and then resume the next time you call it? That is a much harder problem. I knew I could use closures to save a significant amount of state automatically, but I couldn&#8217;t figure out a clean way to use them the way I wanted. So I gave up&#8230;</p>
<p>Then I stumbled across <a href="http://blog.brokenfunction.com/2010/10/actionjson-the-fastest-actionscript-3-0-json-parser/">BrokenFunction&#8217;s json code</a>. He had an example of an async json parser. It was recursive, but asynchronous. It could pause itself and resume at semi-arbitrary points. It was brilliant. I took his ideas and expounded on them to write a library I call CoThread. Here is an asynchronous version of the function above:</p>
<pre class="brush: plain; title: ; notranslate">
public function printXMLAsync(xml : XML, indentString : String, context : CoRoutineContext) : void
{
	if ((xml == null) || (xml.name() == null))
	{
		return;
	}
	else
	{
		indentString += &quot;\t&quot;;
		_textWriter.writeLine(indentString + xml.name()+&quot;:&quot;+xml.text());
		context.foreach(xml.children(),
			function printEachChild(child : XML) : Boolean
			{
				printXMLAsync(child, indentString, context);
				return true;
			},
			this,
			function afterDonePrintingChildren() : void
			{
				_textWriter.writeLine(indentString + &quot;/&quot;+xml.name());
			}
		);
	}
}
</pre>
<p>Here&#8217;s what I like about that code: It&#8217;s not <em>extremely</em> different from the synchronous version of the code. I didn&#8217;t have to manually save a lot of state. It just works.</p>
<p>In that example I gave the anonymous functions (printEachChild and afterDonePrintingChildren) a name so that they were easier to read, but I don&#8217;t have to do that.</p>
<p>Let&#8217;s take a look at our pixel example from earlier. Here&#8217;s an asynchronous version of that function:</p>
<pre class="brush: plain; title: ; notranslate">
public function processAllPixelsAsync(pixels : Array, context : CoRoutineContext) : void
{
	context.foreach(pixels,
		function(pixel : int) : Boolean
		{
			processPixel(pixel);
			//Returns true to continue the for loop
			return true;
		},
		this
	);
}
</pre>
<p>Again, this code isn&#8217;t terribly different from the original version, and I really like that. </p>
<h2>Calling an asynchronous function</h2>
<p>All asynchronous functions in the CoThread library take a &#8220;CoRoutineContext&#8221; as its last parameter. This context is required by the function in order to operate as a CoRoutine (asynchronously), and it has the added benefit of advertising to the world &#8220;I am an asynchronous function. I might return immediately, but I probably still have work to do.&#8221; To get a CoRoutineContext, you just need a CoThread:</p>
<pre class="brush: plain; title: ; notranslate">
//Instantiate a CoThread for the startPrinting function
var sampleThread : CoThread = new CoThread(startPrinting);

//Start the thread. (passes in its CoRoutineContext)
sampleThread.start();

function startPrinting(context : CoRoutineContext) : void
{
	printXMLAsync(sampleXML, &quot;&quot;, context);
}
</pre>
<p>The function printXMLAsync now has a context on which to operate. Furthermore, it can now call any other asynchronous methods it wants, and can simply pass in its own CoRoutineContext. So let&#8217;s say that as part of your XML pretty printing, you want to do some Pixel processing. </p>
<p>Here is our original printEachChild function from printXMLAsync:</p>
<pre class="brush: plain; title: ; notranslate">
function printEachChild(child : XML) : Boolean
{
	printXMLAsync(child, indentString, context);
	return true;
}
</pre>
<p>Perhaps some of the children of the XML contain a bitmap we want to process:</p>
<pre class="brush: plain; title: ; notranslate">
function printEachChild(child : XML) : Boolean
{
	if (child.name() == &quot;pixels&quot;)
	{
		var pixels : Array = getPixelData(child);
		//pass our context into the async processing function
		//processAllPixelsAsync might take 20 minutes to truly complete, but this
		//printEachChild function won't get called again for the next XML node
		//until it's done processing
		processAllPixelsAsync(pixels, context);
	}
	else
	{
		printXMLAsync(child, indentString, context);
	}
	return true;
}
</pre>
<p>And processAllPixelsAsync has a CoRoutineContext, so it can in turn call other asynchronous functions quite easily.</p>
<h3>Chaining async calls</h3>
<p>But when you call an asynchronous function, it can return almost immediately even though it might have 5 minutes of work left to do. Well, the context can come to our rescue again.</p>
<p>Let&#8217;s go back to our XML printing example. Recall this function:</p>
<pre class="brush: plain; title: ; notranslate">
function startPrinting(context : CoRoutineContext) : void
{
	printXMLAsync(sampleXML, &quot;&quot;, context);
}
</pre>
<p>Imagine we want to do something after we print the XML. You can&#8217;t just do this:</p>
<pre class="brush: plain; title: ; notranslate">
function startPrinting(context : CoRoutineContext) : void
{
	printXMLAsync(sampleXML, &quot;&quot;, context);
	//You can't just do this:
	trace(&quot;I'm done printing the XML!&quot;)
}
</pre>
<p>That&#8217;s because the call to printXMLAsync will just <em>start</em> printing the XML. It won&#8217;t <em>finish</em> printing all of the XML. So we need to tell our context, &#8220;After you&#8217;re done with that function, here&#8217;s the next function I want you to call.&#8221;</p>
<p>We do that with the &#8220;pushFunction&#8221; call:</p>
<pre class="brush: plain; title: ; notranslate">
function startPrinting(context : CoRoutineContext) : void
{
	//Tell the context to call &quot;afterDonePrinting&quot; when it returns from the next asynchronous call
	context.pushFunction(afterDonePrinting);
	printXMLAsync(sampleXML, &quot;&quot;, context);

	function afterDonePrinting() : void
	{
		trace(&quot;I'm really done printing the XML!&quot;)
	}
}
</pre>
<p>This is relatively readable, but still a bit verbose, and I don&#8217;t like that I read the pushFunction call before I read the printXMLAsync call. It doesn&#8217;t read in the same order the code is called. Luckily, context.pushFunction returns the context as its return parameter, so we can do this instead:</p>
<pre class="brush: plain; title: ; notranslate">
function startPrinting(context : CoRoutineContext) : void
{
	printXMLAsync(sampleXML, &quot;&quot;,
		context.pushFunction(afterDonePrinting));

	function afterDonePrinting() : void
	{
		trace(&quot;I'm really done printing the XML!&quot;)
	}
}
</pre>
<p>That&#8217;s a bit better. If you want to be even less verbose, you can&#8217;t just use an anonymous function:</p>
<pre class="brush: plain; title: ; notranslate">
function startPrinting(context : CoRoutineContext) : void
{
	printXMLAsync(sampleXML, &quot;&quot;, context.pushFunction(
		function() : void
		{
			trace(&quot;I'm really done printing the XML!&quot;)
		})
	);

}
</pre>
<p>I personally find this the most readable style most of the time. I can write plenty of code inside that anonymous function, including further asynchronous calls, and still manage to read and write it linearly.</p>
<h3>Performance</h3>
<p>There is a performance penalty for these threaded functions. <a href="http://jacksondunstan.com/articles/850">Instantiating and calling Closures is slower than a normal function call</a>. In my tests using the Debugger, performing these functions takes twice as long as their non-threaded counterparts. I haven&#8217;t profiled it extensively to discover the bottlenecks, so it&#8217;s quite possible that we can bring it down, but even if we can&#8217;t, I think there are still times when you would be willing to pay such a performance penalty. My first use-case for it was saving our budget files without halting the UI of <a href="http://YouNeedABudget.com">our app</a>. I was happy to have a background save take twice as long as a foreground save. Who cares if it takes an extra few seconds? 5 seconds in the background is MUCH better for the user than 2.5 seconds of an unusable app!</p>
<h3>Try CoThread yourself</h3>
<p>Although I&#8217;m biased, CoThread is my personal favorite &#8220;threading&#8221; library for ActionScript. It lets me easily write threaded functions without having to wrap my head around a lot of new concepts or put lots of effort into breaking up my code and saving state.</p>
<p>There&#8217;s a lot more to the CoThread library, but that probably belongs in the documentation.<br />
You can learn more at the <a href="https://github.com/Taytay/CoThreadAS3">CoThread project page on GitHub</a>, or the <a href="https://bitbucket.org/Taytay/cothreadas3">mirror on BitBucket</a>.</p>
<p><em>Note: (Adobe will eventually introduce Worker Threads, and that might well make this code obsolete, but in the meantime I thought I&#8217;d post my library because it&#8217;s usable today and I think it&#8217;s cool.)<br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://taytay.com/?feed=rss2&#038;p=273</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Native signing not supported on mac</title>
		<link>http://taytay.com/?p=270</link>
		<comments>http://taytay.com/?p=270#comments</comments>
		<pubDate>Thu, 01 Dec 2011 19:49:40 +0000</pubDate>
		<dc:creator>Taytay</dc:creator>
				<category><![CDATA[Flex/AIR]]></category>

		<guid isPermaLink="false">http://taytay.com/?p=270</guid>
		<description><![CDATA[When packaging your AIR app for the captive runtime on the Mac, you will get the following error if you don&#8217;t have your parameters in the right order: Native signing not supported on mac I didn&#8217;t see that phrase anywhere else on the internet, which is always fun. (I must be a trailblazer!) The answer [...]]]></description>
			<content:encoded><![CDATA[<p>When packaging your AIR app for the captive runtime on the Mac, you will get the following error if you don&#8217;t have your parameters in the right order:<br />
<code>Native signing not supported on mac</code></p>
<p>I didn&#8217;t see that phrase anywhere else on the internet, which is always fun. (I must be a trailblazer!)</p>
<p>The answer is to make sure that you have your parameters like so (this works for me anyway):</p>
<p><code>adt -package -storetype pkcs12 -storepass PASSWORD -keystore ../../Path/cert.p12 -target bundle MyApp.app MyApp-app.xml (What you want to package goes here)</code></p>
<p>See <a href="http://help.adobe.com/en_US/air/build/WSfffb011ac560372f709e16db131e43659b9-8000.html">Adobe help</a> for another example.</p>
]]></content:encoded>
			<wfw:commentRss>http://taytay.com/?feed=rss2&#038;p=270</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FIXED: Framework linkage in Flash Builder keeps getting reset to &#8220;Merged into code&#8221;</title>
		<link>http://taytay.com/?p=250</link>
		<comments>http://taytay.com/?p=250#comments</comments>
		<pubDate>Tue, 07 Jun 2011 08:39:47 +0000</pubDate>
		<dc:creator>Taytay</dc:creator>
				<category><![CDATA[Flex/AIR]]></category>

		<guid isPermaLink="false">http://taytay.com/?p=250</guid>
		<description><![CDATA[Each time I would re-open Flash Builder, our Flex Library projects would get their &#8220;Framework linkage&#8221; settings in the &#8220;Flex Library Build Path&#8221; project properties reset to &#8220;Merged into code&#8221; instead of keeping my preferred setting of &#8220;Use default (external).&#8221; I couldn&#8217;t figure out why until I noticed one day that any new Flex Library [...]]]></description>
			<content:encoded><![CDATA[<p>Each time I would re-open Flash Builder, our Flex Library projects would get their &#8220;Framework linkage&#8221; settings in the &#8220;Flex Library Build Path&#8221; project properties reset to &#8220;Merged into code&#8221; instead of keeping my preferred setting of &#8220;Use default (external).&#8221; I couldn&#8217;t figure out why until I noticed one day that any <em>new</em> Flex Library project I created did not have this problem. After doing some folder/file comparisons, I figured out how to fix it. </p>
<h2>The fix</h2>
<p>In your Flex Library project folder, open this file: <strong><code>.flexLibProperties</code></strong><br />
(For those of us on Macs, this file is hidden since it begins with a period.)</p>
<p>The first line of the file will look like this:<br />
<code>&lt;flexLibProperties includeAllClasses="false" useMultiPlatformConfig="false" <font color="red">version="1"</font>&gt;/code></p>
<p>Change the version value to "3" instead:<br />
<code>&lt;flexLibProperties includeAllClasses="false" useMultiPlatformConfig="false" <font color="blue">version="3"</font>&gt;/code></p>
<p>Now, close and re-open your project.<br />
Change the "Framework linkage" back to "Use Default (external)" it will retain its framework linkage setting next time it is re-opened!</p>
<h2>Why it happened</h2>
<p>I think this was due to a bug in the way Flash Builder upgraded these projects, since it was only happening with projects that we had originally created in earlier versions of Flash Builder. </p>
]]></content:encoded>
			<wfw:commentRss>http://taytay.com/?feed=rss2&#038;p=250</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Painfully slow MXML editing in Flash Builder 4.0 and 4.5</title>
		<link>http://taytay.com/?p=244</link>
		<comments>http://taytay.com/?p=244#comments</comments>
		<pubDate>Mon, 30 May 2011 16:10:16 +0000</pubDate>
		<dc:creator>Taytay</dc:creator>
				<category><![CDATA[Flex/AIR]]></category>

		<guid isPermaLink="false">http://taytay.com/?p=244</guid>
		<description><![CDATA[We have been seeing an issue where in some of our MXML code, the editing gets painfully slow. As I type, it can take many seconds for the characters to appear on screen. It makes some of our components basically un-editable within Flash Builder. I&#8217;m trying to get a good repro together for Adobe, and [...]]]></description>
			<content:encoded><![CDATA[<p>We have been seeing an issue where in some of our MXML code, the editing gets <strong>painfully</strong> slow. As I type, it can take many seconds for the characters to appear on screen. It makes some of our components basically un-editable within Flash Builder.<br />
I&#8217;m trying to get a good repro together for Adobe, and today I narrowed down the issue in one of our components to the presence of a <code>mx:DataGrid</code> tag with multiple attributes. </p>
<p><a href="http://screencast.com/t/o8Gno8ob">Take a look at this video I made illustrating the issue</a>.</p>
<p>Has anyone else experienced this?</p>
<p>UPDATE (05/31/2011): I can get around it by subclassing DataGrid as something like DataGrid2. I don&#8217;t actually do anything different in my subclass. I just use that in my component instead of referencing DataGrid, and it works like a champ again. </p>
<p>P.S. We had already disabled Design mode a long time ago, so unfortunately, that is not the culprit in this particular case. I&#8217;ve also attempted to disable everything &#8220;content-assist&#8221; related within the MXML Content-assist settings, and that didn&#8217;t seem to help. I look forward to discovering a simple setting that can bring the performance back!</p>
]]></content:encoded>
			<wfw:commentRss>http://taytay.com/?feed=rss2&#038;p=244</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>We are looking for an amazing Designer</title>
		<link>http://taytay.com/?p=237</link>
		<comments>http://taytay.com/?p=237#comments</comments>
		<pubDate>Thu, 12 May 2011 14:53:42 +0000</pubDate>
		<dc:creator>Taytay</dc:creator>
				<category><![CDATA[Flex/AIR]]></category>

		<guid isPermaLink="false">http://taytay.com/?p=237</guid>
		<description><![CDATA[I work for a small, profitable, growing company that needs more and more design work done. We need everything from UI/UX, to brand/identity, to educational print materials designed. In short, if you work for us, you&#8217;ll get to shape just about every client interaction we have. It will be fun! Check out the job description.]]></description>
			<content:encoded><![CDATA[<p>I work for a <a href="http://YouNeedABudget.com">small, profitable, growing company</a> that needs more and more design work done. We need everything from UI/UX, to brand/identity, to educational print materials designed. In short, if you work for us, you&#8217;ll get to shape just about every client interaction we have. It will be fun!<br />
<a href="http://jobs.37signals.com/jobs/8877">Check out the job description</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://taytay.com/?feed=rss2&#038;p=237</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

