<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Adobe Blogs</title>
<link>http://blogs.adobe.com/</link>
<description></description>
<lastBuildDate>Wed, 10 Feb 2010 00:50:04 +0000</lastBuildDate>
<pubDate>Wed, 10 Feb 2010 00:50:04 +0000</pubDate>
<generator>http://www.movabletype.org/?v=4.261</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs> 


<item>
<title>The Flexible Configuration Options of Parsley</title>
<dc:creator>Tom Sugden</dc:creator>
<description><![CDATA[<p>One of the nice design decisions taken by Jens Halm when he created the <a href="http://www.spicefactory.org/parsley/">Parsley Application Framework</a> was to separate the configuration mechanism from the core of the framework, so different forms of configuration can be used as required. This idea in itself is not particularly new, since Martin Fowler advocated it in his 2004 article, "Inversion of Control Containers and the Dependency Injection pattern":</p>

<blockquote>
  <p>"My advice here is to always provide a way to do all configuration easily with a programmatic interface, and then treat a separate configuration file as an optional feature. You can easily build configuration file handling to use the programmatic interface. If you are writing a component you then leave it up to your user whether to use the programmatic interface, your configuration file format, or to write their own custom configuration file format and tie it into the programmatic interface" - <em>Martin Fowler</em></p>
</blockquote>

<p>The application of this design principle is particularly effective in Parsley. While some frameworks are restricted to specific configuration mechanisms, Parsley provides programmatic interfaces for synchronous and asynchronous configuration, and several out-of-the-box implementations. These interfaces provide an  extension-point so developers can plug-in their own configuration processors when the need arises.</p>
<h2>Configuration Processors</h2>

<p>In Parsley, a <em>configuration processor</em> uses some form of configuration data to build up a registry of object definitions. This process is abstracted by the following interfaces:</p>

<ul>
<li><a href="http://opensource.powerflasher.com/websvn/filedetails.php?repname=Parsley-Spicelib&amp;path=/trunk/main/parsley-core/org/spicefactory/parsley/core/builder/ConfigurationProcessor.as">ConfigurationProcessor</a></li>
<li><a href="http://opensource.powerflasher.com/websvn/filedetails.php?repname=Parsley-Spicelib&amp;path=/trunk/main/parsley-core/org/spicefactory/parsley/core/builder/AsyncConfigurationProcessor.as">AsynConfigurationProcessor</a></li>
</ul>

<p>Parsley has a number of standard implementations, including the following two most commonly used:</p>

<ul>
<li><a href="http://opensource.powerflasher.com/websvn/filedetails.php?repname=Parsley-Spicelib&amp;path=/trunk/main/parsley-config/org/spicefactory/parsley/asconfig/processor/ActionScriptConfigurationProcessor.as">ActionScriptConfigurationProcessor</a></li>
<li><a href="http://opensource.powerflasher.com/websvn/filedetails.php?repname=Parsley-Spicelib&amp;path=/trunk/main/parsley-xml/org/spicefactory/parsley/xml/processor/XmlConfigurationProcessor.as">XmlConfigurationProcessor</a></li>
</ul>

<p>The developer manual has a section explaining how to extend the framework with a new configuration processor:</p>

<ul>
<li><a href="http://www.spicefactory.org/parsley/docs/2.2/manual/extensions.php#builders">Custom Configuration Mechanisms</a></li>
</ul>

<h2>Example: Modular Configuation Processor</h2>

<p>There are various reasons to write a custom configuration processor. Perhaps you want to support your own particular configuration files, loaded and processed at runtime. However, these interfaces open up some other doors for more interesting forms of configuration. For example, they can be used to process configuration data from a compiled module.</p>

<p>Consider a large, modular application. Let's say the application consists of a Flex shell application that loads 20 modules, and 10 of these rely on the same set of shared services. It's undesirable to compile these services into the shell application, where they could be inherited by the modules, since the shell should have no knowledge of these lower level details. Instead they could be compiled into a module and the shell application could load that module at start-up, so the services are available for inheritance, but there is no dependency imposed on the shell.</p>

<p>This can be achieved quite simply by writing a new configuration processor, something like this:</p>

<pre><code>package com.adobe
{
     import flash.events.ErrorEvent;
     import flash.events.Event;
     import flash.events.EventDispatcher;

     import mx.events.ModuleEvent;
     import mx.modules.IModuleInfo;
     import mx.modules.ModuleManager;
     import mx.utils.StringUtil;

     import org.spicefactory.parsley.core.builder.AsyncConfigurationProcessor;
     import org.spicefactory.parsley.core.builder.ConfigurationProcessor;
     import org.spicefactory.parsley.core.registry.ObjectDefinitionRegistry;

     public class ModularConfigurationProcessor 
          extends EventDispatcher 
          implements AsyncConfigurationProcessor
     {
          private static const MODULE_LOADING_ERROR : String = 
               "Unable to load the module at URL {0} due to {1}";
          private static const MODULE_INCOMPATIBLE_ERROR : String = 
               "The module doesn't implement the ConfigurationProcessor interface.";

          private var url : String;
          private var module : IModuleInfo;
          private var registry : ObjectDefinitionRegistry;

          public function ModularConfigurationProcessor( url : String )
          {
               this.url = url;
          }

          public function cancel() : void
          {
               module.removeEventListener( ModuleEvent.READY, moduleReadyHandler );
               module.removeEventListener( ModuleEvent.ERROR, moduleErrorHandler );
          }

          public function processConfiguration(
               registry : ObjectDefinitionRegistry ) : void
          {
               this.registry = registry;
               module = ModuleManager.getModule( url );
               module.addEventListener( ModuleEvent.READY, moduleReadyHandler );
               module.addEventListener( ModuleEvent.ERROR, moduleErrorHandler );
               module.load( registry.domain );
          }

          private function moduleReadyHandler( event : ModuleEvent ) : void
          {
               try
               {
                    processConfigurationWithModule();
                    dispatchEvent( new Event( Event.COMPLETE ) );
               }
               catch ( e : Error )
               {
                    dispatchErrorEvent( e.message );
               }

          }

          private function processConfigurationWithModule() : void
          {
               var instance : Object = module.factory.create();

               if ( instance is ConfigurationProcessor )
               {
                    ConfigurationProcessor( instance ).processConfiguration( registry );
               }
               else
               {
                    throw new Error( MODULE_INCOMPATIBLE_ERROR );
               }
          }

          private function moduleErrorHandler( event : ModuleEvent ) : void
          {
               dispatchErrorEvent( MODULE_LOADING_ERROR, url, event.errorText );
          }

          private function dispatchErrorEvent( message : String, ... rest ) : void
          {
               dispatchEvent( new ErrorEvent(
                    ErrorEvent.ERROR,
                    false,
                    false,
                    StringUtil.substitute( message, rest ) );
          }
     }
}
</code></pre>

<p>The processor is initialized with the module URL. It loads the module, creates an instance, then checks whether the module itself is a configuration processor. If so, it delegates configuration processing to the module. Here's an example module:</p>

<pre><code>package com.adobe
{
    import mx.modules.ModuleBase;

    import org.spicefactory.parsley.asconfig.processor.ActionScriptConfigurationProcessor;
    import org.spicefactory.parsley.core.builder.ConfigurationProcessor;
    import org.spicefactory.parsley.core.registry.ObjectDefinitionRegistry;

    public class MyModule extends ModuleBase implements ConfigurationProcessor
    {
        public function processConfiguration(
            registry : ObjectDefinitionRegistry ) : void
        {
            new ActionScriptConfigurationProcessor(
                [ MyModuleConfiguration ] ).processConfiguration( registry );
        }
    }
}
</code></pre>

<p>Parsley's extension points can be taken a little further by writing a complementary configuration tag:</p>

<pre><code>package com.adobe
{
    public class ModularConfig implements ContextBuilderProcessor 
    {
        public var url : String;

        public function processBuilder( builder : CompositeContextBuilder ) : void 
        {
            builder.addProcessor(
                new ModularConfigurationProcessor( url ) );
        }
    }
}
</code></pre>

<p>So now a modular configuration can be easily combined with other forms of Parsley configuration using the usual MXML tags:</p>

<p><mx:Application ... 
      xmlns:sf="http://www.spicefactory.org/parsley"></p>

<pre><code>  &lt;sf:ContextBuilder&gt;
     &lt;sf:FlexConfig type="{ MyShellApplicationConfig }"/&gt;
     &lt;adobe:ModularConfig url="MyModularConfig.swf"/&gt;
     &lt;adobe:ModularConfig url="MyOtherModularConfig.swf"/&gt;
  &lt;/sfConfigBuilder&gt;

  ...
</code></pre>

<p></mx:Application></p>

<h2>Conclusion</h2>

<p>When creating a framework, it is wise to define generic interfaces for configuration processing, so that different formats can be used where appropriate. In many cases programmatic configuration with MXML is the simplest and most desirable option, but there are several valid cases for configuration from XML and other kinds of file (including SWFs) loaded at runtime. The configuration interfaces provided by Parsley satisfy this requirement nicely.</p>
]]></description>
<link>http://blogs.adobe.com/tomsugden/2010/02/the_flexible_configuration_opt.html</link>
<guid isPermaLink="true">http://blogs.adobe.com/tomsugden/2010/02/the_flexible_configuration_opt.html</guid>
<category>Parsley</category>
<pubDate>Tue, 09 Feb 2010 22:25:38 +0000</pubDate>
</item>

<item>
<title>Adobe Beginner Classes catch up</title>
<dc:creator>Dennis Radeke</dc:creator>
<description><![CDATA[
                           <p>Adobe Beginner Classes has been taking a somewhat forced break from regular posting over the last couple of months as so many other things have been taking precedence.&#160; I've got at least two episodes already done to some extent and several more ideas in the works.&#160; I'm definitely going to finish up my last episode by animating the Encore Menu inside of After Effects.&#160; The Christmas theme will be quite silly now in February, but it will all look good again when people hit it in November!&#160; I'm also strongly thinking about doing some subtitles inside of Encore.&#160; As always, if there are some ideas you want, I'm always taking suggestions.</p>
                             <p>In the meantime, I'll mention again that this content is available via iTunes as a <a href="http://thegenesisproject.libsyn.com">podcast</a> and on <a href="http://vimeo.com/channels/abc">Vimeo</a>. On the podcast, I'm catching up slowly with episodes, so it will be a month or so before I can get all of my older content up there.</p>
                             <p>I'll be busy banging away on all kinds of exciting new things until I can return to this, but if nothing else, know that my heart is in this and I am going to continue to post content as often as I can.&#160;Wish me the best in clearing my calendar! </p>
                             <p>Cheers, Dennis &lt;/dennis/&gt;<br/>
                             </p>
                             <!-- #BeginTags --><p class="tags"><a href="http://www.technorati.com/tag/Adobe Beginner Classes" rel="tag">Adobe Beginner Classes</a></p><!-- #EndTags -->]]></description>
<link>http://blogs.adobe.com/genesisproject/2010/02/adobe_beginner_classes_catch_u.html</link>
<guid isPermaLink="true">http://blogs.adobe.com/genesisproject/2010/02/adobe_beginner_classes_catch_u.html</guid>
<category>General</category>
<pubDate>Tue, 09 Feb 2010 17:47:10 -0500</pubDate>
</item>

<item>
<title>為什麼iPad 不支援Flash?</title>
<dc:creator>Lewis Yen</dc:creator>
<description><![CDATA[<p>我想之前有看過iPad發表會的都會發覺, 瀏覽網頁時總是東缺一塊西缺一塊, 其實它跟iPhone一樣都是不支援Flash，當然兩者用的是同一套OS。</p>
<p>Apple是如此描述Flash：能夠跨平台及跨瀏覽器且立即部署豐富的網站內容標準。</p>
<p>可是這樣的遺漏卻發生在iPhone及iPad，當Steve Jobs正眉飛色舞的展示iPad如何炫麗的瀏覽網頁時卻發現原本應該秀出Flash內容的地方成為一處空白。</p>
<p>為什麼？"因為Apple不想要它在這兒",Adrian Ludwig,Flash platform的Group Manager如此說。</p>
<p>這是真的嗎？</p>
<p>"這不是錢或者是技術的因素，在其他相似的裝置上我們已經成功讓Flash在上面跑，而且免費授權給製造商"。Ludwig描述著。</p>
<p>Apple目前的應用程式商店適用於iPhone當然也包括iPad，而防止其他類似的免費應用程式經由Flash進來打亂其佈局，當然它的app無法跨平台，而這是Flash所能做到的。</p>
<p>目前有個變通方式是會有個轉檔工具把Flash轉成iPhone app的格式，不過Apple畢竟還是有權利對這樣的應用程式是否上架做決定。</p>
<p>而針對這樣的變局，Apple也併購了一家專做線上行動廣告的公司，想要取代原本Flash在這塊市場上的應用。不過Apple在iPad上的策略有點在砸自己的腳，畢竟使用者可以忍受iPhone無法秀Flash，但在可以順暢的瀏覽網頁為主軸的iPad上，如果要在有85%的網站上都使用Flash的情況下宣稱自己是對網站友善，這就有些站不住腳。</p>
<p>除非等到Apple願意改變心意，短期內你還是會看到很多缺著Flash的網頁！</p>
<p>引用於: <a href="http://www.nbcbayarea.com/news/local-beat/Why-Doesnt-the-iPad-Do-Flash-82967272.html">http://www.nbcbayarea.com/news/local-beat/Why-Doesnt-the-iPad-Do-Flash-82967272.html</a></p>]]></description>
<link>http://blogs.adobe.com/lewisyen/2010/02/ipad_flash.html</link>
<guid isPermaLink="true">http://blogs.adobe.com/lewisyen/2010/02/ipad_flash.html</guid>
<category>General</category>
<pubDate>Tue, 09 Feb 2010 16:04:02 +0800</pubDate>
</item>

<item>
<title>Materials for Acrobat for Healthcare eSeminar</title>
<dc:creator>Rick Borstein</dc:creator>
<description><![CDATA[
                                      <p>I'm getting ahead of the game and posting the slides for my upcoming &quot;Acrobat for Healthcare Professionals eSeminar&quot; scheduled for Friday, February 12, 2010.</p>
                                      <p>All the links in the slide set are active in the downloadable PDF.</p>
                                      <p>You can download the slides directly from the link below, or preview the slides in the Acrobat.com window.</p>
                                      <p><a href="http://blogs.adobe.com/healthcare/Acrobat_9_Healthcare.pdf">Acrobat_9_Healthcare.pdf</a> (620K PDF)</p>
                                      <p>
                                        <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
 	width="600" height="400"
 	codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
                                          <param name="play" value="true" />
                                          <param name="loop" value="true" />
                                          <param name="movie" value="https://acrobat.com/Clients/current/ADCMainEmbed.swf" />
                                          <param name="quality" value="high" />
                                          <param name="wmode" value="transparent" />
                                          <param name="bgcolor" value="#202020" />
                                          <param name="allowScriptAccess" value="sameDomain" />
                                          <param name="allowFullScreen" value="true" />
                                          <param name="flashvars" value="d=ASUnTmhaEHlhQmSXpezj8Q" />
                                          <embed src="https://acrobat.com/Clients/current/ADCMainEmbed.swf" quality="high" bgcolor="#202020"
 		width="365" height="400" align="middle"
 		play="true"
 		loop="True"
 		wmode="transparent"
 		allowscriptaccess="sameDomain"
 		allowfullscreen="true"
 		type="application/x-shockwave-flash"
        flashvars="d=ASUnTmhaEHlhQmSXpezj8Q"
 		pluginspage="http://www.adobe.com/go/getflashplayer"> </embed>
                                        </object>
<br/>
                                      </p>
                                    ]]></description>
<link>http://blogs.adobe.com/healthcare/2010/02/materials_for_acrobat_for_healthcare_eseminar.html</link>
<guid isPermaLink="true">http://blogs.adobe.com/healthcare/2010/02/materials_for_acrobat_for_healthcare_eseminar.html</guid>
<category>News and Events</category>
<pubDate>Tue, 09 Feb 2010 14:03:59 -0600</pubDate>
</item>

<item>
<title>LiveCycle Workspace ES - Demo of a Performance Load Test Using Neotys NeoLoad</title>
<dc:creator>Jayan Kandathil</dc:creator>
<description><![CDATA[<p><a href="http://www.neotys.com">Neotys</a>, the maker of the performance testing tool NeoLoad now has a demo of the creation and running of a load test script for LiveCycle Workspace ES.  It is available <a href="http://www.neotys.com/evaluation/LiveCycle_Performance_Load_Stress_Testing.html">here</a>.</p>

<p>For more on load-testing LiveCycle Workspace ES applications, see <a href="http://blogs.adobe.com/livecycle/2009/10/load-testing_livecycle_workspa.html">here</a>.</p>]]></description>
<link>http://blogs.adobe.com/livecycle/2010/02/livecycle_workspace_es_-_demo.html</link>
<guid isPermaLink="true">http://blogs.adobe.com/livecycle/2010/02/livecycle_workspace_es_-_demo.html</guid>
<category>Adobe LiveCycle ES</category>
<pubDate>Tue, 09 Feb 2010 12:37:10 -0500</pubDate>
</item>

<item>
<title>Linking to a page within a PDF (and more!)</title>
<dc:creator>Samartha Vashishtha</dc:creator>
<description><![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blogs.adobe.com/samartha/Acro.jpg"><img alt="Acrobat icon.jpg" src="http://blogs.adobe.com/samartha/assets_c/2009/12/Acro-thumb-60x60-1593.jpg" width="60" height="60" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></a></span>If you have a PDF document live on the Web, can you link to a specific page within it instead of the PDF opening at the title page? Absolutely! The <i>page=&lt;pagenum&gt;</i>&nbsp;parameter let's you do just that.<div><br /></div><div>For example, try&nbsp;<a href="http://blogs.adobe.com/samartha/Handbook/pdf_handbook.pdf#page=8">http://blogs.adobe.com/samartha/Handbook/pdf_handbook.pdf<b>#page=8</b></a>. When you click this link, the destination PDF opens directly at page 8.</div><div><br /></div><div>There are several other parameters that you can specify when you open or link to a PDF document. The following parameters I think are especially useful:</div><div><br /></div><div><ul><li><i>search=&lt;wordList&gt;</i>; for example,&nbsp;<a href="http://blogs.adobe.com/samartha/Handbook/pdf_handbook.pdf#search=&quot;change bar&quot;">http://blogs.adobe.com/samartha/Handbook/pdf_handbook.pdf<b>#search="change bar"</b></a></li><li><i>nameddest=&lt;destination&gt;</i></li><li><i>comment=&lt;commentID&gt;</i></li></ul><div><br /></div><div>For more information, see <a href="http://www.adobe.com/devnet/acrobat/pdfs/pdf_open_parameters.pdf">Parameters for Opening PDF Files</a>&nbsp;(PDF) in the Acrobat SDK documentation set.</div></div>]]></description>
<link>http://blogs.adobe.com/samartha/2010/02/linking_to_a_page_within_a_pdf_and_more.html</link>
<guid isPermaLink="true">http://blogs.adobe.com/samartha/2010/02/linking_to_a_page_within_a_pdf_and_more.html</guid>
<category>Technical Communication Suite</category>
<pubDate>Tue, 09 Feb 2010 10:57:51 +0530</pubDate>
</item>

<item>
<title>Reporting back on my recent trip to Davos for the World Economic Forum</title>
<dc:creator>Rob Tarkoff</dc:creator>
<description><![CDATA[<object width="425" height="344"><param name="movie" value="http://tv.adobe.com/assets//swf/player.swf"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><param name="FlashVars" value="fileID=5074&context=331&embeded=true&environment=production"></param><embed src="http://tv.adobe.com/assets//swf/player.swf" flashvars="fileID=5074&context=331&embeded=true&environment=production" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>]]></description>
<link>http://blogs.adobe.com/conversations/2010/02/rob_tarkoff_reports_back_on_hi.html</link>
<guid isPermaLink="true">http://blogs.adobe.com/conversations/2010/02/rob_tarkoff_reports_back_on_hi.html</guid>
<category>Executive Perspectives</category>
<pubDate>Tue, 09 Feb 2010 09:17:11 -0800</pubDate>
</item>


</channel>
</rss>