<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5873661</id><updated>2011-04-21T19:06:17.972-07:00</updated><title type='text'>Test Infected...</title><subtitle type='html'>Test Driven Development with ActionScript 2.0</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5873661.post-116199573874618825</id><published>2006-10-27T17:33:00.000-07:00</published><updated>2006-10-27T17:35:38.756-07:00</updated><title type='text'>Just in case...</title><content type='html'>...anyone is still linked to this blog, I have moved to &lt;a href="http://www.asserttrue.com"&gt;http://www.asserttrue.com&lt;/a&gt; where Ali Mills and I post about a variety of topics (including asunit). If I ever get time, I might move these posts over to that database, but for now, please update your links as this one won't be getting posted on anytime soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-116199573874618825?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/116199573874618825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=116199573874618825' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/116199573874618825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/116199573874618825'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2006/10/just-in-case.html' title='Just in case...'/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873661.post-113323912669638951</id><published>2005-11-28T20:37:00.000-08:00</published><updated>2005-11-28T20:38:46.706-08:00</updated><title type='text'>Continuous Integration with AsUnit?</title><content type='html'>We received another excellent question today on the &lt;a href="http://lists.sourceforge.net/lists/listinfo/asunit-users"&gt;asunit-users&lt;/a&gt; list. This one came from Ian Tyrell.&lt;br /&gt;&lt;br /&gt;I believe he wanted to know if AsUnit could be coerced to play nicely with other mainstream continuous integration tools. Specifically, he asked, "...what would be needed to take things a step further and automatically run/evaluate the tests. What’s stopped me in the past is the use of LocalConnection between tests and TestUI"...&lt;br /&gt;&lt;br /&gt;Well Ian, we haven't really brought AsUnit 2.x to that point yet, but AsUnit 3.x is pretty much ready to go. Fortunately, there is still hope for ActionScript 2.0 developers!&lt;br /&gt;&lt;br /&gt;Many thanks to some genius at Macromedia, there is a little-known feature of the Flash Debug Player that allows it to output errors and trace statements to a text file - anywhere on your system. &lt;br /&gt;&lt;br /&gt;Following are some articles that extoll the virtues of this feature in depth:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://broadcast.artificialcolors.com/index.php?m=20040401"&gt;Greg Wygonik&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.actionscript.org/tutorials/beginner/trace_and_debug_from_your_browser/index.shtml"&gt;actionscript.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://livedocs.macromedia.com/flex/15/flex_docs_en/wwhelp/wwhimpl/common/html/wwhelp.htm?context=Flex_Documentation&amp;file=00000794.htm"&gt;livedocs.macromedia.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once this has been properly configured, you can then write or implement whatever scripts you want to watch changes made to that file, and when some knucklehead (like me) checks in broken code, an email can be sent to the entire team with the failure log and even a list of the most recent version control checkins.&lt;br /&gt;&lt;br /&gt;I haven't actually set up a system like this yet, because so far, Ali and I have been able to work pretty much by ourselves over the past couple of years, and if someone checks in broken code - it's usually pretty easy to guess who it was, and - I'm not too hard to find!&lt;br /&gt;&lt;br /&gt;As it stands, it should be pretty easy to dig into the sources associated with AsUnit 2.x and make it "trace" the output rather than (or in addition to) sending it to the TextField that it currently sends to.&lt;br /&gt;&lt;br /&gt;Ultimately, if you can get the AsUnit UI to send the contents of the TextField to a trace statement instead of the TextField, you should be able to pretty easily set up some service to watch that .log file and provide whatever embarrasing notification you deem necessary...&lt;br /&gt;&lt;br /&gt;Please let me know if you get this working, as I would love to update the sources with your changes so that others can also benefit. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Good Luck,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Luke Bayes&lt;br /&gt;www.asunit.org&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-113323912669638951?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/113323912669638951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=113323912669638951' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/113323912669638951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/113323912669638951'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2005/11/continuous-integration-with-asunit.html' title='Continuous Integration with AsUnit?'/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873661.post-113296589161276544</id><published>2005-11-25T16:41:00.000-08:00</published><updated>2005-11-25T16:52:09.883-08:00</updated><title type='text'>Testing Asynchronous Functionality...</title><content type='html'>I encountered an excellent question today on the asunit-users mailing list. AliasRob asked:&lt;br /&gt;&lt;br /&gt;&gt;&gt; Just wondering if anyone has had any interesting stories or&lt;br /&gt;&gt;&gt; experiences regarding unit testing asynchronous functions, such as&lt;br /&gt;&gt;&gt; loading a .swf, or waiting for a database or remoting call to return.&lt;br /&gt;&gt;&gt; I'm wondering if there's a particular strategy that's becoming&lt;br /&gt;&gt;&gt; popular.&lt;br /&gt;&lt;br /&gt;The testing of asynchronous functionality has been the subject of deliberation by many folks that are smarter and more experienced than I. Following, I'll do my best to describe this problem and it's potential solutions as I have understood them from these other people...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Problem:&lt;/b&gt;&lt;br /&gt;You have a bit of functionality that does not execute in a single thread of execution that you would like to test and verify.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Information:&lt;/b&gt;&lt;br /&gt;There are some fundamental tidbits related to Unit Testing that ought to receive some consideration before we go much further.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;There should be no dependency from one test method to another. Test methods should be decoupled.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;There should be no dependency from one test case to another. Test cases should be decoupled.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;As with applications, test fixtures should attempt, at all times, to avoid code duplication and all other code smells (as outlined in "Refactoring").&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A Unit Test should be designed to test the smallest bit of functionality, and nothing else.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A complete application test fixture should execute as quickly as possible in order to ensure that we continue to run it.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The setUp and tearDown methods of the abstract TestCase are overridden and implemented to perform (and clean up from) the complete configuration that needs to be in place for each test method in a test case. These methods will be executed exactly one time before and after (respectively) calls to each method whose declaration matches the expression "public function test*".&lt;/li&gt;&lt;br /&gt;&lt;li&gt;One can use Mock objects for a number of reasons, one of which is as a stub or faux representation of an actually-networked resource.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Test cases should never (the emphasis here is mine, most books I have read never say never) require access to the internet in order to successfully execute.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Solution:&lt;/b&gt;&lt;br /&gt;With all that said, the answer to your question is that it depends on exactly what you're testing. If you're attempting to test the backend of a system using it's client, you should stop. The server side of a system should be unit tested independently of any client software. These two halves of an application should not ever be tightly-coupled. The developer or developers responsible for the server should write unit tests that ensure the server is working as expected in whatever language and using whatever technology the server was written in. Likewise, the developers responsible for the client should test its features independently. &lt;br /&gt;&lt;br /&gt;How does one test the interface between these two systems?&lt;br /&gt;&lt;br /&gt;That's an excellent question. It is done by building a "mock" or "stub" of the server that doesn't actually connect to anything, but instead returns consistent, known results to API queries.&lt;br /&gt;&lt;br /&gt;Then, the server developer can build herself a "mock" or "stub" client that behaves exactly the same way in order to test her side of the connection.&lt;br /&gt;&lt;br /&gt;Neither of these tests should require network connections.&lt;br /&gt;&lt;br /&gt;The biggest issue with this approach occurs if your server has an extensive, large set of complicated APIs. I have often found that the server side of a system should usually have only a small handful of interface methods, and when I have encountered systems that actually did have an extensive interface, it seems that it was usually a code smell where we should have been reading the book, "Enterprise Integration Patterns", instead of over-engineering the connection between our efforts.&lt;br /&gt;&lt;br /&gt;In another scenario, you may want to test some piece of functionality like an "xml parser" of sorts or some such other feature that is much easier to test if the data does not have to be managed in ActionScript. &lt;br /&gt;&lt;br /&gt;For example, the following is a hideous thing to uncover and later have to manage:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;private function getData():XML {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var str:String = "";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str += "&amp;lt;Application id='foo'&amp;gt;";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str += " &amp;lt;child id='bar' /&amp;gt;";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str += "&amp;lt;/Application&amp;gt;";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return new XML(str);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For this use case, we have added full support for a truly asynchronous test case. Following is an example concrete TestCase that will execute asynchronously. &lt;br /&gt;&lt;br /&gt;The first method called by the TestCase constructor is the "run()" method. In the following example, we override run(), and instead of doing other work in the override, we simply create and request an XML document that resides in our test folders next to the test case in question. In this case, we are using the AsUnit-provided TestCaseXml class which will, upon load completion, call "onXmlLoaded" on whatever object was passed as the second argument of it's constructor.&lt;br /&gt;&lt;br /&gt;You'll notice that in that handler, we finally call super.run(). This begins execution of the test case only after a successful load of the xml document. This process can be similarly implemented to load and verify external assets such as swfs or images as well.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import org.yourdomain.data.XmlParser;&lt;br /&gt;import com.asunit.framework.*;&lt;br /&gt;&lt;br /&gt;class org.lifebin.data.XmlParserTest extends TestCase {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private var className:String = "org.lifebin.data.XmlParserTest";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private var parser:XmlParser;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private var xmlData:TestCaseXml;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private var xmlPath:String = "com/yourdomain/data/XmlParserData.xml";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// This method begins execution of the abstract TestCase&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// We are overriding it here to effectively pause that execution&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// until our xml data is loaded.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public function run():Void {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlData = new XmlTransport(xmlPath, this);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public function onXmlLoaded(data:XMLNode):Void {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super.run();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public function setUp():Void {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parser = new XmlParser(xmlData.cloneNode(true));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public function tearDown():Void {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete parser;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public function testInstantiated():Void {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assertTrue("XmlParser instantiated", parser instanceof XmlParser);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public function testParser():Void {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assertTrue(false); // failing test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;In closing, I just want to make the point that the asynchronous test case is really only valuable when we want to store "configuration" data in a more easily manageable form. EG, if I have an image parser in ActionScript 3 that will examine each pixel of an image as a ByteArray, it is much easier to load an external, known image than it is to write out some 300k ByteArray in a setUp method. Similarly, it is often easier to test various Xml parsing implementations by actually using a separate xml example document. Keep in mind that the test for these parsers are not intended to also test the "network" or the "server". &lt;br /&gt;&lt;br /&gt;One should also note that in this example setUp method, we use the "cloneNode" method of the flash XML object. We also pass in "true" as an argument. This performs a "deep clone" on the loaded XML data structure so that we have a clean copy of the data exactly as it was loaded for each testMethod that is executed.&lt;br /&gt;&lt;br /&gt;Thanks,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Luke Bayes&lt;br /&gt;www.asunit.org&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-113296589161276544?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/113296589161276544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=113296589161276544' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/113296589161276544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/113296589161276544'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2005/11/testing-asynchronous-functionality.html' title='Testing Asynchronous Functionality...'/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873661.post-112613561364463870</id><published>2005-09-07T16:25:00.000-07:00</published><updated>2005-09-09T11:26:28.120-07:00</updated><title type='text'>AsUnit Meets XULRunner!</title><content type='html'>I've been researching &lt;a href="http://xulplanet.com/" target="_blank"&gt;XUL&lt;/a&gt; for the past few weeks and couldn't seem to answer all of the questions that keep coming to mind. I figured the only way to get it sorted out, was to build something in it, but I couldn't think of something that would be worthwhile and yet easy enough...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enter "Create Class"&lt;br /&gt;&lt;br /&gt;Since it's inception, I have had more than a few personal complaints about our implementation of Create Class. Thankfully, other folks have been really polite about it's shortcomings. I made excuses for it related to the limited implementation of XUL that is included with the Flash MX 2004 IDE (Among other things, It ONLY has XUL 'Dialog', NOT XUL 'Window')...&lt;br /&gt;&lt;br /&gt;During recent months, I have become a sort of "Editor-Gigolo" and keep hopping from one to another in a desparate search for the "most amazing editor EVER".&lt;br /&gt;&lt;br /&gt;Some environments that I have checked out include:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://sapien.com/ProductsandServices/PrimalCode31/tabid/230/Default.aspx"&gt;PrimalScript&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Flash MX 2004 IDE (url gone?)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.macromedia.com/software/flash/flashpro/"&gt;Flash 8 IDE&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://fdt.powerflasher.com/flashsite/flash.htm"&gt;Eclipse with FDT&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/aseclipseplugin/"&gt;Eclipse with ASDT&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://textpad.com/"&gt;TextPad&lt;/a&gt; w/&lt;a href="http://mtasc.org/"&gt;MTASC&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;So far, each environment has some benefits and some drawbacks and I'm not 100% excited about any of them yet. I think that Emacs is the most promising, but it has a pretty high learning curve and causes some pain in my wrists with all the complex and repetitive key combinations! Right now, I'm settling into TextPad because it's fast, easy to launch from CygWin and it's really customizable.&lt;br /&gt;&lt;br /&gt;Basically, in all this moving around, I have been dreaming about the day when &lt;a href="http://www.asunit.com"&gt;AsUnit&lt;/a&gt; (and especially Create Class/Build Test Suites/Create Test Case) will work for me no matter what environment I'm using, and especially without regard to my operating system. (Even, dare I say, LINUX?!)&lt;br /&gt;&lt;br /&gt;As it turned out, I kind of lost my mind over the labor day weekend and started rebuilding the functionality found in the &lt;a href="http://www.asunit.com"&gt;AsUnit&lt;/a&gt; Create Class command and AsUnit UI Panel as a standalone &lt;a href="http://wiki.mozilla.org/XUL:Xul_Runner"&gt;XULRunner&lt;/a&gt; application. I thought I would just get a "beginning" in place and wound up building the whole damn thing!&lt;br /&gt;&lt;br /&gt;I should probably hold off on releasing this until I make time to write an installer and some docs or something, but I just CAN'T WAIT!&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;So, without further rambling - if you're interested in the coolest utility to hit Flash development &lt;i&gt;(in the past hour or so at least)&lt;/i&gt; - follow these &lt;i&gt;(sort of)&lt;/i&gt; simple steps:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Download the zipped files &lt;a href="http://prdownloads.sourceforge.net/asunit/AsUnit-2.7.alpha.zip?download"&gt;AsUnit 2.7 (alpha)&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Download the latest build of &lt;a href="http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly/latest-trunk/" target="_blank"&gt;XULRunner&lt;/a&gt; from Mozilla.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Unzip the createclass.zip file to somewhere on your system that won't change.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Copy the com folder out of the unpacked classpath folder and put it into some directory that your compiler references. This should be either some place where you tell MTASC to look or if you're using the Flash IDE on windows, it will be somewhere like:&lt;br /&gt;&lt;code&gt;C:\Documents and Settings\lbayes\Local Settings\Application Data\Macromedia\Flash MX 2004\en\Configuration\Classes&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Unzip the files you downloaded from Mozilla to some place that won't change. I put mine into:&lt;br /&gt;&lt;code&gt;C:\Program Files\Mozilla\XulRunner&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Update your system PATH variable to include the location of xulrunner.exe&lt;br /&gt;On windows, this can be done by:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Using Windows Explorer, go to the folder that contains xulrunner.exe&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Select the text that appears in the address/location field&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Copy it to your clip board&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Right-Click My Computer&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Choose properties&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Select the Advanced tab&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Click Environment Variables&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the System Variables, choose the one that says, "Path"&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Click the edit button&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the Variable Value field, go all the way to the right, add a semi-colon ";"&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Paste the contents of your clip board into this field&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Keep choosing OK until the panels all go away&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Open up a command prompt (Cygwin if you have it)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Navigate to the folder where you unzipped createclass.zip, step into the xulCreateClass folder&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Enter:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;xulrunner application.ini&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Start Playing!&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Some things you'll definitely want to try:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Create or choose a working directory&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Add class paths to the UI&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Choose "Create Test Case"&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Choose "Make Class Serializable"&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Choose "Add __Packages Prefix"&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Select or Deselect "Show only interfaces"&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Keep opening the files that it creates!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;DEFINITELY choose "Private w/Singleton" in the modifiers section!&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Once you have some class paths in there, you should be able to click "Choose" next to "SuperClass" and you should see every .as class that's available in your working directory and your classpath(s)... This also applies to the "Add" button for interfaces. Interfaces should be shown in blue in both of these lists!&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Disclaimer(s) and random tidbits:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;This is barely ALPHA quality software! I hacked this out in three days as my first effort in XUL. Please don't set C:\ or your Desktop as the source folder! PLEASE create a new, empty folder and use that as your source folder. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;I have not run this even one time on a mac or linux, if you have either of these platforms, please let me know if it works!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;This should create error-free code for MTASC and the Flash IDE compiler(s), but the only templates that are current available are for MTASC compliance - since it's so much stricter...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I *KNOW* that someone out there has (or wants to gain) experience building Firefox / Mozilla extensions, this is a perfect opportunity for you to contribute to an open source project! We're in desparate need of a good, solid XPI (Cross Platform Installer) so that when this is released, users can install it with a single click... Wanna help? &lt;a href="http://www.asunit.com"&gt;Sign up to the asunit-users mailing list&lt;/a&gt; and let us know?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I included anonymous CVS files in this release, so that as we iterate on the functionality, you can use CVS to perform instant updates to your local builds. This is kind of risky, so only do this if you know what you're doing. We'll be careful not to check in broken stuff to the head revision from this point forward...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;PLEASE let me know what you think of this by posting to the &lt;a href="http://www.asunit.com"&gt;AsUnit mailing list&lt;/a&gt;...&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-112613561364463870?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/112613561364463870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=112613561364463870' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/112613561364463870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/112613561364463870'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2005/09/asunit-meets-xulrunner.html' title='AsUnit Meets XULRunner!'/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873661.post-112095853383943609</id><published>2005-07-09T18:22:00.000-07:00</published><updated>2005-07-09T18:22:37.676-07:00</updated><title type='text'>Emacs?!</title><content type='html'>I have this growing stack of books on my night stand. I tend to read some of a book, pick up another and eventually return to the original one. This can continue for as many as 10 or 15 books and 2 or 3 months at a time. My night stand is obviously quite a mess! It occurred to me that someone out there might be interested in at least some of the things I'm reading, so I put together my second book list that you can &lt;a href="http://www.amazon.com/exec/obidos/tg/listmania/list-browse/-/FNPDS0J7UN4D/ref=cm_aya_av.lm_more/102-1986642-6228120"&gt;find here&lt;/a&gt;... This is the list of books that are currently on my night stand.&lt;br /&gt;&lt;br /&gt;Now on to the actual point of this entry - I started reading &lt;a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;amp;camp=1789&amp;amp;tag=lukebayes-20&amp;amp;creative=9325&amp;amp;path=tg/detail/-/020161622X/qid=1120953431/sr=8-1/ref=pd_bbs_ur_1?v=glance%26s=books%26n=507846"&gt;The Pragmatic Programmer&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=lukebayes-20&amp;amp;l=ur2&amp;amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; last week. I'm about half-way through and had to stop in order to implement at least some of what it says before going any further. Ali and I dropped into &lt;a href="http://www.staceys.com"&gt;Stacey's&lt;/a&gt; on Friday afternoon and picked up a pile of books that should help us on our way. Among many other compelling and wise statements, the authors (Andrew Hunt and David Thomas) make a significant and effective argument that I hadn't really seen so clearly before.&lt;br /&gt;&lt;br /&gt;The Power of Plain Text&lt;br /&gt;&lt;br /&gt;They make the case (&lt;i&gt;extremely effectively for me at least&lt;/i&gt;) that we should keep our most important data NOT in secretive, proprietary, volatile, incompatible, binary formats, but instead - in human-readable, cross-platform, version-able, merge-able Plain text files. It's OK to &lt;i&gt;compile&lt;/i&gt; this plain text into more efficient binary formats for specific purposes (like network transmission for example), but it's unwise to &lt;i&gt;store&lt;/i&gt; our most critical information using transient and volatile means such as Micorosoft Word documents and Excel Spreadsheets. It's important to note that the authors do not come out and say anything about these particular file formats, and I'm eager to point out that even &lt;a href="http://blogs.msdn.com/brian_jones/archive/2005/06/01/424085.aspx"&gt;Microsoft itself has finally embraced the wisdom in this idea&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;They cite the following primary reasons for using Plain Text:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Insurance against Obsolescence:&lt;/b&gt; Unlike binary files, for as long as that file exists, you can use any standard tool to parse it and unlock it's secrets.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Leverage:&lt;/b&gt; Just about every tool available in computing can operate on Plain Text. Within this argument, these guys proceeded to describe some ancient (1980's) and yet stunningly efficient and powerful tools that I'm frankly ashamed to not be intimately familiar with. (for example: &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;, &lt;a href="http://www.gnu.org/software/sed/"&gt;Sed&lt;/a&gt; and &lt;a href="http://www.gnu.org/software/gawk/"&gt;Awk&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Easier Testing:&lt;/b&gt; It's much simpler to verify and validate inputs and outputs if a system works with Plain Text rather than hidden binary formats. This argument really goes to the core of &lt;a href="http://lukebayes.blogspot.com/2005/05/i-received-question-about-flash.html"&gt;my problems with Flash Remoting&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Finally, as a result of reading &lt;a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;amp;camp=1789&amp;amp;tag=lukebayes-20&amp;amp;creative=9325&amp;amp;path=tg/detail/-/020161622X/qid=1120953431/sr=8-1/ref=pd_bbs_ur_1?v=glance%26s=books%26n=507846"&gt;The Pragmatic Programmer&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=lukebayes-20&amp;amp;l=ur2&amp;amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;, I wound up getting all involved in learning &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; (I'm using it right now to create this blog entry). I picked up &lt;a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&amp;amp;camp=1789&amp;amp;tag=lukebayes-20&amp;amp;creative=9325&amp;amp;path=tg/detail/-/0596006489/qid=1120954528/sr=8-1/ref=pd_bbs_ur_1?v=glance%26s=books%26n=507846"&gt;Learning GNU Emacs&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=lukebayes-20&amp;amp;l=ur2&amp;amp;o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; from O'Reilly and haven't been able to put it down. I am seriously considering this as my primary editor for all-things-text. Yes - even ActionScript, Java and maybe even my address book, calendar, journal, blog and email?!. I'll definitely report back as I learn more on the subject. I'm a little concerned that I might be getting too excited, but my initial research is extremely encouraging. It seems that some very focused and very smart people have been refining this tool as a development platform since 1984. I didn't know this, but apparently Emacs was originally written and continues to be led by &lt;a href="http://www.stallman.org/"&gt;RMS&lt;/a&gt; himself. ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-112095853383943609?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/112095853383943609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=112095853383943609' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/112095853383943609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/112095853383943609'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2005/07/emacs_112095853383943609.html' title='Emacs?!'/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873661.post-112051820058173025</id><published>2005-07-04T16:03:00.000-07:00</published><updated>2005-07-04T16:10:56.846-07:00</updated><title type='text'>XUL Runner?!</title><content type='html'>&lt;p class="mobile-post"&gt;A couple of weeks ago (thanks to my handy Firefox t-shirt) I ran into a super-smart young guy on BART.&lt;/p&gt;&lt;p class="mobile-post"&gt;&lt;a href="http://weblogs.mozillazine.org/josh/"&gt;http://weblogs.mozillazine.org/josh/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://josh.trancesoftware.com/"&gt;http://josh.trancesoftware.com/&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-post"&gt;I ended up hanging out this weekend with him and a friend of his named Alex. We wound up talking about the future of GUI application deployment (Since the topic pretty much consumes every waking moment for me these days). He and his friend both are doing some work this summer in Mountain View for the Mozilla Foundation and turned me on to something that's pretty damn exciting.&lt;/p&gt;&lt;p class="mobile-post"&gt;I had this idea a couple of weeks ago - what if I could wrap up the XUL foundation classes, download, install and instantiate the Flash Player for whatever platform the user was on, and ultimately deploy a single, distributed application that will run from the web within whatever browser you have, but also offer (with roughly identical code) a downloadable, installable, more feature-rich, occasionally-connected version of that application? What if we could combine the in-browser ubiquity of the Flash Platform, with the small footprint and easy installation of the desktop XUL platform? Could this possibly work? Ali and I have talked about it a bit and neither of us really have the skills to be ripping out C++ code from the Mozilla project, but we were preparing to try anyway!&lt;/p&gt;&lt;p class="mobile-post"&gt;As it turns out - Josh and Alex turned me on to XULRunner, a thin, installable implementation of the XUL runtime without Firefox, Mozilla or any other specific application. Of course it's not really released yet, but it sounds like we'll be able to distribute applications as singular binaries or bundles on any platform at some point this summer. For now, thanks to the nature of open source - we can download nightly builds and learn about this thing!&lt;/p&gt;&lt;p class="mobile-post"&gt;Here's how to get started:&lt;/p&gt;&lt;p class="mobile-post"&gt;1) Get the exe:&lt;br /&gt;&lt;a href="http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly/latest-trunk/"&gt;http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly/latest-trunk/&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-post"&gt;2) Put it somewhere you'll remember... I unzipped into:&lt;br /&gt; C:/Program Files/Mozilla XULRunner/&lt;/p&gt;&lt;p class="mobile-post"&gt;3) Update your path so that xulrunner refers to this location.&lt;/p&gt;&lt;p class="mobile-post"&gt;4) Download the simple-browser example:&lt;br /&gt;&lt;a href="http://friedfish.homeip.net/~darinf/xulrunner/mybrowser.html"&gt;http://friedfish.homeip.net/~darinf/xulrunner/mybrowser.html&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-post"&gt;5) From wherever you unzip it, open a command prompt and run:&lt;br /&gt;xulrunner application.ini&lt;/p&gt;&lt;p class="mobile-post"&gt;Here are a few other links that I found useful:&lt;br /&gt;&lt;a href="http://wiki.mozilla.org/XUL:Xul_Runner"&gt;http://wiki.mozilla.org/XUL:Xul_Runner&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-post"&gt;&lt;a href="http://blogs.acceleration.net/ryan/archive/2005/05/06/1073.aspx"&gt;http://blogs.acceleration.net/ryan/archive/2005/05/06/1073.aspx&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-post"&gt;&lt;a href="http://developer-test.mozilla.org/en/docs/XULRunner"&gt;http://developer-test.mozilla.org/en/docs/XULRunner&lt;/a&gt;&lt;/p&gt;&lt;p class="mobile-post"&gt;&lt;a href="http://www.mozillazine.org/talkback.html?article=6421"&gt;http://www.mozillazine.org/talkback.html?article=6421&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-112051820058173025?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/112051820058173025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=112051820058173025' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/112051820058173025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/112051820058173025'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2005/07/xul-runner.html' title='XUL Runner?!'/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873661.post-111872501174885712</id><published>2005-06-13T21:53:00.000-07:00</published><updated>2005-06-13T23:43:29.076-07:00</updated><title type='text'></title><content type='html'>I was just doing some research for what seemed like a pretty simple, benign, blog posting, and wound up spending two hours following links on &lt;a href="http://c2.com/cgi/wiki"&gt;Ward Cunningham's wiki&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;I figure it might be helpful to share some of the highlights of my scouring.&lt;br /&gt;&lt;br /&gt;Along with a few other XP terms, the term "&lt;a href="http://c2.com/cgi/wiki?UnitTest"&gt;Unit Test&lt;/a&gt;" is in the process of "officially" being changed to "&lt;a href="http://c2.com/cgi/wiki?ProgrammerTest"&gt;Programmer Test&lt;/a&gt;" apparently in an effort to avoid continuing confrontations with the very powerful and demanding Quality Assurance Industrial Complex.&lt;br /&gt;&lt;br /&gt;Apparently, shockingly, I'm not the first person to hope for, look for and dream about the most &lt;a href="http://c2.com/cgi/wiki?QuestForThePerfectLanguage"&gt;amazing&lt;/a&gt; &lt;a href="http://c2.com/cgi/wiki?MyFavouriteProgrammingLanguage"&gt;programming&lt;/a&gt; &lt;a href="http://c2.com/cgi/wiki?KeyLanguageFeatures"&gt;language&lt;/a&gt; "ever"...&lt;br /&gt;&lt;br /&gt;(That's three different links you should click on)&lt;br /&gt;&lt;br /&gt;I found out that the thing I tend to do when nothing logical seems to be working in Flash, &lt;a href="http://c2.com/cgi/wiki?VoodooChickenCoding"&gt;actually has a name&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I also learned that if you're using blogger.com, and you're editing a blog, CTRL+S actually saves AND publishes the page you're editing - which subsequently sends an email to anyone that is subscribed to your blog.&lt;br /&gt;&lt;br /&gt;Sweet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-111872501174885712?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/111872501174885712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=111872501174885712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/111872501174885712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/111872501174885712'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2005/06/i-was-just-doing-some-research-for.html' title=''/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873661.post-111820657835430963</id><published>2005-06-07T21:26:00.000-07:00</published><updated>2005-06-07T21:56:18.383-07:00</updated><title type='text'></title><content type='html'>Just wanted to give a heads up...&lt;br /&gt;&lt;br /&gt;Ali and I had a talk with Robert Penner last Friday to discuss his involvement in ongoing &lt;a href="http://www.asunit.com"&gt;AsUnit &lt;/a&gt;development.&lt;br /&gt;&lt;br /&gt;As it turned out, he had quite a few really GREAT ideas about how &lt;a href="http://www.asunit.com"&gt;AsUnit &lt;/a&gt;could be improved.&lt;br /&gt;&lt;br /&gt;One of them was that we could batch our Local Connection transmissions so that the UI would be more responsive.&lt;br /&gt;&lt;br /&gt;I was promptly up until the wee hours last night trying to get it to work. Knowing what I know about the implementation, I figured that it would be a pretty easy addition...&lt;br /&gt;&lt;br /&gt;As it turned out, I was able to get some small tests working, but as soon as I ran some of our bigger applications, none of the Tests were being received by the server. There was no call to onStatus, no obvious reason for the failure, no notification whatsoever. Eventually, (around 1:30am or so) I figured that I probably shouldn't be coding and drinking and figured I must be doing something stupid!&lt;br /&gt;&lt;br /&gt;This morning, I caught a surprising conversation on the &lt;a href="http://www.osflash.org"&gt;osflash &lt;/a&gt;list - they were talking about how the Local Connection object has a 40k data limit! What?! &lt;br /&gt;&lt;br /&gt;So I checked the implementation and if I put a 100 assertion limit on the batches, everything worked fine - even on the big builds. &lt;br /&gt;&lt;br /&gt;So - &lt;br /&gt;&lt;br /&gt;I dropped a build on AsUnit that has a 100 assertion batch size, but this is kind of arbitrary - especially considering that folks could put just about any size of string message into each assertion and even more so because I usually don't put anything in the message field.&lt;br /&gt;&lt;br /&gt;I now want to put together a build of LocalConnClient and LocalConnServer that has some kind of handshake mechanism, so that any tranmission also includes confirmation of receipt. If the server doesn't confirm, the client will throw some kind of error. We can then handle this error in AsUnit by cutting the batch size down a bit, and retrying the request.&lt;br /&gt;&lt;br /&gt;I figured folks ought to know about this - since it seems to be pretty important if you're building an app that relies on Local Connection...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-111820657835430963?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/111820657835430963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=111820657835430963' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/111820657835430963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/111820657835430963'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2005/06/just-wanted-to-give-heads-up.html' title=''/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873661.post-111731200017889887</id><published>2005-05-28T13:15:00.000-07:00</published><updated>2005-05-28T15:20:50.346-07:00</updated><title type='text'></title><content type='html'>I received a question about Flash Remoting and thought maybe my answer could be helpful for some other folks out there.&lt;br /&gt;&lt;br /&gt;&gt;&gt; I'm looking into a job that would require working with &lt;a href="http://www.amfphp.org/"&gt;AMFPHP&lt;/a&gt;. Has anyone dealt with it before?&lt;br /&gt;&lt;br /&gt;I have to confess that I have never used &lt;a href="http://www.amfphp.org/"&gt;AMFPHP&lt;/a&gt;, but I have used &lt;a href="http://openamf.org/"&gt;Open AMF&lt;/a&gt;, and &lt;a href="http://www.macromedia.com/software/flashremoting/"&gt;Macromedia Flash Remoting&lt;/a&gt; for both Java and Cold Fusion. I have also worked with &lt;a href="http://www.carbonfive.com/"&gt;Carbon Five's&lt;/a&gt; &lt;a href="http://carbonfive.sourceforge.net/astranslator/api/com/carbonfive/flash/package-summary.html#documentation"&gt;ASTranslator&lt;/a&gt;, which can make working with Remoting at least a little less painful.&lt;br /&gt;&lt;br /&gt;My opinions about Remoting have softened quite a bit over the past year or so, but remain nonetheless. Each objection that I have can be resolved one way or another, but I think one should be aware of these objections and their solutions before engaging in a Remoting project, regardless of the particular Remoting technology.&lt;br /&gt;&lt;br /&gt;Tight Coupling: Remoting provides a very tight (and hidden) coupling between the client and the server. You can overcome this by creating an ActionScript mock implementation of your server that returns ActionScript objects just as if they were coming from the back-end. Your server developers need to also create a mock client. I think this is quite a lot of work and very difficult to keep in sync with changing APIs. This problem is a big deal. This problem means that unless you build the mock client and mock server, you can't really test your communication code until both the client and server are completely working. Additionally, there will come a day - that will probably turn into a week, when you have a server developer sitting next to you and the two of you have to struggle through "integration" just to get this layer resolved. It also makes it difficult to tell where a problem is. Is the problem on the server? Is the problem on the client? Is the problem in the mock server or mock client? Is the problem a bug in Macromedia's Remoting ActionScript code? How about the server side Remoting code? Don't forget that if you don't build a complete mock client and complete mock server, you will only be able to develop your client and server code while connected to the Internet - or at least while connected to one another. For example, you'll need a fully functional, CURRENT, configured server implementation on your client development machine. This will have to be kept in sync with updates as the server developers make them. This has additional development overhead as you learn the back-end build process. It also has additional performance overhead while you compile and test your client code.&lt;br /&gt;&lt;br /&gt;Another issue with tight coupling is that you will have created server and client implementations that will only work with one another. You cannot take that PHP Remoting service and quickly build an HTML client for it. You are locked into Flash/Remoting/Your Server (FRYS!?). What if Adobe decides to bundle the Yahoo Toolbar, Acrobat Reader and some other unwanted junk into the Flash Player distribution? Your client might decide to use &lt;a href="http://www.adaptivepath.com/publications/essays/archives/000385.php"&gt;AJAX&lt;/a&gt; at that point. Now they're going to have to rebuild both halves of their application - not just the client code.&lt;br /&gt;&lt;br /&gt;Debugging: There is a Remoting Debugger, but it's kind of useless in my experience, especially if you're transmitting large data sets, which ironically is the only reason to use Remoting in the first place!&lt;br /&gt;&lt;br /&gt;Single Callback: Remoting provides a single callback for each remote method. This can cause a problem if your application calls the same method multiple times before the first result is returned. There is no guarantee that the results will be returned in order, and in fact they rarely are. Creation of additional gateways is fairly expensive in terms of performance, thanks to the NetService classes. There are some other workarounds like client-side connection pooling.&lt;br /&gt;&lt;br /&gt;The only good justification that I have heard for Remoting is that it compresses your data into *much* smaller packets. I believe that if you really need to do this, you're probably doing something wrong in your data design. Your views will probably choke on such large record sets anyway. Have you considered paginated records? How about summary results that contain unique IDs, which then let you download single, client-requested record details? Consider how other people with extremely large data sets handle it. How does Google get terrabytes of data into a simple HTML web client? Do they just zip it all up and send it downstream for each request?&lt;br /&gt;&lt;br /&gt;With the criticism out of the way, I do know some very smart people who use Remoting and they feel it's an excellent way to get data into and out of Flash. Based on discussions with them, it became clear to me that if you're experienced, have a fair amount of control over the back-end and don't mind building a mock server and mock client, it is certainly possible to build a respectable Flash application that uses some form of Remoting.&lt;br /&gt;&lt;br /&gt;The primary alternative to Remoting is &lt;a href="http://en.wikipedia.org/wiki/XML"&gt;XML&lt;/a&gt;, which is extremely easy and increasingly efficient to parse in Flash, especially when using the &lt;a href="http://c2.com/cgi/wiki?VisitorPattern"&gt;Visitor&lt;/a&gt; pattern. XML inherently brings the following benefits:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Easier/Faster Debugging:&lt;/b&gt; Because it is human readable, XML gives us the ability to instantly recognize where a problem exists in the communication layer of an application. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Promotes Loose Coupling:&lt;/b&gt; It more effectively decouples the server from the client. We have options available (like &lt;a href="http://www.w3.org/TR/xslt"&gt;XSLT&lt;/a&gt;) if there is a minor change to the server and we don't want to change the client.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;Verifiable&lt;/i&gt; Serialization: &lt;/b&gt;With XML, we can quickly see exactly what data is being used to create our objects and exactly what data is being sent from them. In contrast, Remoting serialization automates, and subsequently hides this information.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Simpler Mock Services: &lt;/b&gt;XML lets us build a local human-readable, easy-to-modify mock server that runs from the hard disk with no other installation dependencies. Server developers can also build very simple mock clients so that their applications can be built and tested independently.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Helps Prevent Miscommunication: &lt;/b&gt;It facilitates extremely clear communication about data formats between the front-end and back-end developers.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Easier to find Developers: &lt;/b&gt;It's MUCH easier to find someone who can read and write XML than it is to find someone who has experience with Remoting. This makes hiring and replacing both server and client developers a much less risky task.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;You'll need it anyway: &lt;/b&gt;If the back-end has any sort of mass audience, your server developers will most certainly need to publish at least some subset of their APIs to XML. Is an RSS feed in the spec?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;It's not going anywhere: &lt;/b&gt;XML is the foundation of the &lt;a href="http://www.w3.org/2001/sw/"&gt;Semantic Web&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;I think I've rambled on long enough for now. The bottom line is that I have used Remoting on a handful of projects and it was extremely painful for me. Despite those experiences, I have seriously considered using Remoting on the last two large projects that I've worked on. I am pretty sure that I'll use it at some point in the future, but I would offer a whole lot of caution before diving into a Remoting project. Whatever you do - in the words of the immortal Flavor Flav, "Don't, Don't, Don't believe the Hype!"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Luke Bayes&lt;br /&gt;&lt;a href="http://www.lukebayes.com/"&gt;www.lukebayes.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.asunit.com/"&gt;www.asunit.com&lt;/a&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-111731200017889887?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/111731200017889887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=111731200017889887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/111731200017889887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/111731200017889887'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2005/05/i-received-question-about-flash.html' title=''/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873661.post-110255654461120462</id><published>2004-12-08T17:40:00.000-08:00</published><updated>2004-12-09T15:37:43.636-08:00</updated><title type='text'></title><content type='html'>I gave a presentation to the &lt;a href="http://www.lukebayes.com/designpatterns/studygroup/index.html" target="_blank"&gt;Design Patterns User Group&lt;/a&gt; tonight and here is a copy of my Handout:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Unit Testing in ActionScript 2.0 using &lt;a href="http://www.asunit.com" target="_blank"&gt;AsUnit&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Goals:&lt;/span&gt;&lt;br /&gt;My Goals for this presentation are to convince you to:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Download &lt;a href="http://www.asunit.com" target="_blank"&gt;AsUnit&lt;/a&gt; and contribute to it’s development in any capacity (As a User, a Tester, a Developer, Documenter, or especially as an advocate)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Learn more about &lt;a href="http://extremeprogramming.org/rules/unittests.html" target="_blank"&gt;Test-Driven Development&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Learn more about &lt;a href="http://extremeprogramming.org/rules/refactor.html" target="_blank"&gt;Refactoring&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Learn more about &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0672326116/qid=1102634895/sr=8-1/ref=sr_8_xs_ap_i1_xgl14/002-1986828-7757662?v=glance&amp;s=books&amp;n=507846" target="_blank"&gt;Object Oriented Programming&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Problem:&lt;/span&gt;&lt;br /&gt;The design and development of complex systems invariably results in unexpected, unforeseen problems and issues. These issues will always appear and are invariably discovered through some form of “Testing”. Testing comes in many forms, but I have encountered some combination or subset of the following in each project:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Developer Testing is when you check your own work as you build it by using the feature being built and seeing it work.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;End User Testing is when your end users (usually pay for) and then discover all of your product failures.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Acceptance Testing is when someone else checks your work as it’s released according to a script or some well-defined series of steps against documented, expected results.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Unit Testing is a process by which we (the developers) test each small piece of our software automatically and instantly throughout it’s development.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Relevance:&lt;/span&gt;&lt;br /&gt;For those of us that are designing, building or being held responsible for complex software systems, testing in some form is critical. Unit testing is unique because it gives us the following benefits as developers:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Helps design better systems *now* by forcing you (the developer) to think about your class from the perspective of it’s consumer.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Essential part of Refactoring (“Changing the Design of Existing Code”).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The only way to *grow* a complex or large system with confidence.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Enhances the legibility of self-documenting code.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Removes massive unwanted trace statement debris that clutter up the output window and usually obscure the currently relevant debugging info.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Puts zero testing code into the final product which creates a smaller delivered code base.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Gives us added confidence and pride in our delivered product.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Solution:&lt;/span&gt;&lt;br /&gt;There are currently a small handful of Unit Testing Frameworks available for Flash Application development. We’ll be talking about &lt;a href="http://www.asunit.com" target="_blank"&gt;AsUnit&lt;/a&gt; because it is arguably the most feature-rich, efficient, &lt;a href="http://xprogramming.com/software.htm" target="_blank"&gt;xUnit&lt;/a&gt; framework available for Macromedia Flash ActionScript 2.0 applications. Especially those that may be deployed to the Flash 6.x runtime environment.&lt;br&gt;&lt;br&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Printed Resources:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;&lt;span style="font-style:italic;"&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0321146530/qid=1102633907/sr=8-5/ref=sr_8_xs_ap_i5_xgl14/002-1986828-7757662?v=glance&amp;s=books&amp;n=507846" target="_blank"&gt;Test-Driven Development: By Example&lt;/a&gt;&lt;/span&gt; by Kent Beck&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;&lt;span style="font-style:italic;"&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0201633612/qid=1102633960/sr=8-2/ref=sr_8_xs_ap_i2_xgl14/002-1986828-7757662?v=glance&amp;s=books&amp;n=507846" target="_blank"&gt;Design Patterns&lt;/a&gt;&lt;/span&gt; by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;&lt;span style="font-style:italic;"&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0201485672/qid=1102633993/sr=8-1/ref=pd_csp_1/002-1986828-7757662?v=glance&amp;s=books&amp;n=507846" target="_blank"&gt;Refactoring: Improving the Design of Existing Code&lt;/a&gt;&lt;/span&gt; by Martin Fowler&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;&lt;span style="font-style:italic;"&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0321213351/qid=1102633993/sr=8-2/ref=pd_csp_2/002-1986828-7757662?v=glance&amp;s=books&amp;n=507846" target="_blank"&gt;Refactoring to Patterns&lt;/a&gt;&lt;/span&gt; by Joshua Kerievsky&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;&lt;span style="font-style:italic;"&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0201835959/qid=1102634041/sr=8-1/ref=sr_8_xs_ap_i1_xgl14/002-1986828-7757662?v=glance&amp;s=books&amp;n=507846" target="_blank"&gt;The Mythical Man-Month: Essays on Software Engineering&lt;/a&gt;&lt;/span&gt; by Frederick P. Brooks&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;&lt;span style="font-style:italic;"&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0201616416/qid=1102634064/sr=8-1/ref=sr_8_xs_ap_i1_xgl14/002-1986828-7757662?v=glance&amp;s=books&amp;n=507846" target="_blank"&gt;Extreme Programming Explained: Embrace Change&lt;/a&gt;&lt;/span&gt; by Kent Beck&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Online Resources:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.asunit.com" target="_blank"&gt;www.asunit.com&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.junit.org" target="_blank"&gt;www.junit.org&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.refactoring.com" target="_blank"&gt;www.refactoring.com&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.xprogramming.com" target="_blank"&gt;www.xprogramming.com&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.extremeprogramming.org" target="_blank"&gt;www.extremeprogramming.org&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-110255654461120462?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/110255654461120462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=110255654461120462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/110255654461120462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/110255654461120462'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2004/12/i-gave-presentation-to-design-patterns.html' title=''/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873661.post-109477302701596910</id><published>2004-09-09T16:36:00.000-07:00</published><updated>2005-04-19T16:59:24.170-07:00</updated><title type='text'></title><content type='html'>I had this problem...&lt;br /&gt;&lt;br /&gt;My day to day ActionScript workflow is starting to look more and more like the process that I'm reading about in XP books.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Create a Failing Unit Test&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Get the test to Pass as Simply as possible&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Refactor&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Repeat&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;In ActionScript, the refactoring part is a giant pain. Thanks to the major lack of a quality IDE.&lt;br /&gt;&lt;br /&gt;I use &lt;a href="http://www.sapien.com/primalscript.aspx"&gt;Sapien PrimalScript&lt;/a&gt; to write code and it is truly the best ActionScript 2.0 editor available on the market today.&lt;br /&gt;&lt;br /&gt;As long as you create a "PrimalScript Project File", it will provide code-hinting (PrimalSense) and auto-complete with menus that include MY custom classes and their public members. (*Also whatever is in your Macromedia/Classes directory)&lt;br /&gt;&lt;br /&gt;The tough part comes in with regard to managing that Project File. I'm cruising along creating new classes and modifying existing ones. I feel like things are working out great. Then I need to bring my project file up to date so that PrimalSense works. This was kind of inconvenient, but tolerable, until I recently started trying to work with a "core" package of shared, abstract classes and then multiple other packages of concrete classes that in many cases extend the shared functionality.&lt;br /&gt;&lt;br /&gt;This means that I suddenly needed to keep multiple project files "synched up" with a single "core" directory and current with regard to their own concrete classes. This process became clearly unmanageable in about 10 minutes.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ENTER JSFL!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;So, I sat down and wrote a JSFL script that will:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Allow a user to point it at 1 to &lt;i&gt;n&lt;/i&gt; directories&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Search through them in order&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Find each file that matches a certain expression&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Create a single PrimalScript Project that displays all chosen directories as if they are all in the same place!&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;It's not quite fully complete yet, but it serves my needs. As an experiment I even pointed it at the Macromedia/Classes directory. This was a little bit time-consuming, but worked also.&lt;br /&gt;&lt;br /&gt;For the short term, I'm going to post the &lt;a href="http://www.lukebayes.com/blog/projectfiles/BuildProjectFiles.mxp"&gt;mxp here&lt;/a&gt; for whomever wants to take a look but you should be warned of a few things:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;This isn't production ready&lt;/li&gt;&lt;br /&gt; &lt;li&gt;This will not be here long&lt;/li&gt;&lt;br /&gt; &lt;li&gt;This is *not* open source code&lt;/li&gt;&lt;br /&gt; &lt;li&gt;This belongs to Ali Mills and I&lt;/li&gt;&lt;br /&gt; &lt;li&gt;This has a couple of bugs&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Ultimately, we're planning on adding the following to a custom UI and selling it for $5 or $10 bucks:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;User-driven Regular Expression for included/excluded files&lt;/li&gt;&lt;br /&gt; &lt;li&gt;User Selection of 1 to n directories&lt;/li&gt;&lt;br /&gt; &lt;li&gt;User Selection of Project File Name&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Once we built this thing and got it working for PrimalScript, someone asked us for a similar utilty that would output a Flash Project File (FLP). Personally, I can't see the value in using the Flash IDE as a text editor, but who am I to criticize?&lt;br /&gt;&lt;br /&gt;So we ported over what we had and added FLP output. This gets a little bit complicated because the Flash IDE does not respect that an "open" project file has changed, but we worked around that with some notifications to the Output Panel.&lt;br /&gt;&lt;br /&gt;If you're tired of trying to keep your PrimalScript or Flash Project files in synch with your constantly-changing ActionScript packages, feel free to &lt;a href="www.lukebayes.com/blog/projectfiles/BuildProjectFiles.mxp"&gt;download this MXP&lt;/a&gt; and let me know what you think!&lt;br /&gt;&lt;br /&gt;Thanks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-109477302701596910?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/109477302701596910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=109477302701596910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/109477302701596910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/109477302701596910'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2004/09/i-had-this-problem.html' title=''/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873661.post-109477122919171754</id><published>2004-09-09T16:07:00.000-07:00</published><updated>2004-09-10T08:52:31.780-07:00</updated><title type='text'>AsUnit Cross Platform Support Released!</title><content type='html'>Ali and I finally got around to full cross-platform support in &lt;a href="http://www.asunit.com"&gt;AsUnit&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;We have released the &lt;a href="http://prdownloads.sourceforge.net/asunit/AsUnit-installer.zip?download"&gt;.mxp installer&lt;/a&gt; and the &lt;a href="http://prdownloads.sourceforge.net/asunit/AsUnit-src.zip?download"&gt;source code&lt;/a&gt; on &lt;a href="http://www.sourceforge.net/projects/asunit/"&gt;sourceforge&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Some features include:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;Custom Unit Test Output Panel will provide instant feedback related to the status of your tests. This panel is accessible to the .swf file both locally in the Test Movie Player, and remotely from a .SWF running the browser.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Integration with Flash MX 2004 IDE Output Panel&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Create Class Command will auto-create the Class in the package defined and an associated TestCase that has one passing test and one failing test.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Create Test Suites Command will recursively search for class files with the following name *Test.as and create TestSuites that instantiate them all.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;External Debug Output that will allow you to view Test Output (using Sys.println("message");) even from .SWFs running outside the TestMovie player.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Simple .MXP installation/uninstallation using Macromedia Exchange file formats.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;No Library or asset manipulation required on Flash Timelines&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Open Source (LGPL License) so that you can fix whatever problems you perceive.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Integrates with Built-in ClassPath so that all newly created libraries are available to any files or projects that you are working on.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Immediately Available to all Existing Flash ActionScript 2.0 Projects&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;PrimalScript will provide code hinting for newly created custom classes.&lt;/li&gt;&lt;br /&gt;	&lt;li&gt;Applications under test can be exported for the Flash 7 or Flash 6 player.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-109477122919171754?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/109477122919171754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=109477122919171754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/109477122919171754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/109477122919171754'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2004/09/asunit-cross-platform-support-released.html' title='AsUnit Cross Platform Support Released!'/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873661.post-109476835180787629</id><published>2004-09-09T15:17:00.000-07:00</published><updated>2004-09-09T15:33:56.806-07:00</updated><title type='text'></title><content type='html'>We have announced the first weekly meeting of the "Design Patterns Study Group".&lt;br /&gt;&lt;br&gt;&lt;hr /&gt;&lt;br /&gt;The Design Patterns Study Group is a semi-formal organization of professional application developers that are interested in a deeper comprehension of design patterns, refactoring, test-driven development and other Agile development processes.We will meet every Wednesday to present and discuss in detail a single design pattern. All pattern examples will be presented in Flash ActionScript 2.0 and proofed using &lt;a href="http://www.asunit.com/"&gt;AsUnit&lt;/a&gt;.&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;There should be more info on my &lt;a href="http://www.lukebayes.com/designpatterns/studygroup/index.html"&gt;website&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873661-109476835180787629?l=lukebayes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lukebayes.blogspot.com/feeds/109476835180787629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5873661&amp;postID=109476835180787629' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/109476835180787629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873661/posts/default/109476835180787629'/><link rel='alternate' type='text/html' href='http://lukebayes.blogspot.com/2004/09/we-have-announced-first-weekly-meeting.html' title=''/><author><name>Luke</name><uri>http://www.blogger.com/profile/04987851347341529987</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.lukebayes.com/photos/Luke.gif'/></author><thr:total>0</thr:total></entry></feed>
