<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Joy of Setup</title>
	<atom:link href="http://www.joyofsetup.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.joyofsetup.com</link>
	<description>Bob Arnson's blog about setup and servicing</description>
	<lastBuildDate>Sat, 06 Mar 2010 19:24:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mercurial/TortoiseHg installer now built with WiX</title>
		<link>http://www.joyofsetup.com/2010/03/06/mercurialtortoisehg-installer-now-built-with-wix/</link>
		<comments>http://www.joyofsetup.com/2010/03/06/mercurialtortoisehg-installer-now-built-with-wix/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 19:24:21 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[Etc]]></category>
		<category><![CDATA[WiX]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2010/03/06/mercurialtortoisehg-installer-now-built-with-wix/</guid>
		<description><![CDATA[I’ve been using Mercurial, a distributed version-control system, for a while now at home. Even without using a DVCS’s distributed nature, they make a great choice for a personal version control system: They all share the common trait that they keep all version history on the local system; most centralized VCSes keep only the latest [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve been using <a href="http://mercurial.selenic.com/">Mercurial</a>, a <a href="http://en.wikipedia.org/wiki/Distributed_revision_control">distributed version-control system</a>, for a while now at home. Even without using a DVCS’s distributed nature, they make a great choice for a personal version control system: They all share the common trait that they keep all version history on the local system; most centralized VCSes keep only the latest versions locally with the historical versions kept only on the central server.</p>
<p>The latest release of Mercurial and TortoiseHg, a set of Windows shell extensions and GUI tools for Mercurial, was just released. This latest version (v1.5 and v1.0, respectively) includes both tools integrated into an MSI installer built with WiX. Previous versions were built with (the excellent but non-MSI-based) Inno Setup toolset. The WiX-based installer has the advantage of using a merge module for <a href="http://tortoisesvn.tigris.org/svn/tortoisesvn/TortoiseOverlays/version-1.0.13/Documentation.txt">TortoiseOverlays</a> (login as <strong>guest </strong>with an empty password), an icon overlay handler shared by shell extensions for several different version control systems: TortoiseHg for Mercurial, <a href="http://tortoisesvn.tigris.org/">TortoiseSVN</a> for <a href="http://subversion.apache.org/">Subversion</a>, <a href="http://www.tortoisecvs.org/">TortoiseCVS</a> for <a href="http://www.nongnu.org/cvs/">CVS</a>, <a href="http://wiki.bazaar.canonical.com/TortoiseBzr">TortoiseBZR</a> for <a href="http://bazaar.canonical.com/en/">Bazaar</a>, <a href="http://code.google.com/p/tortoisegit/">TortoiseGit</a> for <a href="http://git-scm.com/">Git</a>, and probably others.</p>
<p>As usual, I opened the TortoiseHg .msi in Orca before installing it on my workstation. I was pleasantly surprised by the low number of custom actions. I ran it through WiX v3.0’s Smoke.exe to run ICE validation; there were lots of errors and warnings but all but a few were from TortoiseHg’s use of the Visual C++ runtime libraries merge modules. (Is it ironic or just plain sad that they have so many ICE errors? Maybe both.)</p>
<p>Though we don’t use Mercurial for <a href="http://wix.sourceforge.net/">WiX</a> version control—yet, anyway—both <a href="https://sourceforge.net/apps/trac/sourceforge/wiki/Mercurial">SourceForge.net</a> and <a href="http://blogs.msdn.com/codeplex/archive/2010/01/22/codeplex-now-supporting-native-mercurial.aspx">Codeplex</a> support Mercurial for a project’s VCS.</p>
<ul>
<li><a href="http://mercurial.selenic.com/wiki/WhatsNew">Read the Mercurial v1.5 release notes.</a> </li>
<li><a href="http://bitbucket.org/tortoisehg/stable/wiki/ReleaseNotes">Read the TortoiseHg v1.0 release notes.</a> </li>
<li><a href="http://tortoisehg.bitbucket.org/download/index.html">Download the combined Mercurial and TortoiseHg installer.</a> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2010/03/06/mercurialtortoisehg-installer-now-built-with-wix/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The gazebo of solitude</title>
		<link>http://www.joyofsetup.com/2010/03/02/the-gazebo-of-solitude/</link>
		<comments>http://www.joyofsetup.com/2010/03/02/the-gazebo-of-solitude/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 04:06:43 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[App-V]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2010/03/02/the-gazebo-of-solitude/</guid>
		<description><![CDATA[Microsoft’s Giving Campaign is an annual opportunity to focus on employee charitable giving and volunteerism. They’re not limited to a single calendar month, of course, but the campaign provides the opportunity to run company-wide initiatives like a charity auction. The auction is an opportunity for employees to donate physical goods (homemade baked goods a specialty) [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.microsoft.com/about/corporatecitizenship/en-us/our-actions/in-the-community/employee-programs.aspx">Microsoft’s Giving Campaign</a> is an annual opportunity to focus on employee charitable giving and volunteerism. They’re not limited to a single calendar month, of course, but the campaign provides the opportunity to run company-wide initiatives like a <a href="http://www.microsoft.com/presspass/features/2009/dec09/12-22givingatmicrosoft.mspx">charity auction</a>. The auction is an opportunity for employees to donate physical goods (homemade baked goods a specialty) and services (for example, lunches with executives). Also common are “workplace goodies,” like reserved parking spots. (That’s especially popular in Redmond.) </p>
<p>Last October, the Giving Campaign auction had several regional offerings. One of them was the use of the “NERD treehouse” for a month as a private office. The treehouse is a small conference room on the 11th floor, above another small conference room on the 10th floor nicknamed the Jungle Room for its décor. Though I appreciate the collaborative effects of working in a bunch of cubicles, I…oh forget it, cubes are evil. No limits and I won. Even if just for a month, it’s worth it. Today was my first day in the treehouse. David, the co-creator of Lux, dubbed it <em>The Gazebo of Solitude</em> and the name stuck.</p>
<p>Here’s what it looks like from the outside:</p>
<p><a href="http://www.joyofsetup.com/wp-content/uploads/2010/03/LookingIn.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="LookingIn" border="0" alt="LookingIn" src="http://www.joyofsetup.com/wp-content/uploads/2010/03/LookingIn_thumb.jpg" width="890" height="1059" /></a> </p>
<p>Here’s one angle looking out on a snow-free but cloudy afternoon:</p>
<p><a href="http://www.joyofsetup.com/wp-content/uploads/2010/03/LookingOut.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="LookingOut" border="0" alt="LookingOut" src="http://www.joyofsetup.com/wp-content/uploads/2010/03/LookingOut_thumb.jpg" width="890" height="1059" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2010/03/02/the-gazebo-of-solitude/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>App-V v4.6 is released</title>
		<link>http://www.joyofsetup.com/2010/02/22/app-v-v4-6-is-released/</link>
		<comments>http://www.joyofsetup.com/2010/02/22/app-v-v4-6-is-released/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 02:26:54 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[App-V]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2010/02/22/app-v-v4-6-is-released/</guid>
		<description><![CDATA[App-V v4.6 has been released, marking my first shipped product on the App-V team. Lots of announcements:

App-V 4.6 is now available, plus some new Resource Kit tools 
App-V 4.6 RTM and MED-V 1.0 SP1 RC are here!! 
Office 2010 and AppV 4.6 

Also released is the Microsoft Application Virtualization SFT View tool that is part [...]]]></description>
			<content:encoded><![CDATA[<p>App-V v4.6 has been released, marking my first shipped product on the App-V team. Lots of announcements:</p>
<ul>
<li><a href="http://blogs.technet.com/appv/archive/2010/02/22/app-v-4-6-is-now-available-plus-some-new-resource-kit-tools.aspx">App-V 4.6 is now available, plus some new Resource Kit tools</a> </li>
<li><a href="http://blogs.technet.com/mdop/archive/2010/02/19/app-v-4-6-and-med-v-1-0-sp1-rc-are-here.aspx">App-V 4.6 RTM and MED-V 1.0 SP1 RC are here!!</a> </li>
<li><a href="http://blogs.technet.com/office2010/archive/2010/02/22/office-2010-and-appv-4-6.aspx">Office 2010 and AppV 4.6</a> </li>
</ul>
<p>Also released is the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=26d8bfe3-02dd-4073-95f8-594bbb12933a&amp;displaylang=en">Microsoft Application Virtualization SFT View</a> tool that is part of the App-V Resource Kit that might or might not have my fingerprints all over it.</p>
<p>MDOP is also available for MSDN and Technet subscribers for development and evaluation.</p>
<p>As always, seeing software I worked on in users’ hands is the <em>best</em> part of coding. Until it ships, it’s just source code.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2010/02/22/app-v-v4-6-is-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing Lux: Declarative unit testing for custom actions</title>
		<link>http://www.joyofsetup.com/2010/02/08/introducing-lux-declarative-unit-testing-for-custom-actions/</link>
		<comments>http://www.joyofsetup.com/2010/02/08/introducing-lux-declarative-unit-testing-for-custom-actions/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 02:18:49 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[WiX]]></category>
		<category><![CDATA[custom actions]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2010/02/08/introducing-lux-declarative-unit-testing-for-custom-actions/</guid>
		<description><![CDATA[The Cambridge-based WiX East Virtual Team have is pleased to announce its first major contribution to WiX: The Lux unit-testing framework. Lux will be available in the next weekly release of WiX v3.5.
Unit-testing custom actions with Lux
Custom actions are a frequent cause of installation failures so it&#8217;s important to test them thoroughly. Custom actions themselves [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://microsoftcambridge.com/Default.aspx">Cambridge</a>-based WiX East Virtual Team have is pleased to announce its first major contribution to WiX: The Lux unit-testing framework. Lux will be available in the next <a href="http://wix.sourceforge.net/releases/">weekly release</a> of WiX v3.5.</p>
<h3>Unit-testing custom actions with Lux</h3>
<p>Custom actions are a frequent cause of installation failures so it&#8217;s important to test them thoroughly. Custom actions themselves usually aren&#8217;t tested. The traditional testing approach is to run functional tests on an entire installer and to cover as many scenarios and platform combinations as possible. </p>
<h4>Custom action patterns</h4>
<p>WiX compiler extensions provide one way of improving custom action quality: Because compiler extensions run at build time instead of install time, they can perform all sorts of data validation and conversion on strongly-typed authoring before converting it to rows and columns of custom tables in the MSI package. </p>
<p>Immediate custom actions then read those custom tables, check current state (for example, component action state, the state of the machine itself), and serialize the resulting data into a custom action data property. Immediate custom actions are the place to do the logic that needs live state and cannot be determined at build time by a compiler extension. Because immediate custom actions run in the security context of the installing user and outside an installation transaction, they generally do not have permissions to modify the machine and if they fail, the installation simply ends without the need to do any cleanup or rollback. </p>
<p>Deferred custom actions read the custom action data property set by immediate custom actions to know what to do. One way to improve custom action reliability is to make as few decisions as possible in deferred custom actions; instead, implement all the logic in compiler extensions and immediate custom actions and have deferred custom actions simply read the custom action data property in a loop to modify the machine. </p>
<p>The WiX custom actions that modify the machine use this pattern. For example, XmlConfig authoring is validated by the WixUtilExtension compiler extension and translated to rows and columns in the XmlConfig table. The SchedXmlConfig immediate custom action reads the XmlConfig table, constructs a custom action data property based on the XmlConfig table and machine&#8217;s state (including checking component state and storing existing file data to support rollback), then schedules the ExecXmlConfig deferred custom action to execute the XML changes and the ExecXmlConfigRollback rollback custom action to roll back the changes. </p>
<h4>Testing with Lux</h4>
<p>Lux is a WiX extension (and associated tools) that let you write data-driven unit tests for your custom actions. The executive summary: Lux runs your immediate custom actions then validates they set properties to the values you expect. </p>
<p>While it&#8217;s a simple approach, if your custom actions are factored as discussed above, validating the properties set by immediate custom actions can validate all the interaction between your custom actions, the MSI package, and MSI itself. </p>
<p>If your custom actions aren&#8217;t factored as discussed&#8211;for example, if your deferred custom actions expect only an installation directory and have logic to construct file paths from it&#8211;then it&#8217;s likely that your immediate custom actions don&#8217;t have a lot of logic that&#8217;s useful to test. </p>
<p>Lux does not help you test the custom action code that actually modifies the machine; for that, continue to use other unit-test frameworks and automated tests. By working only with immediate custom actions, Lux can let MSI run the custom actions as-is, eliminating the need to write custom <a href="http://xunitpatterns.com/Test%20Double.html">test doubles</a> for the MSI API. Lux runs from a per-user package so unless you run the tests from an elevated command prompt, none of the custom actions get elevated privileges and therefore cannot modify the machine. </p>
<p>Here&#8217;s how Lux works: </p>
<ol>
<li>You write your unit tests using XML in WiX source files. </li>
<li>The Lux extension converts the XML to a table in a test .msi package. </li>
<li>The Lux custom action runs after all other immediate custom actions and evaluates your unit tests. </li>
</ol>
<h3>Authoring unit tests</h3>
<p>Lux supports the following unit tests:</p>
<ul>
<li>Property values </li>
<li>Expressions </li>
<li>Multi-value properties </li>
<li>Name/value-pair properties </li>
</ul>
<p>Note that you should always author unit tests in fragments separate from your custom action authoring or any other product authoring. If you mix unit tests with other authoring, WiX includes the unit-test data in your &quot;real&quot; installers.</p>
<h4>Property value tests</h4>
<p>A simple test lets you specify a property to test, a value to test against, and the operator to compare with (which defaults to &quot;equal&quot;).</p>
<pre>&lt;Fragment&gt;
  &lt;lux:UnitTest CustomAction=&quot;TestCustomActionSimple&quot; Property=&quot;SIMPLE&quot; Value=&quot;[INSTALLLOCATION]&quot; Operator=&quot;equal&quot; /&gt;
&lt;/Fragment&gt;</pre>
<p>When the test runs, Lux compares the value of the SIMPLE property against the (formatted) value [INSTALLLOCATION]. If the two match (because the operator is &quot;equal&quot;), the test passes. Legal values of the Operator attribute are:</p>
<dl>
<dt><dfn>equal</dfn></dt>
<dd>(Default) Compares Property to Value and succeeds if they are equal. </dd>
<dt><dfn>notEqual</dfn></dt>
<dd>Compares Property to Value and succeeds if they are NOT equal. </dd>
<dt><dfn>caseInsensitiveEqual</dfn></dt>
<dd>Compares Property to Value and succeeds if they are equal (ignoring case). </dd>
<dt><dfn>caseInsensitiveNotEqual</dfn></dt>
<dd>Compares Property to Value and succeeds if they are NOT equal (ignoring case). </dd>
</dl>
<h4>Test conditions</h4>
<p>Conditions let you validate code paths in your custom action. For example, if your custom action behaves differently on Windows XP than it does on Windows Vista and later, you can create two tests with mutually exclusive conditions:</p>
<pre>&lt;Fragment&gt;
  &lt;lux:UnitTest CustomAction=&quot;TestCustomActionSimple&quot; Property=&quot;SIMPLE&quot; Value=&quot;[INSTALLLOCATION]&quot;&gt;
    &lt;lux:Condition&gt;&lt;![CDATA[VersionNT &lt; 600]]&gt;&lt;/lux:Condition&gt;
  &lt;/lux:UnitTest&gt;
  &lt;lux:UnitTest CustomAction=&quot;TestCustomActionSimple&quot; Property=&quot;SIMPLE&quot; Value=&quot;[INSTALLLOCATION]&quot;&gt;
    &lt;lux:Condition&gt;&lt;![CDATA[VersionNT &gt;= 600]]&gt;&lt;/lux:Condition&gt;
  &lt;/lux:UnitTest&gt;
&lt;/Fragment&gt;</pre>
<p>If a test has a condition, the test runs only if its condition is true.</p>
<h4>Expression tests</h4>
<p>Expression tests let you test any valid MSI expression. If the expression is true, the test passes. If the expression is false or invalid, the test fails.</p>
<pre>&lt;Fragment&gt;
  &lt;lux:UnitTest CustomAction=&quot;TestCustomActionSimple&quot;&gt;
    &lt;lux:Expression&gt;NOT MsiSystemRebootPending AND SIMPLE&lt;/lux:Expression&gt;
  &lt;/lux:UnitTest&gt;
&lt;/Fragment&gt;</pre>
<h4>Multi-value property tests</h4>
<p>Because deferred custom actions can access only a single custom-action data property, custom actions that need more than one piece of data encode it in a single string. One way is to have the immediate custom action separate multiple elements with a known separator character, then have the deferred custom action split the string at those separate characters. Lux supports such separators using the ValueSeparator and Index attributes.</p>
<pre>&lt;Fragment&gt;
  &lt;lux:UnitTest CustomAction=&quot;TestCustomActionMultiValue&quot; Property=&quot;MULTIVALUE&quot; ValueSeparator=&quot;*&quot;&gt;
    &lt;lux:Condition&gt;VersionNT&lt;/lux:Condition&gt;
    &lt;lux:UnitTest Index=&quot;0&quot; Value=&quot;1&quot; /&gt;
    &lt;lux:UnitTest Index=&quot;1&quot; Value=&quot;[INSTALLLOCATION]&quot;&gt;
      &lt;lux:Condition&gt;NOT Installed&lt;/lux:Condition&gt;
    &lt;/lux:UnitTest&gt;
    &lt;lux:UnitTest Index=&quot;2&quot; Value=&quot;WIXEAST&quot; /&gt;
  &lt;/lux:UnitTest&gt;
&lt;/Fragment&gt;</pre>
<p>A condition under the parent UnitTest element applies to all individual unit tests. Override it with a Condition child element.</p>
<h4>Name/value-pair property tests</h4>
<p>Another way of providing multiple values to a deferred custom action is to combine name/value pairs into a single string. Lux supports name/value-pair properties using the NameValueSeparator and Index attributes.</p>
<pre>&lt;Fragment&gt;
  &lt;lux:UnitTest CustomAction=&quot;TestCustomActionNameValuePairs&quot; Property=&quot;NAMEVALUEPAIRS&quot; NameValueSeparator=&quot;#&quot;&gt;
    &lt;lux:UnitTest Index=&quot;InstallationRoot&quot; Value=&quot;[INSTALLLOCATION]&quot; /&gt;
    &lt;lux:UnitTest Index=&quot;Developers&quot; Operator=&quot;caseInsensitiveNotEqual&quot; Value=&quot;WIXEAST&quot; /&gt;
  &lt;/lux:UnitTest&gt;
&lt;/Fragment&gt;</pre>
<h3>Building test packages</h3>
<p>Lux unit tests run from a minimal package that includes just your unit tests and the resources they need to run. Because Lux runs only immediate custom actions, it doesn&#8217;t need a full, per-machine package that includes all the files and other resources to be installed. Such a minimal package saves build time but does require that your WiX source code be well modularized with fragments. For example, you should always author unit tests in fragments separate from any other authoring. If you mix unit tests with other authoring, WiX includes the unit-test data in your &quot;real&quot; installers. Likewise, any other WiX authoring included in unit-test fragments is included in test packages.</p>
<p>Lux comes with a tool that simplifies the creation of test packages. Its name is lux.exe. To use lux.exe: </p>
<ol>
<li>Compile the source file containing your unit tests. </li>
<li>Run lux.exe on the .wixobj file and specify a source file for the test package. </li>
<li>Compile the test package source. </li>
<li>Link the test package .wixobj with the unit tests .wixobj. </li>
</ol>
<p>For example:</p>
<pre>candle -ext WixLuxExtension CustomActions.wxs
lux CustomActions.wixobj -out LuxSample1_test.wxs
candle -ext WixLuxExtension LuxSample1_test.wxs
light -ext WixLuxExtension LuxSample1_test.wixobj CustomActions.wixobj -out LuxSample1_test.msi</pre>
<p>Lux also includes an MSBuild task and .targets file to let you build test packages from the same .wixproj you use to build your installers. To build a test package, build the BuildTestPackage target using MSBuild 3.5:</p>
<pre>%WINDIR%\Microsoft.NET\Framework\v3.5\MSBuild.exe /t:BuildTestPackage</pre>
<h3>Running unit tests</h3>
<p>After building the test package, you can run it with logging enabled to capture test results:</p>
<pre>msiexec /l test1.log /i bin\Debug\LuxSample1_test.msi</pre>
<p>Search the log for <b>WixRunImmediateUnitTests</b> to see test results and other logging from the Lux custom action.</p>
<h4>Nit: The Lux test runner</h4>
<p>Lux also includes Nit, a console program that monitors the logging messages emitted by unit tests and reports success or failure. To use Nit on your test packages, just specify their filenames as arguments to nit.exe. For example:</p>
<pre>nit LuxSample1_test.msi</pre>
<p>Lux also lets you run Nit on your test packages from the same .wixproj you use to build your installers. To run a test package under Nit, build the Test target using MSBuild 3.5:</p>
<pre>%WINDIR%\Microsoft.NET\Framework\v3.5\MSBuild.exe /t:Test</pre>
<p>The test package will be built before the tests are run, if necessary. The output looks like the following, with failing tests highlighted in red as build errors:</p>
<pre>Test:
  Microsoft (R) Windows Installer Xml Unit Test Runner version 3.5.1204.0
  Copyright (C) Microsoft Corporation. All rights reserved.

  Test luxB21F0D12E0701DBA30FFB92A532A5390 passed: Property 'SIMPLE' matched expected value '[INSTALLLOCATION]'.
  Test TestConditionBeforeVista passed: Property 'SIMPLE' matched expected value '[INSTALLLOCATION]'.
  Test TestConditionVistaOrLater passed: Property 'SIMPLE' matched expected value '[INSTALLLOCATION]'.
  Test TestExpressionTruth passed: Expression 'NOT MsiSystemRebootPending AND SIMPLE' evaluated to true.
nit.exe : error NIT8103: Test luxA6D27EC5903612D7F3786FF71952E314 failed: Property 'MULTIVALUE' expected value '2' but actual value was '1'.
  Test lux210257649C16AFA33793F1CDDF575505 passed: Property 'MULTIVALUE' matched expected value '[INSTALLLOCATION]'.
nit.exe : error NIT8103: Test lux402940A90D3ADAD181D599AB8C260FA0 failed: Property 'MULTIVALUE' expected value 'xxxWIXEAST' but actual value was 'WIXEAST'.
  Test lux453EC8DB458A8F66F0D22970CFF2AE99 passed: Property 'NAMEVALUEPAIRS' matched expected value '[INSTALLLOCATION]'.
  Test lux20CB4F88795F22D15631FD60BA03AFEB passed: Property 'NAMEVALUEPAIRS' matched expected value 'WIXWEST'.
nit.exe : error NIT8102: 2 tests failed. 7 tests passed.
Done Building Project &quot;C:\Delivery\Dev\wix35\src\lux\samples\LuxSample1\LuxSample1.wixproj&quot; (Test target(s)) -- FAILED.

Build FAILED.

&quot;C:\Delivery\Dev\wix35\src\lux\samples\LuxSample1\LuxSample1.wixproj&quot; (Test target) (1) -&gt;
(Test target) -&gt;
  nit.exe : error NIT8103: Test luxA6D27EC5903612D7F3786FF71952E314 failed: Property 'MULTIVALUE' expected value '2' but actual value was '1'.
  nit.exe : error NIT8103: Test lux402940A90D3ADAD181D599AB8C260FA0 failed: Property 'MULTIVALUE' expected value 'xxxWIXEAST' but actual value was 'WIXEAST'.
  nit.exe : error NIT8102: 2 tests failed. 7 tests passed.

    0 Warning(s)
    3 Error(s)

Time Elapsed 00:00:07.87</pre>
<h3>FAQ</h3>
<dl>
<dt>Are these really unit tests? They look a lot like <a href="http://fit.c2.com/">Fit tests</a>. </dt>
<dd>Fit tests are tabular and data-driven, so they have a lot in common with Lux&#8217;s unit tests. But fit tests are focused on high-level outputs, whereas unit tests are low-level developer tests. </dd>
<dt>Using the custom action code as-is sounds good, but are there any limitations with that approach? </dt>
<dd>Yes. Because you are running the actual custom action, any code paths that rely on machine state reflect the state of the machine you run the tests on. For example, code that has different behavior on different versions of Windows runs only one way, just like it does in a normal installer. You can add debug code that looks for the presence of the WIXLUXTESTPACKAGE property; it&#8217;s set to 1 in a test package. </dd>
<dt>I have unit tests that fail because directory properties are being returned as empty strings. Why? </dt>
<dd>The most likely cause is that your directories are defined as children of your installer&#8217;s Product element. Lux.exe builds its own Product element to product a minimal test package, so none of the resources defined in your Product are available to the unit tests. The simplest solution is to move those resources to their own Fragment. </dd>
<dt>Do I have to write my custom actions in C++? </dt>
<dd>No, Lux works with any immediate custom actions, regardless of the language they&#8217;re written in, including MSI type 51 property-setting custom actions. </dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2010/02/08/introducing-lux-declarative-unit-testing-for-custom-actions/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visual Studio 2010 RC now available</title>
		<link>http://www.joyofsetup.com/2010/02/08/visual-studio-2010-rc-now-available/</link>
		<comments>http://www.joyofsetup.com/2010/02/08/visual-studio-2010-rc-now-available/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 02:16:41 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[Etc]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2010/02/08/visual-studio-2010-rc-now-available/</guid>
		<description><![CDATA[If you’re an MSDN subscriber, go get it from MSDN Downloads.
]]></description>
			<content:encoded><![CDATA[<p>If you’re an MSDN subscriber, go get it from <a href="https://msdn.microsoft.com/en-us/subscriptions/securedownloads/default.aspx">MSDN Downloads</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2010/02/08/visual-studio-2010-rc-now-available/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Major upgrades now easier than ever</title>
		<link>http://www.joyofsetup.com/2010/01/16/major-upgrades-now-easier-than-ever/</link>
		<comments>http://www.joyofsetup.com/2010/01/16/major-upgrades-now-easier-than-ever/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 05:14:30 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[WiX]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2010/01/16/major-upgrades-now-easier-than-ever/</guid>
		<description><![CDATA[I’m a fan of major upgrades, which I’ve written about before. For 10 lines of XML, you get free and easy upgrades without having to deal with the costs of patching and minor upgrades:
&#60;!&#8211; Major upgrade &#8211;&#62;    &#60;Upgrade Id=&#34;$(var.UpgradeCode)&#34;&#62;     &#160;&#160;&#160; &#60;UpgradeVersion Minimum=&#34;$(var.ProductVersion)&#34; OnlyDetect=&#34;yes&#34; Property=&#34;NEWERVERSIONDETECTED&#34; /&#62;    [...]]]></description>
			<content:encoded><![CDATA[<p>I’m a fan of major upgrades, which I’ve written <a href="http://www.joyofsetup.com/2008/12/30/paying-for-upgrades/">about</a> <a href="http://www.joyofsetup.com/2008/12/29/neither-more-nor-less/">before</a>. For 10 lines of XML, you get free and easy upgrades without having to deal with the <a href="http://www.joyofsetup.com/2008/12/30/paying-for-upgrades/">costs of patching</a> and minor upgrades:</p>
<blockquote><p>&lt;!&#8211; Major upgrade &#8211;&gt;    <br />&lt;Upgrade Id=&quot;$(var.UpgradeCode)&quot;&gt;     <br />&#160;&#160;&#160; &lt;UpgradeVersion Minimum=&quot;$(var.ProductVersion)&quot; OnlyDetect=&quot;yes&quot; Property=&quot;NEWERVERSIONDETECTED&quot; /&gt;     <br />&#160;&#160;&#160; &lt;UpgradeVersion Minimum=&quot;1.0.0&quot; IncludeMinimum=&quot;yes&quot; Maximum=&quot;$(var.ProductVersion)&quot; IncludeMaximum=&quot;no&quot; Property=&quot;OLDERVERSIONBEINGUPGRADED&quot; /&gt;     <br />&lt;/Upgrade&gt;     </p>
<p>&lt;InstallExecuteSequence&gt;     <br />&#160;&#160;&#160; &lt;RemoveExistingProducts After=&quot;InstallValidate&quot; /&gt;     <br />&lt;/InstallExecuteSequence&gt;     </p>
<p>&lt;Condition Message=&quot;!(loc.NewerVersionDetected)&quot;&gt;     <br />&#160;&#160;&#160; NOT NEWERVERSIONDETECTED     <br />&lt;/Condition&gt;     </p></blockquote>
<p>Easy enough to cut and paste but it isn’t exactly what I would call <em>expressive</em>—the intent behind the code isn’t obvious, though it can be deduced fairly easily.</p>
<p>WiX can do better.</p>
<p>So, like the last time I <a href="http://www.joyofsetup.com/2009/12/31/simplifying-wix-component-authoring/">tweaked the WiX language</a>, it’s time for a new feature: The <a href="http://wix.sourceforge.net/manual-wix3/wix_xsd_majorupgrade.htm">MajorUpgrade</a> element encapsulates the most common options for major upgrades and creates the appropriate rows in the <a href="http://msdn.microsoft.com/en-us/library/aa372379%28VS.85%29.aspx">Upgrade</a> and <a href="http://msdn.microsoft.com/en-us/library/aa369752%28VS.85%29.aspx">LaunchCondition</a> tables and provides a simpler way of specifying the scheduling of the <a href="http://msdn.microsoft.com/en-us/library/aa371197%28VS.85%29.aspx">RemoveExistingProducts</a> action. For example, here’s the simplest use:</p>
<blockquote><p>&lt;MajorUpgrade DowngradeErrorMessage=&quot;Can&#8217;t downgrade.&quot; /&gt;</p>
</blockquote>
<p>Downgrades are blocked by default, which requires you to specify a message for the launch condition message.</p>
<p>MajorUpgrade is a child of the <a href="http://wix.sourceforge.net/manual-wix3/wix_xsd_product.htm">Product</a> element and automatically picks up the UpgradeCode attribute from its parent. That avoids the common duplication of the upgrade code in the <a href="http://wix.sourceforge.net/manual-wix3/wix_xsd_upgrade.htm">Upgrade</a> element.</p>
<p>MajorUpgrade has the following attributes:</p>
<table border="1" cellspacing="0" cellpadding="6">
<tbody>
<tr>
<td valign="top">AllowDowngrades</td>
<td valign="top">Downgrades are blocked by default.</td>
</tr>
<tr>
<td valign="top">DowngradeErrorMessage</td>
<td valign="top">The launch condition message displayed when a downgrade is detected.</td>
</tr>
<tr>
<td valign="top">IgnoreRemoveFailure</td>
<td valign="top">Uninstall failures are upgrade failures by default.</td>
</tr>
<tr>
<td valign="top">MigrateFeatures</td>
<td valign="top">Manual control over the features installed in the newer product.</td>
</tr>
<tr>
<td valign="top">RemoveFeatures</td>
<td valign="top">Manual control over the features removed from the older product.</td>
</tr>
<tr>
<td valign="top">Schedule</td>
<td valign="top">When to schedule the <a href="http://msdn.microsoft.com/en-us/library/aa371197%28VS.85%29.aspx">RemoveExistingProducts</a> action.</td>
</tr>
</tbody>
</table>
<p>For details, see the <a href="http://wix.sourceforge.net/manual-wix3/wix_xsd_majorupgrade.htm">MajorUpgrade</a> element documentation. The feature ships in <a href="http://wix.sourceforge.net/releases/3.5.1315.0/">WiX v3.5.1315.0</a> and <a href="http://wix.sourceforge.net/releases/">later</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2010/01/16/major-upgrades-now-easier-than-ever/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Simplifying WiX component authoring</title>
		<link>http://www.joyofsetup.com/2009/12/31/simplifying-wix-component-authoring/</link>
		<comments>http://www.joyofsetup.com/2009/12/31/simplifying-wix-component-authoring/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 18:53:35 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[WiX]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2009/12/31/simplifying-wix-component-authoring/</guid>
		<description><![CDATA[In the latest in the ongoing series of simplifying the WiX language, I recently added two new defaults to the WiX compiler:

The Component/@Guid attribute value defaults to “*” so that if you don’t specify it, WiX generates a stable component GUID at link time. Generated component GUIDs are available as long as your component:

Does not [...]]]></description>
			<content:encoded><![CDATA[<p>In the latest in the ongoing series of <a href="http://www.joyofsetup.com/2007/12/07/simplifying-the-wix-v3-language/" mce_href="http://www.joyofsetup.com/2007/12/07/simplifying-the-wix-v3-language/">simplifying the WiX language</a>, I recently added two new defaults to the WiX compiler:</p>
<ul>
<li>The <a href="http://wix.sourceforge.net/manual-wix3/wix_xsd_component.htm" mce_href="http://wix.sourceforge.net/manual-wix3/wix_xsd_component.htm">Component</a>/@Guid attribute value defaults to “*” so that if you don’t specify it, WiX generates a stable component GUID at link time. Generated component GUIDs are available as long as your component:
<ul>
<li>Does not contain an <a href="http://wix.sourceforge.net/manual-wix3/wix_xsd_odbcdatasource.htm" mce_href="http://wix.sourceforge.net/manual-wix3/wix_xsd_odbcdatasource.htm">ODBCDataSource</a> element. (ODBwhat?)</li>
<li>Has only one file.</li>
<li>Has only registry values.</li>
</ul>
</li>
<li>The Component/@Id attribute value defaults to the id of the keypath resource. The component itself cannot be the keypath for this to work (obviously, there’s no id for it to default to).</li>
</ul>
<p>These changes will appear in the first <a href="http://wix.sourceforge.net/releases/" mce_href="http://wix.sourceforge.net/releases/">weekly release</a> of WiX v3.5 in 2010.</p>
<p>Combine the two features and a single-file component can now be as simple as:</p>
<blockquote><p>&lt;Component&gt;<br />
&nbsp;&nbsp;&lt;File Source=&#8221;foo.exe&#8221; /&gt;<br />
&lt;/Component&gt;</p>
</blockquote>
<p>In this case, the component’s id will be “foo.exe” because the File element’s default for its Id is the filename portion of the Source attribute. Call it hygenic double-dip defaulting.</p>
<p>A multi-file component isn’t suitable for generated GUIDs, so it requires an explicit GUID but can still take advantage of default component ids:</p>
<blockquote><p>&lt;Component Guid=&#8221;{A5B56773-5E26-4C5F-AC51-C2470C3658AF}&#8221;&gt;<br />
&nbsp;&nbsp;&lt;File Source=&#8221;foo.dll&#8221; /&gt;<br />
&nbsp;&nbsp;&lt;File Source=&#8221;bar.dll&#8221; /&gt;<br />
&nbsp;&nbsp;&lt;File Source=&#8221;bob.exe&#8221; KeyPath=&#8221;yes&#8221; /&gt;<br />
&lt;/Component&gt;</p>
</blockquote>
<p>In this case, the component’s id will be “bob.exe” from the keypath File element’s default Id. Note that unless you use the generated GUID default and live within its rules, you must specify an explicit KeyPath attribute value of “yes” on the resource whose id you want to be the component id.</p>
<p>We can’t eliminate the <a href="http://www.joyofsetup.com/2008/12/30/paying-for-upgrades/" mce_href="http://www.joyofsetup.com/2008/12/30/paying-for-upgrades/">dread component rules</a> but we can make it simpler to live within them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2009/12/31/simplifying-wix-component-authoring/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WiX v3.5 supports Visual Studio 2010 beta 2</title>
		<link>http://www.joyofsetup.com/2009/10/30/wix-v3-5-supports-visual-studio-2010-beta-2/</link>
		<comments>http://www.joyofsetup.com/2009/10/30/wix-v3-5-supports-visual-studio-2010-beta-2/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 21:26:29 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[WiX]]></category>
		<category><![CDATA[WiX highlights]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2009/10/30/wix-v3-5-supports-visual-studio-2010-beta-2/</guid>
		<description><![CDATA[So that the WiX Working Group can enjoy Hallowe’en on Saturday, WiX v3.5.1030.0 with support for Visual Studio 2010 beta 2 was released today. You can get the bits at http://wix.sourceforge.net/releases/3.5.1030.0/. This isn’t a full beta release – Burn is still in active development and isn’t ready for prime-time use yet – but we want [...]]]></description>
			<content:encoded><![CDATA[<p>So that the WiX Working Group can enjoy <a href="http://en.wikipedia.org/wiki/Halloween">Hallowe’en</a> on Saturday, <a href="http://wix.sourceforge.net/releases/3.5.1030.0/">WiX v3.5.1030.0</a> with support for Visual Studio 2010 beta 2 was released today. You can get the bits at <a title="http://wix.sourceforge.net/releases/3.5.1030.0/" href="http://wix.sourceforge.net/releases/3.5.1030.0/">http://wix.sourceforge.net/releases/3.5.1030.0/</a>. This isn’t a full beta release – Burn is still in active development and isn’t ready for prime-time use yet – but we want to support everyone using the beta 2 release of <a href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx">Visual Studio 2010</a>, which shipped last week.</p>
<p>Candy, Visual Studio program manager and WiX Working Group babysitter/cat-herder, had this to say about the features in this release:</p>
<blockquote><p>Visual Studio 2010 Beta shipped on 10/21. With the team’s hard work and agility, we were able to release the WiX support on VS2010 Beta 2 today! Here are some highlights for this release:</p>
<ul>
<li><b>Extension Manager Integration</b> – Now you can download and install WiX directly from within the VS IDE by launching Extension Manager</li>
<li><b>Major performance improvement</b> during project building – No more IDE freezing during build</li>
<li><b>Automatic upgrade</b> from VS2008 to VS2010 – no more manual editing of wixproj files to change the tools version</li>
<li><b>Improved IDE experience</b> including drag/drop of nodes, copy/paste of items, and project references</li>
<li>Added <b>Visual Studio 2010 Express products detection</b> in the WiX VS Extension – New in Beta</li>
<li>Over <b>40 + bug fixes</b></li>
</ul>
</blockquote>
<p>I’m pleased we were able to get a release supporting beta 2 out so quickly and I’m <em>very</em> excited about the “no more IDE freezing during build” improvement. There are several other smaller enhancements that will make WiX v3.5 a no-brainer upgrade when it ships next year.</p>
<p>In the meantime, if you’re using Visual Studio 2010, please grab <a href="http://wix.sourceforge.net/releases/3.5.1030.0/">this build</a> and be on the lookout for future weekly releases. Problems, questions? Send mail to <a href="http://wix.sourceforge.net/mailinglists.html#wix-users">wix-users</a>, <a href="https://sourceforge.net/tracker/?group_id=105970&amp;atid=642714">file bug reports</a>, or <a href="https://sourceforge.net/tracker/?group_id=105970&amp;atid=642717">submit feature requests</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2009/10/30/wix-v3-5-supports-visual-studio-2010-beta-2/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Thrilling tales of deployment</title>
		<link>http://www.joyofsetup.com/2009/08/29/thrilling-tales-of-deployment/</link>
		<comments>http://www.joyofsetup.com/2009/08/29/thrilling-tales-of-deployment/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 14:17:02 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[Etc]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2009/08/29/thrilling-tales-of-deployment/</guid>
		<description><![CDATA[One of my requirements when researching places to live when I moved to Boston was nearby public transit. If you’ve ever driven in Boston, you know the traffic can be dense and intense and WTF?! THERE ARE 80 CARS BEHIND YOU AND IT’S ILLEGAL TO TURN LEFT THERE DURING RUSH HOUR!!
OK, so driving was not [...]]]></description>
			<content:encoded><![CDATA[<p>One of my requirements when researching places to live when I <a href="http://www.joyofsetup.com/2009/03/17/on-becoming-cantabrigian/">moved to Boston</a> was nearby <a href="http://www.mbta.com/">public transit</a>. If you’ve ever driven in Boston, you know the traffic can be dense and intense and WTF?! THERE ARE 80 CARS BEHIND YOU AND IT’S ILLEGAL TO TURN LEFT THERE DURING RUSH HOUR!!</p>
<p>OK, so driving was not in the picture for my daily commute to the <a href="http://www.microsoftcambridge.com/Default.aspx">Fortress of NERDitude</a>. Currently, my daily commute takes about half an hour of waiting for a bus or a train and sitting/standing while someone else does the driving. Doing nothing is much more relaxing than driving in Cambridge traffic, of course, but even with good music, doing nothing gets boring pretty quickly.</p>
<p>I could just bring along my trusty <a href="http://www.nintendo.com/ds/lite">Nintendo DS</a> but I figured that would get boring eventually too. Plus, I figured I could be a bit more mature than that and do something, I dunno, <em>productive </em>like read mail or blogs…</p>
<p>I considered just browsing the Web on my phone, but rejected that idea:</p>
<ul>
<li>Web latency over 3G networks is painful. </li>
<li>3G networks aren’t terribly reliable underground. </li>
<li>Web UIs are painful on small screens. </li>
</ul>
<p>A laptop or even <a href="http://www.microsoft.com/windows/products/winfamily/umpc/default.mspx">UMPC</a> is out, because I knew I’d frequently need to work one-handed, keeping the other handy for not falling over during the less-than-smooth parts of the <a href="http://www.mbta.com/schedules_and_maps/subway/lines/?route=RED">Red Line</a>.</p>
<p>No, I needed a small, handheld device that could sync mail and blogs and let me read them offline.</p>
<h4>No, it’s not an iPhone</h4>
<p>After some research, I bought an <a href="http://www.apple.com/ipodtouch/">iPod touch</a>. (Perhaps in a couple of weeks, my implant will kick in and I’ll do this all again on a <a href="http://www.zune.net/en-us/mp3players/zunehd/default.htm">Zune HD</a>.) I also bought <a href="http://www.phantomfish.com/byline.html">Phantom Fish’s Byline</a> RSS reader, which syncs to <a href="http://www.google.com/reader">Google Reader</a>. Once I supplied my account name and password, reading blogs using Byline is easy:</p>
<ul>
<li>Tap the sync button to download the latest blog posts.</li>
<li>Read posts and mark some for later follow-up once I’m back online.</li>
<li>Before heading home, sync to update Google Reader with the posts I read and to download the latest blog posts.</li>
<li>Once I’m back in range of my home WiFi, sync again.</li>
</ul>
<h4>Please, sir, may I have some more?</h4>
<p>Buying apps from Apple’s App Store is simple; the hardest part is typing a strong password into the on-screen keyboard:</p>
<ul>
<li>Start the App Store app. </li>
<li>Search or browse for an app. </li>
<li>Tap the price and it turns into a BUY NOW button. </li>
<li>Tap BUY NOW. </li>
<li>Enter your iTunes password. </li>
<li>The app is downloaded and installed. </li>
</ul>
<p>Updates are handled in much the same way:</p>
<ul>
<li>Start the App Store app. </li>
<li>Tap the Updates button. </li>
<li>If there are any updates, tap the Update All button to download and install the updates in the background. </li>
</ul>
<p>Because I have an iPod touch instead of iPhone, all my interaction with the App Store happens over WiFi at respectable speeds. (Even better, it doesn’t require interaction with iTunes, which continues to amply demonstrate that Apple has yet to master setup development on Windows.)</p>
<p>I’ve purchased many apps since buying my iPod touch and “purchased” many more free apps. In all cases, downloading and installing those apps was painless.</p>
<h4>Knew you’d get to installation eventually</h4>
<p>Well, yeah. Here are my takeaways; yours might differ:</p>
<ul>
<li><strong>Mobile != connected. </strong>Even though 3G coverage is decent from the major carriers, there will always be dead zones, slow zones, and underground zones.</li>
<li><strong>Rich clients + local processing power == goodness. </strong>Sure, Web 2.0 and HTML5 will finally kill the idea of running local apps. Bah. Latency, especially problematic with 3G networks, kills the user experience (see, for example, <a href="http://www.cooper.com/insights/books/">About Face</a> and other UX books). Rich clients can largely avoid the problem.</li>
<li><strong>Sync data that lives in the cloud. </strong>If your data lives in the cloud, rich clients can sync it, keeping multiple devices up to date. In my case, I prefer to use a laptop or desktop PC to read blogs and mail when I can because, not surprisingly, a big screen is better for reading (or scanning) lots of text. </li>
<li><strong>Bulletproof installations rock.</strong> Would anyone disagree it’s better to have bullet-ridden installation? </li>
<li><strong>Making it easy to buy apps makes it easy to make money.</strong> The App Store had “<a href="http://www.apple.com/itunes/billion-app-countdown/">over 1 billion downloads in just nine months</a>” and “<a href="http://www.apple.com/pr/library/2009/07/14apps.html">1.5 billion in First Year</a>.” Naturally, with so many free and almost-free apps in the App Store, it doesn’t necessarily follow that we’re talking about a <em>lot</em> of money, depending on your definition of “a lot,” as <a href="http://gigaom.com/2009/08/27/how-big-is-apple-iphone-app-economy-the-answer-might-surprise-you/">estimates put the revenue at $2.4 billion a year</a>. But imagine extending the App Store experience to more expensive apps, say on your PC. </li>
<li><strong>Making it easy to service apps makes it easy to keep customers happy.</strong> Servicing deliverables themselves <a href="http://www.joyofsetup.com/2008/12/30/paying-for-upgrades/">aren’t too hard</a> to get right but making users aware of them and getting them to the user still is. It’s led to way too many auto-start local-system updater services one vulnerability away from total system <a href="http://en.wikipedia.org/wiki/P0wnage">p0wnage</a>.</li>
</ul>
<h4>Best of both worlds</h4>
<p>One of the big reasons Web apps became so popular, for both consumers and the enterprise, is that they don’t suffer from the reliability problems common to installing client apps. Naturally, these aren’t <em>inherent</em> problems with client app installation but are complexities that easily turn into problems—especially without engineering attention to setup. </p>
<p>Web apps avoid the problem by not installing on the client. (Note that I’m skipping the complexities of setting up Web servers and the pseudo-installation provided by Silverlight and Flash.)</p>
<p>iPhone/iPod touch apps avoid the problem by:</p>
<ul>
<li>Working in a limited number of well-known environments. (Though the iPhone 3GS adds a second hardware base and there are many rumors about a so-called “<a href="http://www.bing.com/search?q=Apple+tablet">Apple tablet</a>.”) </li>
<li>Working in a locked-down environment. </li>
<li>Requiring a particular deployment model. </li>
<li>Supporting a simple update model. </li>
<li>Requiring review and approval before getting published. </li>
</ul>
<p>These might seem pretty limiting to most Windows developers. But it’s hard to argue against the success the App Store has achieved because of—probably not in spite of—those limitations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2009/08/29/thrilling-tales-of-deployment/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Security update for Visual Studio</title>
		<link>http://www.joyofsetup.com/2009/08/02/security-update-for-visual-studio/</link>
		<comments>http://www.joyofsetup.com/2009/08/02/security-update-for-visual-studio/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 20:43:08 +0000</pubDate>
		<dc:creator>Bob Arnson</dc:creator>
				<category><![CDATA[Etc]]></category>

		<guid isPermaLink="false">http://www.joyofsetup.com/2009/08/02/security-update-for-visual-studio/</guid>
		<description><![CDATA[Last Tuesday, Microsoft released atypical, out-of-band security updates for vulnerabilities in ATL. Michael Howard discusses them on the Security Development Lifecycle blog. The security update page contains links to patches and upgrades for affected Visual Studio components, going back to Visual Studio .NET 2003. If you&#8217;re using Visual Studio 2008 SP1, you&#8217;ll be interested in [...]]]></description>
			<content:encoded><![CDATA[<p>Last Tuesday, Microsoft released atypical, out-of-band security updates for vulnerabilities in <a href="http://en.wikipedia.org/wiki/Active_Template_Library">ATL</a>. Michael Howard discusses them on the <a href="http://blogs.msdn.com/sdl/archive/2009/07/28/atl-ms09-035-and-the-sdl.aspx">Security Development Lifecycle blog</a>. The <a href="http://www.microsoft.com/technet/security/bulletin/MS09-035.mspx">security update page</a> contains links to patches and upgrades for affected Visual Studio components, going back to Visual Studio .NET 2003. If you&#8217;re using Visual Studio 2008 SP1, you&#8217;ll be interested in the following:</p>
<ul>
<li><a href="http://www.microsoft.com/downloads/details.aspx?familyid=2051a0c1-c9b5-4b0a-a8f5-770a549fd78c&amp;displaylang=en">Microsoft Visual C++ 2008 Service Pack 1 Redistributable Package ATL Security Update</a>, which contains upgrades for the Visual C++ runtime assemblies. There are three, one for each platform (x86, x64, and IA64), each under 5MB.</li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?familyid=294de390-3c94-49fb-a014-9a38580e64cb&amp;displaylang=en">Visual Studio 2008 Service Pack 1 ATL Security Update</a>, which contains a 365MB patch for SP1.</li>
<li>Wait.</li>
<li>365MB? As in <a href="http://en.wikipedia.org/wiki/Mebibyte">megabytes</a>?</li>
<li>Oh yes.</li>
</ul>
<p>I&#8217;m downloading this once and sharing it on my network rather than downloading it from Microsoft Update <em>n</em> times.</p>
<p><a title="http://www.microsoft.com/technet/security/bulletin/MS09-035.mspx" href="http://www.microsoft.com/technet/security/bulletin/MS09-035.mspx">&#160;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.joyofsetup.com/2009/08/02/security-update-for-visual-studio/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.837 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-03-12 13:23:53 -->
