<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEYHRHo9fip7ImA9WhJQEko.&quot;"><id>tag:blogger.com,1999:blog-5573280442672135971</id><updated>2012-07-25T23:15:35.466-05:00</updated><category term="HP Windows webOS desktop ecmascript JavaScript HTML5" /><category term="JavaScript ECMAScript ActionScript Constants ConstantCollections Development CSV JSON DataTransferFormats Flash Flex" /><category term="JavaScript ECMAScript Development Evangelism develop-once-run-anywhere" /><category term="FlashBuilder4 Flex compiler_options -dump-config" /><category term="Flex4vsFlex3 Flex4 Flex3 Flex Performance Data spark mx" /><category term="Software Design Web Application Design Sucks Patterns Layers JavaScript WebApp" /><category term="SBT Scala" /><title>{{{{Jack.Viers}}}}</title><subtitle type="html">A blog about developing JavaScript, Flex, and Scala.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://jackviers.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://jackviers.blogspot.com/" /><author><name>Jack Viers</name><uri>https://plus.google.com/111828909388123895493</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-wC52NC5Xnws/AAAAAAAAAAI/AAAAAAAAAVs/oMypUqdOfL0/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/jackviers" /><feedburner:info uri="jackviers" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CkIASXY7fSp7ImA9WhRUF0s.&quot;"><id>tag:blogger.com,1999:blog-5573280442672135971.post-5538346955247694755</id><published>2012-01-28T08:22:00.000-06:00</published><updated>2012-01-28T08:22:28.805-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-28T08:22:28.805-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SBT Scala" /><title>SBT ~ Scala's Simple Build Tool Series, Part 3. SBT Default Settings</title><content type="html">&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif; font-size: large;"&gt;In the&amp;nbsp;&lt;a href="http://jackviers.blogspot.com/2012/01/sbt-scalas-simple-build-tool-series_16.html"&gt;previous article&lt;/a&gt;, I&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif; font-size: large;"&gt;explained what an SBT Setting is, and provided a list of Settings provided by SBT upon installation. In this article, I am going to describe some of the defaults provided by SBT out of the box.&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif; font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;SBT Default Settings and Scopes.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;SBT's Default Settings are defined in the Defaults.scala source file&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;. There are two configuration scopes where settings are defined, the GlobalScope configuration scope, and the ThisProject configuration scope (the project to be built, that is, YOUR project). Settings cascade, that is, each ScopeAxis (Global, Project, Configuration, or Task), falls back on another ScopeAxis if a setting is requested from it that was not defined in the scope of the task. In this way, SBT build definitions, which are sequences of initialized settings, are similar to Cascading Style Sheets, with lower-level ScopeAxis, like Task Scopes, overriding the settings of the ScopeAxis that they extend from (using the extend method).&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;At the top level, is the GlobalScope. You could use this scope to define things like yourself as an author or contributor, add the ENSIME plugin to all your projects, etc. All other scope definitions come from this Global root. In Defaults.scala, this is used to set defaults for many of the 220+ keys available in SBT. A consequence of this is that if you do not set a setting to what you want, SBT will set it to a default setting for you. An example, the name settingKey. Fire up SBT inside an empty project and don't create a name entry in the .sbt build definition file. Type inspect name at the prompt. You'll get something like the following:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;gt; inspect name&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] Setting: java.lang.String = default-42f6d6&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] Description:&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Project name.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] Provided by:&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{file:/Users/jackviers/Library/Developer/sbtProj/}default-42f6d6/*:name&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] Dependencies:&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;*:this-project&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] Reverse dependencies:&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;*:project-info&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;*:normalized-name&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;*:on-load-message&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;*:description&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] Delegates:&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;*:name&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{.}/*:name&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;[info] &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;*/*:name&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif; font-size: xx-small;"&gt;Fig. 1. Result of not setting name in build using sbt.&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif; font-size: xx-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Note that the &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;name&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt; setting is a &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Setting[String]&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt; with the value of &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;default-42f6d6&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;. This is a great feature. It means that for your average build, you don't need to know a ton of SBT settings, because SBT will fill them in for you. It also means that, if you wish, you may override or add to existing SBT settings at almost any level of your build.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Important SBT Default Settings&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;The following is a list of prevalent default settings, with their ScopeAxis defaults where provided. You can find them in the SBT source code, mostly in the Defaults.scala file, or by starting sbt in interactive mode and using the inspect command.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;name, ThisProject, project id (default+ hash)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;organization, ThisProject, &amp;lt;&amp;lt;= name(StringUtilities.normalize)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;credentials, Global, Nil&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;taskTemporaryDirectory, Global, Some system level temporary directory&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;watchSources, ThisProject, Nil&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;sourceDirectory, ThisProject, src&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;scalaSource, ThisProject, sourceDirectory / "scala"&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;javaSource, ThisProject, sourceDirectory / "java"&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;compileOrder, Global, CompileOrder.Mixed&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;javacOptions, Global, Nil&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;scalacOptions, Global, Nil&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Again, you can override any of the 220+ settings however you would like, but SBT, in most cases, will define them for you.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;In the next article I will discuss the various tasks available out of the box with SBT.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/jackviers/~4/HhoHjz8AkII" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jackviers.blogspot.com/feeds/5538346955247694755/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://jackviers.blogspot.com/2012/01/sbt-scalas-simple-build-tool-series_28.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/5538346955247694755?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/5538346955247694755?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/jackviers/~3/HhoHjz8AkII/sbt-scalas-simple-build-tool-series_28.html" title="SBT ~ Scala's Simple Build Tool Series, Part 3. SBT Default Settings" /><author><name>Jack Viers</name><uri>https://plus.google.com/111828909388123895493</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-wC52NC5Xnws/AAAAAAAAAAI/AAAAAAAAAVs/oMypUqdOfL0/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://jackviers.blogspot.com/2012/01/sbt-scalas-simple-build-tool-series_28.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEGR3cyeCp7ImA9WhRUF0s.&quot;"><id>tag:blogger.com,1999:blog-5573280442672135971.post-6314966989454253123</id><published>2012-01-16T17:47:00.003-06:00</published><updated>2012-01-28T08:23:46.990-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-28T08:23:46.990-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SBT Scala" /><title>SBT ~ Scala's Simple Build Tool Series, Part 2. SBT Settings</title><content type="html">&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif; font-size: large;"&gt;In the &lt;a href="http://jackviers.blogspot.com/2012/01/sbt-scalas-simple-build-tool-series.html"&gt;previous article&lt;/a&gt;, I told you about Scala's Simple Build Tool (SBT), how to install and set up a simple Scala project, and how to use SBT to build and run that project. In this article, I'm going to explain what an SBT Setting is, and provide a list of Settings provided by SBT upon installation.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif; font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;SBT Settings&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;SBT Setting objects are made up of three parts: &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Scope&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;, name, and value. They are represented in the SBT api code as &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SettingKey&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; traits. Settings are typed generically, and written as &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SettingKey[T]&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;. The &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SettingKey&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; trait type, &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;T&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;, defines the type of the &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SettingKey&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;. For example, if the Setting is a &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;String&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;, the type of the &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SettingKey&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; representing the Setting is &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;String&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;, and the object is written as &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SettingKey[String]&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;. In practice, you won't see a SettingKey[String], but the example is there for you to realize that when you look at a SettingKey[T], the &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SettingKey&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; is always typed to type &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;T&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;, where &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;T&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; is some trait, object, or class name, like &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;String&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;SBT Scopes&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Scopes&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; are objects containing the names and values of keys within a scope, or section, of the project. They give a setting a context to live in. This allows you to have different settings for your test build than in your src build; a subproject within your build than in your main project of your build; or in the compile task than in the documentation task of your build. Scopes are defined by their &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ScopeAxis&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;. There are three types of &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ScopeAxis&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;: typed by Project, typed by Task, and typed by Configuration. The built-in configurations are a subset of those provided by Maven Dependency Scopes: Compile, Run, Package, Document, and Test. Project ScopeAxes refer to the current project. Task ScopeAxes refer to a Task. There is also a Global ScopeAxes, which sets the setting for all axes.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;SBT Keys&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;The name and value of a setting are stored in scopes in a value trait called &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;AttributeKey&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;. The attribute key is typed to contain the type of value stored in the value part of the setting, and defined as &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;AttributeKey[T]&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;. So if a Setting has a string value, the &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;AttributeKey&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; type, &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;T&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;, is&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;String&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; and it is written as &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;AttributeKey[String]&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;. The name part of the Setting is the &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;AttributeKey[T].label&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; member of the &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;AttributeKey[T]&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; trait.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;The value is only available after evaluating the key within the given scope, and is returned by the AttributeKey[T].evaluate method.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Defining Settings&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;SBT Settings can be defined in a .sbt build definition file, a *.scala source file under the SBT project directory, or in the sbt users' home .sbt definition file, which defines global default settings for all projects built by sbt by a given user. To explicitly define a Setting within a Scope, you use the &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;SettingKey[T].in&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; method. For example, &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;name in Compile := "My CompileName"&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; sets the name &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;AttributeKey[String]&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; in the &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Compile&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; configuration Scope.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Available Settings&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif; font-size: small;"&gt;Here's a list of the over 220 Setting/Task/AttributeKeys (SBT SETTINGS), along with their descriptions, sbt command-line alias, and types. It comes directly from the Keys.scala SBT source file. I've sub-sectioned them by purpose, again, coming directly from the source file. Remember, this is just a list of the available settings. To define a full setting, you must give it a scope (project is the default in .sbt build definition files) and a value (like "MyProjectName") that matches the type of the available key.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;TL;DR&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif; font-size: small;"&gt;This list is not intended to be read linearly. Use the following shortcut links to skip to a section when looking for a particular type of SBT setting, its type, and description. An alternative is to use the browser search to look for a particular setting name, type, and description. In the &lt;a href="http://jackviers.blogspot.com/2012/01/sbt-scalas-simple-build-tool-series_28.html"&gt;next article&lt;/a&gt;, I am going to talk about some of the default settings that come out of the box with SBT.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#logging_settings"&gt;Logging Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#project_settings"&gt;Project Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#command_settings"&gt;Command Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#path_settings"&gt;Path Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#source_path_settings"&gt;Source Path Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#filter_settings"&gt;Filter Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#resource_path_settings"&gt;Resource Path Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#output_path_settings"&gt;Output Path Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#generators_settings"&gt;Generators Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#compile_doc_settings"&gt;Compile and Doc Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#package_settings"&gt;Package Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#run_settings"&gt;Run Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://test_settings/"&gt;Test Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#classpath_dependency_settings"&gt;Dependency Management Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://www.blogger.com/#special_settings"&gt;Special Settings&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="logging_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Logging Settings&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif; font-size: small;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;logLevel, SettingKey[Level.value], log-level, The amount of logging sent to the screen.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;persistLogLevel, SettingKey[Level.value], persist-log-level, The amount of logging sent to a file for persistence.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;traceLevel, SettingKey[Int], trace-level, The amount of stack-trace to be displayed.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;persistTraceLevel, SettingKey[Int], persist-trace-level, The amount of stack-trace to be persisted (to a file).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;showSuccess, SettingKey[Boolean], show-success, If true, displays a success message after running a command successfully.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;showTiming, SettingKey[Boolean], show-timing, If true, the command success message includes the completion time.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;timingFormat, SettingKey[java.text.DateFormat], timing-format, The format used for displaying the completion time.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;extraLoggers, SettingKey[PartialFunction[ScopedKey[_], Seq[AbstractLogger]]], extra-loggers, A function that provides additional loggers for a given setting.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;logManager, SettingKey[LogManager], log-manager, The log manager, which creates Loggers for different contexts (Configurations).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;logBuffered, SettingKey[Boolean], log-buffered, True if logging should be buffered until work completes.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;div style="font-family: Times;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="project_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Project Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;
&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;projectCommand, AttributeKey[Boolean], project-command,&amp;nbsp;Marks Commands that were registered for the current Project.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;sessionSettings, AttributeKey[SessionSettings], session-settings,&amp;nbsp;Tracks current build, project, and setting modifications.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;stateBuildStructure, AttributeKey[Load.BuildStructure], build-structure,&amp;nbsp;Data structure containing all information about the build definition.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;buildStructure, TaskKey[Load.BuildStructure], build-structure,&amp;nbsp;Provides access to the build structure, settings, and streams manager.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;loadedBuild, SettingKey[Load.LoadedBuild], loaded-build, Provides access to the loaded project structure. This is the information available before, settings are evaluated.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;buildDependencies, SettingKey[BuildDependencies], build-dependencies, Definitive source of inter-project dependencies for compilation and dependency management. This is populated by default by the dependencies declared on Project instances, but may be modified. The main restriction is that new builds may not be introduced.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;appConfiguration, SettingKey[xsbti.AppConfiguration], app-configuration,&amp;nbsp;Provides access to the launched sbt configuration, including the ScalaProvider, Launcher, and GlobalLock.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;thisProject, SettingKey[ResolvedProject], this-project,&amp;nbsp;Provides the current project for the referencing scope.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;thisProjectRef, SettingKey[ProjectRef], this-project-ref,&amp;nbsp;Provides a fully-resolved reference to the current project for the referencing scope.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;configuration, SettingKey[Configuration], configuration, Provides the current configuration of the referencing scope.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;commands, SettingKey[Seq[Command]], commands, Defines commands to be registered when this project or build is the currently selected project or build.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;initialize, SettingKey[Unit], initialize, A convenience setting for performing side-effects during initialization.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;onLoad, SettingKey[PartialFunction[State, State]], on-load, Transformation to apply to the build state when the build is loaded.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;onUnload, SettingKey[PartialFunction[State, State]], on-unload, Transformation to apply to the build state when the build is unloaded.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;onLoadMessage, SettingKey[String], on-load-message, Message to display when the project is loaded.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;transformState, AttributeKey[PartialFunction[State, State]], transform-state, State transformation to apply after tasks run.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;onComplete, SettingKey[Function0[Unit]], on-complete, Hook to run when task-evaluation completes. The type of this setting is subject to change, pending the resolution of SI-2915.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="command_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Command Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;globalLogging, AttributeKey[GlobalLogging], global-logging, Provides a global Logger, including command logging.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;historyPath, SettingKey[Option[File]], history, The location where the command line history is persisted.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;shellPrompt, SettingKey[PartialFunction[State, String]], shell-prompt, The function that constructs the command propmt form the current build state.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;analysis, AttributeKey[inc.Analysis], analysis, Analysis of compilation, including dependencies and generated outputs.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;watch, SettingKey[Watched], watch, Continuous execution configuration.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;pollInterval, SettingKey[Int], poll-interval, Interval between checks for modified sources by the continuous execution command.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;watchSources, TaksKey[Seq(File)], watch-sources, Defines the sources in this project for&amp;nbsp;continuos&amp;nbsp;execution&amp;nbsp;to watch for changes.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;watchTransitiveSources, TaskKey[Seq[File]], watch-transitive-sources, Defines the sources in all projects for continuous execution to watch.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;watchingMessage, SettingKey[PartialFunction1[WatchState,String]], watching-message, The message to show when triggered execution waits for sources to change.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;triggeredMessage, SettingKey[PartialFunction[WatchState, String]], triggered-message, The message to show before triggered execution executes an action after sources change.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="path_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Path Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;baseDirectory, SettingKey[File], base-directory, The base directory. Depending on the scope this is the base directory for the build, project, configuration, or task.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;globalBaseDirectory, AttributeKey[File], global-base-direcotry, The base directory for global sbt configuration and staging.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;target, SettingKey[File], target, Main directory for files generated by the build.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;crossTarget, SettingKey[File], cross-target, Main directory for files generated by the build that are cross-built.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="source_path_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Source Path Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;sourceDirectory, SettingKey[File], source-directory, Default directory containing sources.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;sourceManaged, SettingKey[File], source-managed, Default directory for sources generated by the build.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;scalaSource, SettingKey[File], scala-source, Default Scala source directory.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;javaSource, SettingKey[File], java-source, Default Java source directory.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;sourceDirectories, SettingKey[Seq[File]], source-directories, List all source directories, both managed and unmanaged.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;unmanagedSourceDirectories, SettingKey[Seq[File]], unmanaged-source-directories, Unmanaged source directories, which contain manually created source files.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;unmanagedSources, TaskKey[Seq[File]], unmanaged-sources, Unmanaged sources, which are manually created.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;managedSourceDirectories, SettingKey[Seq[File]], managed-source-directories, Managed source directories, which contain sources generated by the build.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;mangedSources, TaskKey[Seq[File]], managed-sources, Sources generated by the build.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;managedSources, TaskKey[Seq[File], managed-sources, Sources generated by the build.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;sources, TaskKey[Seq[File]], sources, All sources, both managed and unmanaged.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="filter_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Filter Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;/div&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;includeFilter, SettingKey[FileFIlter], include-filter, Filter for including sources and resources files from default directories.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;excludeFilter, SettingKey[FileFilter], exclude-filter, Filter for excluding sources and resources files from default directories.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="resource_path_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Resource Path Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;resourceDirectory, SettingKey[File], resource-directory, Default unmanaged resource directory, used for user-defined resources.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;resourceManaged, SettingKey[File], resource-managed, Default managed resource directory, used when generating resources.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;unmanagedResourceDirectories, SettingKey[Seq[File]], unmanaged-resource-directories, Unmanaged resource directories, containing resources manually created by the user.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;unmanagedResources, TaskKey[Seq[File]], unmanaged-resources, Unmanaged resources which are manually created.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;managedResourceDirectories, SettingKey[Seq[File]], managed-resource-directories, List of managed resource directories.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;managedResources, TaskKey[Seq[File]], managed-resources, Resources generated by the build.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;resourceDirectories, SettingKey[Seq[File]], resource-directories, List of all resource directories, both managed and unmanaged.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;resources, TaskKey[Seq[File]], resources, All resource files, both managed and unmanaged.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="output_path_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Output Path Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;classDirectory, SettingKey[File], class-directory, Directory for compiled classes and copied resources.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;cacheDirectory, SettingKey[File], cache-directory, Directory used for caching task data.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;cleanFiles, SettingKey[Seq[File]], clean-files, The files to recursively delete during a clean.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;cleanKeepFiles, SettingKey[Seq[File]], clean-keep-files, Files to keep during a clean.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;crossPaths, SettingKey[Boolean], cross-paths, If true, enables, cross paths, which distinguish output directories for cross-building (cross-building means across scala versions)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;taskTempDirectory, SettingKey[File], task-temporary-directory, Directory used for temporary files for tasks that is deleted after each task execution.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="generators_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Generators Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;sourceGenerators, SettingKey[Seq[Task[Seq[File]]]], source-generators, List of tasks that generate sources.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;resourceGenerators, SettingKey[Seq[Task[Seq[File]]]], resource-generators, List of tasks that generate resources.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="compile_doc_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Compile and Doc Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;autoCompilerPlugins, SettingKey[Boolean], auto-compiler-plugins, If true, enables automatically generating -Xplugin arguments to the compiler based on the classpath for the CompilerPlugin.name configuration.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;maxErrors, SettingKey[Int], max-errors, The maximum number of errors, such as compile errors, to list.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;scalacOptions, TaskKey[Seq[String]], scalac-options, Options for the Scala compiler.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;javacOptions, TaskKey[Seq[String]], javac-options, Options for the Java compiler.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;compileOrder, SettingKey[CompileOrder.Value], compile-order, Configures the order in which Java and sources within a single compilation are compiled. Valid values are, JavaThenScala, ScalaThenJava, or Mixed.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;initialCOmmands, SettingKey[String], initialcommands, Initial commands to execute when starting up the Scala interpreter.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;cleanupCommands, SettingKey[String], cleanup-commands, Commands to execute before the Scala interpreter exits.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;compileInputs, TaskKey[Compiler.Inputs], compile-inputs, Collects all inputs needed for compilation.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;scalaHome, SettingKey[Option[File]], scala-home, If Some, defines the local Scala installation to use for compilation, running, and testing.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;scalaInstance, TaskKey[ScalaInstance], scala-instance, Defines the Scala instance to use for compilation, running, and testing.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;scalaVersion, SettingKey[String], scala-version, The version of Scala used for building.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;scalaBinaryVersion, SettingKey[String], scala-binary-version, The Scala version substring describing binary compatibility.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;crossScalaVersions, SettingKey[Seq[String]], cross-scala-versions, The versions of Scala used when cross-building&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;classpathOptions, SettingKey[ClasspathOptions], classpath-options, Configures handling of Scala classpaths.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;definedSbtPlugins, TaskKey[Set[String]], defined-sbt-plugins, The set of names of Plugin implementations defined by this project.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;sbtPlugin, SettingKey[Boolean], sbt-plugin, If true, enables adding sbt as a dependency and auto-generation of the plugin descriptor file.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;clean, TaskKey[Unit], clean, Deletes files produced by the build, such as generated sources, compiled classes, and task caches.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;console, TaskKey[Unit], console, Starts the Scala interpreter with the project classes on the classpath.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;consoleQuick, TaskKey[Unit], console-quick, Starts the Scala interpreter with the project dependencies on the classpath.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;consoleProject, TaskKey[Unit], console-project, Starts the Scala interpreter with the sbt and the build definition on the classpath and useful imports.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;compile, TaskKey[Analysis], compile, Compiles sources.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;compilers, TaskKey[Compiler.Compilers], compilers, Defines the Scala and Java compilers to use for compilation.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;compileIncSetup, TaskKey[Compiler.IncSetup], inc-compile-setup, Configurations aspects of incremental compilation.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;definesClass, TaskKey[DefinesClass], defines-class, Internal use: provides a function that&amp;nbsp;determines&amp;nbsp;whether the provided file contains a given class.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;doc, TaskKey[File], doc, Generates API documentation.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;copyResources, TaskKey[Seq[(File, File)]], copy-resources, Copies resources to the output directory.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;aggregate, SettingKey[Aggregation], aggregate, Configures task aggregation.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="package_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Package Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;packageBin, TaskKey[File], package-bin, Produces a main artifact, such as a binary jar.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;package, TaskKey[File], package, Produces the main artifact, such as a binary jar. This is typically an alias for the task that actually does the packaging.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;packageDoc, TaskKey[File], package-doc, Produces a documentation artifact, such as a jar containing API documentation.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;packageSrc, TaskKey[File], package-src, Produces a source artifact, such as a jar containing sources and resources.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;packageOptions, TaskKey[Seq[PackageOption]], package-options, Options for packaging.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;packageConfiguration, TaskKey[Package.Configuration], package-configuration, Collects all inputs needed for packaging.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;artifactPath, SettingKey[File], artifact-path, The location of a generated artifact.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;artifact, SettingKey[Artifact], artifact, Describes an artifact.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;artifactClassifier, SettingKey[Option[String]], artifact-classifier, Sets the classifier used by the default artifact definition.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;artifactName, SettingKey[PartialFunction1[Tuple3[String, ModuleID, Artifact], String], artifact-name, Function that produces the artifact name from its definition.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;mappings, TaskKey[Seq[Pair[File, String]]], mappings, Defines the mappings from a file to a path, used by packaging, for example.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;fileMappings, TaskKey[Seq[Pair[File, File]]], file-mappings, Defines the mappings from a file to a file, used for copying files, for example.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="run_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Run Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;selectMainClass, TaskKey[Option[String]], select-main-class, Selects the main class to &amp;nbsp;run.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;mainClass, TaskKey[Option[String]], main-class, Defines the main class for packaging or running.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;run, InputKey[Unit], run, Runs a main class, passing along arguments provieded on the command line.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;runMain, InputKey[Unit], run-main, Runs the main class selected by the first argument, passing the remaining arguments to the main method.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;discoveredMainClasses, TaskKey[Seq[String]], discovered-main-classes, Auto-detects main classes.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;runner, TaskKey[ScalaRun], runner, Implementation used to run a main class.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;trapExit, SettingKey[Boolean], trap-exit, If true, enables exit trapping and thread management for 'run'-like tasks. This is currently only suitable for serially-executed 'run'-like tasks.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;fork, SettingKey[Boolean], fork, If true, forks a new JVM when running. If false, runs in the same JVM as the build.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;outputStrategy, SettingKey[Option[sbt.OutputStrategy]], output-strategy, Selects how to log output when running a main class.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;connectInput, SettingKey[Boolean], connect-input, If true, connectsstandard input when running a main class forked.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;javaHome, SettingKey[Option[File]], java-home, Selects the Java installation used for compiling and forking. If None, uses the java installation running the build.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;javaOptions, TaskKey[Seq[String]], java-options, Options passed to a new JVM when forking.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="test_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Test Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;testLoader, TaskKey[ClassLoader], test-loader, Provides the class loader used for testing.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;loadedTestFrameworks, TaskKey[Map[TestFramework, Framework]], loaded-test-frameworks, Loads Framework definitions from the test loader.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;definedTests, TaskKey[Seq[TestDefinition]], defined-tests, Provides the list of defined tests.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;definedTestNames, TaskKey[Seq[String]], defined-test-names, Provides the set of defined test names.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;executeTests, taskKey[Tests.Output], execute-tests, Provies the list of defined tests.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;test, TaskKey[Unit], test, Executes all tests.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;testOnly, InputKey[Unit], test-only, Executes teh tests provided as arguments or all tests if no arguments are provided.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;testOptions, TaskKey[Seq[TestOption]], Options for running tests.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;testFrameworks, SettingKey[Seq[TestFramework]], test-frameworks, Registered, although not&amp;nbsp;necessarily&amp;nbsp;present, test frameworks.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;testListeners, TaskKey[Seq[TestReportListener]], test-listeners, Defines test listeners.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;testExecution, TaskKey[Tests.Execution], test-execution, Settings controlling test execution.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;isModule, AttributeKey[Boolean], is-module, True if the target is a module.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="classpath_dependency_settings"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Classpath/Dependency Management Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;name, SettingKey[String], name, Project name.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;normalizedName, SettingKey[String], normalized-name, Project name transformed from mixed case and spaces to lowercase and dash-separated.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;description, SettingKey[String], description, Project description.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;homepage, SettingKey[Option[URL]], homepage, Project homepage.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;startYear, SettingKey[Option[Int]], start-year, Year in which the project started.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;licenses, SettingKey[Seq[Pair[String,URL]]], licenses, Project licenses as (name, url) pairs.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;organization, SettingKey[String], organization, Organization/group ID.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;organizationName, SettingKey[String], organization-name, Organization full/formal name.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;organizationHomepage, SettingKey[Option[URL]], organization-homepage, Organization homepage.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;projectInfo, SettingKey[ModuleInfo], project-info, Addition project information like formal name, homepage, licenses, etc.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;defaultConfiguration, SettingKey[Option[Configuration]], default-configuration, Defines the configuration used when none is specified for a dependency.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;defaultConfigurationMapping, SettingKey[String], default-configuration-mapping, Defines the mapping used for a simple, unmapped configuration definition.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;products, TaskKey[Seq[File]], products, Build products that get packaged.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;productDirectories, TaskKey[Seq[File]], product-directories, Base directories of build products.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;exportJars, SettingKey[Boolean], export-jars, Determines whether the exported classpath for this project contains classes (false) or a packaged jar (true).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;exportedProducts, TaskKey[Classpath], exported-products, Build products that go on the exported classpath.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;unmanagedClasspath, TaskKey[Classpath], unmanaged-classpath, Classpath entries (deep) that are manually managed.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;unmanagedJars, TaskKey[Classpath], unmanaged-jars, Classpath entries for the current project (shallow) that are manually managed.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;managedClasspath, TaskKey[Classpath], managed-classpath, The classpath consisting of external, managed library dependencies.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;internalDependencyClasspath, TaskKey[Classpath], internal-dependency-classpath, The internal (inter-project) classpath.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;externalDependencyClasspath, TaskKey[Classpath], external-dependency-classpath, The classpath consisting of library dependencies, both managed and unmanaged.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;dependencyClasspath, TaskKey[Classpath], dependency-classpath, The classpath consisting of internal and external, managed, and unmanaged dependencies.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;fullClasspath, TaskKey[Classpath], full-classpath, The exported classpath, consisting of build products and unmanaged and managed, internal and external dependencies.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;internalConfigurationMap, SettingKey[PartialFunction1[Configuration, Configuration]], internal-configuration-map, Maps configurations to the actual configuration used to define the classpath.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;classpathConfiguration, TaskKey[Configuration], classpath-configuration, The configuration used to define the classpath.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;ivyConfiguration, TaskKey[IvyConfiguration], ivy-configuration, General dependency management (Ivy) settings, such as the resolvers and paths to use.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;ivyConfigurations, SettingKey[Seq[Configuration]], ivy-configurations, The defined configurations for dependency management. This may be different from the configurations for Project settings.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;moduleSettings, TaskKey[ModuleSettings], module-settings, Module settings, which configure a specific module, such as a project.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;unmanagedBase, SettingKey[File], unmanaged-base, The default directory for manually managed libraries.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;updateConfiguration, SettingKey[UpdateConfiguration], Configuration for resolving and retrieving managed dependencies.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;ivySbt, TaskKey[IvySbt], ivy-sbt, Provides the sbt interface to Ivy.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;ivyMOdule, TaskKey[IvySbt#Module], ivy-module, Provides the sbt interface to a configured Ivy module.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;update, TaskKey[UpdateReport], update, Resolves and optionally retrieves dependencies, producing a report.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;transitiveUpdate, TaskKey[Seq[UpdateReport]], transitive-update, UpdateReports for the internal dependencies of this project.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;updateClassifiers, TaskKey[UpdateReport], Resoves and optionally retrieves classified artifacts, such as javadocs and sources, for dependency definitions, transitively.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;transitiveClassifiers, SettingKey[Seq[String]], transitive-classifiers, List of classifiers used for transitively obtaining extra artifacts for sbt or declared dependencies.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;updateSbtClassifiers, TaskKey[UpdateReport], update-sbt-classifiers, Resolves and optionally retrieves classifiers, such as javadocs and sources, for sbt, transitively.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;publishConfiguration, TaskKey[PublishConfiguration], publish-configuration, Configuration for publishing to a repository.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;publishLocalConfiguration, TaskKey[PublishConfiguration], publish-local-configuration, Configuration for publishing to the local repository.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;deliverConfiguration, TaskKey[DeliverConfiguration], deliver-configuration, Configuration for generating the finished Ivy file for publishing.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;deliverLocalConfiguration, TaskKey[DeliverConfiguration], deliver-local-configuration, Configuration for generating teh finished Ivy file for local publishing.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;makePomConfigurations, SettingKey[MakePomConfiguration], make-pom-configuration, Configuration for generating pom.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;packagedArtifacts, TaskKey[Map[Artifact, File]], packaged-artifacts, Packages all artifacts for publishing and maps the Artifact definition to the generated file.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;publishMavenStyle, SettingKey[Boolean], publish-maven-stye, Configures whether to generate and publish a pom (true), or Ivy file(false).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;credentials, TaskKey[Seq[Credentials]], credentials, The credentials to use for updating and publishing.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;makePom, TaskKey[File], make-pom, Generates a pom for publishing when publishing Maven-style.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;deliver, TaskKey[File], deliver, Generates teh Ivy file for publishing to a repository.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;deliverLocal, TaskKey[File], deliver-local, Generates the Ivy file for publishing to the local repository.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;publish, TaskKey[Unit], publish, Publishes artifacts to a repository.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;publishLocal, TaskKey[Unit], publish-local, Publishes artifacts to the local repository.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;pomExtra, SettingKey[NodeSeq], pom-extra, Extra XML to insert into the generated POM.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;pomPostProcess, SettingKey[PartialFunction1[XNode, XNode]], pom-post-process, Transforms the generated POM.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;pomIncludeRepository, SettingKey[PartialFunction1[MavenRepository, Boolean]], pom--include-repository, Selects repositories to include in the generated POM.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;pomAllRepositories, SettingKey[Boolean], pom-all-repositories, If true, includes repositories used in module configurations in the pom repositories section. If false, only the common repositories are included.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;moduleName, SettingKey[String], module-name, The name of the current module, used for dependency management.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;version, SettingKey[String], version, The version/revision of the current module.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;isSnapshot, SettingKey[Boolean], is-snapshot, True if the version of the project is a snapshot version.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;moduleID, SettingKey[ModuleID], module-id, A dependency management descriptor. This is currently used for associating a ModuleID with a classpath entry.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;projectID, SettingKey[ModuleID], project-id, The dependency management descriptor fo rthe current module.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;externalResolvers, TaskKey[Seq[Resolver]], external-resolvers, The external resolvers for automatically managed dependencies.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;projectResolver, TaskKey[Resolver], project-resolver, Resolver that handles inter-project dependencies.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;fullResolvers, TaskKey[Seq[Resolver]], full-resolvers, Combines the project resolver, default resolvers, and user-defined resolvers.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;otherResovers, SettingKey[Seq[Resolver]], other-resolvers, Resolvers not included in the main resolver chain, such as those in module configurations.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;moduleConfigurations, SettingKey[Seq[ModuleConfiguration]], module-configurations, Defines module configurations, which override resolvers on a per-module basis.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;retrievePattern, SettingKey[String], retrieve-pattern, Pattern used to retrieve managed dependencies to the current build.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;retrieveConfiguration, SettingKey[Option[RetrieveConfiguration]], retirieve-configuration, Configures retrieving dependencies to the current build.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;ivyPaths, SettingKey[IvyPaths], ivy-paths, Configures paths used by Ivy for dependency management.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;libraryDependencies, SettingKey[Seq[ModuleID]], library dependencies, Declares managed dependencies.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;projectDependencies, TaskKey[Seq[ModuleID]], project-dependencies, Inter0project dependencies.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;ivyXML, SettingKey[NodeSeq], ivy-xml, Defines inline Ivy XML, for configuring dependency management.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;ivyScala, SettingKey[Option[IvyScala]], ivy-scala, Configures how Scala dependencies are checked, filtered, and injected.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;ivyValidate, SettingKey[Boolean], ivy-validate, Enables/disables Ivy validation of module metadata.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;ivyLoggingLevel, SettingKey[UpdateLogging.Value], ivy-logging-level, The logging level for updating.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;publishTo, SettingKey[Option[Resolver]], publish-to, The resolver to publish to.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;artifacts, SettingKey[Seq[Artifact]], artifacts, The artifact definitions for the current module.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;projectDescriptors, TaskKey[Map[ModuleRevisionId, ModuleDescriptor]], project-descriptors, Project dependency map for the inter-project resolver.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;retrieveManaged, SettingKey[Boolean], retrieve-managed, If true, enables retrieving dependencies to the current build. Otherwise, dependencies are used directly from the cache.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;managedDirectory, SettingKey[File], managed-directory, Directory to which managed dependencies are retrieved.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;classpathTypes, SettingKey[Set[String]], classpath-types, Artifact types that are included on the classpath.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;publishArtifact, SettingKey[Boolean], publish-artifact, Enables (true) or disables (false) publishing an artifact.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;packagedArtifact, TaskKey[Pair[Artifact, File]], packaged-artifact, Generates a packaged artifact, returning the Artifact and the produced File.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;checksums, SettingKey[Seq[String]], checksums, The list of checksums to generate and to verify for dependencies.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;classifiersModule, TaksKey[GetClassifiersModules], classifiersModule, NA&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;conflictWarning, SettingKey[ConflictWarning], conflict-warning, Configures warnings for conflicts in dependency management.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;autoScalaLibrary, SettingKey[Boolean], auto-scala-library, Adds a dependency on scala-library if true.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;sbtResolver, SettingKey[Resolver], sbt-resolver, Provides a resolver for obtaining sbt as a dependency.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;sbtDependency, SettingKey[ModuleID], sbt-dependency, Provides a definition for declaring the current version of sbt.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;sbtVersion, SettingKey[String], sbt-version, Provides the version of sbt. This setting should not be modified.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;sbtBinaryVersion, SettingKey[String], sbt-binary-version, Defines teh binary compatibility version substring.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;skip, TaskKey[Boolean], skip, For tasks that support it (currently only 'compile'), setting skip to true will force the task to not do its work. This exact semantics may vary by task.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=5573280442672135971" name="special_settings"&gt;&lt;/a&gt;Special Settings&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Format (key name, key type, sbt command-line key name, description)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;sessionVars, AttributeKey[SessionVar.Map], session-vars, Bindings that exist for the duration of the session.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;parallelExecution, SettingKey[Boolean], parallel-execution, Enables (true) or disables (false) parallel execution of tasks.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;tags, SettingKey[Seq[Pair[Tags.Tag, Int]]], tags, ConcurrentRestrictions.tagsKey.label&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;concurrentRestrictions, SettingKey[Seq[Tags.Rule]], concurrent-restrictions, Rules describing restrictions on concurrent task execution.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;cancelable, SettingKey[Boolean], cancelable, Enables (true) or disables (flase) the ability to interrupt task execution with CTRL+C.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;settings, TaskKey[Settings[Scope]], settings, Provides access to the project data for the build.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;streams, TaskKey[TaskStreams], streams rovides streams for logging and persisting data.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;isDummyTask, AttributeKey[Boolean], is-dummy-task, Internal: used to identify dummy tasks. sbt injects values for these tasks at the start fo task execution.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;taskDefinitionKey, AttributeKey[ScopedKey[_]], task-definition-key, Internal: used to map a task back to its ScopedKey.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;resolvedScoped, SettingKey[ScopedKey[_]], resolved-scoped, The ScopedKey for the referencing setting or task.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jackviers/~4/hzNbV0Azm-g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jackviers.blogspot.com/feeds/6314966989454253123/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://jackviers.blogspot.com/2012/01/sbt-scalas-simple-build-tool-series_16.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/6314966989454253123?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/6314966989454253123?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/jackviers/~3/hzNbV0Azm-g/sbt-scalas-simple-build-tool-series_16.html" title="SBT ~ Scala's Simple Build Tool Series, Part 2. SBT Settings" /><author><name>Jack Viers</name><uri>https://plus.google.com/111828909388123895493</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-wC52NC5Xnws/AAAAAAAAAAI/AAAAAAAAAVs/oMypUqdOfL0/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://jackviers.blogspot.com/2012/01/sbt-scalas-simple-build-tool-series_16.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUABSXk5fSp7ImA9WhRVF0g.&quot;"><id>tag:blogger.com,1999:blog-5573280442672135971.post-6181882453888935055</id><published>2012-01-10T00:56:00.001-06:00</published><updated>2012-01-16T17:49:18.725-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-16T17:49:18.725-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SBT Scala" /><title>SBT ~ Scala's Simple Build Tool Series, Part 1. What is SBT and how do I use it?</title><content type="html">&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif; font-size: large;"&gt;Scala's Simple Build Tool is an all-in-one plug-n-play build and dependency management tool. Despite the name, SBT is often criticized for being difficult to use and extend, and for marginalizing the traditional Java ecosystem build tools - Maven and Ant. I too have had some difficulty understanding the internal concepts of SBT, so I decided to write a series of blog posts on the topic, both to help myself gain a deeper understanding and to help others who are struggling with understanding the tool.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;What SBT is:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;SBT is the build tool of choice for Scala projects. Like other build tools for other languages SBT's purpose is to compile and publish applications written in Scala. It is a command-line tool written in scala. It defines both an API and a Domain Specific Language (DSL) for building and testing scala projects, managing dependencies, publishing projects, and running them locally. While the &lt;a href="https://github.com/harrah/xsbt/wiki/Getting-Started-Welcome" target="_blank"&gt;SBT Getting Started Guide&lt;/a&gt;&amp;nbsp;is helpful for getting off of the ground, it can be a little difficult to grok, and will probably take several readings to fully understand. Additionally, you are probably going to have to read the SBT source code to really get how to use SBT to its fullest potential. The &lt;a href="http://harrah.github.com/xsbt/latest/api/index.html#package" target="_blank"&gt;SBT API documentation&lt;/a&gt; is a good resource for looking up method signatures and predefined value names, but it lacks a blow-by-blow explanation of what those methods do or what they expect as parameters beyond basic type definitions for parameters and returns.&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;This can be troublesome, because many of the methods are symbols (Scala allows methods like ~= and &amp;amp;lt;&amp;amp;lt;=) or require understanding of some basic Scala concepts like defining and applying anonymous functions, strongly typed generic collections, &amp;nbsp;and traits that a newly minted user of Scala might not fully understand. As always, reading the source code is the best way to really understand an application, and I encourage you to do so. Also, as the project is open source, please feel free to contribute better documentation and examples by forking the &lt;a href="https://github.com/harrah/xsbt" target="_blank"&gt;xsbt github project&lt;/a&gt;. I hope to provide here a companion guide to SBT that will deepen my own and others' understanding of SBT, as well as some helpful hints for getting started with SBT.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;SBT Requirements:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;JVM 1.5 or later.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;The latest &lt;a href="http://www.scala-lang.org/downloads" target="_blank"&gt;scala distro&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;The latest &lt;a href="http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-tools.sbt/sbt-launch/0.11.2/sbt-launch.jar"&gt;sbt-launch.jar&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Paul Phillips' excellent &lt;a href="https://github.com/paulp/sbt-extras" target="_blank"&gt;sbt-extras&lt;/a&gt; sbt launch script.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span style="font-size: large;"&gt;Installation:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Download and install sbt-launch.jar and place it in ~/bin.&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;DO NOT put sbt-launch.jar in your CLASSPATH. You don't need to do that.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Clone&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="git://github.com/paulp/sbt-extras.git"&gt;git://github.com/paulp/sbt-extras.git&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;cd into the cloned sbt-extras repo and copy sbt to ~/bin.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;chmod u+x ~/bin/sbt&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;That's it! Congratulations, you have installed SBT.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;A Simple Hello World! project:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Now let's set up a simple Hello World scala example. SBT expects a certain &lt;a href="https://github.com/harrah/xsbt/wiki/Getting-Started-Directories" target="_blank"&gt;project structure.&lt;/a&gt; For historical reasons, this project structure is similar to the project structure used by &lt;a href="http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html" target="_blank"&gt;Apache Maven&lt;/a&gt; projects:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;lib/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&amp;lt;unmanaged jars go here&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;src/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;main/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; resources/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;files to include in project jar go here&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; scala/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;main scala source files go here&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; java/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;main Java source files go here&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;test/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; resources/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;files to be included in the project test jar go here&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; scala/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;scala test source files go here&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; java/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;Java test source files go here&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;project/&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;project build scala files go here&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Create a helloProject directory&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;cd to helloWorld&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;mkdir lib&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;mkdir -p src/main/resources&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;mkdir src/main/scala&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;mkdir src/main/java&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;mkdir -p src/test/resources&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;mkdir src/test/scala&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;mkdir src/test/java&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;mkdir project&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Now that you have defined your project structure, let's create our first .sbt build definition file. Open your favorite text editor and enter the following, including the empty lines:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;name := "helloWorld"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;version := "1.0"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;scalaVersion := "2.9.1"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Save the file as &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;helloWorld/build.sbt&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;b&gt;build.sbt Explanation&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;build.sbt &lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;is a SBT &lt;b&gt;build definition file&lt;/b&gt;. Build definition files contain Scala expressions and function definitions using the &lt;b&gt;SBT DSL&lt;/b&gt;. What you have just defined is a list of settings that SBT will use when building and running your projects.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Remember when I said that you would need to understand a few basic Scala concepts to understand SBT? Well here is where you get to learn about a few of them. Each line of the &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;build.sbt&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt; file above is Scala code. Each line is a separate Scala expression that will be applied to the default list of settings to produce a new list of settings that SBT will use to build your project. The newlines are delimiters used by SBT to separate each expression. The identifiers on each line (name, version, etc.) represent predefined sbt.Keys. &amp;nbsp;The := on each line calls the sbt.Keys.:= method with the argument string that follows it. The := returns a generically typed setting of type Setting[T]. Since all of our settings are strings, our build.sbt defines a list of Setting[String] objects.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Now, since we are using the extremely helpful sbt-extras sbt script, we need to define a &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;build.properties&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt; file in our project's &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;project&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt; directory. Fire up your favorite text editor again, and enter the following text:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;sbt.version=0.11.2&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Save the file as &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;helloWorld/project/build.properties&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;b&gt;build.properties Expanation&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;project/build.properties &lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;is used by the sbt-extras sbt script to decide which version of sbt to use to build your project. The script will download the appropriate version of sbt and execute it to build your project.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Finally, lets create a simple Scala application that will print "Hello World!". Fire up the text editor again and enter the following Scala code:&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;object Hello{&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;def main(args: Array[String]) = println("Hello World!)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Save the file in &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;helloWorld/src/main/scala/HelloWorld.scala&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Now we're ready to run sbt for the first time. Go to the console, cd into the helloWorld directory, and type sbt. After the prompt, type run. The sbt console will run, download the necessary dependencies (the correct scala version, for example) and print "Hello World!". Type exit to leave sbt.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;That's it. Now you know how to define a project to use sbt with a simple build definition. Hopefully, this helps you get started.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span style="font-size: large;"&gt;Next Article:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;The &lt;a href="http://jackviers.blogspot.com/2012/01/sbt-scalas-simple-build-tool-series_16.html"&gt;next article&lt;/a&gt; will focus on the different types of Settings provided by SBT out of the box. Happy Hacking!&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif; font-size: large;"&gt;Credits:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;harrah/xsbt. 2012 Jan 10. _root_.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp;harrah / xsbt. &amp;lt;&lt;a href="http://harrah.github.com/xsbt/latest/api/index.html#package"&gt;http://harrah.github.com/xsbt/latest/api/index.html#package&lt;/a&gt;&amp;gt;. Accessed 2012 Jan 10.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;harrah/xsbt. 2012 Jan 10. harrah/xsbt.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp;harrah/xsbt. &amp;lt;&lt;a href="https://github.com/harrah/xsbt"&gt;https://github.com/harrah/xsbt&lt;/a&gt;&amp;gt;. Acessed 2012 Jan 10.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;harrah/xsbt. 2012 Jan 10. Directory structure.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp;harrah/xsbt. &amp;lt;&lt;a href="https://github.com/harrah/xsbt/wiki/Getting-Started-Directories"&gt;https://github.com/harrah/xsbt/wiki/Getting-Started-Directories&lt;/a&gt;&amp;gt;. Accessed 2012 Jan 10.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;harrah/xsbt. 2012 Jan 10. Setup.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp;harrah/xsbt. &amp;lt;&lt;a href="https://github.com/harrah/xsbt/wiki/Getting-Started-Setup"&gt;https://github.com/harrah/xsbt/wiki/Getting-Started-Setup&lt;/a&gt;&amp;gt;. Accessed 2012 Jan 10.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;harrah/xsbt. 2012 Jan 10. Setup Notes.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp;harrah/xsbt. &amp;lt;https://github.com/harrah/xsbt/wiki/Setup-Notes&amp;gt;. Accessed 2012 Jan 10.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;harrah/xsbt. 2012 Jan 10. Welcome!.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp;harrah/xsbt. &amp;lt;&lt;a href="https://github.com/harrah/xsbt/wiki/Getting-Started-Welcome"&gt;https://github.com/harrah/xsbt/wiki/Getting-Started-Welcome&lt;/a&gt;&amp;gt;. Accessed 2012 Jan 10.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Phillips, Paul. 2012 Jan 10. paulp/sbt-extras.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp;paulp/sbt-extras. &amp;lt;&lt;a href="https://github.com/paulp/sbt-extras"&gt;https://github.com/paulp/sbt-extras&lt;/a&gt;&amp;gt;. Accessed 2012 Jan 10.&lt;/span&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;van Zyl, J. 2012 Jan 10. Introduction to the Standard Directory Layout.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp;Apache Maven Project. &amp;lt;&lt;a href="http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html"&gt;http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html&lt;/a&gt;&amp;gt;. Accessed 2012 Jan 10.&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/jackviers/~4/NLK1GqHsAJs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jackviers.blogspot.com/feeds/6181882453888935055/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://jackviers.blogspot.com/2012/01/sbt-scalas-simple-build-tool-series.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/6181882453888935055?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/6181882453888935055?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/jackviers/~3/NLK1GqHsAJs/sbt-scalas-simple-build-tool-series.html" title="SBT ~ Scala's Simple Build Tool Series, Part 1. What is SBT and how do I use it?" /><author><name>Jack Viers</name><uri>https://plus.google.com/111828909388123895493</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-wC52NC5Xnws/AAAAAAAAAAI/AAAAAAAAAVs/oMypUqdOfL0/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://jackviers.blogspot.com/2012/01/sbt-scalas-simple-build-tool-series.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEDRH06eyp7ImA9WhZbEEs.&quot;"><id>tag:blogger.com,1999:blog-5573280442672135971.post-494547569934268479</id><published>2011-06-14T10:51:00.000-05:00</published><updated>2011-06-14T10:51:15.313-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-14T10:51:15.313-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Software Design Web Application Design Sucks Patterns Layers JavaScript WebApp" /><title>Re: Why Today Web Development Sucks</title><content type="html">&lt;span class="Apple-style-span" style="background-color: white; font-family: inherit;"&gt;&lt;b&gt;Stumbled upon a post by&amp;nbsp;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;a href="http://harry.me/about" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline; vertical-align: baseline;"&gt;Harry Brundage&lt;/a&gt;&amp;nbsp;about &lt;a href="http://harry.me/2011/01/27/today-web-development-sucks/"&gt;how web development sucks today&lt;/a&gt;. His main argument stems from the fact that Single Page Applications (SPA) and web stacks tend to suffer from violations of the DRY principle. Harry makes some good points, and proposes a single language framework that would bring something like Ruby On Rails to the JavaScript domain. While this may be good, I think the problem is in the way applications are conceived of and architected. A properly architected solution can avoid most of the DRY violations Harry speaks of, and will help you to do web development that doesn't suck, today.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="background-color: white; font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;Web Development is Hard&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;The crux of the issue is that developing a web application is hard. Developing a SPA is harder. At first glance, building a web application seems simple enough: write some HTML and CSS, put in a few JavaScript DOM event hooks, create a few web services in your language of choice, expose those web services via HTTP, and &lt;i&gt;voila&lt;/i&gt;, you have a web application.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;However, that simple description isn't simple at all, is it? I mean, we have a markup language and a styling language to learn, a framework (DOM) to learn and understand, an interpreted execution language to learn and master, a server-side language to learn and master, and a stateless protocol to allow data transport between the client and server. Then we've got security, persistence, browser differences, performance, download times, SEO, caching, maintainability and scalability concerns to add on top of the prerequisite knowledge stated previously. Then we have software architecture to learn. That's a lot of knowledge for one person to learn and use well.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;Then we have the users and the client/customer to worry about. Oh, and application GUI design, because nobody wants a web application to look like some old Windows Forms application brought to the web. Animation, effects, transitions – there is more than enough to learn here for someone to specialize in their entire career and not be out of work. That's often what happens. However, acceptance and understanding of a few key concepts can help you get a handle on all of these things to become a good, general web application developer.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Learn To Think in Layers of Responsibility&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;In order to make sense out of this mess, I find it easier to lay out an application in layers of responsibility. These layer patterns are often recursive, and repeated within themselves. In its simplest terms, every layer should abide by the Unix Principles that a layer should "do one thing and do it well" and that a layer should be "written to work with other layers." I find this to be true for nearly all applications, but it especially applies to web applications and even more to SPAs.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;Nearly every web application has at least three basic layers. The first is a persistence layer. This layer is where all your data is stored between requests from the client to the server. It stores the state of your entire application. Second, is the service layer. This layer provides communication and data formatting for requests from the client to the persistence layer. Finally, the only part of the application that your users will see, comes the client layer, which transforms the data into a human usable format using HTML, CSS, and JavaScript.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;Notice that I did not use the traditional Model, View, Controller (MVC) pattern to describe the persistence layer as the Model, the service layer as the Controller, and the client as the View. Modern web applications, and SPAs in particular, have moved beyond this basic concept.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;In reality, each layer will probably have its own MVC pattern, in which the persistence layer's model is the physical data structure, its controller the mechanism for reading and writing to that structure (typically a database engine with SQL, though XML, file-system, and NoSQL map-reduce schemes are popular as well), and its view the format of the data return (often handled by your language of choice's database connection library).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;The service layer will likely have these features as well, with sections of code containing a business or domain model that is mapped to the persistence view, a controller for translating client models to and from the business model for manipulation, processing, and storage to the persistence layer, and a view section that formats data coming into and out of the client layer.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;Likewise, a client will have an in-memory (typically, disregarding cookies and local storage) model for communicating with the business layer, a controller for processing communications from the client's view and from the service layer to the client, and a view (HTML, CSS, DOM, JavaScript GUI toolkit of choice) to present the data to the client.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;The key thing is that each layer presents a view to the other layer, which processes it, and in turn presents the view to the next layer, and so on. The layers communicate with each other in ways that each layer can understand. The persistence layer has no knowledge of the client layer. The service layer need not have knowledge of how the client layer will present the data to the user, so long as the service layer provides a view that the client can interpret. The client layer need not have any explicit knowledge of the persistence layer, other than that the data must be retrieved and stored. If you learn to think in layers like this, then you can begin to separate the features and responsibilities of the layers involved, thus simplifying the responsibilities of each layer.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;DRY Web Apps&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;The key thing to avoid repeating yourself, and thus save development headaches down the road when maintaining and upgrading an application, is to separate the responsibilities of the business logic between the layers. A good way I've found to do that is to model the whole stack as a series of Objects as if the entire web stack were to be coded as a single application. Treat each layer as a Facade to its inner workings. Then you only have three interfaces to work with! A persistence interface, a service interface, and a client interface. Strongly type the parameters and returns from methods on each layer. Treat communication objects and returns from each layer as Data Transfer Objects (DTO). This separates the models on each layer, preventing interference.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Validate only when and to the degree necessary. If you want to alert users that they aren't typing in their MasterCard in the correct format, you can validate the format using regular expressions on the client side. Yes, you'll have to duplicate the regex on the server side, but could you possibly persist the regular expression somewhere in your application for use by both layers? That would prevent you from having to maintain it in two layers. Also, simply validating the format of data isn't truly validating the credit card information is it? You have to combine the Name and Billing Address as well. If you are not storing the card, there isn't any need to strip out things for SQL injection is there? And since all of this business logic has to do with validation, perhaps a single validation Facade for all your exposed services would be a good place to store all that logic?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;By using good object oriented design principles while modeling your application, you can avoid repeating yourself everywhere, and keep the business necessary to the appropriate layer in that layer, and keep the layer transparent to the other layers. The other advantage of modeling your application in a unified model is that it keeps you out of the weeds of the particular programming languages involved in the implementation of the model. Which brings me to my next point regarding&amp;nbsp;transferring&amp;nbsp;data between layers.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Be Language Agnostic&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; line-height: 21px;"&gt;When you format your views from each layer to the next, it is important to keep the format of the data to be transferred language agnostic. Don't use binary data formats that only communicate with one client side language type to transfer data into and out of the service layer. If the browsers implement Objective-C as a client-side runtime, you may want to be able to use that. JSON and XML work particularly well for transferring information because they are string based and have strict syntactical rules. HTML does not work so well for transferring information because it doesn't have strict syntactical rules. There should be NO HTML in your returns or accepted data formats. You never know what language of a public service API that developers will use to connect to your services, so keep the information in some form of a string-based implementation.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Be Consistent&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Be consistent with your data format returns. If you choose to use Comma-Separated-Values(CSV) for one service, do it for all of them. If you can't, use JSON instead. If you need references to other nodes in your data return, use XML. The key thing is to use a consistent format. You don't want to write serializers for a multitude of different possible data formats on the client side or the server side. It will lead to repeated code and a lot of difficult corner cases.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Be General and Concise&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Try to be general with your services and returns. Don't write a thousand services for every possible request. Write as few general services as you can to relate any data to any other related data and generally expose more information rather than less. The most expensive part of a web application is requesting information from another layer, so try to limit those up front with general services. If you run into trouble later on down the road or your returns begin to take too long and you've exhausted every other avenue of optimization, then create a new service.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;If Language Is a Barrier...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Use JavaScript for your server-side and client-side language of choice. If you are building a web application, JavaScript is the one language that can be used at runtime on the client-side and on the server-side. Node.js is a great place to start with server-side JavaScript. There are a ton of tutorials on getting started. &lt;a href="http://www.commonjs.org/"&gt;CommonJS&lt;/a&gt;&amp;nbsp;is an organization working to create a standardized API for writing JavaScript outside the browser. I suggest you check them out if you don't have time/feel like learning one language for the client side and one for the server side.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;b&gt;Writing web applications may suck today, but it doesn't have to tomorrow. If you use good object oriented design patterns, separate your application design into layers of responsibility, and manage your layers as if they were objects on the same system communicating with each other rather than separate systems over the wire, you can make it suck less. You can avoid some of the language syntax issues as well if you use Node.js and JavaScript on the server side. All of this is easy enough to do with enough planning, and you'll have a much happier day playing around with your application. Happy Coding!&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; line-height: 21px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/jackviers/~4/euCCAm2S_sI" height="1" width="1"/&gt;</content><link rel="related" href="http://harry.me/2011/01/27/today-web-development-sucks/" title="Re: Why Today Web Development Sucks" /><link rel="replies" type="application/atom+xml" href="http://jackviers.blogspot.com/feeds/494547569934268479/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://jackviers.blogspot.com/2011/06/re-why-today-web-development-sucks.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/494547569934268479?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/494547569934268479?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/jackviers/~3/euCCAm2S_sI/re-why-today-web-development-sucks.html" title="Re: Why Today Web Development Sucks" /><author><name>Jack Viers</name><uri>https://plus.google.com/111828909388123895493</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-wC52NC5Xnws/AAAAAAAAAAI/AAAAAAAAAVs/oMypUqdOfL0/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://jackviers.blogspot.com/2011/06/re-why-today-web-development-sucks.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MGSHo4fCp7ImA9WhZXFEo.&quot;"><id>tag:blogger.com,1999:blog-5573280442672135971.post-2236319794604848347</id><published>2011-05-03T20:10:00.000-05:00</published><updated>2011-05-03T20:10:29.434-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-03T20:10:29.434-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Flex4vsFlex3 Flex4 Flex3 Flex Performance Data spark mx" /><title>Flex 3 vs. Flex 4 Follow-Up</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;A while back I posted some performance results of the Flex 4 Spark&amp;nbsp;architecture&amp;nbsp;vs. the Flex 3 mx architecture. In that post, I stated that the Spark components created a smaller binary deliverable. &amp;nbsp;I hypothesized that this smaller binary size was due to the reusability of the Spark components and a result of fewer class definitions needed to create the code.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Some readers have suggested that the smaller application size was actually due to the default use of Runtime Shared Libraries in Flex 4 and that if I changed the Flex 3 application to use RSLs that it would be smaller. Another possible issue raised was that I used the debug version of the player to get the total runtimes.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;So I recompiled, using RSLs in the Flex 3 application, and tested again, this time using the runtime player (version 10.2.154.27)&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;. &amp;nbsp;The Flex 4 application was still about 30% smaller, at 55,866 bytes. The Flex 3 application weighed in at 80,645 bytes. Flex 4 still performed an average of 137% slower, or 384.38 ms slower on average than Flex 3.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;I also generated a link report using -link-report. The Flex 4 build link-report reported 135 total references. The Flex 3 build link-report reported 480 total references. I assume that this proves my hypothesis that the Flex 4 Spark architecture reuses more code. I could be incorrect though. I look forward to hearing from someone who has more insight into interpreting mxmlc generated link-reports than I do to confirm or correct my analysis.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Happy Coding.&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/jackviers/~4/HnPUoxKYyqc" height="1" width="1"/&gt;</content><link rel="related" href="http://jackviers.blogspot.com/2011/03/flex-3-vs-flex-4a-performance.html6ttttttttttttttttttttttttttttttttttttttttttttttt=" title="Flex 3 vs. Flex 4 Follow-Up" /><link rel="replies" type="application/atom+xml" href="http://jackviers.blogspot.com/feeds/2236319794604848347/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://jackviers.blogspot.com/2011/05/flex-3-vs-flex-4-follow-up.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/2236319794604848347?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/2236319794604848347?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/jackviers/~3/HnPUoxKYyqc/flex-3-vs-flex-4-follow-up.html" title="Flex 3 vs. Flex 4 Follow-Up" /><author><name>Jack Viers</name><uri>https://plus.google.com/111828909388123895493</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-wC52NC5Xnws/AAAAAAAAAAI/AAAAAAAAAVs/oMypUqdOfL0/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://jackviers.blogspot.com/2011/05/flex-3-vs-flex-4-follow-up.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAGSHw9cSp7ImA9Wx9aGE8.&quot;"><id>tag:blogger.com,1999:blog-5573280442672135971.post-6138014244834756583</id><published>2011-03-10T23:52:00.000-06:00</published><updated>2011-03-10T23:52:09.269-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-10T23:52:09.269-06:00</app:edited><title>Pingy - Mass Pinging Tool: Explanation - What Pingy Does?</title><content type="html">&lt;a href="http://pingymasspingtool.blogspot.com/2010/12/explanation-what-pingy-does.html?spref=bl"&gt;Pingy - Mass Pinging Tool: Explanation - What Pingy Does?&lt;/a&gt;: "In blogging, ping is an XML-RPC-based  push mechanism by which a weblog notifies a server that its content has been updated.[1]  An XML-RPC ..."&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you have a blog, and want to promote it to search engines, Pingy might just be the tool for you. I found it in the stats for my blog as a referrer. The service is free, so if you are looking for new ways to get people to your blog, you might want to check Pingy out.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jackviers/~4/JhGwfzvqEpw" height="1" width="1"/&gt;</content><link rel="related" href="http://pingymasspingtool.blogspot.com/2010/12/explanation-what-pingy-does.html?spref=bl" title="Pingy - Mass Pinging Tool: Explanation - What Pingy Does?" /><link rel="replies" type="application/atom+xml" href="http://jackviers.blogspot.com/feeds/6138014244834756583/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://jackviers.blogspot.com/2011/03/pingy-mass-pinging-tool-explanation.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/6138014244834756583?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/6138014244834756583?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/jackviers/~3/JhGwfzvqEpw/pingy-mass-pinging-tool-explanation.html" title="Pingy - Mass Pinging Tool: Explanation - What Pingy Does?" /><author><name>Jack Viers</name><uri>https://plus.google.com/111828909388123895493</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-wC52NC5Xnws/AAAAAAAAAAI/AAAAAAAAAVs/oMypUqdOfL0/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://jackviers.blogspot.com/2011/03/pingy-mass-pinging-tool-explanation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YMSXc5eSp7ImA9Wx9aGEw.&quot;"><id>tag:blogger.com,1999:blog-5573280442672135971.post-2924895036441849539</id><published>2011-03-10T22:53:00.001-06:00</published><updated>2011-03-10T22:53:08.921-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-10T22:53:08.921-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="HP Windows webOS desktop ecmascript JavaScript HTML5" /><title>Watch out .nethead!</title><content type="html">&lt;div&gt;&lt;p&gt;HP fired a shot heard round the PC world today with its announcement that webOS is coming to the desktop. Are the salad days over for Windows now that two PC manufacturers have decided to ship Linux-based operating systems on their hardware?&lt;/p&gt;
&lt;p&gt;I think the answer is yes. Today we saw a big manufacturer make the first move towards against outside operating system interference. The move also points to a future where EcmaScript, CSS3, and HTML5 rule the end-user application space. The true challenge will come from the reluctance of entrenched corporate IT infastructures built on Microsoft's solutions from end-to-end.&lt;/p&gt;
&lt;p&gt;HP is not likely to force the issue on the corporate world&amp;#8212;the computers will still be able to run Windows. However it is software that drives the adoptance of operating systems, and software developers' language/toolkit of choice that drives what software gets developed. For the first time ever, Microsoft's CLR army may be pitted against another army of developers that outnumber it, each soldier armed with better weapons in the arsenal of webkit + ecmascript than CLR + WPF/Azure/xaml can provide. Perhaps it is time to begin developing some messaging frameworks to the linux kernel from javascript and to learn webOS... Let the great battle between interpreted and compiled begin!&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jackviers/~4/-xYdyN9lMMA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jackviers.blogspot.com/feeds/2924895036441849539/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://jackviers.blogspot.com/2011/03/watch-out-nethead.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/2924895036441849539?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/2924895036441849539?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/jackviers/~3/-xYdyN9lMMA/watch-out-nethead.html" title="Watch out .nethead!" /><author><name>Jack Viers</name><uri>https://plus.google.com/111828909388123895493</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-wC52NC5Xnws/AAAAAAAAAAI/AAAAAAAAAVs/oMypUqdOfL0/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://jackviers.blogspot.com/2011/03/watch-out-nethead.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IGQ3c4fSp7ImA9WhZXFEo.&quot;"><id>tag:blogger.com,1999:blog-5573280442672135971.post-2079160740321170079</id><published>2011-03-09T18:05:00.003-06:00</published><updated>2011-05-03T20:12:02.935-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-03T20:12:02.935-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Flex4vsFlex3 Flex4 Flex3 Flex Performance Data spark mx" /><title>Flex 3 vs Flex 4...A performance comparison.</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;EDIT: I've reported this as a bug on Adboe's Jira, go there and vote for it:&amp;nbsp;&lt;a href="http://bugs.adobe.com/jira/browse/SDK-29904"&gt;http://bugs.adobe.com/jira/browse/SDK-29904&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;EDIT: I've posted a follow up to this post using the non-debug player:&amp;nbsp;&lt;a href="http://jackviers.blogspot.com/2011/05/flex-3-vs-flex-4-follow-up.html"&gt;http://jackviers.blogspot.com/2011/05/flex-3-vs-flex-4-follow-up.html&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;A week ago, a friend and respected&amp;nbsp;colleague&amp;nbsp;of mine, Paul Smith IV, mentioned in passing that Flex 4 was slower than Flex 3. He had no quantitative data to back up the claim and a quick perusal of Google didn't reveal anything either. About to embark on a large migration of a Flex 3 codebase at work, I decided that a performance comparison was in order. My findings show that the average Flex 4 component &amp;nbsp;is&amp;nbsp;163.41% slower, or 531.77 ms slower, than its direct Flex 3 counterpart, and that difference in component performance increases application startup time linearly in statically defined applications and also applies generally logarithmically as components are dynamically added to the application view. Though Flex 4 applications perform slower, they produce .swf files 82.26% smaller than Flex 3 applications. On a 512 kbps line with 10% overhead, this results in&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;88.89% faster&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;download times with Flex 4 vs. Flex 3. If the average human speed of perception is 16ms, the&amp;nbsp;perceived&amp;nbsp;performance gain using Flex 4 is 87.97% over Flex 3. Because this perceived performance only applies to initial load, the questions arise: Should Flex 4 be used in large, dynamically downloaded applications? Do the benefits of code reuse by developers, easier view management, and separation of concerns inherent in Flex 4's spark component&amp;nbsp;architecture&amp;nbsp;outweigh the performance&amp;nbsp;degradation&amp;nbsp;at runtime as compared to Flex 3?&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Test Machine Hardware and OS&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;MACHINE: &lt;/b&gt;MacBookPro5.2&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;PROCESSOR NAME:&lt;/b&gt;&amp;nbsp;Intel Core 2 Duo&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;PROCESSOR SPEED:&lt;/b&gt;&amp;nbsp;3.06 GHz&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;RAM: &lt;/b&gt;4 GB&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;OPERATING SYSTEM:&lt;/b&gt;&amp;nbsp;Mac OS X 10.6.6 (10J567)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Kernel&lt;/b&gt;:&lt;b&gt;&amp;nbsp;&lt;/b&gt;Darwin 10.6.0&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Browser and Flash Player Version&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;BROWSER VENDOR: &lt;/b&gt;Mozilla&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;BROWSER VERSION:&lt;/b&gt;&amp;nbsp;Firefox 3.6.15&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;FLASH PLAYER VERSION:&lt;/b&gt;&amp;nbsp;10.2.152.33 Debug&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Tests&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Flex3PerformanceTest&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex3PerformanceTest100&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex3PerformanceTest150&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex3PerformanceTest200&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex3PerformanceTest250&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex3PerformanceTest300&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex3PerformanceTest600&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex3PerformanceTest1000&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Flex3DynamicPerformanceTest&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Flex4PerformanceTest&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex4PerformanceTest100&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex4PerformanceTest150&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex4PerformanceTest200&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex4PerformanceTest250&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex4PerformanceTest300&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex4PerformanceTest600&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;StaticFlex4PerformanceTest1000&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Flex4DynamicPerformanceTest&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Test Source Code&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;The source code for these tests can be retrieved and viewed from &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; at&amp;nbsp;&lt;a href="https://github.com/jackcviers/Flex-3---Flex-4-Performance-Test"&gt;https://github.com/jackcviers/Flex-3---Flex-4-Performance-Test&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Test SDKs&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Flex 3:&amp;nbsp;&lt;/b&gt;&lt;a href="http://opensource.adobe.com/wiki/display/flexsdk/download?build=3.5.0.12683&amp;amp;pkgtype=1"&gt;Flex 3.5&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Flex 4:&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: Helvetica, Arial, sans-serif; line-height: 16px;"&gt;&lt;a href="http://opensource.adobe.com/wiki/display/flexsdk/download?build=4.1.0.16076&amp;amp;pkgtype=1"&gt;4.1.0.16076&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Test Methodology&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;A&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;ccording to Adobe's DevNet article &lt;a href="http://www.adobe.com/devnet/flex/articles/flex3and4_differences.html"&gt;"Differences between Flex 3 and 4"&lt;/a&gt;, the following are the Flex 3 components and their new Flex 4 counterparts, separated by a "/" character&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://www.adobe.com/devnet/flex/articles/flex3and4_differences.html#articlecontentAdobe_numberedheader_1"&gt;(original table)&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;:&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-XqMeJG10zSw/TXfszzM-f_I/AAAAAAAAABI/uwupn4oumzY/s1600/componentTable.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-XqMeJG10zSw/TXfszzM-f_I/AAAAAAAAABI/uwupn4oumzY/s1600/componentTable.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Fig 1: Flex 3 Components and Flex 4&amp;nbsp;analogues.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: black; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;For the tests to be valid, I trimmed out the components that had Flex 4&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;spark.primitives.*&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;analogues, because the Flex 4 primitives are not "components" and do not adhere to the Flex Component Lifecycle. I also used &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mx.controls.Image&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; in both Flex 3 and Flex 4 as there is no analogue in Flex 4 for the behavior of &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;mx.controls.Image&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; present in Flex 3.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;I then set up three types of tests: the first statically defined an application and each of the components in Fig. 1 above, using the Flex 3 MX Components to define the Flex 3 version of the test and the Flex 4 Spark Components to define the FLex 4 version of the test, the second using the longest running component from the first test to test if the amount of instances statically defined at author time had any effect on performance, and the third to test if the amount of runtime changed as the longest running component from test 1 was added to the stage dynamically.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Test 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Two Flex Projects were created in Flash Builder 4, one for Flex 3 and one for Flex 4. The applications' flex lifecycle events (preinitialize, initialize, creationComplete, and applicationComplete) were bound to corresponding handlers that recorded the times for each event in a dynamic AS3 &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Object&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; instance. The object instance's top level key was "testerApp". The times were stored in a secondary AS3 &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Object&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; instance nested under the "testerApp" key as "preinitializeTime", "initializeTime", "creationCompleteTime" and "applicationCompleteTime". Each component defined in mxml was bound to the flex lifecycle events and handlers for "preinitialize", "initialize", and "creationComplete". The only difference between the handlers in the test applications was to cast the Flex 4 &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;IVisualComponent&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; instances to &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;UIComponent&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt; instances to obtain the components' ids to create keys in the time recording Object instance. At "applicationComplete" the application looped through all the immediate visual children of the applications, tracing the time elapsed for each component between "initialize" and "creationComplete" along with the components' id property.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Test 2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In the same two Flex Projects, I created several more applications to test the longest running components from Test 1 above (in both cases the mx/spark Button component) defined at runtime in non-repeater statically defined component instances numbering 100, 150, 200, 250, 300, 600, and 1000. Each component and the application and measurement was bound to lifecycle events and measured as in test 1, with the results traced as in Test 1.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Test 3&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In the same two Flex Projects I created an additional application to test dynamic addition at runtime of the longest running components from Test 1 above (again, mx/spark Button components). In this version of the test I added a timer that added the instances dynamically every 10 ms for 1000 repetitions and measured the results as in the above two tests after the 1000th repetition. The timer was created in the applications' preinitialize event handler and started at application complete.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: small; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Expectations and Assumptions&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Before running the test, I expected that Flex 4 would be an improvement over Flex 3 in performance. The pattern of Separation of Concerns used in Flex 4 architecture should have and did allow framework developers to reuse more business/behavioral classes to display vastly different look and feels necessary for common control components. The visual characteristics for the skins should have been in smaller and more performant classes. All bindings should have been reduced and the code reuse for the various components should have allowed for more time testing and improving code performance. Additionally, the base classes of both frameworks existed in the previous Flex 3 release and should have been improved by the community over the time period between 3.5 and 4.1's release.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Results&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;To see the Raw Data, download the enclosed &lt;a href="https://github.com/downloads/jackcviers/Flex-3---Flex-4-Performance-Test/Flex3vsFlex4Performance.xlsx"&gt;Excel Spreadsheet&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Test 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="waffle" id="0-grid-table-quadrantscrollable"&gt;&lt;thead&gt;
&lt;tr class="header-shim"&gt;&lt;th class="header-shim row-header-shim"&gt;&lt;/th&gt;&lt;th class="header-shim" id="0-chs-1" style="width: 285px;"&gt;&lt;/th&gt;&lt;th class="header-shim" id="0-chs-4" style="width: 82px;"&gt;&lt;/th&gt;&lt;th class="header-shim" id="0-chs-5" style="width: 174px;"&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;&lt;tbody&gt;
&lt;tr id="0-r-column-head-section$1" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-1" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;Component&lt;/span&gt;&lt;/td&gt;&lt;td class="g-0-o06Lkws0"&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;Difference&lt;/span&gt;&lt;/td&gt;&lt;td class="g-0-o06Lkws0"&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;Percentage Increase&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$2" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-2" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxButton/sButton&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;592&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;147.26%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$3" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-3" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxButtonBar/sButtonBar&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;600&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;156.66%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$4" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-4" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxCheckBox/sCheckBox&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;602&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;160.53%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$5" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-5" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxComboBox/sDropDownList&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;600&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;163.04%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$6" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-6" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxHorizontalList/sHList&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;601&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;170.25%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$7" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-7" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxHScrollBar/sHScrollBar&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;585&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;167.14%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$8" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-8" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxHSlider/sHSlider&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;591&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;173.31%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$9" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-9" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxImage/mxImage&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;579&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;170.80%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$10" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-10" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxLinkBar/sLinkBar&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;571&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;171.99%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$11" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-11" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxLinkButton/linkButton&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;572&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;174.39%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$12" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-12" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxList/sList&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;571&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;175.69%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$13" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-13" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxNumericStepper/sNumericStepper&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;556&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;171.60%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$14" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-14" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxRadioButton/sRadioButton&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;520&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;163.01%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$15" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-15" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxTextArea/sTextArea&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;513&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;161.32%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$16" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-16" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxTabBar/sTabBar&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;500&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;158.73%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$17" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-17" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxTextInput/sTextInput&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;504&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;162.58%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$18" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-18" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxTileList/sTileList&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;501&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;162.66%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$19" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-19" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxToggleButtonBar/sToggleButtonBar&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;489&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;159.28%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$20" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-20" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxVScrollBar/sVScrollBar&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;493&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;162.71%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$21" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-21" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxVSlider/sVSlider&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;488&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;162.67%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$22" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-22" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxCanvas/sGroup&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;485&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;163.85%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$23" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-23" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxControlBar/sControlBar&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;483&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;163.18%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$24" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-24" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxHBox/sHGroup&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;467&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;158.31%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$25" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-25" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxVBox/sVGroup&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;467&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;158.31%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$26" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-26" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxPanel/sPanel&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;469&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;160.62%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$27" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-27" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;mxTile/sTile&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;427&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;148.78%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$28" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-28" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;Total Time Application&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;671&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;143.68%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$29" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-29" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;Total Time Components&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;13826&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;163.41%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$30" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-30" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;Total Component Classes&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;-9&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;-33.33%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$31" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-31" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;Lines of Code&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;474&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;112.86%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$32" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-32" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;Application Size&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;-453500&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;-82.26%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$33" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-33" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;Download Time&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;-8&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;-88.89%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$34" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-34" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-0-o06Lkws0"&gt;Perceived Performance&lt;/td&gt;&lt;td class="g-0-o06Lkws2"&gt;-520.5&lt;/td&gt;&lt;td class="g-0-o06Lkws3"&gt;-87.97%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$35" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-35" style="height: 19px;"&gt;&lt;/th&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$36" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-36" style="height: 19px;"&gt;&lt;/th&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$37" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-37" style="height: 19px;"&gt;&lt;/th&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$38" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-38" style="height: 19px;"&gt;&lt;/th&gt;&lt;td&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="0-r-column-head-section$39" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="0-rhs-39" style="height: 19px;"&gt;&lt;/th&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;The table above is arranged by the slowest to fastest components. The difference is the difference in component runtime in Flex 4 and Flex 3. In all cases Flex 4 was slower. However, Flex 4 produced a much smaller .swf file. I graphed the component runtimes in a bar chart:&lt;/span&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-1vhQ2PcPHbg/TXfPhzY-cII/AAAAAAAAAA4/c1V7EtrKOag/s1600/Flex3vsFlex4Components.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="220" src="https://lh5.googleusercontent.com/-1vhQ2PcPHbg/TXfPhzY-cII/AAAAAAAAAA4/c1V7EtrKOag/s400/Flex3vsFlex4Components.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Fig 2. Actual Component runtimes&amp;nbsp;from Flex 4(Red) and Flex 3(Blue).&lt;br /&gt;
mx Precedes component names in Flex 3, s precedes component names in Flex 4.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;What is particularly interesting in both the table and chart above is that Flex 4 is about 1.5 times &lt;b&gt;slower&lt;/b&gt;&amp;nbsp;at runtime than Flex 3. However, the file size produced by Flex 4 is 82% smaller despite needing 474 more lines of mxml and ActionScript 3 code to achieve. I believe that the decrease in file size is in direct correlation with the code reuse enabled by the new skinning architecture in Flex 4. As you can see, there were nine less component classes needed to create the analogous test applications.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;To calculate perceived performance, I used 16 ms as the time it takes for the human eye to perceive change. Since the download time on anything above 512Kbps based on the size of the produced Flex 4 swf was 0 seconds, I used 512Kbps to estimate download time. The Flex 4 swf downloads 9 seconds faster than the larger Flex 3 swf, an ~89% improvement in download time. This results in a human perceived performance gain in the Flex 4 application, because though it runs slower it downloads much faster and can start earlier after page load than the Flex 3 application. Because the test applications were small (an application with only 26 components, each), and because application complete time was less than the total amount of component rendering time, I decided that further testing was necessary, and decided to test the run time of statically defined Flex 4 applications vs. statically defined Flex 3 applications. To do this test, I selected the poorest performing component from each framework (the Button component) and tested them with 100, 150, 200, 250, 300, 600, and 1,000 buttons on the display list. I wanted to test all the way to 20,000, but the mxmlc build failed with not enough memory at 10,000 buttons in Flex 4.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Test 2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;For this test I was only interested in the time it took for the application to run between "preinitialize" and "applicationComplete". The results are below:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="waffle" id="1-grid-table-quadrantscrollable"&gt;&lt;thead&gt;
&lt;tr class="header-shim"&gt;&lt;th class="header-shim row-header-shim"&gt;&lt;/th&gt;&lt;th class="header-shim" id="1-chs-1" style="width: 104px;"&gt;&lt;/th&gt;&lt;th class="header-shim" id="1-chs-2" style="width: 87px;"&gt;&lt;/th&gt;&lt;th class="header-shim" id="1-chs-3" style="width: 95px;"&gt;&lt;/th&gt;&lt;th class="header-shim" id="1-chs-4" style="width: 81px;"&gt;&lt;/th&gt;&lt;th class="header-shim" id="1-chs-5" style="width: 94px;"&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;&lt;tbody&gt;
&lt;tr id="1-r-column-head-section$1" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="1-rhs-1" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-1-lk20SAs0"&gt;Application&lt;/td&gt;&lt;td class="g-1-lk20SAs0"&gt;Flex3Time&lt;/td&gt;&lt;td class="g-1-lk20SAs0"&gt;Flex4Time&lt;/td&gt;&lt;td class="g-1-lk20SAs0"&gt;Difference&lt;/td&gt;&lt;td class="g-1-lk20SAs1"&gt;Percentage&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="1-r-column-head-section$2" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="1-rhs-2" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-1-lk20SAs3"&gt;50&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;190&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;437&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;247&lt;/td&gt;&lt;td class="g-1-lk20SAs4"&gt;130.00%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="1-r-column-head-section$3" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="1-rhs-3" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-1-lk20SAs3"&gt;100&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;276&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;649&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;373&lt;/td&gt;&lt;td class="g-1-lk20SAs4"&gt;135.14%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="1-r-column-head-section$4" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="1-rhs-4" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-1-lk20SAs3"&gt;150&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;324&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;856&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;532&lt;/td&gt;&lt;td class="g-1-lk20SAs4"&gt;164.20%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="1-r-column-head-section$5" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="1-rhs-5" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-1-lk20SAs3"&gt;200&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;452&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;1112&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;660&lt;/td&gt;&lt;td class="g-1-lk20SAs4"&gt;146.02%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="1-r-column-head-section$6" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="1-rhs-6" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-1-lk20SAs3"&gt;250&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;541&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;1339&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;798&lt;/td&gt;&lt;td class="g-1-lk20SAs4"&gt;147.50%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="1-r-column-head-section$7" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="1-rhs-7" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-1-lk20SAs3"&gt;300&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;631&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;1515&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;884&lt;/td&gt;&lt;td class="g-1-lk20SAs4"&gt;140.10%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="1-r-column-head-section$8" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="1-rhs-8" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-1-lk20SAs3"&gt;600&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;1244&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;2841&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;1597&lt;/td&gt;&lt;td class="g-1-lk20SAs4"&gt;128.38%&lt;/td&gt;&lt;/tr&gt;
&lt;tr id="1-r-column-head-section$9" style="height: 19px;"&gt;&lt;th class="row-header-shim" id="1-rhs-9" style="height: 19px;"&gt;&lt;/th&gt;&lt;td class="g-1-lk20SAs3"&gt;1000&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;1885&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;4574&lt;/td&gt;&lt;td class="g-1-lk20SAs3"&gt;2689&lt;/td&gt;&lt;td class="g-1-lk20SAs4"&gt;142.65%&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;As you can see, Flex 4 again was the poorer performer. I graphed the Flex 4 and Flex 3 application run times to visualize the difference:&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-vfffhNrhb84/TXfPjt34IDI/AAAAAAAAABE/Bc1YfqgHtHM/s1600/Flex3vsFlex4StaticLongestRunningComponentPerformance.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="348" src="https://lh6.googleusercontent.com/-vfffhNrhb84/TXfPjt34IDI/AAAAAAAAABE/Bc1YfqgHtHM/s640/Flex3vsFlex4StaticLongestRunningComponentPerformance.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Fig. 3 Flex 4 vs. Flex 3 Application Runtimes with trend lines and projected period results.&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;As you can see, Flex 3 and Flex 4 run times increase linearly with the number of components added, and Flex 4's rate of increase is higher. The projected results fit the observed data very well.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;I also graphed the difference at each level:&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-3Xyhrj0suGE/TXgNnQ60u2I/AAAAAAAAABM/uF4h5h7qaSI/s1600/Flex3vsFlex4StaticLongestRunningPerformanceDifference.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="https://lh6.googleusercontent.com/-3Xyhrj0suGE/TXgNnQ60u2I/AAAAAAAAABM/uF4h5h7qaSI/s400/Flex3vsFlex4StaticLongestRunningPerformanceDifference.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Fig. 4 Difference in Flex 4 runtime vs. Flex 3 runtime by number of statically defined longest running components.&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;This difference also progressed in a generally linear manner with the number of components. It appears that the number of components defined and on the display list at author time does effect overall application performance and confirms that Flex 4 architecture does perform worse than Flex 3 when statically defined. However, in a small application like that in Test 1 the smaller file size will still result in a faster human perceived performance.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;This led me to wonder what would happen in a large, dynamic application. Would component run time increase linearly throughout the life of an application where components were added dynamically? Would dynamic addition of components occur more quickly in Flex 4 vs. Flex 3? Over time, in a large application, would runtime performance improve as a result of additional engineering for larger applications built into Flex 4's new architecture? So I wrote test number three, which builds off of tests 1 and 2. This time, I was interested in the component runtimes of dynamically added buttons, added one at a time to the display list at 10 millisecond intervals until the timer had run 1000 times. Then I would measure the component runtimes and graph the results.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Test 3&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;The results of Test 3 were much more complex than those of Tests 1 and 2. As you might expect, after the application complete event, adding components is much more expensive for a period of time, then it levels off and begins a linear performance. The result table is long, but Flex 3 performed better again. What is most interesting is the visualization of the data:&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-4vVY-OdfbGE/TXfPi4-AbXI/AAAAAAAAABA/ZdKgPJlkTfs/s1600/Flex3vsFlex4DynamicComponentAdditionPerformance.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="361" src="https://lh3.googleusercontent.com/-4vVY-OdfbGE/TXfPi4-AbXI/AAAAAAAAABA/ZdKgPJlkTfs/s640/Flex3vsFlex4DynamicComponentAdditionPerformance.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Fig 4. Flex 4 vs. Flex 3 Performance with dynamically added components.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;This chart is very complex, because the data returned from this test was very complex. The Flex 4 results perform in a generally Logarithmic manner: very high component run times until more than 60 components are added, then a steep linear trend from components 48 - 450, then a more gradual trend above 450 components. Flex 3 also is generally logarithmic and follows a similar pattern, but its trend lines start at a lower number of milliseconds than Flex 4's, and finish lower than Flex 4's: indicative of better performance in this test.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;Conclusions and Additional Points of Discussion&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;From the above three tests, Flex 4 always performs more poorly than Flex 3 at run time. Each of the spark components performed more poorly than the mx counterpart and the processing of the display list appears to have regressed from Flex 3's performance in both static and dynamic component addition. According to test 1, the Flex 4 components perform at an average of 531 milliseconds or 163.41% worse than their Flex 3 counterparts. Flex 4 produces a much smaller swf executable than Flex 3, thus improving small application's perceived performance time, but ultimately in large, dynamic applications the improvement in download time will only be noticeable for the initially statically defined views and module download times. Any components dynamically added up to the 60th component will probably cause performance issues and a jittery UI. Although Flex 3 has a bigger initial hit, it performs better throughout the lifetime of the application.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Flex 4 has better look and feel extensibility of its built-in components, meaning that you won't be spending as much time in development extending and sometimes duplicating base flex components from a business/behavior logic standpoint, but this extensibility comes at a performance cost over 1.5 times worse on average per component to the end-user.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;When we write software, we shouldn't be as concerned with how HARD that software is to write, maintain, and extend as we are about end-user experience. The web has taught us that performance should be our number one concern when writing web applications, and thus Flex 4, while easier to develop and maintain than Flex 3, and thus less likely to be broken by a poorly skilled developer, should probably be avoided until Adobe and the Flex community can bring its performance on par with Flex 3. There is no reason that the overhead of separating view from behavior should have decreased component performance by nearly double when the base codebase of both architectures should have improved from Flex 3 to Flex 4. The community of Flex Framework developers should probably be looking to improve performance in the Flex 4.5 release, rather than adding more components to the spark architecture.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;What do you think? Feel free to download the source code from Github and the spreadsheets as well. Comment back. I'd love to see your feedback.&lt;/span&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jackviers/~4/mbxHzPvrQ_E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jackviers.blogspot.com/feeds/2079160740321170079/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://jackviers.blogspot.com/2011/03/flex-3-vs-flex-4a-performance.html#comment-form" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/2079160740321170079?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/2079160740321170079?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/jackviers/~3/mbxHzPvrQ_E/flex-3-vs-flex-4a-performance.html" title="Flex 3 vs Flex 4...A performance comparison." /><author><name>Jack Viers</name><uri>https://plus.google.com/111828909388123895493</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-wC52NC5Xnws/AAAAAAAAAAI/AAAAAAAAAVs/oMypUqdOfL0/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh5.googleusercontent.com/-XqMeJG10zSw/TXfszzM-f_I/AAAAAAAAABI/uwupn4oumzY/s72-c/componentTable.png" height="72" width="72" /><thr:total>10</thr:total><feedburner:origLink>http://jackviers.blogspot.com/2011/03/flex-3-vs-flex-4a-performance.html</feedburner:origLink><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="enclosure" href="http://feedproxy.google.com/~r/jackviers/~5/tHWfZAW8-VA/Flex3vsFlex4Performance.xlsx" length="0" type="application/x-excel" /><feedburner:origEnclosureLink>https://github.com/downloads/jackcviers/Flex-3---Flex-4-Performance-Test/Flex3vsFlex4Performance.xlsx</feedburner:origEnclosureLink></entry><entry gd:etag="W/&quot;Ak4DSX44eCp7ImA9Wx9UEUw.&quot;"><id>tag:blogger.com,1999:blog-5573280442672135971.post-5685175580350155653</id><published>2011-02-07T16:49:00.000-06:00</published><updated>2011-02-07T16:49:38.030-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-07T16:49:38.030-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript ECMAScript ActionScript Constants ConstantCollections Development CSV JSON DataTransferFormats Flash Flex" /><title>Comma-Separated-Value Strings As Static Const Collections</title><content type="html">Have you ever wanted to define a constant set of specific values in ActionScript 3 or JavaScript? In ActionScript 3, you could of course use a &lt;code&gt;private&lt;i&gt;&lt;/i&gt;&lt;/code&gt;&amp;nbsp;Array variable within a class definition, implementing external access to it as a read-only getter. In JavaScript, you could implement a closure within your object structure that would return the set of values as an Array object. However, both of these implementations have a number of holes, assuming you want your set of values to truly be constant.&lt;br /&gt;
&lt;br /&gt;
The Array objects in both variants of ECMAScript-262 are mutable, meaning that they are subject to change at runtime. Additionally they are objects and thus are passed as pointers to their place in memory, meaning that any changes made on the arrays will ripple throughout your code, affecting any code storing a reference to your "constants".&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Immutability&lt;/b&gt;&lt;br /&gt;
When you truly want something to be constant, you want that something to not only never change but be impossible to change at runtime. Collections in ActionScript and JavaScript are mutable by their very nature: they are designed to change. Collections are sorted, the keys and values are shifted, pushed, and deleted, etc. Sure, you can define a variable like the following:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #dddddd;"&gt;&lt;code&gt;&lt;/code&gt;
&lt;code&gt;const MY_COLLECTION = [1,2,3,"bob"];&lt;/code&gt;

&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
However, at runtime, any references to &lt;code&gt;MY_COLLECTION&lt;/code&gt; can move &lt;code&gt;2&lt;/code&gt; before &lt;code&gt;1&lt;/code&gt;, delete &lt;code&gt;"bob"&lt;/code&gt;, etc. Not good if you intended the collection to be constant, and not good if you don't want the changes in the collection to ripple throughout your code base.&lt;br /&gt;
&lt;br /&gt;
How do we achieve the intended results? By using an immutable type to store the value.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Strings&lt;/b&gt;&lt;br /&gt;
So we need an immutable type. Strings are immutable. This means that they do not change. You might be asking, "Wait a second. I can change a string. I can call &lt;code&gt;substr()&lt;/code&gt;, push new characters on the string, concatenate it, etc. Strings can change." Actually they can't.&lt;br /&gt;
&lt;br /&gt;
Strings are not only value types, but are also immutable. When you update a string by concatenating another string to it, you are actually creating a new string from the two concatenated substrings. This substring is then placed in memory at the location of the old string, making it appear that the string has changed. The string itself has not &lt;b&gt;changed&lt;/b&gt;, it has been &lt;b&gt;replaced&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
This means they make effective constants. You use string constants all the time in ActionScript: &lt;code&gt;Event.EVENT&lt;/code&gt; is one common example, used in event addition and handling. Defining a usable collection constant is very easy as well: use a string.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Using Data Transfer Formats As String Constants&lt;/b&gt;&lt;br /&gt;
A simple string can't act like a collection can it? Ever heard of CSV? It stands for comma separated value, and it is a data transfer format. Data transfer formats are useful formats for encoding objects into a transportable form. In the case of a collection, we're talking about encoding a list of values into a string.&lt;br /&gt;
&lt;br /&gt;
For simple collections of value primitives, CSV formatted strings work quite well:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;pre style="background-color: #dddddd;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;const MY_COLLECTION = "1,2,3,'bob'";&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;A CSV doesn't have to be comma-separated, though. If you want your values to be strings that contain commas, you can use spaces, tabs, underscores, exclamation marks,&amp;nbsp;separator&amp;nbsp;tokens ("%sep%"), special unicode characters (\u10225), etc. &amp;nbsp;As long as you separate each string with the same token, all you need to do to turn the string into an array when you want to use it is to call &lt;code&gt;split()&lt;/code&gt; on the string, passing your separator token as the parameter. This will return the collection.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I particularly like using CSV constants when I need an enumeration of a few values, like "cat", "dog" or "turtle" for a list of possible pets.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;pre style="background-color: #dddddd;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;const PETS = "cat,dog,turtle";&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;This type of enumeration comes in handy when I'm validating entries in setters. For this example, I want to make sure that the value for the pet setter is either dog, cat, or turtle. Wouldn't want any rats or roaches for pets.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;pre style="background-color: #dddddd;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;public static const PETS = "cat,dog,turtle";&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;private var _pet:String;&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;public function set pet(value:String):void{&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(PETS.indexOf(value) !== -1){&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_pet = value;&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;You can use any of the &lt;code&gt;String&lt;/code&gt; object methods on your collection constant. Here I used the &lt;code&gt;indexOf()&lt;/code&gt; method to check to make sure the value was valid.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;CSVs may not cut it if you are using more complex objects. In those cases you can use other data transfer formats, like XML, JSON, or YAML. Just be sure to use the string notation of these formats, so that they are immutable. These types of constants can be rehydrated throughout your applications and libraries where they need to be used, and the resulting objects can even be changed, without affecting other portions of your application that use the same constant.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Happy coding!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jackviers/~4/kJi8ETD116A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://jackviers.blogspot.com/feeds/5685175580350155653/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://jackviers.blogspot.com/2011/02/comma-separated-value-strings-as-static.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/5685175580350155653?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/5685175580350155653?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/jackviers/~3/kJi8ETD116A/comma-separated-value-strings-as-static.html" title="Comma-Separated-Value Strings As Static Const Collections" /><author><name>Jack Viers</name><uri>https://plus.google.com/111828909388123895493</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-wC52NC5Xnws/AAAAAAAAAAI/AAAAAAAAAVs/oMypUqdOfL0/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://jackviers.blogspot.com/2011/02/comma-separated-value-strings-as-static.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4DQHs4eyp7ImA9Wx9VGEg.&quot;"><id>tag:blogger.com,1999:blog-5573280442672135971.post-951674817874138287</id><published>2011-02-04T16:02:00.000-06:00</published><updated>2011-02-04T16:02:51.533-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-04T16:02:51.533-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript ECMAScript Development Evangelism develop-once-run-anywhere" /><title>RE: You Must Learn JavaScript</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: 14px; line-height: 14px;"&gt;If you are already a .js Ninja then you know about many of the things I'm going say in this post, so you can skip it.&amp;nbsp;&lt;/span&gt;This post is a response to a post on&amp;nbsp;&lt;a href="http://thenerdary.net/articles/entry/you_must_learn_javascript"&gt;theNerdary&lt;/a&gt;&amp;nbsp;post "You Must Learn JavaScript." In the post,&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: 14px; line-height: 14px;"&gt;Kenny Meyers insists that the single most important language to learn is JavaScript, because 99% of companies will have need for it. Some comments on the post stipulated that JavaScript is important for the web developer only. This used to be true, but is no longer the case.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: 14px; line-height: 14px;"&gt;&lt;b&gt;JavaScript: Not Just For Web Developers&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;For many years, JavaScript was a simple way to do really bad things to your Geocities page. Marquee scrollers, biplane banner-like mouse cursors, auto-scrolling text, pop-up bombs, etc. Then it became a way to show and hide elements by manipulating css properties. Then came Ajax, and with it, the Ajax Revolution that has recently led to the whole HTML5 vs. Flash debate.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;While all of this was happening, some were trying to push JavaScript into new arenas – embeds in Java applications, server-side code, and even desktop APIs. Rhino was one of the first server-side JavaScript implementations I can remember. The Windows Media SDK used it as the scripting language when Windows Media Player was embedded in desktop applications.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;None of these efforts were really taken as serious applications built on JavaScript, and today it remains largely a DOM manipulation and asynchronous request language. However, the future is coming, and that future probably is JavaScript.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;Why? JavaScript engines have become fast and robust. This means JavaScript can do more in less time and do it more reliably. I liken it to the performance improvements made to the JVM that pushed Java into being the single most important language on the planet circa 2000. Another similarity with Java is that, for the most part, JavaScript is the write-once-deploy-everywhere language Java was supposed to be.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;In addition, the language is&amp;nbsp;ubiquitous. Nearly every web-site in the world has at least some JavaScript, and nearly every web developer knows at least some JavaScript. This means that there already exists an&amp;nbsp;enormous&amp;nbsp;pool of talented js developers for businesses to draw from to create great applications. The adoption rate of a language is a huge contributing factor to a language's success. &lt;a href="http://smalltalk.gnu.org/"&gt;Smalltalk&lt;/a&gt;&amp;nbsp;is a great language.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: 14px; line-height: 14px;"&gt;It influenced nearly every modern OO programming language.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: 14px; line-height: 14px;"&gt;&amp;nbsp;Hardly anybody uses it. &lt;a href="http://www.haskell.org/haskellwiki/Haskell"&gt;Haskell&lt;/a&gt; is great too, however it mainly remains relegated to academia. JavaScript, on the other hand, is used by nearly every major corporation and every major web enterprise worldwide.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;These two developments, talent pool and performance, have created a pressure for JavaScript to move beyond the browser.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;b&gt;Node.js&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;a href="http://nodejs.org/"&gt;Node&lt;/a&gt; is an evented IO framework built on V8, Google Chrome's JavaScript engine. What can you do&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;with Node? How about a highly scalable http or XMPP server. How about a database? JavaScript has invaded the server with a vengeance. Check out some of the &lt;a href="https://github.com/ry/node/wiki/modules"&gt;modules&lt;/a&gt;&amp;nbsp;available for Node. Want to build that next great thing but don't know .net, PHP, Java, or Ruby, but do know js? Give Node a try.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;b&gt;Appcelerator's Titanium&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;a href="https://github.com/marshall/titanium"&gt;Titanium&lt;/a&gt;&amp;nbsp;brings JavaScript to the desktop (and mobile) world. Why make a desktop app when you can make a web app? Because the interaction is richer and the runtime experience is constant. When you make a commercial web application you have to take into account the wide variation of platforms and bandwidths your users have access to: Windows XP/Vista/7, Linux, Mac, Safari, Chrome, Opera, IE&amp;lt;9, IE 9 beta, conqueror, etc. More often than not, you have to tame down your feature set, or support a number of different feature sets, HTML markups, and CSS presentations to reach all of your available audience. Titanium allows you to use all the new HTML5 markup and CSS3 presentation technologies without having to worry if your target audience only has access to IE6 on Windows XP. It is able to do this because it uses the WebKit rendering engine as its presentation layer. It also exposes file I/O, OS integrated drag and drop, and many of the other features that are not easily accessible to a web application. It also means that you don't need to know Flash/Flex/Air, the .net Application Framework, GTK, or Cocoa to build desktop applications that can run offline and synchronize with the cloud when connected.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;b&gt;Mobile&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;Like it or not, the world now holds the computing power of the Playstation 2 in the palm of it's hand. If you thought developing for the fragmented desktop or web world was difficult, mobile is a whole new ballgame. Android is fractured, requiring you to know every version of the framework, iPhone suffers from less prevalent fracturing, BlackBerry is still behind those in functionality, and all use different languages for their app runtimes. Though iPhone rules the mobile market, no one OS dominates the market enough to simply ignore the other mobile operating systems. The one thing that permeates all of the major players is the web, and JavaScript is the only scripting language that runs in browsers, making it the only language capable of reaching users on all platforms.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;JavaScript is the future. If you want to be a profitable 21st century software firm or a successful developer in the 21st century, you need to know JavaScript. You need to know JavaScript because it is everywhere, from the database to the iPhone. It's influence is growing. You must learn JavaScript because it is becoming this century's version of the C programming language: ubiquitous and used everywhere.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;As always comments are welcome.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 14px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;img src="http://feeds.feedburner.com/~r/jackviers/~4/AaaOCXTuDzs" height="1" width="1"/&gt;</content><link rel="related" href="http://thenerdary.net/articles/entry/you_must_learn_javascript" title="RE: You Must Learn JavaScript" /><link rel="replies" type="application/atom+xml" href="http://jackviers.blogspot.com/feeds/951674817874138287/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://jackviers.blogspot.com/2011/02/re-you-must-learn-javascript.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/951674817874138287?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/951674817874138287?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/jackviers/~3/AaaOCXTuDzs/re-you-must-learn-javascript.html" title="RE: You Must Learn JavaScript" /><author><name>Jack Viers</name><uri>https://plus.google.com/111828909388123895493</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-wC52NC5Xnws/AAAAAAAAAAI/AAAAAAAAAVs/oMypUqdOfL0/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://jackviers.blogspot.com/2011/02/re-you-must-learn-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYNSXgzcCp7ImA9Wx9VFkQ.&quot;"><id>tag:blogger.com,1999:blog-5573280442672135971.post-6723751170745971137</id><published>2011-02-02T19:22:00.001-06:00</published><updated>2011-02-02T19:23:18.688-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-02T19:23:18.688-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="FlashBuilder4 Flex compiler_options -dump-config" /><title>Flash Builder 4 -dump-config Additional Compiler Options Documentation Bug</title><content type="html">According to the Adobe Online Documentation for Flash Builder 4, when you want to &lt;a href="http://help.adobe.com/en_US/flashbuilder/using/WSbde04e3d3e6474c4-59108b2e1215eb9d5e4-8000.html#WSbde04e3d3e6474c4-59108b2e1215eb9d5e4-7ff0"&gt;dump the config file of a project&lt;/a&gt; you have to use the absolute path to define where you want the config file to be. This is incorrect.&lt;br /&gt;
&lt;br /&gt;
To dump a config, open Project-&amp;gt;Properties-&amp;gt;Flex (Library) Compiler and add the following to additional compiler options:&amp;nbsp;&lt;i&gt;&lt;b&gt;-dump-config {pathRelativeToProjectSrcFolder}/{configFileName}.xml&lt;/b&gt;&lt;/i&gt;. For me,&amp;nbsp;&lt;b style="font-style: italic;"&gt;{pathRelativeToProjectSrcFolder} &lt;/b&gt;is &lt;i style="font-weight: bold;"&gt;../ANT&lt;/i&gt;&amp;nbsp;as I store my configs for automated builds on Hudson inside each project under the project root in &lt;i style="font-weight: bold;"&gt;ANT&lt;/i&gt;. I usually name my config file the name of the project with -config.xml. So for an imaginary project called Dump, the file structure looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Dump&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;src/&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;Default Package/&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;Dump.mxml&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;libs/&lt;/li&gt;
&lt;li&gt;bin-debug/&lt;/li&gt;
&lt;li&gt;ANT/&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;dump-config.xml&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;In the Dump project, the additional compiler args to add are: &lt;i style="font-weight: bold;"&gt;-dump-config ../ANT/dump-config.xml&lt;/i&gt;.&lt;img src="http://feeds.feedburner.com/~r/jackviers/~4/rX7VTlMUHgM" height="1" width="1"/&gt;</content><link rel="related" href="http://help.adobe.com/en_US/flashbuilder/using/WSbde04e3d3e6474c4-59108b2e1215eb9d5e4-8000.html#WSbde04e3d3e6474c4-59108b2e1215eb9d5e4-7ff0" title="Flash Builder 4 -dump-config Additional Compiler Options Documentation Bug" /><link rel="replies" type="application/atom+xml" href="http://jackviers.blogspot.com/feeds/6723751170745971137/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://jackviers.blogspot.com/2011/02/flash-builder-4-documentation-bug.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/6723751170745971137?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5573280442672135971/posts/default/6723751170745971137?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/jackviers/~3/rX7VTlMUHgM/flash-builder-4-documentation-bug.html" title="Flash Builder 4 -dump-config Additional Compiler Options Documentation Bug" /><author><name>Jack Viers</name><uri>https://plus.google.com/111828909388123895493</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-wC52NC5Xnws/AAAAAAAAAAI/AAAAAAAAAVs/oMypUqdOfL0/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://jackviers.blogspot.com/2011/02/flash-builder-4-documentation-bug.html</feedburner:origLink></entry></feed>
