<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Susan Warren's [ v ] Blog</title><link>http://blogs.vertigosoftware.com/swarren/default.aspx</link><description>Making Software the Vertigo Way</description><dc:language>en-US</dc:language><generator>CommunityServer 1.1 (Build: 1.1.0.50615)</generator><item><title>All of your bases are belong to us!  ASP.NET-Style</title><link>http://blogs.vertigosoftware.com/swarren/archive/2006/12/19/4214.aspx</link><pubDate>Tue, 19 Dec 2006 18:08:00 GMT</pubDate><guid isPermaLink="false">fcb82b5c-78c7-46a5-b6ff-1ef27e7d7271:4214</guid><dc:creator>swarren</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.vertigosoftware.com/swarren/comments/4214.aspx</comments><wfw:commentRss>http://blogs.vertigosoftware.com/swarren/commentrss.aspx?PostID=4214</wfw:commentRss><description>I usually find .NET error messages very informational, and then I met this one:
Parser Error Message: The file 'src' is not a valid here because it doesn't expose a type.
Say what?&amp;nbsp; 
I was seeing this error after compiling and deploying my application.&amp;nbsp; It would run fine&amp;nbsp;for an hour or so, and then tilt -- and badly.&amp;nbsp; The usual means of app domain recycling (IISRESET, change web.config) didn't clear the error; the only way&amp;nbsp;I found to reset the app domain was to the DLL...(&lt;a href="http://blogs.vertigosoftware.com/swarren/archive/2006/12/19/4214.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.vertigosoftware.com/aggbug.aspx?PostID=4214" width="1" height="1"&gt;</description></item><item><title>Reading a config section from an external file in ASP.NET 2.0</title><link>http://blogs.vertigosoftware.com/swarren/archive/2006/11/28/4115.aspx</link><pubDate>Tue, 28 Nov 2006 21:25:00 GMT</pubDate><guid isPermaLink="false">fcb82b5c-78c7-46a5-b6ff-1ef27e7d7271:4115</guid><dc:creator>swarren</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.vertigosoftware.com/swarren/comments/4115.aspx</comments><wfw:commentRss>http://blogs.vertigosoftware.com/swarren/commentrss.aspx?PostID=4115</wfw:commentRss><description>&lt;P&gt;In my current project, we have a requirement to store some of the application settings in separate files from web.config.&amp;nbsp; Some application settings will change often enough that we'd like to export them from a forever-behind-the-firewall database to a file we can drop into the public website.&amp;nbsp; On the other hand the basic web.config settings will rarely change, and it could really mess up the application if the autogen'd settings somehow stomped an important configuration value in web.config.&amp;nbsp; Keeping these two kinds of settings in separate files helps make this approach viable.&lt;/P&gt;
&lt;P&gt;As it turns out, this particular application uses three different mechanisms for referencing settings in an external file, so I've had a chance to compare and contrast the approaches.&lt;/P&gt;
&lt;P&gt;1.&amp;nbsp; &amp;lt;appSetting&amp;gt;'s &lt;STRONG&gt;file=&lt;/STRONG&gt; attribute.&lt;/P&gt;
&lt;P&gt;2.&amp;nbsp; Any config section's &lt;STRONG&gt;configSource=&lt;/STRONG&gt; attribute.&lt;/P&gt;
&lt;P&gt;3.&amp;nbsp; A &lt;STRONG&gt;custom config section&lt;/STRONG&gt; of type &lt;EM&gt;System.Configuration.AppSettingsSection&lt;/EM&gt;.&amp;nbsp; This is essentially the same mechanism as #1, but you can create as many separate configuration files as you need using custom sections. &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&amp;lt;appSetting&amp;gt;'s &lt;STRONG&gt;file=&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;The &amp;lt;appSetting&amp;gt; &lt;STRONG&gt;file&lt;/STRONG&gt; mechanism is both simple and flexible, and probably "enough" for most ASP.NET 2.0 applications that need an external settings file.&amp;nbsp; The AppSettingsSection class allows supports loading settings from &lt;EM&gt;both&lt;/EM&gt; an external file as well as declaring them inline in web.config:&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;In web.config:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;FONT color=#800000&gt;appSettings&lt;/FONT&gt; &lt;STRONG&gt;&lt;FONT color=#ff0000&gt;file&lt;/FONT&gt;="moresettings.config"&lt;/STRONG&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;FONT color=#800000&gt;add&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;key&lt;/FONT&gt;="first" &lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;="inline settings are loaded before external ones" /&amp;gt;&lt;BR&gt;&amp;lt;/&lt;FONT color=#800000&gt;appSettings&lt;/FONT&gt;&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;In moresettings.config:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;FONT color=#800000&gt;appSettings&lt;/FONT&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;FONT color=#800000&gt;add&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;key&lt;/FONT&gt;="second" &lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;="another setting" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;FONT color=#800000&gt;add&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;key&lt;/FONT&gt;="third" &lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;="yet another setting" /&amp;gt;&lt;BR&gt;&amp;lt;/&lt;FONT color=#800000&gt;appSettings&lt;/FONT&gt;&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Notes:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;the ACLs of the &lt;EM&gt;moresettings.config &lt;/EM&gt;file must allow the ASP.NET application to read it 
&lt;LI&gt;the root node of the &lt;EM&gt;moresettings.config &lt;/EM&gt;file&amp;nbsp;must be&amp;nbsp;&amp;lt;appSettings&amp;gt; 
&lt;LI&gt;key/value pairs declared inline in web.config appear first in the resulting NameValueCollection&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;BR&gt;Using the settings in code is easy:&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;using&lt;/FONT&gt; System.Configuration;&lt;BR&gt;...&lt;BR&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt; first = &lt;FONT color=#0080c0&gt;ConfigurationManager&lt;/FONT&gt;.AppSettings[&lt;FONT color=#800000&gt;"first"&lt;/FONT&gt;] &lt;FONT color=#0000ff&gt;as string&lt;/FONT&gt;;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;When you access appSettings in code, all of the settings are members of the same collection despite being declared in separate files.&amp;nbsp; Your application could use this mechanism alone to segregate specific application-scoped settings to another file.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&amp;lt;urlMapping&amp;gt;'s &lt;STRONG&gt;configSource=&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;The &lt;STRONG&gt;configSource&lt;/STRONG&gt; attribute can be used to specify an external source file for any ASP.NET 2.0 config section.&amp;nbsp; Unlike the &lt;STRONG&gt;file&lt;/STRONG&gt; attribute, there's no merging of config settings between web.config and the external configuration file; you must move the entire section to a separate file.&amp;nbsp; The section tag (in this case &amp;lt;urlMappings&amp;gt;) must be the root element of the external file.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT color=#808080&gt;In web.config:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;FONT color=#800000&gt;urlMappings &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;configSource&lt;/FONT&gt;="friendlyurls.config" /&lt;/STRONG&gt;&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;In friendlyurls.config:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;FONT color=#800000&gt;&lt;FONT color=#800000&gt;urlMappings&lt;/FONT&gt;&lt;/FONT&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;FONT color=#800000&gt;clear&amp;nbsp;&lt;/FONT&gt;/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;FONT color=#800000&gt;add&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;url&lt;/FONT&gt;="~/Home.aspx" &lt;FONT color=#ff0000&gt;mappedUrl&lt;/FONT&gt;="~/Default.aspx?tab=home" /&amp;gt;&lt;BR&gt;&amp;lt;/&lt;FONT color=#800000&gt;&lt;FONT color=#800000&gt;urlMappings&lt;/FONT&gt;&lt;/FONT&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;FONT color=#000000&gt;&lt;/FONT&gt;&lt;/U&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;FONT color=#000000&gt;Custom config section using &lt;EM&gt;System.Configuration.AppSettingsSection&lt;/EM&gt;&lt;/FONT&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;There is plenty of documentation on &lt;A href="http://msdn.microsoft.com/"&gt;MSDN&lt;/A&gt; for creating custom config section handlers in code, and in cases where you want to parse custom XML tags the full metal approach makes sense.&amp;nbsp; But if you just need another group of key/value pairs it's much simpler to use the existing &lt;EM&gt;System.Configuration.AppSettingsSection&lt;/EM&gt; class.&amp;nbsp; This is the same class used for &amp;lt;appSettings&amp;gt; so it has the added benefit of permitting you to merge inline and external settings into a single &lt;EM&gt;KeyValueConfigurationCollection&lt;/EM&gt; at runtime.&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;In web.config:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;lt;&lt;FONT color=#800000&gt;configSections&lt;/FONT&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;STRONG&gt;&lt;FONT color=#800000&gt;section&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;name&lt;/FONT&gt;="regions" &lt;FONT color=#ff0000&gt;type&lt;/FONT&gt;="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" &lt;FONT color=#ff0000&gt;requirePermission&lt;/FONT&gt;="false" /&amp;gt;&lt;BR&gt;&lt;/STRONG&gt;&amp;lt;/&lt;FONT color=#800000&gt;configSections&lt;/FONT&gt;&amp;gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;FONT color=#800000&gt;regions &lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;file&lt;/FONT&gt;="regions.config"&lt;/STRONG&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;FONT color=#800000&gt;add&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;key&lt;/FONT&gt;="BE" &lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;="Europe" /&amp;gt;&lt;BR&gt;&amp;lt;/&lt;FONT color=#800000&gt;&lt;FONT color=#800000&gt;regions &lt;/FONT&gt;&lt;/FONT&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;In regions.config:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;FONT color=#800000&gt;appSettings&lt;/FONT&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;FONT color=#800000&gt;add&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;key&lt;/FONT&gt;="US" &lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;="North America" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;FONT color=#800000&gt;add&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;key&lt;/FONT&gt;="CA" &lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;="North America" /&amp;gt;&lt;BR&gt;&amp;lt;/&lt;FONT color=#800000&gt;appSettings&lt;/FONT&gt;&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;Reading the settings from a custom AppSettingsSection is&amp;nbsp;more work than from the default AppSettings section.&amp;nbsp; And web.config heirarchies and the &lt;EM&gt;WebConfigurationManager.OpenWebConfiguration()&lt;/EM&gt; method are just&amp;nbsp;flexible enough to make grabbing the right instance of your web.config a little tricky.&amp;nbsp; I found the &lt;A href="http://quickstarts.asp.net/QuickStartv20/aspnet/doc/management/mgmtapi.aspx"&gt;documentation&lt;/A&gt; and &lt;A href="http://quickstarts.asp.net/QuickStartv20/util/srcview.aspx?path=~/aspnet/samples/management/ReadSection/ReadSection.src"&gt;sample&lt;/A&gt; in the &lt;A href="http://quickstarts.asp.net/QuickStartv20/aspnet/"&gt;ASP.NET Quickstarts&lt;/A&gt; helpful in decyphering the options.&amp;nbsp; Here's some code that reads settings from a custom AppSettingsSection in the current application's root web.config:&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;FONT color=#0000ff&gt;using&lt;/FONT&gt; System.Configuration;&lt;BR&gt;&lt;FONT color=#0000ff&gt;using&lt;/FONT&gt; System.Diagnostics;&lt;BR&gt;&lt;FONT color=#0000ff&gt;using&lt;/FONT&gt; System.Web;&lt;BR&gt;&lt;FONT color=#0000ff&gt;using&lt;/FONT&gt; System.Web.Configuration;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;...&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;// Determine web path of the application's web.config&lt;/FONT&gt;&lt;BR&gt;string &lt;FONT color=#000000&gt;path = &lt;FONT color=#0080c0&gt;HttpContext&lt;/FONT&gt;.Current.Request.CurrentExecutionFilePath;&lt;BR&gt;path = path.Substring(0, path.LastIndexOf(&lt;FONT color=#800000&gt;'/'&lt;/FONT&gt;));&lt;BR&gt;&lt;FONT color=#0000ff&gt;if&lt;/FONT&gt; (path.Length == &lt;FONT color=#0000ff&gt;0&lt;/FONT&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; path = &lt;FONT color=#800000&gt;"/"&lt;/FONT&gt;;&lt;BR&gt;&lt;FONT color=#0080c0&gt;&lt;BR&gt;&lt;FONT color=#008000&gt;// Open the config section as an AppSettingsSection&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;&lt;FONT color=#0080c0&gt;Configuration&lt;/FONT&gt; rootWebConfig = &lt;FONT color=#0080c0&gt;WebConfigurationManager&lt;/FONT&gt;.OpenWebConfiguration(path);&lt;BR&gt;&lt;FONT color=#0080c0&gt;AppSettingsSection&lt;/FONT&gt; regionSection = rootWebConfig.GetSection(&lt;FONT color=#800000&gt;"regions"&lt;/FONT&gt;) &lt;FONT color=#0000ff&gt;as&lt;/FONT&gt; &lt;FONT color=#0080c0&gt;AppSettingsSection&lt;/FONT&gt;; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;FONT color=#0000ff&gt;if&lt;/FONT&gt; (regionSection != &lt;FONT color=#0000ff&gt;null&lt;/FONT&gt;)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;// Get the appSettings key/value pairs collection&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0080c0&gt;KeyValueConfigurationCollection&lt;/FONT&gt; regionSettings = regionSection.Settings; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (&lt;FONT color=#0080c0&gt;KeyValueConfigurationElement&lt;/FONT&gt; item &lt;FONT color=#0000ff&gt;in&lt;/FONT&gt; regionSettings)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0080c0&gt;Debug&lt;/FONT&gt;.WriteLine(&lt;FONT color=#800000&gt;"key: "&lt;/FONT&gt; + item.Key.ToString());&lt;BR&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0080c0&gt;Debug&lt;/FONT&gt;.WriteLine(&lt;FONT color=#800000&gt;"value: "&lt;/FONT&gt; + item.Value.ToString());&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://blogs.vertigosoftware.com/aggbug.aspx?PostID=4115" width="1" height="1"&gt;</description></item><item><title>Adventures in CSS: Authoring for Multiple Browsers</title><link>http://blogs.vertigosoftware.com/swarren/archive/2006/10/20/3963.aspx</link><pubDate>Fri, 20 Oct 2006 16:18:00 GMT</pubDate><guid isPermaLink="false">fcb82b5c-78c7-46a5-b6ff-1ef27e7d7271:3963</guid><dc:creator>swarren</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.vertigosoftware.com/swarren/comments/3963.aspx</comments><wfw:commentRss>http://blogs.vertigosoftware.com/swarren/commentrss.aspx?PostID=3963</wfw:commentRss><description>&lt;P&gt;&lt;/P&gt;
&lt;P&gt;The &lt;A href="http://blogs.vertigosoftware.com/swarren/archive/2006/10/19/3954.aspx"&gt;CSS for Windows Marketplace 2.0&lt;/A&gt; was written to target the three big marketshare browsers: IE6, IE7, and FireFox 1.5.&amp;nbsp; We've found it works pretty well in other browsers (like Opera) even though we didn't specifically target them.&amp;nbsp; That's probably due to compliance to standards for XHTML and CSS, go standards!&lt;/P&gt;
&lt;P&gt;Rather than applying browser-specific styles via hacks or script, we used &lt;A href="http://msdn.microsoft.com/workshop/author/dhtml/overview/ccomment_ovw.asp" target=_blank&gt;IE's conditional comment&lt;/A&gt; feature.&amp;nbsp; Alan blogged &lt;A href="http://blogs.vertigosoftware.com/alanl/archive/2006/09/08/IE_Conditional_Comments.aspx"&gt;a little bit about the technique&lt;/A&gt; during the project, but I wanted to drill deeper into the Windows Marketplace implementation&amp;nbsp;since it's such a powerful approach to cross browser support.&amp;nbsp; I like it a lot over &lt;A href="http://www.nikhilk.net/Entry.aspx?id=141" target=_blank&gt;the alternatives&lt;/A&gt;, since it's hack-free and javascript-free -- hats off again to Robert Biggs for setting us on this path.&amp;nbsp;&amp;nbsp;Conditional comments&amp;nbsp;also promote encapsulation which is a wonderful way to help the maintainability of the&amp;nbsp;application.&amp;nbsp; Hacks, on the other hand, are &lt;U&gt;horrible&lt;/U&gt; for maintainability: it's nearly impossible to find folks with the requisite encyclopedic knowledge of the arcane CSS hack-scape, let alone those with enough&amp;nbsp;javascript and front end UI dev experience to debug whether a problem is code vs. script vs. CSS.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Approach&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Of the three browsers we wanted to support, only IE6 and IE7 knew how to use conditional comments.&amp;nbsp; This fact, coupled with the fact that IE is less standards-compliant than FireFox, dictated our approach: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;create the baseline CSS for FireFox first 
&lt;LI&gt;use IE conditional comments to include "override" versions of style sheets for IE6 and IE7 as needed&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;We modularized this a bit further and broke the style sheets up by functionality.&amp;nbsp; So the style sheets for &lt;A href="http://blogs.vertigosoftware.com/swarren/archive/2006/10/19/3960.aspx"&gt;the frame&lt;/A&gt; -- &lt;EM&gt;frame.cs&lt;/EM&gt;s, &lt;EM&gt;frame-ie6.css&lt;/EM&gt;, and &lt;EM&gt;frame-ie7.css&lt;/EM&gt; -- are included on all pages whereas the styles for wish list feature are included only on Wishlist.aspx.&amp;nbsp; The site has 40 or so style sheets altogether.&amp;nbsp; That may seem like a lot of different style sheets to manage&amp;nbsp;but knowing which one to touch when you need to make a change is surprisingly intuitive.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Example&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Here's a sample of the style sheet links from&amp;nbsp;the search results page.&amp;nbsp; The first group (shown in blue) are the FireFox styles, many of which also work in IE.&amp;nbsp; The next sections are commented; FireFox ignores them completely.&amp;nbsp; The "lte IE 6" section is included by versions of IE "less than or equal to" version 6.&amp;nbsp; In practice this includes IE 5 (the first version to recognize conditional comments) plus IE 6.&lt;/P&gt;
&lt;P&gt;The "gte IE 7" section is included by version of IE "greater than or equal to" version 7.&amp;nbsp; There's a tiny leap of faith here that versions of IE will become ever more standards compliant in the future; sure hope we're right!&lt;/P&gt;
&lt;P&gt;In practice, we found that IE6 needed a lot of tweaks from the standard CSS from the site, whereas IE7 needed very few.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;&amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/frame.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/layoutResults.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/searchResults.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/globalLayouts.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/tooltip.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/modules.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;lt;script type="text/javascript" src="/scripts/winmp.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/FONT&gt; &lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;&lt;B&gt;&amp;lt;!--[if lte IE 6]&amp;gt;&lt;BR&gt;&lt;/B&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/frame-ie6.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/tab-ie6.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/globalLayouts-ie6.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/searchResults-ie6.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/tooltip-ie6.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/modules-ie6.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src="/scripts/ie6submenu.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;BR&gt;&lt;B&gt;&amp;lt;![endif]--&amp;gt;&lt;/B&gt;&lt;/FONT&gt; 
&lt;P&gt;&lt;FONT color=#008000&gt;&lt;B&gt;&amp;lt;!--[if gte IE 7]&amp;gt;&lt;BR&gt;&lt;/B&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/frame-ie7.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/tab-ie7.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/globalLayouts-ie7.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/searchResults-ie7.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/tooltip-ie7.css" type="text/css" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="/mapasset.aspx?file=css/modules-ie7.css" type="text/css" /&amp;gt;&lt;BR&gt;&lt;B&gt;&amp;lt;![endif]--&amp;gt;&lt;/B&gt;&lt;/FONT&gt; 
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You may have noticed the &lt;EM&gt;mapasset.aspx&lt;/EM&gt; target of the style sheet link above; that was required to set the paths of CSS, script and image assets via configuration per deployment.&amp;nbsp; I'll blog about that in detail sometime.&amp;nbsp; What the browser sees is just a standard CSS file, and it caches it accordingly.&lt;/P&gt;&lt;img src="http://blogs.vertigosoftware.com/aggbug.aspx?PostID=3963" width="1" height="1"&gt;</description></item><item><title>Adventures in CSS: Stretchy Frame</title><link>http://blogs.vertigosoftware.com/swarren/archive/2006/10/19/3960.aspx</link><pubDate>Thu, 19 Oct 2006 22:57:00 GMT</pubDate><guid isPermaLink="false">fcb82b5c-78c7-46a5-b6ff-1ef27e7d7271:3960</guid><dc:creator>swarren</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.vertigosoftware.com/swarren/comments/3960.aspx</comments><wfw:commentRss>http://blogs.vertigosoftware.com/swarren/commentrss.aspx?PostID=3960</wfw:commentRss><description>&lt;P&gt;One of the surprising &lt;A href="http://blogs.vertigosoftware.com/swarren/archive/2006/10/19/3954.aspx"&gt;CSS challenges for Windows Marketplace&lt;/A&gt; was stretching the spiffy "glass" frame to fit the content.&amp;nbsp; The visual design of the site is intended to suggest Windows Vista: a glassy frame in the center of the page around the content, yummy background gradients filling to the width of the browser, even the grassy texture behind the footer.&amp;nbsp;&amp;nbsp; Despite the visual sophistication of such a design, it should be easy to layout, right?&amp;nbsp; I mean, with tables I could just slice those images up and make the pieces the background for various cells...&lt;/P&gt;
&lt;P&gt;It sure seemed easier to do a table layout but doing so would have put a stake through the heart of the &lt;A href="http://en.wikipedia.org/wiki/Semantic_Web" target=_blank&gt;semantic web&lt;/A&gt; hopes for the website.&amp;nbsp; So we tapped CSS guru Robert Biggs for some help with this and other CSS challenges for the site.&amp;nbsp; Here's the technical breakdown of the stretchy frame problem, and how Robert solved it.&lt;/P&gt;
&lt;P&gt;Requirements:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Vista-like glassy effects in IE6, IE7, FireFox 1.5+ 
&lt;LI&gt;Scales vertically to the content.&amp;nbsp; (Scaling horizontally was not a requirement) 
&lt;LI&gt;Looks good on monitors with high resolution or wide aspect ratios.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Design:&lt;/P&gt;
&lt;P&gt;The design called for&amp;nbsp;two gradient background fills: one&amp;nbsp;at the top and another at the bottom.&amp;nbsp; A fixed-width frame is centered on top of the gradients, which stretch for the width of the browser.&amp;nbsp; On high resolution monitors, instead of have the web content&amp;nbsp;parked in the left side of the browser with a whole bunch of white space on the right, the&amp;nbsp;browser frame is filled.&amp;nbsp; It looks really nice.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;As the frame stretches vertically, the white background between the two gradients increases.&amp;nbsp; The sides of the glass frame stretch over the white region as well, of course.&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://blogs.vertigosoftware.com/photos/swarren/images/3953/original.aspx"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;IMG src="http://blogs.vertigosoftware.com/photos/swarren/images/3955/original.aspx"&gt; &lt;/P&gt;
&lt;P&gt;One constraint we needed to decide up front was the minimum height of the content region (the white region in the picture above): 700px.&amp;nbsp; This ensured the gradients would never collide.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Robert implemented the graphics to make both gradients blend to the center color.&amp;nbsp; In markup, he nested two &amp;lt;div&amp;gt; tags just inside the body.&amp;nbsp; He attached the top gradient image to the outer div as a background image, and the bottom gradient in the inner div as a background image.&amp;nbsp; This permitted the page to scale vertically as long as needed.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://blogs.vertigosoftware.com/photos/swarren/images/3956/original.aspx"&gt; &lt;/P&gt;
&lt;P&gt;Here's the CSS and markup -- it's pretty simple:&lt;/P&gt;
&lt;P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;#bodyBackground { background-image: url(%img%/frame_elements/bkgd-gradient-top.gif); background-repeat: repeat-x; background-position: top left; }&lt;/FONT&gt; 
&lt;P&gt;&lt;FONT color=#004080&gt;#main { background-image: url(%img%/frame_elements/bkgd-gradient-bottom.gif); background-repeat: repeat-x; background-position: bottom left; }&lt;/FONT&gt; 
&lt;P&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#004080&gt;#footerBackground { background-image: url(%img%/frame_elements/footer-bkgd.jpg); background-repeat: no-repeat; background-position: top left; }&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;…&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;&amp;lt;/head&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;&amp;lt;body&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;&lt;STRONG&gt;&amp;lt;div id="bodyBackground"&amp;gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;&amp;lt;div id="main"&amp;gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="header"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#008000&gt;&amp;lt;!-- branding, menus, search --&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="bframe"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#008000&gt;&amp;lt;!-- content region --&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="footer"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000&gt;&amp;lt;!--&amp;nbsp;bottom search --&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;STRONG&gt;&amp;lt;div id="footerBackground"&amp;gt;&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#008000&gt; &amp;lt;!-- links --&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#004080&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;lt;/div&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;&amp;lt;/div&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#004080&gt;&amp;lt;/body&amp;gt;&lt;/FONT&gt;&lt;/P&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;
&lt;P&gt;The last challenge for the stretchy frame was the grassy texture behing the footer.&amp;nbsp;&amp;nbsp; This texture is a background picture for the "footerBackground" div nested in the "footer" div (outlined in blue in the picture below).&amp;nbsp;&amp;nbsp; Since the page sizes itself to the content, including footer content, this div is always at the bottom of the page.&amp;nbsp; The trick of pinning the bottom gradient to the bottom of the "main" div ensures that the gradient and image always line up perfectly.&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://blogs.vertigosoftware.com/photos/swarren/images/3959/original.aspx"&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;img src="http://blogs.vertigosoftware.com/aggbug.aspx?PostID=3960" width="1" height="1"&gt;</description></item><item><title>Adventures in CSS: Windows Marketplace 2006</title><link>http://blogs.vertigosoftware.com/swarren/archive/2006/10/19/3954.aspx</link><pubDate>Thu, 19 Oct 2006 21:30:00 GMT</pubDate><guid isPermaLink="false">fcb82b5c-78c7-46a5-b6ff-1ef27e7d7271:3954</guid><dc:creator>swarren</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.vertigosoftware.com/swarren/comments/3954.aspx</comments><wfw:commentRss>http://blogs.vertigosoftware.com/swarren/commentrss.aspx?PostID=3954</wfw:commentRss><description>&lt;P&gt;Often when you make the "sequel" to an existing application, several of the requirements boil down to fixing what didn't work well in V1.&amp;nbsp; For &lt;A href="http://www.microsoft.com/presspass/press/2004/oct04/10-12WMOpenPR.mspx" target=_blank&gt;the original Windows Marketplace&lt;/A&gt;, one of the largest pain points was the lack of editorial control over just about everything: layout, style, content --&amp;nbsp;pretty much anything needed to keep the site fresh and compelling.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;So it's no surprise that one of the key requirements for &lt;A href="http://www.windowsmarketplace.com/" target=_blank&gt;the latest version of Windows Marketplace&lt;/A&gt;&amp;nbsp;was lots of editorial&amp;nbsp;control over just those things: layout, style, content, navigation, A/B testing,&amp;nbsp;tracking, and all the other knobs the editorial staff needs to turn.&amp;nbsp; We made the call (some might say the leap of faith) to rely on CSS positioning for the core elements of the site, as well as CSS styles for much of the behavior of the site.&amp;nbsp; The content management system would emit only &lt;A href="http://www.digital-web.com/articles/writing_semantic_markup/"&gt;semantic markup&lt;/A&gt;; CSS would do the rest.&lt;/P&gt;
&lt;P&gt;We had to learn quite a few CSS tricks to pull this off, but in the end using CSS has satisfied the editorial flexibility requirement with flying colors.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Home page with CSS:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://blogs.vertigosoftware.com/photos/swarren/images/3953/original.aspx"&gt; &lt;/P&gt;
&lt;P&gt;Same page without CSS:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://blogs.vertigosoftware.com/photos/swarren/images/3951/original.aspx"&gt; &lt;/P&gt;
&lt;P&gt;Source snippet (semantic menus):&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://blogs.vertigosoftware.com/photos/swarren/images/3952/original.aspx"&gt;&lt;/P&gt;&lt;img src="http://blogs.vertigosoftware.com/aggbug.aspx?PostID=3954" width="1" height="1"&gt;</description></item><item><title>A picture says 1000 words (and saves a dozen meetings)</title><link>http://blogs.vertigosoftware.com/swarren/archive/2005/10/29/1568.aspx</link><pubDate>Sun, 30 Oct 2005 00:53:00 GMT</pubDate><guid isPermaLink="false">fcb82b5c-78c7-46a5-b6ff-1ef27e7d7271:1568</guid><dc:creator>swarren</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.vertigosoftware.com/swarren/comments/1568.aspx</comments><wfw:commentRss>http://blogs.vertigosoftware.com/swarren/commentrss.aspx?PostID=1568</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;A "straw man" is simply a hastily-assembled&amp;nbsp;approximation of a deliverable, and an&amp;nbsp;incredibly effective tool for driving fast group decision making.&amp;nbsp; &lt;/FONT&gt;&lt;FONT face=Tahoma size=2&gt;It will be wrong in many of the details, but it gives the folks in the room something to correct or elaborate upon and sidesteps the "blank sheet syndrome" where many design meetings fail to get down to specifics.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Tahoma size=2&gt;&lt;STRONG&gt;Tips for producing an effective straw man:&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;FONT face=Tahoma size=2&gt;No straw men on the first date!&amp;nbsp; Spend some time listening to the client (or the team) before offering up a straw man.&amp;nbsp; There needs to be some open-ended discussion around the problems you are trying to address before you start to pencil out solutions.&amp;nbsp; &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face=Tahoma size=2&gt;Put the straw man in the most informal format that will work for your discussion.&amp;nbsp; If you are trying to get to a list of requirements, for example, a list in email is&amp;nbsp;perfectly acceptable &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face=Tahoma size=2&gt;Assign the task of authoring the straw man to just one person.&amp;nbsp; As soon as you make it a team effort, you lose the efficiency gains of using a straw man.&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Tahoma size=2&gt;When it's your turn to write the straw man, &lt;/FONT&gt;&lt;FONT face=Tahoma size=2&gt;think about the decisions you'd like the group to make by the end of the meeting and make those the target of your strawman.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face=Tahoma size=2&gt;Don't spend so much time on your strawman that folks are discouraged from are encouraged to pitch in and make it better.&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT face=Tahoma size=2&gt;Tips for presenting a straw man:&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;FONT face=Tahoma size=2&gt;Before you present your strawman, clearly state that it's&amp;nbsp;just an example meant to stimulate conversation.&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Tahoma size=2&gt;If the strawman fails to stimulate the right discussion, set it aside.&amp;nbsp; It's just a tool, and sometimes you discover you really want the pliers instead of the screwdriver.&amp;nbsp; &lt;/FONT&gt;
&lt;LI&gt;&lt;FONT face=Tahoma size=2&gt;Listen carefully to feedback and write it all down.&amp;nbsp; After the meeting you may choose to polish the strawman into a more permanent document, or capture the decisions elsewhere.&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;img src="http://blogs.vertigosoftware.com/aggbug.aspx?PostID=1568" width="1" height="1"&gt;</description></item><item><title>Localizing Web apps in ASP.NET 1.1</title><link>http://blogs.vertigosoftware.com/swarren/archive/2005/08/08/1359.aspx</link><pubDate>Mon, 08 Aug 2005 23:56:00 GMT</pubDate><guid isPermaLink="false">fcb82b5c-78c7-46a5-b6ff-1ef27e7d7271:1359</guid><dc:creator>swarren</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.vertigosoftware.com/swarren/comments/1359.aspx</comments><wfw:commentRss>http://blogs.vertigosoftware.com/swarren/commentrss.aspx?PostID=1359</wfw:commentRss><description>&lt;P&gt;I've had a chance to localize a couple of pretty beefy web applications in the past year running ASP.NET 1.1.&amp;nbsp; While I think 2.0 will give us even better tools for localization, the reality is that we're going to be working with ASP.NET 1.1 applications for some time to come.&amp;nbsp; &lt;a href="http://vertigoblogs/swarren/articles/1343.aspx"&gt;This article&lt;/A&gt; describes a strategy for localizing ASP.NET 1.1 applications that has proven to be maintainable, flexible and a good performer under heavy load.&amp;nbsp; &lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.vertigosoftware.com/aggbug.aspx?PostID=1359" width="1" height="1"&gt;</description></item><item><title>Soft Skill #5: Public Speaking</title><link>http://blogs.vertigosoftware.com/swarren/archive/2004/09/15/594.aspx</link><pubDate>Wed, 15 Sep 2004 17:43:00 GMT</pubDate><guid isPermaLink="false">fcb82b5c-78c7-46a5-b6ff-1ef27e7d7271:594</guid><dc:creator>swarren</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.vertigosoftware.com/swarren/comments/594.aspx</comments><wfw:commentRss>http://blogs.vertigosoftware.com/swarren/commentrss.aspx?PostID=594</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Public speaking is an “advanced&lt;SPAN&gt;”&lt;/SPAN&gt; soft skill: the ability to speak well in front of audiences large and small can take years of training and practice to truly master.&amp;nbsp; But the 80/20 rule works here too, so I've listed my tips for the first 20% that can make anyone an effective public speaker.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;#1&amp;nbsp;Public speaking is&amp;nbsp;a people thing.&lt;/STRONG&gt;&lt;BR&gt;Only heads of State and PR pukes deliver meticulously-practiced, pre-written&amp;nbsp;speeches word-for-word.&amp;nbsp; And there's a reason: it's tedious to listen to such speeches.&amp;nbsp; So unless you are delivering new information where the slightest mistake could cost you your job or your life, don't orate.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;People enjoy watching other people -- it's human nature.&amp;nbsp; One of the most effective ways to engage your audience is to &lt;EM&gt;be yourself&lt;/EM&gt;!&amp;nbsp; Act in a way that is natural for you, and give folks a glimpse into your personality.&amp;nbsp; Your audience will feel like they are getting to know you, in addition to learning about your topic.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Being yourself in front of an audience, of course, requires an excellent command of the proto-soft skill: &lt;A href="http://devblogs/swarren/posts/527.aspx"&gt;acting with confidence&lt;/A&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;#2 Make good use of your &lt;/STRONG&gt;&lt;/FONT&gt;&lt;A href="http://devblogs/swarren/archive/2004/08/23/534.aspx"&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Communications 101&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt; skills&lt;/STRONG&gt;.&amp;nbsp; Know your material, know your audience, give your audience a reason to care about your topic, and organize your thoughts.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;#3 Don't read your slides.&lt;/STRONG&gt;&amp;nbsp; Reading your slides word-for-word can be insulting to the audience since it implies they can't read.&amp;nbsp; Oops.&amp;nbsp; It also broadcasts that &lt;EM&gt;you&lt;/EM&gt; don't have any additional knowledge or perspective to add on your topic.&amp;nbsp; In other words, you are wasting their time.&amp;nbsp; Reading the slides is a guaranteed way to kill your speech dead.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;There are two techniques you should apply to avoid the pitfall.&amp;nbsp; First, know your topic (d'oh).&amp;nbsp; If you don't know the topic, cram before the speech or get someone else to give it.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Second, distill your slides down to just a few words: a good goal is no more than 5 bullet points per slide, and no more than 5 words per bullet point.&amp;nbsp; If you can, try not to let a bullet point exceed one line!&amp;nbsp; This lets the audience get a gist of what you are going to talk about, but makes them listen to you for the information.&amp;nbsp; Which is cool, since that's the point of attending a speech. ;-)&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;STRONG&gt;#4 Speak loudly.&lt;/STRONG&gt;&amp;nbsp; This is a sort of “stupid pet trick&lt;SPAN&gt;”&lt;/SPAN&gt; for public speaking, but it really works.&amp;nbsp; Don't shout, but try to speak loudly.&amp;nbsp; Not only with that ensure folks can hear you, but it's a great trick to convey energy and maybe enthusiasm -- which in turn will help your audience engage.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;#5 Speak slowly when you need to compensate for being hard to understand.&lt;/STRONG&gt;&amp;nbsp; Do you naturally speak very fast?&amp;nbsp; Do you have a strong accent in the language you using for the speech?&amp;nbsp; Folks who don't know you might need a little help adjusting to your speaking style.&amp;nbsp; Speaking loudly will definitely help, but you can also compensate for an accent or a rapid-fire delivery by simply speaking a little more slowly.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;#6 Rehearse your speech in advance to time it.&lt;/STRONG&gt;&amp;nbsp; It certainly won't hurt to practice the material, but the point of this technique is to tune your material to fit into the time allotted for your speech.&amp;nbsp; Running long is frustrating to audiences, as is running short (although this is a fairly rare problem).&lt;/P&gt;
&lt;P&gt;Powerpoint has an awesome feature to automatically time your run-through: Slide Show &amp;gt; Rehease Timings.&amp;nbsp; If you find you are running too long, condense your material!&amp;nbsp; The&amp;nbsp;delivery time&amp;nbsp;of a speech almost always grows 10%-20% in front of a live audience.&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://blogs.vertigosoftware.com/aggbug.aspx?PostID=594" width="1" height="1"&gt;</description></item><item><title>Soft Skill #4: Traction</title><link>http://blogs.vertigosoftware.com/swarren/archive/2004/09/09/581.aspx</link><pubDate>Thu, 09 Sep 2004 20:40:00 GMT</pubDate><guid isPermaLink="false">fcb82b5c-78c7-46a5-b6ff-1ef27e7d7271:581</guid><dc:creator>swarren</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.vertigosoftware.com/swarren/comments/581.aspx</comments><wfw:commentRss>http://blogs.vertigosoftware.com/swarren/commentrss.aspx?PostID=581</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;“Traction” is another one of those Microsoft-speak words (like “rathole” or “dogfood”). It means a person's ability to drive for a specific result.&amp;nbsp; For example, “JoeN has amazing traction right now on getting generics into C#.”&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;You might also think of traction as “achieving results” or “meeting goals,” but the term - and the perspective - is focused on the &lt;EM&gt;process&lt;/EM&gt; rather than results.&amp;nbsp; And that's a good thing.&amp;nbsp; As individuals there are many factors we can't control that may prevent us from meeting a goal.&amp;nbsp; For example, when your project is cancelled you aren't going to meet your goal of shipping on a particular date.&amp;nbsp; But by developing the soft skill of driving to a specific result, you'll consistently meet your goals when circumstances allow.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;There are some simple steps you can take every day to improve your traction.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;#1 - Know where you are headed&lt;/STRONG&gt;.&amp;nbsp; As George Harrison sang, “If you don't know where you are going, any road will take you there.”&amp;nbsp; The catch is, of course, when you arrive 'where ever' you will probably wish you ended up somewhere else.&amp;nbsp;;-) Know where you are headed, and you will likely to take a fairly direct path to your destination.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;#2 - Aim for milestones along the way&lt;/STRONG&gt;.&amp;nbsp; If you've ever taken a road trip, I'm sure you can relate to this.&amp;nbsp; Your ultimate destination might be Miami, but you are very likely to stop for food, rest and gas along the way.&amp;nbsp; At minimum you need to plan your next gas station before your tank runs dry.&amp;nbsp; But not too often!&amp;nbsp; If you stopped at every gas station along the way, it would take a looooooong time to reach Miami.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Milestones make reaching a goal more manageable.&amp;nbsp; Choose a milestone,&amp;nbsp;you put your head down and push forward your progress for a bit.&amp;nbsp; When you reach it you can stop, take a look around and course correct if necessary.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Set milestones that let you process&amp;nbsp;enough work to make reasonable progress, but don't scope them so broadly (to an entire project, for example) that your course corrections when you finally reach the milestone are massive.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;#3 - Clear your unknowns as early as possible.&lt;/STRONG&gt;&amp;nbsp; In our business, it's generally the 'unknowns' that force the really big course corrections.&amp;nbsp; Identify what you don't yet know about your project, and make a milestone to figure it out up front.&amp;nbsp; For example, maybe you are considering using ASP.NET 2.0 for a project.&amp;nbsp; Set knowing the answer to the ASP.NET 2.0 question as an early milestone toward your project's destination.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;#4 - Communicate your progress toward your current milestone and final destination&lt;/STRONG&gt;.&amp;nbsp; Let your co-workers and client know where you are headed, and how you are progressing.&amp;nbsp; Milestones and destinations are much easier to communicate than your entire “to do” list, and folks often find ways to help you arrive when they know where you are headed.&amp;nbsp; They may even think of tactics and resources that you've missed.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;The 'when' and 'how' of communicating your progress is up to your individual style.&amp;nbsp; I personally like the 1-minute “elevator” speech: keep it simple, and deliver it personally to folks you see in the halls or in the lunchroom.&amp;nbsp; By keeping it “bited-sized” folks can probably stash away a couple of important details.&amp;nbsp; And by delivering it personally, you've also delivered a personal invitation for feedback and support later on -- and, in effect, added another part-time member to your team.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.vertigosoftware.com/aggbug.aspx?PostID=581" width="1" height="1"&gt;</description></item><item><title>Soft Skill #3: Decision making</title><link>http://blogs.vertigosoftware.com/swarren/archive/2004/09/08/577.aspx</link><pubDate>Wed, 08 Sep 2004 16:25:00 GMT</pubDate><guid isPermaLink="false">fcb82b5c-78c7-46a5-b6ff-1ef27e7d7271:577</guid><dc:creator>swarren</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.vertigosoftware.com/swarren/comments/577.aspx</comments><wfw:commentRss>http://blogs.vertigosoftware.com/swarren/commentrss.aspx?PostID=577</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;I haven't shared my definition of a soft skill yet, so I'll do that before I talk about decision making (which is&amp;nbsp;the poster child of soft skills IMO).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana color=#0000ff size=2&gt;A soft skill is a skill that lets you be effective in your job, but isn't directly related to your profession.&amp;nbsp; So teamwork is a 'soft' skill, whereas programming in .NET is a 'hard' skill.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;So let's talk about decision making -- the ability to make timely, high-quality decisions.&amp;nbsp; It's one of the most essential soft skills once you advance past an entry-level job.&amp;nbsp; In a consulting company like Vertigo, it's indispensible: our clients come to Vertigo because they need the &lt;EM&gt;right&lt;/EM&gt; thing built, not just anything.&amp;nbsp; They are paying for our exceptional professional judgement, the Vertigo 'secret sauce' of technical knowledge, experience, and (of course) decision making.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Decision making is a two step process.&amp;nbsp; &lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;First, you need to gather and understand the facts and the context for the decision.&amp;nbsp; &lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;Next, you apply analytic ability and common sense to the data to reach a decision.&amp;nbsp; Sounds simple enough, but there are some common pitfalls.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Analysis Paralysis&lt;/STRONG&gt;.&amp;nbsp; This catchy term means getting stuck in the decision making process without ever reaching a decision.&amp;nbsp; Good decision making has to be timely in order to be effective, so analysis paralysis can be fatal.&amp;nbsp; Analysis Paralysis seems to&amp;nbsp;mostly afflict folks without much decision-making experience.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;The cure for analysis paralysis is practice, practice, practice.&amp;nbsp; I specifically prescribe making 80/20 decisions.&amp;nbsp; Try for an 80% perfect decision, with just 20% of the effort require to get to the 100% perfect decision.&amp;nbsp; This is where that proto-skill confidence comes in handy.&amp;nbsp; You &lt;EM&gt;will&lt;/EM&gt; make a few bad calls with this approach -- be sure to fess up to 'em and most importantly, learn from them.&amp;nbsp; But you'll also gain a lot more decision-making experience this way, and the quality of your decisions will improve dramatically.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Unteachable Factors.&lt;/STRONG&gt;&amp;nbsp; Every skill, hard or soft, can only be acquired if you have some abilities as an individual.&amp;nbsp; For decision making these include native intelligence, common sense, and motivation.&amp;nbsp; It's really not practical to teach common sense, for example.&amp;nbsp; At best, you can approximate common sense by developing and using a 'play book' of good decisions for well known situations.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;We do a great job of testing for these factors in our interview process via the chess log exercise.&amp;nbsp; Be sure to watch for them as you interview potential co-workers as well.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;STRONG&gt;Practice, Pay Attention to Your Results, Build Experience.&amp;nbsp; &lt;/STRONG&gt;That's how you become better at decision making.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.vertigosoftware.com/aggbug.aspx?PostID=577" width="1" height="1"&gt;</description></item></channel></rss>