<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>Ethan Malasky</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/" />
<modified>2008-10-11T21:16:36Z</modified>
<tagline>Musings on Adobe AIR and Platform Stuff</tagline>
<id>tag:weblogs.macromedia.com,2008:/emalasky/49</id>
<generator url="http://www.movabletype.org/" version="3.16">Movable Type</generator>
<copyright>Copyright (c) 2008, emalasky</copyright>
<entry>
<title>Adobe AIR Supports XSLT</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2008/10/adobe_air_suppo.html" />
<modified>2008-10-11T21:16:36Z</modified>
<issued>2008-10-11T21:08:18Z</issued>
<id>tag:weblogs.macromedia.com,2008:/emalasky/49.15104</id>
<created>2008-10-11T21:08:18Z</created>
<summary type="text/plain">The internet is funny. Things get written, then cross-referenced, then indexed by mammoth search engines. Later, when the truth changes, the old postings stay around in various indexes. So, if you did a search for &quot;Adobe AIR XSLT&quot; via your...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>The internet is funny.  Things get written, then cross-referenced, then indexed by mammoth search engines.   Later, when the truth changes, the old postings stay around in various indexes. </p>

<p>So, if you did a search for "Adobe AIR XSLT" via your <a href="http://www.google.com/search?q=adobe+air+xslt">favorite</a> <a href="http://search.yahoo.com/search?p=adobe+air+xslt">search</a> <a href="http://www.ask.com/web?q=Does+Adobe+AIR+Support+XSLT%3F&search=search&qsrc=0&o=0&l=dir">engine</a>, you'd be forgiven for thinking that AIR doesn't yet support client-side XSLT.</p>

<p>But the vast majority of those pages were from August 2007, when AIR was still in Beta.  By the time AIR 1.0 launched in 2008, XSLT support was enabled.</p>

<p>So yes:  Adobe AIR Supports XSLT!  </p>

<p>I've only seen <strong>one</strong> blog post about this truth, by my co-worker <a href="http://blogs.adobe.com/briggs/2008/05/using_air_for_xslt_processing.html">Brian Riggs</a>, who works on <a href="http://www.adobe.com/products/mediaplayer/">Adobe Media Player</a>.</p>

<p>Please, <a href="http://blogs.adobe.com/briggs/2008/05/using_air_for_xslt_processing.html">read his post</a>, link to it, and link to this one.  Together, we can change the search engines!<br />
</p>]]>

</content>
</entry>
<entry>
<title>Slides from my onAIR talk</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2008/06/slides_from_my.html" />
<modified>2008-06-24T06:58:11Z</modified>
<issued>2008-06-24T06:50:01Z</issued>
<id>tag:weblogs.macromedia.com,2008:/emalasky/49.14987</id>
<created>2008-06-24T06:50:01Z</created>
<summary type="text/plain">I&apos;ve gone more in depth into security and injection attacks before. But sometimes, it&apos;s nicer to see everything boiled down into a few slides. Here, then, are the security slides from my onAIR presentation (PDF). You may see some familiar...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>I've gone more <a href="http://weblogs.macromedia.com/emalasky/archives/2008/04/remote_plugins.html">in depth</a> into security and injection attacks before.  But sometimes, it's nicer to see everything boiled down into a few slides.</p>

<p>Here, then, are the <a href="http://weblogs.macromedia.com/emalasky/archives/onAIR_Security_Slides.pdf"> security slides from my onAIR presentation (PDF)</a>.  You may see some familiar diagrams...</p>

<p>For more detailed information on how application upgrade really works, check out this <a href="http://onair.adobe.com/blogs/tour/2008/06/23/signing-deploying-and-updating-air-applications/">trio of posts</a> that Serge Jespers did.<br />
</p>]]>

</content>
</entry>
<entry>
<title>Quick, Cool Links</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2008/06/quick_cool_link.html" />
<modified>2008-06-18T07:41:10Z</modified>
<issued>2008-06-18T07:18:49Z</issued>
<id>tag:weblogs.macromedia.com,2008:/emalasky/49.14984</id>
<created>2008-06-18T07:18:49Z</created>
<summary type="text/plain">There&apos;s been a lot going on lately, even without counting a great week with the onAIR tour in Europe. Each of these deserve a full post with captivating details and insider insight. But instead I&apos;m going for partial credit, just...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>
<dc:subject>AIR</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>There's been a lot going on lately, even without counting a great week with the onAIR tour in Europe.  Each of these deserve a full post with captivating details and insider insight.  But instead I'm going for partial credit, just getting everything out there.</p>

<h2>AIR 1.1</h2>

<p><a href="http://www.adobe.com/go/air">AIR 1.1</a> went live last night, bringing international and localization support to AIR.  This means that users get an application install experience best suited to their language, and developers can craft apps that are similarly localized.  Christian and Jeff wrote articles showing how to do just that; check out the <a href="http://www.adobe.com/devnet/air/">AIR Developer Center</a>.</p>

<h2>Update Framework</h2>

<p>It's crucial for applications to be able to update themselves.  Users expect seamless growth as new functionality is added.  Update is also a security safety valve.  If an application has a vulnerability, it can update itself to a safe, patched version.  <a href="http://www.webkitchen.be/">Serge Jespers</a> gave a great presentation about update for the onAIR tour.</p>

<p>Now there's a new <a href="http://labs.adobe.com/wiki/index.php/Adobe_AIR_Update_Framework">Update Framework</a> available on <a href="http://labs.adobe.com/">Adobe Labs</a>, making it even easier to do the right thing.</p>

<h2>Security Talk</h2>

<p>In Warsaw last week, <a href="http://blog.kevinhoyt.org/">Kevin Hoyt</a> was nice enough to tape my talk on security.  Yesterday, he <a href="http://blog.kevinhoyt.org/2008/06/17/ethan-malasky-on-security-in-adobe-air/">made the audio available</a> on his blog.</p>

<p>I can't say enough about how educational and fun the onAIR tour was.  The attendees' engagement and expertise was really humbling.  Developers are digging deep into AIR and pushing it to the limit, while suggesting great improvements to make development more and more elegant.  The evangelists are always great to talk to, and are even greater to travel with. </p>

<h2>AIR Cookbook</h2>

<p>I just learned about the <a href="http://www.adobe.com/devnet/air/?navID=cookbook">AIR Cookbook</a> on the developer center.  This is a great place for people to share the "recipes" they've created for working with AIR.  After seeing some excellent techniques in action the other week, I'm sure the cookbook will become a valuable tool for developers of all levels.  Delicious!!</p>]]>

</content>
</entry>
<entry>
<title>One week with the onAIR Tour in Europe</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2008/05/one_week_with_t.html" />
<modified>2008-05-31T15:01:16Z</modified>
<issued>2008-05-29T08:10:07Z</issued>
<id>tag:weblogs.macromedia.com,2008:/emalasky/49.14948</id>
<created>2008-05-29T08:10:07Z</created>
<summary type="text/plain">I&apos;m posting this from the beautiful city of Stockholm, Sweden. This week I&apos;ll be traveling with Mike Chambers, Ryan Stewart and the rest of the onAIR crew. My presentation is an introduction to building security applications in AIR. The first...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>I'm posting this from the beautiful city of Stockholm, Sweden.  This week I'll be traveling with <a href="http://www.mikechambers.com/blog/2008/05/06/heading-to-europe-to-speak-on-air-and-flex/">Mike Chambers</a>, <a href='http://blog.digitalbackcountry.com/'>Ryan Stewart</a> and the rest of the <a href="http://onair.adobe.com/">onAIR</a> crew.  </p>

<p>My presentation is an introduction to building security applications in AIR.  The first leg of the tour is sold out, and I'm totally excited to be presenting to a full house.  If you're coming to the events in Stockholm, Berlin, or Warsaw, say hi.  I want to use this opportunity outside my cube to meet the developers who give meaning to the platform.</p>]]>

</content>
</entry>
<entry>
<title>Remote Plugins and Modules in AIR</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2008/04/remote_plugins.html" />
<modified>2008-04-14T09:09:18Z</modified>
<issued>2008-04-14T08:53:37Z</issued>
<id>tag:weblogs.macromedia.com,2008:/emalasky/49.14879</id>
<created>2008-04-14T08:53:37Z</created>
<summary type="text/plain">I&apos;ve been getting a lot of questions about how to use remote &quot;modules&quot; in AIR. &quot;Modules&quot; is in quotes because it can mean different things. In every case, it refers to running some SWF or HTML/JS content that is loaded...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>I've been getting a lot of questions about how to use remote "modules" in AIR.  "Modules" is in quotes because it can mean different things.  In every case, it refers to running some SWF or HTML/JS content that is loaded at runtime from the network.  The difference are in how the content is loaded and how an application can communicate with it.</p>

<p>Depending on the specifics of the modules you want to load there are different options about how to load and communicate with the content.  Let's explore the options!!</p>]]>
<![CDATA[<p>In web browsers, we run remote content all the time, and don't have to worry about security. Images and pages from other domains can execute their own code, but can't reach into ours.  We can also choose to pull someone else's code into our own and run it.  Dynamic evaluation of Javascript is a powerful tool, and it can be elegantly used.  SWF has the same security model: remote content (images, audio, video, SWF) can run without accessing our code, and we can choose to import remote code and content (loadBytes()).  </p>

<p>Privileged local applications have a responsibility to protect their users.  No one wants their app to have flaws that expose their users' data or computers to attackers.  AIR has strict but simple standards about which content (SWF, JS) can get application privileges.  Only the files in the application's security sandbox may use the local File APIs, Windowing APIs, etc.  Files will be in this sandbox only if they are loaded from the application's local directory via an app: URI, or are imported into that sandbox using explicit APIs.</p>

<h2>Separate Sandboxes</h2>

<p><img alt="SandboxedLoading.png" src="http://weblogs.macromedia.com/emalasky/archives/SandboxedLoading.png" width="546" height="356" /></p>

<p>If you don't trust the content, or don't want to verify that it really is trusted, you can keep it at arm's length.  This is the default; remote content is loaded in a remote sandbox according to its domain.  One difference in AIR is key: <strong>Communication is possible across sandboxes at runtime</strong>.  Using the SandboxBridge API in AIR, content can expose a discoverable API to content across the border.  Any data passed is copied to its destination.  Complex data structures can be passed across the  (deep-copy, without functions and custom class information). </p>

<p>This feels more like service-style communication. Loading a file is like getting a service endpoint. Your code's integrity is protected by the loose coupling, but the service also has a bit of code that it gets to run in your client.  Google Gears's  <a href="http://code.google.com/apis/gears/api_workerpool.html">WorkerPool</a> has a similar style, with message passing between threads that run in their own sandboxes.  The big difference is that SandboxBridge messages are synchronous, and look like function calls and property gets.</p>

<p>SandboxBridges can be used at frame/iframe borders and at the LoaderInfo that is shared by parent and child when using Loader.  Each side can expose APIs to the other.  But it's essential to resist the urge to bust the whole thing wide open.  Don't think it's cute to just expose <em>every</em> AIR API to unprivileged content.  Instead, expose high-level APIs that, when abused, will damage only your application, not the user's whole system. A writeFile(file, data) API is just an invitation for attack.  By contrast,  savePreferences(data) will make your app less vulnerable to malicious content.</p>

<h2>Importing</h2>

<p><img alt="Importing.png" src="http://weblogs.macromedia.com/emalasky/archives/Importing.png" width="556" height="356" /></p>

<p>If you do trust the content, and want it to be able to share your runtime data, share your type definitions and execute in your space, you can import it into the application's sandbox.  This content will have full privilege.  I can't overstate this enough: content you import this way can completely take control of your application.  And once it has control of your application, it can start doing evil things to the local machine.  It can do anything your app can do. </p>

<p>So, why even bother with such a dangerous technique?  Well, in some cases it really is what you want.  If you're trying to reduce the download size of your app, you can wait until you need some functionality before downloading it.  Flex Modules, for instance, require that they be imported into the loader's sandbox.  The same technique works for localization data.  </p>

<p>So to pull this content in safely, you need to prove that you can trust it.  Given the ease of remote attacks (DNS hacks; man-in-the-middle attacks; owning up the "trusted" server; etc), imported modules must be signed, and the signature must be verified before loading the content.  </p>

<ol>
<li><p>
First, sign your modules.  I'm pretty sure you can just use adt for this, then rip the signatures.xml out of META-INF.  Then post the modules and signatures.xml
</p></li><li><p>
When you download the modules, save them and signatures.xml somewhere in app-storage:/
</p></li><li><p>
Use the XMLSignatureValidator class to validate that you downloaded modules that really were signed by you (or some known entity).
</p></li><li><p>
Import the modules into your application sandbox.  For SWF, use Loader.loadBytes(), pass a LoaderContext with allowLoadBytesCodeExecution=true.  I doubt anyone will do *that* by accident.
</p></li>
</ol>

<p>In AIR 1.0, this is the best way to use Flex modules without taking dangerous risks.  I expect there will be other techniques in future versions. </p>

<p>Import this way is not going to work for arbitrary third-party content.  If you don't know ahead of time who you trust to have signed it, you must not import it.  Once again, we come back to The Spiderman Axiom: with great power comes great responsibility.  </p>

<p>Blah.  That's way too long.  But at least I have someplace to point people to when they ask!</p>

<p>Comments?  Concise summaries?</p>

<p><br />
</p>]]>
</content>
</entry>
<entry>
<title>AIR for Linux -- users and developers</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2008/03/air_for_linux_-.html" />
<modified>2008-03-31T05:39:51Z</modified>
<issued>2008-03-31T05:30:57Z</issued>
<id>tag:weblogs.macromedia.com,2008:/emalasky/49.14833</id>
<created>2008-03-31T05:30:57Z</created>
<summary type="text/plain">Two big announcements on the Adobe + Linux front today. A public alpha of AIR and a new rev of Flex Builder. For years I&apos;ve been toying with the theory that Linux hasn&apos;t caught on in the consumer desktop space...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>Two big announcements on the Adobe + Linux front today.  A <a href="http://www.adobe.com/go/airlinux">public alpha of AIR</a> and a new rev of <a href="http://www.adobe.com/go/flexbuilder_linux">Flex Builder</a>.</p>

<p>For years I've been toying with the theory that Linux hasn't caught on in the consumer desktop space because the apps users expect to run don't run there.  And the apps don't run there because developers need to learn different styles to develop Linux apps.  There's different distros and packaging requirements, wide variance in window managers, etc, etc.</p>

<p>Sure, the rise of Wine kind of undermines the whole theory.  But it adds an extra wrinkle: virtualized apps are cool, but a little bit weird.  I'm hooked on virtualized OSes for daily life, but I still feel like they're not really playing well with others.</p>

<p>Anyway, the ability to develop Linux apps using AIR is a big step.  Developers can write these apps on any OS.  And just as cool, developers who love what Linux offers for their own work productivity can create AIR apps that run on Mac and Win as well.  Same .air file, any OS.</p>

<p>So try out the Linux tools and file some bugs!!  It's the best way to get quality where we all want it to be.</p>]]>

</content>
</entry>
<entry>
<title>European Vacation</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2008/03/european_vacati.html" />
<modified>2008-03-12T03:42:18Z</modified>
<issued>2008-03-12T03:30:52Z</issued>
<id>tag:weblogs.macromedia.com,2008:/emalasky/49.14779</id>
<created>2008-03-12T03:30:52Z</created>
<summary type="text/plain">This is going to be fun. Hot on the heels of shipping AIR 1.0, I&apos;ve been given approval to join some excitable evangelists and other eloquent luminaries on the AIR Tour in Europe. For one week in June, I&apos;ll join...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>
<dc:subject>AIR</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>This is going to be fun.  Hot on the heels of shipping <a href="http://www.adobe.com/go/air">AIR 1.0</a>, I've been given approval to join some excitable evangelists and other eloquent luminaries on the <a href="http://onair.adobe.com/tour/">AIR Tour in Europe.</a></p>

<p>For one week in June, I'll join the tour, presenting in Stockholm, Berlin and Warsaw.  It's always a blast to meet the developers who are pushing the envelope of rich apps.  And it'll be especially fun meeting them in parts of the world that are entirely new to me.  From this desk, it's sometime hard to feel the true scale of a global community.</p>

<p>I just need to find someone to keep an eye on my cube....</p>]]>

</content>
</entry>
<entry>
<title>AIR 1.0 is Live </title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2008/02/air_10_is_live.html" />
<modified>2008-02-25T07:18:26Z</modified>
<issued>2008-02-25T07:08:39Z</issued>
<id>tag:weblogs.macromedia.com,2008:/emalasky/49.14724</id>
<created>2008-02-25T07:08:39Z</created>
<summary type="text/plain">It&apos;s been years in the making, but AIR 1.0 has left the building! I&apos;m so proud to have been a part of the development of the product. And it&apos;s unbelievably exciting to see how many people are excited about the...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>
<dc:subject>AIR</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>It's been years in the making, but <a href="http://www.adobe.com/products/air/">AIR 1.0</a> has left the building!</p>

<p>I'm so proud to have been a part of the development of the product. And it's unbelievably exciting to see how many people are excited about the possibilities for rich cross platform internet applications on the desktop.</p>

<p>This product would not have been possible without the devotion of the community, who labored always to keep us on target. From early on, we had pros like the inimitable <a href="http://www.mikechambers.com/blog/2008/02/24/adobe-air-10-thank-you/">Mike Chambers</a> reaching out to the community to show that the team was listening, and reaching into Adobe to make sure that the team really was.</p>

<p>Now that the bits are live, the big challenge begins for everyone -- show the world how great experiences can make a difference.</p>]]>

</content>
</entry>
<entry>
<title>Tear-Off Tabs into AIR Windows</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2007/07/tear-off_tabs_i.html" />
<modified>2007-07-27T18:05:58Z</modified>
<issued>2007-07-27T09:20:45Z</issued>
<id>tag:weblogs.macromedia.com,2007:/emalasky/49.14077</id>
<created>2007-07-27T09:20:45Z</created>
<summary type="text/plain">Just for fun, I built this custom component to support tearing a tab off into a new window. It&apos;s anything but polished, but it can&apos;t hurt to share, right? Download the AIR file, or download the source. Runs on AIR...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>
<dc:subject>AIR</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>Just for fun, I built this custom component to support tearing a tab off into a new window.</p>

<p>It's anything but polished, but it can't hurt to share, right? </p>

<p>Download the <a href="http://weblogs.macromedia.com/emalasky/archives/TabSample.air">AIR file</a>, or download the <a href="http://weblogs.macromedia.com/emalasky/archives/TabSample.zip">source</a>.</p>

<p>Runs on <a href="http://labs.adobe.com/downloads/air.html">AIR Beta</a>.</p>]]>

</content>
</entry>
<entry>
<title>Uses of multiple windows in AIR</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2007/07/uses_of_multipl.html" />
<modified>2007-07-25T07:23:28Z</modified>
<issued>2007-07-25T06:47:02Z</issued>
<id>tag:weblogs.macromedia.com,2007:/emalasky/49.14064</id>
<created>2007-07-25T06:47:02Z</created>
<summary type="text/plain">For years, I&apos;ve wanted to add one feature to the Flash Player: support for multiple windows. The feature really only makes sense when dealing with desktop apps, and I&apos;ve been lucky enough to add the feature for AIR. One aspect...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>
<dc:subject>AIR</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>For years, I've wanted to add one feature to the Flash Player: support for multiple windows.  The feature really only makes sense when dealing with desktop apps, and I've been lucky enough to add the feature for AIR.</p>

<p>One aspect of multiwindow programming is key to making the whole package fun to use.  But it's a subtle thing and not many people know it.  There's no artificial barrier between your windows.  The code you associate with your windows can all exist in the same "namespace" (they're called ClassLoaders in Java; ApplicationDomains in AS3).</p>

<p>There's no need to have a separate SWF or HTML file for each window. It's much cleaner to just create windows as needed and populate them with DisplayObjects.  </p>

<p>We haven't seen many examples yet, but I believe this rich programming model will lead to even richer interactions.  Let's brainstorm some of the cool ways windows can be used.</p>

<p><b>Splash Screen</b>: When the app launches, an attractive splash screen fades in in the middle of the screen.  A nice opportunity to establish branding while also giving startup progress feedback to the user.</p>

<p><b>Tear-off Tabs</b>: grab a tab and drag it out of the window.  A translucent image shows where a new window will be created.  Release the mouse button and a new window is created.</p>

<p><b>Docking Windows</b>: As you move a window, it naturally docks to the edges of the screen and to other windows in the app.  Once docked, you can move multiple windows at once.  I'm thinking about Winamp and Trillian's windows....</p>

<p><b>Auto-hide Toolbars</b>: Already docked to the side of the screen, the window can slide offscreen when you move your mouse away.  A small indicator reminds you that something's there.  When you move your mouse to the edge, the window slides back.  Here I'm thinking about MS Windows Appbars, or Quicksilver's <a href="http://lifehacker.com/software/mac-os-x/download-of-the-day-quicksilver-clipboard-module-111082.php">Clipboard History</a> window.</p>

<p>What else?</p>]]>

</content>
</entry>
<entry>
<title>Summary:  MAX Advanced Apollo Application Development</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2006/10/summary_max_adv.html" />
<modified>2006-10-28T02:42:58Z</modified>
<issued>2006-10-28T02:21:24Z</issued>
<id>tag:weblogs.macromedia.com,2006:/emalasky/49.12369</id>
<created>2006-10-28T02:21:24Z</created>
<summary type="text/plain">First off, thanks to everyone who came to Brent and my sessions at MAX. We had a great time doing them. It was a blast to meet so many people I&apos;ve only known from email lists and blogs. People seemed...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>First off, thanks to everyone who came to Brent and my sessions at MAX.  We had a great time doing them.  It was a blast to meet so many people I've only known from email lists and blogs. People seemed really interested and excited in Apollo.  Judging from the great questions, a lot of people had put some hard thought into what it'll take to make Apollo successful.</p>

<p>I'm sure the final slides will get posted somewhere central, but I'd like now to summarize the key points of our presentation.</p>]]>
<![CDATA[<ul>
<li>Apollo applications are cross-platform bundles of files.  A ZIP file plus a metadata file (application.xml)</li>
<li>Once installed, Apollo applications are indistinguishable from other native applications.  The Apollo runtime handles this install and makes the magic happen.</li>
<li>A command-line toolchain will be freely availably (like the Flex SDK), and the integration with IDEs will be super-sweet.  I've moved to an internal build of Apollo support in Flex Builder, and there's no way I'm moving back...</li>
<li>Control over native windows will be very simple, but also very powerful.  No windows, multiple windows.  System chrome, custom chrome.  Transparent moving windows.  Etc, etc, etc!</li>
<li>HTML is a fully-integrated content type in Apollo.  Display of HTML is entirely controllable via normal Flash/Flex APIs (which will also be exposed to JS).  Scripting between Flash and JS will be trivial.</li>
</ul>

<p>To see other folks' take on Apollo, check out some of <a href="http://casario.blogs.com/mmworld/2006/10/anatomy_of_an_a.html">Marco's</a>  <a href="http://casario.blogs.com/mmworld/2006/10/apollo_lesson_2.html">posts</a>, or sign up for <a href="http://weblogs.macromedia.com/mesh/archives/2006/10/free_apollo_onl.html">Mike's session</a> next week.</p>]]>
</content>
</entry>
<entry>
<title>MAX2006 Keynote</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2006/10/max2006_keynote.html" />
<modified>2006-10-24T19:46:57Z</modified>
<issued>2006-10-24T19:37:48Z</issued>
<id>tag:weblogs.macromedia.com,2006:/emalasky/49.12282</id>
<created>2006-10-24T19:37:48Z</created>
<summary type="text/plain">I&apos;ll leave the detail-heavy blog posts to someone else. Brent and I still have to finish up the demos for our session this afternoon. But I want to get some thoughts down while the impressions are still fresh. The strongest...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>I'll leave the detail-heavy blog posts to someone else.  Brent and I still have to finish up the demos for our session this afternoon.  But I want to get some thoughts down while the impressions are still fresh.</p>

<p>The strongest theme running through the presentations was the integration of separate products to support real workflows.  Fancy products like Flash and Photoshop and ColdFusion can be used creatively to do almost anything.  That's great power and freedom.  But it doesn't mean that the most common tasks can be ignored.</p>

<p>I was especially impressed when Sho Kuwamoto demo'd a workflow between Illustrator and Flex Builder.  Using well-designed assets in Illustrator, he mapped those to Flash symbols which were used to skin Flex components.  </p>

<p>Focus on that kind of developer experience will be huge for the Flex community.  By optimizing the common task, designers and developers will be able to make their Flex apps more distinctive.  Can't wait to try that out!</p>]]>

</content>
</entry>
<entry>
<title>Sessions at MAX</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2006/10/sessions_at_max.html" />
<modified>2006-10-20T06:03:05Z</modified>
<issued>2006-10-20T05:53:32Z</issued>
<id>tag:weblogs.macromedia.com,2006:/emalasky/49.12253</id>
<created>2006-10-20T05:53:32Z</created>
<summary type="text/plain">I&apos;m excited to be going to MAX next week. As always, it&apos;s great to get out and talk to real live users. I&apos;m also going to be doing a session with my teammate Brent: Advanced Apollo Application Development. The session...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>
<dc:subject>Apollo</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>I'm excited to be going to MAX next week.  As always, it's great to get out and talk to real live users.  I'm also going to be doing a session with my teammate Brent:  <a href="http://www.adobe.com/events/max/sessions/ri202w.html">Advanced Apollo Application Development</a>.  </p>

<p>The session description isn't totally accurate, but we will be talking about some of the newer features that have made their way into Apollo. I think we'll be doing some live development, too, as well as prepping folks for things that are coming down the line.</p>

<p>I'm going to try blogging a lot more. The medium hasn't really caught hold for me yet (as a writer, that is).  I'm jumpstarting the whole thing by posting whether I've got good stuff to say or not.  If it's boring, no one will link to it.  I'm OK with that.</p>]]>

</content>
</entry>
<entry>
<title>Working on Apollo</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2006/06/working_on_apol.html" />
<modified>2006-06-29T22:44:02Z</modified>
<issued>2006-06-29T22:36:17Z</issued>
<id>tag:weblogs.macromedia.com,2006:/emalasky/49.11329</id>
<created>2006-06-29T22:36:17Z</created>
<summary type="text/plain">It&apos;s been a long time since I&apos;ve posted, but it&apos;s time to get back out in the world. I&apos;ve been fortunate enough to be working on Apollo. Things are coming along great and there&apos;s increasing discussion about Apollo in the...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>
<dc:subject>Apollo</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>It's been a long time since I've posted, but it's time to get back out in the world.  I've been fortunate enough to be working on <a href="http://weblogs.macromedia.com/mxna/index.cfm?query=bySmartCategory&smartCategoryId=28&smartCategoryName=Apollo&smartCategoryKey=F2DFD9E0-FBB6-4C2D-2AFE6AFD941FDDB1">Apollo</a>.  Things are coming along great and there's increasing discussion about Apollo in the blogosphere.</p>

<p>My plan is to use this page to comment on people's discussions, and to add new topics to the fray.  Apollo will be opening up cool new opportunities for web developers, and I hope to share my excitement.</p>

<p>Talk with you all soon! </p>]]>

</content>
</entry>
<entry>
<title>Custom Context Menus in Flash 8</title>
<link rel="alternate" type="text/html" href="http://weblogs.macromedia.com/emalasky/archives/2005/10/custom_context.html" />
<modified>2005-10-28T01:03:06Z</modified>
<issued>2005-10-28T00:36:35Z</issued>
<id>tag:weblogs.macromedia.com,2005:/emalasky/49.9333</id>
<created>2005-10-28T00:36:35Z</created>
<summary type="text/plain">I was reminded by some comments at Tinic&apos;s blog about the hassles of making custom context menus in Flash. If a parent movie clip and a child movie clip both have context menus set, the parent&apos;s menu is always shown,...</summary>
<author>
<name>emalasky</name>
<url>http://weblogs.macromedia.com/emalasky/</url>
<email>emalasky@macromedia.com</email>
</author>
<dc:subject>Flash</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://weblogs.macromedia.com/emalasky/">
<![CDATA[<p>I was reminded by some <a href="http://www.kaourantin.net/2005/10/next-generation-flash-player-user.html#112841448403034788">comments </a> at Tinic's blog about the hassles of making custom context menus in Flash.  If a parent movie clip and a child movie clip both have context menus set, the parent's menu is always shown, even when clicking on the child.</p>

<p>At least that's how it used to be....</p>]]>
<![CDATA[<p>Flash Player 8 changed this behavior to something more intuitive.  The deepest child with a context menu that satisfies the hitTest gets to provide the menu.</p>

<p>To preserve backwards compatibility, the new behavior only applies to SWF8 content and later.  To demonstrate, I whipped up an example.  There is no difference between the two movies except the SWF version they are published to.</p>

<p>Right-click all over the movies to see what I'm talking about.</p>

<p>Published to SWF 7:<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550" height="250" id="context_fp7" align="middle"><br />
<param name="allowScriptAccess" value="sameDomain" /><br />
<param name="movie" value="/emalasky/archives/context_fp7.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /><embed src="/emalasky/archives/context_fp7.swf" quality="high" bgcolor="#ffffff" width="550" height="250" name="context_fp7" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /><br />
</object></p>

<p><br />
Published to SWF 8:<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="550" height="250" id="context_fp8" align="middle"><br />
<param name="allowScriptAccess" value="sameDomain" /><br />
<param name="movie" value="/emalasky/archives/context_fp8.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /><embed src="/emalasky/archives/context_fp8.swf" quality="high" bgcolor="#ffffff" width="550" height="250" name="context_fp8" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /><br />
</object></p>

<p>If you're really curious, download both samples <a href="/emalasky/archives/context_sample.zip">here</a>.</p>]]>
</content>
</entry>

</feed>