<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-21738312</id><updated>2008-06-13T13:11:27.055-07:00</updated><title type='text'>Flash Secrets: For ActionScript Development Gurus</title><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/default.htm'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml'/><author><name>Tricky</name><uri>http://www.blogger.com/profile/02161236646035432535</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-21738312.post-1070795938128018666</id><published>2008-02-09T10:35:00.000-08:00</published><updated>2008-02-09T10:54:59.153-08:00</updated><title type='text'>Restrict SharedObject Name</title><content type='html'>FluorineFx makes it extremely easy to get Remote SharedObjects up and running, but &lt;a href="http://forum.fluorinefx.com/viewtopic.php?f=9&amp;t=18"&gt;I found it difficult&lt;/a&gt; to intercept the requests made against the server.  My main reason for needing to do this is security: you don't want clients to be able to create arbitrary shared objects all willy nilly, otherwise you're just asking to be smacked with a big, bad bandwidth stick.  Unfortunately my calls for assistance were met with silence, but I don't expect much support from developers working under the alias "The Silent Group"!  So I spent the last week digging deep into the source code and trying to unravel the mysteries behind the adapters, wrappers, brokers, contexts, connections, clients, and scopes.&lt;br /&gt;&lt;br /&gt;Thankfully, today I solved the main part of the mystery and what this post is about.  Let me tell you the secret, add this to your application handler class (the one that derives from &lt;code&gt;ApplicationAdapter&lt;/code&gt;):&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;h3&gt;Intercept SharedObject Additions&lt;/h3&gt;&lt;pre&gt;&lt;span class="TPkeyword2"&gt;new &lt;/span&gt;&lt;span class="TPkeyword1"&gt;public bool &lt;/span&gt;AddChildScope&lt;span class="TPbracket"&gt;(&lt;/span&gt;IBasicScope scope&lt;span class="TPbracket"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="TPkeyword1"&gt;if &lt;/span&gt;&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPstring"&gt;"SharedObject" &lt;/span&gt;&lt;span class="TPoperator"&gt;== &lt;/span&gt;scope&lt;span class="TPoperator"&gt;.&lt;/span&gt;Type &lt;span class="TPoperator"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;br /&gt;        &lt;span class="TPstring"&gt;"expected_name" &lt;/span&gt;&lt;span class="TPoperator"&gt;!= &lt;/span&gt;scope&lt;span class="TPoperator"&gt;.&lt;/span&gt;Name&lt;span class="TPbracket"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="TPkeyword1"&gt;return &lt;/span&gt;&lt;span class="TPkeyword2"&gt;false&lt;/span&gt;;&lt;br /&gt;    &lt;span class="TPkeyword1"&gt;return base&lt;/span&gt;&lt;span class="TPoperator"&gt;.&lt;/span&gt;AddChildScope&lt;span class="TPbracket"&gt;(&lt;/span&gt;scope&lt;span class="TPbracket"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;You'll want to change the &lt;code&gt;if&lt;/code&gt; statement in order to make this work better for you, but otherwise this is how you wedge yourself in between the creation of shared objects on the server.  You still can't have &lt;a href="http://www.flashsecrets.com/2008/01/map-getsharedobject-to-net-class.html"&gt;your own class be instantiated&lt;/a&gt;, but you can prevent rogue clients from utilizing arbitrary RO's.  Also be aware that there is no way to distinguish whether the request is being made by a client or your server code, it's all or nothing: either an object is available and shared with everything or completely unavailable.&lt;br /&gt;&lt;br /&gt;On the client-side in ActionScript you'll need to check the return result of the &lt;code&gt;SharedObject&lt;/code&gt; class's &lt;code&gt;connect()&lt;/code&gt; method which will give back &lt;code&gt;false&lt;/code&gt; on failure or &lt;code&gt;true&lt;/code&gt; on success (despite what the &lt;a href="http://iamyouruser.blogspot.com/2008/02/void-returners.html"&gt;documentation may say&lt;/a&gt;).</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2008/02/restrict-sharedobject-name.html' title='Restrict SharedObject Name'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=1070795938128018666' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/1070795938128018666'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/1070795938128018666'/><author><name>Neil C. Obremski</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-5719297390043379058</id><published>2008-02-01T16:06:00.000-08:00</published><updated>2008-02-01T16:14:33.471-08:00</updated><title type='text'>flash.util:Timer not found?</title><content type='html'>Are you seeing this error?&lt;blockquote&gt;Error: Definition flash.util:Timer could not be found.&lt;/blockquote&gt;Adobe renamed &lt;code&gt;flash.util&lt;/code&gt; to &lt;code&gt;flash.util&lt;b&gt;s&lt;/b&gt;&lt;/code&gt; upon releasing the third beta of ActionScript 3 and it's been that way ever since.  Unfortunately a lot of works like &lt;i&gt;ActionScript 3 Cookbook&lt;/i&gt; were written prior to this and their &lt;code&gt;Timer&lt;/code&gt; samples tend to break.  I was surprised to have such trouble finding the solution, so I decided to write it here.</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2008/02/definition-flashutiltimer-could-not-be.html' title='flash.util:Timer not found?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=5719297390043379058' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/5719297390043379058'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/5719297390043379058'/><author><name>Neil C. Obremski</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-8618988570319720291</id><published>2008-01-31T14:50:00.000-08:00</published><updated>2008-02-01T15:31:31.400-08:00</updated><title type='text'>Map SharedObject.getRemote() to .NET Class</title><content type='html'>Alright, time to start a blog entry.  I'm trying to figure out in FluorineFx how to map &lt;code&gt;SharedObject.getRemote()&lt;/code&gt; so that calling it from a client grabs an instance of a specific class rather than just a generic object.  On the server this would mean a .NET class whilst on the client, I'd assume, would use &lt;code&gt;registerClassAlias()&lt;/code&gt; to indicate an ActionScript class.&lt;br /&gt;&lt;br /&gt;At this point I have no idea how, I'm just planting the seed.</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2008/01/map-getsharedobject-to-net-class.html' title='Map SharedObject.getRemote() to .NET Class'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=8618988570319720291' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/8618988570319720291'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/8618988570319720291'/><author><name>Neil C. Obremski</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-7939508771576618383</id><published>2008-01-26T11:13:00.000-08:00</published><updated>2008-01-26T15:00:13.974-08:00</updated><title type='text'>LCDS, fds.swc, [Managed]</title><content type='html'>Building a lot of FluorineFx samples from Adobe Flex Builder 2 yields the following error:&lt;blockquote&gt;configuration variable 'compiler.library-path' value contains unknown token 'LCDS'&lt;/blockquote&gt;The IDE is utterly unhelpful as to &lt;i&gt;where&lt;/i&gt; this is coming from (it says the error comes from line -1 if you view its properties), but you'll find it due to the following line in the &lt;tt&gt;.actionScriptProperties&lt;/tt&gt; file:&lt;blockquote&gt;&amp;lt;libraryPathEntry kind="3" path="${LCDS}\libs\fds.swc" linkType="1"/&amp;gt;&lt;/blockquote&gt;Within the GUI you'll find this entry listed under the project properties in the &lt;b&gt;Flex Build Path&lt;/b&gt; section under the &lt;b&gt;Library path&lt;/b&gt; tab.  Deleting it is the easiest solution, but then another error might surface:&lt;blockquote&gt;Interface IManaged was not found.&lt;/blockquote&gt;This is being caused by the &lt;code&gt;[Managed]&lt;/code&gt; class attribute which, again, you can safely delete.&lt;br /&gt;&lt;br /&gt;But what is &lt;code&gt;IManaged&lt;/code&gt;, why isn't &lt;tt&gt;LCDS&lt;/tt&gt; defined, and where the heck is &lt;tt&gt;fds.swc&lt;/tt&gt;?&lt;br /&gt;&lt;br /&gt;It turns out &lt;tt&gt;LCDS&lt;/tt&gt; stands for &lt;b&gt;L&lt;/b&gt;ive&lt;b&gt;C&lt;/b&gt;ycle &lt;b&gt;D&lt;/b&gt;ata &lt;b&gt;S&lt;/b&gt;ervices which it turns out is part of &lt;a href="http://en.wikipedia.org/wiki/Adobe_LiveCycle"&gt;some Adobe thing for Java&lt;/a&gt;.  This supercedes &lt;b&gt;F&lt;/b&gt;lex &lt;b&gt;D&lt;/b&gt;ata &lt;b&gt;S&lt;/b&gt;ervices which is where the filename &lt;tt&gt;fds.swc&lt;/tt&gt; comes from.  You'd need to install Adobe LiveCycle Data Services in order to have that compiler identifier as well as the &lt;tt&gt;fds.swc&lt;/tt&gt; file, but I don't know where to tell you to go, nor do I want to &lt;a href="http://diamondtearz.org/blog/2007/05/27/correctionaddendum-to-previous-post-where-to-find-the-fdsswc/"&gt;spend an hour finding out&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;- -&lt;br /&gt;&lt;br /&gt;Okay, I found &lt;a href="http://www.adobe.com/products/livecycle/dataservices/"&gt;Adobe LiveCycle Data Services ES&lt;/a&gt; which you can download for free (only 136 megabytes ... uh, yeah) if you register.  I must warn you that working through their web forms is an arduous task, especially if someone else used your email address in the past because they don't like registering to download crap anymore than you do.&lt;br /&gt;&lt;br /&gt;- -&lt;br /&gt;&lt;br /&gt;Dammit, nothing like hitting a dead end.  The &lt;tt&gt;fds.swc&lt;/tt&gt; from the above thing is &lt;a href="http://www.web-relevant.com/blogs/cfobjective/index.cfm?mode=entry&amp;entry=2F104680-BDB9-5320-EE238BCBDAD3E880"&gt;for ColdFusion 8&lt;/a&gt; and isn't compatible with Flex Builder.  The result is a broken SWF that throws weird exceptions like this:&lt;blockquote&gt;VerifyError: Error #1053: Illegal override of subtopic in mx.messaging.Consumer.&lt;br /&gt; at flash.display::MovieClip /nextFrame()&lt;br /&gt; at mx.managers::SystemManager /::deferredNextFrame()&lt;br /&gt; at mx.managers::SystemManager /::preloader_initProgressHandler()&lt;br /&gt; at flash.events::EventDispatcher /flash.events:EventDispatcher::dispatchEventFunction()&lt;br /&gt; at flash.events::EventDispatcher /dispatchEvent()&lt;br /&gt; at mx.preloaders::Preloader /::timerHandler()&lt;br /&gt; at flash.utils::Timer /flash.utils:Timer::_timerDispatch()&lt;br /&gt; at flash.utils::Timer /flash.utils:Timer::tick()&lt;/blockquote&gt;- -&lt;br /&gt;&lt;br /&gt;Ah ha!  I didn't have these: &lt;a href="http://www.adobe.com/go/kb402000"&gt;Hotfix 2&lt;/a&gt; and &lt;a href="http://www.adobe.com/go/kb402381"&gt;Hotfix 3&lt;/a&gt;.  After installing those and rebuilding the above error went away.&lt;br /&gt;&lt;br /&gt;Now if I could just figure out how to define the compiler symbol LCDS!</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2008/01/lcds-fdsswc-managed.html' title='LCDS, fds.swc, [Managed]'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=7939508771576618383' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/7939508771576618383'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/7939508771576618383'/><author><name>Neil C. Obremski</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-4973543240740554616</id><published>2008-01-24T16:42:00.001-08:00</published><updated>2008-01-24T17:14:00.831-08:00</updated><title type='text'>Flash Chat Example</title><content type='html'>Unfortunately, I couldn't easily find any decent place to &lt;i&gt;host&lt;/i&gt; FluorineFx for free (or indeed, &lt;i&gt;any&lt;/i&gt; ASP.NET &lt;b&gt;application&lt;/b&gt;) otherwise there'd be something here to simply click on and try.  As it is, you'll need to grab my source code and build it yourself.  Everything you need to do this is &lt;b&gt;freely available&lt;/b&gt;.&lt;br /&gt;&lt;h4&gt;Free Software Requirements&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;IIS&lt;/b&gt;: comes with Windows 2000, XP, Vista as long as you have Professional.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/express/vcsharp/Default.aspx"&gt;Visual C# Express 2008&lt;/a&gt; from Microsoft: Web Edition is &lt;i&gt;not required&lt;/i&gt; since you'll be running the ASP.NET code from IIS.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.adobe.com/products/flex/downloads/"&gt;Flex 2 SDK&lt;/a&gt; from Adobe: Comes with MXMLC command-line compiler.&lt;/li&gt;&lt;li&gt;My Examples' &lt;a href="http://oxampleski.googlecode.com/svn/trunk/FluorineFx/"&gt;Source Code&lt;/a&gt;: the FluorineFx DLL's are provided under the &lt;tt&gt;Bin&lt;/tt&gt; directory.&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Installation&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;Create an IIS Virtual Directory on your localhost called &lt;tt&gt;FluorineFx&lt;/tt&gt; and point it to the base folder of my examples, wherever you put them on your machine.&lt;/li&gt;&lt;li&gt;Build &lt;tt&gt;Chat.swf&lt;/tt&gt; from &lt;tt&gt;Chat.mxml&lt;/tt&gt; with MXMLC and/or &lt;a href="http://code.google.com/p/obremsdk/"&gt;Obrunski&lt;/a&gt;.  This is as simple as bringing up a command prompt and typing &lt;tt&gt;mxmlc Chat.mxml&lt;/tt&gt;; assuming you have the Flex SDK's &lt;tt&gt;Bin&lt;/tt&gt; directory on your PATH.&lt;/li&gt;&lt;li&gt;Build &lt;tt&gt;Chat.dll&lt;/tt&gt; from &lt;tt&gt;Chat.csproj&lt;/tt&gt; with Visual C#.  It'll probably ask you to create a solution file called &lt;tt&gt;Chat.sln&lt;/tt&gt;, just drop it in the same directory.  The output is already set to go into the main &lt;tt&gt;Bin&lt;/tt&gt; directory where the other assemblies already are.&lt;/li&gt;&lt;li&gt;If you don't want/need to run &lt;tt&gt;Chat.swf&lt;/tt&gt; directly (e.g. not embed from web page on localhost) then you're done.  Otherwise create a plain text file called &lt;tt&gt;FluorineFx.cfg&lt;/tt&gt;, put one line in it that is the full path to the SWF's base directory, and then copy that to &lt;tt&gt;C:\Documents and Settings\&lt;i&gt;user.name&lt;/i&gt;\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust\&lt;/tt&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;h4&gt;Running&lt;/h4&gt;Visit &lt;a href="http://localhost/FluorineFx/Chat.aspx"&gt;http://localhost/FluorineFx/Chat.aspx&lt;/a&gt; and you should get a nice big gray screen with a login prompt entitled "Connect".  Go ahead and type anything in, I bet you'll see this:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://www.neilstuff.com/arch/2008-01/flourinefx-chat-authfail.gif" width="299" height="166" alt="Authentication failed: Requested access is not allowed" /&gt;&lt;/center&gt;&lt;br /&gt;Don't be frightened, this is just due to the fact that this example doesn't have any real way to authenticate users so what it does is create a new one if it doesn't recognize what you typed in.  So you might see this error more of a "Successfully created user" response.  Click "OK", retype the password, and then click "Connect" again and &lt;i&gt;voila&lt;/i&gt; (hopefully).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Problems and Solutions&lt;/h4&gt;You have a real problem if you see this:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://www.neilstuff.com/arch/2008-01/flourinefx-chat-sendfail.gif" width="299" height="166" alt="Authentication failed: Send failed" /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;This means that the FluorineFx service is not running in IIS and therefore not taking connections or receiving data.  Take a look at the &lt;tt&gt;log\fluorine.log&lt;/tt&gt; for clues and/or check the system event log.  A couple common issues are:&lt;ul&gt;&lt;li&gt;Port 1939 is already in use.  Change this in the &lt;code&gt;services-config/channels/channel-definition/endpoint&lt;/code&gt; node of &lt;tt&gt;WEB-INF/flex/services-config.xml&lt;/tt&gt;.&lt;/li&gt;&lt;li&gt;You launched &lt;tt&gt;Chat.swf&lt;/tt&gt; directly rather than from IIS.  The web page must be loaded at least once to start the FluorineFx service within IIS, otherwise there's nothing to connect to!&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Credit&lt;/h4&gt;The Chat example is a slightly modified version of the one that comes with &lt;a href="http://www.fluorinefx.com/download/fluorinefx/1.0.0.5/fluorinefx.exe"&gt;FluorineFx 1.0.0.5&lt;/a&gt; and all credit should be deferred to its creators.  I'm just trying to get a good grasp on this stuff!</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2008/01/flash-chat-example.html' title='Flash Chat Example'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=4973543240740554616' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/4973543240740554616'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/4973543240740554616'/><author><name>Neil C. Obremski</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-1464363950385348845</id><published>2008-01-05T13:02:00.000-08:00</published><updated>2008-01-24T16:27:17.048-08:00</updated><title type='text'>Security Sandbox Violation w/ localhost Connections</title><content type='html'>If you've ever developed a SWF locally which is only trying to access localhost, you've probably been frustrated by the sandbox violation errors that come up.  I wondered how the Flex Builder IDE was able to run SWF's and have them create sockets to localhost without getting the same errors.  I created a small test called &lt;tt&gt;SocketSandboxError.as&lt;/tt&gt; that simply tries to make a socket connection to localhost and I launched it using Flash Player 9.&lt;div class="code"&gt;&lt;h3&gt;SocketSandboxError.as&lt;/h3&gt;&lt;pre&gt;&lt;span class="TPkeyword5"&gt;package &lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="TPkeyword5"&gt;import &lt;/span&gt;flash.&lt;span class="TPkeyword5"&gt;display&lt;/span&gt;.&lt;span class="TPkeyword6"&gt;Sprite&lt;/span&gt;;&lt;br /&gt;    &lt;span class="TPkeyword5"&gt;import &lt;/span&gt;flash.&lt;span class="TPkeyword5"&gt;net&lt;/span&gt;.&lt;span class="TPkeyword6"&gt;Socket&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="TPkeyword1"&gt;public &lt;/span&gt;&lt;span class="TPkeyword5"&gt;class &lt;/span&gt;SocketSandboxError &lt;span class="TPkeyword5"&gt;extends &lt;/span&gt;&lt;span class="TPkeyword6"&gt;Sprite&lt;/span&gt;&lt;br /&gt;    &lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class="TPkeyword1"&gt;private &lt;/span&gt;&lt;span class="TPkeyword5"&gt;var &lt;/span&gt;_connection:&lt;span class="TPkeyword6"&gt;Socket&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;span class="TPkeyword1"&gt;public &lt;/span&gt;&lt;span class="TPkeyword5"&gt;function &lt;/span&gt;SocketSandboxError&lt;span class="TPbracket"&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;            _connection &lt;span class="TPoperator"&gt;= &lt;/span&gt;&lt;span class="TPkeyword5"&gt;new &lt;/span&gt;&lt;span class="TPkeyword6"&gt;Socket&lt;/span&gt;&lt;span class="TPbracket"&gt;()&lt;/span&gt;;&lt;br /&gt;            _connection.&lt;span class="TPkeyword4"&gt;connect&lt;/span&gt;&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPstring"&gt;"localhost"&lt;/span&gt;, &lt;span class="TPnumber"&gt;8080&lt;/span&gt;&lt;span class="TPbracket"&gt;)&lt;/span&gt;;&lt;br /&gt;        &lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Predictably the first result is the sandbox error you know and love:&lt;blockquote&gt;Error #2044: Unhandled SecurityErrorEvent:. text=Error #2048: Security sandbox violation: file:///C|/Stuff/FlashTest/src/SocketSandboxError.swf cannot load data from localhost:8080.&lt;br /&gt; at SocketSandboxError$iinit()&lt;/blockquote&gt;I then used FileMon to see what files were being touched and found &lt;tt&gt;C:\Documents and Settings\&lt;i&gt;username&lt;/i&gt;\Application Data\Flash Player\#Security\FlashPlayerTrust\flexbuilder.cfg&lt;/tt&gt;.  Here you can add directories or specific SWF's that basically get full trust and can access network resources and such; obviously something you only want to utilize while developing locally.  I added the directory containing &lt;tt&gt;SocketSandboxError.as&lt;/tt&gt;: &lt;tt&gt;C:\Stuff\FlashTest\src&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;After making this change and re-running the application I got this different error:&lt;blockquote&gt;Error #2044: Unhandled IOErrorEvent:. text=Error #2031: Socket Error.&lt;br /&gt; at SocketSandboxError$iinit()&lt;/blockquote&gt;Success!  This means Flash is actually trying to make the connection, but unless you have something listening on that port (8080 in this example, which I don't) this error will occur.&lt;br /&gt;&lt;br /&gt;References:&lt;ul&gt;&lt;li&gt;&lt;a href="http://livedocs.adobe.com/flex/2/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00001373.html"&gt;FlashPlayerTrust&lt;/a&gt; (Flex 2 Docs)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update @ 24 JAN 2008&lt;/b&gt;: Any file you put in the &lt;tt&gt;C:\Documents and Settings\&lt;i&gt;user.name&lt;/i&gt;\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust\&lt;/tt&gt; folder seems to be parsed.  I'm planning on using this fact as a "debug" feature of &lt;a href="http://code.google.com/p/obremsdk/"&gt;Obrunski&lt;/a&gt;, e.g. before launching the SWF it will create/overwrite &lt;tt&gt;obrunski.cfg&lt;/tt&gt; with the current SWF's full path as the only entry.</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2008/01/security-sandbox-violation-w-localhost.html' title='Security Sandbox Violation w/ localhost Connections'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=1464363950385348845' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/1464363950385348845'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/1464363950385348845'/><author><name>Neil C. Obremski</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-5858631945640068252</id><published>2007-11-01T16:14:00.000-07:00</published><updated>2007-11-01T17:06:09.255-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rtmp'/><title type='text'>RTMP SharedObject's for Free</title><content type='html'>RTMP, which stands for Real-Time Messaging Protocol, can be used in place of custom socket servers and HTTP to keep a bunch of clients synchronized via a single server. Each client maintains a constant connection to the RTMP server which then doles out synchronization as changes are reported by said clients. Flash 9 and ActionScript 3 have a lot of RTMP support built into the &lt;a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/NetConnection.html"&gt;NetConnection&lt;/a&gt; and &lt;a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/SharedObject.html"&gt;SharedObject&lt;/a&gt; classes which make it relatively simple to use ... assuming you have an RTMP server.&lt;br /&gt;&lt;br /&gt;At the time of writing this &lt;a href="http://www.wikipedia.org/"&gt;Wikipedia&lt;/a&gt; still seems to stay that you need to buy commercial, closed source software such as Adobe Flash Media Server in order to facilitate RTMP clients. Well actually there are other implementations available and one of those I'm going to show you today is &lt;a href="http://fluorinefx.com/"&gt;FluorineFx&lt;/a&gt; made by &lt;a href="http://thesilentgroup.com/"&gt;The Silent Group&lt;/a&gt;. It's free and works pretty good even at its current pre-release stage.&lt;br /&gt;&lt;br /&gt;Unfortunately the documentation and samples are not quite up to snuff: they assume you already know about RTMP/SharedObject/NetConnection stuff, which I don't, and consequently it took me a while to figure it all out. Rather than letting you slog through the same muck, I'm going to step you through an example RTMP application where a server keeps a bunch of clients up to date, I called it SharedObjectTracer because all it really does is share a tiny bit of data between clients and trace out all the synchronization events as they happen.&lt;br /&gt;&lt;br /&gt;Requirements for FluorineFx and the SharedObjectTracer example (things I'm not going to explain): You're competent with ASP.NET 2.x and IIS (Microsoft's Web Server) and you know how to build ActionScript 3 (*.AS) files into SWF's which you know how to run.&lt;br /&gt;&lt;br /&gt;With that out of the way, use the following steps to get the example installed:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://fluorinefx.com/download.html"&gt;Download FluorineFx&lt;/a&gt; and install it. This is actually somewhat difficult to find, &lt;a href="http://fluorinefx.com/download/fluorinefx/1.0.0.1/fluorinefx.exe"&gt;here's 1.0.0.1&lt;/a&gt;. &lt;em&gt;Or &lt;/em&gt;here's &lt;a href="http://www.flashsecrets.com/fluorinefx-1.0.0.1-dlls.zip"&gt;just the DLL's&lt;/a&gt; you'll need if that's all you want, or if the install crashes for you like it did for me.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.flashsecrets.com/SharedObjectTracer.zip"&gt;Download SharedObjectTracer.zip&lt;/a&gt;, uncompress it somewhere on your machine, and then put &lt;code&gt;FluorineFx.dll&lt;/code&gt;, &lt;code&gt;ICSharpCode.SharpZipLib.dll&lt;/code&gt;, and &lt;code&gt;log4net.dll&lt;/code&gt; assemblies into its &lt;strong&gt;.\bin\&lt;/strong&gt; directory.&lt;/li&gt;&lt;li&gt;Create a new Virtual Directory in IIS on localhost called SharedObjectTracer and point it to the folder where you unzipped everything; it should contain a &lt;code&gt;default.aspx&lt;/code&gt; file. If you're using IIS 6 (e.g. not on Windows XP), make sure to mark it as an application.&lt;/li&gt;&lt;/ol&gt;Now when you visit &lt;a href="http://localhost/SharedObjectTracer/"&gt;http://localhost/SharedObjectTracer/&lt;/a&gt; you should get a message that says something like the text below (rather than a nasty ASP.NET exception):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;RTMP Server should be started now. Try telnet'ing to port 11935 on your machine to make sure it's receiving connections. You can use DebugView to view traces made by FluorineFx.&lt;/blockquote&gt;Do what it says and run telnet against port 11935 just to make sure it's listening. If you're feeling even more savvy, crank open DebugView, restart IIS, and revisit the page to watch FluorineFx start up.&lt;br /&gt;&lt;br /&gt;Once you're fairly sure it's running you can compile SharedObjectTracer.as into a SWF and start it up.  The only display it has is a TextField which fills the entire stage and shows all the traces being made by this little application.  By running only one instance of this example, you'll only ever see one instance being mentioned in all the traces, so I suggest you start up a couple more and just watch for a minute or two.&lt;br /&gt;&lt;br /&gt;See what it's doing?&lt;br /&gt;&lt;br /&gt;Each application gives itself a random number (0 - 100), prefixes that with "Object_", and then creates a timestamp property on the SharedObject using that name string.  Every 7.5 seconds or so, it updates this timestamp on the SharedObject and all the connected clients receive a "change" event on that property.  The client that initiated the change gets a "success" (assuming it was), or a "reject" if something went wrong; &lt;a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/events/SyncEvent.html"&gt;see SyncEvent&lt;/a&gt; for details on the synchronization event information.&lt;br /&gt;&lt;br /&gt;Check out the comments in the ActionScript 3 code for more on how this little example works on the Flash side.  It should be noted that the way it's written, it could probably work for any RTMP server, I just happen to be using the FluorineFx RTMP server in this case.&lt;br /&gt;&lt;br /&gt;If you're wondering where the FluorineFx RTMP server is, it's in IIS now because you loaded the web page.  See it is implemented as an HTTP Handler that is registered in the &lt;strong&gt;web.config&lt;/strong&gt; file.  When you hit the web page, it loads FluorineFx which then launches its RTMP server and sticks around as long as IIS is running and doesn't get reset.  Flash is almost always embedded into pages served up by the web server, so by doing it this way your website will not only provide the client as a Flash app, but the request will start the RTMP server anytime it's needed as well!&lt;br /&gt;&lt;br /&gt;The port I use for the example, 11935, is the standard RTMP port (1935) prefixed with an extra 1 to not get in the way of anything.  On the server side, the port is configured in the .\WEB-INF\flex\services-config.xml file.  On the client in ActionScript, the port is specified in the call to NetConnection's connect() method.</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2007/11/rtmp-sharedobjects-for-free.html' title='RTMP SharedObject&apos;s for Free'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=5858631945640068252' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/5858631945640068252'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/5858631945640068252'/><author><name>Neil C. Obremski</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-1262828162831568855</id><published>2007-10-31T09:50:00.000-07:00</published><updated>2007-10-31T11:19:42.757-07:00</updated><title type='text'>Sharing ActionScript Classes</title><content type='html'>&lt;div&gt;By default when you compile ActionScript, any classes you attempt to use will automically be looked for in the current directory; you don't need to use &lt;span style="font-family:courier new;"&gt;import&lt;/span&gt;. For example, if you create &lt;span style="font-family:courier new;"&gt;ShareSingle.as&lt;/span&gt; which attempts to use a &lt;span style="font-family:courier new;"&gt;Circle&lt;/span&gt; class, the Flex compiler will look in the same folder for &lt;span style="font-family:courier new;"&gt;Circle.as&lt;/span&gt;. For developing isolated components or projects this typically works out just fine.&lt;br /&gt;&lt;br /&gt;You can also share source code from a common directory between projects by adding it to the &lt;span style="font-family:courier new;"&gt;flex-config.xml&lt;/span&gt; file under the &amp;lt;&lt;span style="font-family:courier new;"&gt;source-path&amp;gt;&lt;/span&gt; node as a &lt;strong&gt;&amp;lt;&lt;span style="font-family:courier new;"&gt;path-element&amp;gt;&lt;/span&gt;&lt;/strong&gt; entry. This file is located under the &lt;strong&gt;frameworks&lt;/strong&gt; sub-directory of the Flex 2 SDK on your computer; for example if you're using Flex Builder it will probably be in &lt;span style="font-family:courier new;"&gt;C:\Program Files\Adobe\Flex Builder 2\Flex SDK 2\frameworks\&lt;/span&gt;. Any folder path you put in that configuration file will add it to the search list. Thus when you build an ActionScript file, the compiler will look in the currrent directory and then any directories you listed there in order to find other classes.&lt;br /&gt;&lt;br /&gt;It's also fairly easy to create a package hierachy so you can specify what you want to include via &lt;span style="font-family:courier new;"&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/span&gt; statements. This also breaks your source files up into multiple directories if you're into that kind of thing. In order for this to work you'll first need to specify a &lt;strong&gt;&lt;span style="font-family:courier new;"&gt;package&lt;/span&gt;&lt;/strong&gt; name at the top of your code rather than leaving it blank. Next create folders whose names match the ones in your package string, with periods representing separators for sub-folders. For example, the source for this:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;h3&gt;Circle.as&lt;/h3&gt;&lt;pre&gt;&lt;span class="TPkeyword5"&gt;package &lt;/span&gt;as3.shapes&lt;br /&gt;&lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="TPkeyword5"&gt;import &lt;/span&gt;flash.&lt;span class="TPkeyword5"&gt;display&lt;/span&gt;.&lt;span class="TPkeyword6"&gt;Sprite&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span class="TPkeyword1"&gt;public &lt;/span&gt;&lt;span class="TPkeyword5"&gt;class &lt;/span&gt;Circle &lt;span class="TPkeyword5"&gt;extends &lt;/span&gt;&lt;span class="TPkeyword6"&gt;Sprite&lt;/span&gt;&lt;br /&gt;    &lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class="TPkeyword1"&gt;public &lt;/span&gt;&lt;span class="TPkeyword5"&gt;function &lt;/span&gt;Circle&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPkeyword5"&gt;x&lt;/span&gt;:&lt;span class="TPkeyword6"&gt;Number&lt;/span&gt;,&lt;br /&gt;            &lt;span class="TPkeyword5"&gt;y&lt;/span&gt;:&lt;span class="TPkeyword6"&gt;Number&lt;/span&gt;, &lt;span class="TPkeyword5"&gt;radius&lt;/span&gt;:&lt;span class="TPkeyword6"&gt;Number&lt;/span&gt;,&lt;br /&gt;            color:&lt;span class="TPkeyword6"&gt;int&lt;/span&gt;&lt;span class="TPbracket"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class="TPkeyword5"&gt;graphics&lt;/span&gt;.&lt;span class="TPkeyword4"&gt;beginFill&lt;/span&gt;&lt;span class="TPbracket"&gt;(&lt;/span&gt;color&lt;span class="TPbracket"&gt;)&lt;/span&gt;;&lt;br /&gt;            &lt;span class="TPkeyword5"&gt;graphics&lt;/span&gt;.&lt;span class="TPkeyword4"&gt;drawCircle&lt;/span&gt;&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPkeyword5"&gt;x&lt;/span&gt;, &lt;span class="TPkeyword5"&gt;y&lt;/span&gt;, &lt;span class="TPkeyword5"&gt;radius&lt;/span&gt;&lt;span class="TPbracket"&gt;)&lt;/span&gt;;&lt;br /&gt;            &lt;span class="TPkeyword5"&gt;graphics&lt;/span&gt;.&lt;span class="TPkeyword4"&gt;endFill&lt;/span&gt;&lt;span class="TPbracket"&gt;()&lt;/span&gt;;&lt;br /&gt;        &lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Would be placed in a hierachy like this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flashsecrets.com/uploaded_images/as3-package-dirs-746372.gif"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt=".\as3\shapes\Circle.as" src="http://www.flashsecrets.com/uploaded_images/as3-package-dirs-746366.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;When you're ready to use classes from this kind of source-based package (e.g. not in a JAR/ZIP), you'll use an import statement in your project &lt;em&gt;and&lt;/em&gt; make sure you have the base directory (&lt;span style="font-family:courier new;"&gt;C:\Stuff\ObremSDK&lt;/span&gt; in the above example) specified as a &lt;span style="font-family:courier new;"&gt;&amp;lt;path-element&amp;gt;&lt;/span&gt; in &lt;span style="font-family:courier new;"&gt;flex-config.xml&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;&lt;h3&gt;Test.as&lt;/h3&gt;&lt;pre&gt;&lt;span class="TPkeyword5"&gt;package&lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="TPkeyword5"&gt;import &lt;/span&gt;flash.&lt;span class="TPkeyword5"&gt;display&lt;/span&gt;.&lt;span class="TPkeyword6"&gt;Sprite&lt;/span&gt;;&lt;br /&gt;    &lt;span class="TPkeyword5"&gt;import &lt;/span&gt;as3.shapes.Circle;&lt;br /&gt;    &lt;span class="TPkeyword1"&gt;public &lt;/span&gt;&lt;span class="TPkeyword5"&gt;class &lt;/span&gt;Test &lt;span class="TPkeyword5"&gt;extends &lt;/span&gt;&lt;span class="TPkeyword6"&gt;Sprite&lt;/span&gt;&lt;br /&gt;    &lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class="TPkeyword1"&gt;public &lt;/span&gt;&lt;span class="TPkeyword5"&gt;function &lt;/span&gt;Test&lt;span class="TPbracket"&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class="TPkeyword4"&gt;addChild&lt;/span&gt;&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPkeyword5"&gt;new &lt;/span&gt;Circle&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPnumber"&gt;25&lt;/span&gt;,&lt;br /&gt;                &lt;span class="TPnumber"&gt;25&lt;/span&gt;, &lt;span class="TPnumber"&gt;10&lt;/span&gt;, &lt;span class="TPnumber"&gt;0xFF0000&lt;/span&gt;&lt;span class="TPbracket"&gt;))&lt;/span&gt;;&lt;br /&gt;        &lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Lastly, I want to mention an oddity with the Flex (MXML) compiler when it comes to errors for classes it could not find. If you call &lt;span style="font-family:courier new;"&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/span&gt; on a package it cannot find, this gets reported &lt;em&gt;last&lt;/em&gt;; after any "Type was not found" errors. I'm guessing they assume people are going to be reading failures from the bottom up, but I'd just like to throw this warning out there for those like me who are used to reading top-down.&lt;/div&gt;</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2007/10/sharing-actionscript-classes.html' title='Sharing ActionScript Classes'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=1262828162831568855' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/1262828162831568855'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/1262828162831568855'/><author><name>Neil C. Obremski</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-2065157103446346632</id><published>2007-10-26T15:50:00.001-07:00</published><updated>2007-10-26T16:29:50.439-07:00</updated><title type='text'>Flash 8 IDE with Flash 9 Player</title><content type='html'>&lt;a href="http://www.flashsecrets.com/uploaded_images/flash8professional-735707.png"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://www.flashsecrets.com/uploaded_images/flash8professional-735700.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;I have Macromedia Flash 8 Professional installed and sometimes I use it to create assets (pictures, sounds, videos, etc.) for embedding in my ActionScript classes. Programming-wise this all works great, but if you install Flash 8 on a machine &lt;em&gt;after&lt;/em&gt; the Flex 2 SDK, then you'll notice viewing SWF's will launch the stand-alone Flash 8 Player.&lt;br /&gt;&lt;br /&gt;There's a couple of things you can do to remedy this, but &lt;strong&gt;first uninstall the Flash 8 &lt;em&gt;Player&lt;/em&gt;&lt;/strong&gt; using the Add/Remove Programs control panel applet. Don't uninstall Flash 8 itself unless you decide you didn't want that old crusty IDE from Macrowhatever and you can stop reading now. Strangely enough removing the version 8 player from that list will not stop your SWF's from using it when you double-click them or launch them from a command-line; at least that was what happened in my case.&lt;br /&gt;&lt;br /&gt;So the &lt;strong&gt;second step is to run the Flash 9 Player&lt;/strong&gt; and open a SWF, any SWF. By doing this you'll cause it to associate that file extension to it and further attempts to open a SWF will use that version of the player. I actually did try the "Open With ..." option off the right-click context menu on a SWF, but Windows refused me to do anything when I selected the executable. Very strange.&lt;br /&gt;&lt;br /&gt;As an &lt;strong&gt;alternative second step, download the latest&lt;/strong&gt; player &lt;a href="http://www.adobe.com/support/flashplayer/downloads.html"&gt;from Adobe&lt;/a&gt; which they call "Flash Player 9 Projector content debugger". Their installer will link up the file extension stuff for you and perhaps you needed a newer version anyway (&lt;span style="font-family:courier new;"&gt;ObjectEncoding.AM3&lt;/span&gt; ... &lt;em&gt;ahem&lt;/em&gt;).&lt;/div&gt;</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2007/10/flash-8-ide-with-flash-9-player.html' title='Flash 8 IDE with Flash 9 Player'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=2065157103446346632' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/2065157103446346632'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/2065157103446346632'/><author><name>Neil C. Obremski</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-3185360557300677064</id><published>2007-10-26T12:50:00.000-07:00</published><updated>2007-10-26T13:51:47.892-07:00</updated><title type='text'>Hello FlashSecrets, I R Neil</title><content type='html'>&lt;a href="http://www.flashsecrets.com/uploaded_images/BlueScreenNeil-728810.png"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://www.flashsecrets.com/uploaded_images/BlueScreenNeil-728806.png" border="1" /&gt;&lt;/a&gt;Howdy everybody! My name is &lt;a href="http://www.neilstuff.com/"&gt;Neil&lt;/a&gt; and I've just been promoted to an author of this site &lt;em&gt;and&lt;/em&gt; I'm in the process of learning Flash/Flex/ActionScript myself ... from scratch. Hopefully I can bring a fresh collection of articles and tutorials to FlashSecrets to help any other developers struggling with Adobe's platform.&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;My experiences will mostly revolve around the use of the &lt;a href="http://www.adobe.com/products/flex/downloads/"&gt;&lt;em&gt;free&lt;/em&gt; Flex 2 SDK&lt;/a&gt; (see also: &lt;a href="http://www.ehow.com/how_2059000_write-flash-free.html"&gt;How to Write Flash 9 For Free&lt;/a&gt;) rather than Flex Builder 2 (Eclipse IDE) or the Flash IDE, though I do have both installed. Also, my current learning path is leading me into Flash's reflection, a term I am borrowing my from &lt;a href="http://msdn2.microsoft.com/en-us/library/cxz4wk15.aspx"&gt;.NET&lt;/a&gt; exprience (e.g. dynamic type discovery and manipulation), and the Real-Time Messaging Protocol. Contrary to what Wikipedia currently &lt;a href="http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol"&gt;says about RTMP&lt;/a&gt;, you &lt;em&gt;can&lt;/em&gt; do it not only without expensive commercial server software: you can &lt;a href="http://fluorinefx.com/"&gt;do it for &lt;em&gt;free&lt;/em&gt;&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;If there's anything particular you'd like me to write about, please comment here or send an email to &lt;a href="mailto:weenie@gmail.com"&gt;weenie@gmail.com&lt;/a&gt;. Until then, I look forward to [hopefully] providing a valuable reference for budding developers and grizzled engineers alike.&lt;/div&gt;</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2007/10/hello-flashsecrets-i-r-neil.html' title='Hello FlashSecrets, I R Neil'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=3185360557300677064' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/3185360557300677064'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/3185360557300677064'/><author><name>Neil C. Obremski</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-2421769278289538113</id><published>2007-03-22T09:19:00.000-07:00</published><updated>2007-03-22T11:00:20.569-07:00</updated><title type='text'>NetConnection onStatus not called</title><content type='html'>&lt;p&gt;You ever have one of those problems where you spend so much time trying to figure it out that you feel mentally and physically exhausted by the end? And when you figure it out, not only is it a huge relief but it was something so simple that you just want to punch yourself for not figuring it out sooner?&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I was starting a new project using Flash Media Server 2 and Flash 8. I started with a little boiler plate code: NetConnection.onStatus handler on the client then establishing a connection with NetConnection.connect. The server had your basic application.onConnect / application.onDisconnect set of handlers in main.asc.&lt;/p&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;h3&gt;Server code: main.asc&lt;/h3&gt;&lt;pre&gt;application.onAppStart &lt;span class="TPoperator"&gt;= &lt;/span&gt;function&lt;span class="TPbracket"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    trace&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPstring"&gt;"onAppStart"&lt;/span&gt;&lt;span class="TPbracket"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;application.onConnect &lt;span class="TPoperator"&gt;= &lt;/span&gt;function&lt;span class="TPbracket"&gt;(&lt;/span&gt;client&lt;span class="TPbracket"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    trace&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPstring"&gt;"onConnect&amp;gt; " &lt;/span&gt;&lt;span class="TPoperator"&gt;+ &lt;/span&gt;client.ip&lt;span class="TPbracket"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;application.onDisconnect &lt;span class="TPoperator"&gt;= &lt;/span&gt;function&lt;span class="TPbracket"&gt;(&lt;/span&gt;client&lt;span class="TPbracket"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    trace&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPstring"&gt;"onDisconnect&amp;gt; " &lt;/span&gt;&lt;span class="TPoperator"&gt;+ &lt;/span&gt;client.ip&lt;span class="TPbracket"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="code"&gt;&lt;h3&gt;Client code&lt;/h3&gt;&lt;pre&gt;var nc:NetConnection &lt;span class="TPoperator"&gt;= &lt;/span&gt;&lt;span class="TPkeyword1"&gt;new &lt;/span&gt;NetConnection&lt;span class="TPbracket"&gt;()&lt;/span&gt;;&lt;br /&gt;nc.onStatus &lt;span class="TPoperator"&gt;= &lt;/span&gt;function&lt;span class="TPbracket"&gt;(&lt;/span&gt;info&lt;span class="TPbracket"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="TPkeyword1"&gt;for &lt;/span&gt;&lt;span class="TPbracket"&gt;(&lt;/span&gt;var i in info&lt;span class="TPbracket"&gt;)&lt;/span&gt;&lt;br /&gt;        trace&lt;span class="TPbracket"&gt;(&lt;/span&gt;i &lt;span class="TPoperator"&gt;+ &lt;/span&gt;&lt;span class="TPstring"&gt;":" &lt;/span&gt;&lt;span class="TPoperator"&gt;+ &lt;/span&gt;info&lt;span class="TPbracket"&gt;[&lt;/span&gt;i&lt;span class="TPbracket"&gt;])&lt;/span&gt;;&lt;br /&gt;        &lt;br /&gt;&lt;span class="TPbracket"&gt;}&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;var result &lt;span class="TPoperator"&gt;= &lt;/span&gt;nc.connect&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPstring"&gt;"rtmp:/consonation"&lt;/span&gt;&lt;span class="TPbracket"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Standard stuff, right? Well, my client side onStatus was not being called. The typical answer you find to this problem is that the onStatus handler is being defined &lt;em&gt;after&lt;/em&gt; your call to NetConnection::connect() but that's not the case here. I even tried coding this up in Flex 2 to double check it. Nothing worked.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I could see my trace code on the server being called when the application connected and disconnected.  I &lt;em&gt;knew&lt;/em&gt; I was making a successful connection. This is what was throwing me off.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Know what the answser was?  I was so irritated that I missed this.  You need to &lt;em&gt;&lt;strong&gt;explicitly&lt;/strong&gt;&lt;/em&gt; call application.acceptConnection(client); in your onConnect handler and I wasn't. Too bad there isn't a separate onStatus callback for successful socket connection and connection accepted. This would have made it obvious.&lt;/p&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;h3&gt;Fixed server code: main.asc&lt;/h3&gt;&lt;p class="TPtext"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;application.onAppStart &lt;span class="TPoperator"&gt;= &lt;/span&gt;function&lt;span class="TPbracket"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    trace&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPstring"&gt;"onAppStart"&lt;/span&gt;&lt;span class="TPbracket"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;application.onConnect &lt;span class="TPoperator"&gt;= &lt;/span&gt;function&lt;span class="TPbracket"&gt;(&lt;/span&gt;client&lt;span class="TPbracket"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    trace&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPstring"&gt;"onConnect&amp;gt; " &lt;/span&gt;&lt;span class="TPoperator"&gt;+ &lt;/span&gt;client.ip&lt;span class="TPbracket"&gt;)&lt;/span&gt;;&lt;br /&gt;    application.acceptConnection&lt;span class="TPbracket"&gt;(&lt;/span&gt;client&lt;span class="TPbracket"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;application.onDisconnect &lt;span class="TPoperator"&gt;= &lt;/span&gt;function&lt;span class="TPbracket"&gt;(&lt;/span&gt;client&lt;span class="TPbracket"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="TPbracket"&gt;{&lt;/span&gt;&lt;br /&gt;    trace&lt;span class="TPbracket"&gt;(&lt;/span&gt;&lt;span class="TPstring"&gt;"onDisconnect&amp;gt; " &lt;/span&gt;&lt;span class="TPoperator"&gt;+ &lt;/span&gt;client.ip&lt;span class="TPbracket"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;span class="TPbracket"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2007/03/netconnection-onstatus-not-called.html' title='NetConnection onStatus not called'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/2421769278289538113'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/2421769278289538113'/><author><name>Tricky</name><uri>http://www.blogger.com/profile/02161236646035432535</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-115081263159414444</id><published>2006-06-20T06:15:00.000-07:00</published><updated>2006-06-22T11:02:02.386-07:00</updated><title type='text'>FlashDevelop.org: Flash Development IDE for Coders</title><content type='html'>&lt;p&gt;I've been working on an article on the basics of a development workflow using &lt;a href="http://mtasc.org"&gt;MTASC &lt;/a&gt;(MotionTwin Actionscript Compiler) and bumped into a very impressive IDE for Flash called &lt;a href="http://flashdevelop.org"&gt;FlashDevelop&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Wow! Guys, this is a very impressive piece of work. As of this writing it is in RC2 and is very stable so far in my testing.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;In the past I've tried using &lt;a href="http://sapien.com/"&gt;PrimalScript&lt;/a&gt; but found it too clunky. Everyone raves about it but I just don't see any benefit to using PrimalScript other than the so-so code completion and at several hundred dollars I could never justify it.&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;Everyone raves about it but I just don't see any benefit to using PrimalScript other than the so-so code completion ...&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Well, if you are a big fan of code completion then you really need to take a look at &lt;a href="http://flashdevelop.org"&gt;FlashDevelop&lt;/a&gt;. It's code completion works quickly and much better than PrimalScript. The features don't stop there!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;MTASC comes with the installation so there is no need to go grab the binaries separately. This really makes it easy to get up and running quickly.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Features that most developers have come to expect from any IDE are there. Syntax highlighting, multiple tabbed document editing and a project panel for managing all of your code and assets are there. What's great is that it is very targeted to the needs of Actionscript development.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;For instance, you can add a SWF to the library class path just by right-clicking it and choosing Add to Library. At that point you can reference symbols in the SWF as they will be included by MTASC during compilation.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The Actionscript tab is pretty cool. This tab gives you an outline view of your code so you can quickly locate methods and properties of your classes.&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;Another big bonus is that you can define regions of code (like Visual Studio) and collapse code based on region.&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;FlashDevelop also has code folding / collapsing which is so handy. Thanks for including this! Another big bonus is that you can define regions of code (like Visual Studio) and collapse code based on region. If you haven't used a feature like this before, once you try it you will be hooked. It makes it much easier to read through your code when you can collapse areas that your aren't interested in viewing.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Capturing trace output is critical for debugging in Flash. The Flash debugger is all but worthless so this is really your only option. Well, FlashDevelop has several options for capturing trace output. By default it uses something called FlashOut. I've never heard of this until using FlashDevelop but it is incredibly useful. Essentially FlashOut routes your traces through to FlashDevelop via a call to fscommand. FlashDevelop displays your trace output in the output panel at the bottom while your movie is running.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Another option is to use FlashConnect. You can choose this in your project properties on the Compiler Options tab. FlashConnect does its work differently than FlashOut. FlashConnect sends trace output through an XMLSocket that FlashDevelop listens on. One advantage of FlashConnect is that you can send your trace output anywhere, even across the Internet if necessary. Another advantage is that you can categorize your output as INFO, DEBUG, WARNING, ERROR or FATAL. If FlashDevelop is collecting the output, it will colorize the trace information based on how it is categorized. Very cool.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The only issues I have with FlashDevelop at this point is that it doesn't support a couple of keyboard shortcuts I use all the time. For instance I use CTRL-F4 to close a tabbed window all the time. It's pretty standard for apps that support tabs or embedded documents. I also don't see how I can customize the keyboard shortcuts. Granted, I'm thrilled that they have chosen many shortcuts I already use from Visual Studio (F7: build, F5: run etc) there are a couple I'd like to change to be more consistent with other tools I use.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Another shortcut I'd really like to have: F4 to cycle through build errors. In Visual Studio if you have a build error, you can press F4 to jump to the line of code for the first error. Press F4 again to jump to the next error. I hope they add this.&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2006/06/flashdeveloporg-flash-development-ide.html' title='FlashDevelop.org: Flash Development IDE for Coders'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=115081263159414444' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/115081263159414444'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/115081263159414444'/><author><name>Tricky</name><uri>http://www.blogger.com/profile/02161236646035432535</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-114903736500729375</id><published>2006-05-30T17:59:00.000-07:00</published><updated>2006-06-20T06:15:35.093-07:00</updated><title type='text'>Macromedia Flash 8 File Format Released</title><content type='html'>Adobe released an updated format specification for the &lt;a href="http://www.adobe.com/licensing/developer/"&gt;Macromedia Flash 8 file format&lt;/a&gt;.  Cudos to Adobe for continuing to keep the format open!&lt;br /&gt;&lt;br /&gt;All you need to do is request a free license to the document. It is in a protected PDF format and will require you to agree to a license from Adobe from within the Acrobat Reader.</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2006/05/macromedia-flash-8-file-format.html' title='Macromedia Flash 8 File Format Released'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=114903736500729375' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/114903736500729375'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/114903736500729375'/><author><name>Tricky</name><uri>http://www.blogger.com/profile/02161236646035432535</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-21738312.post-113868350942516867</id><published>2006-01-30T20:48:00.000-08:00</published><updated>2006-06-22T11:02:51.276-07:00</updated><title type='text'>Getting Runtime Trace and Debug Logs</title><content type='html'>Macromedia Flash can be so tedious to try to debug. You see, the problem is that Flash will silently swollow problems with your ActionScript. If you have a member that you are trying to access that doesn't exist, the Flash player is OK with that.  It will just ignore your incompetance.&lt;br /&gt;&lt;br /&gt;Also capturing any trace information at runtime can be difficult. You have to try dumping your traces to a text box or something like that which is a lot of extra work.&lt;br /&gt;&lt;br /&gt;Thankfully, there is a way to capture this debugging information though.&lt;br /&gt;&lt;br /&gt;To trace access to members that don't exist or to dump calls to the trace() function do the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Close all browsers and anything else that might be using Flash.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Uninstall the retail version of the Flash player. Use the utility from Macromadia here: &lt;a href="http://www.macromedia.com/cfusion/knowledgebase/index.cfm?id=tn_14157"&gt;http://www.macromedia.com/cfusion/knowledgebase/index.cfm?id=tn_14157&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Install the debug build of the Flash player. By default you can find it in:&lt;br /&gt;C:\Program Files\Macromedia\Flash8\Players\Debug&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create a text file called mm.cfg inside the folder:&lt;br /&gt;C:\Documents and Settings&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Put the following in the text file:&lt;br /&gt;TraceOutputFileEnable=1&lt;br /&gt;ErrorReportingEnable=1&lt;br /&gt;MaxWarnings=0&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;username&gt;A debug log file called flashlog.txt is generated in the same location as the mm.cfg file you created: C:\Documents and Settings\&lt;username&gt;&lt;br /&gt;&lt;br /&gt;Now just use &lt;a href="http://tailforwin32.sourceforge.net/"&gt;Tail for Win32&lt;/a&gt; to watch the flashlog.txt while you are testing your Flash movie. It will show changes made to the file in real time.&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/username&gt;&lt;/username&gt;</content><link rel='alternate' type='text/html' href='http://www.flashsecrets.com/2006/01/getting-runtime-trace-and-debug-logs.html' title='Getting Runtime Trace and Debug Logs'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21738312&amp;postID=113868350942516867' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.flashsecrets.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/113868350942516867'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21738312/posts/default/113868350942516867'/><author><name>Tricky</name><uri>http://www.blogger.com/profile/02161236646035432535</uri><email>noreply@blogger.com</email></author></entry></feed>