<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel><title>tim-stanley.com</title>
<description>Tim Stanley</description>
<generator>ContentEngine.Mvc</generator>
<link>https://tim-stanley.com/</link>
<item>
  <title>Migrating to .Net8</title>
  <link>https://tim-stanley.com/post/migrating-to-net8/</link>
  <description>&lt;p&gt;On November 14, 2023, Microsoft released .Net 8.
After getting Visual Studio Professional 17.8 installed,
updating to .Net 8 was easy.[more]&lt;/p&gt;
&lt;p&gt;Changing the obligatory TargetFramework entry in all the projects:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;&amp;lt;TargetFramework&amp;gt;net8.0&amp;lt;/TargetFramework&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Updating the package references from 7.0.0 to 8.0.0:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;&amp;lt;PackageReference Include=&amp;quot;Microsoft.Extensions.Hosting&amp;quot; Version=&amp;quot;8.0.0&amp;quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Updating the github action yml file to use the new dotnet version:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;      - name: Set up .NET Core
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: '8.x'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Azure even had all the website hosting ready so I didn't have to wait for anyone to deploy
.Net 8.&lt;/p&gt;
&lt;p&gt;I did need to update the App service configuration to switch from .Net 7 to .Net 8 LTS.
It was a little confusing because only the .NET 8 LTS (Early Access) option was listed for .Net 8.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Migrating-to-Net8/app-service-configuration.png" alt="App Service Configuration" /&gt;&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/compatibility/8.0"&gt;https://learn.microsoft.com/en-us/dotnet/core/compatibility/8.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/announcing-dotnet-8/"&gt;https://devblogs.microsoft.com/dotnet/announcing-dotnet-8/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
  <author>email@nospam.com</author>
  <category>azure</category>
  <category>azure</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/migrating-to-net8/</guid>
  <pubDate>Sun, 26 Nov 2023 01:08:19 GMT</pubDate>
</item>
<item>
  <title>Macbook Pro M2 Limitations for Development</title>
  <link>https://tim-stanley.com/post/macbook-pro-m2-limitations-for-development/</link>
  <description>&lt;p&gt;I recently updated from a 2018 MacBook Pro Intel i9 to a 2023 MacBook Pro M2 Max. The primary reason; faster compilation times. So how much faster is the new MacBook Pro M2 Max than the older machine: &lt;strong&gt;50-80% faster in compile times.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Most of the OSX applications worked without any issues at all, but there were some limitations of the M2 that are not widely documented. There were several Visual Studio limitations on Windows 11 ARM under parallels. This is a summary of the limitations and issues I found. [more]&lt;/p&gt;
&lt;div id="tocautogen" class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_specifications"&gt;Specifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_macbook-osx-limitations-and-issues"&gt;MacBook OSX Limitations and Issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_parallels-windows-11-arm64-limitations-and-issues"&gt;Parallels Windows 11 ARM64 Limitations and Issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_windows-developer-performance-settings"&gt;Windows Developer Performance Settings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;For a professional software developer, a developer machine lasts 5-7 years. Reliable laptops like the MacBook last longer for consumer use, but after 5-7 years the gains in speed for professional software development almost always justify the upgrade even if there are no issues with the hardware.&lt;/p&gt;
&lt;p&gt;When using a large source repository with thousands of libraries that takes over an hour to build, a 50-80% improvement in build time is a significantly measurable increase in productivity.&lt;/p&gt;
&lt;h2 id="h2_specifications"&gt;Specifications&lt;/h2&gt;
&lt;p&gt;The new MacBook Pro M2 Max specification:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apple M2 Max, 12 cores&lt;/li&gt;
&lt;li&gt;64 GB memory LPDDR5&lt;/li&gt;
&lt;li&gt;Sonoma 14.0&lt;/li&gt;
&lt;li&gt;2 TB SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;⠀
The older MacBook specification:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel i9 2.9 Ghz 6-Core&lt;/li&gt;
&lt;li&gt;32 GB memory DDR4&lt;/li&gt;
&lt;li&gt;Ventura 12.5.2&lt;/li&gt;
&lt;li&gt;1 TB SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;⠀&lt;/p&gt;
&lt;h2 id="h2_macbook-osx-limitations-and-issues"&gt;MacBook OSX Limitations and Issues&lt;/h2&gt;
&lt;p&gt;Overall I would rate the M2 OSX migration 5 stars out of 5.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fortinet VPN Client on the Mac did not migrate using a backup/restore with a TimeMachine backup. The Fortinet VPN Client was re-installed, and configuration was setup again and it worked.&lt;/li&gt;
&lt;li&gt;Samsung T5 and T7 SSD's were not readable on the new MacBook. I removed the Samsung lock, reformatted to APFS with encryption and the SSD's were readable.&lt;/li&gt;
&lt;li&gt;Adobe Global Protect 5.1.13-38 would not install. The fix is to update a newer version. Adobe documents that 5.1.13-48 not supported on Sonoma on ARM see &lt;a href="https://docs.paloaltonetworks.com/compatibility-matrix/globalprotect/where-can-i-install-the-globalprotect-app"&gt;https://docs.paloaltonetworks.com/compatibility-matrix/globalprotect/where-can-i-install-the-globalprotect-app&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;⠀
The VPN issues are not entirely unexpected. VPN drivers need to do some low level stuff, but the both Fortinet and Adobe seem to have updates to work through the issues.&lt;/p&gt;
&lt;p&gt;I did have to install Rosetta 2 when prompted. That allowed running the 30 Intel apps that I had installed previously. All without issue so far.&lt;/p&gt;
&lt;p&gt;That was it. For the Mac applications, there were no other issues. That was a pleasant surprise. I was anticipating more compatibility problems.&lt;/p&gt;
&lt;p&gt;Applications I ran without any issues.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Office 365 / Outlook / Word/ Excel / PowerPoint&lt;/li&gt;
&lt;li&gt;Evernote&lt;/li&gt;
&lt;li&gt;Things 3&lt;/li&gt;
&lt;li&gt;ScanSnap&lt;/li&gt;
&lt;li&gt;KeePassXC&lt;/li&gt;
&lt;li&gt;Disk Inventory X&lt;/li&gt;
&lt;li&gt;Authy&lt;/li&gt;
&lt;li&gt;Firefox&lt;/li&gt;
&lt;li&gt;Chrome&lt;/li&gt;
&lt;li&gt;Bear&lt;/li&gt;
&lt;li&gt;Visual Studio code&lt;/li&gt;
&lt;li&gt;.Net 6&lt;/li&gt;
&lt;li&gt;PowerShell core&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;⠀&lt;/p&gt;
&lt;h2 id="h2_parallels-windows-11-arm64-limitations-and-issues"&gt;Parallels Windows 11 ARM64 Limitations and Issues&lt;/h2&gt;
&lt;p&gt;I use Windows 11 under Parallels for software development with Visual Studio and .Net. This was a little more challenging and I ran into a few more issues.&lt;/p&gt;
&lt;p&gt;Overall I would rate this experience 3 stars out of 5 mainly due to the undocumented lack of some Visual Studio Workload support.&lt;/p&gt;
&lt;p&gt;First, Parallels will not run an x64 Windows virtual machine on the M2 chip. It will only run a Windows ARM configuration on the M2 chip. That means a Windows ARM configuration, not a x64 configuration. That also means installing Visual Studio ARM on top of Windows ARM.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Windows Server 2022 VM could not be created. I had a Windows 11 and Windows Server Parallels VM previously.&lt;/li&gt;
&lt;li&gt;Fortinet VPN Client would not install correctly on ARM. It installed, logged an eventlog error and would not start. The alternative is to use the Host Mac VPN client instead.&lt;/li&gt;
&lt;li&gt;SQL Server 2022 Developer Edition would not install on ARM. This is a widely documented issue. SQL Server does run under ARM, it just doesn't install. The workaround is to use powershell install scripts on &lt;a href="https://github.com/jimm98y/MSSQLEXPRESS-M1-Install"&gt;https://github.com/jimm98y/MSSQLEXPRESS-M1-Install&lt;/a&gt; .&lt;/li&gt;
&lt;li&gt;Global Protect VPN 5.1.13-48 is not supported on Windows ARM. It would install without errors, but will not connect. The resolution is to update to Global Protect 6.0 or later.&lt;/li&gt;
&lt;li&gt;Notepad++ on ARM does not have XML Tools plugin support.&lt;/li&gt;
&lt;li&gt;Visual Studio Markdown plugin will not install on Visual Studio 2022 ARM. &lt;a href="https://marketplace.visualstudio.com/items?itemName=MadsKristensen.MarkdownEditor2"&gt;https://marketplace.visualstudio.com/items?itemName=MadsKristensen.MarkdownEditor2&lt;/a&gt; On GitHub at: &lt;a href="https://github.com/madskristensen/MarkdownEditor2022"&gt;https://github.com/madskristensen/MarkdownEditor2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Visual Studio Windows Workflow Foundation will not install on ARM.&lt;/li&gt;
&lt;li&gt;Visual Studio Workload for Data Storage and processing is not available to install on ARM.&lt;/li&gt;
&lt;li&gt;Visual Studio Workload for Data Science and analytical applications is not available to install on ARM.&lt;/li&gt;
&lt;li&gt;Visual Studio Workload for Office / SharePoint development is not available to install on ARM.&lt;/li&gt;
&lt;li&gt;Visual Studio LINQ to SQL tools is not available to install on ARM.&lt;/li&gt;
&lt;li&gt;Visual Studio class designer is not available to install on ARM.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;⠀
That's quite a few Workloads and components for Visual Studio not supported on the ARM. I have not seen that information listed anywhere that those are not supported. If your development needs require them and you use Windows 11 on an ARM, you have been warned.&lt;/p&gt;
&lt;p&gt;This link describes the Visual Studio workloads supported by ARM:
&lt;a href="https://github.com/MicrosoftDocs/visualstudio-docs/blob/main/docs/install/visual-studio-on-arm-devices.md"&gt;https://github.com/MicrosoftDocs/visualstudio-docs/blob/main/docs/install/visual-studio-on-arm-devices.md&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Arm64 GA supports the following workloads:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.NET desktop development&lt;/li&gt;
&lt;li&gt;Desktop development with C++&lt;/li&gt;
&lt;li&gt;ASP.NET and web development&lt;/li&gt;
&lt;li&gt;Universal Windows Platform development&lt;/li&gt;
&lt;li&gt;Visual Studio extension development&lt;/li&gt;
&lt;li&gt;Game development with C++&lt;/li&gt;
&lt;li&gt;Node.js development&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately Microsoft does not list the workloads that are not supported. That was a bit of a disappointment that Windows Workflow Foundation isn't supported. I work with a company that is currently using Windows Workflow Foundation so those projects will not build. I know Windows Workflow foundation did not make it's way into .Net 5 or later, but it is a bit disappointing for it not to show up on ARM.&lt;/p&gt;
&lt;p&gt;The Data storage and processing workload (which is not available for ARM) includes Azure Development for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Data Lake and Stream Analytics Tools&lt;/li&gt;
&lt;li&gt;Azure Resource Manager tools&lt;/li&gt;
&lt;li&gt;Azure Cloud Services tools&lt;/li&gt;
&lt;li&gt;Service Fabric Tools&lt;/li&gt;
&lt;li&gt;Azure Powershell&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following Visual Studio Cloud, database, and server components are not available to install on ARM:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Authoring Tools&lt;/li&gt;
&lt;li&gt;Azure Cloud Services build tools&lt;/li&gt;
&lt;li&gt;Azure Cloud Services core tools&lt;/li&gt;
&lt;li&gt;Azure Compute Emulator&lt;/li&gt;
&lt;li&gt;Azure Data Lake and Stream Analytics Tools&lt;/li&gt;
&lt;li&gt;Azure development prerequisites&lt;/li&gt;
&lt;li&gt;Azure libraries for .NET&lt;/li&gt;
&lt;li&gt;Azure Powershell&lt;/li&gt;
&lt;li&gt;Azure Resource Manager core tools&lt;/li&gt;
&lt;li&gt;CLR Data types for SQL Server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to this link for more information on ARM64 Visual Studio:
&lt;a href="https://devblogs.microsoft.com/visualstudio/arm64-visual-studio/"&gt;https://devblogs.microsoft.com/visualstudio/arm64-visual-studio/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The SQL Server install issue is a bit confusing. Microsoft documents SQL will support running on ARM64 &lt;a href="https://learn.microsoft.com/en-us/sql/sql-server/install/hardware-and-software-requirements-for-installing-sql-server-2019?view=sql-server-ver15#pmosr"&gt;https://learn.microsoft.com/en-us/sql/sql-server/install/hardware-and-software-requirements-for-installing-sql-server-2019?view=sql-server-ver15#pmosr&lt;/a&gt;. But there seems to be something in the installation process that fails on ARM64. The PowerShell scripts workaround provided an ideal solution.&lt;/p&gt;
&lt;p&gt;This are other workarounds to the SQL Server install issue by using a docker instance, but that only uses SQL Authentication and not Active Directory domain authentication. &lt;a href="https://database.guide/how-to-install-sql-server-on-an-m1-mac-arm64/"&gt;https://database.guide/how-to-install-sql-server-on-an-m1-mac-arm64/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On a positive note, the following software ran on Windows ARM under the Parallels virtual machine without issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;7zip&lt;/li&gt;
&lt;li&gt;Notepad++ (one XML extension issue noted above)&lt;/li&gt;
&lt;li&gt;.Net 7 SDK 7.0.12&lt;/li&gt;
&lt;li&gt;Powershell Core 7.3.8&lt;/li&gt;
&lt;li&gt;Git 2.41&lt;/li&gt;
&lt;li&gt;OpenJS.NodeJS.LTS --version 16.20.0&lt;/li&gt;
&lt;li&gt;Python 3.8&lt;/li&gt;
&lt;li&gt;MSBuildStructuredLogViewer&lt;/li&gt;
&lt;li&gt;WinMerge 2.16.32&lt;/li&gt;
&lt;li&gt;Agent Ransack&lt;/li&gt;
&lt;li&gt;DB Browser for SQLite&lt;/li&gt;
&lt;li&gt;Quicken Classic&lt;/li&gt;
&lt;li&gt;Visual Studio 2022&lt;/li&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;li&gt;SQL Server 2022 Developer Edition (see install issue above)&lt;/li&gt;
&lt;li&gt;Microsoft SQL Server Management Studio 19.1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_windows-developer-performance-settings"&gt;Windows Developer Performance Settings&lt;/h2&gt;
&lt;p&gt;A few key tips for getting maximum performance from a virtual machine for Windows.&lt;/p&gt;
&lt;p&gt;Disable Windows Search (Services, Windows Search, properties, Startup type: Disabled). It runs in the background draining resources for compiles.&lt;/p&gt;
&lt;p&gt;For a virtual machine, set the hard disk properties to enable write caching, and turn off windows write-cache buffer flushing.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Macbook%20Pro%20M2%20Limitations%20for%20Development/image.png" alt="Hard Disk SSD Properties"&gt;&lt;/p&gt;
&lt;p&gt;And tell Windows Defender / Windows Security to ignore the build tools.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Set-MpPreference -ExclusionExtension @(&amp;quot;.cs&amp;quot;, &amp;quot;.csproj&amp;quot;, &amp;quot;.json&amp;quot;, &amp;quot;.xml&amp;quot;) -ExclusionProcess @(&amp;quot;dotnet.exe&amp;quot;, &amp;quot;msbuild.exe&amp;quot;, &amp;quot;node.exe&amp;quot;, &amp;quot;devenv.exe&amp;quot;, &amp;quot;git.exe&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Microsoft on Windows 11 has a new performance feature called Dev Drive which runs ReFS instead of NTFS.
The theory is it's a faster file system, and can be tuned to tell Windows Defender to ignore some of the disk i/o for faster build times.
I tried it under Windows 11 in Parallels, but I did not see any measurable increase in build times.&lt;/p&gt;
</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>software-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/macbook-pro-m2-limitations-for-development/</guid>
  <pubDate>Wed, 01 Nov 2023 00:49:11 GMT</pubDate>
</item>
<item>
  <title>Office 365 HTML Attachment Mail Flow Rules</title>
  <link>https://tim-stanley.com/post/office-365-html-attachment-mail-flow-rules/</link>
  <description>&lt;p&gt;Office 365 will by default filter out emails that have attachments that are executables (exe, scr, ps1, cmd, etc.) as well as an unencrypted zip file that contains executables. Office 365 allows HTML files as attachments to email because these are considered to be potentially valid email from some vendors. Attackers will attach HTML files that contain malicious javascript and will try to mask the origin of the email and it's contents. If they can convince you to download the attachment and open it, this can cause you some serious problems. This article is a summary of how to create an Office 365 Exchange Mail Flow rule to add some warning to users.[more]&lt;/p&gt;
&lt;div id="tocautogen" class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_exchange-admin-center-mail-flow-rules"&gt;Exchange Admin Center Mail Flow Rules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_exchange-admin-center-mail-flow-rules"&gt;Exchange Admin Center Mail Flow Rules&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://admin.exchange.microsoft.com/#/transportrules"&gt;https://admin.exchange.microsoft.com/#/transportrules&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the Exchange Admin Center.
Select Rules, + Add a rule&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Office%20365%20HTML%20Attachment%20Mail%20Flow%20Rules/image.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;The new rule should have the following key entries:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Apply this rule if any attachment matches HTML, HTML, html or htm.&lt;/li&gt;
&lt;li&gt;Prepend the subject of the message with [ATTACHMENT-FAIL]&lt;/li&gt;
&lt;li&gt;Apply and prepend a disclaimer&lt;/li&gt;
&lt;li&gt;Generate and Incident report and send it to the domain administrators.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;p&amp;gt;
[ATTACHMENT-FAIL] WARNING, 
This message has an HTML attachment and may be invalid or contain a virus. 
USE EXTREME CAUTION in opening any attachment.
&amp;lt;/p&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Below is an image of the rule.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Office%20365%20HTML%20Attachment%20Mail%20Flow%20Rules/image%202.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Office%20365%20HTML%20Attachment%20Mail%20Flow%20Rules/image%203.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Office%20365%20HTML%20Attachment%20Mail%20Flow%20Rules/image%204.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;Once the rule is created, it will be disabled by default. The rule needs to be enabled to process the rules.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Office%20365%20HTML%20Attachment%20Mail%20Flow%20Rules/image%205.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;#evernote&lt;/p&gt;
</description>
  <author>email@nospam.com</author>
  <category>office-365</category>
  <category>exchange</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/office-365-html-attachment-mail-flow-rules/</guid>
  <pubDate>Mon, 01 May 2023 01:07:21 GMT</pubDate>
</item>
<item>
  <title>Office 365 SPF Mail Flow Rules</title>
  <link>https://tim-stanley.com/post/office-365-spf-mail-flow-rules/</link>
  <description>&lt;p&gt;The Sender Policy Framework (SPF) allows one to configure DNS entries to list valid sources of truth for Office 365 email. Attackers will often try to send email from outside a domain to recipients inside the domain by pretending they are another person within the company. Creating an SPF rule that flags messages from outside the company pretending to be inside the company alerts users. This article is a summary of how to create an Office 365 Exhcange Mail Flow rule to warn users of SPF invalid messages.[more]&lt;/p&gt;
&lt;div id="tocautogen" class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_configure-the-spf-dns-entry"&gt;Configure the SPF DNS Entry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_configure-the-exchange-admin-center-mail-flow-rule"&gt;Configure the Exchange Admin Center Mail Flow Rules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_configure-the-spf-dns-entry"&gt;Configure the SPF DNS Entry&lt;/h2&gt;
&lt;p&gt;A DNS entry is required to list the valid sources from where email can be sent. Below is an example SPF record for an Office 365 account.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;v=spf1 include:spf.protection.outlook.com -all
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_configure-the-exchange-admin-center-mail-flow-rule"&gt;Configure the Exchange Admin Center Mail Flow Rules&lt;/h2&gt;
&lt;p&gt;Navigate to the Exchange Admin Center.
Select Rules, + Add a rule&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Office%20365%20SPF%20Mail%20Flow%20Rules/image.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;The new rule should have the following key entries:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Apply this rule if the message headers 'Authentication-Results' includes 'spf-permerror' or 'Received-SPF:Fail' or 'spf-fail' or 'SPF:Fail'&lt;/li&gt;
&lt;li&gt;The sender domain is &lt;code&gt;{your-email-domain.com}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Prepend the subject with [SPF-FAIL]&lt;/li&gt;
&lt;li&gt;Apply a disclaimer to the message and prepend the appropriate prepend warning text.&lt;/li&gt;
&lt;li&gt;Generate and incident and send it to the domain administrators.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sample prepend warning text.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;
[SPF-FAIL] WARNING, This messages does not appear to be a valid domain.com mail message. 
USE EXTREME CAUTION in opening any attachment.
&amp;lt;/p&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Below are the images used in Office 365 to configure a new rule.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Office%20365%20SPF%20Mail%20Flow%20Rules/image%202.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Office%20365%20SPF%20Mail%20Flow%20Rules/image%203.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Office%20365%20SPF%20Mail%20Flow%20Rules/image%204.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;Enable the rule.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Office%20365%20SPF%20Mail%20Flow%20Rules/image%205.png" alt=""&gt;&lt;/p&gt;
</description>
  <author>email@nospam.com</author>
  <category>office-365</category>
  <category>exchange</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/office-365-spf-mail-flow-rules/</guid>
  <pubDate>Mon, 01 May 2023 00:43:11 GMT</pubDate>
</item>
<item>
  <title>Deriving Version Information from Git for Incremental Builds</title>
  <link>https://tim-stanley.com/post/deriving-version-information-from-git-for-incremental-builds/</link>
  <description>&lt;p&gt;If you want to generate a unique build number for each build in Azure Devops, Git, Team City, or other environments consistently, it can be challenging. This article is a summary of how to generate a unique build number when using git repositories, across multiple environments. [more]&lt;/p&gt;
&lt;div id="tocautogen" class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_microsoft-guidance"&gt;Microsoft Guidance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_semantic-versioning-20"&gt;Semantic Versioning 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_versioning-tools"&gt;Versioning Tools&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h3_minversion"&gt;MinVersion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_gitversion"&gt;GitVersion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_nerdbankgitversioning"&gt;NerdBank.GitVersioning&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_powershell-git-versioning"&gt;PowerShell Git Versioning&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h3_git-tags"&gt;Git Tags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_get-gitversion-function"&gt;Get-GitVersion Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_test-samples"&gt;Test Samples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_dotnet-msbuild-parameters"&gt;Dotnet MSBUILD Parameters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_package-reference-changes"&gt;Package Reference Changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_cicd-counters"&gt;CI/CD Counters&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h3_team-city"&gt;Team City&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_github-actions"&gt;GitHub Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_github-action-sample"&gt;GitHub Action Sample&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_azure-pipelines"&gt;Azure Pipelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_azure-pipelines-sample"&gt;Azure Pipelines Sample&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_powershell-script-sample"&gt;PowerShell Script Sample&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_update"&gt;Update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_microsoft-guidance"&gt;Microsoft Guidance&lt;/h2&gt;
&lt;p&gt;Microsoft has some guidance for versioning of libraries at &lt;a href="https://learn.microsoft.com/en-ca/dotnet/standard/library-guidance/versioning#version-numbers"&gt;https://learn.microsoft.com/en-ca/dotnet/standard/library-guidance/versioning#version-numbers&lt;/a&gt; [1].&lt;/p&gt;
&lt;p&gt;Microsoft also has some guidance on package versioning of pre-releases at &lt;a href="https://learn.microsoft.com/en-us/nuget/create-packages/prerelease-packages"&gt;https://learn.microsoft.com/en-us/nuget/create-packages/prerelease-packages&lt;/a&gt; [2]&lt;/p&gt;
&lt;p&gt;Some key points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CONSIDER using SemVer 2.0.0 to version your NuGet package version.&lt;/li&gt;
&lt;li&gt;CONSIDER only including a major version in the AssemblyVersion. aka 7.0.0.0. This helps reduce binding redirects.&lt;/li&gt;
&lt;li&gt;DO use an AssemblyFileVersion the format Major.Minor.Build.Revision for file version.&lt;/li&gt;
&lt;li&gt;Older versions of Visual Studio raise a build warning if this version doesn't follow the format Major.Minor.Build.Revision. The warning can be safely ignored.&lt;/li&gt;
&lt;li&gt;And implied, CONSIDER making the FileVersion and PackageVersion unique for each build.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Warning:&lt;/strong&gt; If you push your packages to a NuGet server, Azure Artifacts, or GitHub Artifacts, the PackageVersion must be unique on each build.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;📝 &lt;strong&gt;Note:&lt;/strong&gt; If a PackageVersion is not unique on each build, the nuget cache must be cleared between builds or the restore will not pick up the new package..&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;📝 &lt;strong&gt;Note:&lt;/strong&gt; New style CSPROJ files that use the dotnet SDK (Microsoft.Net.SDK) style projects do not require the AssemblyInfo.cs file. Old style CSPROJ files that use the MSBUILD xml format, use AssembyInfo.cs to control default version information.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p major="" minor="" build="" revision=""&gt;📝 &lt;strong&gt;Note:&lt;/strong&gt; Traditional Microsoft build tooling used versioning in the format: ....&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="h2_semantic-versioning-20"&gt;Semantic Versioning 2.0&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://semver.org"&gt;Semantic Versioning&lt;/a&gt; [3] provides a versioning scheme useful for libraries and packages.&lt;/p&gt;
&lt;p&gt;Key points semantic versioning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It effects a &lt;strong&gt;PUBLIC API&lt;/strong&gt;, not internals, or dependencies.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{major}.{minor}.{match}-{prerelease}+{metadata}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Major number changes for any public API breaking non backward compatible change.&lt;/li&gt;
&lt;li&gt;Uses the following format&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;valid semver&amp;gt; ::= &amp;lt;version core&amp;gt;
                 | &amp;lt;version core&amp;gt; &amp;quot;-&amp;quot; &amp;lt;pre-release&amp;gt;
                 | &amp;lt;version core&amp;gt; &amp;quot;+&amp;quot; &amp;lt;build&amp;gt;
                 | &amp;lt;version core&amp;gt; &amp;quot;-&amp;quot; &amp;lt;pre-release&amp;gt; &amp;quot;+&amp;quot; &amp;lt;build&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Semantic Versioning Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Public Release Examples: 1.0.0, 7.0.2, 7.0.3.&lt;/li&gt;
&lt;li&gt;Prerelease Examples: 1.0.0-alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92, 1.0.0-x-y-z.--.&lt;/li&gt;
&lt;li&gt;Metadata Examples: 1.0.0-alpha+001, 1.0.0+20130313144700, 1.0.0-beta+exp.sha.5114f85, 1.0.0+21AF26D3----117B344092BD.&lt;/li&gt;
&lt;li&gt;Precedence of prerelease is less than without prerelease, Example: 1.0.0-alpha &amp;lt; 1.0.0.&lt;/li&gt;
&lt;li&gt;Precedence of prerelease is alphabetic, Example: 1.0.0-alpha &amp;lt; 1.0.0-alpha.1 &amp;lt; 1.0.0-alpha.beta &amp;lt; 1.0.0-beta &amp;lt; 1.0.0-beta.2 &amp;lt; 1.0.0-beta.11 &amp;lt; 1.0.0-rc.1 &amp;lt; 1.0.0.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_versioning-tools"&gt;Versioning Tools&lt;/h2&gt;
&lt;h3 id="h3_minversion"&gt;MinVersion&lt;/h3&gt;
&lt;p&gt;The MinVersion package is good if you want use semantic versioning 2.0 and want to embed the logic for the generation into MSBUILD properties for a project. The MinVersion CLI also provides a string that uses the same algorithm. Both the MinVersion package and the MinVersion CLI derive a version from a git tag in a special format (i.e. '7.0.2', 'ver-7.02')&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.nuget.org/packages/MinVer"&gt;https://www.nuget.org/packages/MinVer&lt;/a&gt; [4]&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;dotnet add package MinVer --version 4.3.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="https://www.nuget.org/packages/minver-cli"&gt;https://www.nuget.org/packages/minver-cli&lt;/a&gt; [5]&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;dotnet tool install --global minver-cli --version 4.3.0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="h3_gitversion"&gt;GitVersion&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/GitTools/GitVersion"&gt;GitVersion&lt;/a&gt; [6] provides both a command line and MSBUILD package to set properties for a project during a build. GitVersion also has support for GitHub Actions and Azure Pipelines.&lt;/p&gt;
&lt;p&gt;Git version provides some very powerful options for continuous builds and for builds from Visual Studio Like MinVersion, the GitVersion package is good if you want use semantic versioning 2.0 and want to embed the logic for the generation into MSBUILD properties for a project.&lt;/p&gt;
&lt;h3 id="h3_nerdbankgitversioning"&gt;NerdBank.GitVersioning&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/AArnott/Nerdbank.GitVersioning"&gt;Nerdbank.GitVersioning&lt;/a&gt; [7] adds precise, semver-compatible git commit information to every assembly, VSIX, NuGet and NPM package, and more. It implicitly supports all cloud build services and CI server software because it simply uses git itself and integrates naturally in MSBuild, gulp and other build scripts.&lt;/p&gt;
&lt;p&gt;NBGV uses a version.json file along with settings in a Directory.Build.Props file to set versioning. This means it will work with dotnet command line calls, as well as will Visual Studio Builds (if the package is added to a project).&lt;/p&gt;
&lt;h2 id="h2_powershell-git-versioning"&gt;PowerShell Git Versioning&lt;/h2&gt;
&lt;p&gt;MinVersion and GitVersion provide some compelling and powerful options, particularly if there is a desire to use the NuGet package so that version information is consistent across Visual Studio.&lt;/p&gt;
&lt;p&gt;I have releases that are only built using command line tools, but I want to be able to build from Linux, Mac, Windows, and in Team City, GitHub Actions, and Azure Pipelines without having to adopt a new versioning strategy or change significant build scripts.&lt;/p&gt;
&lt;p&gt;I use one of three methods for building releases, all of which are command line related:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A PowerShell command line that calls dotnet msbuild, invoked by Team City build agents.&lt;/li&gt;
&lt;li&gt;GitHub Actions.&lt;/li&gt;
&lt;li&gt;Azure Pipelines.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;GitVersion and MinVersion provide the semantic versioning calculations to come up with an appropriate package versioning scheme. If we simply let the git tag used by those patterns be used without the calculations, then the package versioning scheme can be simplified.&lt;/p&gt;
&lt;p&gt;I have simplified the MinVersion and GitVersion logic even further so that with a simple and appropriate tag, an appropriate RTM version, continuous release, or pre-release can be generated, all using the same construct, and all derived from the latest tag in a git repository.&lt;/p&gt;
&lt;p&gt;To create a version, we need a few things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A git tag with a base version number with three digits &lt;code&gt;{major}.{minor}.{build}&lt;/code&gt; or &lt;code&gt;{major}.{minor}.{patch}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A count to be used for incremental build number &lt;code&gt;{revision}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;An indicator if this is a pre-release or not.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By placing a tag on a git commit that contains the first three digits of a version number, then we can then count how many git commits have been made since that version number. That git tag can also include pre-release information if needed.&lt;/p&gt;
&lt;h3 id="h3_git-tags"&gt;Git Tags&lt;/h3&gt;
&lt;p&gt;By using a pattern prefix for a tag such as 'ver-*', then it makes it easy to search the tags in a git repository and find the latest in PowerShell. This pattern of tags for versioning is used by some other tools mentioned above.&lt;/p&gt;
&lt;p&gt;Create a tag with a prefix matching the pattern &lt;code&gt;'ver-*'&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;git tag -a ver-7.0.2 -m &amp;quot;set version to 7.0.2&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Find the last tag with the prefix 'ver-*'
powershell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$tag = git tag --list 'ver-*' | Select-Object -Last 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, find the count of how many git commits have been made since the above tag.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;$hash = git show $tag --format=&amp;quot;%H&amp;quot; -s | Select-Object -Last 1
$line = (&amp;quot;git show {0}..HEAD --format=&amp;quot;&amp;quot;%H&amp;quot;&amp;quot; -s&amp;quot; -f $hash)
$items = Invoke-Expression $line
$count = $items.Count
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;📝 &lt;strong&gt;Note:&lt;/strong&gt; Git push and Visual Studio git push do not normally push tags. If creating a local tag, you must use the &lt;code&gt;--tags&lt;/code&gt; command to push tags to the cloud after the tags are created locally.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;git push --tags
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tag Examples:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;RTM: &lt;code&gt;'ver-7.0.2'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Pre-Release: &lt;code&gt;'ver-7.0.3-alpha'&lt;/code&gt;, &lt;code&gt;'ver-7.0.3-alpha.0'&lt;/code&gt;, &lt;code&gt;'ver-7.0.3-beta.0'&lt;/code&gt;, &lt;code&gt;'ver-7.0.3-prerelease.0'&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Release Candidate: Pre-Release: &lt;code&gt;'ver-7.0.3-rc'&lt;/code&gt;, &lt;code&gt;'ver-7.0.3-rc.0'&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Continuous Build: &lt;code&gt;'ver-7.0.2'&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="h3_get-gitversion-function"&gt;Get-GitVersion Function&lt;/h3&gt;
&lt;p major="" minor="" build="" patch=""&gt;A PowerShell function that given a git semver compatible tag with at least three digits for .. or .., will return a compatible array of Microsoft matching AssumblyVersion, FileVersion, and PackageVersion strings.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;function  Get-GitVersion
{
	param ( [string] $VersionInput, [int] $Count )

	$revision = $count
	$ver = $VersionInput.Replace(&amp;quot;ver-&amp;quot;, &amp;quot;&amp;quot;)

	$va = $ver.Split(&amp;quot;.&amp;quot;)
	$major = $va[0]
	$minor = $va[1]
	# Visual Studio / MSBUILD - {major}.{minor}.{build}.{revision}
	# SEMVER - {major}.{minor}.{match}-{prerelease}+{metadata}

	# $va[2] can contain a - if using semver
	[bool] $isSemVer = $va[2].Contains(&amp;quot;-&amp;quot;)
	if ($isSemVer)
	{
		$pr = $va[2].Split(&amp;quot;-&amp;quot;)
		$build = $pr[0]
	}
	else {
		$build = $va[2]
	}

	$av = (&amp;quot;{0}.{1}.{2}.{3}&amp;quot; -f $major,$minor,$build,$revision)
	$fv = (&amp;quot;{0}.{1}.{2}.{3}&amp;quot; -f $major,$minor,$build,$revision)
	if (($Count -gt 0) -or ($isSemVer))
	{
		$pv = (&amp;quot;{0}.{1}.{2}.{3}&amp;quot; -f $va[0], $va[1], $va[2], $revision)
	}
	else
	{
		$pv = (&amp;quot;{0}.{1}.{2}&amp;quot; -f $va[0], $va[1], $va[2])
	}

	$Versions = @($av, $fv, $pv)
	return $Versions
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Calling the function is a matter of gluing the elements together:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;$versions = Get-GitVersion -VersionInput  $tag -Count $count
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;$versions[0] contains AssemblyVersion&lt;/li&gt;
&lt;li&gt;$versions[1] contains FileVersion&lt;/li&gt;
&lt;li&gt;$versions[2] contains PackageVersion&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3_test-samples"&gt;Test Samples&lt;/h3&gt;
&lt;p&gt;Below are several tag examples and what will be returned by the AssemblyVersion, FileVersion, and PackageVersions.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;ag = ver-0.0.0; Count = 0
AssemblyVersion = 0.0.0.0
FileVersion = 0.0.0.0
PackageVersion = 0.0.0
====================
Tag = ver-7.0.2; Count = 0
AssemblyVersion = 7.0.2.0
FileVersion = 7.0.2.0
PackageVersion = 7.0.2
====================
Tag = ver-7.0.2; Count = 3
AssemblyVersion = 7.0.2.3
FileVersion = 7.0.2.3
PackageVersion = 7.0.2.3
====================
Tag = ver-7.0.2.1; Count = 3
AssemblyVersion = 7.0.2.3
FileVersion = 7.0.2.3
PackageVersion = 7.0.2.3
====================
Tag = ver-7.0.2-dev; Count = 0
AssemblyVersion = 7.0.2.0
FileVersion = 7.0.2.0
PackageVersion = 7.0.2-dev.0
====================
Tag = ver-7.0.2-dev; Count = 5
AssemblyVersion = 7.0.2.5
FileVersion = 7.0.2.5
PackageVersion = 7.0.2-dev.5
====================
Tag = ver-7.0.3-dev; Count = 3
AssemblyVersion = 7.0.3.3
FileVersion = 7.0.3.3
PackageVersion = 7.0.3-dev.3
====================
Tag = ver-7.0.2-1; Count = 0
AssemblyVersion = 7.0.2.0
FileVersion = 7.0.2.0
PackageVersion = 7.0.2-1.0
====================
Tag = ver-7.0.2-1; Count = 2
AssemblyVersion = 7.0.2.2
FileVersion = 7.0.2.2
PackageVersion = 7.0.2-1.2
====================
minver --default-pre-release-identifiers 'dev' --tag-prefix &amp;quot;ver-&amp;quot;
MinVer: Using { Commit: 87103c9, Tag: 'ver-7.0.2', Version: 7.0.2, Height: 38 }.
MinVer: Calculated version 7.0.3-dev.38.
Tag = 7.0.3-dev; Count = 38
AssemblyVersion = 7.0.3.38
FileVersion = 7.0.3.38
PackageVersion = 7.0.3-dev.38
====================
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="h3_dotnet-msbuild-parameters"&gt;Dotnet MSBUILD Parameters&lt;/h3&gt;
&lt;p&gt;Now we can pass those parameters for the version information to the build&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;$AssemblyVersion = $versions[0]
$FileVersion = $versions[1]
$PackageVersion = $versions[2]
dotnet msbuild $Solution -p:Configuration=&amp;quot;Release&amp;quot; `
-p:AssemblyVersion=$($AssemblyVersion) `
-p:FileVersion=$($FileVersion) `
-p:Version=$($PackageVersion)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_package-reference-changes"&gt;Package Reference Changes&lt;/h2&gt;
&lt;p&gt;To have a project reference &lt;strong&gt;both&lt;/strong&gt; a wildcard version, and a wildcard pre-release version, an additional specifier is needed.&lt;/p&gt;
&lt;p&gt;To Reference &lt;strong&gt;only&lt;/strong&gt; a wildcard published version, use a single wildcard character.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;&amp;lt;PackageReference Include=&amp;quot;subsystem-1.libA&amp;quot; Version=&amp;quot;7.*&amp;quot; /&amp;gt;
&amp;lt;PackageReference Include=&amp;quot;subsystem-1.libA&amp;quot; Version=&amp;quot;[7.*, )&amp;quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To Reference &lt;strong&gt;both&lt;/strong&gt; a wildcard published version, and a pre-release version, use a two wildcard characters with a hyphen '-' separating them. This will pick up the latest package available (published or pre-release).&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;&amp;lt;PackageReference Include=&amp;quot;subsystem-1.libA&amp;quot; Version=&amp;quot;7.*-*&amp;quot; /&amp;gt;
&amp;lt;PackageReference Include=&amp;quot;subsystem-1.libA&amp;quot; Version=&amp;quot;[7.*-*, )&amp;quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_cicd-counters"&gt;CI/CD Counters&lt;/h2&gt;
&lt;p&gt;Several systems provide a unique build counter that is triggered on each build.&lt;/p&gt;
&lt;h3 id="h3_team-city"&gt;Team City&lt;/h3&gt;
&lt;p&gt;Team City provides a &lt;code&gt;build.counter&lt;/code&gt; value that is incremented each time a build is triggered. It can be reset or set to a specific number to start with, but always increments on each build (success or failure).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.jetbrains.com/help/teamcity/2022.10/configuring-general-settings.html#ConfiguringGeneralSettings-buildCounter"&gt;Configuring General Settings | TeamCity On-Premises Documentation (jetbrains.com)&lt;/a&gt; [8]&lt;/p&gt;
&lt;h3 id="h3_github-actions"&gt;GitHub Actions&lt;/h3&gt;
&lt;p&gt;GitHub Actions provides an environment variable &lt;code&gt;GITHUB_RUN_NUMBER&lt;/code&gt; that increments on each build. There does not appear to be a way to control it.
&lt;a href="https://github.com/GitTools/actions"&gt;https://github.com/GitTools/actions&lt;/a&gt; [9]&lt;/p&gt;
&lt;p&gt;When using GitHub Actions, the fetch-depth must be explicitly set so that the tags beyond the first commit will be available to the script.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;steps:
      - uses: actions/checkout@v3
        with:
            fetch-depth: 0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="h3_github-action-sample"&gt;GitHub Action Sample&lt;/h3&gt;
&lt;p&gt;A GitHub Action to invoke a powershell command&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;name: UX - Build and deploy to Azure Web App - tim-stanley-x

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
        with:
            fetch-depth: 0

      - name: Set up .NET Core
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: '7.x'

      - name: PowerShell Build
        shell: pwsh
        run: |
          ./gitbuild.ps1 

      - name: Upload artifact for deployment job
        uses: actions/upload-artifact@v3
        with:
          name: .net-app
          path: ${{env.DOTNET_ROOT}}/myapp
          if-no-files-found: error
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="h3_azure-pipelines"&gt;Azure Pipelines&lt;/h3&gt;
&lt;p&gt;Azure has a Build.BuildNumber and within it a $(Rev:r) number.&lt;/p&gt;
&lt;p&gt;Build.BuildNumber &lt;a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&amp;amp;tabs=yaml"&gt;https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&amp;amp;tabs=yaml&lt;/a&gt; [10]
$(Rev:r) &lt;a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/process/run-number?view=azure-devops&amp;amp;tabs=yaml"&gt;https://learn.microsoft.com/en-us/azure/devops/pipelines/process/run-number?view=azure-devops&amp;amp;tabs=yaml&lt;/a&gt; [11]&lt;/p&gt;
&lt;p&gt;The Rev: value is incremented on each new day if using the default value. When a build starts, if nothing else in the build number has changed, the Rev integer value is incremented by one.&lt;/p&gt;
&lt;p&gt;When using Azure Pipelines, the fetchDepth must be explicitly set so that the tags beyond the first commit will be available to the script.&lt;/p&gt;
&lt;h3 id="h3_azure-pipelines-sample"&gt;Azure Pipelines Sample&lt;/h3&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;steps:
- checkout: self
  fetchDepth: 0  # the depth of commits to ask Git to fetch, 0 = full depth, so we get tags.
  fetchTags: true

- task: PowerShell@2
  displayName: 'Build'
  env:
     Build.Agent: &amp;quot;AZURE&amp;quot;
     Build.Configuration: &amp;quot;Release&amp;quot;
     Build.PublishArtifacts: &amp;quot;true&amp;quot;
     Build.Branch: $(Build.SourceBranchName)
     Build.Azure.BuildNumber: $(Build.BuildNumber)
  inputs:
    filePath: &amp;quot;$(System.DefaultWorkingDirectory)/gitbuild.ps1&amp;quot;
    failOnStderr: true
    showWarnings: true
    pwsh: true # Use PowerShell.Core
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_powershell-script-sample"&gt;PowerShell Script Sample&lt;/h2&gt;
&lt;p&gt;The powershell script gitbuild.ps1 referenced by the GitHub Action and AzurePipeline&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;function  Get-GitVersion
{
	param ( [string] $VersionInput, [int] $Count )

	$revision = $count
	$ver = $VersionInput.Replace(&amp;quot;ver-&amp;quot;, &amp;quot;&amp;quot;)

	$va = $ver.Split(&amp;quot;.&amp;quot;)
	$major = $va[0]
	$minor = $va[1]
	# Visual Studio / MSBUILD - {major}.{minor}.{build}.{revision}
	# SEMVER - {major}.{minor}.{match}-{prerelease}+{metadata}

	# $va[2] can contain a - if using semver
	[bool] $isSemVer = $va[2].Contains(&amp;quot;-&amp;quot;)
	if ($isSemVer)
	{
		$pr = $va[2].Split(&amp;quot;-&amp;quot;)
		$build = $pr[0]
	}
	else {
		$build = $va[2]
	}

	$av = (&amp;quot;{0}.{1}.{2}.{3}&amp;quot; -f $major,0,0,0)
	$fv = (&amp;quot;{0}.{1}.{2}.{3}&amp;quot; -f $major,$minor,$build,$revision)
	if (($Count -gt 0) -or ($isSemVer))
	{
		$pv = (&amp;quot;{0}.{1}.{2}.{3}&amp;quot; -f $va[0], $va[1], $va[2], $revision)
	}
	else
	{
		$pv = (&amp;quot;{0}.{1}.{2}&amp;quot; -f $va[0], $va[1], $va[2])
	}

	$Versions = @($av, $fv, $pv)
	return $Versions
}

################################
# Calculate the version numbers from git tags and commits
################################
# obtain the latest git tag
$tag = git tag --list ver-* | Select-Object -Last 1
[int] $count = 0
if ($null -ne $tag)
{
	# calculate how many commits since the tag
	$hash = git show $tag --format=&amp;quot;%H&amp;quot; -s | Select-Object -Last 1
	$line = (&amp;quot;git show {0}..HEAD --format=&amp;quot;&amp;quot;%H&amp;quot;&amp;quot; -s&amp;quot; -f $hash)
	$items = Invoke-Expression $line
	if ($null -ne $items)
	{
		$count = $items.Count
	}

	Write-Host (&amp;quot;Tag={0}&amp;quot; -f $tag)
	Write-Host (&amp;quot;Count={0}&amp;quot; -f $count)

	$versions = Get-GitVersion -VersionInput  $tag -Count $count
	$AssemblyVersion = $versions[0]
	$FileVersion = $versions[1]
	$PackageVersion = $versions[2]
}
else # No tag found, set some defaults
{
	Write-Host(&amp;quot;No tag found, using defaults&amp;quot;)
	$AssemblyVersion = &amp;quot;0.0.0.1&amp;quot;
	$FileVersion = &amp;quot;0.0.0.1&amp;quot;
	$PackageVersion = &amp;quot;0.0.0.1&amp;quot;
}

Write-Host (&amp;quot;FileVersion = {0}&amp;quot; -f $FileVersion)

$p = &amp;quot;./artifacts/logs/&amp;quot;
if (-Not (Test-Path -Path $p))
{
    $d = New-Item -ItemType Directory $p
}

################################
# Restore
################################
Write-Host (&amp;quot;dotnet restore&amp;quot;)
dotnet restore ./Source/ContentEngine.Mvc.sln `

################################
# Build
################################
Write-Host (&amp;quot;dotnet msbuild&amp;quot;)
dotnet msbuild -p:Configuration=Release ./Source/ContentEngine.Mvc.sln `
    -p:AssemblyVersion=$($AssemblyVersion) `
    -p:FileVersion=$($FileVersion) `
    -p:Version=$($PackageVersion) `
    -p:AllowedOutputExtensionsInPackageBuildOutputFolder=\&amp;quot;&amp;quot;&amp;quot;.dll;.exe;.winmd;.json;.pri;.xml\&amp;quot;&amp;quot;&amp;quot; `
    -p:IncludeSymbols=true `
    -p:SymbolPackageFormat=snupkg `
    -nodeReuse:false `
    -bl:&amp;quot;./artifacts/logs/ContentEngine.Mvc.binlog&amp;quot; 

# set the output directory for publish
Write-Host (&amp;quot;env:DOTNET_ROOT = {0}&amp;quot; -f ${env:DOTNET_ROOT})
if ($null -ne ${env:DOTNET_ROOT}) {$d = ${env:DOTNET_ROOT}}
else {$d = $PWD}

################################
# Publish
################################
Write-Host (&amp;quot;dotnet publish&amp;quot;)
dotnet publish --configuration Release ./Source/ContentEngine.Mvc/ContentEngine.Mvc.csproj -o $d/myapp --no-build
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_update"&gt;Update&lt;/h2&gt;
&lt;p&gt;Because git tags are associated with a changeset number and not a particular branch,
this strategy works for a single branch.
To handle multiple branches searching for a specific tag pattern unique within each branch.
For example&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;branch: main, search for the tag ver-1.0.0&lt;/li&gt;
&lt;li&gt;branch: releases/101, search for the tag ver-1.0.1&lt;/li&gt;
&lt;li&gt;branch: releases/200, search for the tag ver-2.0.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[1] &lt;a href="https://learn.microsoft.com/en-ca/dotnet/standard/library-guidance/versioning#version-numbers"&gt;https://learn.microsoft.com/en-ca/dotnet/standard/library-guidance/versioning#version-numbers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2] &lt;a href="https://learn.microsoft.com/en-us/nuget/create-packages/prerelease-packages"&gt;https://learn.microsoft.com/en-us/nuget/create-packages/prerelease-packages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3] &lt;a href="https://semver.org"&gt;https://semver.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[4] &lt;a href="https://www.nuget.org/packages/MinVer"&gt;https://www.nuget.org/packages/MinVer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[5] &lt;a href="https://www.nuget.org/packages/minver-cli"&gt;https://www.nuget.org/packages/minver-cli&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[6] &lt;a href="https://github.com/GitTools/GitVersion"&gt;https://github.com/GitTools/GitVersion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[7] &lt;a href="https://github.com/AArnott/Nerdbank.GitVersioning"&gt;https://github.com/AArnott/Nerdbank.GitVersioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[8] &lt;a href="https://github.com/GitTools/actions"&gt;https://github.com/GitTools/actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[9] &lt;a href="https://www.jetbrains.com/help/teamcity/2022.10/configuring-general-settings.html#ConfiguringGeneralSettings-buildCounter"&gt;https://www.jetbrains.com/help/teamcity/2022.10/configuring-general-settings.html#ConfiguringGeneralSettings-buildCounter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[10]  &lt;a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&amp;amp;tabs=yaml"&gt;https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&amp;amp;tabs=yaml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[11] &lt;a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/process/run-number?view=azure-devops&amp;amp;tabs=yaml"&gt;https://learn.microsoft.com/en-us/azure/devops/pipelines/process/run-number?view=azure-devops&amp;amp;tabs=yaml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
  <author>email@nospam.com</author>
  <category>azure</category>
  <category>github</category>
  <category>git</category>
  <category>azure</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/deriving-version-information-from-git-for-incremental-builds/</guid>
  <pubDate>Tue, 25 Apr 2023 00:07:02 GMT</pubDate>
</item>
<item>
  <title>Building an Azure Dev Test Lab - Networking</title>
  <link>https://tim-stanley.com/post/building-an-azure-dev-test-lab-networking/</link>
  <description>&lt;p&gt;This is part of a series on &lt;a href="/post/building-an-azure-dev-test-lab-series"&gt;Building an Azure Dev Test Lab&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are many things that can be done in Azure without setting up Azure Networking.
But, there are also many reasons to setup a private Azure network.
This article is a summary of what Azure Services are required to get Azure networking in place. [more]&lt;/p&gt;
&lt;div id="tocautogen" class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_what-is-azure-networking"&gt;What Is Azure Networking?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_azure-networking-not-required"&gt;Azure Networking Not Required&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_azure-networking-required"&gt;Azure Networking Required&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_azure-active-directory-domain-services-aadds"&gt;Azure Active Directory Domain Services (AADDS)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h3_steps-to-create-aads-services"&gt;Steps to Create AADS Services&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_azure-virtual-network"&gt;Azure Virtual Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_azure-bastion"&gt;Azure Bastion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_azure-virtual-machines"&gt;Azure Virtual Machines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_azure-vpn-gateway"&gt;Azure VPN Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_azure-firewall"&gt;Azure Firewall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_fortinet-fortigate-virtual-appliance-firewall"&gt;Fortinet FortiGate Virtual Appliance Firewall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_azure-front-door"&gt;Azure Front Door&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_lab-scenarios"&gt;Lab Scenarios&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h3_lab-1-public-website--api-development"&gt;LAB 1 Public Website / API Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_lab-2-private-web-dev--test-apis"&gt;LAB 2 Private Web Dev / Test APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_lab-3-private-web-dev--test-apis-with-azure-sql"&gt;LAB 3 Private Web Dev / Test APIs with Azure SQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_what-is-azure-networking"&gt;What Is Azure Networking?&lt;/h2&gt;
&lt;p&gt;In the context of this article, Azure networking refers to the Azure systems and services that are
required for one Azure service or virtual machine to communicate to another Azure service or virtual
machine over a private (not public) network.&lt;/p&gt;
&lt;h2 id="h2_azure-networking-not-required"&gt;Azure Networking Not Required&lt;/h2&gt;
&lt;p&gt;You can do any of the following without any private Azure networking:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Authenticate users using Azure Authentication for Office 365, Azure Devops, and external SAML authentication.&lt;/li&gt;
&lt;li&gt;Push code to/from Azure Devops repositories.&lt;/li&gt;
&lt;li&gt;Push deployments from Azure Devops to Azure Services / Websites.&lt;/li&gt;
&lt;li&gt;Host Azure Websites on the Internet.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h2_azure-networking-required"&gt;Azure Networking Required&lt;/h2&gt;
&lt;p&gt;Your Azure system may be a candidate for a private Azure network, if you need any one of the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Join Azure VM's to an Azure Active Directory Domain Service. You'll need AADDS.&lt;/li&gt;
&lt;li&gt;You want VM to VM traffic on a private network. You'll need an Azure Virtual Network.&lt;/li&gt;
&lt;li&gt;You want a VNET / VLAN. You'll need an Azure Virtual Network.&lt;/li&gt;
&lt;li&gt;You want an external VPN into a private Azure network. You'll need and Azure Gateway or a FortiGate Virtual Appliance Firewall&lt;/li&gt;
&lt;li&gt;You want a WAN VPN from Azure to your premises network. You'll need and Azure Gateway or a FortiGate Virtual Appliance Firewall&lt;/li&gt;
&lt;li&gt;You want to run legacy applications in the cloud (legacy equates to Windows Services, Websites, or other Windows applications not designed for the cloud).&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h2_azure-active-directory-domain-services-aadds"&gt;Azure Active Directory Domain Services (AADDS)&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/products/active-directory/ds"&gt;AADDS&lt;/a&gt; [1] is the fundamental building
block for an Azure Dev Test lab. It provides the &amp;quot;Domain Controller&amp;quot; functionality in Azure
(but it's not really a Domain Controller).
AADDS allows you to use managed domain services—such as Windows Domain Join for VM's, group policy,
LDAP, and Kerberos authentication (simple sign-in using Azure AD credentials).&lt;/p&gt;
&lt;h3 id="h3_steps-to-create-aads-services"&gt;Steps to Create AADS Services&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Create a subscription and resource group to assign to the AADDS.&lt;/li&gt;
&lt;li&gt;Define region (CENTRAL-US, EAST-US, WEST-US, etc.).&lt;/li&gt;
&lt;li&gt;Pick SKU: Standard, Premium, Enterprise (Premium, Enterprise allow resource domains).&lt;/li&gt;
&lt;li&gt;Create Azure AD Domain Services ( azure.domain.com, or aadds.domain.com, but could be domain.com).&lt;/li&gt;
&lt;li&gt;Add a new network, aadds-vnet (must be 10.0.0.0/8, 172.16.0.0/12, or 192.168.0.0/16).&lt;/li&gt;
&lt;li&gt;Create new group AAD DC Administrators.&lt;/li&gt;
&lt;li&gt;Configure DNS (after AAADS allocated) which will configure DNS for above VNET to point to (2) AD services DC's.&lt;/li&gt;
&lt;li&gt;Must have Azure AD Cloud Sync password write-back enabled.&lt;/li&gt;
&lt;li&gt;Enable Azure AD Password sync to enable password hash synchronization.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For a more detailed explanation on setting up AADS Services, refer to this youtube video:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/OWGVoJMdIRc"&gt;Lets Get One Thing Straight | Azure AD Domain Services&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[usercontrol: ~/UC/Youtube.ascx; source=&amp;quot;https://youtu.be/OWGVoJMdIRc&amp;quot;;]&lt;/p&gt;
&lt;h2 id="h2_azure-virtual-network"&gt;Azure Virtual Network&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/products/virtual-network/"&gt;Azure Virtual Network&lt;/a&gt; [2] allows you to create your own private network in the cloud. Just like in your on-premises network, there are numerous security reasons you don't want everything you do on the public internet. Azure Virtual Network provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IPSEC or VPN / WAN from your on-premises network to Azure.&lt;/li&gt;
&lt;li&gt;Your own DNS services.&lt;/li&gt;
&lt;li&gt;Your own IP addresses.&lt;/li&gt;
&lt;li&gt;Network Address Translation (NAT)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_azure-bastion"&gt;Azure Bastion&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/products/azure-bastion/"&gt;Azure Bastion&lt;/a&gt; [3] provides the services to allow remote desktop connections to an Azure VM, without requiring a VPN, or without requiring the RDP port 3389 to be exposed on the open internet. VPN's can cut bandwidth by 30-40%.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20an%20Azure%20Dev%20Test%20Lab%20-%20Networking/image.png" alt="Azure Bastion"&gt;&lt;/p&gt;
&lt;h2 id="h2_azure-virtual-machines"&gt;Azure Virtual Machines&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/products/virtual-machines/"&gt;Azure Virtual Machines&lt;/a&gt; [4] allow you to get your legacy applications in the cloud. These are not your typical VM's. Azure VM's can provide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;up to 416 vCPUs&lt;/li&gt;
&lt;li&gt;up to 12 TB of memory&lt;/li&gt;
&lt;li&gt;up to 3.7 million local storage IOPS per VM.&lt;/li&gt;
&lt;li&gt;up to 30 Gbps Ethernet.&lt;/li&gt;
&lt;li&gt;up to 200 Gbps InfiniBand internet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Linux VM's will be cheaper than Windows VM's. Reserved Virtual Machines will be cheaper than Pay as you go.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20an%20Azure%20Dev%20Test%20Lab%20-%20Networking/image%202.png" alt=""&gt;
&lt;a href="https://azure.microsoft.com/en-us/solutions/dev-test/#overview"&gt;Azure Dev-Test box&lt;/a&gt; [5] provides another VM capable of running a developer class workstation. A Dev-Test box template can be setup and configured once and then developers can pull from a pool of boxes. A Dev-Test lab can be configured to shut down unused VM's during certain hours to minimize expenses.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/features/codespaces/"&gt;Codespaces&lt;/a&gt; [6] also provides another VM capable of running developer scenarios. &lt;a href="https://azure.microsoft.com/en-us/updates/begin-migrating-your-codespaces-to-github-codespaces/"&gt;Azure Codespaces have been migrated to GitHub Codespaces&lt;/a&gt; [6]. &lt;a href="https://github.blog/2021-08-11-githubs-engineering-team-moved-codespaces/"&gt;GitHub uses GitHub Codespaces&lt;/a&gt; [7] to develop GitHub. In under 10 seconds, you can spin up a Codespace. If your application development process can use Visual Studio Code, Codespaces eliminates the need for developer machine by running a virtual developer machine in the cloud. It's significantly cheaper than a full private network.&lt;/p&gt;
&lt;h2 id="h2_azure-vpn-gateway"&gt;Azure VPN Gateway&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/products/vpn-gateway/"&gt;Azure VPN Gateway&lt;/a&gt; [8] provides the ability create a site to site IPSEC VPN or a point to site VPN from anywhere to your Azure network.&lt;/p&gt;
&lt;h2 id="h2_azure-firewall"&gt;Azure Firewall&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/pricing/details/azure-firewall/"&gt;Azure Firewall&lt;/a&gt; [9] protects your Azure Virtual Network resources in the cloud. It protects your Azure private network just like an on-premises firewall would.&lt;/p&gt;
&lt;h2 id="h2_fortinet-fortigate-virtual-appliance-firewall"&gt;Fortinet FortiGate Virtual Appliance Firewall&lt;/h2&gt;
&lt;p&gt;If you have Fortinet firewalls and routers, then it may be easier to use a custom VM and purchase a VM version of the a &lt;a href="https://www.fortinet.com/products/private-cloud-security/fortigate-virtual-appliances"&gt;FortiGate Virtual Appliance&lt;/a&gt; [10]. The Fortigate FG-VM02V VM support 2 vCPU cores and supports 15 Gbps bandwidth. I've used the FortiGate 60E at multiple sites for years. It provide a great Firewall, and stellar support. The Firewall keeps your private network private.&lt;/p&gt;
&lt;h2 id="h2_azure-front-door"&gt;Azure Front Door&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/products/frontdoor"&gt;Azure Front Door&lt;/a&gt; [11] provides a Content Delivery Network (CDN), Load balancing and failover, Web Application Firewall, DDOS and bot protection. If your running a production website, Azure Front Door can provide the necessary protection. &lt;a href="https://www.cloudflare.com"&gt;CloudFlare&lt;/a&gt; [12] is another vendor that can provide website and API protection.&lt;/p&gt;
&lt;h2 id="h2_lab-scenarios"&gt;Lab Scenarios&lt;/h2&gt;
&lt;p&gt;That's a lot of services for Azure Networking. Let's take a look at some scenarios and see what is required. I'm going to preface this with Microsoft is continually changing what is present in Azure., so this information is based on Q1 2023 Azure information.&lt;/p&gt;
&lt;h3 id="h3_lab-1-public-website--api-development"&gt;LAB 1 Public Website / API Development&lt;/h3&gt;
&lt;p&gt;This would be a thin Azure system and would include the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Devops Git repositories for code (requires a Visual Studio or Stakeholder license)&lt;/li&gt;
&lt;li&gt;Azure Pipelines (included with Azure Devops)&lt;/li&gt;
&lt;li&gt;Visual Studio code (free)&lt;/li&gt;
&lt;li&gt;Azure Dev App Services / Websites&lt;/li&gt;
&lt;li&gt;Azure Test App Services / Websites&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This configuration does not require any private Azure networking.&lt;/p&gt;
&lt;h3 id="h3_lab-2-private-web-dev--test-apis"&gt;LAB 2 Private Web Dev / Test APIs&lt;/h3&gt;
&lt;p&gt;This would be a private network Azure system and would include the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Devops Git repositories for code (requires a Visual Studio or Stakeholder license)&lt;/li&gt;
&lt;li&gt;Azure Pipelines (included with Azure Devops)&lt;/li&gt;
&lt;li&gt;Private Dev Server API's (Azure Websites) running on Azure AADS account.&lt;/li&gt;
&lt;li&gt;Private Test Server API's (Azure Websites) running on Azure AADS account.&lt;/li&gt;
&lt;li&gt;Developers have an AD joined machine and account.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since this configuration is a private network, an Azure network is required. Typical services would include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Azure Active Directory Domain Services (AADDS)&lt;/li&gt;
&lt;li&gt;Azure Cloud Sync (to mirror AD accounts to Azure).&lt;/li&gt;
&lt;li&gt;Azure Virtual Network with private IP's.&lt;/li&gt;
&lt;li&gt;Azure Websites assigned a private IP.&lt;/li&gt;
&lt;li&gt;Azure Front Door, or Azure Firewall&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="h3_lab-3-private-web-dev--test-apis-with-azure-sql"&gt;LAB 3 Private Web Dev / Test APIs with Azure SQL&lt;/h3&gt;
&lt;p&gt;This would be a private network Azure system and would include the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure Devops Git repositories for code (requires a Visual Studio or Stakeholder license)&lt;/li&gt;
&lt;li&gt;Azure Pipelines (included with Azure Devops)&lt;/li&gt;
&lt;li&gt;Private Dev Server API's (Windows VM, Linux VM's)&lt;/li&gt;
&lt;li&gt;Private Test Server API's (Windows VM, Linux VM's)&lt;/li&gt;
&lt;li&gt;Developers have an AD joined machine and account.&lt;/li&gt;
&lt;li&gt;Dev Azure SQL database instances.&lt;/li&gt;
&lt;li&gt;Test Azure SQL database instances.&lt;/li&gt;
&lt;li&gt;Developers use private Azure VM's to develop / test.&lt;/li&gt;
&lt;li&gt;Site to Site VPN (WAN)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since this configuration is a private network with VM's, an Azure network is required. Typical services would include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Azure Active Directory Domain Services (AADDS)&lt;/li&gt;
&lt;li&gt;Azure Cloud Sync (to mirror AD accounts to Azure).&lt;/li&gt;
&lt;li&gt;Azure Virtual Network with private IP's.&lt;/li&gt;
&lt;li&gt;Azure VM's assigned a private IP.&lt;/li&gt;
&lt;li&gt;Azure Bastion for remote VM access.&lt;/li&gt;
&lt;li&gt;Azure SQL instances assigned a private IP.&lt;/li&gt;
&lt;li&gt;Azure Gateway&lt;/li&gt;
&lt;li&gt;Azure Firewall or FortiGate Virtual Appliance Firewall for Site to Site VPN.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;📝 &lt;strong&gt;Note:&lt;/strong&gt; If you have a need for multiple deployment slots (production, staging, development)
other than the default production slot, you need to have a &lt;a href="https://learn.microsoft.com/en-us/azure/app-service/deploy-staging-slots"&gt;Standard, Premium, or Isolated plan&lt;/a&gt; [13].
You can work around this limitation by having two individual sites, and manually changing the
DNS records to switch between the sites.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[1] &lt;a href="https://azure.microsoft.com/en-us/products/active-directory/ds"&gt;https://azure.microsoft.com/en-us/products/active-directory/ds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2] &lt;a href="https://azure.microsoft.com/en-us/products/virtual-network/"&gt;https://azure.microsoft.com/en-us/products/virtual-network/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3] &lt;a href="https://azure.microsoft.com/en-us/products/azure-bastion/"&gt;https://azure.microsoft.com/en-us/products/azure-bastion/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[4] &lt;a href="https://azure.microsoft.com/en-us/products/virtual-machines/"&gt;https://azure.microsoft.com/en-us/products/virtual-machines/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[5] &lt;a href="https://azure.microsoft.com/en-us/solutions/dev-test/#overview"&gt;https://azure.microsoft.com/en-us/solutions/dev-test/#overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[6] &lt;a href="https://azure.microsoft.com/en-us/updates/begin-migrating-your-codespaces-to-github-codespaces/"&gt;https://azure.microsoft.com/en-us/updates/begin-migrating-your-codespaces-to-github-codespaces/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[7] &lt;a href="https://github.blog/2021-08-11-githubs-engineering-team-moved-codespaces/"&gt;https://github.blog/2021-08-11-githubs-engineering-team-moved-codespaces/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[8] &lt;a href="https://azure.microsoft.com/en-us/products/vpn-gateway/"&gt;https://azure.microsoft.com/en-us/products/vpn-gateway/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[9] &lt;a href="https://azure.microsoft.com/en-us/pricing/details/azure-firewall/"&gt;https://azure.microsoft.com/en-us/pricing/details/azure-firewall/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[10] &lt;a href="https://www.fortinet.com/products/private-cloud-security/fortigate-virtual-appliances"&gt;https://www.fortinet.com/products/private-cloud-security/fortigate-virtual-appliances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[11] &lt;a href="https://azure.microsoft.com/en-us/products/frontdoor"&gt;https://azure.microsoft.com/en-us/products/frontdoor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[12] &lt;a href="https://www.cloudflare.com"&gt;https://www.cloudflare.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[13] &lt;a href="https://learn.microsoft.com/en-us/azure/app-service/deploy-staging-slots"&gt;https://learn.microsoft.com/en-us/azure/app-service/deploy-staging-slots&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
  <author>email@nospam.com</author>
  <category>azure</category>
  <category>azure</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/building-an-azure-dev-test-lab-networking/</guid>
  <pubDate>Sat, 11 Mar 2023 19:32:09 GMT</pubDate>
</item>
<item>
  <title>Building an Azure Dev Test Lab - Data Centers</title>
  <link>https://tim-stanley.com/post/building-an-azure-dev-test-lab-data-centers/</link>
  <description>&lt;p&gt;This is part of a series on &lt;a href="/post/building-an-azure-dev-test-lab-series"&gt;Building an Azure Dev Test Lab&lt;/a&gt; for software development.&lt;/p&gt;
&lt;p&gt;Azure has Data Centers located all over the globe. But not all Data Centers
have all the same features or price structure.
Before you begin to setup Azure services, make sure the Data Center you
select for your Azure Products and Services support what you will need and
that you know the pricing. [more]&lt;/p&gt;
&lt;div id="tocautogen" class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_where-are-azure-data-centers-located"&gt;Where are Azure Data Centers Located?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_compliance-and-data-residency"&gt;Compliance and Data Residency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_service-availability"&gt;Service Availability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_pricing"&gt;Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_linux-or-windows"&gt;Linux or Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_where-are-azure-data-centers-located"&gt;Where are Azure Data Centers Located?&lt;/h2&gt;
&lt;p&gt;The Microsoft &lt;a href="https://azure.microsoft.com/en-us/explore/global-infrastructure/geographies/#overview"&gt;Azure Global Infrastructure&lt;/a&gt; site [1]
lists the Data Centers Azure provides. It is important to do a little
and planning to know all the services you need from a data center before
you begin to set something up.&lt;/p&gt;
&lt;p&gt;Explore the &lt;a href="https://azure.microsoft.com/en-us/explore/global-infrastructure/geographies/#overview"&gt;Azure Global Infrastructure&lt;/a&gt; site to get more details.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20an%20Azure%20Dev%20Test%20Lab%20-%20Data%20Centers/image.png" alt=""&gt;&lt;/p&gt;
&lt;h2 id="h2_compliance-and-data-residency"&gt;Compliance and Data Residency&lt;/h2&gt;
&lt;p&gt;Knowing what specific country or standard compliance rules are required for storage, and data compliance are important for production data, but rarely so for a dev test lab. &lt;a href="https://azure.microsoft.com/en-us/explore/trusted-cloud/compliance/"&gt;Azure Compliance&lt;/a&gt; [2] and &lt;a href="https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/#overview"&gt;Data Compliance&lt;/a&gt; [3] lists over 90 country specific compliance guidelines. This can be important when trying to conform to GDPR or other country specific data laws and guidelines.&lt;/p&gt;
&lt;h2 id="h2_service-availability"&gt;Service Availability&lt;/h2&gt;
&lt;p&gt;Each Azure Data Center provides a different range of services. For example, the Central US and East US regions support &lt;a href="https://docs.microsoft.com/en-us/azure/site-recovery/azure-to-azure-how-to-enable-zone-to-zone-disaster-recovery"&gt;Zonal DR with Azure Site Recovery&lt;/a&gt; &lt;em&gt;,&lt;/em&gt; but East US and North Central US do not. Make sure that all the services you are planning on are supported within the Data Center where you plan on deploying.&lt;/p&gt;
&lt;h2 id="h2_pricing"&gt;Pricing&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/pricing/details/app-service/windows/"&gt;Azure Pricing&lt;/a&gt; [4] for example lists that West US 3 does not have an App Service F1 Free or D1 Shared plan option whereas West US 2 does.&lt;/p&gt;
&lt;h2 id="h2_linux-or-windows"&gt;Linux or Windows&lt;/h2&gt;
&lt;p&gt;Azure Pricing for Windows and Linux can vary significantly.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/pricing/details/app-service/windows/"&gt;Azure App Service pricing for Windows&lt;/a&gt; (March 2023):&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20an%20Azure%20Dev%20Test%20Lab%20-%20Data%20Centers/image%202.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/pricing/details/app-service/linux/"&gt;Azure App Service pricing for Linux&lt;/a&gt; [5] (March 2023):&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20an%20Azure%20Dev%20Test%20Lab%20-%20Data%20Centers/image%203.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;For a Dev Test Lab, a Linux solution is going to be cheaper than a Windows one.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basic dev/test Linux: $12.41 / mo.&lt;/li&gt;
&lt;li&gt;Basic dev/test Windows: $54.75 / mo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[1] &lt;a href="https://azure.microsoft.com/en-us/explore/global-infrastructure/geographies/#overview"&gt;https://azure.microsoft.com/en-us/explore/global-infrastructure/geographies/#overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2] &lt;a href="https://azure.microsoft.com/en-us/explore/trusted-cloud/compliance/"&gt;https://azure.microsoft.com/en-us/explore/trusted-cloud/compliance/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3] &lt;a href="https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/#overview"&gt;https://azure.microsoft.com/en-us/explore/global-infrastructure/data-residency/#overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[4] &lt;a href="https://azure.microsoft.com/en-us/pricing/details/app-service/windows/"&gt;https://azure.microsoft.com/en-us/pricing/details/app-service/windows/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[5] &lt;a href="https://azure.microsoft.com/en-us/pricing/details/app-service/linux/"&gt;https://azure.microsoft.com/en-us/pricing/details/app-service/linux/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
  <author>email@nospam.com</author>
  <category>azure</category>
  <category>azure</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/building-an-azure-dev-test-lab-data-centers/</guid>
  <pubDate>Wed, 08 Mar 2023 01:13:15 GMT</pubDate>
</item>
<item>
  <title>Building An Azure Dev Test Lab - Azure Devops Migration</title>
  <link>https://tim-stanley.com/post/building-an-azure-dev-test-lab-azure-devops-migration/</link>
  <description>&lt;p&gt;This is part of a series on &lt;a href="/post/building-an-azure-dev-test-lab-series"&gt;Building an Azure Dev Test Lab&lt;/a&gt; for software development.&lt;/p&gt;
&lt;p&gt;This is a summary of how to migrate from an on-site Microsoft Team Foundation Server (TFS), aka Visual Studio Team
Services, aka Azure Devops Server to Azure Git repositories. This article does not cover
topics of Azure automated builds, automated tests, or automated deployments. These same
steps would apply if migrating to GitHub Enterprise.[more]&lt;/p&gt;
&lt;div id="tocautogen" class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_tfs-terms"&gt;TFS Terms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_information-required-for-migration-from-tfs-to-git"&gt;Information Required for Migration from TFS to Git&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h3_identify-all-the-tfs-collections-and-projects-to-b"&gt;Identify all the TFS Collections and Projects to be exported to git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_decide-the-git-branch-to-tfs-branch-name-mapping"&gt;Decide the git branch to TFS branch name mapping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_download-and-install-git-tfs"&gt;Download and Install Git-TFS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_decide-which-branches-to-export"&gt;Decide which branches to export&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_decide-how-much-history-to-preserve"&gt;Decide how much history to preserve&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_decide-if-tfs-to-git-mirroring-is-required"&gt;Decide if TFS to git mirroring is required&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_decide-what-to-do-about-binaries-in-source-control"&gt;Decide what to do about binaries in source control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_decide-a-default-azure-working-path"&gt;Decide a default Azure working path&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_information-required-to-configure-azure-devops-git"&gt;Information Required to configure Azure Devops Git&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h3_identify-new-active-directory-security-groups-and"&gt;Identify new Active Directory Security Groups and naming conventions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_identify-new-azure-git-projects-and-naming-convent"&gt;Identify new Azure Git Projects and naming conventions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_identify-new-azure-security-groups"&gt;Identify new Azure Security Groups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_identify-new-azure-git-project-group-names"&gt;Identify new Azure Git Project Group Names&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_decide-in-what-region-your-azure-devops-organizati"&gt;Decide in what region your Azure Devops organization is to be hosted.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_define-a-git-branching-strategy"&gt;Define a Git Branching Strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_decide-how-to-handle-git-training"&gt;Decide How to handle Git Training&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_performing-tfs-to-git-migration"&gt;Performing TFS to Git Migration&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h3_to-extract-tfs-to-a-local-git-repository-all-branc"&gt;To extract TFS to a Local Git Repository All Branches&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_to-extract-tfs-to-a-local-git-repository-specific"&gt;To extract TFS to a Local Git Repository Specific Branch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_to-extract-tfs-to-a-local-git-repository-specific"&gt;To extract TFS to a Local Git Repository Specific Change-set&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_create-a-new-azure-organization"&gt;Create a new Azure organization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_create-a-new-azure-or-git-project"&gt;Create a new Azure or Git Project.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_create-a-new-azure-git-repository"&gt;Create a new Azure Git Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_push-the-local-git-repository-to-the-cloud"&gt;Push the Local Git Repository to the Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_to-mirror-a-tfs-repository-to-git"&gt;To mirror a TFS repository to Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_add-a-gitconfig"&gt;Add a .gitconfig&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_azure-devops-go-live-checklist"&gt;Azure Devops Go Live checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_azure-devops-or-github-enterprise"&gt;Azure Devops or GitHub Enterprise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_azure-devops-work-items-migration-tools"&gt;Azure Devops Work Items Migration Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;The scope of this article is limited to source control. The migration of TFS Work items
is not supported by the git-tfs tool.&lt;/p&gt;
&lt;p&gt;Microsoft has many names for TFS that are all the same services, just a different name
at one point in time. I use the name TFS to refer this product.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft TFS Server&lt;/li&gt;
&lt;li&gt;Visual Studio Team Services (VSTS)&lt;/li&gt;
&lt;li&gt;Azure Devops Server&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_tfs-terms"&gt;TFS Terms&lt;/h2&gt;
&lt;p&gt;TFS uses the term &amp;quot;Collections&amp;quot; as the highest organization level that corresponds to the
Azure git repository term &amp;quot;Projects&amp;quot;.&lt;/p&gt;
&lt;p&gt;TFS uses the term &amp;quot;Projects&amp;quot; that correspond to Azure git &amp;quot;Repositories&amp;quot; aka repos.
An TFS &amp;quot;Project&amp;quot; and a git &amp;quot;Repository&amp;quot; exist underneath a TFS &amp;quot;Collection&amp;quot; or an Azure
git &amp;quot;Project&amp;quot;.&lt;/p&gt;
&lt;h2 id="h2_information-required-for-migration-from-tfs-to-git"&gt;Information Required for Migration from TFS to Git&lt;/h2&gt;
&lt;h3 id="h3_identify-all-the-tfs-collections-and-projects-to-b"&gt;Identify all the TFS Collections and Projects to be exported to git&lt;/h3&gt;
&lt;p&gt;Pick one non mission critical small to medium size TFS Project to migrate to Azure Devops
git first. If you run into issues, you can always start the export migration process again. This allows you to get something working and get experience on all the steps before trying to tackle larger more complex TFS Projects.&lt;/p&gt;
&lt;p&gt;After identifying the first TFS project to export, prioritize any active collections and
project that need to be migrated first, and inactive ones last. Using the history in TFS can show what activity has occurred and when. The general recommendation would be to export every TFS Collection, so that TFS can be shut down when the work is complete&lt;/p&gt;
&lt;p&gt;Migrating one collection at a time allows you to get moving forward with Azure without a
long calendar time to do so. If you need to run a dual repository scenario (both TFS and
git active at the same time), you can run a script on a recurring basis to mirror from
TFS to git.&lt;/p&gt;
&lt;h3 id="h3_decide-the-git-branch-to-tfs-branch-name-mapping"&gt;Decide the git branch to TFS branch name mapping&lt;/h3&gt;
&lt;p&gt;Decide a git default branch naming convention such as main (recommended) or master. Set
your local default git user configuration to use the correct default name [1]. This needs
to be done and configured before you run git-tfs.&lt;/p&gt;
&lt;h3 id="h3_download-and-install-git-tfs"&gt;Download and Install Git-TFS&lt;/h3&gt;
&lt;p&gt;The git tool &lt;a href="https://git-tfs.com"&gt;git-tfs&lt;/a&gt; [2][3] can be used to export TFS change
history to git.&lt;/p&gt;
&lt;p&gt;Note: It is best to use git-tfs on a client that is on the exact same local area
network as the TFS server. When exporting large projects, timeouts can occur if using a remote TFS server. It is also best if that client is a virtual machine that can be dedicated for use to mirror from TFS to git while repositories while migration is underway.&lt;/p&gt;
&lt;p&gt;Note: git-tfs will create a git change-set for each TFS change-set. This git-tfs
change-set will contain the TFS collection, project, and TFS change-set as part of
a comment added to the git change-set. This is very helpful in determining where a
repository was migrated from.&lt;/p&gt;
&lt;h3 id="h3_decide-which-branches-to-export"&gt;Decide which branches to export&lt;/h3&gt;
&lt;p&gt;The general recommendation would be to export every project, and branch in a TFS
collection. Exporting every project and branch in a collection is going to take
longer to export from TFS, and the git repository may be large.&lt;/p&gt;
&lt;p&gt;Note: exporting a large TFS project using git-tfs with 20,000 changes might take
two-three days to create a local git repository the first time.&lt;/p&gt;
&lt;p&gt;The git to TFS tool cannot export a branch that's been renamed.
The git-tfs list-remote-branches command will list branches that it is able to
export, and you can use that information for your planning.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;git tfs list-remote-branches http://tfs:8080/tfs/DefaultCollection
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If TFS is using a folder instead of a branch, the folder can be modified to become
a branch in TFS and then exported using git-tfs.&lt;/p&gt;
&lt;p&gt;The tool TFS to git can export all branches, or a single branch, but there does
not appear to be a way to export multiple branches.&lt;/p&gt;
&lt;h3 id="h3_decide-how-much-history-to-preserve"&gt;Decide how much history to preserve&lt;/h3&gt;
&lt;p&gt;History is usually very important to find out what happened, when, and by whom.
The recommendation would be to preserve all history where possible.&lt;/p&gt;
&lt;p&gt;If your exported repository with all changes is too big, you may need to limit
history to the most recent set of changes (for example the last year), instead of exporting all history. If you decide to limit history, you will need to identify which specific change-set to use for exporting on each project.&lt;/p&gt;
&lt;h3 id="h3_decide-if-tfs-to-git-mirroring-is-required"&gt;Decide if TFS to git mirroring is required&lt;/h3&gt;
&lt;p&gt;Git-tfs supports the ability to mirror any TFS changes to a git repository on a
regular basis. Git-tfs mirroring is recommended and a good way to get a read-only
copy of source into git and verify all change history and changes migrate first.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Warning: git-tfs mirroring only worked one way (TFS to Git). I was not able to make
two-way round-trip mirroring from git back to TFS work. At the time I performed
migration (2022), any changes to a git repository used for TFS to Git mirroring,
broke the mirroring capability.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was able to take a git-tfs repository and create a new git branch and make
changes to it on the git side without breaking TFS mirroring to git. I could
then use git merge to merge the changes from the main TFS branch into a development
branch in git. This allowed the TFS and git repositories to be used at the same
time on different branches. If using this approach, don't expect the git branch
to ever migrate into TFS and expect TFS mirroring to work.&lt;/p&gt;
&lt;h3 id="h3_decide-what-to-do-about-binaries-in-source-control"&gt;Decide what to do about binaries in source control&lt;/h3&gt;
&lt;p&gt;Git is great for storing text files efficiently and quickly, but using it to
store binary files (releases, dll references, etc.), make the repository grow
large quickly, and that takes longer to transfer on clone / pull operations.
Instead of storing binaries, using a Nuget server, Azure artifact storage,
Azure file storage, or Git-LFS are the preferred options for storing binaries.&lt;/p&gt;
&lt;h3 id="h3_decide-a-default-azure-working-path"&gt;Decide a default Azure working path&lt;/h3&gt;
&lt;p&gt;While it is strongly recommend not to embed paths into source control, there
are some Microsoft tools or systems that require a path (configuration files,
test suites, etc.). Standardizing the path for all developers and build systems
is the only way to solve this until those tools and configurations can all
handle relative paths.&lt;/p&gt;
&lt;p&gt;Example standardized azure path:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:\Azure\organization\project\repository
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_information-required-to-configure-azure-devops-git"&gt;Information Required to configure Azure Devops Git&lt;/h2&gt;
&lt;h3 id="h3_identify-new-active-directory-security-groups-and"&gt;Identify new Active Directory Security Groups and naming conventions&lt;/h3&gt;
&lt;p&gt;I use the following security group naming convention for Azure.&lt;/p&gt;
&lt;p system="" name="" permission=""&gt;Pattern: -.
* DSG - Domain Security Group (set at the AD domain level, and mirrored to Azure)
* ASG - Azure Security Group (set at the Azure group level)
* AZDO - Azure Devops group (set at a git repository level)
* Security Group Name
* TFS Collection or Azure Project Name
* .Team - Read/Write permissions
* .ReadOnly - Read Only permissions
* .Admin - Administrator permissions&lt;/p&gt;
&lt;p name="" git="" project=""&gt;DSG-.Team - Defined at Active Directory Level in AD
ASG-.Team - Defined at Azure Level in Azure
AZDO-.Team defined at the  level
AZDO-.Read Only defined at the  level&lt;/p&gt;
&lt;h3 id="h3_identify-new-azure-git-projects-and-naming-convent"&gt;Identify new Azure Git Projects and naming conventions&lt;/h3&gt;
&lt;p&gt;When migrating, from TFS to git it can be helpful for users to have similar
names that correspond to the old TFS names, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A git project name with a name or abbreviation similar to the TFS Collection&lt;/li&gt;
&lt;li&gt;A git repository name with a name or abbreviation similar to the TFS Project&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3_identify-new-azure-security-groups"&gt;Identify new Azure Security Groups&lt;/h3&gt;
&lt;p&gt;It is strongly recommended and encouraged that almost always users should never
be assigned direct permissions to an Azure project or repository. Instead, assign
permissions to groups and then assign users to those groups.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Warning: In 2022, Azure Devops only supports one level of group assignment.
It does not support hierarchical groups.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some suggested group conventions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use a region in the group name: ASG-.Team, i.e. ASG-DEV-US.Team, ASG-DEV-EMEA.Team for all developers in the US or all developers in Europe, Middle East, and Asia.&lt;/li&gt;
&lt;li&gt;Separate contractors from employees, i.e. ASG-DEV-Employees.Team, ASG-DEV-Contractors.Team&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3_identify-new-azure-git-project-group-names"&gt;Identify new Azure Git Project Group Names&lt;/h3&gt;
&lt;p git="" project=""&gt;It is suggested to create project groups and assign those to the appropriate Azure
role permissions instead of assigning user directly to Azure roles. This will make
it easier in the future to manage permissions.
AZDO-.Admin defined at the  level
AZDO-.Team defined at the  level
AZDO-.ReadOnly defined at the  level&lt;/p&gt;
&lt;h3 id="h3_decide-in-what-region-your-azure-devops-organizati"&gt;Decide in what region your Azure Devops organization is to be hosted.&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;📝 Note all Azure services are available in all regions. Before you create your
Azure Devops organization, review the capabilities for you region. Likewise, not
all regions have the same cost structure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Refer to the &lt;a href="https://azure.microsoft.com/en-us/explore/global-infrastructure/geographies/#overview"&gt;List of Azure Regions&lt;/a&gt; [4] for more details about where they are located and what they can provide before selecting where your Azure Devops organization will be hosted.&lt;/p&gt;
&lt;h3 id="h3_define-a-git-branching-strategy"&gt;Define a Git Branching Strategy&lt;/h3&gt;
&lt;p&gt;There is much debate about what is the best strategy for branches and it's a
hotly debated item.&lt;/p&gt;
&lt;p&gt;A branching strategy for a GitHub Open-Source project needs to restrict who
can check in code, make sure a pull request builds properly, and needs to be
reviewed carefully before allowing it got be pushed upstream.&lt;/p&gt;
&lt;p&gt;A small company with few team members, on the other hand, needs to be as
efficient as possible. A strategy with a single branch and all releases being
pulled off the main branch and hot fixes built from a _releases_release branch
is probably more suitable for that company than something for an open-source project.&lt;/p&gt;
&lt;p&gt;The term &lt;a href="https://trunkbaseddevelopment.com"&gt;Trunk Based Development&lt;/a&gt; [5] has
been used to describe a git branching strategy to avoid git merge hell.
Trunk Based Development describes itself as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A source-control branching model, where developers collaborate on code in a single branch called ‘trunk’ *, resist any pressure to create other long-lived development branches by employing documented techniques. They therefore avoid merge hell, do not break the build, and live happily ever after.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Microsoft has published some of their tips on how to &lt;a href="https://learn.microsoft.com/en-us/azure/devops/repos/tfvc/branching-strategies-with-tfvc?view=azure-devops"&gt;Select an effective branching
strategy&lt;/a&gt; [6]&lt;/p&gt;
&lt;p&gt;Microsoft also has published some tips on &lt;a href="https://docs.microsoft.com/en-us/azure/devops/learn/devops-at-microsoft/release-flow"&gt;How Microsoft plans with DevOps&lt;/a&gt; [7],
and on &lt;a href="https://learn.microsoft.com/en-us/azure/devops/repos/git/git-branching-guidance?view=azure-devops"&gt;Git Branching Guidance&lt;/a&gt; [19]&lt;/p&gt;
&lt;p&gt;After doing a bit of research, I came to a conclusion of the following branch strategy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt; – builds from here, this is always the tip for most current development&lt;/li&gt;
&lt;li&gt;&lt;code&gt;releases/{name}&lt;/code&gt; – builds from here&lt;/li&gt;
&lt;li&gt;&lt;code&gt;users/{username}/{description}&lt;/code&gt; - no builds from here, users can share&lt;/li&gt;
&lt;li&gt;&lt;code&gt;features/{name}&lt;/code&gt; – no builds from here&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="h3_decide-how-to-handle-git-training"&gt;Decide How to handle Git Training&lt;/h3&gt;
&lt;p&gt;Git is similar to other source control systems. Visual Studio 2022 provides several
UI integrations that make TFS UI operations done on TFS very similar to the kind of
operations needed in git. VS 2022 UI git integrations, in my opinion, make the
training curve much simpler.&lt;/p&gt;
&lt;p&gt;Having a regional goto person in the same time zone to ask git questions can also
be helpful to team members. Git merges and resolving merge conflicts can be
intimidating the first time.&lt;/p&gt;
&lt;p&gt;There are multiple links at git-scm.com, and youtube that provide extensive
information for git.&lt;/p&gt;
&lt;h2 id="h2_performing-tfs-to-git-migration"&gt;Performing TFS to Git Migration&lt;/h2&gt;
&lt;p&gt;The git tfs list-remote-branches command is used to list all branches that
can potentially be exported. Convert any TFS folder to branches if they are not listed.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;git tfs list-remote-branches http://tfs:8080/tfs/DefaultCollection
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Warning: A branch that has been renamed in TFS usually cannot be exported by git-tfs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Target branch is always main (or git default)
Do this on a machine that is on the same network as the TFS server or timeouts will occur.
git-tfs will put changeset comments for git commits in all changesets pulled from TFS&lt;/p&gt;
&lt;h3 id="h3_to-extract-tfs-to-a-local-git-repository-all-branc"&gt;To extract TFS to a Local Git Repository All Branches&lt;/h3&gt;
&lt;p&gt;The git-tfs clone command may take several hours or days.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;$tfsCollection = &amp;quot;Collection&amp;quot;
$tfsProject = &amp;quot;Project&amp;quot;
$tfsBranch = &amp;quot;Main&amp;quot;
$tfsproject=&amp;quot;`$/$tfsCollection/$tfsProject/$tfsBranch&amp;quot;
$tfsurl=&amp;quot;https://tfs.corp.domain.com:443/tfs/$tfsCollection&amp;quot;
$azOrganization=&amp;quot;azorg&amp;quot;
$dest=&amp;quot;C:\Azure\\$azOrganization\$tfsCollection\$tfsProject&amp;quot;
git-tfs clone --with-labels --branches=all $tfsurl $tfsproject $dest
cd $dest
git tfs bootstrap
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="h3_to-extract-tfs-to-a-local-git-repository-specific"&gt;To extract TFS to a Local Git Repository Specific Branch&lt;/h3&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;git-tfs clone --with-labels https://tfs.corp.domain.com:4443/tfs/Collection $/Project/Branch C:\Azure\{organization}\{project}\{repo}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;📝 Note: The git-tfs clone command will create a default branch on the local repository.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="h3_to-extract-tfs-to-a-local-git-repository-specific"&gt;To extract TFS to a Local Git Repository Specific Change-set&lt;/h3&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;git-tfs clone --with-labels --from 21263 https://tfs.corp.domain.com:4443/tfs/Collection $/Project/TFS-Branch 
C:\Azure\{organization}\{project}\
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;📝 Note: The git-tfs clone command will create a default branch on the local repository.
The local repository branch will be the git default (main or master), and that will not
match the TFS branch your pulling from.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="h3_create-a-new-azure-organization"&gt;Create a new Azure organization&lt;/h3&gt;
&lt;p&gt;If you have not already, use Azure Devops to create a new Azure Devops organization.
The Azure Devops Link &lt;a href="https://dev.azure.com"&gt;https://dev.azure.com&lt;/a&gt; has an option to
create a multiple new organizations in your Azure tenant. Make sure you know what
regions you want your new Azure Devops organization hosted in before you create the
organization.&lt;/p&gt;
&lt;h3 id="h3_create-a-new-azure-or-git-project"&gt;Create a new Azure or Git Project.&lt;/h3&gt;
&lt;p project=""&gt;Within the organization, create a new Azure Git Project. An Azure Devops Project
can contain multiple repositories. Once the repository is created, create the new
repository groups (AZDO-.Team, .ReadOnly, .Admin) and assign those groups
to the appropriate roles.&lt;/p&gt;
&lt;h3 id="h3_create-a-new-azure-git-repository"&gt;Create a new Azure Git Repository&lt;/h3&gt;
&lt;p&gt;Within the Azure Devops Project, create a new Azure Git repository. It will
inherit the Azure Git Project permissions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Warning: Do not create a &lt;code&gt;readme.md&lt;/code&gt; file for the repository at the Azure cloud level
or this will cause a merge which will break TFS to git mirroring.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="h3_push-the-local-git-repository-to-the-cloud"&gt;Push the Local Git Repository to the Cloud&lt;/h3&gt;
&lt;p&gt;Once the cloud repository is configured and roles and groups are assigned, the
local git-tfs repository can be pushed to the cloud. This should be done on the
same client workstation where the git-tfs clone command was executed.&lt;/p&gt;
&lt;p&gt;The url used for the push can be found on the Azure repository clone repo tab.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;git remote add origin https://domain@dev.azure.com/organization/project/_git/repo
git push -u origin --all
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="h3_to-mirror-a-tfs-repository-to-git"&gt;To mirror a TFS repository to Git&lt;/h3&gt;
&lt;p&gt;Below are the general overall steps to run a script on a scheduled basis to mirror
from TFS to git. The git-tfs pull and git push commands perform the heavy lifting,
the other steps are there just to show diagnostic information.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;git-tfs pull --branches=auto
# Switch to branch to push
git checkout $Branch
# Show status
git status
git push -u origin --all --verbose
# Show branches
git branch -a --verbose&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you need to perform development on a git branch 'main-dev' while TFS to git
mirroring is being done on 'main', you can use the git merge command to merge
changes from the main branch into main-dev.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;git checkout main
git pull
git checkout main-dev
git pull
git merge main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once TFS to git migration is complete, and mirroring is no longer required.
Those changes in main-dev can be merged back into the main branch.&lt;/p&gt;
&lt;h3 id="h3_add-a-gitconfig"&gt;Add a .gitconfig&lt;/h3&gt;
&lt;p&gt;TFS only tracks files added to TFS. Git tracks all files added to a folder,
unless an entry in the .gitconfig says to ignore it. To inform git of which
configs to add, a .gitconfig file needs to be added to a project. If using a
c-sharp project, use a c-sharp .gitconfig as the starting point. That prevents
some of the visual studio build files and folder (such as /bin or /obj) from
getting checked in.&lt;/p&gt;
&lt;h2 id="h2_azure-devops-go-live-checklist"&gt;Azure Devops Go Live checklist&lt;/h2&gt;
&lt;p&gt;It's helpful to have a go-live checklist before having users switch over to git.
Below are some suggestions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add .gitconfig to all repositories and all active branches&lt;/li&gt;
&lt;li&gt;Test builds from git before turning off tfs to git mirroring.&lt;/li&gt;
&lt;li&gt;Validate all users have appropriate permissions to Git repositories.&lt;/li&gt;
&lt;li&gt;Set TFS to block checkins on all roles (all users, administrators, services, build agents).&lt;/li&gt;
&lt;li&gt;Turn off TFS to Git replication for all repositories&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h2_azure-devops-or-github-enterprise"&gt;Azure Devops or GitHub Enterprise&lt;/h2&gt;
&lt;p&gt;Everything in this article covers migration specific to Azure Devops. But what
about GitHub Enterprise services? GitHub Enterprise provides similar services
to Azure Devops. Both are owned by Microsoft. What should one use? The answer
will probably vary over time.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/pulse/azure-devops-future-after-github-acquisition-microsoft-antonio-alvino/"&gt;Microsoft purchased GitHub Enterprise in 2018&lt;/a&gt; [12].
Few companies can afford to keep two products that perform the same business function, so the question is which one will win over time. So far, Microsoft seems to be providing a long term role for both.&lt;/p&gt;
&lt;p&gt;As of 2022, new features such &lt;a href="https://github.com/features/security/"&gt;GitHub Security features&lt;/a&gt; [15]
as &lt;a href="https://docs.github.com/en/get-started/learning-about-github/about-github-advanced-security"&gt;GitHub Advanced Security&lt;/a&gt; [16],
&lt;a href="https://docs.github.com/en/code-security/dependabot/working-with-dependabot"&gt;Dependabot&lt;/a&gt; [17],
and &lt;a href="https://github.com/features/copilot"&gt;GitHub CoPilot&lt;/a&gt; [18] are not available in Azure. These are additional features in GitHub that require additional subscription costs.&lt;/p&gt;
&lt;p&gt;Azure Devops and GitHub have different pedigrees.
is focused on Open Source and Azure Devops on Enterprise source control management.&lt;/p&gt;
&lt;p&gt;An organization that has Visual Studio Professional Licensing gets Azure
Devops licensing included. As of 2022, Those same users have to pay additional
license fees to use GitHub Enterprise for source control. That additional cost makes GitHub Enterprise a harder leap for organizations with a Visual Studio License already. GitHub Enterprise in 2022 provides SAML Azure integration, but it's not as seamless as the Azure Devops group integration with Azure.&lt;/p&gt;
&lt;h2 id="h2_azure-devops-work-items-migration-tools"&gt;Azure Devops Work Items Migration Tools&lt;/h2&gt;
&lt;p&gt;From my research, migration of TFS work items to git is &lt;strong&gt;&lt;em&gt;significantly&lt;/em&gt;&lt;/strong&gt; more
complex than migrating source code projects.
naked Agility has published &lt;a href="http://nkdagility.github.io/azure-devops-migration-tools/#support"&gt;Azure DevOps Migration Tools&lt;/a&gt; [13]
to help migrate work items from TFS to Azure or Github.&lt;/p&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[1] &lt;a href="https://about.gitlab.com/blog/2021/03/10/new-git-default-branch-name/"&gt;https://about.gitlab.com/blog/2021/03/10/new-git-default-branch-name/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2] &lt;a href="https://git-tfs.com"&gt;https://git-tfs.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3] &lt;a href="https://github.com/git-tfs/git-tfs"&gt;https://github.com/git-tfs/git-tfs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[4] &lt;a href="https://azure.microsoft.com/en-us/explore/global-infrastructure/geographies/#overview"&gt;https://azure.microsoft.com/en-us/explore/global-infrastructure/geographies/#overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[5] &lt;a href="https://trunkbaseddevelopment.com"&gt;https://trunkbaseddevelopment.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[6] &lt;a href="https://docs.microsoft.com/en-us/azure/devops/repos/tfvc/branching-strategies-with-tfvc?view=azure-devops"&gt;https://docs.microsoft.com/en-us/azure/devops/repos/tfvc/branching-strategies-with-tfvc?view=azure-devops&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[7] &lt;a href="https://docs.microsoft.com/en-us/azure/devops/learn/devops-at-microsoft/release-flow"&gt;https://docs.microsoft.com/en-us/azure/devops/learn/devops-at-microsoft/release-flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[8] &lt;a href="https://www.red-gate.com/blog/why-to-use-git-instead-of-tfs-tfvc"&gt;https://www.red-gate.com/blog/why-to-use-git-instead-of-tfs-tfvc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[9] &lt;a href="https://jessitron.com/2012/12/11/tfs-and-git-a-comparison/"&gt;https://jessitron.com/2012/12/11/tfs-and-git-a-comparison/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[10] &lt;a href="https://docs.microsoft.com/en-us/devops/develop/git/migrate-from-tfvc-to-git"&gt;https://docs.microsoft.com/en-us/devops/develop/git/migrate-from-tfvc-to-git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[11] &lt;a href="https://docs.microsoft.com/en-us/devops/develop/git/centralized-to-git"&gt;https://docs.microsoft.com/en-us/devops/develop/git/centralized-to-git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[12] &lt;a href="https://www.linkedin.com/pulse/azure-devops-future-after-github-acquisition-microsoft-antonio-alvino/"&gt;https://www.linkedin.com/pulse/azure-devops-future-after-github-acquisition-microsoft-antonio-alvino/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[13] &lt;a href="http://nkdagility.github.io/azure-devops-migration-tools/#support"&gt;http://nkdagility.github.io/azure-devops-migration-tools/#support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[14] &lt;a href="https://github.com/nkdAgility/azure-devops-migration-tools/blob/master/docs/index.md"&gt;https://github.com/nkdAgility/azure-devops-migration-tools/blob/master/docs/index.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[15] &lt;a href="https://github.com/features/security/"&gt;https://github.com/features/security/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[16] &lt;a href="https://docs.github.com/en/get-started/learning-about-github/about-github-advanced-security"&gt;https://docs.github.com/en/get-started/learning-about-github/about-github-advanced-security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[17] &lt;a href="https://docs.github.com/en/code-security/dependabot/working-with-dependabot"&gt;https://docs.github.com/en/code-security/dependabot/working-with-dependabot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[18] &lt;a href="https://github.com/features/copilot"&gt;https://github.com/features/copilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[19] &lt;a href="https://learn.microsoft.com/en-us/azure/devops/repos/git/git-branching-guidance?view=azure-devops"&gt;https://learn.microsoft.com/en-us/azure/devops/repos/git/git-branching-guidance?view=azure-devops&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
  <author>email@nospam.com</author>
  <category>azure</category>
  <category>azure</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/building-an-azure-dev-test-lab-azure-devops-migration/</guid>
  <pubDate>Wed, 15 Feb 2023 00:14:04 GMT</pubDate>
</item>
<item>
  <title>Building an Azure Dev Test Lab - Authentication</title>
  <link>https://tim-stanley.com/post/building-an-azure-dev-test-lab-authentication/</link>
  <description>&lt;p&gt;This is part of a series on &lt;a href="/post/building-an-azure-dev-test-lab-series"&gt;Building an Azure Dev Test Lab&lt;/a&gt; for software development.&lt;/p&gt;
&lt;p&gt;This is a summary of how to migrate from an Active Directory (AD) on premises system to
Azure Cloud, how to migrate Active Directory users and groups to Azure using AD Cloud Sync,
how to use a single sign-on for AD and Azure, how to enable Multi Factor Authentication (MFA)
for Azure authentication and set some appropriate security policies for MFA.[more]&lt;/p&gt;
&lt;div id="tocautogen" class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_information-required-for-the-migration"&gt;Information Required for the Migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_prepare-active-directory-for-migration"&gt;Prepare Active Directory for Migration&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h3_prepare-the-active-directory-upn-suffix-to-match-t"&gt;Prepare the Active Directory UPN Suffix to Match the Azure Primary Domain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_set-each-users-active-directory-email-property"&gt;Set Each users Active Directory Email property&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_prepare-active-directory-using-the-idfix-tool"&gt;Prepare Active Directory Using the IdFix tool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_create-an-ou-to-be-synced-with-azure"&gt;Create an OU to be Synced with Azure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_configure-ad-cloud-sync"&gt;Configure AD Cloud Sync&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h3_prepare-azure-for-migration"&gt;Prepare Azure for Migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_disable-any-existing-ad-sync"&gt;Disable Any Existing AD Sync&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_install-ad-cloud-sync"&gt;Install AD Cloud Sync&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_configure-conditional-access-policies"&gt;Configure Conditional Access Policies&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h3_userservice-multi-factor-authentication-settings"&gt;User/Service Multi-Factor Authentication Settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_enrolling-users-in-mfa"&gt;Enrolling Users in MFA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_resources"&gt;Resources:&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_information-required-for-the-migration"&gt;Information Required for the Migration&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Active Directory User Principal Name (UPN): example: *.corp.domain.com - listed in Active Directory Domains and Trusts&lt;/li&gt;
&lt;li&gt;List of Active Directory Users to Migrate to Azure&lt;/li&gt;
&lt;li&gt;List of Active Directory Groups to Migrate to Azure&lt;/li&gt;
&lt;li&gt;Azure Primary Domain example: webdomain.com - listed in Azure Active Directory, Overview&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_prepare-active-directory-for-migration"&gt;Prepare Active Directory for Migration&lt;/h2&gt;
&lt;h3 id="h3_prepare-the-active-directory-upn-suffix-to-match-t"&gt;Prepare the Active Directory UPN Suffix to Match the Azure Primary Domain&lt;/h3&gt;
&lt;p&gt;To find out the Azure Primary domain, navigate to the Azure Active Directory portal, in the Overview tab, which should list the Azure Primary domain. For example: webdomain.com.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20An%20Azure%20Dev%20Test%20Lab%20-%20Authentication/image.png" alt="Azure Overview"&gt;&lt;/p&gt;
&lt;p&gt;To find out the Active Directory UPN, on the domain controller, launch the Active Directory Domains and Trusts, select the domain, right click properties to list the UPN Suffixes. For example, corp.domain.com.&lt;/p&gt;
&lt;p&gt;By convention, the UPN should map to the user email name. But, if an AD and Azure system have been setup with different values, these must be resolved before migrating to Azure.&lt;/p&gt;
&lt;p&gt;If the UPN Suffix does not match the Azure Primary domain, add a new UPN suffix with the exact name as the Azure Primary domain, for example: *.webdomain.com.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20An%20Azure%20Dev%20Test%20Lab%20-%20Authentication/image%202.png" alt="Active Directory Domains and Trusts"&gt;&lt;/p&gt;
&lt;p&gt;Now modify all users and set their UPN Suffix to the same name as the UPN Suffix just added, which must be the same as the Azure Primary domain.&lt;/p&gt;
&lt;p&gt;On the domain controller, launch Active Directory users and computers, select the user, right click, select properties, and select the Account tab. The User logon name will have a dropdown listing the UPN suffixes that can be selected.&lt;/p&gt;
&lt;p&gt;When any new user is added, the UPN suffix must be set to the same value as the Azure Primary domain.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20An%20Azure%20Dev%20Test%20Lab%20-%20Authentication/image%203.png" alt="User domain properties"&gt;&lt;/p&gt;
&lt;p&gt;A Powershell script can also be run on the domain controller to update the user UPN suffix.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;$LocalUsers = Get-ADUser -Filter {UserPrincipalName -like '*corp.domain.com'} -Properties userPrincipalName -ResultSetSize $null
$LocalUsers | Select userPrincipalName,Name,SamAccountName
$LocalUsers | foreach {$newUpn = $_.UserPrincipalName.Replace(&amp;quot;corp.domain.com&amp;quot;,&amp;quot;webdomain.com&amp;quot;); $_ | Set-ADUser -UserPrincipalName $newUpn}
$LocalUsers = Get-ADUser -Filter {UserPrincipalName -like '*webdomain.com'} -Properties userPrincipalName -ResultSetSize $null
$LocalUsers | Select userPrincipalName,Name,SamAccountName
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="h3_set-each-users-active-directory-email-property"&gt;Set Each users Active Directory Email property&lt;/h3&gt;
&lt;p&gt;Each user must have an email property defined that matches the Azure / Office 365 email address that will match.&lt;/p&gt;
&lt;p&gt;On the domain controller, launch Active Directory users and computers, select the user, right click, select properties, and select the General tab. The User Email property must be set. For example user@webdomain.com.&lt;/p&gt;
&lt;p&gt;When configuring the user, I also recommend configuring any office or mobile phone numbers, and addresses in the Telephones and Address tabs. These Active Directory properties set on the domain controller will get pushed to Azure (AD is the primary source for this information).&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20An%20Azure%20Dev%20Test%20Lab%20-%20Authentication/image%204.png" alt="User email properties"&gt;&lt;/p&gt;
&lt;h3 id="h3_prepare-active-directory-using-the-idfix-tool"&gt;Prepare Active Directory Using the IdFix tool&lt;/h3&gt;
&lt;p&gt;Once the users UPN and email Active Directory properties are set, the next step is to run the IdFix tool.&lt;/p&gt;
&lt;p&gt;Microsoft recommends running the IdFix tool on Active Directory to prepare for migration to Azure.
Download the MSI, install it, and run the IdFix tool.
&lt;a href="https://github.com/microsoft/idfix"&gt;https://github.com/microsoft/idfix&lt;/a&gt; [1]&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;IdFix is used to perform discovery and remediation of identity objects and their attributes in an on-premises Active Directory environment in preparation for migration to Azure Active Directory. IdFix is intended for the Active Directory administrators responsible for directory synchronization with Azure Active Directory.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The purpose of IdFix is to reduce the time involved in remediating the Active Directory errors reported by Azure AD Connect. Our focus is on enabling the customer to accomplish the task in a simple expedient fashion without relying upon subject matter experts.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Microsoft Office 365 IdFix tool provides the customer with the ability to identify and remediate object errors in their Active Directory in preparation for deployment to Azure Active Directory or Office 365. They will then be able to successfully synchronize users, contacts, and groups from the on-premises Active Directory into Azure Active Directory.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="h3_create-an-ou-to-be-synced-with-azure"&gt;Create an OU to be Synced with Azure&lt;/h3&gt;
&lt;p&gt;On the domain controller using Azure Users and Computers app, create a new OU Container &amp;quot;AzureADConnect&amp;quot;. This will be used when AD Cloud Sync is configured. Add a Users and Groups OU under AzureADConnect.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20An%20Azure%20Dev%20Test%20Lab%20-%20Authentication/image%205.png" alt="Active Directory OU"&gt;&lt;/p&gt;
&lt;p&gt;Move all users identified in the information gathering phase that will have both AD and Azure logins under the Users OU.&lt;/p&gt;
&lt;p&gt;Move all security groups identified in the information gathering phase that will be used in both AD and Azure to the Groups OU.&lt;/p&gt;
&lt;h2 id="h2_configure-ad-cloud-sync"&gt;Configure AD Cloud Sync&lt;/h2&gt;
&lt;h3 id="h3_prepare-azure-for-migration"&gt;Prepare Azure for Migration&lt;/h3&gt;
&lt;p&gt;Azure AD Cloud Sync replaces the old Azure AD Sync tool. Azure AD Cloud Sync is much simpler to configure and install. Refer to &lt;a href="https://learn.microsoft.com/en-us/azure/active-directory/cloud-sync/how-to-prerequisites?tabs=public-cloud"&gt;Prerequisites for Azure AD Connect cloud sync&lt;/a&gt; [7] for more details.&lt;/p&gt;
&lt;h3 id="h3_disable-any-existing-ad-sync"&gt;Disable Any Existing AD Sync&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Disable the Connect sync scheduler by opening an admin PowerShell prompt and running&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;Stop-ADSyncSyncCycle
Set-ADSyncScheduler -SyncCycleEnabled $false
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stop the Connect-related services and change their startup type from Automatic (Delayed Start) to Disabled&lt;/p&gt;
&lt;p&gt;Microsoft Azure AD Sync&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure AD Connect Health Sync Insights Service&lt;/li&gt;
&lt;li&gt;Azure AD Connect Health Sync Monitoring Service&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disable any monthly password rotation scheduled task&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="h3_install-ad-cloud-sync"&gt;Install AD Cloud Sync&lt;/h3&gt;
&lt;p&gt;Download the agent from your Azure portal at &lt;a href="https://portal.azure.com/#view/Microsoft_AAD_Connect_Provisioning/ProvisioningManagementBlade"&gt;Azure AD Connect cloud sync&lt;/a&gt; [4]&lt;/p&gt;
&lt;p&gt;Refer to the Microsoft instructions on &lt;a href="https://learn.microsoft.com/en-us/azure/active-directory/cloud-sync/how-to-install"&gt;Install the Azure AD Connect provisioning agent&lt;/a&gt; [5]&lt;/p&gt;
&lt;p&gt;I recommend letting the AD Cloud Sync installer select the gMSA account. If you install AD Cloud Sync on two systems, I recommend letting the installer select the gMSA account.&lt;/p&gt;
&lt;p&gt;Once the AD Cloud Sync is installed, it will be listed on the site &lt;a href="https://portal.azure.com/#view/Microsoft_AAD_Connect_Provisioning/ProvisioningManagementBlade"&gt;Azure AD Connect cloud sync&lt;/a&gt; [4] on the tab On-premises provisioning agents.&lt;/p&gt;
&lt;h2 id="h2_configure-conditional-access-policies"&gt;Configure Conditional Access Policies&lt;/h2&gt;
&lt;p&gt;Microsoft outlines information on conditional access policies here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/active-directory/conditional-access/overview"&gt;What is Conditional Access?&lt;/a&gt; [6]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/active-directory/conditional-access/concept-conditional-access-policy-common"&gt;Conditional Access templates (Preview)&lt;/a&gt; [7]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following types of conditional access policies are recommended:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal user - enforce MFA (Require multifactor authentication for all users)&lt;/li&gt;
&lt;li&gt;External user - enforce MFA (Require multifactor authentication for guests)&lt;/li&gt;
&lt;li&gt;IP Location&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure Conditional access policies are defined at &lt;a href="https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/ConditionalAccessBlade/%7E/Policies"&gt;Conditional Access&lt;/a&gt; [8]&lt;/p&gt;
&lt;p&gt;IP Location based policies are used when a business has a static IP at an office location, and the company wants to create a policy that the &amp;quot;IP Location&amp;quot; acts as the MFA. This makes using Azure more user friendly when working at a company office location.&lt;/p&gt;
&lt;p&gt;When an external MFA user from an outside Office 365 organization enrolls in an MFA, their primary email configured as a guest must match their exact UPN on their Office 365 system, not an alias.&lt;/p&gt;
&lt;p&gt;Creating a conditional access policy requires an Azure AD Premium P1 license. Refer to the Microsoft Conditional Access overview above for more detailed information.&lt;/p&gt;
&lt;p&gt;Below are the steps to create a conditional access policy for External users.
Create a Create A New Policy from a template. Select &amp;quot;Require multifactor authentication for guest access&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20An%20Azure%20Dev%20Test%20Lab%20-%20Authentication/image%206.png" alt="Active Directory Overview"&gt;&lt;/p&gt;
&lt;p&gt;Set the Policy state to On to have the policy immediately take affect. Do not turn the policy on until your users have been informed how to enroll in MFA.
Select next, on the Review + create, you will need to set Enable security defaults to No.&lt;/p&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20An%20Azure%20Dev%20Test%20Lab%20-%20Authentication/image%207.png" alt="Active Directory Domains and Trusts"&gt;&lt;/p&gt;
&lt;p&gt;There are currently two legacy Azure administrative options available to enforce MFA. These are older options prior to Microsoft publishing conditional access policies and these may go away at some point. Do not enable or enforce MFA using these options until the users have been informed on how to enroll in MFA.&lt;/p&gt;
&lt;h3 id="h3_userservice-multi-factor-authentication-settings"&gt;User/Service Multi-Factor Authentication Settings&lt;/h3&gt;
&lt;p&gt;The link for these two options is at: &lt;a href="https://account.activedirectory.windowsazure.com/usermanagement/multifactorverification.aspx"&gt;Azure, Users, Per User MFA&lt;/a&gt; [9]&lt;/p&gt;
&lt;p&gt;Select the Users tab, select the user, Enable MFA. Once enabled, the next logon from the user will require MFA enrollment. The terms are slightly confusing, &amp;quot;Enable MFA&amp;quot; actually means enforce on next logon.&lt;/p&gt;
&lt;p&gt;To specify an IP Location where MFA is not required, select the service settings tab.
Recommended settings are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;app passwords: Do not allow users to create app passwords to sign in to non-browser apps.&lt;/li&gt;
&lt;li&gt;trusted ips: skip muti-factor authentication for request from federated users on my intranet (specify an IP range such as 100.100.100.100/32).&lt;/li&gt;
&lt;li&gt;verification options: enable all options&lt;/li&gt;
&lt;li&gt;remember multi-factor authentication on trusted device: allow users to remember multi-factor authentication on devices they trust: 60 days.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="/postimage?picture=Building%20An%20Azure%20Dev%20Test%20Lab%20-%20Authentication/image%208.png" alt="Multi Factor Authentication"&gt;&lt;/p&gt;
&lt;h3 id="h3_enrolling-users-in-mfa"&gt;Enrolling Users in MFA&lt;/h3&gt;
&lt;p&gt;Users need to be informed ahead of time how to enroll in MFA so that when MFA enforcement is turned on, they know how to quickly update their account and login using MFA. Users can quickly navigate to the Microsoft user account security info tab by using the following url: &lt;a href="https://aka.ms/MFASetup"&gt;https://aka.ms/MFASetup&lt;/a&gt;  [10]&lt;/p&gt;
&lt;h2 id="h2_resources"&gt;Resources:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[1] &lt;a href="https://github.com/microsoft/idfix"&gt;https://github.com/microsoft/idfix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2] &lt;a href="https://beznett.com/how-to-add-a-new-email-domain-upn-suffix-to-active-directory/"&gt;https://beznett.com/how-to-add-a-new-email-domain-upn-suffix-to-active-directory/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3] &lt;a href="https://learn.microsoft.com/en-us/azure/active-directory/cloud-sync/how-to-prerequisites?tabs=public-cloud"&gt;https://learn.microsoft.com/en-us/azure/active-directory/cloud-sync/how-to-prerequisites?tabs=public-cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[4] &lt;a href="https://portal.azure.com/#view/Microsoft_AAD_Connect_Provisioning/ProvisioningManagementBlade"&gt;https://portal.azure.com/#view/Microsoft_AAD_Connect_Provisioning/ProvisioningManagementBlade&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[5] &lt;a href="https://learn.microsoft.com/en-us/azure/active-directory/cloud-sync/how-to-install"&gt;https://learn.microsoft.com/en-us/azure/active-directory/cloud-sync/how-to-install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[6] &lt;a href="https://learn.microsoft.com/en-us/azure/active-directory/conditional-access/overview"&gt;https://learn.microsoft.com/en-us/azure/active-directory/conditional-access/overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[7] &lt;a href="https://learn.microsoft.com/en-us/azure/active-directory/conditional-access/concept-conditional-access-policy-common"&gt;https://learn.microsoft.com/en-us/azure/active-directory/conditional-access/concept-conditional-access-policy-common&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[8] &lt;a href="https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/ConditionalAccessBlade/%7E/Policies"&gt;https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/ConditionalAccessBlade/~/Policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[9] &lt;a href="https://account.activedirectory.windowsazure.com/usermanagement/multifactorverification.aspx"&gt;https://account.activedirectory.windowsazure.com/usermanagement/multifactorverification.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[10] &lt;a href="https://aka.ms/MFASetup"&gt;https://aka.ms/MFASetup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
  <author>email@nospam.com</author>
  <category>azure</category>
  <category>azure</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/building-an-azure-dev-test-lab-authentication/</guid>
  <pubDate>Sat, 11 Feb 2023 14:06:40 GMT</pubDate>
</item>
<item>
  <title>Building an Azure Dev Test Lab - Why Azure</title>
  <link>https://tim-stanley.com/post/building-an-azure-dev-test-lab-why-azure/</link>
  <description>&lt;p&gt;This is part of a series on &lt;a href="/post/building-an-azure-dev-test-lab-series"&gt;Building an Azure Dev Test Lab&lt;/a&gt; for software development.&lt;/p&gt;
&lt;p&gt;What is Azure and why use it?[more]&lt;/p&gt;
&lt;div id="tocautogen" class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_what-is-azure"&gt;What Is Azure?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_focus-business-resources-on-the-primary-business"&gt;Focus Business Resources on the Primary Business&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_availability-and-reliability"&gt;Availability and Reliability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_hidden-on-premises-costs-covered-by-azure"&gt;Hidden On Premises Costs Covered by Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_standards-compliance"&gt;Standards Compliance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_innovation-and-leveraging-new-technology"&gt;Innovation and Leveraging New Technology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_taxes-and-financial-considerations"&gt;Taxes and Financial Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_automation--devops"&gt;Automation / DEVOPS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_summary"&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_what-is-azure"&gt;What Is Azure?&lt;/h2&gt;
&lt;p&gt;Azure is more than a marketing term.  Today (2023), Azure has grown to ~487 categorized services (some duplicates) to cover a large range of business services.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;General (18)&lt;/li&gt;
&lt;li&gt;Compute (28)&lt;/li&gt;
&lt;li&gt;Networking (24)&lt;/li&gt;
&lt;li&gt;Storage (15)&lt;/li&gt;
&lt;li&gt;Web (16)&lt;/li&gt;
&lt;li&gt;Mobile (3)&lt;/li&gt;
&lt;li&gt;Containers (7)&lt;/li&gt;
&lt;li&gt;Databases (21)&lt;/li&gt;
&lt;li&gt;Analytics (15)&lt;/li&gt;
&lt;li&gt;AI + machine learning (26)&lt;/li&gt;
&lt;li&gt;Internet of things (25)&lt;/li&gt;
&lt;li&gt;Mixed reality (2)&lt;/li&gt;
&lt;li&gt;Integration (26)&lt;/li&gt;
&lt;li&gt;Identity (23)&lt;/li&gt;
&lt;li&gt;Security (23)&lt;/li&gt;
&lt;li&gt;Devops (8)&lt;/li&gt;
&lt;li&gt;Migration (8)&lt;/li&gt;
&lt;li&gt;Monitor (11)&lt;/li&gt;
&lt;li&gt;Management and governance (27)&lt;/li&gt;
&lt;li&gt;Intune (4)&lt;/li&gt;
&lt;li&gt;Hybrid + multicloud (15)&lt;/li&gt;
&lt;li&gt;Other (132)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_focus-business-resources-on-the-primary-business"&gt;Focus Business Resources on the Primary Business&lt;/h2&gt;
&lt;p&gt;Small companies don't have the overhead to hire teams of people just to manage infrastructure.  When you migrate to Azure, you have a team of people that manage the security, infrastructure, wiring, power, internet connections, monitor and fix hardware, for all your Azure services.  Yes, some amount of time from business resources are needed to create users, set permissions, set policies, but the additional people (or hours) needed to manage everything is all covered by the Azure hosting fees.  Microsoft can scale and achieve productivity at a scale small and medium business can't touch.&lt;/p&gt;
&lt;h2 id="h2_availability-and-reliability"&gt;Availability and Reliability&lt;/h2&gt;
&lt;p&gt;Microsoft provides between 99.9% to 99.99% Service Level Agreement (SLA) depending on the service tier [4]. Free services have no SLA. Availability of 99.9% translates into a maximum downtime of 8 hours and 46 minutes over the course of a year and 99.99% translates into a maximum downtime of about 53 minutes per year.&lt;/p&gt;
&lt;h2 id="h2_hidden-on-premises-costs-covered-by-azure"&gt;Hidden On Premises Costs Covered by Azure&lt;/h2&gt;
&lt;p&gt;Real estate, buildings, building maintenance, property taxes, electrical costs HVAC costs, hardware amortization, are all covered by the costs of the Azure fees. Because the Azure systems are done at a large scale, there is significant cost savings compared to what a small or medium business could do standalone. Azure also provides the ability to scale systems almost instantly, thus saving time. Doing that with physical hardware takes time.&lt;/p&gt;
&lt;h2 id="h2_standards-compliance"&gt;Standards Compliance&lt;/h2&gt;
&lt;p&gt;In today's world, there are numerous standards and compliance rules and policies organizations need to adhere to ranging from government regulations to industry guidelines. Global organizations delivering services to customers in multiple parts of the world have varying rules and regulations to follow.  The Azure Security portal provides the heavy lifting and supporting documentation to help an organization begin the process to comply with those standards, including PCI, EU GDPR, SOC (1, 2, 3) and numerous others. The Azure Compliance Center [5], [6] provides over 100 compliance regulations for over 50 countries and regions. Companies still must ensure the solutions they deliver comply with those standards, but the Azure systems provide all the supporting documentation to ensure a company's hosted services are all in compliance.&lt;/p&gt;
&lt;h2 id="h2_innovation-and-leveraging-new-technology"&gt;Innovation and Leveraging New Technology&lt;/h2&gt;
&lt;p&gt;Imagine if you wanted to change all your web servers overnight to support .Net 7.0 what a large effort that would be.  When Microsoft released .Net 7.0, the day of the announcement, Azure services were hosting .Net 7.0.  Azure has had a very good track record of providing new features at a very fast pace.&lt;/p&gt;
&lt;h2 id="h2_taxes-and-financial-considerations"&gt;Taxes and Financial Considerations&lt;/h2&gt;
&lt;p&gt;Traditional US Accounting rules required that when real estate, buildings, hardware equipment all had to be depreciated over the life of the equipment. That requires funding up front, and it can (usually) only be written off over time.  By utilizing cloud-based services, a company can write off 100% of the expense in the year it is incurred. The term shifting from CAPEX to OPEX [3] is used to describe this.&lt;/p&gt;
&lt;h2 id="h2_automation--devops"&gt;Automation / DEVOPS&lt;/h2&gt;
&lt;p&gt;Microsoft has geared its entire infrastructure not just around a portion of what is needed to provide a web-based set of software services, but every single end to end detail from authentication, source control, static code analysis, testing, deployment, scalability, all at a scale we have never seen before in the software industry.  By providing all the tooling for automating all those steps along the way, this can reduce costs, reduce the time to market, and increase overall quality.&lt;/p&gt;
&lt;h2 id="h2_summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;Azure provides a wide range of infrastructure and services to cover software and services at a scale few companies can afford to own their own. By using that scale, it allows business to use their own people to focus on business problems and leverage the Azure systems and the supporting teams to provide those services. Azure provides extremely reliable Service Level Agreements, that even most small and medium business would struggle to achieve. Azure provides all the supporting documentation to help companies achieve regional, country, and industry standards. Azure provides new features regularly and rapidly. Companies can leverage other people's real estate, hardware, and employees by using, and take advantage of tax laws to improve financial scenarios when compared to an in-house data center. And lastly, Azure provides an end-to-end eco-system for automating all the steps of the software development and deployment process.&lt;/p&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[1] &lt;a href="https://www.forbes.com/sites/forbestechcouncil/2021/03/12/why-migrate-to-the-cloud-the-basics-benefits-and-real-life-examples/?sh=2e3b7e275e27"&gt;https://www.forbes.com/sites/forbestechcouncil/2021/03/12/why-migrate-to-the-cloud-the-basics-benefits-and-real-life-examples/?sh=2e3b7e275e27&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2] &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/strategy/motivations"&gt;https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/strategy/motivations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3] &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/strategy/financial-considerations/"&gt;https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/strategy/financial-considerations/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[4] &lt;a href="https://azure.microsoft.com/en-us/support/legal/sla/summary/"&gt;https://azure.microsoft.com/en-us/support/legal/sla/summary/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[5] &lt;a href="https://azure.microsoft.com/en-us/explore/trusted-cloud/compliance/"&gt;https://azure.microsoft.com/en-us/explore/trusted-cloud/compliance/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[6] &lt;a href="https://azure.microsoft.com/en-us/resources/azure-enables-a-world-of-compliance/"&gt;https://azure.microsoft.com/en-us/resources/azure-enables-a-world-of-compliance/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
  <author>email@nospam.com</author>
  <category>azure</category>
  <category>software-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/building-an-azure-dev-test-lab-why-azure/</guid>
  <pubDate>Tue, 10 Jan 2023 19:40:35 GMT</pubDate>
</item>
<item>
  <title>Migrating to .Net7</title>
  <link>https://tim-stanley.com/post/migrating-to-net7/</link>
  <description>&lt;p&gt;On November 8, 2022, Microsoft released .Net 7.
After getting Visual Studio Professional 17.4 installed,
updating to .Net 7 was fairly painless.[more]&lt;/p&gt;
&lt;p&gt;Changing the obligatory TargetFramework entry in all the projects:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;&amp;lt;TargetFramework&amp;gt;net7.0&amp;lt;/TargetFramework&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Updating the package references from 6.0.0 to 7.0.0:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;&amp;lt;PackageReference Include=&amp;quot;Microsoft.Extensions.Hosting&amp;quot; Version=&amp;quot;7.0.0&amp;quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Updating the github action yml file to use the new dotnet version:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;dotnet-version: '7.0.x'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Azure even had all the website hosting ready so I didn't have to wait for anyone to deploy
.Net 7. Microsoft does list some incompatabilities in .Net 7, but it's not a long list.
This has probably been the easiest migration since .net46 to .net48.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/compatibility/7.0"&gt;https://learn.microsoft.com/en-us/dotnet/core/compatibility/7.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/announcing-dotnet-7/"&gt;https://devblogs.microsoft.com/dotnet/announcing-dotnet-7/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
  <author>email@nospam.com</author>
  <category>azure</category>
  <category>net</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/migrating-to-net7/</guid>
  <pubDate>Fri, 18 Nov 2022 00:11:41 GMT</pubDate>
</item>
<item>
  <title>Building an Azure Dev Test Lab Series</title>
  <link>https://tim-stanley.com/post/building-an-azure-dev-test-lab-series/</link>
  <description>&lt;p&gt;Microsoft has a very large quantity of documentation on Azure.
But most of those articles are focused on new large-scale production scenarios
or migrating existing production scenarios to Azure. For a software development
firm that is looking only to leverage Azure for software development and testing,
and not expose public web services to the internet, where does one start?[more]&lt;/p&gt;
&lt;p&gt;The Microsoft documentation that I've read leads one to believe that it's a simple
as just creating an Azure VM or an Azure Web service and you're done.
The reality is there is much more infrastructure required to do that.
This series attempts to put together a roadmap or summary of some solutions aimed
solely toward software development for Enterprise services and applications.
You may find it helpful for preparing your Azure migration or if you have some
services in Azure extending it.&lt;/p&gt;
&lt;h2 id="assumptions"&gt;Assumptions&lt;/h2&gt;
&lt;p&gt;Azure is a big world. To narrow down the scope of things, I'm going to create a narrow set of assumptions to build a development and test lab in Azure.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Software development teams are distributed in multiple locations in Europe, Asia, and the United States.&lt;/li&gt;
&lt;li&gt;There is an existing Windows on premises Active Directory system in place for Authentication.&lt;/li&gt;
&lt;li&gt;There is an existing Windows network system in place in at least three physical locations / offices.&lt;/li&gt;
&lt;li&gt;There is an existing Wide Area Network system in place between the physical locations / offices.&lt;/li&gt;
&lt;li&gt;There are existing file shares / network shares in place for software distribution and storage.&lt;/li&gt;
&lt;li&gt;The software development team utilizes Visual Studio 2022 Professional.&lt;/li&gt;
&lt;li&gt;There is an extremely large source code base in Microsoft Team Foundation Server.&lt;/li&gt;
&lt;li&gt;The development lab utilizes Microsoft Hyper-V Virtual Machines for dev / test servers.&lt;/li&gt;
&lt;li&gt;There is an extremely large code base of web-based services used for an Enterprise Suite of applications.&lt;/li&gt;
&lt;li&gt;Microsoft Office 365 (hosted in the cloud) is used throughout the company for email and team communication.&lt;/li&gt;
&lt;li&gt;All remote access to Azure systems requires Multi Factor Authentication.&lt;/li&gt;
&lt;li&gt;No &amp;quot;production&amp;quot; and no &amp;quot;public&amp;quot; facing websites, databases, or services.&lt;/li&gt;
&lt;li&gt;For Dev Test Labs, no load balancing or hot failover and no region failover.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="articles"&gt;Articles&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="/post/building-an-azure-dev-test-lab-why-azure/"&gt;Building an Azure Dev Test Lab - Why Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/post/building-an-azure-dev-test-lab-authentication/"&gt;Building an Azure Dev Test Lab - Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/post/building-an-azure-dev-test-lab-azure-devops-migration/"&gt;Building an Azure Dev Test Lab - Azure Devops Migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/post/building-an-azure-dev-test-lab-data-centers/"&gt;Building an Azure Dev Test Lab - Data Centers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/post/building-an-azure-dev-test-lab-networking/"&gt;Building an Azure Dev Test Lab - Networking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Building an Azure Dev Test Lab File Shares&lt;/li&gt;
&lt;li&gt;Building an Azure Dev Test Lab App Services&lt;/li&gt;
&lt;li&gt;Building an Azure Dev Test Lab Virtual Machines&lt;/li&gt;
&lt;li&gt;Building an Azure Dev Test Lab Remote Access&lt;/li&gt;
&lt;li&gt;Building an Azure Dev Test Lab Azure SQL&lt;/li&gt;
&lt;/ol&gt;
</description>
  <author>email@nospam.com</author>
  <category>azure</category>
  <category>software-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/building-an-azure-dev-test-lab-series/</guid>
  <pubDate>Sat, 17 Sep 2022 17:31:13 GMT</pubDate>
</item>
<item>
  <title>Migrating To .Net6 and Azure</title>
  <link>https://tim-stanley.com/post/migrating-to-net6-and-azure/</link>
  <description>&lt;p&gt;In 2022, I decided to make a significant update the the code base and hosting platform
used by this site.  I decided to migrate to .Net 6 and host it on Azure.[more]&lt;/p&gt;
&lt;p&gt;I could have taken the old site to Azure, but I wanted to start with a cleaner code base. I removed some of the old dependencies, libraries and assumptions to lighten up as much as possible.
A general list of the new requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Store content as XML or JSON.&lt;/li&gt;
&lt;li&gt;Do not require the use of a database.&lt;/li&gt;
&lt;li&gt;Provide support for as much of the original content as possible.&lt;/li&gt;
&lt;li&gt;Remove dependencies on third party packages as possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main course of effort was the original site was written in ASP.Net Web forms.  The new site was written in ASP.Net Core Razor pages in C#.&lt;/p&gt;
&lt;p&gt;Some interesting points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start: 2022 06 10&lt;/li&gt;
&lt;li&gt;End: 2022 07 31&lt;/li&gt;
&lt;li&gt;32 days of working changes, a few hours on nights &amp;amp; weekends&lt;/li&gt;
&lt;li&gt;Occurred over 50 calendar days&lt;/li&gt;
&lt;li&gt;The equivalnet of about 15-20 full time equivalent working days&lt;/li&gt;
&lt;li&gt;15,552 Lines of Source Code&lt;/li&gt;
&lt;li&gt;4,438 Lines of Executable Code&lt;/li&gt;
&lt;li&gt;Go Live: 2022 08 28&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is a summary of some of the key points of the new site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developed using Visual Studio 2022&lt;/li&gt;
&lt;li&gt;Targets .Net 6&lt;/li&gt;
&lt;li&gt;ASP.Net Core Razor Pages&lt;/li&gt;
&lt;li&gt;Content / object model is all XML based&lt;/li&gt;
&lt;li&gt;Supports pages, posts, tags, categories, authors, and site statistics&lt;/li&gt;
&lt;li&gt;Uses Azure DNS&lt;/li&gt;
&lt;li&gt;Uses Azure App Services / an Azure Website for hosting the site&lt;/li&gt;
&lt;li&gt;Uses GitHub Azure integrations to publish software updates to Azure&lt;/li&gt;
&lt;li&gt;Uses &lt;a href="https://prismjs.com/"&gt;prism.js&lt;/a&gt; for code formatting&lt;/li&gt;
&lt;li&gt;Uses &lt;a href="https://www.tiny.cloud/"&gt;tinymce&lt;/a&gt; for content editing&lt;/li&gt;
&lt;li&gt;Uses bootstrap for a CSS styling.&lt;/li&gt;
&lt;li&gt;Some moving parts were greatly influenced by &lt;a href="https://github.com/madskristensen/Miniblog.Core"&gt;Miniblog.Core&lt;/a&gt;. This site is not a derivative of Miniblog.Core, but I did use some of the ideas as a base for this sites code base.&lt;/li&gt;
&lt;li&gt;The Table Of Content generator leverages the &lt;a href="https://github.com/zzzprojects/html-agility-pack/"&gt;HtmlAgilityPack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few things about Azure I learned along the way.&lt;/p&gt;
&lt;p&gt;Pick carefully what Azure Datacenter you want for hosting. Not all Azure Datacenters have the same features, or the same pricing and you cannot easiliy mix parts from other Azure Datacenters.  For example, once your publishing a site from Github to Azure, moving that Azure Website to another Azure DataCenter basically requires configuring everything back from scratch.&lt;/p&gt;
&lt;p&gt;Using an Azure Static Website is really for a &amp;quot;static&amp;quot; site.  A dynamic site that runs ASP.Net Core isn't suited for a Azure Static Website.&lt;/p&gt;
&lt;p&gt;Using GitHub actions to publish to Azure is a timesaver.  However, each action stores the result as storage, and if your not careful, very quickly you will exceed the 500 MB storage limit for &amp;quot;free&amp;quot; GitHub repositories.&lt;/p&gt;
&lt;p&gt;Azure App Services provide several layers of scalability for the &lt;a href="https://docs.microsoft.com/en-us/azure/app-service/overview-hosting-plans"&gt;Azure Hosting Plans&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Using Azure App Services / Azure Websites for a Developer Lab Instance provides a free hosting service (F1), an SSL certificate, and is extremely helpful for go live preparation.  The D1 service plan provides the bare bones minimum to host a non azure domain name.&lt;/p&gt;
&lt;p&gt;You can't get an SSL certificate (even if you buy one) on a custom domain name on the F1 or D1 service plan.  &lt;a href="https://docs.microsoft.com/en-us/azure/app-service/configure-ssl-certificate?tabs=apex%2Cportal"&gt;Microsoft tells you that a B1 service plan or higher is needed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The D1 service plan provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 GB of memory&lt;/li&gt;
&lt;li&gt;240 minutes / day compute&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The D1 service plan is more than enough power to drive this website.  It uses about 250-350 Mb of memory (everything is store in memory since there is no database). Because everything is stored in memory it barely uses any compute time.&lt;/p&gt;
&lt;p&gt;The positives of moving to Azure App Services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Github Actions to publish to Azure is a great timesaver.&lt;/li&gt;
&lt;li&gt;Azure DNS is much easier to administer than other DNS services I've used.&lt;/li&gt;
&lt;li&gt;The minimum D1 plan is still screamingly fast.&lt;/li&gt;
&lt;li&gt;The Azure monitoring provides some usefull analysis tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The only negative I've experienced so far with Azure is that it tries to steer the creation to a default S1 plan.  If you accidentally setup an S1 plan, and remove it from you site, you still pay for the plan until you remove it from the subscription.  If you don't pay attention, you can quickly run up a hefty bill.  Few people really need an S1 hosting plan to start a small website.&lt;/p&gt;
</description>
  <author>email@nospam.com</author>
  <category>azure</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/migrating-to-net6-and-azure/</guid>
  <pubDate>Fri, 02 Sep 2022 23:25:12 GMT</pubDate>
</item>
<item>
  <title>2010 Era Blog Platform Retired</title>
  <link>https://tim-stanley.com/post/2010-era-blog-platform-retired/</link>
  <description>&lt;p&gt;This site (&lt;a href="/"&gt;tim-stanley.com&lt;/a&gt;) was first started in February 2006. It first went publicly
live October 8, 2007.  The engine used to power this site was used from 2006 to 2022.
The main technology really hadn't been modified since 2010. Not bad for a sixteen year run.&lt;/p&gt;
&lt;p&gt;In 2022, this site was updated, but this is a summary of the underlying technology that
powered this site for sixteen years.[more]&lt;/p&gt;
&lt;div id="tocautogen" class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_original-site-platform"&gt;Original Site Platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_original-blog-platform"&gt;Original Blog Platform&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_original-site-platform"&gt;Original Site Platform&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ASP.NET 2.0&lt;/li&gt;
&lt;li&gt;.Net 3.5 SP 1&lt;/li&gt;
&lt;li&gt;Visual Studio 2008&lt;/li&gt;
&lt;li&gt;C#&lt;/li&gt;
&lt;li&gt;&lt;a href="http://get.live.com/writer/overview"&gt;Windows Live Writer&lt;/a&gt; Build 12.0.1366.1026&lt;/li&gt;
&lt;li&gt;Windows Live Writer &lt;a href="http://lvildosola.blogspot.com/2007/02/code-snippet-plugin-for-windows-live.html"&gt;Code Snippet Plugin&lt;/a&gt; &lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=d4409446-af7f-42ec-aa20-78aa5bac4748&amp;amp;l=8"&gt;Code Snippet download&lt;/a&gt; &lt;a href="http://gallery.live.com/liveItemDetail.aspx?li=6a125986-6550-4ce9-9c71-9a0fbbc3443f&amp;amp;pl=8&amp;amp;bt=9"&gt;Polaroid Picture Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;XML based content&lt;/li&gt;
&lt;li&gt;SQLite based DB (for content and relationship data)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_original-blog-platform"&gt;Original Blog Platform&lt;/h2&gt;
&lt;p&gt;The site utilized BlogEngine.Net with several &lt;a href="http://www.tumelty.com/blog/page/Definitive-List-of-BlogEngineNet-Extensions.aspx"&gt;Extensions&lt;/a&gt;.
Some custom controls are used on a lot of the pages.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Content Management System - &lt;a href="http://www.dotnetblogengine.net/"&gt;BlogEngine.Net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tellingmachine.com/post/2008/03/BlogEngineNET-Outline-Extension.aspx"&gt;Table Of Content Generator&lt;/a&gt; [ tocautogen ] extension by Klaus Graefensteiner&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nyveldt.com/blog/post/Most-Popular-Posts-Extension-and-Widget.aspx"&gt;Most Popular Posts extension&lt;/a&gt; and TopPosts control by &lt;a href="http://nyveldt.com/blog/page/about-al-nyveldt.aspx"&gt;Al Nyveldt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.squaredroot.com/post/2008/01/Copy-Code-to-Clipboard-Extension-for-BlogEngine.aspx"&gt;Copy Code To Clipboard Extension&lt;/a&gt; by &lt;a href="http://www.squaredroot.com/page/About-Me.aspx"&gt;Troy Goode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dannydouglass.com/post/2008/01/Add-Social-Bookmarking-Links-To-Your-Blog.aspx"&gt;Social Bookmarking extension&lt;/a&gt; by &lt;a href="http://www.dannydouglass.com/"&gt;Danny Douglass&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Icons from &lt;a href="http://www.icongalore.com/software-icons/free-email-icons.htm"&gt;IconGalore&lt;/a&gt;, &lt;a href="http://fasticon.com/freeware/"&gt;FastIcon&lt;/a&gt;, &lt;a href="http://www.icondrawer.com/"&gt;IconDrawer&lt;/a&gt;, &lt;a href="http://www.webdesignerdepot.com/"&gt;WebDesignerDepot&lt;/a&gt; and &lt;a href="http://www.artua.com/"&gt;Artura&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Background image from &lt;a href="http://www.absolutecross.com/graphics/textures/texpack2_1.php"&gt;AbsoluteCross.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Custom Control for ArchiveList - sortable grid layout of contents&lt;/li&gt;
&lt;li&gt;Custom Control for Contacts - allows positioning the contact information in a page instead of a specific link.&lt;/li&gt;
&lt;li&gt;Custom Control for Flickr Slide Show  - via &lt;a href="http://paulstamatiou.com/2005/11/19/how-to-quickie-embedded-flickr-slideshows"&gt;Paul Stamatiou&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Custom Control for &lt;a href="http://www.airtightinteractive.com/simpleviewer/"&gt;Simple Viewer&lt;/a&gt; Photo Gallery via &lt;a href="http://www.airtightinteractive.com/simpleviewer/"&gt;Airtight Interactive.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Custom Control for Page Includes&lt;/li&gt;
&lt;li&gt;Custom Control for Page Layouts&lt;/li&gt;
&lt;li&gt;JQuery Snapfish menus&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As I developed one site, I had another, then another, then another. Before long I was spending more time applying patches / changes to the main code base and distributing it to all the sites than I was on content. That lead me to try to focus on one code base for multiple websites and that eventually led to a multi-tenant solution.&lt;/p&gt;
&lt;p&gt;The main portions of BlogEngine.Net provided a solid basis, but it was heavily modified to support a multi-tenant blog platform.  That meant some pretty significant changes to the model and code base.  What was left had it's origins in BlogEngine.Net but it was pretty significantly different than BlogEngine.Net.&lt;/p&gt;
</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/2010-era-blog-platform-retired/</guid>
  <pubDate>Thu, 01 Sep 2022 11:58:08 GMT</pubDate>
</item>
<item>
  <title>Use HostingEnvironment.MapPath</title>
  <link>https://tim-stanley.com/post/use-hostingenvironmentmappath/</link>
  <description>&lt;p&gt;When running a service under IIS, the HttpContext.Current object is not available, so HttpContext.Current.Server.MapPath will fail.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;fileName = HttpContext.Current.Server.MapPath(fileName);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The solution is to use Hosting.HostingEnvironment.MapPath instead.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;fileName = System.Web.Hosting.HostingEnvironment.MapPath(fileName);&lt;/code&gt;&lt;/pre&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>net</category>
  <category>asp-net</category>
  <category>iis</category>
  <category>visual-studio</category>
  <category>c-sharp</category>
  <category>mappath</category>
  <category>software-development</category>
  <category>tips</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/use-hostingenvironmentmappath/</guid>
  <pubDate>Fri, 25 Jun 2010 18:38:21 GMT</pubDate>
</item>
<item>
  <title>Custom Controls In ASP.NET</title>
  <link>https://tim-stanley.com/post/custom-controls-in-aspnet/</link>
  <description>&lt;p&gt;ASP.net has that neat little feature where all the controls can start with &amp;lt;asp:.&amp;nbsp; It makes it easy to code.&amp;nbsp; I had numerous custom controls and I always had to register the control on each page to use it.&amp;nbsp; Scott Guthrie had a great tip on how to register the controls in the web.config file so that it doesn&amp;rsquo;t have to be done in each page.[more]&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/dd37d9075ce1_4B8/image_2.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="/image?picture=WindowsLiveWriter/dd37d9075ce1_4B8/image_thumb.png" alt="image" width="500" height="245" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m really surprised I haven&amp;rsquo;t read about this earlier.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://weblogs.asp.net/scottgu/archive/2006/11/26/tip-trick-how-to-register-user-controls-and-custom-controls-in-web-config.aspx" href="http://weblogs.asp.net/scottgu/archive/2006/11/26/tip-trick-how-to-register-user-controls-and-custom-controls-in-web-config.aspx"&gt;How to register user controls and custom controls in web config&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>asp-net</category>
  <category>visual-studio</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/custom-controls-in-aspnet/</guid>
  <pubDate>Fri, 26 Feb 2010 05:26:00 GMT</pubDate>
</item>
<item>
  <title>Windows Live Writer XMLRPC and BlogEngine.Net</title>
  <link>https://tim-stanley.com/post/windows-live-writer-xmlrpc-and-blogenginenet/</link>
  <description>&lt;p&gt;BlogEngine.Net supports XMLRPC and the MetaWeblog API.&amp;nbsp; This allows it to support other tools like Windows Live Writer.&amp;nbsp; But where are the specifications for the API and WLW found?&amp;nbsp; I came across some interesting related links along the way in trying to figure out how to add proper slug support for pages in BlogEngine.Net.[more]&lt;/p&gt;
&lt;p&gt;WordPress outlines the definitive guide to the WordPress API at&amp;nbsp; &lt;a href="http://codex.wordpress.org/XML-RPC_wp"&gt;http://codex.wordpress.org/XML-RPC_wp&lt;/a&gt;.&amp;nbsp; This includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wp.getTags&lt;/li&gt;
&lt;li&gt;wp.getPage&lt;/li&gt;
&lt;li&gt;wp.getPages&lt;/li&gt;
&lt;li&gt;wp.newPage&lt;/li&gt;
&lt;li&gt;wp.deletePage&lt;/li&gt;
&lt;li&gt;wp.editPage&lt;/li&gt;
&lt;li&gt;wp.getCategories&lt;/li&gt;
&lt;li&gt;wp.getAuthors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Several other API&amp;rsquo;s are listed on the site.&amp;nbsp; The reference is the only tool I&amp;rsquo;ve found that outlines the structures used for XMLRPC for the MetaWeblog API.&lt;/p&gt;
&lt;p&gt;Windows Live Writer outlines the list of all the options, capabilities supported between the MetaWeblog, MoveableType, and Wordpress systems in their article &lt;a href="http://msdn.microsoft.com/en-us/library/bb463260.aspx"&gt;Defining Weblog Capabilities with the Options Element&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In BlogEngine.Net the Windows Live Writer manifest is defined in the file wlwmanifest.xml.&amp;nbsp; This can be extended to support some of the additional options supported by WLW.&amp;nbsp; However, additional code is required in the BlogEngine.Net XMLPCRequest, XMLRPCResponse and MetaWeblog files to support these features.&lt;/p&gt;
&lt;p&gt;One of the interesting design decisions about BlogEngine.Net is that it supports XML files and uses a Guid as the ID for all posts and pages.&amp;nbsp; The MetaWeblog API wants to use an int for the ID.&amp;nbsp; This causes some unexpected results when selecting a parent, or the author in page editing mode with WLW.&amp;nbsp; This is just a design tradeoff of not using a database (sequential ID&amp;rsquo;s are difficult and cumbersome to generate without a database).&lt;/p&gt;
&lt;p&gt;Interestingly enough, there is an unusual nuance either in the API or WLW, in that in order to get a hierarchical indented list in the dropdown list of pages, XMLRPCResponse.WriteShortPages needs to set the wp_page_parent_id to the &amp;ldquo;title&amp;rdquo; and the page_parent_id to the &amp;ldquo;guid&amp;rdquo; of the page. It seems a bit backwards to me.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve extended the MetaWeblog API in BlogEngine.Net to support slugs properly.&amp;nbsp; The trick was using value wp_slug in the XML for the same as the post code does.&lt;/p&gt;
&lt;p&gt;Code added from XMLRPCResponse.WritePage and WritePages.&amp;nbsp; The MWAPage class must also add the slug properly to support this.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
// wp_slug
data.WriteStartElement("member");
data.WriteElementString("name", "wp_slug");
data.WriteStartElement("value");
data.WriteElementString("string", _page.slug);
data.WriteEndElement();
data.WriteEndElement();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&amp;rsquo;ve published the changes to the MetaWeblog API but keep in mind these changes go way beyond just this change and break compatibility with BlogEngine.Net.&lt;/p&gt;
&lt;p&gt;Download: &lt;a href="/file.axd?file=2010%2f2%2fMetaWebLog.zip"&gt;MetaWebLog.zip (15.98 kb)&lt;/a&gt;.&amp;nbsp; Includes XMLRPCRequest, XMLRPCResponse, and MetaWeblog changes.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://codex.wordpress.org/XML-RPC_wp"&gt;http://codex.wordpress.org/XML-RPC_wp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb463260.aspx"&gt;Defining Weblog Capabilities with the Options Element&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb259702.aspx"&gt;Windows Live Spaces MetaWeblog API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.xmlrpc.com/metaWeblogApi"&gt;RFC: MetaWeblog API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>blogengine-net</category>
  <category>windows-live-writer</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/windows-live-writer-xmlrpc-and-blogenginenet/</guid>
  <pubDate>Fri, 26 Feb 2010 05:08:00 GMT</pubDate>
</item>
<item>
  <title>Exchange Hosting</title>
  <link>https://tim-stanley.com/post/exchange-hosting/</link>
  <description>&lt;p&gt;Is Software As a Service hype or real.&amp;nbsp; Microsoft Exchange Server Hosting is not only real, but extremely cost effective. [more]&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/ExchangeHosting_DBFF/Exchange-2010-Logo-733341_2.png"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="Exchange-2010-Logo-733341" src="/image?picture=WindowsLiveWriter/ExchangeHosting_DBFF/Exchange-2010-Logo-733341_thumb.png" alt="Exchange-2010-Logo-733341" width="480" height="229" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve worked with organizations with anywhere from 25 to 10,000 people using Microsoft Exchange.&amp;nbsp; All of them having to deal with users in multiple countries and locations.&amp;nbsp; It used to be simple to host an Exchange server.&amp;nbsp; If you had a spare server, just install it, do a few simple configurations, and you were done.&amp;nbsp; Reboot it once year just for good measure.&lt;/p&gt;
&lt;p&gt;Then SPAM started flooding the servers, so we put SPAM filters on.&amp;nbsp; Then more SPAM, more and more filtering software.&amp;nbsp; Then patches and hot fixes, monthly, then weekly.&amp;nbsp; Then new government regulations on email, data retention and archiving came into force.&amp;nbsp; Then Microsoft decided you couldn&amp;rsquo;t run Exchange Server on a domain controller.&amp;nbsp; That was when I decided the cost of hosting an Exchange Server for a small organization was too much.&amp;nbsp; I looked for some alternatives.&lt;/p&gt;
&lt;p&gt;POP / SMTP mail is cheap, but doesn&amp;rsquo;t provide the synchronization (on the web, on the laptop, on the desktop), or calendar coordination between teams that Exchange does.&lt;/p&gt;
&lt;p&gt;With hosted Exchange Services running $9-$14 USD per use per month for 2 &amp;ndash; 3 GB of storage per mailbox, it was a no brainer.&amp;nbsp; You can figure the total cost of ownership for hardware + maintenance + redundancy costs and it doesn&amp;rsquo;t take long to see the cost savings for a hosted service.&amp;nbsp; I came up with for cost comparisons based on my experiences in using Exchange.&amp;nbsp; This isn&amp;rsquo;t some fancy ROI calculator, and of course your mileage may vary.&amp;nbsp; I factored in the total cost of all administration time for all maintenance on Exchange servers, in addition to the hardware and licensing costs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Less than 60 users, go with hosted Exchange services.&amp;nbsp; When you add the administrator maintenance costs of SPAM filtering software, Exchange, and anti-virus software, hosted exchange is, always cheaper.&lt;/li&gt;
&lt;li&gt;More than 60, less than 100 users, think about hosted Exchange services.&amp;nbsp; If all users are in one location, it can make sense to go with your own Exchange Server.&amp;nbsp; If users are distributed geographically, that means multiple exchange servers / VPN&amp;rsquo;s, and more maintenance and hardware, all driving up the cost&amp;nbsp; and thus making Hosted Exchange Servers look more attractive.&lt;/li&gt;
&lt;li&gt;More than 100 users, host your own Exchange Servers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a company buys it&amp;rsquo;s own hardware, it must depreciate it over time.&amp;nbsp; As an added benefit, with a hosted service there is no initial capital outlay, only a per month charge.&amp;nbsp; As the number of users increases or decreases, the cost goes up or down accordingly.&lt;/p&gt;
&lt;p&gt;The hosted Exchange services provide Secure Transports (Https, RPC over Https) so email is secure (as it can be).&amp;nbsp; Hosted Exchange Providers also provide data retention services (usually at some incremental cost) that conform to federal regulations.&amp;nbsp; If your a small company, do you have the expertise to cover all the following regulations? SEC Rule 17a-4; NASD Rules 3010, 3013 &amp;amp; 3110; NYSE Rules 342, 440 &amp;amp; 472; RIA SEC Rules 204-2 &amp;amp; 206(4)-7; IDA Bylaw 29.7; FSA, Sarbanes-Oxley Act; HIPAA; GLBA; PIPA &amp;amp; PIPEDA; Patriot Act; Data Protection Act, Basel II, FERC; FCC and more.&amp;nbsp; Most hosting Exchange service providers can support those regulations.&lt;/p&gt;
&lt;p&gt;In our organizations the best plans we had were four hour, standard business hours recovery times.&amp;nbsp; This meant that if the main server on the east cost failed after hours someone on the other side of the world would have to wait a day before they could get back to using email.&amp;nbsp; With hosted Exchange services, we get 24/7 availability. There are some down times for server maintenance, but it&amp;rsquo;s scheduled and notified in advance (usually at 11:00 PM EST, so no one has complained yet).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve use Sherweb hosted Exchange services since 2008.&amp;nbsp; I&amp;rsquo;ve been extremely happy with the service.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s the one downside to hosted Exchange Services.&amp;nbsp; There are additional charges per month for email forwarding to an external address.&amp;nbsp; Also additional charges per month for each SMTP user account ($1 / mo) add up.&amp;nbsp; There are also additional charges per month for each &amp;ldquo;resource&amp;rdquo; mailbox used for scheduling (like a conference room).&amp;nbsp; And, there are additional charges for Blackberry users.&amp;nbsp; All these need to be taken into account when planning the budget for using a Hosted Exchange Service, but they are often still significantly cheaper than hosting Exchange on your own.&lt;/p&gt;
&lt;p&gt;Ballpark costs used in estimating: $2000 server depreciated over 4 years. $1600 in OS and Exchange software. $2500 for installation, setup, and configuration (one time).&amp;nbsp; $5,500 per year for Exchange / Windows server maintenance, updates, backups, monitoring, and support.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://www.sherweb.com/" href="http://www.sherweb.com/"&gt;Sherweb Hosted Exchange&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.rackspace.com/email_hosting/exchange_hosting" href="http://www.rackspace.com/email_hosting/exchange_hosting"&gt;Rackspace Exchange Hosting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.microsoft.com/online/exchange-hosted-services.mspx" href="http://www.microsoft.com/online/exchange-hosted-services.mspx"&gt;Microsoft Online Exchange Hosting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>software</category>
  <category>exchange</category>
  <category>hosting</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/exchange-hosting/</guid>
  <pubDate>Sat, 30 Jan 2010 00:08:32 GMT</pubDate>
</item>
<item>
  <title>MSDN Style Class Documentation</title>
  <link>https://tim-stanley.com/post/msdn-style-class-documentation/</link>
  <description>&lt;p&gt;NDoc is dead. Long live NDoc! How to generate &lt;abbr title="Microsoft Software Developer Newtork"&gt;MSDN&lt;/abbr&gt; style documentation using Sand Castle on Visual Studio 2008. [more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_history"&gt;History&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_code-is-the-documentation"&gt;Code Is The Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_show-me-the-code"&gt;Show Me The Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_a-new-programming-documentation-era"&gt;A New Programming Documentation Era&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_give-me-that-old-style-msdn-documentation"&gt;Give Me That Old Style MSDN Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_how-to-use-sand-castle"&gt;How To Use Sand Castle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_example"&gt;Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="h1_history"&gt;History&lt;/h1&gt;
&lt;p&gt;&lt;a title="Photo by veneman" href="http://www.flickr.com/photos/veneman/2747661482/"&gt;&lt;img style="display: inline; margin: 0px 10px 10px 0px; border: 0px;" title="2747661482_09924ffe1a_o" src="/image?picture=WindowsLiveWriter/MSDNStyleClassDocumentation_CB2F/2747661482_09924ffe1a_o_3.jpg" alt="2747661482_09924ffe1a_o" width="260" height="380" align="left" border="0"&gt;&lt;/a&gt; In the mid 90&amp;rsquo;s when COM was king, generating API documentation for classes was a tedious and arduous task.&amp;nbsp; The moment the documentation was published, it was often out of date due to changes the development team had already made.&amp;nbsp; One company I worked for in the retail software domain generated an entire toolset (OO TOOL) to diagram, generate code, generate a data model and generate documentation from a single source.&lt;/p&gt;
&lt;p&gt;An interesting side note, one of the key members on the OO TOOL team was Mark Collins.&amp;nbsp; Mark&amp;nbsp; worked with me in the UK for two years at Fujitsu / ICL and went on to write several articles and even a book on &lt;a href="http://www.amazon.com/Beginning-WF-Windows-Workflow-NET/dp/1430224851"&gt;Windows Workflow&lt;/a&gt;.&amp;nbsp; The tool was the first successful attempt I had seen in a Microsoft based project to keep source and documentation updated using automated tools.&lt;/p&gt;
&lt;p&gt;When .Net entered the picture, Visual Studio provided an interesting feature to allow code comments in C++/C# to be extracted to an XML file.&amp;nbsp; Not to be out done, &lt;a href="http://code.msdn.microsoft.com/VBCommenter"&gt;VB Commenter&lt;/a&gt; came out for VB code and VB programmers to do the same.&amp;nbsp; With code generating XML style documentation, the next step was to convert the documentation to something a little more searchable and user friendly. NDoc came out and was an instant hit. NDoc when combined with the HTML help generator was able to generate compiled HTML output. While a bit of work, it was infinitely better then older proprietary tools and definitely more intuitive than Sand Castle.&lt;/p&gt;
&lt;p&gt;When .Net 2 came about, it changed some things that required NDoc to make some fairly non trivial changes. Kevin Downs one of the original NDoc authors decided that amidst personal threats and the additional non paying effort required to go to .Net 2, he decided to discontinue his efforts on NDoc. Compounded by an announcement by Microsoft to create a competing product called Sand Castle, NDoc subsequently died.&lt;/p&gt;
&lt;h1 id="h1_code-is-the-documentation"&gt;Code Is The Documentation&lt;/h1&gt;
&lt;p&gt;If Sand Castle wounded NDoc then IntelliSense killed and buried it. The MSDN style of documentation is limited in it&amp;rsquo;s usefulness. It&amp;rsquo;s too focused on a specific method / property to be helpful, difficult to deploy (even when done as a website) and becomes out of date extremely quickly. When Visual Studio&amp;nbsp; added IntelliSense in 1996, it really changed the way developers used documentation.&amp;nbsp; Books, manuals, API documentation all were used at the time. IntelliSense allowed embedding into a .Net dll all the API information needed in the past and .Net reflection combined with IntelliSense could pull that documentation out and put it directly in the hands of developers.&amp;nbsp;&lt;/p&gt;
&lt;h1 id="h1_show-me-the-code"&gt;Show Me The Code&lt;/h1&gt;
&lt;p&gt;I suspect IntelliSense and the &lt;em&gt;Go To Definition&lt;/em&gt; feature of Visual Studio get used more than the MSDN online style documentation.&amp;nbsp; Between the two features, a quick reference to a dll and an appropriate using statement, gives 80% of the information needed to use a class library. Similar in concept to the &lt;a href="http://en.wikipedia.org/wiki/Man_page"&gt;man page&lt;/a&gt;, the IntelliSense documentation provides the documentation you need, when you need it and where you need it.&lt;/p&gt;
&lt;p&gt;IntelliSense provides the API documentation like a dictionary provides the list of words for a language.&amp;nbsp; However, it doesn&amp;rsquo;t tell you how to combined the information together to achieve a specific purpose. The documentation for fopen(), never told you about fflush().&amp;nbsp; You had to know this or read it in a book or learn it from someone who knew it.&amp;nbsp; Blogs with examples have filled the knowledge gap and when that isn&amp;rsquo;t enough you can search &lt;a href="http://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt; for expert help on answers. When IntelliSense documentation is combined with an example or two, we have just about everything needed for the typical class library programmer.&lt;/p&gt;
&lt;h1 id="h1_a-new-programming-documentation-era"&gt;A New Programming Documentation Era&lt;/h1&gt;
&lt;p&gt;It was subtle at first, but we have transitioned into a new era of programming. With the rapid changes in technology, came a rapid way of keeping the technology up to date.&amp;nbsp; Generated static printed documents no long work in an era when technology changes many times a year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API documents were replaced by IntelliSense and Go To Definition&lt;/li&gt;
&lt;li&gt;Designs can be documented by stub code and XML comments quicker than they can with traditional Word documents.&lt;/li&gt;
&lt;li&gt;Books were replaced by Blogs and search engines&lt;/li&gt;
&lt;li&gt;Code examples were added to Blogs to explain &amp;ldquo;How to&amp;rdquo; use the technology&lt;/li&gt;
&lt;li&gt;Code formatters and &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter"&gt;Syntax Highlighters&lt;/a&gt; were added to Blogs to put a more coding friendly face on examples&lt;/li&gt;
&lt;li&gt;Questions that were answered by support forums are now answered on &lt;a href="http://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt; with much better answers than the &amp;ldquo;&lt;em&gt;support staff&lt;/em&gt;&amp;rdquo; ever were able to provide.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="2617720523_57ae50f8a1_o" src="/image?picture=WindowsLiveWriter/MSDNStyleClassDocumentation_CB2F/2617720523_57ae50f8a1_o_3.jpg" alt="2617720523_57ae50f8a1_o" width="380" height="260" border="0"&gt;&lt;/p&gt;
&lt;h1 id="h1_give-me-that-old-style-msdn-documentation"&gt;Give Me That Old Style MSDN Documentation&lt;/h1&gt;
&lt;p&gt;With all the new advancements in technology, MSDN style documentation can still be useful about 5% of the time to pull an overall view of documentation together or to provide documentation in a form for someone who doesn&amp;rsquo;t have a dll, but needs to see what a class library can do.&amp;nbsp; Also, sometimes you do get paid by the pound for generating documentation. Then there are those RFP&amp;rsquo;s that actually want to see a printed form of the documentation that won&amp;rsquo;t&amp;nbsp; be used by any programmers, but does prove that you have enough staff to generate documentation worthy of purchasing the product.&lt;/p&gt;
&lt;p&gt;If you want to pull all the IntelliSense information out into HTML or compiled Html Help, your going to need some help.&amp;nbsp; Microsoft has Sand Castle to build those documents.&lt;/p&gt;
&lt;h1 id="h1_how-to-use-sand-castle"&gt;How To Use Sand Castle&lt;/h1&gt;
&lt;p&gt;The first thing to know about Sand Castle is it&amp;rsquo;s not enough to do the job.&amp;nbsp; You need some tools to help Sand Castle generate the help documentation.&lt;/p&gt;
&lt;p&gt;The key steps I used to generate documentation with Sand Castle:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mark all public classes with &lt;a href="http://msdn.microsoft.com/en-us/library/aa664787(VS.71).aspx"&gt;XML comments&lt;/a&gt;, i.e. ///&amp;lt;summary&amp;gt;Describe the class.&amp;lt;/summary&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sandcastle.codeplex.com/sourcecontrol/list/changesets?ProjectName=sandcastle"&gt;Download&lt;/a&gt; and Install Sand Castle via the MSI.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://shfb.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=29710"&gt;Download&lt;/a&gt; and Install the &lt;a href="http://www.codeplex.com/SHFB"&gt;Sand Castle Help File Builder (SHFB)&lt;/a&gt; MSI by &lt;a href="http://www.ewoodruff.us/"&gt;Eric Woodruff&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sandcastlestyles.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=38144"&gt;Download&lt;/a&gt; and Install / Patch the &lt;a href="http://www.codeplex.com/SandcastleStyles"&gt;Sand Castle Styles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Run SHFB&lt;/li&gt;
&lt;li&gt;Add documentation sources (csproj or dll)&lt;/li&gt;
&lt;li&gt;Add references (csproj or dll)&lt;/li&gt;
&lt;li&gt;Set the help file format and other SHFB options (I recommend using the MemberName naming method to get html links with names instead of Guids)&lt;/li&gt;
&lt;li&gt;Run SHFB build, wait, wait, done&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sand Castle documentation for actually &lt;strong&gt;using&lt;/strong&gt; the product is hard to come by. I did find the Sand Castle GUI tool (located at C:\Program Files\Sandcastle\Examples\generic after installing the MSI).&amp;nbsp; This tool was a little useful in selecting the dll&amp;rsquo;s and building output, but the SHFB tool is much more user friendly.&lt;/p&gt;
&lt;p&gt;Sand Castle won&amp;rsquo;t fix the out of date documentation problem, but when combined with SHFB it does help when you need to generate something a little more &lt;span style="text-decoration: line-through;"&gt;archaic&lt;/span&gt; solid than IntelliSense documentation.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a title="photo by Stephengg" href="http://www.flickr.com/photos/stephengg/2950579662/"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="2949730051_6ea8a20646_o" src="/image?picture=WindowsLiveWriter/MSDNStyleClassDocumentation_CB2F/2949730051_6ea8a20646_o_3.jpg" alt="2949730051_6ea8a20646_o" width="380" height="290" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_example"&gt;Example&lt;/h1&gt;
&lt;p&gt;Below is an example of compiled help style documentation generated using Sand Castle and SHFB and hana presentation style.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/MSDNStyleClassDocumentation_CB2F/image_2.png"&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px; border: 0px;" title="SandCastle chm Example" src="/image?picture=WindowsLiveWriter/MSDNStyleClassDocumentation_CB2F/image_thumb.png" alt="SandCastle chm Example" width="484" height="288" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_references"&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/SHFB"&gt;Codeplex Sand Castle Help File Builder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.charliedigital.com/PermaLink,guid,95b2ab68-ba92-413a-b758-2783cde5df9c.aspx"&gt;NDoc 2 Is Officially Dead&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.hanselman.com/blog/SandcastleMicrosoftCTPOfAHelpCHMFileGeneratorOnTheTailsOfTheDeathOfNDoc.aspx" href="http://www.hanselman.com/blog/SandcastleMicrosoftCTPOfAHelpCHMFileGeneratorOnTheTailsOfTheDeathOfNDoc.aspx"&gt;Sand Castle CTP And The Death Of NDoc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/NDoc" href="http://en.wikipedia.org/wiki/NDoc"&gt;NDoc Wikipedia Entry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://ndoc.sourceforge.net/" href="http://ndoc.sourceforge.net/"&gt;Ndoc at Sourceforge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/Comparison_of_documentation_generators" href="http://en.wikipedia.org/wiki/Comparison_of_documentation_generators"&gt;Comparison of documentation generators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://code.msdn.microsoft.com/VBCommenter" href="http://code.msdn.microsoft.com/VBCommenter"&gt;VB Commenter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.amazon.com/Beginning-WF-Windows-Workflow-NET/dp/1430224851" href="http://www.amazon.com/Beginning-WF-Windows-Workflow-NET/dp/1430224851"&gt;Beginning WF Windows Workflow .NET by Mark Collins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.apress.com/book/view/1430224851" href="http://www.apress.com/book/view/1430224851" target="_blank" rel="noopener"&gt;Beginning WF: Windows Workflow in .NET 4.0 at Apress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.sharethispoint.com/" href="http://www.sharethispoint.com/"&gt;Share This Point&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/Intellisense" href="http://en.wikipedia.org/wiki/Intellisense"&gt;IntelliSense&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://alexgorbatchev.com/wiki/SyntaxHighlighter" href="http://alexgorbatchev.com/wiki/SyntaxHighlighter"&gt;Syntax Highlighter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://msdn.microsoft.com" href="http://msdn.microsoft.com"&gt;MSDN online&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://blogs.msdn.com/sandcastle/" href="http://blogs.msdn.com/sandcastle/"&gt;Sand Castle Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/cs/SandcastleBuilder.aspx"&gt;SandCastle Builder at Code Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/aa664787(VS.71).aspx" href="http://msdn.microsoft.com/en-us/library/aa664787(VS.71).aspx"&gt;C# XML Comment Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.ewoodruff.us/shfbdocs/Index.aspx?topic=html/8c0c97d0-c968-4c15-9fe9-e8f3a443c50a.htm" href="http://www.ewoodruff.us/shfbdocs/Index.aspx?topic=html/8c0c97d0-c968-4c15-9fe9-e8f3a443c50a.htm"&gt;SHFB Installation Instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/DocProject/Wiki/View.aspx?title=Latest%20Release%20Notes&amp;amp;referringTitle=Home"&gt;DocProject for Sandcastle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.doxygen.org/"&gt;Doxygen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/magazine/cc302121.aspx"&gt;XML Comments Let You Build Documentation Directly From Your Visual Studio .NET Source Files&lt;/a&gt; (on MSDN Magazine)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/cs/csharpcommentinganddocs.aspx"&gt;C# Documenting and Commenting&lt;/a&gt; (on CodeProject)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/XML/csharpcodedocumentation.aspx"&gt;C# and XML Source Code Documentation&lt;/a&gt; (on CodeProject)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.softsteel.co.uk/tutorials/csharp/lesson19.html"&gt;C# Tutorial Lesson 19: Code Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>visual-studio</category>
  <category>microsoft</category>
  <category>web-development</category>
  <category>sand-castle</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/msdn-style-class-documentation/</guid>
  <pubDate>Wed, 20 Jan 2010 23:39:46 GMT</pubDate>
</item>
<item>
  <title>Field Codes</title>
  <link>https://tim-stanley.com/post/field-codes/</link>
  <description>&lt;p&gt;Using field codes to replace values in content, templates, and reports allows users and designers a great deal of flexibility for creating and managing content and templates without requiring code changes.&lt;/p&gt;
&lt;p&gt;This article is a summary of how to use field codes in content, templates, or reports and how to convert them to object property values and format and replace them when displayed or rendered.&amp;nbsp; This is based on a similar pattern that Microsoft Word uses when formatting fields.&amp;nbsp; It&amp;rsquo;s also commonly used in WordPress and WordPress themes.[more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_field-code-syntax"&gt;Field Code Syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_field-code-examples"&gt;Field Code Examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_matching-regular-expressions"&gt;Matching Regular Expressions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_using-reflection-to-get-types-and-properties"&gt;Using Reflection To Get Types And Properties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_performance-implications"&gt;Performance Implications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="h1_field-code-syntax"&gt;Field Code Syntax&lt;/h1&gt;
&lt;p&gt;The most important aspect of the design is picking a syntax that can be easily identified within the content and doesn&amp;rsquo;t conflict with true content.&amp;nbsp; Braces { } identify the field marker within the content and are easy to parse.&amp;nbsp; The symbols $, %, &amp;lt; &amp;gt;, ( ) or [ ] could be used for this pattern as well.&lt;/p&gt;
&lt;p&gt;The field marker contains two comma separated values, the named type separated by one or more periods and the format string.&amp;nbsp; Quotes around each token make it easier to identify the tokens within the field marker and to not mistake the end of the format string for the end of the field marker.&lt;/p&gt;
&lt;p&gt;{&amp;ldquo;object.expression&amp;rdquo; [,&amp;ldquo;format&amp;rdquo;] }&lt;/p&gt;
&lt;p&gt;The brackets denote the format string is optional.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Field marker: {&amp;ldquo;object&amp;rdquo;, &amp;ldquo;expression&amp;rdquo;, &amp;ldquo;format&amp;rdquo;}&lt;/li&gt;
&lt;li&gt;Object: A valid object name within the context used for binding&lt;/li&gt;
&lt;li&gt;Expression: &amp;ldquo;property&amp;rdquo; &amp;ndash; must be a valid property expression&lt;/li&gt;
&lt;li&gt;Format string (C# string.format) &amp;ldquo;{0:yyy-mm-dd}&amp;rdquo; &amp;ndash; optional&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Depending on the application needs, a default type can be used and only the properties can be used for the type token, or multiple types can be used.&lt;/p&gt;
&lt;p&gt;ASP.Net 2.0 uses a similar pattern for formatting data binding:&lt;/p&gt;
&lt;pre class="brush: csharp"&gt;&amp;lt;%# Eval("expression"[, "format"]) %&amp;gt;
&amp;lt;%# Eval("Price", "{0:C}") %&amp;gt;
&amp;lt;%# Eval("Price", "Special Offer {0:C} for Today Only!") %&amp;gt;&lt;/pre&gt;
&lt;h1 id="h1_field-code-examples"&gt;Field Code Examples&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Summary: {"Summary"}&lt;/li&gt;
&lt;li&gt;Keywords: {&amp;ldquo;Item.Keywords"}&lt;/li&gt;
&lt;li&gt;Link: {&amp;ldquo;Item.Link"}&lt;/li&gt;
&lt;li&gt;Create Time: {&amp;ldquo;Item.CreateTime", "{0:yyyy-MM-dd HH:mm tt (zzz)}"}&lt;/li&gt;
&lt;li&gt;Create TimeUtc: {&amp;ldquo;Item.CreateTimeUtc", "{0:yyyy-MM-dd HH:mm tt}"}&lt;/li&gt;
&lt;li&gt;ViewCount: {&amp;ldquo;Item.ViewCount", "{0:###,###.##}"}&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_matching-regular-expressions"&gt;Matching Regular Expressions&lt;/h1&gt;
&lt;p&gt;Two regular expressions are used to parse the content or template.&amp;nbsp; The first one to get the entire field marker (FieldRegex), the second one to parse individual tokens within the field type (TokenRegex: &amp;ldquo;type.property&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;The following example parses through the Body string and replaces the field marker with the appropriate formatted string.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;private static readonly Regex FieldRegex = new Regex(@"\{\"".*?\""\}", RegexOptions.IgnoreCase);
private static readonly Regex TokenRegex = new Regex(@"\"".*?\""", RegexOptions.IgnoreCase);
private static readonly char[] charTrimSeparators = new char[] { '"', ' ' };
private static readonly char[] charKeySeparators = new char[] { '.', ' ' };

MatchCollection myMatches = FieldRegex.Matches(Body);
foreach (Match myMatch in myMatches)
{
    string matchFieldSet = myMatch.ToString();
    MatchCollection tokenMatches = TokenRegex.Matches(matchFieldSet);

    string keyAll = tokenMatches[0].ToString().Trim(charTrimSeparators);
    object obj = GetObj(item, keyAll);
    string value = String.Empty;
    if (obj != null)
    {
        switch (tokenMatches.Count)
        {
            case 2:
                string format = tokenMatches[1].ToString().Trim(charTrimSeparators);
                value = String.Format(format, obj);
                break;
            case 1:
                value = obj.ToString();
                break;
        }
    }

    if (!String.IsNullOrEmpty(value))
    {
        Body = Body.Replace(matchFieldSet, value);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_using-reflection-to-get-types-and-properties"&gt;Using Reflection To Get Types And Properties&lt;/h1&gt;
&lt;p&gt;The tricky part is to use reflection to get the property in the field marker and find it in the object.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;using System.Reflection;

private object GetObj(Sometype item, string keyAll)
{
    object obj = null;
    Type type = null;
    PropertyInfo property = null;
    string[] keyTokens = keyAll.Split(charKeySeparators, StringSplitOptions.RemoveEmptyEntries);
    switch (keyTokens.Length)
    {
        case 1:
            key = keyTokens[0];
            parent = "Sometype";
            break;
        default:
            key = keyTokens[1];
            break;
    }
    type = post.GetType();
    property = type.GetProperty(key);
    if (property != null)
    {
        obj = property.GetValue(item, null);
    }
    return obj;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This reflection pattern works good for &amp;ldquo;Object.Property&amp;rdquo;.&amp;nbsp; However, it becomes significantly more difficult for multiple levels of objects, i.e. &amp;ldquo;Object.Object.Object.Property&amp;rdquo;.&amp;nbsp; If anyone has suggestions on how to resolve that without hand parsing each object, please let me know.&lt;/p&gt;
&lt;h1 id="h1_performance-implications"&gt;Performance Implications&lt;/h1&gt;
&lt;p&gt;Using reflection and the String.Replace methods can add significant processing time if there are numerous values to find and replace. Building a dictionary of the names / values that are found would in theory be faster than using reflection, but I&amp;rsquo;ve not measured this direct comparison.&amp;nbsp; I have seen the reflection using about 10 ms (on a core 2 duo 2.5 Ghz) to retrieve and replace one property.&lt;/p&gt;
&lt;p&gt;If a Dictionary is used, then converting the content to a StringBuilder and using StringBuilder.Replace instead of String.Replace should also improve performance.&lt;/p&gt;
&lt;p&gt;Once the content is parsed and the field tokens are replaced, caching the replaced content is definitely recommended where possible.&lt;/p&gt;
&lt;h1 id="h1_references"&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/0c899ak8(VS.71).aspx"&gt;.Net Custom Numeric Format Strings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/8kb3ddd4(VS.71).aspx" href="http://msdn.microsoft.com/en-us/library/8kb3ddd4(VS.71).aspx"&gt;.Net Custom DateTime Format Strings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.simple-talk.com/dotnet/asp.net/regular-expression-based-token-replacement-in-asp.net/" href="http://www.simple-talk.com/dotnet/asp.net/regular-expression-based-token-replacement-in-asp.net/"&gt;Regular Expression Based Token Replacement in ASP.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.simple-talk.com/dotnet/asp.net/token-replacement-in-asp.net/" href="http://www.simple-talk.com/dotnet/asp.net/token-replacement-in-asp.net/"&gt;Token Replacement in ASP.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://justintadlock.com/archives/2009/03/24/template-tag-shortcodes-wordpress-plugin" href="http://justintadlock.com/archives/2009/03/24/template-tag-shortcodes-wordpress-plugin"&gt;Template Tag Shortcodes: WordPress Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://vinetype.com/default.aspx?section=reference/template_variables/$__archives" href="http://vinetype.com/default.aspx?section=reference/template_variables/$__archives"&gt;Vine Type Reference Variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://codex.wordpress.org/Template_Tags" href="http://codex.wordpress.org/Template_Tags"&gt;WordPress Template Tags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://bueltge.de/wp-content/download/wp/WP_Theme_Tags.pdf" href="http://bueltge.de/wp-content/download/wp/WP_Theme_Tags.pdf"&gt;WordPress Theme Tags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.15seconds.com/Issue/040630.htm" href="http://www.15seconds.com/Issue/040630.htm"&gt;Simplified and Extended Data Binding Syntax in ASP.NET 2.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/field-codes/</guid>
  <pubDate>Sat, 02 Jan 2010 18:35:00 GMT</pubDate>
</item>
<item>
  <title>Features, Flags, Updates And Branches</title>
  <link>https://tim-stanley.com/post/features-flags-updates-and-branches/</link>
  <description>&lt;p&gt;Version control systems are wonderful tools and terrible tools all depending on the process used to manage the files stored in them.&amp;nbsp; They allow tracking changes, updates, reversing updates, comparing to older updates, and creating multiple branches and variations of files ad-infinitum.&amp;nbsp; What are good rules to keep good tools from going bad?[more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_rule-1-donrsquot-break-the-base"&gt;Rule #1 Don&amp;rsquo;t Break The Base&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_rule-2-label-your-releases"&gt;Rule #2 Label Your Releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_rule-3-prune-your-branches"&gt;Rule #3 Prune Your Branches&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_rule-4-properly-dispose-of-flags"&gt;Rule #4 Properly Dispose Of Flags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="h1_rule-1-donrsquot-break-the-base"&gt;Rule #1 Don&amp;rsquo;t Break The Base&lt;/h1&gt;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="photo by Anatoli Styf at stock exchange sxc.hu" src="/image?picture=WindowsLiveWriter/FeaturesFlagsAndUpdates_9932/605544_60397447_3.jpg" alt="photo by Anatoli Styf at stock exchange sxc.hu" width="520" height="356" border="0"&gt;&lt;/p&gt;
&lt;p class="ui-state-note"&gt;Don&amp;rsquo;t check code in that breaks the trunk code base.&lt;/p&gt;
&lt;p&gt;Organizations generally follow two philosophies for code check-ins: Check-in daily under penalty; or Don&amp;rsquo;t break the base.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Check-in daily under penalty&lt;/em&gt; as a philosophy is problematic because developers are forced to check code in that may or may not compile.&amp;nbsp; Organizations use this as a backup mechanism, but it&amp;rsquo;s a poor solution for that approach.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Don&amp;rsquo;t break the base&lt;/em&gt; as a philosophy can cause headaches because a developer may go long periods of time (days/weeks) with multiple code changes and then they loose the benefits of rolling back stuff to a level of code that was checked in.&amp;nbsp; This weakness can be resolved by adding a scratch area in a source control system that developers can use daily / hourly that is not part of the main code base structure.&amp;nbsp; Once developers are confident it won&amp;rsquo;t break the base, they can check in to the main trunk without causing others problems.&amp;nbsp; I don&amp;rsquo;t like two places for the same thing, but in practice, the scratch area works well and is often used sparingly.&amp;nbsp; Labels and branches are not good for scratch work.&lt;/p&gt;
&lt;p&gt;The most common &lt;em&gt;break the base&lt;/em&gt; problem isn&amp;rsquo;t really code that doesn&amp;rsquo;t compile, it&amp;rsquo;s missing files.&amp;nbsp; Files that were on the developers machine, but weren&amp;rsquo;t checked in.&amp;nbsp; Having a tool like &lt;a title="http://www.sourcegear.com/vault/" href="http://www.sourcegear.com/vault/"&gt;Sourcegear Vault&lt;/a&gt; that shows files on the disk that haven&amp;rsquo;t been added make this problem much less likely to occur.&amp;nbsp; Before my teams used Sourcegear, this problem happened a lot.&amp;nbsp; It still happens (even to me), but much less frequently than in the past.&lt;/p&gt;
&lt;h1 id="h1_rule-2-label-your-releases"&gt;Rule #2 Label Your Releases&lt;/h1&gt;
&lt;p&gt;&lt;img style="display: inline; border: 0px;" title="image by Billy Alexander at SXC.hu" src="/image?picture=WindowsLiveWriter/FeaturesFlagsAndUpdates_9932/1129414_55018651_5.jpg" alt="image by Billy Alexander at SXC.hu" width="398" height="356" border="0"&gt;&lt;/p&gt;
&lt;p class="ui-state-note"&gt;Label all releases (both internal and external).&lt;/p&gt;
&lt;p&gt;Labels are like breadcrumbs.&amp;nbsp; They can be applied to a common root directory and all subsequent child folders and files get the same label.&amp;nbsp; Adding labels when releases are made allow you to go back and cut a branch from a label later if needed, or to pull the source for that particular label.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I like labels in the form &amp;ldquo;&lt;strong&gt;Rel 2.0.3.0 2009 12 03&lt;/strong&gt;&amp;rdquo;.&amp;nbsp; This includes the release number, and the date the release was made. Adding the date might be redundant because most source control systems keep the date a label is made, but not all tools show the date unless you ask them to.&amp;nbsp; Making it part of the label makes it easy to find two pieces of information in one quick scan.&lt;/p&gt;
&lt;p&gt;In some projects I&amp;rsquo;ve even used the &lt;em&gt;only build from a label&lt;/em&gt; approach.&amp;nbsp; While extremely rigid, it works when teams are franticly checking in code, and a build machine is used to specifically create daily builds.&amp;nbsp; If it&amp;rsquo;s a manual process, this rarely works reliably.&amp;nbsp; If the label / get / build process is automated, then it has better success.&lt;/p&gt;
&lt;h1 id="h1_rule-3-prune-your-branches"&gt;Rule #3 Prune Your Branches&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/tonythemisfit/2434641110/"&gt;&lt;img style="display: inline; border-width: 0px;" title="Twist in a Japanese Garden" src="/image?picture=WindowsLiveWriter/FeaturesFlagsAndUpdates_9932/2434641110_eb2b719d35_3.jpg" alt="Twist in a Japanese Garden" width="520" height="397" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="ui-state-note"&gt;Anytime a branch is created, it should be pruned (after 30,60,90,180 days) and folded back into the trunk.&lt;/p&gt;
&lt;p&gt;Source control branches give the illusion of control.&amp;nbsp; They are generally good for two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Marking a point in the code for generating an emergency hot fix for a customer.&lt;/li&gt;
&lt;li&gt;Marking a point in time for a base to be used when migrating to another platform or architecture.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Branches are problematic because they create multiple places for people to put things (and subsequently get lost) and they also create multiple places for people to get things (and subsequently inadvertently get the wrong version that was desired). I&amp;rsquo;ve learned to try to avoid branches if at all possible.&amp;nbsp; Multiple source control branches add expense and time, but don&amp;rsquo;t add a lot of value.&lt;/p&gt;
&lt;p&gt;Branches are complex for source control software to implement.&amp;nbsp; They often have issues (not so much as software issues, but issues with documentation on how to make the source control system achieve the behavior you want).&amp;nbsp; If your running SourceSafe and try branches, you are sadistic.&amp;nbsp; Upgrade to a real source control system like &lt;a title="http://www.sourcegear.com/vault/" href="http://www.sourcegear.com/vault/"&gt;Sourcegear Vault&lt;/a&gt; or PVCS (Dimensions, Merrant, Intersolve, Serena or the current PVCS product name of the day).&amp;nbsp; I&amp;rsquo;ve reviewed &lt;a href="http://en.wikipedia.org/wiki/Concurrent_Versions_System"&gt;CVS&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Subversion_(software)"&gt;Subversion&lt;/a&gt;, but the architecture and features of the rich clients for Sourcegear Vault wins hands down despite having to pay a license for each user to use them (although Sourcegear is free for one user).&lt;/p&gt;
&lt;p&gt;In my experience, &lt;a title="http://www.sourcegear.com/vault/" href="http://www.sourcegear.com/vault/"&gt;Sourcegear Vault&lt;/a&gt;&amp;nbsp; is the only tool that has an architecture that allows smart clients and a central web service that works well over the internet for multiple teams in multiple locations.&amp;nbsp; All other solutions I&amp;rsquo;ve evaluated including Microsoft Visual Studio Team Foundation, require significant investment in hardware and only work well over a LAN.&amp;nbsp; These solutions were designed with thick client / server solutions for LANS, not WANS or the Internet. I have teams in India, California, Oklahoma, and Raleigh that have used a common Vault solution for over five years and it&amp;rsquo;s worked flawlessly along side Visual Studio (2003, 2005, 2008, 2010).&lt;/p&gt;
&lt;h1 id="h1_rule-4-properly-dispose-of-flags"&gt;Rule #4 Properly Dispose Of Flags&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/tim-stanley/2259029700/"&gt;&lt;img style="display: inline; border-width: 0px;" title="Half gale flags by Tim Stanley" src="/image?picture=WindowsLiveWriter/FeaturesFlagsAndUpdates_9932/2259029700_95ce88cee6_b_3.jpg" alt="Half gale flags by Tim Stanley" width="520" height="354" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="ui-state-note"&gt;Anytime a code feature flag is created, it should be reviewed to see if it&amp;rsquo;s still applicable (after 90, 180, 360 days).&amp;nbsp; Flags that are no longer applicable should be removed to simplify the code base.&lt;/p&gt;
&lt;p&gt;Just like taking care of national or state flags with &lt;a href="http://www.usa-flag-site.org/etiquette.shtml"&gt;flag etiquette&lt;/a&gt; or the &lt;a href="http://en.wikipedia.org/wiki/United_States_Flag_Code"&gt;flag code&lt;/a&gt; code flags should be evaluated, cleaned up and removed when they aren&amp;rsquo;t needed anymore. A code base will be encumbered by the weight of too many flags.&lt;/p&gt;
&lt;p&gt;The Flickr developer blog posted a long running practice of mine and common technique at &lt;a href="http://code.flickr.com/blog/2009/12/02/flipping-out/"&gt;Flipping Out&lt;/a&gt; on the topic of code flags.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
        if (flag)
        { 
            // New Feature 
        }
        else 
        { 
            // Existing Behavior 
        }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The downside of this approach is that if flags are never removed, it becomes increasingly difficult or impossible to add new features in sections of conditional code.&amp;nbsp; It can also be tedious to add the flags and the code, but if it&amp;rsquo;s practiced, this problem is usually overcome quickly, becoming second nature. The upside of this approach is it helps significantly with Rule #1 Don&amp;rsquo;t Break The Base.&amp;nbsp; Just make sure the default is set so the flag is off unless specifically turned on.&lt;/p&gt;
&lt;p&gt;For the &lt;abbr title="Obsessive Compulsive Disorder"&gt;OCD&lt;/abbr&gt; flagger, having flags at the system level, per account instance, or per user level give ample opportunity for this approach.&amp;nbsp; Perhaps best used sparingly, but code flags are best used when needed and are simpler than branches to deal with.&lt;/p&gt;
&lt;h1 id="h1_references"&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code.flickr.com/blog/2009/12/02/flipping-out/"&gt;Flickr Code Flipping Out&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.sourcegear.com/vault/" href="http://www.sourcegear.com/vault/"&gt;Sourcegear Vault&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>visual-studio</category>
  <category>software-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/features-flags-updates-and-branches/</guid>
  <pubDate>Thu, 03 Dec 2009 23:38:00 GMT</pubDate>
</item>
<item>
  <title>Best Children’s Portrait Photographer</title>
  <link>https://tim-stanley.com/post/best-childrene28099s-portrait-photographer/</link>
  <description>&lt;p&gt;Andrea Joki is without a doubt the best child portrait photographer I&amp;rsquo;ve ever seen. She is located in Helsinki Finland, so you may have a way to travel to meet with her.&amp;nbsp; She does take occasional assignments in the United States and Australia.[more]&lt;/p&gt;
&lt;p&gt;I first came across her work in 2007 in the Flickr Nikon D80&amp;rsquo;s group.&amp;nbsp; She had a talent for getting the camera settings just right and then used her artistic eye to enhance the lighting and shadows to draw the eye toward her subjects.&amp;nbsp; If that weren&amp;rsquo;t enough, she combines those skills with the selection of amazing landscapes to create a dramatic backdrop for her subjects resulting in the capture of enchanting photographs.&amp;nbsp; I used to primarily be interested in landscape photography, but seeing the results of her work made me extremely interested in portrait photography.&lt;/p&gt;
&lt;p&gt;In the earlier days of her work, she took time out to help others explaining how she created these shots and results. The fact she used her own daughter as the subject of many of her photographs I&amp;rsquo;m sure helped in the time, devotion and effort required to perfect her craft.&lt;/p&gt;
&lt;p&gt;You can find more of Andrea&amp;rsquo;s outstanding work at the following links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://www.ajatonjoki.com/wordpress/" href="http://www.ajatonjoki.com/wordpress/"&gt;Andrea Joki Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ajatonjoki.com/"&gt;Andrea Joki Business Photography Site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.flickr.com/photos/maiasuvi/" href="http://www.flickr.com/photos/maiasuvi/"&gt;Andrea Joki on Flickr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.flickr.com/photos/maiasuvi/sets/72157594379788424/" href="http://www.flickr.com/photos/maiasuvi/sets/72157594379788424/"&gt;Andrea Joki Flickr Portfolio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://www.ajatonjoki.com/wordpress/index.php/2009/10/16/blue-and-gold-autumn-in-the-southern-coast/"&gt;&lt;img style="border: 0px;" src="http://farm4.static.flickr.com/3516/4014523879_a69275842a_o.jpg" alt="" width="500" height="750" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ajatonjoki.com/wordpress/index.php/2009/10/14/a-lovely-family-outside-of-boston/"&gt;&lt;img style="border: 0px;" src="http://farm3.static.flickr.com/2614/4008502944_bfe6a1d4a5_o.jpg" alt="" width="500" height="750" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>photography</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/best-childrene28099s-portrait-photographer/</guid>
  <pubDate>Mon, 19 Oct 2009 21:16:00 GMT</pubDate>
</item>
<item>
  <title>11 Free Photo Editing Tools</title>
  <link>https://tim-stanley.com/post/11-free-photo-editing-tools/</link>
  <description>&lt;p&gt;The Guide To Art Schools has published a list of free photo editing software at &lt;a title="http://www.guidetoartschools.com/tips-and-tools/free-photo-editing" href="http://www.guidetoartschools.com/tips-and-tools/free-photo-editing"&gt;The 11 Best Free Photo Editing Programs&lt;/a&gt;.&amp;nbsp; [more]The list includes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.gimp.org/"&gt;Gimp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.photoscape.org/ps/main/index.php"&gt;Photoscape&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.getpaint.net/"&gt;Paint.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.artweaver.de/index.php?en_version"&gt;ArtWeaver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.freeserifsoftware.com/software/PhotoPlus/key_features.asp"&gt;Serif PhotoPlus SE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ne.jp/asahi/mighty/knight/"&gt;Pixia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.vicman.net/vcwphoto/index.htm"&gt;VC VicMan's Photo Editor &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ultimatepaint.com/"&gt;Ultimate Paint &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.magix.com/us/free-downloads/free-software/xtreme-photo-designer/detail/?partnerid=9015"&gt;Magix Xtreme Photo Designer 6 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://photofiltre.en.softonic.com/"&gt;PhotoFiltre&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lightboxeditor.com/"&gt;Lightbox Image Editor&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Web list includes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.picnik.com/"&gt;Picnik&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.splashup.com/"&gt;SplashUp &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.flauntr.com/"&gt;FlauntR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.photoshop.com/"&gt;Adobe Photoshop Express &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sumopaint.com/home/"&gt;Sumo Paint &lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;via Keith Cushner.&lt;/p&gt;
&lt;p&gt;They left off one of my favorite desktop photo editing tools, &lt;a href="http://picasa.google.com/"&gt;Picassa&lt;/a&gt;.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>photography</category>
  <category>tools</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/11-free-photo-editing-tools/</guid>
  <pubDate>Fri, 16 Oct 2009 18:37:42 GMT</pubDate>
</item>
<item>
  <title>Date And Time Tracking in .Net</title>
  <link>https://tim-stanley.com/post/date-and-time-tracking-in-net/</link>
  <description>&lt;p&gt;Getting the right date and time sounds simple enough, but when you look at a few interesting scenarios with multiple teams coordinating actions across multiple time zones with multiple clients and servers, designing for the date and time for a given event becomes complicated very quickly.&amp;nbsp; I&amp;rsquo;d like to share an some approaches that I think work well in .Net.[more]&amp;nbsp;&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_requirements"&gt;Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_design-considerations"&gt;Design Considerations&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_changes-in-calendars"&gt;Changes In Calendars&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_daylight-savings-time"&gt;Daylight Savings Time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_a-fixed-point-in-time"&gt;A Fixed Point In Time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_relative-points-in-time"&gt;Relative Points In Time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_logical-business-day"&gt;Logical Business Day&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_minvalue-maxvalue-and-null"&gt;MinValue, MaxValue And Null&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_convert-database-and-internal-times-to-utc"&gt;Convert Database and Internal Times To UTC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_convert-utc-times-to-client-times"&gt;Convert UTC Times To Client Times&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_convert-parsed-times-to-utc"&gt;Convert Parsed Times to UTC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_convert-output-formats-based-on-culture"&gt;Convert Output Formats Based On Culture&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_easy-date-formatting"&gt;Easy Date Formatting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_date-formatting"&gt;Date Formatting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_w3c-dates-and-times"&gt;W3C Dates And Times&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_deferred-date-formatting"&gt;Deferred Date Formatting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_summary-of-datetime-best-practices"&gt;Summary of DateTime Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;The approaches I describe are based on web servers and clients in multiple countries.&amp;nbsp; Having a single standalone application(EXE) on a desktop is somewhat easier to deal with because the application has full access to the time zone, culture settings, and correct time.&lt;/p&gt;
&lt;h1 id="h1_requirements"&gt;Requirements&lt;/h1&gt;
&lt;p&gt;Multiple servers, clients, and teams in multiple time zones.&amp;nbsp; For example:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A Server hosted in the United States in Texas (GMT-06:00) Central Time (US &amp;amp; Canada) (supports DST)&lt;/li&gt;
&lt;li&gt;A team in Delhi India: (GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi (doesn&amp;rsquo;t support DST)&lt;/li&gt;
&lt;li&gt;A team in Raleigh, North Carolina: (GMT-05:00) Eastern Time (US &amp;amp; Canada)&amp;nbsp; (supports DST)&lt;/li&gt;
&lt;li&gt;A team in Phoenix, Arizona: (GMT-07:00) Arizona (doesn&amp;rsquo;t support DST)&lt;/li&gt;
&lt;li&gt;A team in Colorado: (GMT-07:00) Maintain Time (US &amp;amp; Canada) (Supports DST)&lt;/li&gt;
&lt;li&gt;A public syndication reader (client time zone unknown)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There are several different types of dates and times and how they may need to be handled.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Creation, publication and update dates and times (fixed time around the globe)&lt;/li&gt;
&lt;li&gt;Start and stop dates and times for displaying a task (relative to the time zone)&lt;/li&gt;
&lt;li&gt;Event start and end dates and times for a task (fixed time around the globe)&lt;/li&gt;
&lt;li&gt;Due start and end dates and times for a task (relative to the time zone)&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="h1_design-considerations"&gt;Design Considerations&lt;/h1&gt;
&lt;p&gt;There are two basic types of scheduled events for dates and times.&amp;nbsp; A fixed point in time around the globe and a relative point in time from the local time zone.&amp;nbsp; There are several key pieces of information required to convert from one time zone to another.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The base time offset of the client time zone from GMT / UTC.&lt;/li&gt;
&lt;li&gt;If daylight savings time is supported by the client time zone or not.&lt;/li&gt;
&lt;li&gt;The rules for when daylight savings time starts and ends for the client.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Microsoft .net 3.5 provides for a TimeZoneInfo class which provides DST and DST rules, but, without writing probing code in the browser client, a browser client only knows about the offset from GMT.&lt;/p&gt;
&lt;h2 id="h2_changes-in-calendars"&gt;Changes In Calendars&lt;/h2&gt;
&lt;p&gt;There are times in the current era when dates and times change based on different rules than the standard rollover from 11:59:59 PM to 12:00:00 AM on the next calendar day.&lt;/p&gt;
&lt;p&gt;Changes .Net takes into account:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Gregorian calendar&lt;/li&gt;
&lt;li&gt;Leap day, leap year (added every four years, not every 100 years, but added every 400 years)&lt;/li&gt;
&lt;li&gt;Daylight savings time (including the 2009 changes on effective dates)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;.Net date and time libraries do not take into account:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Leap second (I can find no reference that .Net supports leap seconds.&amp;nbsp; The Microsoft documentation states the value can be between 0 and 59 which implies that leap seconds which require values of 60, 61, are not supported)&lt;/li&gt;
&lt;li&gt;Historical dates prior to the year 0001 AD on the Gregorian calendar.&lt;/li&gt;
&lt;li&gt;Changes of political conversions to the Gregorian calendar (10-13 days dropped depending on which country and when they converted to the Gregorian calendar)&lt;/li&gt;
&lt;li&gt;Conversion to non Gregorian based calendars (Chinese, Hebrew, Islamic, Hindu, Iranian)&lt;/li&gt;
&lt;li&gt;Julian dates&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Terrestrial_Time"&gt;Terrestrial time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Unix_Time"&gt;Unix time&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Julian_day"&gt;Julian dates&lt;/a&gt; are often used in astronomy to reference a common point in time that doesn&amp;rsquo;t conflict with other calendars. The Julian day and calendar is are based off a point in time of origin around 4713 BC Greenwich noon.&lt;/p&gt;
&lt;h2 id="h2_daylight-savings-time"&gt;Daylight Savings Time&lt;/h2&gt;
&lt;p&gt;Keep in mind that .Net DateTime arithmetic and comparison operations do not take daylight saving time into account.&amp;nbsp; However, conversion between time zones does properly take into account daylight savings time. Using TimeZoneInfo, also takes into account multiple daylight savings time rules for different years (See the &lt;a title="http://en.wikipedia.org/wiki/Year_2007_problem" href="http://en.wikipedia.org/wiki/Year_2007_problem"&gt;Year 2007 DST Problem&lt;/a&gt; for more about the details of why and when this change took place).&lt;/p&gt;
&lt;h2 id="h2_a-fixed-point-in-time"&gt;A Fixed Point In Time&lt;/h2&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/WhatTimeIsIt_92DD/image_2.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="fixed points in time" src="/image?picture=WindowsLiveWriter/WhatTimeIsIt_92DD/image_thumb.png" alt="fixed points in time" width="498" height="237" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The chart above shows two times local to the Eastern Standard Time (EST);&amp;nbsp; one at 10:00 AM and one at 10:00 PM.&amp;nbsp; We can see that the 10:00 PM EST event will span into another date at 8:30 AM for IST users.&amp;nbsp; Fixed points in time are best dealt with by converting them to UTC (GMT) or universal time and then when displayed, converted back to the local users time using the time zone information.&lt;/p&gt;
&lt;p&gt;Fixed points in time are usually used for creation dates and times, update dates and times, specific events or meetings.&amp;nbsp; Storing the values as universal time values (UTC) allows the information to be stored independent of clients, web servers, and database servers.&amp;nbsp; If a web server is moved from one time zone to another, the UTC value for the data isn&amp;rsquo;t going to change.&lt;/p&gt;
&lt;h2 id="h2_relative-points-in-time"&gt;Relative Points In Time&lt;/h2&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/WhatTimeIsIt_92DD/image_4.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="relative points in time" src="/image?picture=WindowsLiveWriter/WhatTimeIsIt_92DD/image_thumb_1.png" alt="relative points in time" width="497" height="137" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The chart above shows an event occurring at 10:00 AM relative to the start of each time zone.&amp;nbsp; Relative points in time are usually used for start / stop dates for promotions, local displays, and for business day processing.&amp;nbsp; If times are converted to UTC on set operations and to the client time on get operations, no other conversion needs to take place when displaying the time.&amp;nbsp; However, in calculating if the task is over due, then some difference needs to be calculated.&lt;/p&gt;
&lt;p&gt;In order to calculate a relative point in time, two pieces of additional information are needed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The time zone of the administrator that set the time needs to be stored so that relative comparisons can take place.&lt;/li&gt;
&lt;li&gt;A flag that indicates a relative time comparison needs to take place (i.e. IsPastDueRelative).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
/// 
/// True if the client time is &amp;gt; DueStartDate.
/// Current time at the client used for comparison
/// 
public Boolean IsPastDueStart()
{
	DateTime clientTime = Utils.DateClientNow;
	int diff;
	if (IsPastDueRelative)
	{
		TimeZoneInfo tz = null;
		tz = TimeZoneInfo.FindSystemTimeZoneById(this.DueDateTimeZoneId);
		DateTime dueTime = TimeZoneInfo.ConvertTimeFromUtc(this.DueStartDateUtc, tz);
		diff = clientTime.CompareTo(dueTime);
	}
	else
	{
		diff = clientTime.CompareTo(this.DueStartDate);
	}
	return (diff &amp;gt; 0);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_logical-business-day"&gt;Logical Business Day&lt;/h2&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/WhatTimeIsIt_92DD/image_6.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="Business day chart" src="/image?picture=WindowsLiveWriter/WhatTimeIsIt_92DD/image_thumb_2.png" alt="Business day chart" width="497" height="217" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A business day becomes important for tracking when a particular event might be recorded for historical or business purposes.&amp;nbsp; The chart above shows a situation where a business day for recording events starts at 8:00 AM and continues until 8:00 AM the next day.&amp;nbsp; A similar situation can occur for recording transactions at the point of sale.&amp;nbsp; Sales might continue for business day 1 until someone closes a register, counts the money and balances the till.&amp;nbsp; If a sale is rung up after that (say 5:15 pm), the sale is recorded on the next logical business day, not the current calendar day.&lt;/p&gt;
&lt;p&gt;In order to implement a logical business day, there needs to be either an indicator for the current logical business day that changes at some point in the day, or a table that indicates that start / end times for a logical business day for a particular location.&lt;/p&gt;
&lt;h1 id="h1_minvalue-maxvalue-and-null"&gt;MinValue, MaxValue And Null&lt;/h1&gt;
&lt;p&gt;Dates can have specific values that applications can utilize. DateTime.MinValue, DateTime.MaxValue, null.&amp;nbsp; Dealing with dates or times or dates and times can be tricky with databases, and SQL.&amp;nbsp; Using a null value can complicate things even further.&amp;nbsp; Using a MinValue and MaxValue helps keep nulls out of the picture and they can be sorted as well.&amp;nbsp; The .net values used for MinValue and MaxValue are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MinValue = 1/1/0001 12:00:00 AM (00:00:00.0000000, January 1, 0001)&lt;/li&gt;
&lt;li&gt;MaxValue = 12/31/9999 11:59:59 PM (23:59:59.9999999, December 31, 9999)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The interesting anomaly of these min and max values is they are always in LocalTime timezones.&amp;nbsp; When converted to UTC, these values will change based off the UtcOffset.&amp;nbsp; If you want a MinValue or MaxValue in a UTC DateTime, the solution isn&amp;rsquo;t so obvious.&amp;nbsp; There may be better solutions, but using ConvertTimeToUtc and TimeZoneInfo.Utc, I found a combination that worked.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;DateTime min = TimeZoneInfo.ConvertTimeToUtc(DateTime.MinValue, TimeZoneInfo.Utc);
DateTime max = TimeZoneInfo.ConvertTimeToUtc(DateTime.MaxValue, TimeZoneInfo.Utc);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For the curious, the UTC Conversion still equals the MinValue or MaxValue.&amp;nbsp; The values below both return true.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;min.Equals(DateTime.MinValue)
 max.Equals(DateTime.MaxValue)
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_convert-database-and-internal-times-to-utc"&gt;Convert Database and Internal Times To UTC&lt;/h1&gt;
&lt;p&gt;When using dates and times for Create and Update as a single point in time (not local to the time zone), they need to be converted to GMT / UTC.&amp;nbsp; Converting these to UTC and storing them in the database as UTC dates and times is easy to accomplish using .ToUniversalTime().&amp;nbsp; The nice thing about .Net is that converting a date / time to UTC that is already UTC isn&amp;rsquo;t going to change the time (refer to the .Kind property for how .Net does this).&lt;/p&gt;
&lt;p&gt;Converting the value back to local time isn&amp;rsquo;t always appropriate.&amp;nbsp; First, because when running on an IIS Server, the class doesn&amp;rsquo;t know the browser clients TimeZoneInfo.&amp;nbsp; Second, because it&amp;rsquo;s not clear at this context what specific format (local or UTC) is desired.&amp;nbsp; I like the example shown of the Microsoft best practices of exposing a client date/time property and a UTC date/time property. This removes any ambiguity as to what time zone a particular time is based. In the example below, client time is always local to the client (based off the clients TimeZoneId, which is assumed to be set earlier in the session).&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;private DateTime _CreateTime;
/// 
/// Date / time when the class was created in the UTC time zone.
/// 
public DateTime CreateTimeUtc
{
	get { return _CreateTime; }
	set { _CreateTime = value.ToUniversalTime(); }
}

/// 
/// Date / time when the class was created in the client time zone.
/// 
public DateTime CreateTimeUtc
{
	get { return DateClientTimeFromUtc(_CreateTime); }
	set { _CreateTime = value.ToUniversalTime(); }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_convert-utc-times-to-client-times"&gt;Convert UTC Times To Client Times&lt;/h1&gt;
&lt;p&gt;Internal values stored as UTC can be converted to client times, provided the clients time zone information is known.&amp;nbsp; The code below doesn&amp;rsquo;t convert DateTime.MinValue.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
private DateTime _StartTime;
/// 
/// Date / time to start displaying the item. Based on the client time zone.
/// Also the published date.
/// Stored as UTC in memory and DB.
/// 

public DateTime StartTime
{
	get
	{
		DateTime val = _StartTime;
		if (val != DateTime.MinValue)
		{
			val = DateClientTimeFromUtc(val);
		}
		return val;
	}
	set
	{
		DateTime val = value;
		if (val != DateTime.MinValue)
		{
			val = val.ToUniversalTime();
		}
		_StartTime = val;
	}
}

public DateTime StartTimeUtc
{
	get
	{
		return _StartTime;
	}
	set
	{
		DateTime val = value;
		if (val != DateTime.MinValue)
		{
			val = val.ToUniversalTime();
		}
		_StartTime = val;
	}
}

public static DateTime DateClientTimeFromUtc(DateTime clientTime)
{
	DateTime convertedTime;
	string tzId = (string) HttpContext.Current.Session["TimeZoneInfoId"];
	TimeZoneInfo TimeZoneInfoClient = TimeZoneInfo.FindSystemTimeZoneById(tzId);
	convertedTime = TimeZoneInfo.ConvertTimeFromUtc(clientTime, TimeZoneInfoClient);
	return convertedTime;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_convert-parsed-times-to-utc"&gt;Convert Parsed Times to UTC&lt;/h1&gt;
&lt;p&gt;At the outset, the strategy sounds simple, convert date and time values to UTC internally, and when stored in the database, and convert them to the clients time when retrieved or displayed. The tricky part comes when a user enters data from the client.&amp;nbsp; Let&amp;rsquo;s say a user enters a date and time into a textbox as &amp;ldquo;2009 10 31 11:00 PM&amp;rdquo;.&amp;nbsp; By default, the Parse function treats this as System.Globalization.DateTimeStyles.None.&amp;nbsp; In order to use the clients time zone for the conversion, a slight modification is needed.&amp;nbsp; Use TimeZoneInfo.ConvertTimeBySystemTimeZoneId() and the clients TimeZone to convert the parsed date appropriately.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
DateTime clientTime;
string tzId = (string) HttpContext.Current.Session["TimeZoneInfoId"]; 
clientTime = DateTime.Parse("2009 10 31 11:00 PM");
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById(tzId)
clientTime = TimeZoneInfo.ConvertTimeToUtc(clientTime, tzId);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sample times:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10/31/2009 11:00:00 PM PST =&amp;gt; 11/1/2009 6:00:00 AM GMT / UTC&lt;/li&gt;
&lt;li&gt;11/1/2009 3:00:00 AM PST =&amp;gt; 11/1/2009 11:00:00 AM GMT / UTC&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_convert-output-formats-based-on-culture"&gt;Convert Output Formats Based On Culture&lt;/h1&gt;
&lt;p&gt;How does one display date formats based on the users date preferences date format preferences.&amp;nbsp; These preferences are normally based on the culture of the browser (or client application).&amp;nbsp; For example, if the goal is to output dates based off the users culture settings, the date will be different based on the culture settings.&lt;/p&gt;
&lt;p class="ui-state-note"&gt;&lt;strong&gt;Note:&lt;/strong&gt; Browser culture settings are not the same as the System Control panel format settings in Windows.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scenario server time: 9/23/2009 10:41:45 AM&amp;nbsp;&amp;nbsp; (EST)&lt;/li&gt;
&lt;li&gt;The server is in EST GMT-5:00&lt;/li&gt;
&lt;li&gt;Client 1 is in PST GMT-8:00&lt;/li&gt;
&lt;li&gt;Client 1 culture is &amp;ldquo;en-US&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Client 2 is in London, England GMT+1:00 (GMT Standard Time, which is different than GMT coordinated time)&lt;/li&gt;
&lt;li&gt;Client 2 culture is &amp;ldquo;en-GB&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Client 1: Display date format: 9/23/2009 7:41:45 AM&lt;/li&gt;
&lt;li&gt;Client 2: Display date format: 23/09/2009 15:41:45&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are two ways to accomplish this; a hard way and an easy way.&amp;nbsp; In the example below, TimezoneInfoClient is the TimeZoneInfo value stored in a cookie or session set based on the clients preferences.&lt;/p&gt;
&lt;h2 id="h2_easy-date-formatting"&gt;Easy Date Formatting&lt;/h2&gt;
&lt;p&gt;The easy way to format the output is to let .Net do all the work.&amp;nbsp; DateTime.ToString() will use the users current culture and format the date based on those settings.&amp;nbsp; This works in code on a desktop or code running on a server.&amp;nbsp; The users culture that&amp;rsquo;s taken into account is the browsers culture setting not the control panel settings(HttpContext.Current.Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"]).&amp;nbsp; It&amp;rsquo;s easy to test this without flying to London or without changing the workstation culture settings.&amp;nbsp; Changing the Firefox value &lt;strong&gt;intl.accept_languages &lt;/strong&gt;to &amp;ldquo;en-gb, en&amp;rdquo; instead of &amp;ldquo;en-us&amp;rdquo; for example will change all ACCEPT_LANGUAGE values for future requests.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
DateTime t;
t = TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfoClient);
t.ToString()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Result:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Client 1: Display date format: 9/23/2009 7:41:45 AM (en-US culture)&lt;/li&gt;
&lt;li&gt;Client 2: Display date format: 23/09/2009 15:41:45 (en-GB culture)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_date-formatting"&gt;Date Formatting&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s easy to get the same result with more code.&amp;nbsp; There are some circumstances where this might really be necessary.&amp;nbsp; For example, code running in a service that doesn&amp;rsquo;t know the clients specific culture, and the culture needs to be passed around to other layers for date formatting.&amp;nbsp; While it can be argued the formatting should be pushed as closest to the presentation layer as possible, the world isn&amp;rsquo;t a perfect place and re-using existing code sometimes creates a less than optimal situation.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;DateTime t;
t = TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfoClient);
t.ToString()
CultureInfo culture = CultureInfo.CreateSpecificCulture("en-GB");
t.ToString(culture.DateTimeFormat));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Result:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Display date format: 23/09/2009 15:41:45&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_w3c-dates-and-times"&gt;W3C Dates And Times&lt;/h1&gt;
&lt;p&gt;XML, Web Services, SOAP, WCF, WSDL, and other standards use dates and times based on the &lt;a href="http://www.w3.org/TR/NOTE-datetime"&gt;W3C date standard formats&lt;/a&gt;.&amp;nbsp; Some times it&amp;rsquo;s desirable to get the exact W3C date format for use.&amp;nbsp; In .Net, this is easy to accomplish.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;DateTime.Now.ToString("yyyy-MM-ddTHH:mm:sszzz");
DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssK");&lt;br&gt;DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ"); &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;FF is used in the format string if tenths of seconds is desired.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.FFzzz");
DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.FFK");&lt;br&gt;DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.FFZ");&lt;/code&gt;&lt;/pre&gt;
&lt;p class="ui-state-note"&gt;&lt;strong&gt;Note: &lt;/strong&gt;Interestingly, the Z form should be used on UTC based dates.&amp;nbsp; If the &amp;ldquo;zzz &amp;ldquo;or &amp;ldquo;k&amp;rdquo; form is used on a UTC date / time, an error exception will be thrown.&lt;/p&gt;
&lt;h1 id="h1_deferred-date-formatting"&gt;Deferred Date Formatting&lt;/h1&gt;
&lt;p&gt;Another approach is to defer formatting of dates until they are shown to the client.&amp;nbsp; It&amp;rsquo;s&amp;nbsp; not practical for all scenarios, but it does provide two benefits.&amp;nbsp; First, for some content output pages can cache a single page for all cultures and then the client script can decide based off the browsers time zone offset and the culture the formatting.&amp;nbsp; It makes things a bit more complicated, but it&amp;rsquo;s interesting and useful for some scenarios.&lt;/p&gt;
&lt;p&gt;This strategy works by sending W3C output or GMT output times similar to what I&amp;rsquo;ve shown below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;W3C date/time format: &lt;strong&gt;2009-09-23T10:41:45-04:00&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;W3C date/time format: &lt;strong&gt;2009-09-23T14:41:45Z&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These dates and times are then converted to the browser date / time formats.&amp;nbsp; The technique can also be used to convert times to text (for example, &lt;em&gt;updated 15 minutes ago&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;A few examples that use this approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://www.timeanddate.com/clocks/free.html" href="http://www.timeanddate.com/clocks/free.html"&gt;Time And Date Free Clock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://37signals.com/svn/posts/1557-javascript-makes-relative-times-compatible-with-caching" href="http://37signals.com/svn/posts/1557-javascript-makes-relative-times-compatible-with-caching"&gt;Javascript Makes Relative Times Compatible With Caching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://gist.github.com/58761" href="http://gist.github.com/58761"&gt;Javascript Date Helper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_summary-of-datetime-best-practices"&gt;Summary of DateTime Best Practices&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Convert Create and Update time to UTC (.ToUniversalTime()) when storing these in a database.&lt;/li&gt;
&lt;li&gt;Use DateTime.MinValue, DateTime.MaxValue and null appropriately.&lt;/li&gt;
&lt;li&gt;Do not blindly convert DateTime.MinValue and DateTime.MaxValue to UTC.&lt;/li&gt;
&lt;li&gt;Convert fixed points in time to universal time (UTC).&lt;/li&gt;
&lt;li&gt;Expose UTC and Client time zone based date / time properties for dates.&lt;/li&gt;
&lt;li&gt;Convert DateTime.Parse() to UTC using the client&amp;rsquo;s time zone, not the servers.&lt;/li&gt;
&lt;li&gt;Remember date/time arithmetic doesn&amp;rsquo;t preserve DST rules or changes.&lt;/li&gt;
&lt;li&gt;To avoid DST issues, convert to UTC, perform the arithmetic, then convert back to local time if needed.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="h1_references"&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://support.microsoft.com/gp/cp_dst" href="http://support.microsoft.com/gp/cp_dst"&gt;Microsoft Daylight Saving Time Help and Support Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/" href="http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/"&gt;Auto Detect A Time Zone With JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://rsanidad.wordpress.com/2007/09/21/getting-the-client-utc-offset-with-aspnet/" href="http://rsanidad.wordpress.com/2007/09/21/getting-the-client-utc-offset-with-aspnet/"&gt;Getting the client UTC Offset with ASP.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/Year_2007_problem" href="http://en.wikipedia.org/wiki/Year_2007_problem"&gt;Year 2007 DST Problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.w3.org/TR/NOTE-datetime" href="http://www.w3.org/TR/NOTE-datetime"&gt;W3C Date and Time Formats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.timeanddate.com/date/leapyear.html" href="http://www.timeanddate.com/date/leapyear.html"&gt;Leap Year&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/ms973825.aspx" href="http://msdn.microsoft.com/en-us/library/ms973825.aspx"&gt;Coding Best Practices Using DateTime in the .NET Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://support.microsoft.com/kb/909614" href="http://support.microsoft.com/kb/909614"&gt;How the Windows Time service treats a leap second&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>net</category>
  <category>visual-studio</category>
  <category>c-sharp</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/date-and-time-tracking-in-net/</guid>
  <pubDate>Mon, 28 Sep 2009 22:47:00 GMT</pubDate>
</item>
<item>
  <title>960 Grid Templates for Expression Design 2</title>
  <link>https://tim-stanley.com/post/960-grid-templates-for-expression-design-2/</link>
  <description>&lt;p&gt;Leveraging Nathan Smith's &lt;a href="http://960.gs/"&gt;960.gs&lt;/a&gt;, I&amp;rsquo;ve created some 960 grid templates for Expression Design 2.&amp;nbsp; Included in the zip file are design templates for the 12 column and 16 column formats.&lt;/p&gt;
&lt;p&gt;&lt;a href="/file.axd?file=2009%2f8%2f960_Expression.zip"&gt;960_Expression.zip (488.48 kb)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/960GridTemplatesforExpressionDesign2_EDC2/960%2012%20Column%20Template_2.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="960 12 Column Template" src="/image?picture=WindowsLiveWriter/960GridTemplatesforExpressionDesign2_EDC2/960%2012%20Column%20Template_thumb.jpg" alt="960 12 Column Template" width="364" height="140" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/960GridTemplatesforExpressionDesign2_EDC2/960%2016%20Column%20Template_2.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="960 16 Column Template" src="/image?picture=WindowsLiveWriter/960GridTemplatesforExpressionDesign2_EDC2/960%2016%20Column%20Template_thumb.jpg" alt="960 16 Column Template" width="364" height="142" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>design</category>
  <category>microsoft</category>
  <category>expression-blend</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/960-grid-templates-for-expression-design-2/</guid>
  <pubDate>Thu, 06 Aug 2009 20:56:00 GMT</pubDate>
</item>
<item>
  <title>Fields to Properties</title>
  <link>https://tim-stanley.com/post/fields-to-properties/</link>
  <description>&lt;p&gt;How to automatically have Visual Studio 2008 convert fields to properties. [more]&lt;/p&gt;
&lt;p&gt;Type the following:&lt;/p&gt;
&lt;p&gt;public String _Title;&lt;/p&gt;
&lt;p&gt;Right click the &amp;ldquo;_Title&amp;rdquo;, select Refactor, Encapsulate Field&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/FieldstoProperties_D9F4/image_2.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="/image?picture=WindowsLiveWriter/FieldstoProperties_D9F4/image_thumb.png" alt="image" width="500" height="289" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Select the new Property name:&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/FieldstoProperties_D9F4/image_4.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="/image?picture=WindowsLiveWriter/FieldstoProperties_D9F4/image_thumb_1.png" alt="image" width="460" height="388" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After Visual Studio Encapsulates the field, Select Apply&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/FieldstoProperties_D9F4/image_6.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="/image?picture=WindowsLiveWriter/FieldstoProperties_D9F4/image_thumb_2.png" alt="image" width="500" height="450" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Visual Studio will generate the new property.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/FieldstoProperties_D9F4/image_8.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="/image?picture=WindowsLiveWriter/FieldstoProperties_D9F4/image_thumb_3.png" alt="image" width="251" height="261" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>tips</category>
  <category>visual-studio</category>
  <category>c-sharp</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/fields-to-properties/</guid>
  <pubDate>Fri, 24 Jul 2009 19:39:27 GMT</pubDate>
</item>
<item>
  <title>Outlook 2007 Panning Cursor</title>
  <link>https://tim-stanley.com/post/outlook-2007-panning-cursor/</link>
  <description>&lt;p&gt;The outlook 2007 panning cursor can get &amp;ldquo;accidentally&amp;rdquo; enabled.&amp;nbsp; When it does, It&amp;rsquo;s annoying at best and it interferes with copy / paste.&amp;nbsp; &lt;a href="http://www.twistedethics.com/about/"&gt;Phil Wiffen&lt;/a&gt; has an excellent summary on how to turn it off and restore Outlook to the original cursor behavior, which by the way will also allow selecting text for copy / paste.&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.twistedethics.com/2008/09/12/outlook-2007-how-to-disable-the-hand-cursor/" href="http://www.twistedethics.com/2008/09/12/outlook-2007-how-to-disable-the-hand-cursor/"&gt;Outlook 2007 How To Disable The Hand Cursor&lt;/a&gt; [more]&lt;/p&gt;
&lt;h1&gt;What The Panning Hand Looks Like&lt;/h1&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/Outlook2007PanningCursor_6D62/image_4.png"&gt;&lt;img style="display: inline; border: 0px;" title="panning hand open" src="/image?picture=WindowsLiveWriter/Outlook2007PanningCursor_6D62/image_thumb_1.png" alt="panning hand open" width="84" height="79" border="0" /&gt;&lt;/a&gt; &lt;a href="/image?picture=WindowsLiveWriter/Outlook2007PanningCursor_6D62/image_6.png"&gt;&lt;img style="display: inline; border: 0px;" title="panning hand closed (left click)" src="/image?picture=WindowsLiveWriter/Outlook2007PanningCursor_6D62/image_thumb_2.png" alt="panning hand closed (left click)" width="96" height="79" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The panning hand shows up in the preview pane and over text when a message is opened.&amp;nbsp; The normal cursor (the text selector) doesn&amp;rsquo;t show up until you select forward or reply for the email.&lt;/p&gt;
&lt;h1&gt;How The Panning Hand Gets Enabled&lt;/h1&gt;
&lt;p&gt;The Outlook preview pane shows a small hand icon in the upper right corner of the preview pane.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/Outlook2007PanningCursor_6D62/image_2.png"&gt;&lt;img style="display: inline; border: 0px;" title="panning hand in preview pane" src="/image?picture=WindowsLiveWriter/Outlook2007PanningCursor_6D62/image_thumb.png" alt="panning hand in preview pane" width="40" height="168" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s easy to overlook, and it&amp;rsquo;s easy to accidentally click if your trying to scroll in the preview pane.&amp;nbsp; Once it&amp;rsquo;s enabled, It&amp;rsquo;s not so obvious how it was turned on or how to turn it off.&lt;/p&gt;
&lt;h1&gt;How To Turn the Panning Cursor Off&lt;/h1&gt;
&lt;p&gt;There are basically two options.&lt;/p&gt;
&lt;p&gt;1. On the Outlook preview pane, in the upper right, select the cursor again.&lt;/p&gt;
&lt;p&gt;2. Use Phil&amp;rsquo;s notes to &lt;a href="http://www.twistedethics.com/2008/09/12/outlook-2007-how-to-disable-the-hand-cursor/"&gt;turn the Outlook Panning Hand Off&lt;/a&gt;.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>tips</category>
  <category>microsoft</category>
  <category>office</category>
  <category>outlook</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/outlook-2007-panning-cursor/</guid>
  <pubDate>Fri, 10 Jul 2009 12:11:09 GMT</pubDate>
</item>
<item>
  <title>Secure Data</title>
  <link>https://tim-stanley.com/post/secure-data/</link>
  <description>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/20836928@N00/2152798588/"&gt;&lt;img class="left" style="display: inline; margin: 0px 10px 10px 0px; border: 0px;" title="secure data" src="/image?picture=WindowsLiveWriter/SecureData_A582/2152798588_b85e25a3f3_o_3.jpg" alt="Data Storage by Ian S" width="260" height="200" align="left" border="0"&gt;&lt;/a&gt; Given the high profile nature of identity theft and security breaches, there are many laws, policies, and guidelines that companies are using to classify and manage the information technology systems in a secure manner.&amp;nbsp; What exactly is secure data and how should it be handled?[more]&lt;/p&gt;
&lt;p&gt;Classification of data is the most important step in my opinion, followed by policies on how to handle these types of data.&amp;nbsp; &lt;a href="http://csrc.nist.gov/publications/nistpubs/800-53-Rev1/800-53-rev1-final-clean-sz.pdf"&gt;NIST 800-53&lt;/a&gt; is a very comprehensive guide to information systems.&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_common-security-legislation-themes"&gt;Common Security Legislation Themes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_data-classification"&gt;Data Classification&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_secure-handling-required-shr-data"&gt;Secure Handling Required (SHR) Data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_sensitive-personal-and-confidential-information-p"&gt;Sensitive Personal and Confidential Information (PCI)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_personal-information"&gt;Personal Information&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_company-confidential"&gt;Company Confidential&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_internal-information"&gt;Internal Information&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_public-information"&gt;Public Information&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_regulations"&gt;Regulations&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_key-us-regulations-and-standards"&gt;Key US Regulations and Standards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_other-related-regulations-or-guidelines"&gt;Other Related Regulations or Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="h1_common-security-legislation-themes"&gt;Common Security Legislation Themes&lt;/h1&gt;
&lt;p&gt;While there are many regulations and guidelines they all have many similar themes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Classify and secure data.&lt;/li&gt;
&lt;li&gt;Secure information systems.&lt;/li&gt;
&lt;li&gt;Establish security controls (limit, document, implement, assess, refine)&lt;/li&gt;
&lt;li&gt;Audit access to data and other information systems activity&lt;/li&gt;
&lt;li&gt;Dispose of data appropriately for it&amp;rsquo;s classification&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="h1_data-classification"&gt;Data Classification&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;One of the most common mistakes I have seen in company policies is categorizing data that is sensitive personal and confidential the same as secure handling required data.&amp;nbsp; Similar to the military designation of top secret, secret, and confidential data, I believe there are different types of data and should have separate guidelines for handling, storage and transmission.&lt;/p&gt;
&lt;h2 id="h2_secure-handling-required-shr-data"&gt;Secure Handling Required (SHR) Data&lt;/h2&gt;
&lt;p&gt;Like Top Secret data, any data which could be used to conduct financial or legal transactions (or identity theft) should be regarded with the highest level of security.&amp;nbsp; The most commonly and appropriate used term I&amp;rsquo;ve seen is Secure Handling Require (SHR).&amp;nbsp; SHR data is typically very small and low in volume.&amp;nbsp; SHR data should be secured both while in transit, and at rest (stored in a database or file system).&lt;/p&gt;
&lt;p&gt;SHR Data includes the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Credit and debit card numbers&lt;/li&gt;
&lt;li&gt;Personal banking information (account #, routing #)&lt;/li&gt;
&lt;li&gt;Drivers License Number&lt;/li&gt;
&lt;li&gt;State identification numbers&lt;/li&gt;
&lt;li&gt;Social Security Number (full or four digit form)&lt;/li&gt;
&lt;li&gt;Military Identification Number&lt;/li&gt;
&lt;li&gt;Passport Number&lt;/li&gt;
&lt;li&gt;Account Passwords, security codes, or access codes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Handling criteria for SHR data:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SHR data should not be stored at rest unless required for conducting business.&lt;/li&gt;
&lt;li&gt;SHR data must not be transmitted in clear text format (either on the network, email)&lt;/li&gt;
&lt;li&gt;SHR data must not be stored in clear text format.&lt;/li&gt;
&lt;li&gt;SHR data must be kept in a physically secure environment (locked, physically secure storage)&lt;/li&gt;
&lt;li&gt;SHR must either be encrypted, removed, or replaced with another token identifier when transmitted or stored in clear text.&lt;/li&gt;
&lt;li&gt;SHR data must be destroyed using secure data destruction (physical destruction of media, shredding, or overwritten using DOD 5220.22-M techniques.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h2_sensitive-personal-and-confidential-information-p"&gt;Sensitive Personal and Confidential Information (PCI)&lt;/h2&gt;
&lt;p&gt;Many policies use the term &lt;em&gt;Sensitive Personal Information&lt;/em&gt; instead of &lt;em&gt;Secure Handling Required&lt;/em&gt;.&amp;nbsp; I believe these warrant separate classification and handling guidelines.&amp;nbsp; For example, HIPPA outlines limitations on the disclosure and physical security, but doesn&amp;rsquo;t dictate encryption of this type of data.&amp;nbsp; Sensitive Personal information while typically private, can&amp;rsquo;t typically be used to conduct financial or legal transactions or be used for identity theft.&lt;/p&gt;
&lt;p&gt;Any sensitive information which can be associated with a specific individual and their financial or health transactions should be considered confidential.&amp;nbsp; Typically, the financial or health transactions themselves if aggregated or don&amp;rsquo;t contain any personally identifiable information aren&amp;rsquo;t at risk, it&amp;rsquo;s when they can be associated with a specific individual that they become sensitive and confidential.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sensitive Personal and Confidential data includes the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Protected Financial information that can be used to identify an individual.&lt;/li&gt;
&lt;li&gt;Protected Health information (PHI), including physical or mental health conditions, or services in the past, present, or future that can be used to identify an individual.&lt;/li&gt;
&lt;li&gt;Racial or ethnic origins.&lt;/li&gt;
&lt;li&gt;Political or religious beliefs.&lt;/li&gt;
&lt;li&gt;Sexuality.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Handling for PCI data:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;PCI data should never be left unattended&lt;/li&gt;
&lt;li&gt;PCI data should be secured via power on passwords and auto logoff screen savers&lt;/li&gt;
&lt;li&gt;PCI data should have policies in place for customer notification if the media containing PCI data is lost or stolen&lt;/li&gt;
&lt;li&gt;PCI data should be kept in a physically secure environment&lt;/li&gt;
&lt;li&gt;PCI data should be destroyed in an appropriate manner (shredded, format, overwrite, or full DOD 5220.22-M)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h2_personal-information"&gt;Personal Information&lt;/h2&gt;
&lt;p&gt;It may be considered a breech of privacy to disclose personal information, but this type of information is typically shared in in the normal conduct of business.&lt;/p&gt;
&lt;p&gt;In some cases, information that is gathered and can be associated to a specific individual can also be personal information (a list of searches entered, or products purchased)&lt;/p&gt;
&lt;p&gt;Companies should have a privacy policy in place that outlines what data is collected and how it is used.&lt;/p&gt;
&lt;p&gt;Personal information should be defined by a company policy, but includes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Information which personally identifies an individual&lt;/li&gt;
&lt;li&gt;Customer User names&lt;/li&gt;
&lt;li&gt;Customer names, email address, billing addresses, and phone numbers&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h2_company-confidential"&gt;Company Confidential&lt;/h2&gt;
&lt;p&gt;Company confidential data is defined by a company policy, but typically includes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Personnel information&lt;/li&gt;
&lt;li&gt;Proprietary information&lt;/li&gt;
&lt;li&gt;Company key financial information&lt;/li&gt;
&lt;li&gt;Company security policies&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h2_internal-information"&gt;Internal Information&lt;/h2&gt;
&lt;p&gt;Internal information is defined by a company policy, but typically includes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Unrestricted use within the company&lt;/li&gt;
&lt;li&gt;Personnel directories&lt;/li&gt;
&lt;li&gt;Internal policies and procedures&lt;/li&gt;
&lt;li&gt;Most internal electronic mail messages&lt;/li&gt;
&lt;li&gt;Any information not classified as secure handling data required, personal and confidential, or company confidential&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h2_public-information"&gt;Public Information&lt;/h2&gt;
&lt;p&gt;Public information is defined by a company policy, but should include information specifically approved for public release by a designated authority within the company.&lt;/p&gt;
&lt;h1 id="h1_regulations"&gt;Regulations&lt;/h1&gt;
&lt;h2 id="h2_key-us-regulations-and-standards"&gt;Key US Regulations and Standards&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.pcisecuritystandards.org/security_standards/pci_dss.shtml"&gt;Payment Card Industry Data Security Standard&lt;/a&gt; (PCI DSS) &amp;ndash; covers the standards for credit and debit card processing and outlines guidelines for secure information systems for secure data at rest and in transit.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hhs.gov/ocr/privacy/index.html "&gt;Health Insurance Portability and Accountability Act&lt;/a&gt; (HIPAA) &amp;ndash; outlines that consumer medical data must be kept secure and private.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Sarbanes_oxley_act"&gt;Sarbanes-Oxley&lt;/a&gt; &amp;ndash; outlines that an audit record of changes made to financial data must be kept to prevent or detect fraud in overriding of controls.&lt;/li&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/Fair_Credit_Reporting_Act" href="http://en.wikipedia.org/wiki/Fair_Credit_Reporting_Act"&gt;Fair Credit Reporting Act&lt;/a&gt; &amp;ndash; regulates the collection, dissemination, and use of consumer credit information.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/GLBA"&gt;Gramm-Leach-Bliley Act&lt;/a&gt; (GLBA) &amp;ndash; outlines mandatory compliance of financial institutions to protect consumer financial information from privacy, and from foreseeable threats in security and data integrity.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_other-related-regulations-or-guidelines"&gt;Other Related Regulations or Guidelines&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Federal_Information_Security_Management_Act_of_2002"&gt;Federal information Security Management Act&lt;/a&gt; (FISMA) &amp;ndash; requires federal government agencies to conduct annual security reviews.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.iso.org/iso/catalogue_detail?csnumber=50297"&gt;ISO/IEC 27002:2005&lt;/a&gt; &amp;ndash; security techniques&lt;/li&gt;
&lt;li&gt;JSOX &amp;ndash; a Japanese version of Sarbanes-Oxley&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/SB_1386"&gt;SB 1386&lt;/a&gt; &amp;ndash; a California law regulating personal information and disclosure of&amp;nbsp; personal information by a security breach.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://csrc.nist.gov/publications/nistpubs/800-53-Rev1/800-53-rev1-final-clean-sz.pdf"&gt;NIST 800-53&lt;/a&gt; / &lt;a href="http://www.iso.org/iso/catalogue_detail?csnumber=39612"&gt;ISO 17799:2005&lt;/a&gt;&amp;nbsp; &amp;ndash; outlines information security and management on computer systems.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Data_remanence"&gt;Department of Defense 5220.22-M&lt;/a&gt; &amp;ndash; outlines the standards for deleting / overwriting data for secure deletion or disposal.&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.ftc.gov/bcp/edu/microsites/redflagsrule/index.shtml" href="http://www.ftc.gov/bcp/edu/microsites/redflagsrule/index.shtml"&gt;FTC Red Flags Rule&lt;/a&gt; &amp;ndash; is used to detect warning signs of identity theft.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/SAS_70"&gt;Statement on Auditing Standards No 70&lt;/a&gt; (SAS 70) &amp;ndash; audits are used to comply with GLBA requirements. SAS-70 is similar in nature to the Banking (&lt;a href="http://www.bits.org/"&gt;BITS&lt;/a&gt;) security criteria.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bits.org/"&gt;BITS&lt;/a&gt; &amp;ndash; outlines a review of content of company policies for security, information systems, physical facilities, human resources, business continuity, and security incident responses.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_references"&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.pcisecuritystandards.org/security_standards/pci_dss.shtml"&gt;Payment Card Industry Data Security Standard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hhs.gov/ocr/privacy/index.html "&gt;Health Insurance Portability and Accountability Act&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.spva.org" href="http://www.spva.org"&gt;Secure POS Vendor Alliance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.ftc.gov/bcp/edu/microsites/redflagsrule/index.shtml" href="http://www.ftc.gov/bcp/edu/microsites/redflagsrule/index.shtml"&gt;FTC Red Flags Rule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Data_remanence"&gt;Department of Defense 5220.22-M&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Sarbanes_oxley_act"&gt;Sarbanes-Oxley&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/Classified_information" href="http://en.wikipedia.org/wiki/Classified_information"&gt;http://en.wikipedia.org/wiki/Classified_information&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/SAS_70"&gt;Statement on Auditing Standards No 70&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://csrc.nist.gov/publications/nistpubs/800-53-Rev1/800-53-rev1-final-clean-sz.pdf"&gt;NIST 800-53&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.iso.org/iso/catalogue_detail?csnumber=39612"&gt;ISO 17799:2005&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bits.org/"&gt;BITS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.oispp.ca.gov/consumer_privacy/default.asp"&gt;Californian Office of Information Security and Privacy Protection &amp;ndash; Consumer Privacy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.ftc.gov/bcp/edu/pubs/business/idtheft/bus69.pdf" href="http://www.ftc.gov/bcp/edu/pubs/business/idtheft/bus69.pdf"&gt;Protecting Personal Information - A Guide for Business&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/Information_sensitivity" href="http://en.wikipedia.org/wiki/Information_sensitivity"&gt;Information Sensitivity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>project-management</category>
  <category>security</category>
  <category>data</category>
  <category>pci-dss</category>
  <category>sarbanes-oxley</category>
  <category>glba</category>
  <category>hippa</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/secure-data/</guid>
  <pubDate>Wed, 17 Jun 2009 00:07:00 GMT</pubDate>
</item>
<item>
  <title>E3 Retail Web Site</title>
  <link>https://tim-stanley.com/post/e3-retail-web-site/</link>
  <description>&lt;h2&gt;What they needed&lt;/h2&gt;
&lt;div class="left"&gt;&lt;a href="http://e3retail.com/"&gt;&lt;img style="display: inline; margin: 0px 10px 10px 0px; border-width: 0px;" title="Logo" src="/image?picture=WindowsLiveWriter/6d9f83684cba_E376/Logo_3.jpg" alt="Logo" width="84" height="84" align="left" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;E3 Retail had some good looking products including Point of Sale, Enterprise promotions, Returns, and 4690 hardware migration. Which used Microsoft&amp;rsquo;s Windows Presentation Foundation (WPF), to provide a visually rich user experience.&amp;nbsp; However, E3 Retail didn&amp;rsquo;t&amp;nbsp; have a comparable website to show them off. [more]&lt;/p&gt;
&lt;p&gt;While the marketing team at E3 created the copy for the site, numerous images, and features were added to the design to complement the marketing copy.&lt;/p&gt;
&lt;h2&gt;What I did&lt;/h2&gt;
&lt;p&gt;E3 retail wanted to focus on images to convey much of their marketing concepts.&amp;nbsp; The marketing director created mock-ups in PowerPoint to work through details of the wording, general layout and selection of images with the board of directors.&lt;/p&gt;
&lt;p&gt;Once there was agreement on the message and general images for publication, the images were adjusted, tuned, resized, and optimized for web publication.&amp;nbsp; Both Microsoft Expression Design, Photoshop and other image manipulation tools were used to generate the final results.&amp;nbsp; In addition to the main images, gradients, buttons, glass look layers and icons were added throughout the site.&lt;/p&gt;
&lt;p&gt;Presentation of the images went through several different prototypes of user interaction and looks before finally settling on a flash control that provided the richness and quality presentation of the desired images.&lt;/p&gt;
&lt;p&gt;the solution is hosted on IIS7 server on Windows 2008 using ASP.NET and .Net 3.5.&lt;/p&gt;
&lt;h2&gt;The result&lt;/h2&gt;
&lt;p&gt;The result was an image intensive web site that quickly conveys the product and service capabilities for E3 Retail and provides the ability for the marketing director to quickly update and add new content and news without requiring a technical development team for every change.&lt;/p&gt;
&lt;h1&gt;Services Provided&lt;/h1&gt;
&lt;h2&gt;Design&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Prototypes&lt;/li&gt;
&lt;li&gt;Final image generation (sizing, quality adjustments, layout, gradients)&lt;/li&gt;
&lt;li&gt;Photography&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Content management features added (Pretty URLs, Multi Post user control)&lt;/li&gt;
&lt;li&gt;Windows Live Writer support&lt;/li&gt;
&lt;li&gt;Theme design (background, colors, layout)&lt;/li&gt;
&lt;li&gt;Flash customization&lt;/li&gt;
&lt;li&gt;XHTML / CSS / Javascript&lt;/li&gt;
&lt;li&gt;Jquery support added for tabs, menus&lt;/li&gt;
&lt;li&gt;Browser CSS design and testing: IE8, IE7, Safari, IE6&lt;/li&gt;
&lt;li&gt;Deployment and configuration of IIS7 and Windows Server 2008&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Features&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Rotating image banners on all product pages&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tim-stanley.com/post/Pretty-Good-URLs.aspx"&gt;Pretty URLs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Content management&lt;/li&gt;
&lt;li&gt;Windows Live Writer Support (edit or create pages / posts)&lt;/li&gt;
&lt;li&gt;Web WYSIWIG editor&lt;/li&gt;
&lt;li&gt;IIS7 Hosting on Windows Server 2008 platform&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tim-stanley.com/post/Multi-Post-User-Control.aspx"&gt;Multi Post user control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Modular page components can be used on other pages&lt;/li&gt;
&lt;li&gt;JQuery 1.2.6 support&lt;/li&gt;
&lt;li&gt;JQuery UI 1.5.3 support (tabs)&lt;/li&gt;
&lt;li&gt;JQuery dropdown menus (superfish)&lt;/li&gt;
&lt;li&gt;Search and Opensearch support&lt;/li&gt;
&lt;li&gt;RSS Syndication feeds&lt;/li&gt;
&lt;li&gt;Browser support: IE 8, IE7, Firefox 3, Safari (limited IE6 support)&lt;/li&gt;
&lt;li&gt;Ratings&lt;/li&gt;
&lt;li&gt;Bookmarks: favorites, e-mail, digg, dzone, stumbleupon, reddit, del.ico.us, newvine, furl, blinklist&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/6d9f83684cba_E376/image_6.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="E3 Retail POS" src="/image?picture=WindowsLiveWriter/6d9f83684cba_E376/image_thumb_2.png" alt="E3 Retail POS" width="484" height="357" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/6d9f83684cba_E376/image_3.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="E3 Retail Promotions" src="/image?picture=WindowsLiveWriter/6d9f83684cba_E376/image_thumb.png" alt="E3 Retail Promotions" width="484" height="356" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/6d9f83684cba_E376/image_9.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="TouchPoint POS" src="/image?picture=WindowsLiveWriter/6d9f83684cba_E376/image_thumb_1.png" alt="TouchPoint POS" width="484" height="448" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/6d9f83684cba_E376/image_8.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="E3 Retail Contact" src="/image?picture=WindowsLiveWriter/6d9f83684cba_E376/image_thumb_3.png" alt="E3 Retail Contact" width="484" height="272" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>work</category>
  <category>interesting</category>
  <category>web-development</category>
  <category>windows-server-2008</category>
  <category>websites</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/e3-retail-web-site/</guid>
  <pubDate>Fri, 22 May 2009 21:21:06 GMT</pubDate>
</item>
<item>
  <title>Pretty URLs And IIS6</title>
  <link>https://tim-stanley.com/post/pretty-urls-and-iis6/</link>
  <description>&lt;p&gt;IIS7 can support pages without extensions without administrator configuration settings. IIS6 can also support&amp;nbsp; URLs without extensions, but it requires an administrator setting. Here's a tip on how to configure IIS6 to support URLs without extensions.[more]&lt;/p&gt;
&lt;p&gt;On the website properties, The configuration tab must be selected.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/PrettyURLsAndIIS6_9EAB/image_4.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="/image?picture=WindowsLiveWriter/PrettyURLsAndIIS6_9EAB/image_thumb_1.png" alt="image" width="244" height="237" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A wildcard application map must be added. Select the INSERT option and add the following file, and turn off the checkbox to verify the file exists.&lt;/p&gt;
&lt;p&gt;File: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/PrettyURLsAndIIS6_9EAB/image_6.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="/image?picture=WindowsLiveWriter/PrettyURLsAndIIS6_9EAB/image_thumb_2.png" alt="image" width="244" height="75" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The new setting should now be in place.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/PrettyURLsAndIIS6_9EAB/image_2.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="/image?picture=WindowsLiveWriter/PrettyURLsAndIIS6_9EAB/image_thumb.png" alt="image" width="244" height="268" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This should now allow URL rewriting on URL's like: &lt;a href="http://e3retail.com/page/products/"&gt;http://e3retail.com/page/products/&lt;/a&gt;.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>asp-net</category>
  <category>iis7</category>
  <category>iis</category>
  <category>iis6</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/pretty-urls-and-iis6/</guid>
  <pubDate>Tue, 12 May 2009 17:21:00 GMT</pubDate>
</item>
<item>
  <title>Pretty URLs And IIS7 Authentication</title>
  <link>https://tim-stanley.com/post/pretty-urls-and-iis7-authentication/</link>
  <description>&lt;p&gt;One side effect of using &lt;a title="http://tim-stanley.com/post/Pretty-Good-URLs.aspx" href="http://tim-stanley.com/post/Pretty-Good-URLs.aspx"&gt;Pretty URLs&lt;/a&gt; in IIS7 is that IIS7 doesn&amp;rsquo;t authenticate these URLs because they don&amp;rsquo;t have the .aspx file extension.&amp;nbsp; Here is a quick tip on how to fix it. [more]&lt;/p&gt;
&lt;p&gt;IIS7 Authentication only authenticates against .aspx file extensions by default.&amp;nbsp; This means, that if you try to create a pretty URL (&lt;a href="http://tim-stanley.com/page/about/"&gt;http://tim-stanley.com/page/about/&lt;/a&gt;), then the UTL isn&amp;rsquo;t authenticated the same way if it had a .aspx page extension (&lt;a href="http://tim-stanley.com/page/about.aspx"&gt;http://tim-stanley.com/page/about.aspx&lt;/a&gt;).&lt;/p&gt;
&lt;h1&gt;Normal .aspx Results&lt;/h1&gt;
&lt;p&gt;Sample URL: &lt;a href="http://tim-stanley.com/page/about.aspx"&gt;http://tim-stanley.com/page/about.aspx&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
HttpContext.Current.User.Identity.IsAuthenticated =&amp;gt; true
HttpContext.Current.User.IsInRole("Administrators")) =&amp;gt; true
System.Threading.Thread.CurrentPrincipal.Identity.IsAuthenticated =&amp;gt; true
System.Threading.Thread.CurrentPrincipal.IsInRole("Administrators") =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Html Extension Results&lt;/h1&gt;
&lt;p&gt;Sample URL &lt;a href="http://tim-stanley.com/page/about.html"&gt;http://tim-stanley.com/page/about.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sample URL &lt;a href="http://tim-stanley.com/page/about/"&gt;http://tim-stanley.com/page/about/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Because both URL&amp;rsquo;s above are not .aspx files, they both return the same results (i.e. Isinrole, is false).&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
HttpContext.Current.User.Identity.IsAuthenticated =&amp;gt; true
HttpContext.Current.User.IsInRole("Administrators")) =&amp;gt; false
System.Threading.Thread.CurrentPrincipal.Identity.IsAuthenticated =&amp;gt; false
System.Threading.Thread.CurrentPrincipal.IsInRole("Administrators") =&amp;gt; false
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;The Fix&lt;/h1&gt;
&lt;p&gt;After much research, I found a solution to this perplexing problem.&amp;nbsp; The key was in in searching for and finding the schema file that had the keywords.&amp;nbsp; I believe this fix will also change authentication for *.axd handlers as well.&lt;/p&gt;
&lt;pre&gt;C:\Windows\System32\inetsrv\config\schema\IIS_schema.xml&lt;/pre&gt;
&lt;p&gt;IIS7 Forms authentication changes in the section: &amp;lt;system.webServer&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;
&amp;lt;modules runAllManagedModulesForAllRequests="true" &amp;gt;
	&amp;lt;remove name="FormsAuthentication" /&amp;gt;
	&amp;lt;add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" preCondition="integratedMode" /&amp;gt;
	&amp;lt;remove name="UrlAuthorization" /&amp;gt;
	&amp;lt;add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="integratedMode" /&amp;gt;
	&amp;lt;remove name="DefaultAuthentication" /&amp;gt;
&amp;lt;/modules&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Changing the above web.config entries will also change the results.&amp;nbsp; The new results are listed below.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
HttpContext.Current.User.Identity.IsAuthenticated =&amp;gt; true
HttpContext.Current.User.IsInRole("Administrators")) =&amp;gt; true
System.Threading.Thread.CurrentPrincipal.Identity.IsAuthenticated =&amp;gt; true
System.Threading.Thread.CurrentPrincipal.IsInRole("Administrators") =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://learn.iis.net/page.aspx/543/administration-pack/" href="http://learn.iis.net/page.aspx/543/administration-pack/"&gt;http://learn.iis.net/page.aspx/543/administration-pack/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis7-integrated-pipeline/rev/4" href="http://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis7-integrated-pipeline/rev/4"&gt;http://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis7-integrated-pipeline/rev/4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://mvolo.com/blogs/serverside/archive/2007/11/01/IIS7-configuration-sections-exposed.aspx" href="http://mvolo.com/blogs/serverside/archive/2007/11/01/IIS7-configuration-sections-exposed.aspx"&gt;http://mvolo.com/blogs/serverside/archive/2007/11/01/IIS7-configuration-sections-exposed.aspx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>blogengine-net</category>
  <category>iis</category>
  <category>iis7</category>
  <category>windows-server-2008</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/pretty-urls-and-iis7-authentication/</guid>
  <pubDate>Mon, 11 May 2009 23:25:00 GMT</pubDate>
</item>
<item>
  <title>Network Names For Systems</title>
  <link>https://tim-stanley.com/post/network-names-for-systems/</link>
  <description>&lt;p&gt;When you have five machines to keep track of, the naming format for those machines may not be important. When you have 500,000 in twelve countries, identifying and locating a machine or groups of machines becomes impossible if you haven&amp;rsquo;t planned ahead. Even if you have a simple home network, it doesn&amp;rsquo;t take long for iPods, routers, file servers, workstations, laptops to add up.&lt;/p&gt;
&lt;p&gt;Here are some tips for naming physical device machine names so that they can easily be identified down the road. It may seem a bit obsessive compulsive at first, but there is logic behind the naming guidelines.&lt;/p&gt;
&lt;p&gt;[more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_searching-names"&gt;Searching Names&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_why-names-are-important"&gt;Why Names Are Important&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_group-policies"&gt;Group Policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_regulatory-compliance"&gt;Regulatory Compliance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_resources-should-use-logical-names"&gt;Resources Should Use Logical Names&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_characters-allowed-in-names"&gt;Characters Allowed In Names&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_token-combination-schemes"&gt;Token Combination Schemes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_token-types"&gt;Token Types&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_airport-codes"&gt;Airport Codes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_building-codes-or-numbers"&gt;Building Codes Or Numbers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_machine-type-or-roles"&gt;Machine Type Or Roles&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_machine-numbers"&gt;Machine Numbers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_user-names"&gt;User Names&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="h1_searching-names"&gt;Searching Names&lt;/h1&gt;
&lt;h2 id="h2_why-names-are-important"&gt;Why Names Are Important&lt;/h2&gt;
&lt;p&gt;The name of a system is only important for a few reasons. The most common is when you need to access a resource on the system and you need to know the DNS name. In secure environments, system logs record the machine where services are open or running, or they record the machines used to access other resources on the network. These become important for auditing requirements certain regulatory compliance laws. The next most common is the name used for system admin purposes when managed from other services.&lt;/p&gt;
&lt;h2 id="h2_group-policies"&gt;Group Policies&lt;/h2&gt;
&lt;p&gt;Microsoft&amp;rsquo;s Active Directory allows applying group policies to certain machines.&amp;nbsp; It&amp;rsquo;s a bit easier if all the same type of machine have a similar pattern.&lt;/p&gt;
&lt;h2 id="h2_regulatory-compliance"&gt;Regulatory Compliance&lt;/h2&gt;
&lt;p&gt;Many of the recent laws including PCI DSS Compliance, Sarbanes Oxley, Gramm-Leach-Bliley Act (GLBA), HIPPA, and the Fair Credit Reporting Act require the auditing and logging of access to secure resources. Having a consistent machine naming convention makes it much easier to identify and process the information.&lt;/p&gt;
&lt;h1 id="h1_resources-should-use-logical-names"&gt;Resources Should Use Logical Names&lt;/h1&gt;
&lt;p&gt;Good server resources and network shares should be like &lt;a href="http://www.w3.org/Provider/Style/URI"&gt;URls that don&amp;rsquo;t change&lt;/a&gt;. The most common situation I&amp;rsquo;ve seen over the years is putting installation resources on a server, then over time, the network share is moved or the server changes name and then when workstations need to update, reinstall, the path to the original resource is no longer valid and it&amp;rsquo;s difficult to configure where to search for the new one.&amp;nbsp; This is due to the fact that quite a bit of software (including Microsoft&amp;rsquo;s) embeds in the registry the original installation path.&lt;/p&gt;
&lt;p&gt;The problem can be avoided by creating a DNS name that is separate from the physical name of the server.&amp;nbsp; For example, if the copies of all CD software is on a server, create a CDSW.domain.com DNS entry, then create a share on the server and you can move it to another server easily without having to re-configure the workstations.&amp;nbsp; The same technique can be used with a Distributed Files System (DFS).&amp;nbsp; I recommend the DNS approach because in the circumstances where I&amp;rsquo;ve seen DFS used in an Active Directory environment, it becomes impossible nearly to remove or move a DFS share if one of the servers holding the share happens to be down.&lt;/p&gt;
&lt;h1 id="h1_characters-allowed-in-names"&gt;Characters Allowed In Names&lt;/h1&gt;
&lt;p&gt;Physical names ultimately convert to &lt;abbr title="Domain Name System"&gt;DNS &lt;a href="http://en.wikipedia.org/wiki/Domain_Name_System"&gt;domain names&lt;/a&gt;&lt;/abbr&gt; and have limits on the characters that can be included in the name. Allowed characters include the ASCI &lt;abbr title="Letters, Digits, Hyphen"&gt;LDH&lt;/abbr&gt; set: &lt;strong&gt;A..Z&lt;/strong&gt;, &lt;strong&gt;0..9&lt;/strong&gt;, and &lt;strong&gt;-&lt;/strong&gt; (hyphen or dash).&lt;/p&gt;
&lt;h1 id="h1_token-combination-schemes"&gt;Token Combination Schemes&lt;/h1&gt;
&lt;p&gt;Defining the name format in a way it can be parsed and broken into tokens will give tremendous flexibility down the road. Organizations will go through buyouts, mergers, or reorganizations every few years. A well planned naming scheme should be able to remain consistent despite these changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/strong&gt; I&amp;rsquo;ve added spaces to the examples below to aid in readability. Spaces aren&amp;rsquo;t permitted characters in real device names.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;{string} {number}&lt;/li&gt;
&lt;li&gt;{string} - {string}&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These two patterns can be extended and chained together. Keeping the tokens of strings are separated by numbers or hyphens gives a lot of flexibility for future expansion without breaking things already in place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; I don&amp;rsquo;t recommend using &lt;em&gt;N&lt;/em&gt; characters or &lt;em&gt;N&lt;/em&gt; numbers. These always are ignored at some point and cause limitations (when store # 1000 is opened and you have a three number scheme). Using some leading zeros can help with making some of the number a little bit more readable though (i.e. svr001, svr032)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;{IATA} - {Building} {Floor} {Office} - {Workstation Role} {Workstation #}&lt;/li&gt;
&lt;li&gt;{IATA} - {Building Type} {Building #} {Workstation Role} {Workstation #}&lt;/li&gt;
&lt;li&gt;{IATA} - {Workstation Role} {Workstation #}&lt;/li&gt;
&lt;li&gt;{IATA} - {User} - {Device Role} {Device #}&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_token-types"&gt;Token Types&lt;/h1&gt;
&lt;h2 id="h2_airport-codes"&gt;Airport Codes&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s often helpful to characterize a device&amp;rsquo;s physical name with it&amp;rsquo;s physical location. The airline industry has a convention using unique airport locator codes that I&amp;rsquo;ve used that is helpful in tracking devices. Airport locator codes include &lt;abbr title="International Air Transport Association"&gt;IATA&lt;/abbr&gt; codes and are mostly unique three letter codes and the &lt;abbr title="International Civil Aviation Organization"&gt;ICAO&lt;/abbr&gt; provides unique four letter codes.&lt;/p&gt;
&lt;p&gt;Usually the nearest international airport is unique enough for most organizations I&amp;rsquo;ve seen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KRDU &lt;/strong&gt;&amp;ndash; ICAO for Raleigh, Durham Airport&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDU&lt;/strong&gt; &amp;ndash; IATA for Raleigh, Durham Airport&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_building-codes-or-numbers"&gt;Building Codes Or Numbers&lt;/h2&gt;
&lt;p&gt;Adding a building name or number, floor, and office number can be helpful in identifying and locating a machine. If you decide to include a floor and office, I recommend using some string to differentiate the token 2314 could be office 314 on the second floor or office fourteen on the twenty third floor. F23O14 seems pretty clear to me.&lt;/p&gt;
&lt;p&gt;This works fine for physical equipment that doesn&amp;rsquo;t move often like routers, firewalls, hubs and such. I don&amp;rsquo;t recommend this for user workstations. Users will move frequently and any scheme that takes a users building and floor location into place is going to be obsolete in three to six months.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;{Building} {Building # } &amp;ndash; S1433 (Store 1433), W27 (Warehouse 27), O23, B8 (&lt;/li&gt;
&lt;li&gt;{Floor} - FL2&lt;/li&gt;
&lt;li&gt;{Office} &amp;ndash; O22&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Don&amp;rsquo;t us HQ as a building type.&amp;nbsp; Mergers and buyouts will change this at some point and cause conflicts.&lt;/p&gt;
&lt;h1 id="h1_machine-type-or-roles"&gt;Machine Type Or Roles&lt;/h1&gt;
&lt;p&gt;Using a dictionary of preferred machine types helps when collecting inventory, or multiple administrators are involved on a network.&amp;nbsp; Some sample machine types&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AP &amp;ndash; Access Point&lt;/li&gt;
&lt;li&gt;RTR &amp;ndash; Router&lt;/li&gt;
&lt;li&gt;SWT &amp;ndash; Switch&lt;/li&gt;
&lt;li&gt;DC &amp;ndash; Domain Controller&lt;/li&gt;
&lt;li&gt;WKS &amp;ndash; Workstation&lt;/li&gt;
&lt;li&gt;LT - Laptop&lt;/li&gt;
&lt;li&gt;SVR - Server&lt;/li&gt;
&lt;li&gt;DB &amp;ndash; Database Server&lt;/li&gt;
&lt;li&gt;WEB &amp;ndash; Web Server&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_machine-numbers"&gt;Machine Numbers&lt;/h2&gt;
&lt;p&gt;Giving between two and four digits for numbers to a machine name is useful, but sometimes confusing.&amp;nbsp; Let&amp;rsquo;s see, was the web server on SVR13 or SVR12?&amp;nbsp; I&amp;rsquo;ve seen various names used to help folks instead.&amp;nbsp; Anything from Sleepy, Dopey, and the other dwarves to Donald and Mickey. I still have found that using some role and number is easiest, then using a DNS name for easy access for resources seems to work best.&lt;/p&gt;
&lt;h2 id="h2_user-names"&gt;User Names&lt;/h2&gt;
&lt;p&gt;Because user names have to be unique in a company, user machines can often be named after the user.&amp;nbsp; Using a suffix like WKS for workstations or LT for laptops is helpful when users have both.&lt;/p&gt;
&lt;h1 id="h1_references"&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/Domain_Name_System" href="http://en.wikipedia.org/wiki/Domain_Name_System"&gt;Domain Name System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/International_Civil_Aviation_Organization_airport_code" href="http://en.wikipedia.org/wiki/International_Civil_Aviation_Organization_airport_code"&gt;ICAO International Civil Aviation Organization Airport Codes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/IATA_Airport_Code" href="http://en.wikipedia.org/wiki/IATA_Airport_Code"&gt;IATA International Air Transport Association Airport Codes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.skygod.com/asstd/abc.html" href="http://www.skygod.com/asstd/abc.html"&gt;An Explanation of Airport Identifier Codes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>tips</category>
  <category>domain-names</category>
  <category>pci-dss</category>
  <category>sarbanes-oxley</category>
  <category>hippa</category>
  <category>glba</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/network-names-for-systems/</guid>
  <pubDate>Wed, 15 Apr 2009 03:58:39 GMT</pubDate>
</item>
<item>
  <title>Growth of Target</title>
  <link>https://tim-stanley.com/post/growth-of-target/</link>
  <description>&lt;p&gt;Target has grown since 1962 to over 1600 stores.&amp;nbsp; &lt;a href="http://projects.flowingdata.com"&gt;Flowing Data&lt;/a&gt; illustrates the growth of new Target stores over time.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://projects.flowingdata.com/target/"&gt;&lt;img style="display: inline; border: 0px;" title="image" src="/image?picture=WindowsLiveWriter/GrowthofTarget_14E53/image_3.png" alt="image" width="484" height="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>interesting</category>
  <category>interesting</category>
  <category>target</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/growth-of-target/</guid>
  <pubDate>Wed, 15 Apr 2009 03:47:20 GMT</pubDate>
</item>
<item>
  <title>Pretty Good URLs</title>
  <link>https://tim-stanley.com/post/pretty-good-urls/</link>
  <description>&lt;p&gt;With a little forethought and planning, it&amp;rsquo;s possible to create URLs that can be around the web for a long time and as Tim Berners-Lee pointed out &lt;a href="http://www.w3.org/Provider/Style/URI.html"&gt;cool URIs don't change&lt;/a&gt;.&amp;nbsp; Choose wisely though, you may have to live with the URLs for much longer than you think, or if your not careful, you may end up with too many URLs pointing to the same content. [more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_domains-without-www"&gt;Domains Without WWW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_urls-without-extensions"&gt;URLs Without Extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_rewriting-url-extensions"&gt;Rewriting URL Extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_distinct-urls"&gt;Distinct URLs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_adding-trailing-slashes"&gt;Adding Trailing Slashes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_use-dashes-not-spaces-for-words"&gt;Use Dashes Not Spaces For Words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_best-practices"&gt;Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="h1_domains-without-www"&gt;Domains Without WWW&lt;/h1&gt;
&lt;p&gt;The first part of the URL includes the domain which may or may not include the www sub domain.&amp;nbsp; Leaving out the www as part of the domain name makes it easier for users to type.&amp;nbsp; However, removing the www sub domain has some technical side effects.&amp;nbsp; Using no sub domain in the URL means that cookies will be shared across all sub domains and cookies will be sent on all requests (including requests for static content).&amp;nbsp; Large cookies can lead to slightly more traffic and &lt;a href="http://developer.yahoo.com/performance/rules.html#cookie_free" target="_blank" rel="noopener"&gt;slower content processing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Weather using the www sub domain or not, the non preferred URL domain should be redirected by performing a 301 redirect to the preferred URL domain. This keeps search engines clear on the preferred URL and keeps from splitting inbound link counts on search engines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tim-stanley.com/"&gt;http://tim-stanley.com/&lt;/a&gt; (no www sub domain)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tim-stanley.com/"&gt;http://www.tim-stanley.com/&lt;/a&gt; (redirects to &lt;a href="http://tim-stanley.com/"&gt;http://tim-stanley.com/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_urls-without-extensions"&gt;URLs Without Extensions&lt;/h1&gt;
&lt;p&gt;File extensions don&amp;rsquo;t add value to users.&amp;nbsp; They are there for the server (and programmers) benefit.&amp;nbsp; Removing the need for the extension on a content only URL I believe helps users and helps with any long term migration issues.&amp;nbsp; Content on an Apache server running php may be on an IIS server running ASP.NET in the future and vice-versa.&amp;nbsp; Users shouldn&amp;rsquo;t have to know they have to specify .htm, .php, or .aspx after a name.&lt;/p&gt;
&lt;p&gt;The biggest problem with removing extensions is what to decide to do with old content and how to create rules to rewrite the URL as needed.&amp;nbsp; For the longest time, Apache had an advantage over IIS 5/6 in this regard, but with IIS7 and the URL rewrite module, that has changed.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t allow two URLs with and without extensions to point to the same content.&amp;nbsp; If you do decide to remove the required extensions, use a 301 redirect from the old to the new URL to ensure search engines only recognize one URL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;http://example.com/post/Nikon-Lens-Rentals.aspx&lt;/em&gt;&amp;nbsp; &lt;br&gt;becomes &lt;em&gt;http://example.com/post/Nikon-Lens-Rentals&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;http://example.com/post/Nikon-Lens-Rentals.html&amp;nbsp; &lt;br&gt;&lt;/em&gt;becomes &lt;em&gt;http://example.com/post/Nikon-Lens-Rentals&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_rewriting-url-extensions"&gt;Rewriting URL Extensions&lt;/h1&gt;
&lt;p&gt;In the same way that extensions can be removed, extensions can be rewritten to a different file type.&amp;nbsp; HTM or HTML is the most common destination type and masks the internal type (.php, .aspx, etc.) and technology used to drive a site.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;http://example.com/post/Nikon-Lens-Rentals.aspx&lt;/em&gt;&amp;nbsp; &lt;br&gt;becomes &lt;em&gt;http://example.com/post/Nikon-Lens-Rentals.htm&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_distinct-urls"&gt;Distinct URLs&lt;/h1&gt;
&lt;p&gt;The URLs should be distinct.&amp;nbsp; A well though out structure can provide a clean ability to rewrite the URL should the platform be moved in the future.&amp;nbsp; The path and the URL should be distinct within the path.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/page/*&lt;/li&gt;
&lt;li&gt;/post/*&lt;/li&gt;
&lt;li&gt;/category/*&lt;/li&gt;
&lt;li&gt;/tag/*&lt;/li&gt;
&lt;li&gt;/product/*&lt;/li&gt;
&lt;li&gt;/authors/*&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_adding-trailing-slashes"&gt;Adding Trailing Slashes&lt;/h1&gt;
&lt;p&gt;References to a sites root path should always include a trialing slash.&amp;nbsp; If the trailing slash isn&amp;rsquo;t provided on the root of the site, when it&amp;rsquo;s referenced, both Apache and IIS servers will respond with a 301 redirect and it &lt;a href="http://dmiessler.com/study/hyperlink_trailing_slash/" target="_blank" rel="noopener"&gt;doubles the traffic for the request&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A trailing slash should not be added to a URL with a file extension (i.e. one should not use &lt;em&gt;http://example.com/post/Nikon-Lens-Rentals.aspx/&lt;/em&gt; ). Beyond the root path, it is arguable if a trailing slash should be added to URLs without extensions.&amp;nbsp; If trailing slashes are are added for a site, the site needs to take into account the scenarios when trailing slashes are not provided by users or referrers, and the site needs to perform a 301 redirect to the appropriate URL.&lt;/p&gt;
&lt;p&gt;Removing both the extensions and adding the trailing slashes means that the URL rewrite rules and handlers must be configured properly.&lt;/p&gt;
&lt;p&gt;In IIS 6, this was more difficult to do on a platform that was hosted because ISAPI rewrite components had to be added to the server.&amp;nbsp; Hosting providers rarely could offer this support on IIS6.&amp;nbsp; With IIS7, and the URL rewrite module, and other configuration settings, a developer can write an HTTP Module that handles and rewrites URL&amp;rsquo;s without requiring any special permissions.&lt;/p&gt;
&lt;p&gt;The search results from Yahoo and Microsoft Live search remove the slashes in the results displayed (although not from the actual destination links themselves) while Google search does not alter the slashes.&lt;/p&gt;
&lt;p&gt;ASP.NET MVC allows links with and without trailing slashes and users must code for the 301 redirects for the preferred URL or risk having duplicate content and cutting SEO rankings.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wordpress.org/" target="_blank" rel="noopener"&gt;Wordpress&lt;/a&gt; provides the ability to have links to all pages and posts with trailing slashes.&amp;nbsp; From what I read, &lt;a href="http://drupal.org/node/160753"&gt;Drupal wants to remove&lt;/a&gt; the trailing slashes.&lt;/p&gt;
&lt;p&gt;After some extensive research, I believe my preference is the combination of removing extensions and to append trailing slashes to URLs.&amp;nbsp; Even though I&amp;rsquo;m an avid .Net lover, I&amp;rsquo;ve never really liked the fact that some-page.aspx displays for a site running ASP.NET.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;My secondary preference would be to rewrite the file extension to .htm and not append the trailing slash.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t switch a site developed without trailing slashes to trailing slashes.&amp;nbsp; There will always be a million and one references internally that will never fully resolve correctly.&amp;nbsp; If appending trailing slashes is done, this needs to be done up front and at the beginning of development before a site goes live.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http://example.com/post/Nikon-Lens-Rentals/&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_use-dashes-not-spaces-for-words"&gt;Use Dashes Not Spaces For Words&lt;/h1&gt;
&lt;p&gt;When creating a title for a page, separating the words with something appropriate and readable.&amp;nbsp; Some approaches I&amp;rsquo;ve seen use the underscore character.&amp;nbsp; This becomes difficult to discern because most URLs have some form of underline when displayed.&lt;/p&gt;
&lt;p&gt;Other approaches I&amp;rsquo;ve seen use &lt;a href="http://en.wikipedia.org/wiki/Camel_case"&gt;Camel Case&lt;/a&gt;.&amp;nbsp; The latter becomes difficult to read when case is ignored (CamelCase becomes camelcase).&amp;nbsp; This can also lead to some unanticipated interpretations when words run together (think Speed Of Art).&lt;/p&gt;
&lt;p&gt;The link with spaces &lt;em&gt;http://example.com/post/Nikon%20Lens%20Rentals.aspx&lt;/em&gt; (%20 = spaces) is inherently more difficult to read and type by hand than one where words are separated by dashes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;http://example.com/post/Nikon-Lens-Rental.aspx&lt;/em&gt; (dashes)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_best-practices"&gt;Best Practices&lt;/h1&gt;
&lt;p&gt;These apply to externally facing URLs.&amp;nbsp; URLs used for administration or not available to the general public don&amp;rsquo;t require this level of URL&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Be practical.&amp;nbsp; Changing URLs strategies may likely break a lot of stuff and it&amp;rsquo;s a lot of work to get 100% all scenarios right.&lt;/li&gt;
&lt;li&gt;Choose URLs with distinct patterns (/category/*, /post/*, /page/*, etc.).&lt;/li&gt;
&lt;li&gt;URL&amp;rsquo;s without extensions are preferred.&amp;nbsp; If extensions are needed, use .htm or .html.&lt;/li&gt;
&lt;li&gt;Use Dashes not spaces to separate words in URLs.&lt;/li&gt;
&lt;li&gt;Pick a www sub domain strategy and stick with it and redirect to the alternative.&lt;/li&gt;
&lt;li&gt;Always put a trailing slash on the domain reference (i.e. &lt;a href="http://tim-stanley.com/"&gt;http://tim-stanley.com/&lt;/a&gt; ).&lt;/li&gt;
&lt;li&gt;Always put the trailing slash on directories.&lt;/li&gt;
&lt;li&gt;Never include the index page in the URL (default.htm, index.html, default.asp, default.aspx).&lt;/li&gt;
&lt;li&gt;Pick a trailing slash strategy and stick with it and redirect the alternative URL with / without the trailing slash to the proper target URL.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Astute readers may note that this site at the time may not have pretty URLs with all the best practices in place.&amp;nbsp; The chief reason; it&amp;rsquo;s a lot of work to remove extensions and get URL 301 redirects for older inbound links working correctly for all features on a site.&amp;nbsp; I knew this when I started the site, but I couldn&amp;rsquo;t fine a good URL rewriting solution on IIS6 at the time.&amp;nbsp; Now the site has moved to IIS7, I have a solution, but I&amp;rsquo;m not confident of all the redirect and the impact it will have on searches.&lt;/p&gt;
&lt;p&gt;However, if your starting a new site, In my opinion, it&amp;rsquo;s good to start off with planned good clean and pretty URLs and it will be easier to maintain down the road.&lt;/p&gt;
&lt;h1 id="h1_references"&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.w3.org/Provider/Style/URI.html"&gt;Cool URIs don't change&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.alistapart.com/articles/slashforward/" href="http://www.alistapart.com/articles/slashforward/"&gt;Slash Forward (Some URLs are Better Than Others)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.useit.com/alertbox/990321.html" href="http://www.useit.com/alertbox/990321.html"&gt;URLs as UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.mattcutts.com/blog/seo-advice-url-canonicalization/" href="http://www.mattcutts.com/blog/seo-advice-url-canonicalization/"&gt;SEO advice: URL canonicalization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="Uniform Resource Identifier (URI): Generic Syntax" href="http://labs.apache.org/webarch/uri/rfc/rfc3986.html"&gt;http://labs.apache.org/webarch/uri/rfc/rfc3986.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://simonwillison.net/2007/Feb/4/urls/" href="http://simonwillison.net/2007/Feb/4/urls/"&gt;Why you should be using disambiguated URLs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.w3.org/TR/webarch/"&gt;Architecture of the World Wide Web, Volume One&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier" href="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier"&gt;Uniform Resource Identifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/URL" href="http://en.wikipedia.org/wiki/URL"&gt;Uniform Resource Locator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/URL_normalization" href="http://en.wikipedia.org/wiki/URL_normalization"&gt;URL Normalization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://sebastians-pamphlets.com/thou-must-not-steal-the-trailing-slash-from-my-urls/" href="http://sebastians-pamphlets.com/thou-must-not-steal-the-trailing-slash-from-my-urls/"&gt;Why storing URLs with truncated trailing slashes is an utterly idiocy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://dmiessler.com/study/hyperlink_trailing_slash/" href="http://dmiessler.com/study/hyperlink_trailing_slash/"&gt;The Hyperlink Trailing Slash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.hanselman.com/blog/ASPNETMVCAndTheNewIIS7RewriteModule.aspx" href="http://www.hanselman.com/blog/ASPNETMVCAndTheNewIIS7RewriteModule.aspx"&gt;ASP.NET MVC and the new IIS7 Rewrite Module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.ytechie.com/2008/10/aspnet-mvc-what-about-seo.html" href="http://www.ytechie.com/2008/10/aspnet-mvc-what-about-seo.html"&gt;http://www.ytechie.com/2008/10/aspnet-mvc-what-about-seo.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://stackoverflow.com/questions/486621/when-should-one-use-a-www-subdomain/486982" href="http://stackoverflow.com/questions/486621/when-should-one-use-a-www-subdomain/486982"&gt;When should one use a &amp;lsquo;www&amp;rsquo; subdomain?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://no-www.org/" href="http://www.org"&gt;No-www.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://developer.yahoo.com/performance/rules.html#cookie_free" href="http://developer.yahoo.com/performance/rules.html#cookie_free" target="_blank" rel="noopener"&gt;http://developer.yahoo.com/performance/rules.html#cookie_free&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://sebastians-pamphlets.com/how-to-seo-sanitize-a-wordpress-theme/" href="http://sebastians-pamphlets.com/how-to-seo-sanitize-a-wordpress-theme/"&gt;SEO-sanitizing a WordPress theme in 5 minutes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Permalink"&gt;http://en.wikipedia.org/wiki/Permalink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Mod_rewrite"&gt;http://en.wikipedia.org/wiki/Mod_rewrite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>asp-net</category>
  <category>visual-studio</category>
  <category>urls</category>
  <category>web-development</category>
  <category>mvc</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/pretty-good-urls/</guid>
  <pubDate>Fri, 13 Mar 2009 22:33:00 GMT</pubDate>
</item>
<item>
  <title>Multi Post User Control</title>
  <link>https://tim-stanley.com/post/multi-post-user-control/</link>
  <description>&lt;p&gt;Trailing on the lead from Chris Blankenship and his &lt;a href="http://www.dscoduc.com/post/2008/10/29/Display-SinglePost-User-Control.aspx"&gt;singlepost user control&lt;/a&gt;, I created a multi-post user control.&amp;nbsp; I&amp;rsquo;ve never been quite satisfied with the results of the recent posts control and Chris&amp;rsquo;s control filled in enough gaps for me to pursue this further. [more]&lt;/p&gt;
&lt;p&gt;I happen to keep my custom controls in /UserCustom instead of /UserControls.&amp;nbsp; That way, I know these controls are not Blog Engine.Net controls and won&amp;rsquo;t need to be merged in the future.&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_example"&gt;Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_usage-from-asp"&gt;Usage from ASP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_usage-in-posts-or-pages"&gt;Usage in Posts or Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_postcs-add-authorabsolutelink"&gt;Post.cs Add AuthorAbsoluteLink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_download"&gt;Download&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="h1_example"&gt;Example&lt;/h1&gt;
&lt;pre&gt;&lt;code class="language-cshtml"&gt;
[ usercontrol: ~/UC/ItemList.ascx ShowDescription=true; Count=3; 
ShowContent=false; ShowAuthor=false; ShowDate=false; ShowTitle=true; 
ContentLength=120; CategoryList=photography; DateFormat={0:MM/dd/yyyy};]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_usage-from-asp"&gt;Usage from ASP&lt;/h1&gt;
&lt;pre&gt;&lt;code class="&amp;quot;language-cshtml"&gt;
&amp;lt;%@ Register src="../../UserCustom/MultiPosts.ascx" tagname="MultiPosts" tagprefix="uc7" %&amp;gt;

&amp;lt;uc7:MultiPosts ID="MultiPosts1" runat="server" 
CategoryList="photography" 
ContentLength="120" 
Count="3" 
DateFormat="{0:MM/dd/yyyy}" 
ShowAuthor="false" 
ShowContent="true"
ShowDate="false"
ShowDescription="true"
ShowTitle="true" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_usage-in-posts-or-pages"&gt;Usage in Posts or Pages&lt;/h1&gt;
&lt;p&gt;Remove the space between the bracket and the word usercontrol.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cshtml"&gt;
[ usercontrol: ~/UserCustom/MultiPosts.ascx 
ShowDescription=true; 
Count=3; 
ShowContent=false; 
ShowAuthor=true; 
ShowDate=true; 
ShowTitle=true; 
ContentLength=360; 
CategoryList=photography; 
DateFormat={0:MM/dd/yyyy}; ]
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_postcs-add-authorabsolutelink"&gt;Post.cs Add AuthorAbsoluteLink&lt;/h1&gt;
&lt;p&gt;In order to reduce some of the clutter in the ASCX control template, I created a new property on the Post object to display the Authors link.&amp;nbsp; If you want to stay with the mainline BE code base, you&amp;rsquo;ll need to modify the ASCX to set the &lt;em&gt;asp:Hyperlink&lt;/em&gt; for &lt;em&gt;AuthorLink&lt;/em&gt; to the code shown below.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
public Uri AuthorAbsoluteLink
{
    get
    {
        string authorLink = Utils.RemoveIllegalCharacters(Author);
        authorLink = Utils.RelativeWebRoot + "author/" + HttpContext.Current.Server.UrlEncode(authorLink) + BlogSettings.Instance.FileExtension;
        return Utils.ConvertToAbsolute(authorLink);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_download"&gt;Download&lt;/h1&gt;
&lt;p&gt;&lt;a href="/file.axd?file=2009%2f3%2fUserCustom.zip"&gt;UserCustom.zip (2.37 kb)&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>blogengine-net</category>
  <category>visual-studio</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/multi-post-user-control/</guid>
  <pubDate>Wed, 11 Mar 2009 17:57:00 GMT</pubDate>
</item>
<item>
  <title>Nikon Lens Rentals</title>
  <link>https://tim-stanley.com/post/nikon-lens-rentals/</link>
  <description>&lt;p&gt;Before you spend nearly $2000 for a fantastic lens, you may want to rent it to see if it&amp;rsquo;s really worth it.&amp;nbsp; If you rent this for a week, you can rent this Nikon 70-200mm f2.8 for almost $10 / day. If you can&amp;rsquo;t afford to own all the &lt;a href="http://tim-stanley.com/post/Best-High-End-Nikon-Lenses-2008.aspx"&gt;Best High End Nikon Lenses&lt;/a&gt;, you can still borrow them for a few days for those special occasions when you need the perfect lens. [more]&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.adorama.com/NK70200AFSU.html?kbid=62978"&gt;&lt;img style="display: inline; border-width: 0px;" title="Nikon 70-200mm f2.8" src="/image?picture=WindowsLiveWriter/NikonLensRentals_14EDE/70-200_3.jpg" alt="Nikon 70-200mm f2.8" width="500" height="246" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve not used these companies, but the Flickr groups list several sources.&amp;nbsp; Calumet and Lens Rentals.com come up often with positive comments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.adoramarentals.com/?kbid=62978"&gt;Adorama Rentals&lt;/a&gt; (New York, NY)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.calumetphoto.com/"&gt;Calumet&lt;/a&gt; (Bensenville, IL)&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.lenslenders.com/" href="http://www.lenslenders.com/"&gt;Lens Lenders.com&lt;/a&gt; (Canada)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lensrentals.com/"&gt;Lens Rentals.com&lt;/a&gt; (Cordova, TN)&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.rentglass.com/" href="http://www.rentglass.com/"&gt;Rent Glass.com&lt;/a&gt; (Celebration, FL)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.secrents.com"&gt;Southeastern Camera Rentals&lt;/a&gt; (Raleigh, NC)&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.ziplens.com/" href="http://www.ziplens.com/"&gt;Zip Lens.com&lt;/a&gt; (Brookline, MA)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Rate Comparison&lt;/h1&gt;
&lt;p&gt;I&amp;rsquo;ve listed below a summary of rates found as of March 2009 for a Nikon 70-200mm f/2.8 lens.&lt;/p&gt;
&lt;table border="0" cellspacing="0" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Source&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Day Rate&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Weekly Rate&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;Adorama Rentals&lt;/td&gt;
&lt;td valign="top"&gt;$30&lt;/td&gt;
&lt;td valign="top"&gt;$150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;Calumet&lt;/td&gt;
&lt;td valign="top"&gt;$35&lt;/td&gt;
&lt;td valign="top"&gt;$105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;Lens Lenders&lt;/td&gt;
&lt;td valign="top"&gt;none&lt;/td&gt;
&lt;td valign="top"&gt;$149&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;Lens Rentals&lt;/td&gt;
&lt;td valign="top"&gt;none&lt;/td&gt;
&lt;td valign="top"&gt;$82 (insured)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;Rent Glass&lt;/td&gt;
&lt;td valign="top"&gt;none&lt;/td&gt;
&lt;td valign="top"&gt;$54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;Southeastern Camera&lt;/td&gt;
&lt;td valign="top"&gt;$30&lt;/td&gt;
&lt;td valign="top"&gt;$120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;Zip Lens&lt;/td&gt;
&lt;td valign="top"&gt;none&lt;/td&gt;
&lt;td valign="top"&gt;$60&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>nikon</category>
  <category>photography</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/nikon-lens-rentals/</guid>
  <pubDate>Wed, 04 Mar 2009 03:24:00 GMT</pubDate>
</item>
<item>
  <title>15 Online Photo Editors</title>
  <link>https://tim-stanley.com/post/15-online-photo-editors/</link>
  <description>&lt;p&gt;Cnet has an article &lt;a href="http://news.cnet.com/8301-17939_109-10170333-2.html"&gt;comparing 15 online photo editors&lt;/a&gt;.&amp;nbsp; The best part is most of them are free. [more]&lt;/p&gt;
&lt;p&gt;The list includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.flauntr.com/flauntr/"&gt;Flauntr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fotoflexer.com/"&gt;Fotoflexer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lunapic.com/editor/"&gt;Lunapic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phixr.com/"&gt;Phixr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aviary.com/tools/phoenix"&gt;Phoenix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.photoshop.com/"&gt;Photoshop.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.picnik.com/"&gt;Picnik &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.picture2life.com/"&gt;Picture2Life&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pixenate.com/"&gt;Pixenate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pixer.us/"&gt;Pixer.us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pixlr.com/"&gt;Pixlr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://snipshot.com/"&gt;Snipshot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.splashup.com/"&gt;Splashup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>photography</category>
  <category>tools</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/15-online-photo-editors/</guid>
  <pubDate>Thu, 26 Feb 2009 22:32:19 GMT</pubDate>
</item>
<item>
  <title>2008 Theme Pack</title>
  <link>https://tim-stanley.com/post/2008-theme-pack/</link>
  <description>&lt;p&gt;The BlogEngine.Net 2008 theme pack was released at the end of last year with 13 new themes. [more]&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.codeplex.com/blogengine/Release/ProjectReleases.aspx?ReleaseId=14988"&gt;BlogEngine releases&lt;/a&gt;.&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_newspaper11"&gt;NewsPaper1.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_sapiensnet"&gt;Sapiens.Net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_scruffy"&gt;Scruffy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_stablestart"&gt;Stablestart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_techjunkie"&gt;Techjunkie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_triathlon"&gt;Triathlon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_wildnature"&gt;Wildnature&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_biblescholar"&gt;BibleScholar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_envision"&gt;Envision&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_extensive"&gt;Extensive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_fresh"&gt;Fresh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_greyshadow"&gt;Greyshadow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_interlude"&gt;Interlude&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="h1_newspaper11"&gt;NewsPaper1.1&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=Newspaper1.1"&gt;&lt;img style="display: inline; border: 0px;" title="Newspaper 1.1 theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_3.png" alt="Newspaper 1.1 theme" width="244" height="465" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_sapiensnet"&gt;Sapiens.Net&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=Sapiens.Net"&gt;&lt;img style="display: inline; border: 0px;" title="Sapiens.Net theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_6.png" alt="Sapiens.Net theme" width="244" height="592" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_scruffy"&gt;Scruffy&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=Scruffy"&gt;&lt;img style="display: inline; border: 0px;" title="Scuffy theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_11.png" alt="Scuffy theme" width="244" height="610" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_stablestart"&gt;Stablestart&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=Stablestart"&gt;&lt;img style="display: inline; border: 0px;" title="Stablestart theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_29.png" alt="Stablestart theme" width="244" height="401" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_techjunkie"&gt;Techjunkie&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=Techjunkie"&gt;&lt;img style="display: inline; border: 0px;" title="Techjunkie theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_15.png" alt="Techjunkie theme" width="244" height="610" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_triathlon"&gt;Triathlon&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=Triathlon"&gt;&lt;img style="display: inline; border: 0px;" title="Triathlon theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_19.png" alt="Triathlon theme" width="244" height="465" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_wildnature"&gt;Wildnature&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=Wildnature"&gt;&lt;img style="display: inline; border: 0px;" title="Wildnature theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_22.png" alt="Wildnature theme" width="244" height="547" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_biblescholar"&gt;BibleScholar&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=BibleScholar"&gt;&lt;img style="display: inline; border: 0px;" title="BibleScholar theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_25.png" alt="BibleScholar theme" width="244" height="733" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_envision"&gt;Envision&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=Envision"&gt;&lt;img style="display: inline; border: 0px;" title="Envision theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_28.png" alt="Envision theme" width="244" height="598" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_extensive"&gt;Extensive&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=Extensive"&gt;&lt;img style="display: inline; border: 0px;" title="Extensive theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_32.png" alt="Extensive theme" width="244" height="345" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_fresh"&gt;Fresh&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=Fresh"&gt;&lt;img style="display: inline; border: 0px;" title="Fresh theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_35.png" alt="Fresh theme" width="244" height="592" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_greyshadow"&gt;Greyshadow&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=Greyshadow"&gt;&lt;img style="display: inline; border: 0px;" title="Greyshadow theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_38.png" alt="Greyshadow theme" width="244" height="385" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_interlude"&gt;Interlude&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://tim-stanley.com/Blog.aspx?theme=Interlude"&gt;&lt;img style="display: inline; border: 0px;" title="Interlude theme" src="/image?picture=WindowsLiveWriter/2008ThemePack_F24B/image_41.png" alt="Interlude theme" width="244" height="827" border="0"&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>themes</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/2008-theme-pack/</guid>
  <pubDate>Thu, 26 Feb 2009 22:19:55 GMT</pubDate>
</item>
<item>
  <title>IE 6 Support Discontinued</title>
  <link>https://tim-stanley.com/post/ie-6-support-discontinued/</link>
  <description>&lt;p&gt;As of February 2009, I am discontinuing mainline support for new or updated sites for IE 6 and older IE versions.&amp;nbsp; There are enough known and documented issues in how IE 6 treats CSS that make it cost prohibitive to keep IE 6 as part of the mainstream browsers for customers while also supporting newer browsers and their features. [more]&lt;/p&gt;
&lt;p&gt;For the most part, I find that 90% or more of design elements display acceptably in IE 6 (albeit differently than other browsers) and that spending the extra effort for known / documented IE 6 browser issues and trying to create hacks for an older and dying browser to get an exact replica of the page is not a good investment. Customers that desire specific IE 6 support and testing of designs on I E6 will be based on an open ended time and material basis.&amp;nbsp; At the end of the day, if a customer wants to pay the significant costs to support IE 6, I will do so, but the cost of resolving IE 6 specific issues will need to be covered entirely by the customer.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Yahoo, Google, 37 Signals, and other companies have announced similar decisions regarding either limited or discontinued IE6 support.&amp;nbsp; &lt;a href="http://www.hanselman.com/blog/IE6WarningStopLivingInThePastGetOffOfIE6.aspx"&gt;Scott Hanselman&lt;/a&gt; of Microsoft even talks about coaxing users to get off IE 6 onto a newer browser.&lt;/p&gt;
&lt;h1&gt;Who Does This Affect?&lt;/h1&gt;
&lt;p&gt;As of February 2009, IE6 users range from 11% to 25% of sites I maintain.&amp;nbsp; For the most part, indicators are that the bulk of IE6 users are corporate users that don't have the ability to upgrade because of internal incompatibilities for web sites that don't look well on IE 7.&lt;/p&gt;
&lt;h1&gt;What Does It Affect?&lt;/h1&gt;
&lt;p&gt;IE6 has several documented &lt;a href="http://www.quirksmode.org/css/contents.html"&gt;CSS Compatibility&lt;/a&gt; differences from other browsers.&amp;nbsp; The areas I see that most commonly affect designs are listed below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;box model - IE6 calculates a size of a box differently than other browsers.&amp;nbsp; This is the largest portion of the issue for sites as layouts in IE6 will look different than other browsers.&amp;nbsp; There are of course workarounds, but these come at a price of additional effort and incompatibility with other browsers.&lt;/li&gt;
&lt;li&gt;display - Multi-column layouts using float where widths in IE6 are more narrow than other browsers.&amp;nbsp; This causes columns to appear at the bottom of pages instead of on the right side.&lt;/li&gt;
&lt;li&gt;:hover, :active is not available on certain elements in IE6&lt;/li&gt;
&lt;li&gt;:before, :after are not supported in IE6&lt;/li&gt;
&lt;li&gt;min-width, max-width: height&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Browsers Supported&lt;/h1&gt;
&lt;p&gt;This may change as browser market share change, but for now the following browsers and versions will be supported for 2009.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/IE6SupportDiscontinued_10077/ie7_logo_3.jpg" alt="ie7 logo" width="58" height="60" border="0" /&gt; &lt;a href="http://www.microsoft.com/windows/downloads/ie/getitnow.mspx"&gt;Internet Explorer 7&lt;/a&gt;, &lt;a href="http://www.microsoft.com/windows/Internet-explorer/beta/default.aspx"&gt;Internet Explorer 8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/IE6SupportDiscontinued_10077/logo-only_3.png" alt="firefox logo" width="63" height="60" border="0" /&gt;&lt;a href="http://www.mozilla.com/en-US/firefox/all-older.html"&gt;Firefox 2&lt;/a&gt;, &lt;a href="http://www.mozilla.com/en-US/firefox/"&gt;Firefox 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/IE6SupportDiscontinued_10077/icon_safari_60x60_3.png" alt="safari logo" width="60" height="60" border="0" /&gt; &lt;a href="http://www.apple.com/safari/"&gt;Safari 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Other Browsers Not Supported&lt;/h1&gt;
&lt;p&gt;Chrome (3%) and Opera (1%) do not have enough browser traffic to warrant support at this time.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/IE6SupportDiscontinued_10077/google-chrome-logo-300x271_3.png" alt="google chrome logo" width="66" height="60" border="0" /&gt; &lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/IE6SupportDiscontinued_10077/Opera5_t_3.png" alt="opera logo" width="69" height="60" border="0" /&gt; &lt;a href="http://www.opera.com/download/"&gt;Opera 9&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://www.quirksmode.org/css/contents.html" href="http://www.quirksmode.org/css/contents.html"&gt;http://www.quirksmode.org/css/contents.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.hanselman.com/blog/IE6WarningStopLivingInThePastGetOffOfIE6.aspx" href="http://www.hanselman.com/blog/IE6WarningStopLivingInThePastGetOffOfIE6.aspx"&gt;http://www.hanselman.com/blog/IE6WarningStopLivingInThePastGetOffOfIE6.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://developer.yahoo.com/yui/articles/gbs/" href="http://developer.yahoo.com/yui/articles/gbs/"&gt;http://developer.yahoo.com/yui/articles/gbs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://yuiblog.com/blog/2009/01/28/gbs-update-20090128/" href="http://yuiblog.com/blog/2009/01/28/gbs-update-20090128/"&gt;http://yuiblog.com/blog/2009/01/28/gbs-update-20090128/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://37signals.blogs.com/products/2008/07/basecamp-phasin.html" href="http://37signals.blogs.com/products/2008/07/basecamp-phasin.html"&gt;http://37signals.blogs.com/products/2008/07/basecamp-phasin.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>internet-explorer</category>
  <category>vista</category>
  <category>xp</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/ie-6-support-discontinued/</guid>
  <pubDate>Tue, 24 Feb 2009 22:17:00 GMT</pubDate>
</item>
<item>
  <title>Hawk Eyes</title>
  <link>https://tim-stanley.com/post/hawk-eyes/</link>
  <description>&lt;p&gt;There are several hawks that hunt near the house.&amp;nbsp;&amp;nbsp; In the spring we often see the young hawks getting a few lessons from the parents.&amp;nbsp; This weekend this one landed on a tree right off the living room.&amp;nbsp; He looked intently to and fro for some time, turning his head at every subtle noise in search of a later afternoon meal.&amp;nbsp; When a flock of crows flew over, they quickly spotted him and called out to one another warning of the predator. [more]&lt;/p&gt;
&lt;div id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:ade0861e-fa42-495b-ad91-e2a85e853b3c" class="wlWriterSmartContent" style="display: inline; float: left; margin: 0px; padding: 0px;"&gt;&lt;a href="/image?picture=WindowsLiveWriter/Hawk_8503/DSC_3328-8x6.JPG" rel="thumbnail"&gt;&lt;img src="/image?picture=WindowsLiveWriter/Hawk_8503/DSC_3328_3.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:d60a7f4e-c408-442c-98e3-bf8532ce50ef" class="wlWriterSmartContent" style="display: inline; float: left; margin: 0px; padding: 0px;"&gt;&lt;a href="/image?picture=WindowsLiveWriter/Hawk_8503/DSC_3329-8x6.JPG" rel="thumbnail"&gt;&lt;img src="/image?picture=WindowsLiveWriter/Hawk_8503/DSC_3329_4.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:164ae3af-11d4-4101-bd94-4df82e229af5" class="wlWriterSmartContent" style="display: inline; float: left; margin: 0px; padding: 0px;"&gt;&lt;a href="/image?picture=WindowsLiveWriter/Hawk_8503/DSC_3330-8x6.JPG" rel="thumbnail"&gt;&lt;img src="/image?picture=WindowsLiveWriter/Hawk_8503/DSC_3330_4.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>photography</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/hawk-eyes/</guid>
  <pubDate>Mon, 23 Feb 2009 22:13:00 GMT</pubDate>
</item>
<item>
  <title>How To Restart ASP.Net Applications</title>
  <link>https://tim-stanley.com/post/how-to-restart-aspnet-applications/</link>
  <description>&lt;p&gt;Many times, from an administration perspective, it's desirable to restart an ASP.NET web site without restarting IIS on the whole server. [more]&lt;/p&gt;
&lt;p&gt;One quick way to do this is to leverage the fact that the application has a cache dependency on the Web.Config file.&amp;nbsp; Writing to the Web.Config file will cause IIS to restart the ASP.NET application.&amp;nbsp; We can also leverage the fact that changing the last update time on the Web.Config will also force a restart of the application.&lt;/p&gt;
&lt;p&gt;This will clear all cache and tracing information and has an obvious impact on performance and should only be done from an administration security controlled page.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
String szXMLFile;
szXMLFile = System.Web.HttpRuntime.AppDomainAppPath;
szXMLFile += "Web.Config";
File.SetLastWriteTime(szXMLFile, System.DateTime.Now);
&lt;/code&gt;&lt;/pre&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>asp-net</category>
  <category>iis</category>
  <category>iis7</category>
  <category>visual-studio</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/how-to-restart-aspnet-applications/</guid>
  <pubDate>Mon, 23 Feb 2009 19:50:00 GMT</pubDate>
</item>
<item>
  <title>Vista For Retail</title>
  <link>https://tim-stanley.com/post/vista-for-retail/</link>
  <description>&lt;p&gt;Having recently used Vista for about a month now, I&amp;rsquo;d like to provide some feedback on Vista&amp;rsquo;s use in Retail for POS.&lt;/p&gt;
&lt;p&gt;In the same way that lower end versions of XP were not suitable for a multi-POS environment because of networking, security, and remote access features that are needed, Vista has similar considerations. Below is a comparable list of XP Versions and Vista Versions suitable for a retail multi-POS environment. [more]&lt;/p&gt;
&lt;h1&gt;Windows XP Versions&lt;/h1&gt;
&lt;p&gt;Not recommended for Retail multi-POS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XP Home Edition&lt;/li&gt;
&lt;li&gt;XP Media Center Edition&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Has the necessary features for Retail multi-POS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XP Professional&lt;/li&gt;
&lt;li&gt;XP Embedded (Must include Pro versions of networking, Windows Installer and WMI)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Windows Vista Versions&lt;/h1&gt;
&lt;p&gt;Not recommended for Retail multi-POS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vista Starter&lt;/li&gt;
&lt;li&gt;Vista Home Basic&lt;/li&gt;
&lt;li&gt;Vista Home Premium&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Has the necessary features for Retail multi-POS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vista Business (Comparable to XP Professional)&lt;/li&gt;
&lt;li&gt;Vista Business for Embedded Systems&lt;/li&gt;
&lt;li&gt;Vista Enterprise (Comparable to Vista Business + Bitlocker &amp;amp; Encryption)&lt;/li&gt;
&lt;li&gt;Vista Enterprise for Embedded Systems&lt;/li&gt;
&lt;li&gt;Vista Ultimate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vista 32 bit is limited to 3.5 GB of memory. Vista 64 bit allows up to 128 GB of memory, but I&amp;rsquo;ve heard reports of Vista 64 bit driver availability or conflicts that may be an issue (particularly with OPOS peripherals). Benchmarks reportedly run faster on the 64 bit version of Vista.&lt;/p&gt;
&lt;h1&gt;Vista Considerations For Retail&lt;/h1&gt;
&lt;p&gt;Vista introduces some differences in networking, administration, and security.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UAC &amp;ndash; User Access Control is required for administration privileges (but can be turned off)&lt;/li&gt;
&lt;li&gt;Vista provides encrypted files for some versions, good for PCI and other security related laws and guidelines&lt;/li&gt;
&lt;li&gt;Backup of data and files are more complex&lt;/li&gt;
&lt;li&gt;Many OPOS drivers are not listed as supporting Vista&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/windows/windows-vista/compare-editions/default.aspx"&gt;http://www.microsoft.com/windows/windows-vista/compare-editions/default.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_Vista_editions"&gt;http://en.wikipedia.org/wiki/Windows_Vista_editions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_Vista"&gt;http://en.wikipedia.org/wiki/Windows_Vista&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/windows/windows-vista/compare-editions/compare-to-windows-xp.aspx"&gt;http://www.microsoft.com/windows/windows-vista/compare-editions/compare-to-windows-xp.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_Vista_networking_technologies"&gt;http://en.wikipedia.org/wiki/Windows_Vista_networking_technologies&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>software</category>
  <category>vista</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/vista-for-retail/</guid>
  <pubDate>Tue, 03 Feb 2009 06:17:00 GMT</pubDate>
</item>
<item>
  <title>Vista Can't Find DNS Servers With Check Point</title>
  <link>https://tim-stanley.com/post/vista-cant-find-dns-servers-with-check-point/</link>
  <description>&lt;p&gt;I've had problems from day one with VPN Connections on Vista Ultimate Service Pack 1 returning a default gateway 0.0.0.0 and it couldn't resolve any DNS lookups.&lt;/p&gt;
&lt;p&gt;I purchased a new &lt;a href="/post/Dell-Laptop-XPS-M1530.aspx"&gt;Dell XPS M1530&lt;/a&gt;&amp;nbsp; in December of 2008.&amp;nbsp; It seems like a fine machine, but the Vista networking issues have troubled me like a cancer.&amp;nbsp; It's been one of those nagging problems that I never had enough time to fully investigate and resolve. I finally found the annoying issue was with Check Point Secure Client / Secure Remote software. [more]&lt;/p&gt;
&lt;p&gt;For the security work I'm doing for a big name Fortune 100 company, I had to install Check Point Secure Client software.&amp;nbsp; It seems Secure Client wants to block finding DNS servers.&amp;nbsp; I had issues at home, Issues at the office, Issues with VPN connections.&amp;nbsp; I had no end to issues finding systems on any network.&lt;/p&gt;
&lt;h1&gt;Do Not Check Check Point Secure Remote&lt;/h1&gt;
&lt;p&gt;It turns out one of the main issues was resolved by disabling Check Point Secure Remote on the LAN, Wireless, and VPN connections.&amp;nbsp; I had the same problem on an XP system on Friday and someone found the answer was to turn off the wireless.&amp;nbsp; For that system, we had no issues in the office, but countless when trying to connect looking up DNS names at home.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/VistaCantFindDNSServers_1464E/Vista%20Wireless_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/VistaCantFindDNSServers_1464E/Vista%20Wireless_thumb.jpg" alt="Vista Wireless" width="196" height="244" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;That still didn't fix the &lt;a href="http://en.wikipedia.org/wiki/BSOD"&gt;BSOD&lt;/a&gt; issues on Vista though.&amp;nbsp; Maybe Microsoft can fix some of the remaining networking issues on Windows 7.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>software</category>
  <category>vista</category>
  <category>xp</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/vista-cant-find-dns-servers-with-check-point/</guid>
  <pubDate>Tue, 03 Feb 2009 06:00:00 GMT</pubDate>
</item>
<item>
  <title>Dell Laptop XPS M1530</title>
  <link>https://tim-stanley.com/post/dell-laptop-xps-m1530/</link>
  <description>&lt;p&gt;I purchased a new Dell XPS M1530 laptop at the end of 2008.&amp;nbsp; I've grown to prefer desktops for the preferred improvements in reliability, cost, and performance, not to mention I use a 22" LCD monitor.&amp;nbsp; I really didn't want a laptop. Nevertheless, I was working on a contract that was going to require quite a bit of traveling and using the desktop on the road wasn't an option and the old Toshiba laptop I had was on it's last CPU cycles. [more]&lt;/p&gt;
&lt;p&gt;After putting together several desktops and laptops over the years I knew I wanted several key things in the new system:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A fast disk&lt;/li&gt;
&lt;li&gt;A graphics processor separate from the main processor&lt;/li&gt;
&lt;li&gt;A fast dual core processor&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I did some research some time ago in compiling ASP.NET projects (Visual Studio .net 2003).&amp;nbsp; After some careful measurements on servers, and multiple workstations, I found two factors were important for developers compiling hefty ASP.NET solutions and projects that utilized database access.&amp;nbsp; First, multiple CPU's, hyper-threading, or dual core or quad core systems were critical for improved compiler performance.&amp;nbsp; Second, the fastest possible hard disk was a very important if not primary factor in compile times.&amp;nbsp; Celeron processors just won't cut it (never give a developer that you hope to achieve any actual compiling a celeron processor).&lt;/p&gt;
&lt;p&gt;SCSI disks seem expensive, but if you compare the cost over the course of the 3-5 year period a system will be used for compiling code, it's actually a great savings.&amp;nbsp; You'll get more compiles from the same developer, find more bug fixes, and run more tests over the course of time.&amp;nbsp; At software developer rates, fast SCIS disks are a bargain.&amp;nbsp; SCSI 15K, or 10K RPM disks with the fasted R/W IO speeds are preferred.&amp;nbsp; Over the last year or two, I've seen some 10K RPM SATA disks that can provide acceptable results as well.&amp;nbsp; They don't quite match the SCSI speeds, but they are a good improvement over the 7200 RPM disks.&amp;nbsp; The next desktop system I build will likely include one of these 10K RPM SATA disks.&lt;/p&gt;
&lt;p&gt;Scott Guthrie mentions some of the same finding that disk IO speed is critical for ASP.NET compilation in his tip &lt;a title="http://weblogs.asp.net/scottgu/archive/2007/11/01/tip-trick-hard-drive-speed-and-visual-studio-performance.aspx" href="http://weblogs.asp.net/scottgu/archive/2007/11/01/tip-trick-hard-drive-speed-and-visual-studio-performance.aspx"&gt;Hard Dive Speed And Visual Studio Performance&lt;/a&gt;.&amp;nbsp; If your an ASP.NET software developer you may also want to see &lt;a title="http://weblogs.asp.net/scottgu/archive/2006/09/22/tip_2f00_trick_3a00_-optimizing-asp.net-2.0-web-project-build-performance-with-vs-2005.aspx" href="http://weblogs.asp.net/scottgu/archive/2006/09/22/tip_2f00_trick_3a00_-optimizing-asp.net-2.0-web-project-build-performance-with-vs-2005.aspx"&gt;Optimizing Web Project Build Performance&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Dell XPS M1530 Specifications&lt;/h1&gt;
&lt;p&gt;I opted for a Dell XPS M1530.&amp;nbsp; It had the following specifications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel T9300 2.5 Ghz Core 2 Duo processor (800 Mhz FSB, 6M L2 Cache)&lt;/li&gt;
&lt;li&gt;4 GB 667 Mhz DDR2 memory&lt;/li&gt;
&lt;li&gt;250 GB 7200 RPM SATA 9.5mm Fujitsu Hard Disk with Free Fall Sensor&lt;/li&gt;
&lt;li&gt;NVIDIA GeForce 8600M GT 256 MB Graphics adapater&lt;/li&gt;
&lt;li&gt;Wireless N&lt;/li&gt;
&lt;li&gt;15.4" 1440x900 LCD glossy monitor&lt;/li&gt;
&lt;li&gt;Vista Home Premium (I upgraded to Ultimate)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;System 1- Dell 370 Workstation&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Intel Pentium HT 3.0 Ghz CPU&lt;/li&gt;
&lt;li&gt;Seagate 3146707 SCSI 167 MB 10K RPM Hard Disk&lt;/li&gt;
&lt;li&gt;Seagate 373453 SCSI 67 MB 15K RPM Hard Disk&lt;/li&gt;
&lt;li&gt;NVIDIA Quatro 64 MB Dual Display Adapter&lt;/li&gt;
&lt;li&gt;2 GB Memory&lt;/li&gt;
&lt;li&gt;Windows XP Professional&lt;/li&gt;
&lt;li&gt;22" LG 1680 x 1050 W226WTQ LCD Monitor&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;System 2 - Intel Motherboard&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Intel Pentium HT 3.2 Ghz CPU&lt;/li&gt;
&lt;li&gt;NVIDIA GE Force 7300 GS s128 MB Dual Display Adapter&lt;/li&gt;
&lt;li&gt;Seagate 3146707L SCSI 167 MB 10K RPM Hard Disk&lt;/li&gt;
&lt;li&gt;Seagate 340810 32MB 10K RPM Hard Disk&lt;/li&gt;
&lt;li&gt;2 GB Memory&lt;/li&gt;
&lt;li&gt;Windows XP Professional&lt;/li&gt;
&lt;li&gt;22" LG 1680 x 1050 LCD W2252TQ Monitor&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;The Laptop Experience&lt;/h1&gt;
&lt;p&gt;The desktops I had were somewhat old, but no slouch.&amp;nbsp; With the dual monitors and the fast disks, I was never lacking for anything.&amp;nbsp; The net of the laptop experience has been very positive.&amp;nbsp; I've event switched to using it as my primary desktop for most circumstances.&amp;nbsp; The notes below aren't an exact side by side scientific comparison, but there are notable differences between the two systems.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On CPU intensive task comparisons of the laptop with the older systems, the laptop wins.&lt;/li&gt;
&lt;li&gt;On DISK intensive task comparisons (side by side compiles), the desktop with SCSI disks are about 20% faster.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I don't fancy carrying the laptop back and forth to work much, but it's light and it is handy to have wireless.&amp;nbsp; I like wireless much more than I thought and if I plug in an external keyboard, mouse, and my 22" monitor, I have everything I had before and then some.&lt;/p&gt;
&lt;h1&gt;The Vista Experience&lt;/h1&gt;
&lt;p&gt;Everything with Vista has not been rosy.&amp;nbsp; I've had numerous network issues, a Blue Screen Of Death on multiple occasions and some problems getting connected to network printers. My overall recommendation for Vista; pass on it if you can - &lt;strong&gt;go with Windows XP Professional and wait for Windows 7.&lt;/strong&gt; If you have to get Vista in a corporate environment, you'll want Business, Enterprise or Ultimate.&amp;nbsp; Vista needlessly cripples some of the networking capabilities (like blocking DNS name lookups) even on Home Premium.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Disk Backup is worse (I even upgraded to Ultimate), see &lt;a title="http://www.dscoduc.com/post/2009/01/16/File-Level-Backups-for-VistaWin2k8.aspx" href="http://www.dscoduc.com/post/2009/01/16/File-Level-Backups-for-VistaWin2k8.aspx"&gt;File Level Backups for Vista&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;UAC is annoying (I turned UAC off,&amp;nbsp; see &lt;a title="http://lifehacker.com/software/vista/windows-vista-tip--disable-annoying-need-your-permission-to-continue+-prompts-230866.php" href="http://lifehacker.com/software/vista/windows-vista-tip--disable-annoying-need-your-permission-to-continue+-prompts-230866.php"&gt;Disable Annoying Need Your Permission To Continue Prompts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I've had to upgrade several applications like Symantec Endpoint, Snagit, and Checkpoint&lt;/li&gt;
&lt;li&gt;Networking access to shares, printers, and drivers is worse (much worse, okay, &lt;strong&gt;unacceptable&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Switching between wireless connections (home, office, hotel, coffee shop, etc.) is better on Vista than XP&lt;/li&gt;
&lt;li&gt;Vista SCSI support for my disk controllers doesn't exist, so I couldn't upgrade the desktops to Vista even if I wanted to&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I know a lot of new features went into Vista.&amp;nbsp; It &lt;em&gt;could&lt;/em&gt; have been a much better experience.&amp;nbsp; The driver issues, BSOD and network connectivity issues put things back to the WFW 1995 era (or before) and are plainly just unacceptable.&lt;/p&gt;
&lt;p&gt;Following the post from &lt;a href="http://blog.madskristensen.dk/post/im-not-dead-yet.aspx" target="_blank" rel="noopener"&gt;Mads Kristensen on his configuration and Vista score&lt;/a&gt;, I thought I'd post my information on the Vista Windows Experience Index.&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/DellLaptopXPSM1530_FE8E/image_3.png" alt="image" width="464" height="181" border="0" /&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>interesting</category>
  <category>vista</category>
  <category>xp</category>
  <category>dell</category>
  <category>laptop</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/dell-laptop-xps-m1530/</guid>
  <pubDate>Mon, 02 Feb 2009 05:47:00 GMT</pubDate>
</item>
<item>
  <title>Best Nikon Remotes</title>
  <link>https://tim-stanley.com/post/best-nikon-remotes/</link>
  <description>&lt;p&gt;Which remote works with which Nikon? Most new Nikon cameras don't come with a remote control.&amp;nbsp; Some camera bodies will work with multiple remotes (wired and wireless), but unlike the legendary Nikon interchangeable lenses, the remotes don't switch between camera bodies so easily.&amp;nbsp; Here's a quick guide on which remotes work with which cameras and what's the best Nikon remote for your camera. [more]&lt;/p&gt;
&lt;p&gt;I've listed compatibility where I could find information on the remotes and cameras. Please check the camera user guide to ensure the remote is compatible with your camera before purchasing the remote. All of these remotes can be found at &lt;a href="http://www.bhphotovideo.com/" target="_blank" rel="noopener"&gt;B&amp;amp;H Photo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If it works with your camera, the ML-L3 wins the prize for the best remote.&amp;nbsp; It's cheap and it works with most Nikon cameras.&lt;/p&gt;
&lt;p&gt;All photos courtesy Nikon. All prices are as of January 2009.&lt;/p&gt;
&lt;h1&gt;ML-L3&lt;/h1&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/4730_ML-L3-Wireless-Remote-Control-(Infrared)_2.jpg"&gt;&lt;img style="border: 0px;" src="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/4730_ML-L3-Wireless-Remote-Control-(Infrared)_thumb.jpg" alt="4730_ML-L3-Wireless-Remote-Control-(Infrared)" width="240" height="204" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The ML L3 is a wireless infrared remote.&amp;nbsp; The camera must be switched to "remote shutter mode" to allow the remote to operate with the camera.&amp;nbsp; There are no instructions with the remote.&amp;nbsp; Check your camera user guide for any instructions (Page 38 for D80 users).&amp;nbsp; Works in timer delay, and non timer delay mode (the manual calls this quick response mode).&amp;nbsp; When set for bulb exposure, press once to activate and a second time to release.&amp;nbsp; There must be a clear line of sight from the remote to the camera. It comes with a small case that can attach to the neck strap.&amp;nbsp; The required CR-2025 3v battery comes with the remote.&lt;/p&gt;
&lt;p&gt;The D80 when set to "remote" shutter mode,&amp;nbsp; by default will revert to the normal shutter mode after a period of time (about 60 seconds) if the remote hasn't been pressed.&amp;nbsp; This can get confusing if you wait too long to fire shots using the remote.&amp;nbsp; This can be altered changing the &lt;em&gt;&lt;strong&gt;Remote on duration&lt;/strong&gt;&lt;/em&gt; to a longer value (1 min., 5 min., 10 min. or 15 min.).&lt;/p&gt;
&lt;p&gt;If you use bulb exposure, I recommend setting the &lt;em&gt;&lt;strong&gt;Exp. delay mode&lt;/strong&gt;&lt;/em&gt; to on.&amp;nbsp; This helps remove any vibration caused by the shutter opening.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price And Compatibility:&lt;/strong&gt; ML-L3&amp;nbsp;&lt;a title="Nikon ML-L3 remote at B&amp;amp;H Photo" href="http://www.bhphotovideo.com/c/product/207373-USA/Nikon_4730_ML_L3_Remote_Control_Transmitter.html" target="_blank" rel="noopener"&gt;$16.95&lt;/a&gt;: D90, D80, D60, D50, D40x, D40, D70, D70s, N65, N75, F65, Pronea S, Nuvis S, Lite Touch 110s, 130 ED, Coolpix 8400, Coolpix 8800&lt;/p&gt;
&lt;h1&gt;MC-DC1&lt;/h1&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/25326-MC-DC1_Remote_Release_front_2.jpg"&gt;&lt;img style="border: 0px;" src="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/25326-MC-DC1_Remote_Release_front_thumb.jpg" alt="25326-MC-DC1_Remote_Release_front" width="240" height="204" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The MC-DC1 remote is a wired remote with a small USB type connector on the end.&amp;nbsp; It has the ability to lock in place to keep a shutter open for long exposures.&amp;nbsp;&amp;nbsp; On the D80, simply plug it in and press the button.&amp;nbsp; The camera does not have to be in any special mode to operate it.&amp;nbsp; The MC-DC1 has the ability to press and hold and lock to set the exposure so you don't have to keep the button pressed.&amp;nbsp; Great for those starry night sky shots.&lt;/p&gt;
&lt;p&gt;If you use bulb exposure, I recommend setting the &lt;em&gt;&lt;strong&gt;Exp. delay mode&lt;/strong&gt;&lt;/em&gt; to on.&amp;nbsp; This helps remove any vibration caused by the shutter opening.&lt;/p&gt;
&lt;p&gt;The remote comes in two similar but different versions, the MC-DC1 and MC-DC2. What's the difference between the MC-DC1 and MC-DC2?&amp;nbsp; I don't know, but reports are they are not cross compatible (i.e. the MC-DC2 will not work on the D80 and MC-DC1 will not work on the D90).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price And Compatibility: &lt;/strong&gt;MC-DC1 &lt;a title="Nikon MC-DC1 remote at B&amp;amp;H Photo" href="http://www.bhphotovideo.com/c/product/381577-REG/Nikon_25326_MC_DC1_Remote_Cord.html" target="_blank" rel="noopener"&gt;$24.95&lt;/a&gt;: D80, D70s&lt;/p&gt;
&lt;h1&gt;MC-DC2&lt;/h1&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/25395_MC-DC2-Remote-Cord_front_2.jpg"&gt;&lt;img style="border: 0px;" src="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/25395_MC-DC2-Remote-Cord_front_thumb.jpg" alt="25395_MC-DC2-Remote-Cord_front" width="240" height="204" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Just like the MC-DC1, but for the Nikon D90.&amp;nbsp; Reportedly does not work on the D80.&amp;nbsp; As of early 2009, the MC-DC2 is hard to find in stock.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price And Compatibility:&lt;/strong&gt; MC-DC2 &lt;a title="Nikon MC-DC2 remote at B&amp;amp;H Photo" href="http://www.bhphotovideo.com/c/product/580879-REG/Nikon_25395_MC_DC2_Remote_Cord_for.html" target="_blank" rel="noopener"&gt;$26.95&lt;/a&gt;: D90&lt;/p&gt;
&lt;h1&gt;MC-36&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/4917_MC_36_Multi_Function_Remote_Cord_front_2.jpg"&gt;&lt;img style="border: 0px;" src="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/4917_MC_36_Multi_Function_Remote_Cord_front_thumb.jpg" alt="4917_MC_36_Multi_Function_Remote_Cord_front" width="240" height="204" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The MC-36 is 10 pin remote and also will work as a timer and an &lt;a href="http://en.wikipedia.org/wiki/Intervalometer"&gt;intervalometer&lt;/a&gt; for time lapse photography.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price And Compatibility:&lt;/strong&gt; MC-36&amp;nbsp;&lt;a title="Nikon MC-36 remote at B&amp;amp;H Photo" href="http://www.bhphotovideo.com/c/product/407310-REG/Nikon_4917_MC_36_Multi_Function_Remote.html" target="_blank" rel="noopener"&gt;$129.95&lt;/a&gt;: D3X, D700, D300, D3, D200, D100, F6, F5, F100, N90, D2 series, D1 series&lt;/p&gt;
&lt;h1&gt;ML-3&lt;/h1&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/4645_ML-3-Modulite-Remote-Control-Set_front_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/4645_ML-3-Modulite-Remote-Control-Set_front_thumb.jpg" alt="4645_ML-3-Modulite-Remote-Control-Set_front" width="240" height="204" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Not to be confused with the ML-L3, this is a 10 pin remote with infrared wireless.&amp;nbsp; This can fire shots, remotely or if something passes between the transmitter and the receiver (for surveillance wildlife photography).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price And Compatibility:&lt;/strong&gt; ML-3 &lt;a title="Nikon ML-3 remote at B&amp;amp;H Photo" href="http://www.bhphotovideo.com/c/product/37754-USA/Nikon_4645_ML_3_Compact_Modulite_Remote.html" target="_blank" rel="noopener"&gt;$169.95&lt;/a&gt;: D3X, D700, D300, D3, D200, D100, F6, F5, F100, N90, D2 series, D1 series&lt;/p&gt;
&lt;h1&gt;MC-30&lt;/h1&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/4660_MC-30-Remote-Trigger-Release_front_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/4660_MC-30-Remote-Trigger-Release_front_thumb.jpg" alt="4660_MC-30-Remote-Trigger-Release_front" width="240" height="204" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another 10 pin remote, but wired.&amp;nbsp; Has a lock/hold capability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price And Compatibility:&lt;/strong&gt; MC-30 &lt;a href="http://www.bhphotovideo.com/c/product/108425-REG/Nikon_4660_MC_30_Remote_Cord.html" target="_blank" rel="noopener"&gt;$54.95&lt;/a&gt;: D3X, D700, D300, D3, D200, D100, F6, F5, F100, N90, D2 series, D1 series&lt;/p&gt;
&lt;h1&gt;MC-22 Remote Cord&lt;/h1&gt;
&lt;p&gt;&lt;a href="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/4652_MC-22-Remote-Cord-with-Banana-Plugs_front_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image?picture=WindowsLiveWriter/NikonRemotes_1073C/4652_MC-22-Remote-Cord-with-Banana-Plugs_front_thumb.jpg" alt="4652_MC-22-Remote-Cord-with-Banana-Plugs_front" width="240" height="204" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Not really a remote, but a cable with connectors to allow building your own remote or hooking it to other equipment.&amp;nbsp; This is a 10 pin connector.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price And Compatibility:&lt;/strong&gt; MC-22 cord &lt;a title="Nikon MC-22 remote cord at B&amp;amp;H Photo" href="http://www.bhphotovideo.com/c/product/37720-REG/Nikon_4652_MC_22_Motor_Remote_Cord.html" target="_blank" rel="noopener"&gt;$49.95&lt;/a&gt;, : D3X, D700, D300, D3, D200, D100, F6, F5, F100, N90, D2 series, D1 series&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://www.nikonusa.com/fileuploads/pdfs/DSLR_Compare_2008.pdf" href="http://www.nikonusa.com/fileuploads/pdfs/DSLR_Compare_2008.pdf"&gt;Nikon DSLR Comparison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nikonusa.com/Find-Your-Nikon/Photography-Accessories/Remote-Cords-And-Releases/index.page"&gt;Nikon Remotes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://forums.dpreview.com/forums/read.asp?forum=1034&amp;amp;message=29882276&amp;amp;q=MC+DC2&amp;amp;qf=m"&gt;MDC DC2 Modification for 2.5mm connector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.adorama.com/?kbid=62978" target="_blank" rel="noopener"&gt;Adorama&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bhphotovideo.com/?kbid=1925" target="_blank" rel="noopener"&gt;B&amp;amp;H Photo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>nikon</category>
  <category>photography</category>
  <category>remote</category>
  <category>wireless</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/best-nikon-remotes/</guid>
  <pubDate>Thu, 08 Jan 2009 00:08:31 GMT</pubDate>
</item>
<item>
  <title>Office Accounting Express 2009</title>
  <link>https://tim-stanley.com/post/office-accounting-express-2009/</link>
  <description>&lt;p&gt;Microsoft has a great deal for small business with a free version of Accounting Express 2009.&amp;nbsp; It can create estimates, invoices, track customer payments, set product and service pricing and can export and import data using Microsoft Excel formats, and can export to e-mails, Microsoft Word documents, or PDF files, and even sell items on eBay.&lt;/p&gt;
&lt;p&gt;You can &lt;a title="http://office.microsoft.com/en-us/accountingexpress/HA103347321033.aspx" href="http://office.microsoft.com/en-us/accountingexpress/HA103347321033.aspx"&gt;compare Microsoft Accounting 2009 versions&lt;/a&gt; to see if you would like the professional version which includes additional report, multi-user access, and the ability to track and bill for employee time. I've found the free Accounting Express 2009 version combined with the PayPal Outlook add-in provides everything I need.&amp;nbsp; It does require Microsoft office. [more]&lt;/p&gt;
&lt;p&gt;I looked at &lt;a href="http://www.freshbooks.com"&gt;Fresh Books&lt;/a&gt; and &lt;a href="http://www.blinksale.com/home"&gt;Blinksale&lt;/a&gt;, but Accounting Express 2009 provides the greatest functionality for the free cost.&lt;/p&gt;
&lt;p&gt;&lt;a title="http://office.microsoft.com/en-us/accountingexpress/FX101729681033.aspx" href="http://office.microsoft.com/en-us/accountingexpress/FX101729681033.aspx"&gt;Download Office Accounting Express 2009.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/OfficeAccountingExpress2009_B38C/image_2.png"&gt;&lt;img style="border: 0px none;" src="/image.axd?picture=WindowsLiveWriter/OfficeAccountingExpress2009_B38C/image_thumb.png" alt="image" width="244" height="170" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.blinksale.com/home"&gt;Blinksale&lt;/a&gt; - 3 invoices&amp;nbsp; month free&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.freshbooks.com"&gt;Fresh Books&lt;/a&gt; - 3 clients Free&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.simplybill.com"&gt;Simply Bill&lt;/a&gt; - $5 / month, 25 invoices / month&lt;/li&gt;
&lt;li&gt;&lt;a href="http://billingmanager.intuit.com/billing/welcome.url"&gt;Intuit Billing Manager&lt;/a&gt; - Free&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.vebio.com/" href="http://www.vebio.com/"&gt;Vebio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://onlinebusiness.about.com/od/financeaccounting/tp/web-based-invoicing.htm"&gt;Web Based Invoicing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sixrevisions.com/tools/20-invoicing-tools-web-designers"&gt;20 Invoicing Tools Web Designers&lt;/a&gt; - Six Revisions&lt;/li&gt;
&lt;li&gt;&lt;a href="http://alexking.org/blog/2005/08/23/online-invoicing"&gt;Online Invoicing&lt;/a&gt; - Alex King&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.onlinemerchantnetwork.com/inform/blog/article?blog.id=tech_integration&amp;amp;message.id=7"&gt;PayPal How-To: Three Accounting and Invoicing Solution Tips&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>software</category>
  <category>microsoft</category>
  <category>office</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/office-accounting-express-2009/</guid>
  <pubDate>Mon, 24 Nov 2008 17:46:00 GMT</pubDate>
</item>
<item>
  <title>Website Tags As Images</title>
  <link>https://tim-stanley.com/post/website-tags-as-images/</link>
  <description>&lt;p&gt;Sala has an interesting application (Java Applet) that will display the tags of a specific&amp;nbsp; &lt;a href="http://www.aharef.info/2006/05/websites_as_graphs.htm"&gt;Website as a graph or image&lt;/a&gt;.&amp;nbsp; The images are generated from the tags for a specific web page. [more]&lt;/p&gt;
&lt;p&gt;The link to create a new graph of a specific URL is: &lt;a title="http://www.aharef.info/static/htmlgraph/" href="http://www.aharef.info/static/htmlgraph/"&gt;http://www.aharef.info/static/htmlgraph/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The dots generated have specific color codes to indicate the types of tags on the site. A collection of sites and images are posted on &lt;a href="http://flickr.com"&gt;Flickr&lt;/a&gt; with the tag &lt;a href="http://flickr.com/photos/tags/websitesasgraphs/"&gt;websitesasgraphs&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;blue:&lt;/span&gt;&lt;/strong&gt; for links (the A tag)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: red;"&gt;red:&lt;/span&gt;&lt;/strong&gt; for tables (TABLE, TR and TD tags)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: green;"&gt;green:&lt;/span&gt;&lt;/strong&gt; for the DIV tag&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: #ff00ff;"&gt;violet:&lt;/span&gt;&lt;/strong&gt; for images (the IMG tag)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: yellow;"&gt;yellow:&lt;/span&gt;&lt;/strong&gt; for forms (FORM, INPUT, TEXTAREA, SELECT and OPTION tags)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: #ff8000;"&gt;orange:&lt;/span&gt;&lt;/strong&gt; for line breaks and block quotes (BR, P, and BLOCKQUOTE tags)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;black:&lt;/strong&gt; the HTML tag, the root node&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;span style="color: gray;"&gt;gray:&lt;/span&gt;&lt;/strong&gt; all other tags&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An image generated of &lt;a href="http://tim-stanley.com"&gt;http://tim-stanley.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/7913fc077401_D41F/image_2.png"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/7913fc077401_D41F/image_thumb.png" alt="Graph of tim-stanley.com" width="324" height="324" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>interesting</category>
  <category>interesting</category>
  <category>websites</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/website-tags-as-images/</guid>
  <pubDate>Fri, 17 Oct 2008 19:33:00 GMT</pubDate>
</item>
<item>
  <title>Silverlight 2.0 Released</title>
  <link>https://tim-stanley.com/post/silverlight-20-released/</link>
  <description>&lt;p&gt;On October 14, 2008, Microsoft released Silverlight 2.0, the cross-platform browser plug-in for both Macintosh and PC platforms.&lt;/p&gt;
&lt;p&gt;Silverlight includes several Rich Internet Application (&lt;acronym title="Rich Internet Application"&gt;RIA&lt;/acronym&gt;) features, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WPF UI Framework&lt;/li&gt;
&lt;li&gt;Rich Controls&lt;/li&gt;
&lt;li&gt;Rich&amp;nbsp; Networking Support&lt;/li&gt;
&lt;li&gt;Rich Base Class Library [more]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The controls include TextBox, CheckBox, RadioButton, ComboBox, StackPanel, Grid, Panel, Slider, ScrollViewer, Calendar, DatePicker, DataGrid, ListBox, and others.&lt;/p&gt;
&lt;p&gt;Downloads are available at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/info.aspx?na=22&amp;amp;p=1&amp;amp;SrcDisplayLang=en&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=&amp;amp;u=%2fdownloads%2fdetails.aspx%3fFamilyID%3d8d933343-038f-499c-986c-c3c7e87a60b3%26DisplayLang%3den"&gt;Microsoft Silverlight 2 SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/info.aspx?na=22&amp;amp;p=4&amp;amp;SrcDisplayLang=en&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=&amp;amp;u=%2fdownloads%2fdetails.aspx%3fFamilyID%3deb9b5c48-ba2b-4c39-a1c3-135c60bbbe66%26DisplayLang%3den"&gt;Expression Blend 2 SP1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/info.aspx?na=22&amp;amp;p=5&amp;amp;SrcDisplayLang=en&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=&amp;amp;u=%2fdownloads%2fdetails.aspx%3fFamilyID%3dc22d6a7b-546f-4407-8ef6-d60c8ee221ed%26DisplayLang%3den"&gt;Silverlight Tools for Visual Studio 2008 SP1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=119972"&gt;Silverlight 2 Developer Runtime (Windows)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=119973"&gt;Silverlight 2 Developer Runtime (Mac)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://weblogs.asp.net/scottgu/archive/2008/10/14/silverlight-2-released.aspx" href="http://weblogs.asp.net/scottgu/archive/2008/10/14/silverlight-2-released.aspx"&gt;Silverlight 2 Released - Scott Guthrie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.hanselman.com/blog/Silverlight2IsOut.aspx" href="http://www.hanselman.com/blog/Silverlight2IsOut.aspx"&gt;Silverlight 2 Is Out - hanselman.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://timheuer.com/blog/archive/2008/10/14/silverlight-2-released-officially.aspx" href="http://timheuer.com/blog/archive/2008/10/14/silverlight-2-released-officially.aspx"&gt;Silverlight 2 Released Officially - timheuer.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://silverlight.net/default.aspx" href="http://silverlight.net/default.aspx"&gt;silverlight.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>software</category>
  <category>net</category>
  <category>visual-studio</category>
  <category>microsoft</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/silverlight-20-released/</guid>
  <pubDate>Wed, 15 Oct 2008 21:21:00 GMT</pubDate>
</item>
<item>
  <title>BlogEngine.Net Expanding Categories And Tags</title>
  <link>https://tim-stanley.com/post/blogenginenet-expanding-categories-and-tags/</link>
  <description>&lt;p&gt;BlogEngine.Net provides the ability to selectively disclose information in the blog postings based on the configuration settings.&amp;nbsp; I took Dave Burke's concept on the &lt;a title="http://dbvt.com/blog/post/Flexible-Post-Excerpt-Display-with-BlogEngineNET.aspx" href="http://dbvt.com/blog/post/Flexible-Post-Excerpt-Display-with-BlogEngineNET.aspx"&gt;Flexible Post Excerpt Display&lt;/a&gt; and expanded it to include expansion of all categories and tags even if the ShowDescriptionInPost setting was set to true. [more]&lt;/p&gt;
&lt;p&gt;BlogEngine.Net expands data in a blog as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ShowDescriptionInPost = true&lt;/strong&gt;, shows the content in the description of the blog followed by [more].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ShowDescriptionInPost = false, BreakPost extension enabled&lt;/strong&gt;, shows the content of the blog entry until the [more] tag followed by the text [..more].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ShowDescriptionInPost = false, BreakPost extension disabled&lt;/strong&gt;, shows the content of the entire blog entry.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The new logic will override these settings and expand the category and tags, but still take into account the BreakPost extension logic.&amp;nbsp; If the description isn't present, the first 300 characters of the post are used.&lt;/p&gt;
&lt;h1&gt;Recommended Best Practices&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Always place a good description in the entry description section (excerpt).&lt;/li&gt;
&lt;li&gt;Always place a [more] tag around the first or second paragraph at the beginning of the entry.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The description section doesn't allow for formatted HTML or images, but expanding the description until the [more] tag does.&lt;/p&gt;
&lt;h1&gt;Core BlogSettings.cs changes&lt;/h1&gt;
&lt;p&gt;Add ExpandCategories and ExpandTags properties.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
/// &lt;summary&gt;
/// Expand categories if true. 
/// Overrides showDescriptionInPostList.
/// &lt;/summary&gt;
public bool ExpandCategories
{
    get { return expandCategories; } 
 
    set { expandCategories = value; }
}
 
/// &lt;summary&gt;
/// Expand tags if true. 
/// Overrides showDescriptionInPostList.
/// &lt;/summary&gt;
public bool ExpandTags
{
    get { return expandTags; }
 
    set { expandTags = value; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Admin Settings.aspx.cs Changes&lt;/h1&gt;
&lt;p&gt;Add the ability to update the new properties via the Admin Settings page.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
BlogSettings.Instance.ExpandCategories = cbExpandCategories.Checked;
BlogSettings.Instance.ExpandTags = cbExpandTags.Checked;
 
// In BindSettings()
cbExpandCategories.Checked = BlogSettings.Instance.ExpandCategories;
cbExpandTags.Checked = BlogSettings.Instance.ExpandTags;
 
// In btnSave_Click()
BlogSettings.Instance.ExpandCategories = cbExpandCategories.Checked;
BlogSettings.Instance.ExpandTags = cbExpandTags.Checked;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Admin Settings.aspx.cs Changes&lt;/h1&gt;
&lt;pre&gt;&lt;code class="language-cshtml"&gt;
&amp;lt;label for=&amp;quot;&amp;lt;%=cbExpandCategories.ClientID %&amp;gt;&amp;quot;&amp;gt;Expand Categories&amp;lt;/label&amp;gt;
&amp;lt;asp:CheckBox runat=&amp;quot;server&amp;quot; ID=&amp;quot;cbExpandCategories&amp;quot; /&amp;gt;&amp;lt;br /&amp;gt;
 
&amp;lt;label for=&amp;quot;&amp;lt;%=cbExpandTags.ClientID %&amp;gt;&amp;quot;&amp;gt;Expand Tags&amp;lt;/label&amp;gt;
&amp;lt;asp:CheckBox runat=&amp;quot;server&amp;quot; ID=&amp;quot;cbExpandTags&amp;quot; /&amp;gt;&amp;lt;br /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h1&gt;User controls/PostList.ascx.cs Changes&lt;/h1&gt;
&lt;p&gt;Use the logic for the new properties at display time (PostList).&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
postView.ShowExcerpt = BlogSettings.Instance.ShowDescriptionInPostList;
bool isCategoryPostList = false;
bool isTagPostList = false;
if (HttpContext.Current.Request.RawUrl.IndexOf("category") != -1)
{ 
    isCategoryPostList = true;
    postView.ShowExcerpt = !BlogSettings.Instance.ExpandCategories;
}
if (HttpContext.Current.Request.RawUrl.IndexOf("tag") != -1)
{
    isTagPostList = true;
    postView.ShowExcerpt = !BlogSettings.Instance.ExpandTags;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://dbvt.com/blog/post/Flexible-Post-Excerpt-Display-with-BlogEngineNET.aspx" href="http://dbvt.com/blog/post/Flexible-Post-Excerpt-Display-with-BlogEngineNET.aspx"&gt;Flexible Post Excerpt Display&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>blogengine-net</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/blogenginenet-expanding-categories-and-tags/</guid>
  <pubDate>Tue, 07 Oct 2008 02:19:31 GMT</pubDate>
</item>
<item>
  <title>Common HTML Markup</title>
  <link>https://tim-stanley.com/post/common-html-markup/</link>
  <description>&lt;p&gt;Everyone that writes content on the web should know a little &lt;abbr title="Hyper Text Markup Language"&gt;HTML&lt;/abbr&gt;.&amp;nbsp; This is my cheat sheet for the most common used HTML elements I've seen that are supported in multiple browsers, tools, and &lt;abbr title="Content Management Systems"&gt;CMS&lt;/abbr&gt; software. [more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_text-structure"&gt;Text Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_html-elements"&gt;HTML Elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_lists"&gt;Lists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_tables"&gt;Tables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_content-formatting"&gt;Content Formatting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_elements-to-avoid"&gt;Elements To Avoid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_style-preferences"&gt;Style Preferences&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_head-elements"&gt;Head Elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_doctype"&gt;DocType&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="h1_text-structure"&gt;Text Structure&lt;/h1&gt;
&lt;p&gt;&lt;a title="block quote" href="http://reference.sitepoint.com/blockquote"&gt;blockquote&lt;/a&gt;, &lt;a title="line break" href="http://reference.sitepoint.com/br"&gt;br&lt;/a&gt;, &lt;a title="header level 1" href="http://reference.sitepoint.com/h1"&gt;h1&lt;/a&gt;, &lt;a title="header level 2" href="http://reference.sitepoint.com/h2"&gt;h2&lt;/a&gt;, &lt;a title="header level 3" href="http://reference.sitepoint.com/h3"&gt;h3&lt;/a&gt;, &lt;a title="header level 4" href="http://reference.sitepoint.com/h4"&gt;h4&lt;/a&gt;, &lt;a title="header level 5" href="http://reference.sitepoint.com/h5"&gt;h5&lt;/a&gt;, &lt;a title="header level 6" href="http://reference.sitepoint.com/h6"&gt;h6&lt;/a&gt;, &lt;a title="paragraph" href="http://reference.sitepoint.com/p"&gt;p&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A pessimist is one who makes difficulties of his opportunities and an optimist is one who makes opportunities of his difficulties.&lt;/p&gt;
&lt;p&gt;Harry S. Truman&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;blockquote cite="http://www.brainyquote.com/quotes/authors/h/harry_s_truman.html"&amp;gt;
    &amp;lt;p&amp;gt;A pessimist is one who makes difficulties of his opportunities 
    and an optimist is one who makes opportunities of his difficulties.&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Harry S. Truman&amp;lt;/p&amp;gt;
&amp;lt;/blockquote&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_html-elements"&gt;HTML Elements&lt;/h1&gt;
&lt;p&gt;&lt;a title="anchor" href="http://reference.sitepoint.com/a"&gt;a&lt;/a&gt;, &lt;a title="abbreviation" href="http://reference.sitepoint.com/abbr"&gt;abbr&lt;/a&gt;, &lt;a title="acronym" href="http://reference.sitepoint.com/acronym"&gt;acronym&lt;/a&gt;, &lt;a title="code" href="http://reference.sitepoint.com/code"&gt;code&lt;/a&gt;, &lt;a title="deleted content" href="http://reference.sitepoint.com/del"&gt;del&lt;/a&gt;, &lt;a title="emphasis (italic)" href="http://reference.sitepoint.com/em"&gt;em&lt;/a&gt;, &lt;a title="inserted content" href="http://reference.sitepoint.com/ins"&gt;ins&lt;/a&gt;, &lt;a title="image" href="http://reference.sitepoint.com/img"&gt;img&lt;/a&gt;, &lt;a title="preformatted text" href="http://reference.sitepoint.com/pre"&gt;pre&lt;/a&gt;, &lt;a title="subscript" href="http://reference.sitepoint.com/sub"&gt;sub&lt;/a&gt;, &lt;a title="superscript" href="http://reference.sitepoint.com/sup"&gt;sup&lt;/a&gt;, &lt;a title="strike through" href="http://reference.sitepoint.com/strike"&gt;strike&lt;/a&gt;, &lt;a title="strong (bold)" href="http://reference.sitepoint.com/strong"&gt;strong&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The image element (&lt;a title="image" href="http://reference.sitepoint.com/img"&gt;img&lt;/a&gt;) should include an alt="" attribute that is a description of the image.&lt;/li&gt;
&lt;li&gt;Declining in use; &lt;a title="bold" href="http://reference.sitepoint.com/b"&gt;b&lt;/a&gt; (use strong),&amp;nbsp; &lt;a title="italic" href="http://reference.sitepoint.com/i"&gt;i&lt;/a&gt; (use em).&lt;/li&gt;
&lt;li&gt;The element &lt;a title="strike through" href="http://reference.sitepoint.com/strike"&gt;strike&lt;/a&gt; could be used for formatting, but if used to denote editing, &lt;a title="deleted content" href="http://reference.sitepoint.com/del"&gt;del&lt;/a&gt; should be used instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;abbr title="Hyper Text Markup Language"&gt;HTML&lt;/abbr&gt; or &lt;a title="HTML 4.01 Specification" href="http://www.w3.org/TR/html4/"&gt;HTML 4.01&lt;/a&gt; is an abbreviation, whereas, &lt;acronym title="Graphical User Interface"&gt;GUI&lt;/acronym&gt; is an acronym. I &lt;ins&gt;added&lt;/ins&gt; text then &lt;del&gt;removed&lt;/del&gt; it.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;p&amp;gt;
    &amp;lt;abbr title="Hyper Text Markup Language"&amp;gt;HTML&amp;lt;/abbr&amp;gt; or &amp;lt;a title="HTML 4.01 Specification" 
    href="http://www.w3.org/TR/html4/"&amp;gt;HTML 4.01&amp;lt;/a&amp;gt; is an abbreviation, 
    whereas, &amp;lt;acronym title="Graphical User Interface"&amp;gt;GUI&amp;lt;/title&amp;gt; is an acronym. 
    I &amp;lt;ins&amp;gt;added&amp;lt;/ins&amp;gt; text then &amp;lt;del&amp;gt;removed&amp;lt;/del&amp;gt; it. &amp;lt;/acronym&amp;gt;
&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_lists"&gt;Lists&lt;/h1&gt;
&lt;p&gt;&lt;a title="definition list" href="http://reference.sitepoint.com/dl"&gt;dl&lt;/a&gt;,&amp;nbsp; &lt;a title="define term" href="http://reference.sitepoint.com/dt"&gt;dt&lt;/a&gt;, &lt;a title="describe definition" href="http://reference.sitepoint.com/dd"&gt;dd&lt;/a&gt;, &lt;a title="list item" href="http://reference.sitepoint.com/li"&gt;li&lt;/a&gt;, &lt;a title="ordered list" href="http://reference.sitepoint.com/ol"&gt;ol&lt;/a&gt;, &lt;a title="unordered list" href="http://reference.sitepoint.com/ul"&gt;ul&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;apples&lt;/li&gt;
&lt;li&gt;peaches&lt;/li&gt;
&lt;li&gt;pears&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;apples&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;peaches&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;pears&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_tables"&gt;Tables&lt;/h1&gt;
&lt;p&gt;&lt;a title="table caption" href="http://reference.sitepoint.com/caption"&gt;caption&lt;/a&gt;, &lt;a title="table" href="http://reference.sitepoint.com/table"&gt;table&lt;/a&gt;,&amp;nbsp; &lt;a title="table data" href="http://reference.sitepoint.com/td"&gt;td&lt;/a&gt;,&amp;nbsp; &lt;a title="table header cell (td)" href="http://reference.sitepoint.com/th"&gt;th&lt;/a&gt;,&amp;nbsp; &lt;a title="table row" href="http://reference.sitepoint.com/tr"&gt;tr&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Grouping: &lt;a title="table body group" href="http://reference.sitepoint.com/tbody"&gt;tbody&lt;/a&gt;, &lt;a title="table head group" href="http://reference.sitepoint.com/thead"&gt;thead&lt;/a&gt;, &lt;a title="table foot group" href="http://reference.sitepoint.com/tfoot"&gt;tfoot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;table border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Column One&lt;/th&gt;
&lt;th&gt;Column Two&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cell one&lt;/td&gt;
&lt;td&gt;cell two&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cell three&lt;/td&gt;
&lt;td&gt;cell four&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;caption&gt;Table caption&lt;/caption&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;table&amp;gt;
   &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;Column One&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;Column Two&amp;lt;/th&amp;gt;
   &amp;lt;/tr&amp;gt;
   &amp;lt;tr&amp;gt;
      &amp;lt;td&amp;gt;cell one&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;cell two&amp;lt;/td&amp;gt;
   &amp;lt;/tr&amp;gt;
   &amp;lt;tr&amp;gt;
      &amp;lt;td&amp;gt;cell three&amp;lt;/td&amp;gt;
      &amp;lt;td&amp;gt;cell four&amp;lt;/td&amp;gt;
   &amp;lt;/tr&amp;gt;
&amp;lt;caption&amp;gt;Table caption&amp;lt;/caption&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_content-formatting"&gt;Content Formatting&lt;/h1&gt;
&lt;p&gt;&lt;a title="line break" href="http://reference.sitepoint.com/br"&gt;br&lt;/a&gt;, &lt;a title="divide section container" href="http://reference.sitepoint.com/div"&gt;div&lt;/a&gt;, &lt;a title="horizontal rule" href="http://reference.sitepoint.com/hr"&gt;hr&lt;/a&gt;, &lt;a title="span section container" href="http://reference.sitepoint.com/span"&gt;span&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_elements-to-avoid"&gt;Elements To Avoid&lt;/h1&gt;
&lt;p&gt;&lt;a title="center" href="http://reference.sitepoint.com/center"&gt;center&lt;/a&gt;, &lt;a title="font" href="http://reference.sitepoint.com/font"&gt;font&lt;/a&gt;, &lt;a title="strike through (strike)" href="http://reference.sitepoint.com/s"&gt;s&lt;/a&gt;, &lt;a title="underline (em or strong)" href="http://reference.sitepoint.com/u"&gt;u&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_style-preferences"&gt;Style Preferences&lt;/h1&gt;
&lt;p&gt;&lt;a title="line break" href="http://reference.sitepoint.com/br"&gt;br&lt;/a&gt;, &lt;a title="divide section container" href="http://reference.sitepoint.com/div"&gt;div&lt;/a&gt;, &lt;a title="horizontal rule" href="http://reference.sitepoint.com/hr"&gt;hr&lt;/a&gt;, &lt;a title="span section container" href="http://reference.sitepoint.com/span"&gt;span&lt;/a&gt;, &lt;strong&gt;&lt;a title="image" href="http://reference.sitepoint.com/img"&gt;img&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Personally, I don't like br tags.&amp;nbsp; If more space is needed between paragraphs, then the CSS should be modified, not the content. I prefer div elements for block sections and span elements for inline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="panel-left"&gt;&lt;img src="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/Snowmobile1_thumb.jpg" alt="Snowmobiles at Keystone Colorado" width="240" height="161"&gt;&lt;/div&gt;
&lt;p&gt;I went on a snowmobile tour in Keystone Colorado.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;div class="floatleft"&amp;gt;
    &amp;lt;img alt="Snowmobiles at Keystone Colorado"  
    src="http://tim-stanley.com/Snowmobile1_thumb.jpg"&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;I went on a snowmobile tour in Keystone Colorado.&amp;lt;/p&amp;gt;
&amp;lt;div class="clearer&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_head-elements"&gt;Head Elements&lt;/h1&gt;
&lt;p&gt;&lt;a href="/admin/Pages/link? reference.sitepoint.com http:&amp;gt;&amp;lt;a title="&gt;link&lt;/a&gt;, &lt;a href="http://reference.sitepoint.com/meta"&gt;meta&lt;/a&gt;, &lt;a href="http://reference.sitepoint.com/script"&gt;script&lt;/a&gt;, &lt;a href="http://reference.sitepoint.com/style"&gt;style&lt;/a&gt;, &lt;a href="http://reference.sitepoint.com/title"&gt;title&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The meta description is used to display by search engines.&amp;nbsp; If a description isn't present, the search engine will pick their won.&amp;nbsp; Most search engines use a combination of the description and content to display preview information of the page.&lt;/p&gt;
&lt;p&gt;Version information on style sheets and JavaScript files are used and updated when the content changes to force browsers to re-load their cached versions (particularly if a far expiration date is set on the content).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;head profile="http://gmpg.org/xfn/11"&amp;gt;
    &amp;lt;link rel="stylesheet" href="/themes/style.css&amp;amp;amp;v=1.4.5.1" type="text/css" /&amp;gt;
    &amp;lt;meta name="keywords" content="photography,photoshop" /&amp;gt;
&amp;lt;meta name="description" content="Mister Retro has a great set of Photoshop plug-in's that
    will save a significant amount of time and effort when manipulating files in Photoshop for 
    those textured and stunning artistic effects." /&amp;gt;
    &amp;lt;link rel="last" title="Using Cache And Compression For Performance" 
        href="/post/Using-Cache-And-Compression-For-Performance.aspx" /&amp;gt;
    &amp;lt;link rel="first" title="How To Enable HTM Server Side Include Parsing in IIS" 
        href="/post/How-To-Enable-HTM-Server-Side-Include-Parsing-in-IIS.aspx" /&amp;gt;
    &amp;lt;link rel="next" title="Images Part 1 - Snagit" href="/post/Images-Part-1-Snagit.aspx" /&amp;gt;
    &amp;lt;link rel="prev" title="Font Tools" href="/post/Font-Tools.aspx" /&amp;gt;
    &amp;lt;link rel="contents" title="Archive" href="/archive.aspx" /&amp;gt;
    &amp;lt;link rel="start" title="Tim-Stanley.com" href="/" /&amp;gt;
    &amp;lt;link type="application/rdf+xml" rel="meta" title="SIOC" href="http://tim-stanley.com/sioc.axd" /&amp;gt;
    &amp;lt;link type="application/apml+xml" rel="meta" title="APML" href="http://tim-stanley.com/apml.axd" /&amp;gt;
    &amp;lt;link type="application/rdf+xml" rel="meta" title="FOAF" href="http://tim-stanley.com/foaf.axd" /&amp;gt;
    &amp;lt;link type="application/rss+xml" rel="alternate" title="Tim-Stanley.com (RSS)" 
        href="http://tim-stanley.com/syndication.axd?format=rss" /&amp;gt;
    &amp;lt;link type="application/atom+xml" rel="alternate" title="Tim-Stanley.com (ATOM)"
        href="http://tim-stanley.com/syndication.axd?format=atom" /&amp;gt;
    &amp;lt;link type="application/rsd+xml" rel="edituri" title="RSD" href="http://tim-stanley.com/rsd.axd" /&amp;gt;
    &amp;lt;meta http-equiv="content-type" content="text/html; charset=utf-8" /&amp;gt;
    &amp;lt;link type="application/opensearchdescription+xml" rel="search" title="Tim-Stanley.com"
        href="http://tim-stanley.com/opensearch.axd" /&amp;gt;
    &amp;lt;script type="text/javascript" src="/blog.js&amp;amp;amp;v=1.4.5.1"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;title&amp;gt;Machine Wash Effect - Tim-Stanley.com &amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_doctype"&gt;DocType&lt;/h1&gt;
&lt;p&gt;The DOCTYPE is the most controversial.&amp;nbsp; XHTML or HTML, transitional, or strict?&amp;nbsp; The main reason the DOCTYPE is controversial is because it can cause browsers to display in standard or quirks mode depending on the DOCTYPE. XHTML 1.0 Transitional is my preference.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_references"&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://reference.sitepoint.com/html"&gt;Sitepoint html tags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://html-tags.info/"&gt;Visibone html tags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="HTML 4.01 Specification" href="http://www.w3.org/TR/html4/"&gt;W3C HTML 4.01 Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.w3schools.com/html/DEFAULT.asp"&gt;W3Schools HTML Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.alistapart.com/articles/figurehandler/" href="http://www.alistapart.com/articles/figurehandler/"&gt;A List Apart Figure Handler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://developer.apple.com/internet/webcontent/bestwebdev.html" href="http://developer.apple.com/internet/webcontent/bestwebdev.html"&gt;Apple Web Development Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.alistapart.com/stories/doctype/" href="http://www.alistapart.com/stories/doctype/"&gt;A List Apart: Fix Your Site With the Right DOCTYPE!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.quirksmode.org/css/quirksmode.html" href="http://www.quirksmode.org/css/quirksmode.html"&gt;Quirks mode and strict mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>html</category>
  <category>xhtml</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/common-html-markup/</guid>
  <pubDate>Sat, 04 Oct 2008 18:04:00 GMT</pubDate>
</item>
<item>
  <title>Using Cache And Compression For Performance</title>
  <link>https://tim-stanley.com/post/using-cache-and-compression-for-performance/</link>
  <description>&lt;p&gt;Most browsers and servers have default values that provide fairly good performance with a minimum caching of static file content.&amp;nbsp; A little bit of coaxing can result in better performance with less traffic and less bandwidth.&lt;/p&gt;
&lt;p&gt;There are two types of caching I discuss: static content&amp;nbsp; (*.JPG, *.JPEG, *.png, *.gif, *.ico) rarely updated and semi-static content (*.js, *.css) updated very infrequently.&amp;nbsp; The decision to cache page output (*.aspx, *.html, *.htm) long term is too dependent on application functionality decisions to discuss generically. [more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_summary"&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_one-page-many-contents"&gt;One Page, Many Contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_200s-and-304s"&gt;200's and 304's&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_browser-settings"&gt;Browser Settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_entity-tags"&gt;Entity Tags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_save-requests-use-a-cache"&gt;Save Requests, Use A Cache&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_iis-content-expiration"&gt;IIS Content Expiration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_aspnet-httphandler-cssashx-cssaxd"&gt;ASP.Net httpHandler *.css.ashx *.css.axd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_aspnet-httphandler-css"&gt;ASP.Net httpHandler *.css&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_apache-modexpires"&gt;Apache mod_expires&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_save-bandwidth-use-compression"&gt;Save Bandwidth, Use Compression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_blogenginenet"&gt;BlogEngine.Net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_recommendations"&gt;Recommendations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_search-terms"&gt;Search Terms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="h1_summary"&gt;Summary&lt;/h1&gt;
&lt;p&gt;If you are short on time, the quick summary is summarized below.&lt;/p&gt;
&lt;p&gt;Setting a future expiration date let's the browser be smarter about how it requests content only when absolutely necessary.&amp;nbsp; Compressing / Deflating the content for css, js, aspx and html content minimizes the amount of bandwidth used.&amp;nbsp; If you pay for bandwidth by the byte, compression is going to save money.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows Servers:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If you have access to the IIS Admin console, set an expiration date.&amp;nbsp; This is cheap and quick.&amp;nbsp; You get caching via future expiration dates without compression and with no code changes.&lt;/li&gt;
&lt;li&gt;If you want to control individual files for compression and/or caching, but do not have IIS Admin access, you can configure a verb to process *.css.axd, *.jpg.axd, *.js.axd files and then change your references to the content.&lt;/li&gt;
&lt;li&gt;If you want to control individual files for compression and/or caching, install an httpHandler and configure the verb to process *.css, *.jpg, *.js or other files.&amp;nbsp; This also requires access to the IIS Admin console to set the&amp;nbsp; Application Extension Mapping, or if the project is installed via MSI, the mappings can be done at installation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Apache Servers:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use &lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_expires.html"&gt;Apache mod_expires&lt;/a&gt; to set the expiration date in the future.&lt;/li&gt;
&lt;li&gt;Modify .htaccess and set&amp;nbsp; Header unset ETag and FileETag None&lt;/li&gt;
&lt;li&gt;Use a compression module on like mod_gzip or something similar.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Expiration Dates:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Images should be anywhere from 30 days to 5 years or more.&lt;/li&gt;
&lt;li&gt;CSS and JavaScript may need to be updated more frequently and should be anywhere from 1 day to 5 days.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;[more]&lt;/p&gt;
&lt;h1 id="h1_one-page-many-contents"&gt;One Page, Many Contents&lt;/h1&gt;
&lt;p&gt;When loading a web page, it typically isn't a single request.&amp;nbsp; It's just the tip of the iceberg.&amp;nbsp; The page loads, then the browser may need to load more content from that (like a CSS file that references images). The browser may also attempt to load the favicon.ico file even if the page doesn't ask to load it.&lt;/p&gt;
&lt;p&gt;Here's an example of a single page that has 27 requests for various different content needed to support loading 1 page.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/1980d505cd3e_B67E/Cache%20200_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/1980d505cd3e_B67E/Cache%20200_thumb.jpg" alt="Cache 200" width="484" height="191" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_200s-and-304s"&gt;200's and 304's&lt;/h1&gt;
&lt;p&gt;Browsers have a conversation with the server to request content for a [url] that starts off something like this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First time requests:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Browser: Can I have the content for [URL]?&lt;/li&gt;
&lt;li&gt;Server: HTTP/1.0 200 OK -&amp;gt; here it is.&lt;/li&gt;
&lt;li&gt;Browser: I also need the content for [URL]&lt;/li&gt;
&lt;li&gt;Server: HTTP/1.0 200 OK -&amp;gt; here it is.&lt;/li&gt;
&lt;li&gt;Browser: I also need the content for [URL]&lt;/li&gt;
&lt;li&gt;Server: HTTP/1.0 200 OK -&amp;gt; here it is.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That happens over and over for every piece of content needed for the page to be displayed for the first time.&amp;nbsp; The second time the request is made, if the browser has enough information to make a decision, it gets a bit smarter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Second + N requests:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Browser: If the server sent an &lt;strong&gt;expiration time&lt;/strong&gt; for the content, the browser may just use the last copy of the content (No request sent to the server)&lt;/li&gt;
&lt;li&gt;Browser: If the server didn't send an expiration time, &lt;strong&gt;request&lt;/strong&gt; the content (depends on browser settings).&lt;/li&gt;
&lt;li&gt;Server: If it was updated or no eTag match: HTTP/1.0 200 OK -&amp;gt; here it is.&lt;/li&gt;
&lt;li&gt;Server: If it's the same: HTTP/1.1 304 Not Modified -&amp;gt; Use what you have, it's hasn't changed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/1980d505cd3e_B67E/Cache%20200%202nd_4.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/1980d505cd3e_B67E/Cache%20200%202nd_thumb_1.jpg" alt="Cache 200 2nd" width="484" height="19" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The difference between loading the same page shown above is 1.78 seconds for the first time and 0.108 seconds the second time. The time savings is due to the fact that all but one piece of content is cached in the browser for the second request.&lt;/p&gt;
&lt;h1 id="h1_browser-settings"&gt;Browser Settings&lt;/h1&gt;
&lt;p&gt;Although you can't force users to do it, browser settings can affect how they ask servers for the information.&lt;/p&gt;
&lt;p&gt;A unique query parameter on a URL will cause IE 7 to believe it's a "different" URL and IE will be more inclined to request data even though it already has it.&amp;nbsp; For example traces I've seen with timestamp's as part of the query parameter will cause IE to request JPG files and receive 304 responses.&amp;nbsp; If the query parameter is not part of the URL, IE will not request the content again until a refresh is requested.&lt;/p&gt;
&lt;p&gt;The following value controls how IE uses it's cache for HTTP content (not just pages).&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/1980d505cd3e_B67E/IE%20History%20Settings_5.gif"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/1980d505cd3e_B67E/IE%20History%20Settings_thumb_1.gif" alt="IE History Settings" width="371" height="477" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Firefox 3 has both the Private Data (cache) setting and the options that control how it utilizes the cache.&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/1980d505cd3e_B67E/Firefox%20Private%20Data_3.gif" alt="Firefox Private Data" width="325" height="268" border="0"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/1980d505cd3e_B67E/Firefox%20Options_3.gif" alt="Firefox Options" width="469" height="461" border="0"&gt;&lt;/p&gt;
&lt;h1 id="h1_entity-tags"&gt;Entity Tags&lt;/h1&gt;
&lt;p&gt;Entity Tags (ETags) are used to provide additional detail for checking caching.&amp;nbsp; &lt;a href="http://developer.yahoo.com/performance/index.html#rules"&gt;Yahoo Rules for high performance web sites&lt;/a&gt; and &lt;a href="http://developer.yahoo.com/yslow/"&gt;YSlow&lt;/a&gt; recommend setting the ETag values to improve performance.&lt;/p&gt;
&lt;p&gt;By default, Apache and IIS use ETags. If you are running a web farm, remove ETags or ensure the ETags are syncronized across the farm (refer to the &lt;a href="http://support.microsoft.com/?id=922733"&gt;Microsoft support article to remove etags in IIS&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;In Apache to remove ETags, modify the .htaccess or httpd.conf file:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-markup"&gt;
Header unset ETag
FileETag None
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If ETags are used, the request from the browser will contain something like the following:&lt;/p&gt;
&lt;p&gt;If-Modified-Since: Tue, 08 Jul 2008 05:52:56 GMT&lt;br&gt;If-None-Match: "0ac6adebee0c81:893"&lt;/p&gt;
&lt;p&gt;In ASP.Net code, this is set with a statement like:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
Response.Cache.SetETagFromFileDependencies();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Refer to the &lt;a href="http://support.microsoft.com/?id=922733"&gt;Microsoft support article to remove etags in IIS&lt;/a&gt; or to set ETags, refer to&amp;nbsp; &lt;a href="http://dn.codegear.com/article/38123"&gt;Enabling Client-Side Caching of Generated Content in ASP.NET&lt;/a&gt; for a more detailed explanation. &lt;a id="toc_5" href="/admin/Pages/#"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_save-requests-use-a-cache"&gt;Save Requests, Use A Cache&lt;/h1&gt;
&lt;p&gt;If you have a large number of users, the 304 responses add additional HTTP requests and traffic.&amp;nbsp; These can be eliminated or reduced in IIS and ASP.Net in three ways: IIS Content Expiration, ASP.Net *.css httpHandlers, or with an ASP.Net *.axd httpHandler.&lt;/p&gt;
&lt;h2 id="h2_iis-content-expiration"&gt;IIS Content Expiration&lt;/h2&gt;
&lt;p&gt;If you have access to IIS administration set the IIS expiration cache to an appropriate value.&amp;nbsp; Unlike Apache, I haven't figured out how to set different expiration dates for images versus CSS and JavaScript files.&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/1980d505cd3e_B67E/IIS%20Content%20Expiration_3.gif" alt="IIS Content Expiration" width="472" height="465" border="0"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="h2_aspnet-httphandler-cssashx-cssaxd"&gt;ASP.Net httpHandler *.css.ashx *.css.axd&lt;/h2&gt;
&lt;p&gt;Sample content references:&lt;/p&gt;
&lt;p&gt;&amp;lt;link rel="stylesheet" type="text/css" href="csshandler.axd?path=style.css" mce_href="csshandler.axd?path=style.css" /&amp;gt;&lt;br&gt;&amp;lt;link rel="stylesheet" type="text/css" href="style.css.axd" mce_href="style.css.axd" /&amp;gt;&lt;/p&gt;
&lt;p&gt;Adding an httpHandler in the web.config.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;
&amp;lt;httpHandlers&amp;gt;
    &amp;lt;add path=&amp;quot;*.css.axd&amp;quot; verb=&amp;quot;*&amp;quot; type=&amp;quot;Utils.SFHandler&amp;quot; validate=&amp;quot;false&amp;quot;/&amp;gt;
&amp;lt;/httpHandlers&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The article at &lt;a href="http://www.software-architects.com/TechnicalArticles/CachinginASPNET/tabid/75/language/en-US/Default.aspx"&gt;Caching in &lt;em&gt;ASP.NET&lt;/em&gt;&lt;/a&gt; explains in more detail how to use this approach.&amp;nbsp; This approach does not require IIS administration permissions, but it does leave the CSS or other source references tied to unusual file extensions for css, js, and images.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Caution:&lt;/strong&gt; You must take measures to ensure that only specific types of files desired are output.&amp;nbsp; If this is not done properly in code, using the path=abc.css approach, could allow someone to load a normally secure file (like the web.config) using this technique.&lt;/p&gt;
&lt;p&gt;Once you have the handler in place, it's simple:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language=csharp"&gt;
Response.Cache.SetExpires ( DateTime.Now.AddMinutes ( 86400 ) )
Response.Cache.SetCacheability ( HttpCacheability.Public )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Refer to the code example for the BlogEngine.Net CSS handler for more detail.&lt;/p&gt;
&lt;h2 id="h2_aspnet-httphandler-css"&gt;ASP.Net httpHandler *.css&lt;/h2&gt;
&lt;p&gt;Sample content reference:&lt;/p&gt;
&lt;p&gt;&amp;lt;link rel="stylesheet" type="text/css" href="style.css" mce_href="style.css" /&amp;gt;&lt;/p&gt;
&lt;p&gt;Adding an httpHandler in the web.config.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;
&amp;lt;httpHandlers&amp;gt;
    &amp;lt;add path=&amp;quot;*.css&amp;quot; verb=&amp;quot;*&amp;quot; type=&amp;quot;Utils.SFHandler&amp;quot; validate=&amp;quot;false&amp;quot;/&amp;gt;
&amp;lt;/httpHandlers&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The approach is exactly the same as in &lt;a href="http://www.software-architects.com/TechnicalArticles/CachinginASPNET/tabid/75/language/en-US/Default.aspx"&gt;Caching in &lt;em&gt;ASP.NET&lt;/em&gt;&lt;/a&gt;, but this time some more configuration work is required.&amp;nbsp; However, with this approach an additional application IIS Extension Mapping is required.&amp;nbsp; If you have access to the IIS administration console, this is easy for the site.&amp;nbsp; If you are in a commercial hosting environment, it's much more difficult.&lt;/p&gt;
&lt;p&gt;In IIS, this is set on the Home or Virtual Directory, Configuration, Mappings, Add&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/1980d505cd3e_B67E/IIS%20App%20Config_3.gif" alt="IIS App Config" width="406" height="455" border="0"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/1980d505cd3e_B67E/IIS%20App%20Config%20Add_3.gif" alt="IIS App Config Add" width="429" height="250" border="0"&gt;&lt;/p&gt;
&lt;p&gt;Executable = C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll&lt;br&gt;Extension = .css&lt;br&gt;Limit To = GET,HEAD,POST,DEBUG &lt;a id="toc_9" href="/admin/Pages/#"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_apache-modexpires"&gt;Apache mod_expires&lt;/h2&gt;
&lt;p&gt;In Apache, an future expiration date can be set with with &lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_expires.html"&gt;Apache mod_expires&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-markup"&gt;
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpg A2592000
ExpiresByType image/jpeg A2592000
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_save-bandwidth-use-compression"&gt;Save Bandwidth, Use Compression&lt;/h1&gt;
&lt;p&gt;Compression can reduce the size of a css, js or the output of php or aspx files by 60-80%. Yahoo performance research notes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;40-60% of Yahoo!&amp;rsquo;s users have an empty cache experience and ~20% of all page views are done with an empty cache.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Even though these files can be cached, by enabling compression for these files, you reduce both the bandwidth and the load time required for the file.&amp;nbsp; If you pay for bandwidth by the byte, this will save money.&lt;/p&gt;
&lt;p&gt;All this bandwidth savings comes at a cost of CPU.&amp;nbsp; If the results for static content are cached, the result is minimal.&amp;nbsp; If you have a large number of users accessing a site and they are accessing it over the WAN, not LAN, then compression is in my opinion a better option over the CPU cost.&amp;nbsp; If your on a LAN or have a low number of users, compression isn't going to benefit compared to the CPU cost.&lt;/p&gt;
&lt;p&gt;Mads Kristensen talks about stripping white spaces in the article &lt;a href="http://blog.madskristensen.dk/post/Reduce-the-weight-of-stylesheets-by-3525-at-runtime.aspx"&gt;Reduce the weight of stylesheets by 35% at runtime&lt;/a&gt; but his article on &lt;a href="http://blog.madskristensen.dk/post/HTTP-compression-in-ASPNET-20.aspx"&gt;HTTP compression in ASP.NET 2.0&lt;/a&gt; covers how to make compression work for the ASPX output and this can be applied to css and js files as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Using compression can break some javascripts, if used on the Webresources.axd, and can break some third party components, so use this with caution.&lt;/p&gt;
&lt;p&gt;For information on Webresource compression, refer to Miron Abramson's &lt;a href="http://www.mironabramson.com/blog/post/2007/10/New--Shiny--WebResourceaxd-compression-Module.aspx"&gt;New &amp;amp; Shiny WebResource.axd compression Module&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="h1_blogenginenet"&gt;BlogEngine.Net&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://www.dotnetblogengine.net/"&gt;BlogEngine.Net&lt;/a&gt; is a wonderful blogging platform (it's used for this site) and it has a lot of example code for these techniques listed here.&amp;nbsp; For more information, refer to the BlogEngine.core modules image.axd, css.axd, and js.axd.&lt;/p&gt;
&lt;p&gt;Sample code from BlogEngine.Net CSS Handler&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
private static void SetHeaders(int hash, HttpContext context)
{ 
   context.Response.ContentType = "text/css";
   context.Response.Cache.VaryByHeaders["Accept-Encoding"] = true;
 
   context.Response.Cache.SetExpires(DateTime.Now.ToUniversalTime().AddDays(7));
   context.Response.Cache.SetMaxAge(new TimeSpan(7, 0, 0, 0));
   context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
 
   string etag = "\"" + hash.ToString() + "\"";
   string incomingEtag = context.Request.Headers["If-None-Match"];
 
   context.Response.Cache.SetETag(etag);
 
   if (String.Compare(incomingEtag, etag) == 0)
   {
       context.Response.Clear();
       context.Response.StatusCode = (int)System.Net.HttpStatusCode.NotModified;
       context.Response.SuppressContent = true;
   }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="h1_recommendations"&gt;Recommendations&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Minimize the number of HTTP requests by minimizing the unique content that must be loaded on a page.&lt;/li&gt;
&lt;li&gt;Set an expiration time to enable the cache to eliminate HTTP requests that would involve 304 responses. 30+ days for images, 1+ days for CSS and JavaScript files.&lt;/li&gt;
&lt;li&gt;Use Compression for page output, CSS and JS.&lt;/li&gt;
&lt;li&gt;Do not use compression for images (the algorithms for JPG, PNG already compress data for the image).&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="h1_search-terms"&gt;Search Terms&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;ASP.net enable content expiration&lt;/li&gt;
&lt;li&gt;ASP.net expires header&lt;/li&gt;
&lt;li&gt;ASP.net 304 set expires time images&lt;/li&gt;
&lt;li&gt;ASP.net httphandler verb css&lt;/li&gt;
&lt;li&gt;HttpCacheability.Public&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="h1_references"&gt;References&lt;/h1&gt;
&lt;p&gt;I've listed the articles that I found appropriate in my research on this topic.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"&gt;W3C Http 1.1 Status Code Definitions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.software-architects.com/TechnicalArticles/CachinginASPNET/tabid/75/language/en-US/Default.aspx"&gt;Caching in &lt;em&gt;ASP.NET&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.madskristensen.dk/post/Reduce-the-weight-of-stylesheets-by-3525-at-runtime.aspx"&gt;Reduce the weight of stylesheets by 35% at runtime&lt;/a&gt; - Mads Kristensen&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/323290"&gt;How to cache in ASP.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jeremy.zawodny.com/blog/archives/009272.html"&gt;How To Add Good Expires Headers to Images in Apache 1.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aspnetresources.com/blog/cache_control_extensions.aspx"&gt;Stop Image Flickr With Cache Control Extensions&lt;/a&gt; (IE Only)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://insite.phillfox.net/insite/2007/04/25/how-about-an-aspnet-http-handler-to-keep-your-css-visible-2/"&gt;How to Keep your CSS Visible&lt;/a&gt; (replace CSS images ~/ path)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.madskristensen.dk/post/Add-variables-to-standard-CSS-stylesheets-in-ASPNET.aspx"&gt;Add variables to standard CSS stylesheets in ASP.NET&lt;/a&gt; - Mads Kristensen&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.madskristensen.dk/post/Combine-multiple-stylesheets-at-runtime.aspx"&gt;Combine multiple stylesheets at runtime&lt;/a&gt; - Mads Kristensen&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/index.html#rules"&gt;Yahoo Rules for high performance web sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://yuiblog.com/blog/2007/01/04/performance-research-part-2/"&gt;Performance Research, Part 2: Browser Cache Usage - Exposed!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.iis.net/chrisad/archive/2006/12/18/iis7-deployments-calls-for-etag-usage-review-if-using.aspx"&gt;IIS7 Deployments calls for ETag Usage Review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.techspot.com/tweaks/ie6/ie-3.shtml"&gt;Internet Explorer 6 tweak guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thinkvitamin.com/features/webapps/serving-javascript-fast"&gt;Serving JavaScript Fast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dn.codegear.com/article/38123"&gt;Enabling Client-Side Caching of Generated Content in ASP.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.samaxes.com/2008/04/20/htaccess-gzip-and-cache-your-site-for-faster-loading-and-bandwidth-saving/"&gt;Cache your site for faster loading and bandwidth saving&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.microsoft.com/?id=922733"&gt;Microsoft support article to remove etags in IIS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.askapache.com/htaccess/apache-speed-etags.html"&gt;Remove ETag Headers to Speed up Apache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_expires.html"&gt;Apache mod_expires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.web-caching.com/mnot_tutorial/how.html"&gt;How Web Caches Work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/aspnet/httpcompression.aspx"&gt;HTTP Compression Module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.madskristensen.dk/post/Compression-and-performance-GZip-vs-Deflate.aspx"&gt;Compression and performance - GZip vs. Deflate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dotnetblogengine.net/"&gt;BlogEngine.Net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.getfirebug.com/"&gt;Firebug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fiddlertool.com/fiddler/"&gt;Fiddler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.yahoo.com/yslow/"&gt;YSlow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:138b84f9-fbb4-4a62-b057-10d639f4fe24" class="wlWriterSmartContent" style="display: inline; margin: 0px; padding: 0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/IIS" rel="tag"&gt;IIS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ASP.Net" rel="tag"&gt;ASP.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Internet%20Explorer" rel="tag"&gt;Internet Explorer&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Firefox" rel="tag"&gt;Firefox&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Caching" rel="tag"&gt;Caching&lt;/a&gt;,&lt;a href="http://technorati.com/tags/HTTP" rel="tag"&gt;HTTP&lt;/a&gt;&lt;/div&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>asp-net</category>
  <category>firefox</category>
  <category>internet-explorer</category>
  <category>iis</category>
  <category>visual-studio</category>
  <category>caching</category>
  <category>http</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/using-cache-and-compression-for-performance/</guid>
  <pubDate>Wed, 24 Sep 2008 21:26:00 GMT</pubDate>
</item>
<item>
  <title>Images Part 3 - Windows Live Writer</title>
  <link>https://tim-stanley.com/post/images-part-3-windows-live-writer/</link>
  <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Windows Live Writer provides a handful of helpful image enhancement features.&amp;nbsp; It's not Photoshop by any means, but it's quick.&lt;/p&gt;
&lt;h1&gt;Drop Shadow&lt;/h1&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/ImagesPart3WindowsLiveWriter_DBE5/Sleigh_3.jpg" alt="Sleigh" width="324" height="218" border="0" /&gt; [more]&lt;/p&gt;
&lt;h1&gt;Photo Paper&lt;/h1&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/ImagesPart3WindowsLiveWriter_DBE5/Sleigh_9.jpg" alt="Sleigh" width="340" height="234" border="0" /&gt;&lt;/p&gt;
&lt;h1&gt;Watermark&lt;/h1&gt;
&lt;p&gt;&lt;img src="/image.axd?picture=WindowsLiveWriter/ImagesPart3WindowsLiveWriter_DBE5/Sleigh_8.jpg" alt="Sleigh" width="320" height="214" /&gt;&lt;/p&gt;
&lt;h1&gt;Polaroid Picture&lt;/h1&gt;
&lt;div id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:3bc734e2-ba71-47f8-b1cb-9d6e9f904e65" class="wlWriterSmartContent" style="display: inline; float: none; margin: 0px; padding: 0px;"&gt;&lt;a title="Sleigh Ride" href="/image.axd?picture=WindowsLiveWriter/ImagesPart3WindowsLiveWriter_DBE5/Sleigh-8x6.jpg" rel="thumbnail"&gt;&lt;img src="/image.axd?picture=WindowsLiveWriter/ImagesPart3WindowsLiveWriter_DBE5/Sleigh_37.png" alt="" width="358" height="301" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The Windows Live Writer &lt;a href="http://vista.gallery.microsoft.com/liveItemDetail.aspx?li=6a125986-6550-4ce9-9c71-9a0fbbc3443f&amp;amp;pl=8&amp;amp;bt=9"&gt;Polaroid Picture extension&lt;/a&gt; provides the ability to add a drop shadow, tilt pictures and add captions and change the text flow.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>photography</category>
  <category>windows-live-writer</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/images-part-3-windows-live-writer/</guid>
  <pubDate>Tue, 09 Sep 2008 19:59:00 GMT</pubDate>
</item>
<item>
  <title>Images Part 2 - Word</title>
  <link>https://tim-stanley.com/post/images-part-2-word/</link>
  <description>&lt;p&gt;Word in Microsoft Office2007 provides the ability to post entries to websites and has outstanding image manipulation features. I love image manipulation in Word the drop shadow and reflection effects are simple, and quick.&lt;/p&gt;
&lt;p&gt;Word does make the images fuzzy and grainy.&lt;/p&gt;
&lt;h1&gt;Shadow&lt;/h1&gt;
&lt;p&gt;&lt;img src="/image.axd?picture=090808_2233_ImagesPart21.jpg" alt="" width="518" height="359" /&gt; [more]&lt;/p&gt;
&lt;h1&gt;Double Frame, Black&lt;/h1&gt;
&lt;p&gt;&lt;img src="/image.axd?picture=090808_2233_ImagesPart22.jpg" alt="" width="544" height="385" /&gt;&lt;/p&gt;
&lt;h1&gt;Rounded and Reflection&lt;/h1&gt;
&lt;p&gt;&lt;img src="/image.axd?picture=090808_2233_ImagesPart23.jpg" alt="" width="488" height="649" /&gt;&lt;/p&gt;
&lt;h1&gt;Bevel Rectangle&lt;/h1&gt;
&lt;p&gt;&lt;img src="/image.axd?picture=090808_2233_ImagesPart24.jpg" alt="" width="507" height="348" /&gt;&lt;/p&gt;
&lt;h1&gt;Perspective Shadow&lt;/h1&gt;
&lt;p&gt;&lt;img src="/image.axd?picture=090808_2233_ImagesPart25.jpg" alt="" width="601" height="355" /&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>photography</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/images-part-2-word/</guid>
  <pubDate>Mon, 08 Sep 2008 22:33:00 GMT</pubDate>
</item>
<item>
  <title>Images Part 1 - Snagit</title>
  <link>https://tim-stanley.com/post/images-part-1-snagit/</link>
  <description>&lt;p&gt;A picture may be worth a thousand words, but it me takes about the same time or longer to edit images as it does to type.&amp;nbsp; &lt;a href="http://www.techsmith.com/screen-capture.asp"&gt;Snagit by TechSmith&lt;/a&gt; helps me a great deal.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Snagit is not a full photo editor by any means, but it does help provide some useful embellishments to images or screen shots without requiring a lot of work.&lt;/p&gt;
&lt;p&gt;I love Snagit for three reasons.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;To capture&amp;nbsp; scrolling windows (for web designs)&lt;/li&gt;
&lt;li&gt;To add annotation, drawing, and markup on the image&lt;/li&gt;
&lt;li&gt;The quick drop shadow effect&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Key features I use:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Edges- Drop shadow, fade, torn, wave, saw, shark tooth, beveled&lt;/li&gt;
&lt;li&gt;Watermark, resize, flip&lt;/li&gt;
&lt;li&gt;Image types: jpg, png, gif&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Drop Shadow&lt;/h1&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/PicturesSnagit9_F615/sleigh%20drop%20shadow_3.jpg" alt="sleigh drop shadow" width="320" height="216" border="0" /&gt; [more]&lt;/p&gt;
&lt;h1&gt;Fade&lt;/h1&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/PicturesSnagit9_F615/sleigh%20fade_5.jpg" alt="sleigh fade" width="320" height="214" border="0" /&gt;&lt;/p&gt;
&lt;h1&gt;Watermark&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/PicturesSnagit9_F615/sleigh%20watermark_6.jpg" alt="sleigh watermark" width="320" height="214" border="0" /&gt;&lt;/h1&gt;
&lt;h1&gt;Shear&lt;/h1&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/PicturesSnagit9_F615/sleigh%20shear_3.jpg" alt="sleigh shear" width="275" height="336" border="0" /&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>photography</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/images-part-1-snagit/</guid>
  <pubDate>Mon, 08 Sep 2008 22:32:00 GMT</pubDate>
</item>
<item>
  <title>Machine Wash Effect</title>
  <link>https://tim-stanley.com/post/machine-wash-effect/</link>
  <description>&lt;p&gt;&lt;a href="http://misterretro.com"&gt;Mister Retro&lt;/a&gt; has a great set of Photoshop plug-in's that will save a significant amount of time and effort when manipulating files in Photoshop for creating those textured and stunning artistic effects. Prices start at $49.95.&lt;/p&gt;
&lt;p&gt;Machine wash CD 3 - Abusive Filter:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://misterretro.com/machine_wash_filters_three.html"&gt;&lt;img src="/image.axd?picture=WindowsLiveWriter/MachineWashEffect_C5A6/Machine%20Wash%20Abusiv_3.jpg" alt="Machine Wash Abusive" width="374" height="274" border="0" /&gt;&lt;/a&gt; [more]&lt;/p&gt;
&lt;p&gt;Machine Wash CD 4 - Brutality Filter:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://misterretro.com/machine_wash_filters_four.html"&gt;&lt;img src="/image.axd?picture=WindowsLiveWriter/MachineWashEffect_C5A6/Machine%20Wash%20Brutality_3.jpg" alt="Machine Wash Brutality" width="374" height="274" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>design</category>
  <category>photography</category>
  <category>photoshop</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/machine-wash-effect/</guid>
  <pubDate>Fri, 05 Sep 2008 18:08:00 GMT</pubDate>
</item>
<item>
  <title>Font Tools</title>
  <link>https://tim-stanley.com/post/font-tools/</link>
  <description>&lt;p&gt;&lt;a href="http://www.myfonts.com/WhatTheFont/"&gt;What The Font&lt;/a&gt; and &lt;a href="http://www.typechart.com/"&gt;Type Chart&lt;/a&gt;&amp;nbsp; provide some useful interesting font tools.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.myfonts.com/WhatTheFont/"&gt;What The Font&lt;/a&gt; does an image analysis and comes up with a list of potential fonts that are used in the image. [more]&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.myfonts.com/WhatTheFont/"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FontToolsSites_BA4D/What%20The%20Font_3.jpg" alt="What The Font" width="480" height="435" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.typechart.com/"&gt;Type Chart&lt;/a&gt; provides a view of what the fonts will look like in Windows, on the Macintosh, and provides the CSS used for the examples.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.typechart.com/"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FontToolsSites_BA4D/Type%20Chart_3.jpg" alt="Type Chart" width="480" height="146" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>tips</category>
  <category>css</category>
  <category>tools</category>
  <category>font</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/font-tools/</guid>
  <pubDate>Thu, 04 Sep 2008 19:57:00 GMT</pubDate>
</item>
<item>
  <title>Sharing Bookmarks</title>
  <link>https://tim-stanley.com/post/sharing-bookmarks/</link>
  <description>&lt;p&gt;There are numerous services popping up to help you keep track of your favorite browser bookmarks. From what I can tell from &lt;a href="http://www.alexa.com/data/details/traffic_details/nbcolympics.com?site0=reddit.com&amp;amp;site1=furl.com&amp;amp;site2=technorati.com&amp;amp;site3=delicious.com&amp;amp;site4=digg.com&amp;amp;y=r&amp;amp;z=3&amp;amp;h=300&amp;amp;w=470&amp;amp;c=1&amp;amp;u%5B%5D=reddit.com&amp;amp;u%5B%5D=furl.com&amp;amp;u%5B%5D=technorati.com&amp;amp;u%5B%5D=delicious.com&amp;amp;u%5B%5D=digg.com&amp;amp;x=2008-08-20T16%3A21%3A01.000Z&amp;amp;check=www.alexa.com&amp;amp;signature=uXpARHEfGdcOS0zUF2j7GJgsBPQ%3D&amp;amp;range=3m&amp;amp;size=Medium"&gt;Alexa&lt;/a&gt; traffic, the top three are &lt;a href="http://digg.com/"&gt;Digg&lt;/a&gt;, &lt;a href="http://technorati.com/"&gt;Technorati&lt;/a&gt;, and &lt;a href="http://delicious.com/"&gt;Delicious&lt;/a&gt;.&amp;nbsp; It seems like there are new services popping up every day and it can be hard to keep with with how to let users add your bookmarks to their bookmark service. &lt;a href="http://addthis.com/"&gt;AddThis.com&lt;/a&gt; looks like it's trying to help. [more]&lt;/p&gt;
&lt;h1&gt;Add This&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://addthis.com/"&gt;AddThis&lt;/a&gt; has a list of all the current bookmark sharing services and also keeps track of statistics of how many users add and share a specific URL.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://addthis.com/"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/BlogEngine.NetBookmarks_10937/image8.png" alt="Add This" width="480" height="431" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;BlogEngine.Net Bookmarks&lt;/h1&gt;
&lt;p&gt;Danny Douglass has published an extension for BlogEngine.Net at &lt;a href="http://www.dannydouglass.com/post/2008/01/Add-Social-Bookmarking-Links-To-Your-Blog.aspx"&gt;Add Social Bookmarking Links To Your Blog&lt;/a&gt; that adds several of the most commonly used social bookmarks.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dannydouglass.com/post/2008/01/Add-Social-Bookmarking-Links-To-Your-Blog.aspx"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/BlogEngine.NetBookmarks_10937/image_3.jpg" alt="social bookmark images" width="464" height="151" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The icons from Danny's extension were from the Web 2 Icon set from&amp;nbsp; &lt;a href="http://fasticon.com/freeware/index.php/web-2-icons/"&gt;FastIcon.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://fasticon.com/freeware/index.php/web-2-icons/"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/BlogEngine.NetBookmarks_10937/web2icons_3.gif" alt="FastIcon.com web2icons" width="192" height="72" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I took Danny's idea and added in links for favorites and e-mail.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/BlogEngine.NetBookmarks_10937/image_4.png"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/BlogEngine.NetBookmarks_10937/image_thumb.png" alt="share image list" width="386" height="69" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2d462bca-4cd1-4660-9cbe-cc6f0ca5e3c1" class="wlWriterSmartContent" style="display: inline; margin: 0px; padding: 0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/BlogEngine.net" rel="tag"&gt;BlogEngine.net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Bookmarks" rel="tag"&gt;Bookmarks&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Digg" rel="tag"&gt;Digg&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Technorati" rel="tag"&gt;Technorati&lt;/a&gt;,&lt;a href="http://technorati.com/tags/AddThis" rel="tag"&gt;AddThis&lt;/a&gt;&lt;/div&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>blogengine-net</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/sharing-bookmarks/</guid>
  <pubDate>Wed, 20 Aug 2008 16:39:00 GMT</pubDate>
</item>
<item>
  <title>Free Photos</title>
  <link>https://tim-stanley.com/post/free-photos/</link>
  <description>&lt;p&gt;Where can you find some photos without paying an arm and a leg?&amp;nbsp; Here are some helpful sites to try for inspiration.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/creativecommons/"&gt;Flickr Creative Commons&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/absoblogginlutely/2750317917/in/set-72157606655974127"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreePhotos_BAC0/2750317917_6412dc3353_o_3.jpg" alt="Balloons Off Broadway, Grove City, 2008" width="244" height="164" border="0" /&gt;&lt;/a&gt; [more]&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.sxc.hu/"&gt;StockXchng&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.sxc.hu/browse.phtml?f=view&amp;amp;id=85289"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreePhotos_BAC0/85289_5792_3.jpg" alt="photo by ali seifert on stock.xchng" width="244" height="184" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.freefoto.com"&gt;FreeFoto.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.freefoto.com/preview/15-19-1?ffid=15-19-1"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreePhotos_BAC0/15_19_1---Tree--Sunrise--Northumberland_web_3.jpg" alt="15_19_1---Tree--Sunrise--Northumberland_web" width="244" height="164" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Paid Photos&lt;/h1&gt;
&lt;p&gt;The following sites require some payment, but most images for the web are nominal (less than $1).&amp;nbsp; The sites also offer some free photos as well.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.istockphoto.com"&gt;iStockPhoto.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/FreePhotos_BAC0/iStock_000005105610Large_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreePhotos_BAC0/iStock_000005105610Large_thumb.jpg" alt="iStock_000005105610Large" width="244" height="164" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.fotolia.com/"&gt;Fotolia.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.fotolia.com/"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreePhotos_FD5C/image_6.png" alt="image" width="244" height="126" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dreamstime.com/red-violin-image1340"&gt;DreamsTime.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dreamstime.com/red-violin-image1340"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreePhotos_BAC0/Red%20Violin_1.png" alt="Red Violin" width="244" height="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Other Free Photo Links&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Wikipedia:Public_domain_image_resources"&gt;Wikipedia:Public domain image resources&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.nasaimages.org/"&gt;NASA Images&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.nasaimages.org/luna/servlet/detail/nasaNAS~5~5~21649~126419:Buzz-Aldrin-and-the-U-S--flag-on-th"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreePhotos_BAC0/nasaNAS~5~5~21649~126419_3.jpg" alt="nasaNAS~5~5~21649~126419" width="244" height="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.nasa.gov/multimedia/imagegallery/"&gt;NASA Multimedia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hubblesite.org/gallery/album/entire_collection/pr1995044b/"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreePhotos_BAC0/Star%20Birth_3.jpg" alt="Star Birth" width="244" height="239" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://visibleearth.nasa.gov/"&gt;Visible Earth Images from NASA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://visibleearth.nasa.gov/view_rec.php?id=2429"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreePhotos_BAC0/globe_west_540_3.jpg" alt="globe_west_540" width="244" height="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>photography</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/free-photos/</guid>
  <pubDate>Sat, 16 Aug 2008 18:22:00 GMT</pubDate>
</item>
<item>
  <title>HTML And CSS Developer Tools</title>
  <link>https://tim-stanley.com/post/html-and-css-developer-tools/</link>
  <description>&lt;p&gt;Despite the best developer tools, sometimes having the ability to see what the browser sees can be invaluable in troubleshooting a CSS layout issue, or a performance or load issue.&amp;nbsp; Firebug, Fiddler and the IE Developer toolbar are supposed to help see the HTML, CSS and JavaScript that the browser sees.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://www.getfirebug.com/" href="http://www.getfirebug.com/"&gt;Firebug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038"&gt;IE Developer Toolbar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fiddlertool.com/fiddler/"&gt;Fiddler&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Comparison of Firebug and the IE Toolbar features. [more]&lt;/p&gt;
&lt;table style="width: 400px;" border="0" cellspacing="0" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th valign="top" width="243"&gt;Feature&lt;/th&gt;
&lt;th valign="top" width="69"&gt;Firebug&lt;/th&gt;
&lt;th valign="top" width="88"&gt;IE Toolbar / Fiddler&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="243"&gt;Explore DOM&lt;/td&gt;
&lt;td valign="top" width="69"&gt;yes&lt;/td&gt;
&lt;td valign="top" width="91"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="243"&gt;View HTML object details&lt;/td&gt;
&lt;td valign="top" width="69"&gt;yes&lt;/td&gt;
&lt;td valign="top" width="93"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="243"&gt;Validate HTML&lt;/td&gt;
&lt;td valign="top" width="69"&gt;yes&lt;/td&gt;
&lt;td valign="top" width="95"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="243"&gt;Validate CSS&lt;/td&gt;
&lt;td valign="top" width="69"&gt;yes&lt;/td&gt;
&lt;td valign="top" width="96"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="243"&gt;Validate WAI&lt;/td&gt;
&lt;td valign="top" width="69"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td valign="top" width="97"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="243"&gt;Validate RSS&lt;/td&gt;
&lt;td valign="top" width="69"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td valign="top" width="98"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="243"&gt;Display image information&lt;/td&gt;
&lt;td valign="top" width="69"&gt;yes&lt;/td&gt;
&lt;td valign="top" width="98"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="243"&gt;Resize window to a specific resolution&lt;/td&gt;
&lt;td valign="top" width="69"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td valign="top" width="98"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="243"&gt;Design Rule for measuring objects&lt;/td&gt;
&lt;td valign="top" width="69"&gt;yes&lt;/td&gt;
&lt;td valign="top" width="98"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="243"&gt;View formatted HTML&lt;/td&gt;
&lt;td valign="top" width="69"&gt;yes&lt;/td&gt;
&lt;td valign="top" width="98"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="243"&gt;View formatted CSS&lt;/td&gt;
&lt;td valign="top" width="69"&gt;yes&lt;/td&gt;
&lt;td valign="top" width="98"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="243"&gt;Network performance&lt;/td&gt;
&lt;td valign="top" width="69"&gt;yes&lt;/td&gt;
&lt;td valign="top" width="98"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Firebug&lt;/h1&gt;
&lt;p&gt;Firebug is an absolutely fantastic, &lt;strong&gt;must have web development tool&lt;/strong&gt;.&amp;nbsp; It saves time.&amp;nbsp; It's a free download, it's a free license and it takes less than an hour to download install and have it operational.&lt;/p&gt;
&lt;p&gt;Firebug has helped me find some interesting quirks on CSS for sites and it's invaluable.&amp;nbsp; Firebug also has some &lt;a href="http://getfirebug.com/extensions/index.html"&gt;Firebug extensions&lt;/a&gt; for other interesting features.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/CSSDeveloperDiagnostics_9BAA/Firebug1_3.jpg" alt="Firebug Performance" width="464" height="128" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/CSSDeveloperDiagnostics_9BAA/Fiebug2_3.jpg" alt="Fiebug HTML" width="464" height="239" border="0" /&gt;&lt;/p&gt;
&lt;h1&gt;Fiddler and IE Developer Toolbar&lt;/h1&gt;
&lt;p&gt;Fiddler is a handy tool.&amp;nbsp; It provides some of the same information as the NET section in Firebug.&amp;nbsp; It also provides some more detailed information including the ability to hand build requests to servers and to impersonate requests as different user agents.&amp;nbsp; It's complicated but appears powerful.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/CSSDeveloperDiagnostics_9BAA/Fiddler_3.jpg" alt="Fiddler" width="464" height="203" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I've heard good things about the IE Developer Toolbar, but I've tried to install it on two systems with Windows XP with absolutely no success.&amp;nbsp; From what I can tell, others have had similar problems.&lt;/p&gt;
&lt;p&gt;After finally following the instructions at &lt;a href="http://www.15seconds.com/issue/070208.htm"&gt;an Introduction to the Internet Explorer Developer Toolbar&lt;/a&gt;, I had success in installing it, but &lt;strong&gt;no success in getting the IE Developer Toolbar to display HTML or CSS information about pages&lt;/strong&gt;.&amp;nbsp; It's a shame, it appears&amp;nbsp; to be a useful tool and there are certainly style issues on IE that are unique to IE that don't occur in Firefox.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The resize to a specific size (800x600, 1024x768) I think are very useful.&amp;nbsp; I develop on a monitor that is 1680x1050 and it is nice to be able to size smaller and adjust the layouts so I know they fit smaller screens.&lt;/p&gt;
&lt;p&gt;The ruler also appears useful (although Firebug also has one).&amp;nbsp; The method of using the ruler in the IE Developer toolbar is different than the Firebug approach.&amp;nbsp; Both appear to be useful.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.sitepoint.com/blogs/2008/06/17/in-browser-development-tools-firebug-still-king/"&gt;In browser development tools firebug still king&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/ie/archive/2007/06/22/from-microsoft-teched-2007-web-development-tools-for-internet-explorer.aspx"&gt;Microsoft TechEd 2007 web development tools for Internet explorer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.iewatch.com"&gt;IE Watch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.15seconds.com/issue/070208.htm"&gt;An Introduction to the Internet Explorer Developer Toolbar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>firefox</category>
  <category>internet-explorer</category>
  <category>microsoft</category>
  <category>firebug</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/html-and-css-developer-tools/</guid>
  <pubDate>Tue, 12 Aug 2008 21:30:00 GMT</pubDate>
</item>
<item>
  <title>Space Between Words</title>
  <link>https://tim-stanley.com/post/space-between-words/</link>
  <description>&lt;div class="image-left"&gt;&lt;a href="http://www.flickr.com/photos/jeffrey/89461261/in/set-72157600634259444/"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/SpaceBetweenWords_A736/89461261_5f9712be2b_o_3.jpg" alt="Splendor of the Word by Jeff Tabaco" width="244" height="184" align="left" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;There seems to be a growing trend in the web community to remove &lt;a href="http://en.wikipedia.org/wiki/Space_(punctuation)"&gt;spaces between words&lt;/a&gt;.&amp;nbsp; The fact that domain names cannot have spaces further complicates the matter.&lt;/p&gt;
&lt;p&gt;Take a look at &lt;a href="http://blog.dreamhosters.com/2007/01/26/20-more-unfortunate-domain-names/"&gt;20 more unfortunate domain names&lt;/a&gt; and you can see the kind of confusion and unanticipated consequences that occur as a result.&amp;nbsp; By the way, domains can have the dash character (-) and subdomains allow the period (.) character, sometimes for interesting stylish effects (&lt;a href="http://del.icio.us.com/"&gt;del.ico.us&lt;/a&gt; now &lt;a href="http://delicious.com/"&gt;delicious&lt;/a&gt; and &lt;a href="http://script.aculo.us/"&gt;script.aculo.us&lt;/a&gt;). [more]&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Scripta continua&lt;/strong&gt;&lt;/em&gt; is the term for writing without any word separation&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I had a client who recently wanted to follow the trend and it got me wondering what was the origin of the space character in Latin based languages.&lt;/p&gt;
&lt;p&gt;I came across references to a book by Paul Sanger &lt;em&gt;Space between Words; the Origins of Silent Reading &lt;/em&gt;(Palo Alto, Stanford University Press, 1997).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.ranumspanat.com/saenger.html" href="http://www.ranumspanat.com/saenger.html"&gt;Orest Ranum&lt;/a&gt; much more eloquently explains a summary of Mr. Sanger's book than I can. Roger von Oech in &lt;a href="http://blog.creativethink.com/2007/02/give_me_space_b.html"&gt;give me some space&lt;/a&gt; has his own summary of the same history.&lt;/p&gt;
&lt;p&gt;Points I've taken away on the history of the events from what I've learned.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Monks find text without spaces can sometimes be ambiguous&lt;/li&gt;
&lt;li&gt;Folks find reading without spaces a high barrier to learning&lt;/li&gt;
&lt;li&gt;Some monks remove spaces between words when copying text&lt;/li&gt;
&lt;li&gt;Some monks add spaces between words when copying text&lt;/li&gt;
&lt;li&gt;Reading with spaces lowers the barrier to learning&lt;/li&gt;
&lt;li&gt;Reading with spaces makes silent reading easier than before&lt;/li&gt;
&lt;li&gt;Reading with spaces makes reading faster than before.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The monks were the web designers of the day.&amp;nbsp; It seems in learning how to create their illuminated manuscripts that they knew a bit about &lt;a href="/post/Visual-Communication.aspx"&gt;visual communication&lt;/a&gt; and how to make their content more usable to their audience.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jeffrey/89461491/in/set-72157600634259444/"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/SpaceBetweenWords_A736/89461491_dbde53ab67_o_3.jpg" alt="Grand Bible by Jeff Tabaco" width="464" height="349" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'll keep all the spaces around all my words and please don't take them away. After all, I need my space.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Space_(punctuation)"&gt;Wikipedia Space (punctuation)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a title="http://www.ranumspanat.com/saenger.html" href="http://www.ranumspanat.com/saenger.html"&gt;Orest Ranum's review of Paul Saenger's Spaces between Words&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/typography/ctfonts/WordRecognition.aspx"&gt;The Science of Word Recognition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>communication</category>
  <category>communication</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/space-between-words/</guid>
  <pubDate>Tue, 12 Aug 2008 16:31:00 GMT</pubDate>
</item>
<item>
  <title>Visual Studio 2008 SP 1 and .Net 3.5 SP 1 Released</title>
  <link>https://tim-stanley.com/post/visual-studio-2008-sp-1-and-net-35-sp-1-released/</link>
  <description>&lt;p&gt;Microsoft announced August 11 availability of the following new downloads.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=fbee1648-7106-44a7-9649-6d9f6d58056e&amp;amp;DisplayLang=en"&gt;Microsoft Visual Studio 2008 Service Pack 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=AB99342F-5D1A-413D-8319-81DA479AB0D7&amp;amp;displaylang=en"&gt;Microsoft .NET Framework 3.5 Service Pack 1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[more]Silverlight developers should also &lt;a href="http://blogs.msdn.com/amyd/archive/2008/08/11/silverlight-tools-must-be-updated-after-installing-visual-studio-2008-sp1.aspx"&gt;update the Silverlight Tools&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;VS 2008 includes the following technologies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Silverlight 2 SDK Beta 2 and Tools&lt;/li&gt;
&lt;li&gt;MVC Preview Release #3&lt;/li&gt;
&lt;li&gt;ASP.NET Extensions / Dynamic Data Preview&lt;/li&gt;
&lt;li&gt;VC 2008 Feature Pack&lt;/li&gt;
&lt;li&gt;VB PowerPack Controls&lt;/li&gt;
&lt;li&gt;Expression Studio 2&lt;/li&gt;
&lt;li&gt;SQL Server 2008&lt;/li&gt;
&lt;li&gt;.Net Framework 3.5 SDK&lt;/li&gt;
&lt;li&gt;XSLT Profiler&lt;/li&gt;
&lt;li&gt;VISTA 2.0 SDK&lt;/li&gt;
&lt;li&gt;Visual Studio 2008 SDK&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;.Net 3.5 SP 1 includes the following features and improvements&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ASP.NET Dynamic Data&lt;/li&gt;
&lt;li&gt;Core CLR improvements of images, strong name verification, better startup performance and better generated code&lt;/li&gt;
&lt;li&gt;WPF performance improvements&lt;/li&gt;
&lt;li&gt;The Entity Framework&lt;/li&gt;
&lt;li&gt;LING to SQL support for date and file stream&lt;/li&gt;
&lt;li&gt;ADO.NET Data Services Framework&lt;/li&gt;
&lt;li&gt;WCF improvements&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;Update:&lt;/span&gt; The VS 2008 SP 1 installation package installs .Net Framework 3.5 SP 1.&lt;/p&gt;
&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:cbe2c7c3-3e24-4daf-ab4c-fab559a8845b" class="wlWriterSmartContent" style="display: inline; margin: 0px; padding: 0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Visual%20Studio" rel="tag"&gt;Visual Studio&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.Net" rel="tag"&gt;.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Microsoft" rel="tag"&gt;Microsoft&lt;/a&gt;&lt;/div&gt;</description>
  <author>email@nospam.com</author>
  <category>software</category>
  <category>net</category>
  <category>visual-studio</category>
  <category>microsoft</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/visual-studio-2008-sp-1-and-net-35-sp-1-released/</guid>
  <pubDate>Tue, 12 Aug 2008 03:05:00 GMT</pubDate>
</item>
<item>
  <title>Design Layouts For Mobile Devices</title>
  <link>https://tim-stanley.com/post/design-layouts-for-mobile-devices/</link>
  <description>&lt;p&gt;After looking at &lt;a href="/post/Web-Applications-On-The-iPod-Touch.aspx"&gt;Web Applications On The iPod Touch&lt;/a&gt;, I thought I'd share some of the patterns used in designing an application for a 320 pixel x 240 pixel Windows CE 5 device.&amp;nbsp; These same design patterns and apply to designing for the iPod Touch and the iPhone as well. [more]&lt;/p&gt;
&lt;h1&gt;Minimum Touch Sizes&lt;/h1&gt;
&lt;p&gt;The main goal was to replace the need for the mobile stylus (which was constantly getting lost, even though it was tied to the device) with a layout that worked well with just using fingers and touching the screen. In order to establish a proper size for the layout, I needed to determine what is the smallest acceptable size that worked well.&amp;nbsp; I used my thumbs for these tests, figuring if I could hit the target size icons correctly with my thumbs, even users with large fingers would be able to use the device well.&lt;/p&gt;
&lt;div class="figure full-col"&gt;&lt;img src="/image.axd?picture=WindowsLiveWriter/DesigningForMobileDevices_8BF6/Touch%20Block%20Sizes_3.jpg" alt="Touch Grid Sizes" width="212" height="188" border="0" /&gt;
&lt;p&gt;fig 1: Touch grid sizes used for testing.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;After several experiments, I came to a list of acceptable sizes.&amp;nbsp; The smaller sizes work well only if there is a significant amount of spacing or gutter area around the icon.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;32 pixels by 32 pixels&lt;/li&gt;
&lt;li&gt;36 pixels by 36 pixels&lt;/li&gt;
&lt;li&gt;42 pixels by 42 pixels&lt;/li&gt;
&lt;li&gt;48 pixels by 48 pixels&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Mobile 240 Grid Designs&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://sonspring.com/journal/960-grid-system"&gt;Nathan Smith&lt;/a&gt; published a 960 grid system layout. The mobile layouts were developed in 2005 long before Nathan publish his grid notes, but I believe his grid system layout helps explain the solution I used in creating layouts for the mobile device.&lt;/p&gt;
&lt;p&gt;There are two basic column layouts that seemed to fit the available space.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Four columns, each 40 pixels wide with a 10 pixel gutter on each side.&lt;/li&gt;
&lt;li&gt;Three columns, each 48 pixels wide with a 20 pixel gutter on each side.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The four column grid works well for rows of information with icons or responses on the same row.&amp;nbsp; The three column grid works well for arrays of icons listed in the grid.&lt;/p&gt;
&lt;p&gt;A Microsoft Expression 2 design template is available for download: &lt;a href="/file.axd?file=240PublishedTemplate.zip"&gt;240 Mobile Expression Template Zip file&lt;/a&gt;.&lt;/p&gt;
&lt;div class="figure full-col"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/DesigningForMobileDevices_8BF6/4%20Column%20Grid_3.jpg" alt="4 Column Grid" width="200" height="260" border="0" /&gt;
&lt;p&gt;fig 2: Four Column Grid&lt;/p&gt;
&lt;/div&gt;
&lt;div class="image-figure "&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/DesigningForMobileDevices_8BF6/3%20Column%20Grid_3.jpg" alt="3 Column Grid" width="200" height="260" border="0" /&gt;
&lt;p&gt;fig 3: Three Column Grid&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The lower portion of the CE device display area is occupied by the status and "start" bar as well as the "keyboard" toggle icon.&amp;nbsp; This leaves a usable area for design of 240 pixels wide by 284 pixels tall for the application. The iPod Touch and iPhone have a larger vertical usable area at the same viewport setting. Primarily because there is no status area on the Apple device.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;After putting a header row of icons for quick access and a row of scrolling icons on the footer, that leaves room for about six icons.&lt;/p&gt;
&lt;div class="figure full-col"&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/DesigningForMobileDevices_8BF6/6%20Grid%20Mini_1.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/DesigningForMobileDevices_8BF6/6%20Grid%20Mini_thumb_1.jpg" alt="6 Grid Mini" width="200" height="260" border="0" /&gt;&lt;/a&gt;
&lt;p&gt;fig 4 Six icon mini grid.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The space on the windows CE device doesn't work into an even multiple of a grid and the remaining space can be utilized for date/time and breadcrumb information.&amp;nbsp; The layout with six icons and the breadcrumb areas looks like figure 5.&lt;/p&gt;
&lt;div class="figure full-col"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/DesigningForMobileDevices_8BF6/6%20Grid_6.jpg" alt="6 Grid" width="200" height="260" border="0" /&gt;
&lt;p&gt;fig 5: Six icon grid.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Figure 6 shown below is similar to the header row and figure 2 with the 4 column grid and rows or bars combined with icons and text.&lt;/p&gt;
&lt;div class="figure full-col"&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/DesigningForMobileDevices_8BF6/Home%20Bar_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/DesigningForMobileDevices_8BF6/Home%20Bar_thumb.jpg" alt="Home Bar" width="272" height="304" border="0" /&gt;&lt;/a&gt;
&lt;p&gt;fig 6: Six Grid&lt;/p&gt;
&lt;/div&gt;
&lt;div class="figure full-col"&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/DesigningForMobileDevices_8BF6/iPod_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/DesigningForMobileDevices_8BF6/iPod_thumb.jpg" alt="iPod" width="242" height="438" border="0" /&gt;&lt;/a&gt;
&lt;p&gt;fig 7: iPod and iPhone Home Layout.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I've shown in figure 7 an screen shot of the iPhone home screen for comparison.&amp;nbsp; The text label on the icon on the iPhone is extremely small.&amp;nbsp; This works on the iPod Touch and the iPhone because the screen brightness and contrast ration is extremely high.&amp;nbsp; The windows CE device I used had extremely low contrast and screen brightness making small text and small images difficult to read.&lt;/p&gt;
&lt;p&gt;From a contrast / usability perspective, I much prefer the iPod Touch and iPhone over the Windows CE device.&amp;nbsp; Primarily because the iPod Touch / iPhone support scrolling and zooming and the CE 5 device does not.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://960.gs/" href="http://960.gs/"&gt;960 Grid System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://sonspring.com/journal/960-grid-system" href="http://sonspring.com/journal/960-grid-system"&gt;Nathan Smith 960-grid-system&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/post/Web-Applications-On-The-iPod-Touch.aspx"&gt;Web Applications On The iPod Touch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:6737d9b0-8546-4745-9c59-fed3267452d8" class="wlWriterSmartContent" style="display: inline; margin: 0px; padding: 0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/iPod" rel="tag"&gt;iPod&lt;/a&gt;,&lt;a href="http://technorati.com/tags/iPhone" rel="tag"&gt;iPhone&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Touch%20Screen" rel="tag"&gt;Touch Screen&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Mobile" rel="tag"&gt;Mobile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/CE" rel="tag"&gt;CE&lt;/a&gt;&lt;/div&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>ce</category>
  <category>iphone</category>
  <category>mobile</category>
  <category>touch-screen</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/design-layouts-for-mobile-devices/</guid>
  <pubDate>Mon, 11 Aug 2008 21:21:00 GMT</pubDate>
</item>
<item>
  <title>Web Applications On The iPod Touch</title>
  <link>https://tim-stanley.com/post/web-applications-on-the-ipod-touch/</link>
  <description>&lt;p&gt;I recently did some research to see how a web based application developed for another mobile device on Windows CE 5 could be ported to the iPod Touch.&amp;nbsp; The application ran initially, but showed up very small on the iPod Touch browser display.&amp;nbsp; Clearly a bit of work would be needed. It wasn't as painful as some ports, but it wasn't totally pain free either. [more]&lt;/p&gt;
&lt;div&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/3ab20f7651be_F2B3/ipod-touch-2_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/3ab20f7651be_F2B3/ipod-touch-2_thumb.jpg" alt="iPod Touch Home" width="259" height="320" border="0"&gt;&lt;/a&gt; &lt;a href="http://www.bhphotovideo.com/c/product/520652-REG/Apple_MA627LL_A_iPod_touch_16GB_Wi_Fi.html/BI/1439/KBID/1925"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/3ab20f7651be_F2B3/iPod%20mirror_3.jpg" alt="B&amp;amp;H iPod Touch $299" width="166" height="320" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.bhphotovideo.com/c/product/520652-REG/Apple_MA627LL_A_iPod_touch_16GB_Wi_Fi.html/BI/1439"&gt;16 GB iPod Touch&lt;/a&gt;&lt;/div&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_apple-iphone-development-center"&gt;Apple iPhone Development Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_detecting-the-ipod-browser"&gt;Detecting The iPod Browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_setting-the-viewport"&gt;Setting The Viewport&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_icon-sizes-and-usability"&gt;Icon Sizes and Usability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_scrolling"&gt;Scrolling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_address-bars"&gt;Address Bars&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_javascript-issues"&gt;JavaScript Issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_porting-iphone-web-apps-to-other-devices"&gt;Porting iPhone Web Apps to Other Devices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="h1_apple-iphone-development-center"&gt;Apple iPhone Development Center&lt;/h1&gt;
&lt;p&gt;I started by taking a look at the Apple &lt;a href="http://developer.apple.com/iphone/"&gt;iPhone Development Center&lt;/a&gt;.&amp;nbsp;&amp;nbsp; I didn't have an account and I didn't bother to create one so I couldn't read any documentation that Apple may have.&amp;nbsp; The standard program is $99 and the enterprise program was $299.&amp;nbsp; I didn't want to build an application specifically for the iPod or iPhone, I just wanted to make the web pages look and work better so I kept searching.&lt;/p&gt;
&lt;h1 id="h1_detecting-the-ipod-browser"&gt;Detecting The iPod Browser&lt;/h1&gt;
&lt;p&gt;The application already had code to do browser sniffing, and then return a different style sheet for the mobile device than for a desktop IE or Firefox browser.&amp;nbsp; We looked for a solution that would work for both the iPhone and the iPod user agents.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;iPod Touch user agent string&lt;/strong&gt; Mozila/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Geckto) Version/3.0 Mobile/3A101a Safari/419.3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iPhone user agent string&lt;/strong&gt; Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1C28 Safari/419.3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We settled on using the string "&lt;em&gt;AppleWebKit&lt;/em&gt;" to denote both iPod and iPhone Safari browsers and then loaded a style sheet that I could tune to the iPod specific layout later.&lt;/p&gt;
&lt;h1 id="h1_setting-the-viewport"&gt;Setting The Viewport&lt;/h1&gt;
&lt;p&gt;The original application was developed for browsing on Windows CE with a width of 240 pixels and a height of 320 pixels (actually 294 usable pixels).&amp;nbsp; This happened to be the available area after the Windows CE toolbars were shown on the bottom.&amp;nbsp; After a few experiments to get the viewport settings where they would fit, I settled on the following.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;meta name="viewport" content="width=240; initial-scale=1.34; maximum-scale=5.0; user-scalable=yes;" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;After some experimentation with the iPod, I believe a new application developed specifically for the iPod would be most appropriate with a width of 480 pixels with zooming enabled.&lt;/p&gt;
&lt;p&gt;The iPod actually has a longer usable area so that would be utilized by extending some of the scrollable regions with the iPod specific CSS.&lt;/p&gt;
&lt;h1 id="h1_icon-sizes-and-usability"&gt;Icon Sizes and Usability&lt;/h1&gt;
&lt;p&gt;There were basically three icon sizes used in the application.&amp;nbsp; This application was actually developed and deployed a year before the first iPhone came out and long before the iPod Touch was available.&amp;nbsp; After some research and UI experiments to make the CE device work well with touch and without a stylus, the following size icons were used.&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;42 x 42 pixels - used for the top bar home page and for the target size for a block with an icon combined with text.&lt;/li&gt;
&lt;li&gt;36 x 36 pixels - used for most icons within the 42 x 42 icon block, or used on rows and bars.&lt;/li&gt;
&lt;li&gt;32 x 32 pixels - used for the lower icons and buttons used for scrolling (up, down, next, previous).&lt;/li&gt;
&lt;li&gt;Icons should have a transparent background around the edges or corners.&lt;/li&gt;
&lt;li&gt;Apple uses 57 x 57 pixel images for icons for the home page on the iPod and iPhone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the iPhone, remember the viewport settings determine how large the icon shows up on the screen, so a 128 x 128 pixel icon may not be large enough to touch if the viewport is zoomed out.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;These sizes were selected because of tests with users and their ability to hit the "target" area.&amp;nbsp; CE devices must be calibrated from time to time and experience has shown that having too small a target surface area combined with miscalibration can lead to users thinking they are pressing one icon, when in fact the system detects another.&amp;nbsp; At the least it causes confusion, but more problematic, it causes support headaches when people think the application isn't responding correctly when the hardware is out of calibration.&amp;nbsp; The iPod Touch has no calibration that I can find. I assume that's a good thing.&lt;/p&gt;
&lt;p&gt;Two layout combinations were used.&amp;nbsp; Rows for icons / text (about 6 rows fit on a screen) and icons in 9 grid icon layout.&lt;/p&gt;
&lt;p&gt;When a touch surface is used instead of a mouse, the user looses the hover event. In order to provide some feedback the hover / click events we set the style with a highlighted background or alternate color background on rows or bars and icon blocks.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/3ab20f7651be_F2B3/Home%20Bar_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/3ab20f7651be_F2B3/Home%20Bar_thumb.jpg" alt="Home Bar" width="240" height="270" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="h1_scrolling"&gt;Scrolling&lt;/h1&gt;
&lt;p&gt;The iPod touch provides a unique feature with multi touch screen support that makes other compact mobile devices obsolete. &lt;a href="http://www.ted.com/index.php/talks/jeff_han_demos_his_breakthrough_touchscreen.html"&gt;Jeff Han demonstrated a multi-touch design&lt;/a&gt; at TED in February 2006.&amp;nbsp; Since then, Apple and Microsoft and others have come out with displays that support multi touch, but Apple is the only one I'm aware of with multi touch support on mobile / portable small devices at this time.&amp;nbsp; The multi touch surface gives two unique abilities that could not be performed on compact touch surfaces in the past.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The ability to use two touch points to expand / collapse to zoom in and out.&lt;/li&gt;
&lt;li&gt;The ability to skim rapidly across the touch surface to scroll.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This opens the door to a significant limitation on mobile device layouts where space constraints limited the amount of information density on a page and scrolling used to require scroll buttons or icons on the screen which further limited the amount of available space.&amp;nbsp; Usability studies with auto scrolling, start/stop scrolling all proved confusing to users.&amp;nbsp; The multi-touch scrolling is very intuitive and is part of the iPod / iPhone operations system so it requires no additional coding or design on the part of the developer.&lt;/p&gt;
&lt;p&gt;The original application designed for CE had the scroll buttons on the bottom of each page, and these should be removed for an iPhone / iPod solution since the&lt;/p&gt;
&lt;h1 id="h1_address-bars"&gt;Address Bars&lt;/h1&gt;
&lt;p&gt;JavaScript code for scrolling the window and setting the orientation is supposed to work.&amp;nbsp; It may work on the iPhone, but in the time I had, I could not get it working in the iPod touch.&amp;nbsp; This does mean that the Safari address bar on the web browser shows up and must be scrolled out of the way.&amp;nbsp; This would need to be resolved for a production solution, but works fine for a prototype.&lt;/p&gt;
&lt;h1 id="h1_javascript-issues"&gt;JavaScript Issues&lt;/h1&gt;
&lt;p&gt;The iPod Safari browser has an option to turn on JavaScript and this application used JavaScript so it this option was turned on.&amp;nbsp; Even with the option turned on, some of the JavaScript used to expand / collapse sections worked and other functions worked, but others did not.&amp;nbsp; The same JavaScript worked fine in the CE environment.&amp;nbsp; I didn't pursue why it didn't work.&lt;/p&gt;
&lt;h1 id="h1_porting-iphone-web-apps-to-other-devices"&gt;Porting iPhone Web Apps to Other Devices&lt;/h1&gt;
&lt;p&gt;It's easier to get a full browser application working on the iPhone than on Windows CE.&amp;nbsp; The main two reasons are as follows.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The CE 5.0 IE Browser does not support .PNG images.&amp;nbsp; Images must be in JPG or GIF on CE.&amp;nbsp; The iPod support PNG images.&lt;/li&gt;
&lt;li&gt;CE 5.0 scrolling on windows requires a scroll bar (which occupies space).&amp;nbsp; Removing the scroll bar through CSS requires adding in paging or scrolling through another mechanism.&amp;nbsp; The iPod touch supports scrolling natively in the browser without adding in a scroll bar to occupy space on the screen.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="h1_references"&gt;References&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://testiphone.com"&gt;Testiphone.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.evotech.net/blog/2007/07/web-development-for-the-iphone/" href="http://www.evotech.net/blog/2007/07/web-development-for-the-iphone/"&gt;Web Development For The iPhone&lt;/a&gt; - Evotech&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.iphonewebdev.com/blog/" href="http://www.iphonewebdev.com/blog/"&gt;iPhone Web Dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://stepchange.typepad.com/blog/2007/07/developing-an-i.html" href="http://stepchange.typepad.com/blog/2007/07/developing-an-i.html"&gt;Developing An iPhone Application&lt;/a&gt; - Step Change Group&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dev.aol.com/blog/johnfronck/iPhoneJournalPart4"&gt;iPhone Journal - Creating the User Interface&lt;/a&gt; - John Frock&lt;/li&gt;
&lt;li&gt;&lt;a title="http://dev.aol.com/blog/johnfronck/iPhoneJournalPart2" href="http://dev.aol.com/blog/johnfronck/iPhoneJournalPart2"&gt;iPhone Journal - JavaScript Libraries&lt;/a&gt; - John Frock&lt;/li&gt;
&lt;li&gt;&lt;a title="http://developer.apple.com/iphone/" href="http://developer.apple.com/iphone/"&gt;iPhone Development Center&lt;/a&gt; - Apple&lt;/li&gt;
&lt;li&gt;&lt;a href="http://networkcreators.ning.com/profiles/blog/show?id=492224%3ABlogPost%3A135221"&gt;iPhone/iPod touch Custom Icon For Your Network&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:39d391e6-8c89-4088-a6c3-bd456c1a5430" class="wlWriterSmartContent" style="display: inline; float: none; margin: 0px; padding: 0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/iPod" rel="tag"&gt;iPod&lt;/a&gt;,&lt;a href="http://technorati.com/tags/iPhone" rel="tag"&gt;iPhone&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Touch%20Screen" rel="tag"&gt;Touch Screen&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Mobile" rel="tag"&gt;Mobile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/CE" rel="tag"&gt;CE&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Safari" rel="tag"&gt;Safari&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Apple" rel="tag"&gt;Apple&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows" rel="tag"&gt;Windows&lt;/a&gt;&lt;/div&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>iphone</category>
  <category>touch-screen</category>
  <category>apple</category>
  <category>ipod</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/web-applications-on-the-ipod-touch/</guid>
  <pubDate>Fri, 08 Aug 2008 21:11:00 GMT</pubDate>
</item>
<item>
  <title>Source Control Tools</title>
  <link>https://tim-stanley.com/post/source-control-tools/</link>
  <description>&lt;p&gt;&lt;a title="H.O. Studley Tool Chest" href="http://www.taunton.com/finewoodworking/ProjectsAndDesign/ProjectsAndDesignArticle.aspx?id=27038"&gt;&lt;img class="image-left" src="/image.axd?picture=WindowsLiveWriter/TheImportanceOfSourceControl_763F/w00088_01%5B1%5D_3.jpg" alt="H.O. Studley Tool Chest" width="221" height="240"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The limitations of your tools are your limitations. Choose your tools wisely.&lt;/em&gt; [more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h1_useful-source-control-tools"&gt;Useful Source Control Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_how-i-came-to-choose-vault"&gt;How I Came to Choose Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_source-control-poll-results"&gt;Source Control Poll Results&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h1_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Recently &lt;a href="http://www.codeproject.com"&gt;CodeProject&lt;/a&gt; published a survey to answer the question &lt;a href="http://www.codeproject.com/script/Surveys/Results.aspx?srvid=812"&gt;What Source Code Control system do you use?&lt;/a&gt; I find some of the results interesting and a bit unexpected in 2008.&lt;/p&gt;
&lt;p&gt;I consider source control part of the fundamental big three tools of software development.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Source control&lt;/li&gt;
&lt;li&gt;Work item or defect item tracking&lt;/li&gt;
&lt;li&gt;IDE or development environment or compiler&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What I find unusual:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The number of people &lt;strong&gt;using no source control&lt;/strong&gt; seems high.&lt;/li&gt;
&lt;li&gt;Given the &lt;a href="http://www.highprogrammer.com/alan/windev/sourcesafe.html"&gt;known problems&lt;/a&gt;, issues, and &lt;a href="http://www.sourcegear.com/vault/"&gt;alternatives to SourceSafe&lt;/a&gt;, the number of people still using SourceSafe seems extremely high.&lt;/li&gt;
&lt;li&gt;Given the high cost of the infrastructure and licensing of Microsoft Visual Studio Team Foundation, I am surprised at how many users report using it.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="h1_useful-source-control-tools"&gt;Useful Source Control Tools&lt;/h1&gt;
&lt;p&gt;The best source control system today is the one you already have. There is a cost to switch to a &lt;em&gt;better&lt;/em&gt; one.&amp;nbsp; There is a cost to administer the existing one.&amp;nbsp; There is a cost to administer (and purchase) a new one. Keep in mind the cost of the hardware and the administration to factor in the &lt;strong&gt;total cost&lt;/strong&gt; of a solution.&amp;nbsp; Free licenses does not equal free hardware or free administration.&lt;/p&gt;
&lt;p&gt;If you don't have a source control tool or want to switch to a new one, here are three useful source control systems.&amp;nbsp; You may find that switching to one of these tools is actually more cost effective and a better solution than what you have in place today.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.sourcegear.com/vault/"&gt;&lt;strong&gt;Sourcegear Vault&lt;/strong&gt;&lt;/a&gt; - free licensing for one user&lt;/li&gt;
&lt;li&gt;&lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; and &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSvn&lt;/a&gt; - free licenses for all users&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/vsts2008/default.aspx"&gt;Microsoft Team Foundation Server&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="h1_how-i-came-to-choose-vault"&gt;How I Came to Choose Vault&lt;/h1&gt;
&lt;p&gt;I used &lt;a href="http://en.wikipedia.org/wiki/PVCS"&gt;PVCS&lt;/a&gt; for years in multiple organizations dating back to the 1980's. It was a good an useful product, simple yet powerful but not too complicated. Somewhere along the way in the shift from company to company (Sage Software, Intersolve, Merant,&amp;nbsp; &lt;a href="http://www.serena.com/Products/dimensions/"&gt;Serena Software&lt;/a&gt; and now Silver Lake Partners), I believe PVCS lost it's vision and became too cumbersome and complicated and I think it's market share reflects this.&amp;nbsp; It was a good product. I've even recently used PVCS Dimensions for customer projects.&amp;nbsp; It works and does it's job of version control, but it's no longer a compelling product.&lt;/p&gt;
&lt;p&gt;In 1996, I was trying to do remote source sharing between the United States and the United Kingdom.&amp;nbsp; None of the tools worked well over the Internet (not even over a T1 line). Both PVCS and VSS failed miserably. The best we could come up with was remote desktop control and file transfers. I think somewhere around that time SourceOffsite came out.&amp;nbsp; I didn't try it.&lt;/p&gt;
&lt;p&gt;In 2001, I switched from PVCS to VSS for projects.&amp;nbsp; &lt;strong&gt;VSS is deceptive&lt;/strong&gt;.&amp;nbsp; It &lt;em&gt;appears&lt;/em&gt; like a cost effective tool because when you buy the MSDN subscriptions it's included.&amp;nbsp; It appears simple at first, but it's not very powerful.&amp;nbsp; What you get for free eventually costs you in lost time, lost files and lost changes (search for "&lt;em&gt;VSS issues&lt;/em&gt;"). With the VSS version I used up to 2003, If you tried to work remotely using multiple developer sites, it killed time and bandwidth just trying to get in sync.&lt;/p&gt;
&lt;p&gt;In 2003, someone at &lt;a href="http://www.callistosystems.com/"&gt;Callisto Systems&lt;/a&gt; suggested I try &lt;a href="http://www.sourcegear.com/vault/"&gt;Vault by Sourcegear&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vault was everything all the other source systems were not&lt;/strong&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It seamlessly imports files and history from existing VSS databases.&lt;/li&gt;
&lt;li&gt;Most importantly, it was easy to &lt;strong&gt;identify missing files&lt;/strong&gt; that were not checked in to the source control system.&lt;/li&gt;
&lt;li&gt;The smart client worked the way a lot of file operations are supposed to work on the desktop (i.e. there was no cumbersome web only interface for remote access).&lt;/li&gt;
&lt;li&gt;The smart client integrated seamlessly&amp;nbsp; with Visual Studio.&lt;/li&gt;
&lt;li&gt;There was a standalone Web Interface if you wanted it, so you could work even if the full client software wasn't installed.&lt;/li&gt;
&lt;li&gt;The client would automatically tell you which files were in sync and out of sync which saved time in updates.&lt;/li&gt;
&lt;li&gt;The client would pull only the most recent files for updates so it minimized bandwidth.&lt;/li&gt;
&lt;li&gt;Vault had a command line tool to support automated builds / gets.&lt;/li&gt;
&lt;li&gt;Vault is has a free license for one user (the 10% of the folks that use no source control now have no excuse).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I tried VSS, PVCS, CVS, Subversion and I still think in 2008, &lt;strong&gt;Vault is the best overall solution for source control&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In 2005, I tried to test Microsoft Visual Studio Team Foundation Server.&amp;nbsp; I couldn't put it on any existing workstations I had and I only had two servers in the office that met the hardware performance criteria and they were both Domain Controllers. VSTFS will not install on a Domain Controller (I tried).&lt;/p&gt;
&lt;h1 id="h1_source-control-poll-results"&gt;Source Control Poll Results&lt;/h1&gt;
&lt;p&gt;&lt;a href="http://www.codeproject.com/script/Surveys/Results.aspx?srvid=812"&gt;2008 CodeProject Source Code Control Poll Results&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/TheImportanceOfSourceControl_763F/image_11.png"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/TheImportanceOfSourceControl_763F/image_thumb_4.png" alt="image" width="520" height="422" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.vsoft-tech.com.au/Default.aspx?tabid=77&amp;amp;EntryID=190"&gt;2006 Vsoft Version Control Systems Poll&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.vsoft-tech.com.au/Default.aspx?tabid=77&amp;amp;EntryID=190"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/TheImportanceOfSourceControl_763F/image_9.png" alt="image" width="520" height="385" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id="h1_references"&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.codinghorror.com/blog/archives/000660.html"&gt;Source Control: Anything But SourceSafe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.highprogrammer.com/alan/windev/sourcesafe.html"&gt;Visual SourceSafe: Microsoft's Source Destruction System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Comparison_of_revision_control_software"&gt;Comparison of revision control software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_revision_control_software"&gt;List of revision control software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/vs2005/aa718670.aspx"&gt;Microsoft Visual SourceSafe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>software</category>
  <category>net</category>
  <category>visual-studio</category>
  <category>microsoft</category>
  <category>software-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/source-control-tools/</guid>
  <pubDate>Wed, 06 Aug 2008 21:18:00 GMT</pubDate>
</item>
<item>
  <title>Sidewalk Chalk</title>
  <link>https://tim-stanley.com/post/sidewalk-chalk/</link>
  <description>&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/William_Shakespeare"&gt;Shakespeare&lt;/a&gt; may have thought &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/As_You_Like_It"&gt;All the world's a stage&lt;/a&gt;&lt;/em&gt;, but &lt;a href="http://users.skynet.be/J.Beever/index.html"&gt;Julian Beever&lt;/a&gt; thinks all the world (or at least the sidewalk) is his canvas. Mr. Beever has some interesting artwork he calls &lt;a href="http://users.skynet.be/J.Beever/pave.htm"&gt;pavement drawings&lt;/a&gt;.&amp;nbsp; I don't think he actually digs up the sidewalk (pavement if you live in the UK), but it sure looks like it.&lt;/p&gt;
&lt;p&gt;Visit &lt;a href="http://users.skynet.be/J.Beever/index.html"&gt;Julian Beever's&lt;/a&gt; site to take a look at his portfolio of interesting chalk drawings.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://users.skynet.be/J.Beever/coke.html"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/PavementDrawings_ED7C/coke_3.jpg" alt="coke" width="244" height="162" border="0" /&gt;&lt;/a&gt; [more]&lt;/p&gt;
&lt;p&gt;&lt;a href="http://users.skynet.be/J.Beever/rembrandt.htm"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/PavementDrawings_ED7C/rembrandt_3.jpg" alt="rembrandt" width="244" height="172" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://users.skynet.be/J.Beever/fountain.html"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/PavementDrawings_ED7C/fountain_3.jpg" alt="fountain" width="244" height="364" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>interesting</category>
  <category>interesting</category>
  <category>photography</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/sidewalk-chalk/</guid>
  <pubDate>Tue, 05 Aug 2008 21:44:00 GMT</pubDate>
</item>
<item>
  <title>NASA Visible Earth Pictures</title>
  <link>https://tim-stanley.com/post/nasa-visible-earth-pictures/</link>
  <description>&lt;p&gt;NASA has a list of several (over 100,000) visible earth pictures at &lt;a href="http://visibleearth.nasa.gov/"&gt;NASA Images&lt;/a&gt;. Many of these images are quite stunning as is this one titled &lt;em&gt;&lt;a href="http://visibleearth.nasa.gov/view_rec.php?id=2429"&gt;The Blue Marble&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://visibleearth.nasa.gov/view_rec.php?id=2429"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/6abd7c7b490b_AD51/Earth.jpg" alt="NASA Earth North America" width="480" height="627" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>interesting</category>
  <category>interesting</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/nasa-visible-earth-pictures/</guid>
  <pubDate>Mon, 04 Aug 2008 16:38:00 GMT</pubDate>
</item>
<item>
  <title>Microsoft Product Support Lifecycle</title>
  <link>https://tim-stanley.com/post/microsoft-product-support-lifecycle/</link>
  <description>&lt;p&gt;Did you ever want a reason to upgrade? Before you start a new project on a mature stable Microsoft technology, you might want to check to see if it is still supported.&amp;nbsp; Microsoft typically provides support five years after the product general availability.&lt;/p&gt;
&lt;p&gt;For example, did you know that Microsoft .Net 1.1 mainstream support ends in October 2008?&lt;/p&gt;
&lt;p&gt;For more information on currently supported products, refer to the &lt;a href="http://support.microsoft.com/gp/lifeselectindex"&gt;Microsoft Support Lifecycle Index&lt;/a&gt;. [more]&lt;/p&gt;
&lt;p&gt;&lt;a href="http://support.microsoft.com/lifecycle/?p1=1249"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/MicrosoftProductSupportLifecycle_ABF6/image_3.png" alt=".Net 1.1 Support Lifecycle" width="446" height="223" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And it's sad to say those products I worked on back in the 1980's are now obsolete. MS-DOS went obsolete in 2001, and QuickBasic in 1999.&amp;nbsp; Who knew? Back in the 80's I used to port the MS-DOS and QuickBasic drivers (okay it was actually &lt;a href="http://en.wikipedia.org/wiki/GW-BASIC"&gt;GW-Basic&lt;/a&gt;) for &lt;a href="http://en.wikipedia.org/wiki/Data_General"&gt;Data General&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is a list of more&amp;nbsp; &lt;a href="http://support.microsoft.com/gp/lifeobsoleteproducts"&gt;obsolete Microsoft products&lt;/a&gt;.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>tips</category>
  <category>microsoft</category>
  <category>tips</category>
  <category>vista</category>
  <category>windows-server-2008</category>
  <category>xp</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/microsoft-product-support-lifecycle/</guid>
  <pubDate>Wed, 30 Jul 2008 17:46:00 GMT</pubDate>
</item>
<item>
  <title>ISP Speed Test</title>
  <link>https://tim-stanley.com/post/isp-speed-test/</link>
  <description>&lt;p&gt;At the Raleigh office, we recently upgraded our Time Warner Road Runner business class plan to 5 Mbps down, 1.5 Mbps up.&amp;nbsp; If you have to verify a speed test, the best site I've seen is at &lt;a href="http://www.speedtest.net/"&gt;Speedtest.net&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Speedtest.net provides a very interesting looking graphic interface along with some very interesting comparison statistics.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.speedtest.net/result/302633043.png"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/ISPSpeedTest_9AD4/image_3.png" alt="ISP Speed Test Result" width="324" height="174" border="0" /&gt;&lt;/a&gt; [more]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/ISPSpeedTest_9AD4/image_5.png"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/ISPSpeedTest_9AD4/image_thumb_1.png" alt="image" width="464" height="322" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>tips</category>
  <category>tips</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/isp-speed-test/</guid>
  <pubDate>Wed, 30 Jul 2008 15:10:00 GMT</pubDate>
</item>
<item>
  <title>Does Shading On Tables Improve Readability?</title>
  <link>https://tim-stanley.com/post/does-shading-on-tables-improve-readability/</link>
  <description>&lt;p&gt;Jessica Enders has an interesting article at &lt;a href="http://www.alistapart.com"&gt;A List Apart&lt;/a&gt; on &lt;a href="http://www.alistapart.com/articles/zebrastripingdoesithelp"&gt;Zebra Striping: Does it Really Help?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Her main points considered are does it increase accuracy, or speed.&amp;nbsp; The raw statistics don't show anything statistically significant.&amp;nbsp; The readers did report a 46% preference for zebra striping, but 36% said they didn't care.&lt;/p&gt;
&lt;p&gt;I believe that anything that improves the readability, or visual appeal of information is going to be helpful to users.&amp;nbsp; I also believe that with wider screens and more space between columns, the striping is more helpful. [more]&lt;/p&gt;
&lt;p&gt;An example of zebra striping:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;table class=&amp;quot;tableGrid&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;th&amp;gt;Feature&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;Importance&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;D40x&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;D80&amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;D200&amp;lt;/th&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr class=&amp;quot;gridItem&amp;quot;&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;Viewfinder&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td style=&amp;quot;text-align: center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;.8x&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;.95x&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;.94x&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
    &amp;lt;tr class=&amp;quot;gridItemAlt&amp;quot;&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;Aperture Dial&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td style=&amp;quot;text-align: center&amp;quot;&amp;gt;1&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;No*&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;Yes&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;Yes&amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/DoesShadingOnTablesImproveReadability_DBD3/Stripe%20Example_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/DoesShadingOnTablesImproveReadability_DBD3/Stripe%20Example_thumb.jpg" alt="Stripe Example" width="464" height="291" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;Three approaches to solving the strip pattern are hand coding tables, using ASP.Net alternate row style sheets on tables, or using JavaScript to modify the tables after they have been loaded.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a title="http://davidwalsh.name/advanced-css-tables-ii-using-mootools-javascript-for-alternate-row-colors" href="http://davidwalsh.name/advanced-css-tables-ii-using-mootools-javascript-for-alternate-row-colors"&gt;http://davidwalsh.name/advanced-css-tables-ii-using-mootools-javascript-for-alternate-row-colors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="color: #0000ff;"&gt;&lt;a href="http://www.ajaxprojects.com/ajax/tutorialdetails.php?itemid=234"&gt;http://www.ajaxprojects.com/ajax/tutorialdetails.php?itemid=234&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>communication</category>
  <category>communication</category>
  <category>css</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/does-shading-on-tables-improve-readability/</guid>
  <pubDate>Mon, 14 Jul 2008 15:00:00 GMT</pubDate>
</item>
<item>
  <title>Visual Communication</title>
  <link>https://tim-stanley.com/post/visual-communication/</link>
  <description>&lt;p&gt;It often takes so much effort to gather data in the first place that we rarely take the time to put the data into a visual form. If we take the time to present information visually though, it can have a much greater impact on recognition, retention and comprehension. [more]&lt;/p&gt;
&lt;p&gt;I've written about &lt;a href="/post/Communication-Illusions.aspx"&gt;Communication Illusions&lt;/a&gt; and where optical illusions can mislead.&lt;/p&gt;
&lt;p&gt;John Medina tells us about &lt;a href="http://brainrules.net/"&gt;Brain Rules&lt;/a&gt; and &lt;a href="http://www.brainrules.net/vision"&gt;vision trumps all other senses&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://brainrules.net/"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/VisualCommunication_9F0E/John%20Medina%20Brain%20Rules_3.jpg" alt="John Medina Brain Rules" width="251" height="324" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At a talk at &lt;a href="http://www.ted.com"&gt;TED&lt;/a&gt;, &lt;a href="http://www.ted.com/index.php/talks/view/id/279"&gt;Chris Jordan talks about picturing excess&lt;/a&gt;.&amp;nbsp; He not only takes the numbers and data and puts it into a visual form, but it takes on an artistic look and style as well.&lt;/p&gt;
&lt;p&gt;&lt;a title="Chris Jordan: Picturing excess" href="http://www.ted.com/index.php/talks/view/id/279"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/VisualCommunication_9F0E/Visual%202_3.jpg" alt="Visual excess" width="324" height="214" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://www.edwardtufte.com/tufte/"&gt;Edward Tufte&lt;/a&gt; has long been considered an expert in presenting &lt;a href="http://www.amazon.com/Visual-Display-Quantitative-Information-2nd/dp/0961392142/ref=tsisystemsllc-20"&gt;data in a visual form&lt;/a&gt;.&amp;nbsp; I recently found out that &lt;a href="http://benfry.com/"&gt;Ben Fry&lt;/a&gt; has written some similar information about &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0596514557/ref=tsisystemsllc-20"&gt;visualizing data&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://vis.cs.ucdavis.edu/~ogawa/"&gt;Michael Ogawa&lt;/a&gt; was inspired by this information visualization to create some stunning video's called &lt;a href="http://vis.cs.ucdavis.edu/~ogawa/codeswarm/"&gt;code swarm&lt;/a&gt; that incorporate music, time, and statistics for the interactions that developers have on open source projects.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vis.cs.ucdavis.edu/~ogawa/codeswarm/"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/VisualCommunication_9F0E/clip_image002_3.gif" alt="Code Swarm" width="324" height="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.mrfeinberg.com/"&gt;Jonathan Feinberg&lt;/a&gt; has created &lt;a href="http://wordle.net/"&gt;Wordle&lt;/a&gt; which can generate &lt;em&gt;word clouds&lt;/em&gt; from text.&amp;nbsp; Below are some images from transcripts of presentations at &lt;a href="http://www.ted.com"&gt;TED&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.ted.com/2008/06/wordle_tedtalks.php"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/VisualCommunication_9F0E/GalloWordle_3.jpg" alt="Wordle" width="324" height="231" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If your inclined to create your own charts and don't have Excel or&amp;nbsp;a chart rendering control or tool, there's &lt;a href="http://code.google.com/apis/chart/"&gt;Google charts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/apis/chart/"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/VisualCommunication_9F0E/Google%20charts_3.png" alt="Google charts" width="240" height="96" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>communication</category>
  <category>communication</category>
  <category>vision</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/visual-communication/</guid>
  <pubDate>Thu, 19 Jun 2008 22:23:00 GMT</pubDate>
</item>
<item>
  <title>Web Developer's SEO Cheat Sheet</title>
  <link>https://tim-stanley.com/post/web-developers-seo-cheat-sheet/</link>
  <description>&lt;p&gt;Danny Dover has posted on &lt;a href="http://www.seomoz.org"&gt;seomoz.org&lt;/a&gt; an outstanding search engine optimization cheat for web sites.&amp;nbsp; It's a great reference point and a reminder of things to check. [more]&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.seomoz.org/blog/the-web-developers-seo-cheat-sheet"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/WebDevelopersSEOCheatSheet_9D6C/SEO%20Cheat%20Sheet_3.jpg" alt="SEO Cheat Sheet" width="464" height="363" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>web-development</category>
  <category>search</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/web-developers-seo-cheat-sheet/</guid>
  <pubDate>Mon, 16 Jun 2008 15:16:00 GMT</pubDate>
</item>
<item>
  <title>Best High End Nikon Lenses 2008</title>
  <link>https://tim-stanley.com/post/best-high-end-nikon-lenses-2008/</link>
  <description>&lt;p&gt;What's the best Nikon lens?&amp;nbsp; Everybody asks that question, but can you really afford it?&amp;nbsp; Thom Hogan has written one of the best detailed explanations I've seen in his article &lt;a href="http://bythom.com/rationallenses.htm"&gt;Nikkor Lens Assessment&lt;/a&gt;.&amp;nbsp; The only thing missing is the prices in his best pick list.&lt;/p&gt;
&lt;p&gt;I've written about some of these lenses in &lt;a href="/post/Nikon-Lens-Best-Values.aspx"&gt;Nikon Lens Best Values&lt;/a&gt;.&amp;nbsp; Just read the &lt;a href="http://www.flickr.com/groups/d80"&gt;Flickr Nikon D80 group&lt;/a&gt; and you'll see these lenses recommended time and time again.&amp;nbsp; Save some bucks and lift some weights though, these pro class lenses are heavy and not light on the pocketbook either.&lt;/p&gt;
&lt;p&gt;These lenses are extremely popular and you'll often find them out of stock, so if you want one, you better act soon.&amp;nbsp; If you wanted a reason to get a D80, D200, D300 or D3 over a D40, many of these lenses are not compatible with the D40.&lt;/p&gt;
&lt;p&gt;Most of these lenses hold their value over time.&amp;nbsp; So if you buy one and are lucky, you might be able to sell it a few years down the road and you'll have had the use of a fine lens for less than the cost of a fine meal. [more]&lt;/p&gt;
&lt;p&gt;Prices are as of June 2008 (just in time for fathers day).&lt;/p&gt;
&lt;table style="width: 425px;" border="0" cellspacing="0" cellpadding="4"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style="width: 232.734px;" valign="top"&gt;&lt;strong&gt;Lens&lt;/strong&gt;&lt;/th&gt;
&lt;th style="width: 59.8906px;" valign="top"&gt;&lt;strong&gt;Filter&lt;/strong&gt;&lt;/th&gt;
&lt;th style="width: 100.375px;" valign="top"&gt;&lt;strong&gt;B&amp;amp;H &lt;br /&gt;Price&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon 14-24mm f/2.8G&lt;br /&gt;ED-IF AF-S&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;&lt;a title="Nikon 14-24mm f/2.8G" href="http://www.bhphotovideo.com/c/product/520635-USA/Nikon_2163_AF_S_Zoom_Nikkor_14_24mm.html"&gt;$1589.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon 28-70mm f/2.8D&lt;br /&gt;ED-IF AF-S&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;77mm&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon 24-70mm f/2.8G &lt;br /&gt;ED-IF AF-S&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;77mm&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;&lt;a title="Nikon 24-70mm f/2.8G" href="http://www.bhphotovideo.com/c/product/520637-USA/Nikon_2164_AF_S_Zoom_Nikkor_24_70mm.html"&gt;$1699.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon 70-200mm f/2.8G VR&lt;br /&gt;AF-S&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;77mm&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;&lt;a title="Nikon 70-200mm f/2.8G VR" href="http://www.bhphotovideo.com/c/product/274780-USA/Nikon_2139_70_200mm_f_2_8D_VR_G_AFS.html"&gt;$1624.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon 80-200mm f/2.8D&lt;br /&gt;ED AF&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;77mm&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;&lt;a title="Nikon 80-200mm f/2.8D" href="http://www.bhphotovideo.com/c/product/124669-USA/Nikon_1986_80_200mm_f_2_8_ED_AF_D.html"&gt;$914.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon 300mm f/2.8G VR&lt;br /&gt;ED-IF&amp;nbsp; AF-S&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;52mm&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;&lt;a title="Nikon 300mm f/2.8G VR" href="http://www.bhphotovideo.com/c/product/364708-USA/Nikon_2154_300mm_f_2_8_G_AFS_ED_IF.html"&gt;$4499.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon 600mm f/4G VR&lt;br /&gt;AF-S&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;52mm&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;&lt;a title="Nikon 600mm f/4G VR" href="http://www.bhphotovideo.com/c/product/520646-USA/Nikon_2173_Telephoto_AF_S_Nikkor_600mm.html"&gt;$9499.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon TC-14E II 1.4x&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;N/A&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;&lt;a title="Nikon TC-14E II 1.4x" href="http://www.bhphotovideo.com/c/product/228165-USA/Nikon_2129_TC_14EII_1_4x_Teleconverter_for.html"&gt;$409.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon TC-17E II 1.7x&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;N/A&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;&lt;a title="Nikon TC-17E II 1.7x" href="http://www.bhphotovideo.com/c/product/337511-USA/Nikon_2151_TC_17E_II_1_7x_Teleconverter.html"&gt;$419.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon 60mm f/2.8D &lt;br /&gt;Micro-Nikkor&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;62mm&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;&lt;a title="Nikon 60mm f/2.8D" href="http://www.bhphotovideo.com/c/product/66987-USA/Nikon_1987_60mm_f_2_8D_Macro_Autofocus.html"&gt;$394.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon 85mm f/1.4D IF AF&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;77mm&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;&lt;a title="Nikon 85mm f/1.4D IF AF" href="http://www.bhphotovideo.com/c/product/108421-USA/Nikon_1933_Telephoto_AF_Nikkor_85mm.html"&gt;$1024.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon 105mm f/2.8G VR&lt;br /&gt;Micro-Nikkor&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;62mm&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;&lt;a title="Nikon 105mm f/2.8G VR" href="http://www.bhphotovideo.com/c/product/424744-USA/Nikon_2160_105mm_f_2_8G_ED_IF_AF_S.html"&gt;$759.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 232.734px;" valign="top"&gt;Nikon 24mm f/3.5D ED PC-E&lt;/td&gt;
&lt;td style="width: 59.8906px;" valign="top"&gt;77mm&lt;/td&gt;
&lt;td style="width: 100.375px;" valign="top"&gt;&lt;a title="Nikon 24mm f/3.5D ED PC-E" href="http://www.bhphotovideo.com/c/product/545664-USA/Nikon_2168_Wide_Angle_PC_E_Nikkor.html"&gt;$1899.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>nikon</category>
  <category>photography</category>
  <category>lenses</category>
  <category>best-lenses</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/best-high-end-nikon-lenses-2008/</guid>
  <pubDate>Fri, 13 Jun 2008 20:21:00 GMT</pubDate>
</item>
<item>
  <title>Email CSS Guide</title>
  <link>https://tim-stanley.com/post/email-css-guide/</link>
  <description>&lt;p&gt;Campaign Monitor has published a fully detailed list of the &lt;a href="http://www.campaignmonitor.com/css/"&gt;CSS supported in email clients&lt;/a&gt;.&amp;nbsp; It's fairly extensive with 21 different sets of results and a breakdown of all the major email systems for both desktop and web clients.&lt;/p&gt;
&lt;p&gt;They provide both a downloadable PDF and a Excel version.&amp;nbsp; Excellent work.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.campaignmonitor.com/css/"&gt;&lt;img style="border: 0px;" src="/image?picture=WindowsLiveWriter/EmailCSSGuide_10096/Email%20CSS_3.jpg" alt="Email CSS" width="464" height="224" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>css</category>
  <category>web-development</category>
  <category>email</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/email-css-guide/</guid>
  <pubDate>Thu, 12 Jun 2008 22:15:31 GMT</pubDate>
</item>
<item>
  <title>Free Textures</title>
  <link>https://tim-stanley.com/post/free-textures/</link>
  <description>&lt;p&gt;Free textures from various sites and a &lt;a href="http://www.flickr.com/people/25170759@N03/"&gt;Photoshop texture tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://flickr.com/photos/ghostbones/sets/72157603698161108/with/2419152148/"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreeTextures_C1F4/Texture%201_3.jpg" alt="Texture 1" width="324" height="271" border="0" /&gt;&lt;/a&gt; [more]&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/liek/with/2430374655/"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreeTextures_C1F4/Texture%202_3.jpg" alt="Texture 2" width="324" height="262" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/groups/quality_textures/pool/with/2443604506/"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreeTextures_C1F4/Texture%203_3.jpg" alt="Texture 3" width="324" height="255" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/25170759@N03/sets/72157604739686230/"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/FreeTextures_C1F4/Texture%204_3.jpg" alt="Texture 4" width="324" height="114" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>textures</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/free-textures/</guid>
  <pubDate>Fri, 23 May 2008 17:51:00 GMT</pubDate>
</item>
<item>
  <title>12 Slideshow Tools For Photographers</title>
  <link>https://tim-stanley.com/post/12-slideshow-tools-for-photographers/</link>
  <description>&lt;p&gt;Why is it so hard to create a professional looking slide show of digital images on a web site?&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Infrastructure, Tools, and systems are critical for professionals and hobbyists.&amp;nbsp; If a tool saves time compared to the money it costs, it's worth it.&amp;nbsp; If it's free, that's even better.&lt;/p&gt;
&lt;p&gt;It seems like putting photos on a web site and creating a slide show should be simple. Take some pictures, download photos off the camera, sort through them, pick a few good ones, do some minor editing and cropping, and upload them to a web site or gallery, update a few descriptions or notes and be done.&amp;nbsp; After that, post the image (or slide show) on a few other sites.&amp;nbsp; All of that should take about 15 minutes of work and using one tool that doesn't cost a fortune on both an Apple or Microsoft platform for any host provider. Sadly, in 2008 this can't be done on a Microsoft platform and can only be done by one host (.Mac) on an Apple platform.&lt;/p&gt;
&lt;p&gt;The Apple platform with the .Mac hosting is the only thing that comes close. For everything else, it can take hours to create a photo gallery slide show. I can't find something simple to make this easier.&lt;/p&gt;
&lt;p&gt;This is the list of 12 tools (okay it's a list of 14) with a few tools which are compelling. [more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_flickr-slideshows"&gt;Flickr Slideshows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_mac-web-gallery"&gt;.Mac Web Gallery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_slide-show-pro"&gt;Slide Show Pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_simpleviewer"&gt;SimpleViewer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_google-picasa"&gt;Google Picasa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_photoshop-express"&gt;Photoshop Express&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_photofolio"&gt;PhotoFolio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_dfgallery"&gt;dfGallery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_zenfolio"&gt;ZenFolio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_photonet"&gt;Photo.Net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_slideroll"&gt;Slideroll&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_slidecom"&gt;Slide.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_microsoft-html-slide-show-wizard"&gt;Microsoft HTML Slide Show Wizard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_triptracker"&gt;TripTracker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Short on time? Here's the short list of tips.&amp;nbsp; Ignore the rest.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Flickr - Get it, use it.&lt;/li&gt;
&lt;li&gt;.Mac - Got a Mac?, Get iphoto and .Mac.&lt;/li&gt;
&lt;li&gt;SimpleViewer - Get it for your website. Use it to connect to Flickr (nFlickrViewer), or if your a Picassa, Lightroom or Photoshop user, use it to generate galleries easily and then put those on your web site.&lt;/li&gt;
&lt;li&gt;SlideShowPro - If your an Adobe Lightroom user, get it.&amp;nbsp; If you want a professional slide show on your web site, get it.&lt;/li&gt;
&lt;li&gt;Picassa - Get it, try it.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h2_flickr-slideshows"&gt;Flickr Slideshows&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cost: Free or $24.95/yr (pro)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://flickr.com/"&gt;Flickr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://paulstamatiou.com/2005/11/19/how-to-quickie-embedded-flickr-slideshows"&gt;Embedded Flickr Slideshows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.db798.com/pictobrowser/index.html"&gt;PictoBrowser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.flickrshow.com/" href="http://www.flickrshow.com/"&gt;Flickr Show&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://flickrslidr.com/"&gt;Flickr Slider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tinou.com/coverflow.jsp"&gt;Flickr Coverflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.codeplex.com/nFlickrViewer/" href="http://www.codeplex.com/nFlickrViewer/"&gt;nFlickrViewer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.flickriver.com/"&gt;Flickr River&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeplex.com/nFlickrViewer"&gt;nFlickrViewer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Flickr has some kind of magic recipe they use when displaying images.&amp;nbsp; The thumbnails look good, the small, medium, and large sizes look good.&amp;nbsp; There are numerous tools from third parties and API's for more tools in the future (Microsoft developers see &lt;a title="http://www.codeplex.com/FlickrNet" href="http://www.codeplex.com/FlickrNet"&gt;FlickrNet&lt;/a&gt;). Pro subscribers can add photos to a set.&amp;nbsp; Photos can be viewed by sets or by tags.&lt;/p&gt;
&lt;p&gt;The downside of Flickr is the upload, tagging, and description process is mildly painful.&amp;nbsp; Flickr has a desktop upload tool that's a little less painful, but it's not as easy as Picasa to upload a batch of files. There is no off-line photo editing ability provided, but &lt;a href="http://www.picnik.com/"&gt;Picknik&lt;/a&gt; does provide the very powerful editing abilities to edit Flickr photos directly on the web.&lt;/p&gt;
&lt;p&gt;Once the images are on Flickr, then one can create a slide show using the Flickr Show or Flickr Slidr and then embed the code into your site.&lt;/p&gt;
&lt;p&gt;Flickr Slide show&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Flickr%20Slide%20Show_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Flickr%20Slide%20Show_thumb.jpg" alt="Flickr Slide Show" width="236" height="244" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PictoBrowser&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/PictoBrowser_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/PictoBrowser_thumb.jpg" alt="Picto Browser" width="244" height="139" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Coverflow&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Flickr%20Coverflow_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Flickr%20Coverflow_thumb.jpg" alt="Flickr Coverflow" width="244" height="121" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;nFlickrViewer and SimpleViewer&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/nFlickrViewer_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/nFlickrViewer_thumb.jpg" alt="nFlickrViewer" width="244" height="138" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_mac-web-gallery"&gt;.Mac Web Gallery&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cost: $99.95/yr&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.apple.com/dotmac/"&gt;.Mac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;upload / download images&lt;/li&gt;
&lt;li&gt;Slideshows&lt;/li&gt;
&lt;li&gt;Integrates with iPhoto&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Mac%201_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Mac%201_thumb.jpg" alt="Mac 1" width="244" height="209" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Mac%202_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Mac%202_thumb.jpg" alt="Mac 2" width="244" height="195" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_slide-show-pro"&gt;Slide Show Pro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cost: $29 (flash version) or $25 (lightroom version)&lt;/li&gt;
&lt;li&gt;&lt;a title="http://slideshowpro.net/" href="http://slideshowpro.net/"&gt;SlideShowPro.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Flash based slide show, using XML files as images and thumbnails&amp;nbsp;&lt;/li&gt;
&lt;li&gt;supports images and videos&lt;/li&gt;
&lt;li&gt;very small thumb nails&lt;/li&gt;
&lt;li&gt;timed play / pause&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Slide Show Pro seems to be geared toward Flash and Lightroom users.&amp;nbsp; It's one of the best looking slide show's I've seen.&amp;nbsp; The images don't get fuzzy at unusual sizes like some slide shows.&amp;nbsp; If you don't have Flash, you can still update an XML file.&amp;nbsp; Generating and updating the file is tedious.&amp;nbsp; It's not for a casual user, but it looks extremely professional.&amp;nbsp; The SlideShowPro Director provides a hosting based solution to aid in uploading the files, but it does require an Apache or Windows server, PHP, and MySQL database.&amp;nbsp; Director is for web developers.&amp;nbsp; Non developers could use the Director Hosting option if this is really something that interests you.&amp;nbsp; See the videos on the site to see more about how it works.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Slide%20Show%20Pro_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Slide%20Show%20Pro_thumb.jpg" alt="Slide Show Pro" width="244" height="241" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_simpleviewer"&gt;SimpleViewer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cost: Free, $45 (Pro version)&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.airtightinteractive.com/simpleviewer/" href="http://www.airtightinteractive.com/simpleviewer/"&gt;SimpleViewer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.airtightinteractive.com/simpleviewer/auto_server_instruct.html" href="http://www.airtightinteractive.com/simpleviewer/auto_server_instruct.html"&gt;SimpleViewer Automatic Web Server gallery build&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Flash, XML files and Thumbnails&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Tool support for PhotoShop , Picasa (Windows), Porta (Windows), iPhoto (Macintosh), RapidWeaver, (Macintosh), Aperture (Macintosh), SimpleViewerExport (Linux), Adobe Lightroom (Windows and Macintosh), Flickr&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.airtightinteractive.com/simpleviewer/auto_desktop_instruct.html#picasa" href="http://www.airtightinteractive.com/simpleviewer/auto_desktop_instruct.html#picasa"&gt;Picasa Simple Viewer Template&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SimpleViewer isn't really a slideshow, it's a gallery tool.&amp;nbsp; Airtight interactive (the developer of SimpleViewer) also provides an AutoViewer, but it's a panel viewer, not a fade slide viewer.&amp;nbsp; The fantastic thing about SimpleViewer is that when combined with other tools (Like Picasa, PhotoShop, or others), those tools can generate galleries using the SimpleViewer templates.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If combined with nFlickrViewer, it will pull images off Flickr and show them as part of the gallery.&amp;nbsp; It's a compelling combination, but nFlickrViewer is for developers.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Simple%20Viewer_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Simple%20Viewer_thumb.jpg" alt="Simple Viewer" width="244" height="126" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_google-picasa"&gt;Google Picasa&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cost: Free&lt;/li&gt;
&lt;li&gt;&lt;a href="http://picasa.google.com/"&gt;Picasa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Imports files from cameras (including raw formats).&lt;/li&gt;
&lt;li&gt;Edits HTML, quick exports of thumbnails and images.&lt;/li&gt;
&lt;li&gt;Exports galleries (or Albums).&lt;/li&gt;
&lt;li&gt;Combines with SimpleViewer to generate a SimpleViewer gallery&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The desktop portion of Picasa is a fairly good consumer grade tool.&amp;nbsp; It's the first half of the vision.&amp;nbsp; It's simple quick and fast.&amp;nbsp; The downside is that the ability to edit features (like sharpening) is severely limited.&amp;nbsp; Likewise, the image exports and resizing loose significant sharpness than other tools like Paintshop Pro or Photoshop.&amp;nbsp; The good news is it's free and quick and easy to use.&lt;/p&gt;
&lt;p&gt;The web portion looks bad.&amp;nbsp; It's slow, it's grainy, but it's easy.&amp;nbsp; If Flickr has the magic recipe for sharp images, Google Picasa doesn't have a clue.&amp;nbsp; Even sharp images look fuzzy on Picasa on the web.&amp;nbsp; Thumbnails are bad, regular images look fuzzy, slide images are very fuzzy.&amp;nbsp; Picasa also limits the size of the original if you want to use it for downloads.&lt;/p&gt;
&lt;p&gt;Because it's so quick and easy to use, Picasa is great for sharing snapshots with friends and family, but bad for trying to present a professional photograph.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Picassa_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Picassa_thumb.jpg" alt="Picassa" width="244" height="193" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_photoshop-express"&gt;Photoshop Express&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cost: Free for 2 GB&lt;/li&gt;
&lt;li&gt;&lt;a title="https://www.photoshop.com/express/landing.html" href="https://www.photoshop.com/express/landing.html"&gt;Photoshop Express&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Integrates with Flickr (download, upload)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Photoshop Express still lists itself as a Beta at this time.&amp;nbsp; It has a few performance tweaks and a few bugs with loosing the mouse and actions to work out, but it looks promising. Photoshop Express allows carousel slide shows and plays on a timer.&amp;nbsp; It doesn't have quite as many editing features as PickNik, but the free slide show feature and the ability to embed the slide shows into other pages is great.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Photoshop%20Express_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Photoshop%20Express_thumb.jpg" alt="Photoshop Express" width="244" height="189" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_photofolio"&gt;PhotoFolio&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cost: Free, $25 Pro version, $50 commercial version&lt;/li&gt;
&lt;li&gt;&lt;a title="http://photofolio.us/" href="http://photofolio.us/"&gt;Photofolio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Requires PHP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Photofolio allows one to upload images to a directory, and then a PHP script when run will scan the directory and build a slide show.&amp;nbsp; It's going to require some development time or manual editing of XML files to get this working.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/PhotoFolio_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/PhotoFolio_thumb.jpg" alt="PhotoFolio" width="244" height="116" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_dfgallery"&gt;dfGallery&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cost: Free&lt;/li&gt;
&lt;li&gt;Link: &lt;a href="http://www.dezinerfolio.com/2007/06/07/dfgallery/"&gt;Dezinerfolio dfGallery&lt;/a&gt; - recommended&lt;/li&gt;
&lt;li&gt;Flickr, Picassa, Fotki, Photobucket and custom images&lt;/li&gt;
&lt;li&gt;requires PHP 5 on the host&lt;/li&gt;
&lt;li&gt;Flash based slide show&lt;/li&gt;
&lt;li&gt;Has support for music&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is very similar in nature to Slide Show Pro.&amp;nbsp; It doesn't integrate with any tools, it has&amp;nbsp; the same negatives about Slide Show Pro (i.e. a lot of manual editing of the XML file is involved), but it does look pretty good.&amp;nbsp; It also integrates into reading&amp;nbsp; a Flickr account, but I've yet to get that feature working.&amp;nbsp; If the Flickr feature worked out of the box, it would be very compelling.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/dfGallery_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/dfGallery_thumb.jpg" alt="dfGallery" width="244" height="177" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_zenfolio"&gt;ZenFolio&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://www.zenfolio.com/zf/tour.aspx" href="http://www.zenfolio.com/zf/tour.aspx"&gt;ZenFolio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cost: $25, $40, $100 / yr (depends on features)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ZenFolio has a very good slide show.&amp;nbsp; The slide show images are sharp and clear.&amp;nbsp; It's thumbnails are not as sharp, but it's not near as bad as Picasa. ZenFolio is really as site for to aid in selling prints and hosting photos.&amp;nbsp; There are no offline tools.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/ZenFolio_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/ZenFolio_thumb.jpg" alt="ZenFolio" width="244" height="183" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_photonet"&gt;Photo.Net&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cost: $25/yr&lt;/li&gt;
&lt;li&gt;&lt;a href="http://Photo.net"&gt;Photo.Net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://photo.net/photodb/slideshow?folder_id=771051"&gt;Mikel Arrizabalag example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Photo.Net provides a simple gallery and slide show.&amp;nbsp; The images on the slideshow look fairly good.&amp;nbsp; The images on the thumbnails look as bad as Picasa.&amp;nbsp; Flickr and .Mac are far better options.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Photo.Net_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Photo.Net_thumb.jpg" alt="Photo.Net" width="244" height="217" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_slideroll"&gt;Slideroll&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cost: Free&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slideroll.com/"&gt;slideroll&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Music&lt;/li&gt;
&lt;li&gt;Upload photos, or get them from Myspace, or Flickr.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Slideroll appear to be more for the Youtube or Myspace crowd.&amp;nbsp; The images look better than Slide.com, but there are better options.&amp;nbsp; It's easy to put together a short show.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Slideroll_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Slideroll_thumb.jpg" alt="Slideroll" width="244" height="164" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_slidecom"&gt;Slide.com&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cost: Free&lt;/li&gt;
&lt;li&gt;Link: &lt;a href="http://slide.com"&gt;Slide.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add images from Friendster, Bebo, MySpace, Slide, Photobucket, Facebook, Flickr, or a specific image URL.&lt;/li&gt;
&lt;li&gt;Sizes small (350x262), medium (426x320) large (600x475)&lt;/li&gt;
&lt;li&gt;Has support for music&lt;/li&gt;
&lt;li&gt;Images appear grainy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Slide is quick.&amp;nbsp; You can grab images from other sites quickly (even anywhere on the web) and build a slide show with a variety of interesting effects.&amp;nbsp; The downside of slide is they appear to use the same fuzzy recipe for displaying the images.&amp;nbsp; Sharp pictures on Flickr come out fuzzy on slide.com slide shows.&amp;nbsp; It's an interesting tool, but it's a toy, not a professional tool.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Slide_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/Slide_thumb.jpg" alt="Slide" width="244" height="181" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_microsoft-html-slide-show-wizard"&gt;Microsoft HTML Slide Show Wizard&lt;/h2&gt;
&lt;p&gt;The Microsoft HTML slide Show Wizard is easy to use and allows selection of multiple folders and images from other folders to combine into one single slide show, but the images that are resized are extremely grainy at best.&amp;nbsp; Each page is loaded in a separate html file ( 0.htm, 1.htm, 2.htm, etc.). Files generated are in the same directory. Two images generated per image ( imagename.JPG.jpg, imagename.JPG.thumb.jpg ).&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cost: Free&lt;/li&gt;
&lt;li&gt;Link: &lt;a href="http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx"&gt;Microsoft HTML Slide Show&lt;/a&gt; - not recommended.&lt;/li&gt;
&lt;li&gt;Sizes images to the following sizes.&lt;/li&gt;
&lt;li&gt;100x78 - thumbnails&lt;/li&gt;
&lt;li&gt;320x240&lt;/li&gt;
&lt;li&gt;640x480&lt;/li&gt;
&lt;li&gt;800x600&lt;/li&gt;
&lt;li&gt;original picture size&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/MSFT%20HTML%20Slide%20Show_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/MSFT%20HTML%20Slide%20Show_thumb.jpg" alt="Microsoft HTML Slide Show" width="244" height="178" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_triptracker"&gt;TripTracker&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cost: Free or $25 per site&lt;/li&gt;
&lt;li&gt;&lt;a title="http://slideshow.triptracker.net/" href="http://slideshow.triptracker.net/"&gt;http://slideshow.triptracker.net/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's an interesting concept, but some of the other tools are far better.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/TripTracker_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/SlideShows_B6B8/TripTracker_thumb.jpg" alt="TripTracker" width="244" height="212" border="0"&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>photoshop</category>
  <category>slide-show</category>
  <category>gallery</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/12-slideshow-tools-for-photographers/</guid>
  <pubDate>Thu, 22 May 2008 23:12:00 GMT</pubDate>
</item>
<item>
  <title>BlogEngine.Net Control Parameters</title>
  <link>https://tim-stanley.com/post/blogenginenet-control-parameters/</link>
  <description>&lt;p&gt;How does one add or pass parameter to a user control in BlogEngine.Net?&amp;nbsp; This may be obvious to others already, but I thought I'd share a quick note on what I found.&amp;nbsp; [more]&lt;/p&gt;
&lt;h2&gt;Create The Parameter&lt;/h2&gt;
&lt;p&gt;First, define the parameter value in the user control.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
private String _Name = null;
public String Name
{
    get { return _Name; }
    set { _Name = value; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The parameter now can be set either by embedding the control on another page or user control, or by passing a parameter in the [ usercontrol:~\Control.apx Name=xxx;] format.&lt;/p&gt;
&lt;h2&gt;Passing Parameters In Pages Or Controls&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-cshtml"&gt;
Register src=&amp;quot;../../UserCustom/PageInclude.ascx&amp;quot; mce_src=&amp;quot;../../UserCustom/PageInclude.ascx&amp;quot; tagname=&amp;quot;PageInclude&amp;quot; tagprefix=&amp;quot;uc6&amp;quot;
 
&amp;lt;uc6:PageInclude ID=&amp;quot;PageInclude1&amp;quot; runat=&amp;quot;server&amp;quot; runat=&amp;quot;server&amp;quot; Name=&amp;quot;P Test&amp;quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By adding a reference to the user control to a page or other user control, then the values for the parameters can be set. Without the runat="server" value, values will not be passed to the control.&lt;/p&gt;
&lt;p&gt;In this particular example, the Name="Some Page" sets the earlier defined _Name value to "Some Page".&lt;/p&gt;
&lt;h2&gt;Passing Parameters In BlogEngine.Net&lt;/h2&gt;
&lt;p&gt;BlogEngine.Net behaves very similarly.&amp;nbsp; All parameters must be separated by a ";" semi-colon character.&amp;nbsp; If parameters are passed that are not supported, BlogEngine.Net 1.3 code will not render the control and an error message will be displayed.&amp;nbsp; The example below has spaces added after the bracket.&amp;nbsp; These need to be removed in the actual page or posting that sets these parameters.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
[ usercontrol:~\UserCustom\PageInclude.ascx Name=SomeName; ] 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Multiple parameter example:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
[ usercontrol:~\UserCustom\PageInclude.ascx Name=Some Name; Value=Some Value; ]
&lt;/code&gt;&lt;/pre&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>blogengine-net</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/blogenginenet-control-parameters/</guid>
  <pubDate>Mon, 19 May 2008 02:08:00 GMT</pubDate>
</item>
<item>
  <title>8 Days A Week</title>
  <link>https://tim-stanley.com/post/8-days-a-week/</link>
  <description>&lt;p&gt;The physical amount of time spent on a task is not the same as the calendar time that it takes to complete the task. This is especially true when teams are working on multiple tasks. Project managers need to understand this when planning and getting estimates from a development team. [more]&lt;/p&gt;
&lt;p&gt;How does a 3 day task turn into 8 calendar days?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;2 hours spent on understanding the requirements.&lt;/li&gt;
&lt;li&gt;2 hours spend on analysis - Analysis complete&lt;/li&gt;
&lt;li&gt;4 hours spent on design - Design complete&lt;/li&gt;
&lt;li&gt;6 hours spent on development&lt;/li&gt;
&lt;li&gt;9 hours spent on development&lt;/li&gt;
&lt;li&gt;7 hours spent on development -Developer says it's done&lt;/li&gt;
&lt;li&gt;2 hours testing / fixing issues - Unit Test complete&lt;/li&gt;
&lt;li&gt;2 hours testing / fixing issues - System Test complete&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Totals:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Time developer estimated: 3 days&lt;/li&gt;
&lt;li&gt;Time developer says it took: 3.5 days.&lt;/li&gt;
&lt;li&gt;Actual physical time spent: 34 hours or 4.25 days&lt;/li&gt;
&lt;li&gt;Actual elapsed calendar time: 8 days&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>project-management</category>
  <category>project-management</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/8-days-a-week/</guid>
  <pubDate>Sun, 18 May 2008 15:37:00 GMT</pubDate>
</item>
<item>
  <title>Common Layout Sizes</title>
  <link>https://tim-stanley.com/post/common-layout-sizes/</link>
  <description>&lt;p&gt;What size should you make your layout for a web site? Is there &lt;a href="/admin/Pages/One-Layout-To-Bind-Them-All.aspx" target="_blank" rel="noopener"&gt;one layout that will fit all monitor sizes&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;The basic width of a layout determines a lot of the internal layout sizes for panes, modules, images, and internal content.&amp;nbsp; [more]&lt;/p&gt;
&lt;p&gt;Some common layout widths.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;960 pixels, 16 columns 10+40+10 pixels each&lt;/li&gt;
&lt;li&gt;960 pixels, 12 columns 10+60+10 pixels each&lt;/li&gt;
&lt;li&gt;820 pixels, 4 columns 10+180+10 pixels each + 10 pixel margin&lt;/li&gt;
&lt;li&gt;740 pixels, 12 columns 10+40+10 pixels each + 10 pixel margin&lt;/li&gt;
&lt;li&gt;740 pixels, 3 columns 10+220+10 + 10 pixel margin&lt;/li&gt;
&lt;li&gt;740 pixels, 4 columns 10+160+10 + 10 pixel margin&lt;/li&gt;
&lt;li&gt;Yahoo UI, 750 pixels, 950 pixels, 974 pixels, 100%&lt;/li&gt;
&lt;li&gt;Blueprint CSS - 950 pixels, 24 columns, 30+10 pixels each&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All of these layouts lead to some fairly common shared sizes for panes.&amp;nbsp; Any of these sizes will fit within the most common layouts.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;520 pixels&lt;/li&gt;
&lt;li&gt;460 pixels&lt;/li&gt;
&lt;li&gt;240 pixels&lt;/li&gt;
&lt;li&gt;180 pixels&lt;/li&gt;
&lt;li&gt;120 pixels&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/CommonLayoutSizes_8D33/820%204%20Column%20Layout%20Sizes_2.jpg"&gt;&lt;img src="/image.axd?picture=WindowsLiveWriter/CommonLayoutSizes_8D33/820%204%20Column%20Layout%20Sizes_thumb.jpg" alt="820 4 Column Layout" width="240" height="220" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/CommonLayoutSizes_8D33/740%203%20Column%20Layout%20Sizes_2.jpg"&gt;&lt;img src="/image.axd?picture=WindowsLiveWriter/CommonLayoutSizes_8D33/740%203%20Column%20Layout%20Sizes_thumb.jpg" alt="740 3 Column Layout" width="240" height="246" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/CommonLayoutSizes_8D33/740%204%20Column%20Layout%20Sizes_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/CommonLayoutSizes_8D33/740%204%20Column%20Layout%20Sizes_thumb.jpg" alt="740 4 Column Layout" width="244" height="250" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://960.gs" target="_blank" rel="noopener"&gt;960.gs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://developer.yahoo.com/yui/grids/" href="http://developer.yahoo.com/yui/grids/" target="_blank" rel="noopener"&gt;Yahoo! UI Library: Grids CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://code.google.com/p/blueprintcss/" href="http://code.google.com/p/blueprintcss/" target="_blank" rel="noopener"&gt;Blueprint CSS&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>css</category>
  <category>layout</category>
  <category>photography</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/common-layout-sizes/</guid>
  <pubDate>Mon, 28 Apr 2008 22:09:00 GMT</pubDate>
</item>
<item>
  <title>Standard Web Digital Image Sizes</title>
  <link>https://tim-stanley.com/post/standard-web-digital-image-sizes/</link>
  <description>&lt;p&gt;What size should your photos be when posting them to the web?&amp;nbsp; What are the common standard digital photo image sizes?&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Every site I looked at had different size images, but some common themes did emerge.&amp;nbsp; 240 x 160 pixels was a very common small format. Larger images were typically around 460 pixels wide.&amp;nbsp; If you make your images larger than 460 pixels, most layouts in most blogs or site designs will have some difficulty fitting these sizes into the layout.&lt;/p&gt;
&lt;h2&gt;My Preferred Image Sizes&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Very Large 800 pixels&lt;/li&gt;
&lt;li&gt;Large 500 or 520 pixels&lt;/li&gt;
&lt;li&gt;Medium 460 pixels&lt;/li&gt;
&lt;li&gt;Medium-Small 320 pixels&lt;/li&gt;
&lt;li&gt;Small 240 pixels&lt;/li&gt;
&lt;li&gt;Thumbnail 100 pixels&lt;/li&gt;
&lt;li&gt;Square Thumb 75 pixels&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;[more]&lt;a href="/image.axd?picture=WindowsLiveWriter/ImageSizes_BAA7/DSC_8465_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/ImageSizes_BAA7/DSC_8465_thumb_1.jpg" alt="Bob Ulrich Chairman and CEO Target Corporation" width="244" height="165" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Image Sizes&lt;/h2&gt;
&lt;h3&gt;Video Image Sizes&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Viddler 437 x 370&lt;/li&gt;
&lt;li&gt;Youtube 425 x 355&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Photo Image Sizes&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;1024 x 768 ratio: 1.33&lt;/li&gt;
&lt;li&gt;800 x 600 ratio: 1.33&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;460 x 308 ratio: 1.49 **&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;320 x 240 ratio: 1.33&amp;nbsp; **&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;240 x 160 ratio: 1.5 **&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;220 x 148 ratio: 1.49 **&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Thumbnail Image Sizes&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;160 x 160 ratio: 1 **&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;160 x 108 ratio: 1.49 **&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;160 x 120 ratio: 1.33&lt;/li&gt;
&lt;li&gt;120 x 80 ratio: 1.5&lt;/li&gt;
&lt;li&gt;100 x 100 ratio: 1&lt;/li&gt;
&lt;li&gt;75 x 75 ratio: 1&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Flickr Image Sizes&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Square 75 x 75&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thumbnail 100 x 67&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Small 240 x 161&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Medium 500 x 334&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Large 1024 x 768&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Picassa Image Sizes&lt;/h2&gt;
&lt;h3&gt;Picassa Web Image Sizes&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Medium 640 x 428&lt;/li&gt;
&lt;li&gt;Large Thumbnail 160 x 160&lt;/li&gt;
&lt;li&gt;Thumbnail 144 x 96&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Picassa Desktop Image Sizes&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;320&lt;/li&gt;
&lt;li&gt;480&lt;/li&gt;
&lt;li&gt;640&lt;/li&gt;
&lt;li&gt;800&lt;/li&gt;
&lt;li&gt;1024&lt;/li&gt;
&lt;li&gt;1200&lt;/li&gt;
&lt;li&gt;1600&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Windows Live Writer Default Image Sizes&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Small 240 x 161 (128)&lt;/li&gt;
&lt;li&gt;Medium 640 x 428 (480)&lt;/li&gt;
&lt;li&gt;Large 1024 x 685 (768)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Common Photo Print Image Sizes&lt;/h2&gt;
&lt;p&gt;35mm has a ratio of 3:2 and most digital formats have a ratio of 4:3 or close.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;2 x 3 in ratio: 1.5 (wallet)&lt;/li&gt;
&lt;li&gt;3 x 5 in ratio: 1.66&lt;/li&gt;
&lt;li&gt;4 x 6 in ratio: 1.5&lt;/li&gt;
&lt;li&gt;5 x 7 in ratio: 1.4&lt;/li&gt;
&lt;li&gt;8 x 10 in ratio: 1.25&lt;/li&gt;
&lt;li&gt;10 x 13 in ratio: 1.3&lt;/li&gt;
&lt;li&gt;11 x 14 in ratio: 1.27&lt;/li&gt;
&lt;li&gt;16 x 20 in ratio: 1.25&lt;/li&gt;
&lt;li&gt;20 x 24 in ratio: 1.2&lt;/li&gt;
&lt;li&gt;24 x 36 in ratio 1.5&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Common Web Image Sizes&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;1024 x 768 ratio: 1.33&lt;/li&gt;
&lt;li&gt;800 x 600 ratio: 1.33&lt;/li&gt;
&lt;li&gt;460 x 309 ratio: 1.49&lt;/li&gt;
&lt;li&gt;320 x 240 ratio: 1.33&lt;/li&gt;
&lt;li&gt;240 x 160 ratio: 1.5&amp;nbsp;&lt;/li&gt;
&lt;li&gt;220 x 148 ratio: 1.49&lt;/li&gt;
&lt;li&gt;160 x 108 ratio: 1.49&lt;/li&gt;
&lt;li&gt;160 x 120 ratio: 1.33&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Amazon Image Sizes&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;120 x 150&lt;/li&gt;
&lt;li&gt;120 x 240&lt;/li&gt;
&lt;li&gt;120 x 90&lt;/li&gt;
&lt;li&gt;180 x 150&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Standard Ad Sizes&lt;/h2&gt;
&lt;h3&gt;Rectangular and pop-up ads&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Large rectangle 336 x 280&lt;/li&gt;
&lt;li&gt;Medium rectangle 300 x 250&lt;/li&gt;
&lt;li&gt;Square pop-up 250 x 250&lt;/li&gt;
&lt;li&gt;vertical rectangle 240 x 240&lt;/li&gt;
&lt;li&gt;Rectangle 180 x 150&lt;/li&gt;
&lt;li&gt;Rectangle 300 x 100&lt;/li&gt;
&lt;li&gt;Rectangle 720 x 300&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Banner and Buttons&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Leaderboard 728 x 90&lt;/li&gt;
&lt;li&gt;Full Banner 468 x 60&lt;/li&gt;
&lt;li&gt;Half Banner 234 x 60&lt;/li&gt;
&lt;li&gt;Button 1 120 x 90&lt;/li&gt;
&lt;li&gt;Button 2 120 x 60&lt;/li&gt;
&lt;li&gt;Micro bar 88 x 31&lt;/li&gt;
&lt;li&gt;Micro button 80 x 15&lt;/li&gt;
&lt;li&gt;Vertical banner 120 x 240&lt;/li&gt;
&lt;li&gt;Square button 125 x 125&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Skyscrapers&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Skyscraper 120 x 600&lt;/li&gt;
&lt;li&gt;Wide skyscraper 160 x 600&lt;/li&gt;
&lt;li&gt;Half page 300 x 600&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a title="http://www.iab.net/iab_products_and_industry_services/1421/1443/1452" href="http://www.iab.net/iab_products_and_industry_services/1421/1443/1452"&gt;Ad Unit Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Web_banner"&gt;Wikipedia Standard Ad Sizes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.fileformat.info/tip/web/imagesize.htm" href="http://www.fileformat.info/tip/web/imagesize.htm"&gt;Standard Images Sizes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://local.wasp.uwa.edu.au/~pbourke/dataformats/imagedim/" href="http://local.wasp.uwa.edu.au/~pbourke/dataformats/imagedim/"&gt;Image Dimensions In Common Usage&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>web-development</category>
  <category>photography</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/standard-web-digital-image-sizes/</guid>
  <pubDate>Wed, 23 Apr 2008 22:51:00 GMT</pubDate>
</item>
<item>
  <title>One Layout To Bind Them All</title>
  <link>https://tim-stanley.com/post/one-layout-to-bind-them-all/</link>
  <description>&lt;p&gt;When it comes to designing layout for on-line content, what size is the right size?&amp;nbsp; How does one design for multiple screen sizes without spending duplicate effort on multiple designs. The answer depends on what size windows users are using to access the site.&amp;nbsp; For me, creating a variable fixed width design based on both 960 pixels (large) or 700 pixels (medium) helps minimize duplication of design effort. [more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_monitor-sizes-and-screen-size"&gt;Monitor Sizes and Screen Size&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_best-size-for-design"&gt;Best Size For Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_fixed-width-sizes"&gt;Fixed Width Sizes&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h3_1610-columns"&gt;16/10 Columns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_128-columns"&gt;12/8 Columns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h3_13-columns"&gt;13 Columns&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_variable-fixed-width-sizes"&gt;Variable Fixed Width Sizes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_screen-sizes-in-use-in-2008"&gt;Screen Sizes In Use in 2008&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_conclusions"&gt;Conclusions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_monitor-sizes-and-screen-size"&gt;Monitor Sizes and Screen Size&lt;/h2&gt;
&lt;p&gt;The following is a list of screen sizes that are typically used.&amp;nbsp; Larger monitors can set their resolution to sizes in between those listed below.&amp;nbsp; Browser window sizes are usually smaller than the screen size.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;320x240 - mobile CE device size&lt;/li&gt;
&lt;li&gt;640x480&lt;/li&gt;
&lt;li&gt;800x600 - typically smallest screen size in use&lt;/li&gt;
&lt;li&gt;1024x768&lt;/li&gt;
&lt;li&gt;1280x1024&lt;/li&gt;
&lt;li&gt;1680x1050&lt;/li&gt;
&lt;li&gt;2560x1024 - typically dual monitors at 1280x1024 resolution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The three most common minimum screen sizes in use in 2008 are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;800x600&lt;/li&gt;
&lt;li&gt;1024x768&lt;/li&gt;
&lt;li&gt;1280x1024&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dave Shea outlined in &lt;a href="http://www.digital-web.com/articles/web_beyond_the_desktop"&gt;The Web Beyond the Desktop&lt;/a&gt; some of the complexities in designing for numerous screen sizes and how to use &lt;a title="http://mezzoblue.com/archives/2008/03/18/mediatyping/" href="http://mezzoblue.com/archives/2008/03/18/mediatyping/" target="_blank" rel="noopener"&gt;server side methods of selectively dishing up style and content&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="h2_best-size-for-design"&gt;Best Size For Design&lt;/h2&gt;
&lt;p&gt;Monitor size is not screen size. There appear to be two differing camps in approaching the size limitation for browser windows.&amp;nbsp; Some argue that a fluid layout is the most desirable because as a user re-sizes their browser, the layout should resize as well (&lt;a href="http://www.useit.com/alertbox/screen_resolution.html"&gt;Screen Resolution and Page Layout&lt;/a&gt;). Others argue that a fixed size is better because it allows a designer more explicit control of the layout. I believe that users ultimately set the width of what they want to view via the browser window, not the designers and if I take that point of view, then the question for me is how much are designers willing to cooperate with what the user wants to see from a layout perspective for width and height (up to a point).&lt;/p&gt;
&lt;p&gt;In the ideal world, a designer could specify a layout with a minimum and maximum width and let things be fluid from there. However, with the limitation of today's browsers (okay really IE) not being able to support minimum and maximum widths, it makes it difficult to support a fluid layout properly without hacks.&amp;nbsp; IE is notoriously poor (i.e. IE 5, IE 6, IE 7, with IE 8 TBD) at supporting CSS min-width and max-width.&amp;nbsp; Numerous people have developed several CSS hacks, but these are nonetheless hacks and when IE changes, the hacks will have to change.&lt;/p&gt;
&lt;p&gt;It just doesn't set well with me to design a solution using hacks for 70-80% of the users that visit a site.&amp;nbsp; In my experience, even the hacks don't weal with very narrow windows where the window begins to collapse and layout becomes unreadable.&amp;nbsp; For this reason, I prefer a minimal fixed width design for most solutions.&amp;nbsp; A fixed width allows a minimum width and a maximum width, they just happen to be the same.&lt;/p&gt;
&lt;h2 id="h2_fixed-width-sizes"&gt;Fixed Width Sizes&lt;/h2&gt;
&lt;p&gt;I've seen the concept of using grids for design before, but until I saw Nathan Smith's &lt;a href="http://960.gs/" target="_blank" rel="noopener"&gt;960.gs&lt;/a&gt; images on the grids, it didn't really dawn on me the usefulness of using grids to create common layouts for multiple window sizes. More people seem to be moving toward taking advantage of a full 1024x768 size layout.&amp;nbsp; But, just because their screen sizes are larger, doesn't mean that a users browser window is necessarily larger.&amp;nbsp; I have a 22" monitor (actually some times I have two side by side) but I personally don't like sites to use up my screen width.&amp;nbsp; I prefer to use a browser window of about 800-900 pixels.&amp;nbsp; This allows me to have two windows open in parallel.&amp;nbsp; I really don't prefer sites that force me to open a browser window to a full 1024 pixels wide.&lt;/p&gt;
&lt;p&gt;Nathan outlines in the 960 grid design a grid of using 16 columns of 40 pixel increments, or 12 columns of 60 pixel increments.&lt;/p&gt;
&lt;p&gt;I've created some Microsoft Expression Blend templates based on Nathan Smith's 960 grid layout.&amp;nbsp; The zip file of the Expression 960 grid templates can be downloaded here &lt;a href="/file.axd?file=960_Expression.zip" rel="enclosure"&gt;960_Expression.zip (516.38 kb)&lt;/a&gt;. Based on the spirit of Nathan's 960 grid design, these Expression templates are free for your use and licensed under &lt;a href="http://www.gnu.org/licenses/gpl.html"&gt;GPL&lt;/a&gt; and &lt;a href="http://www.opensource.org/licenses/mit-license.php"&gt;MIT&lt;/a&gt; licenses.&lt;/p&gt;
&lt;h3 id="h3_1610-columns"&gt;16/10 Columns&lt;/h3&gt;
&lt;p&gt;Using a margin of 10 pixels with a gutter of 20 pixels leaves a design layout with a minimum inside dimension of 940 pixels (for larger windows), or 700 pixels (for smaller windows) depending on the minimum window size.&amp;nbsp; Using a grid spacing of 40 pixels, this creates a design pattern of 16 columns (large) or 10 columns (medium)&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/OneSizeToBindThem_F532/960%2016%20Column%20Template_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/OneSizeToBindThem_F532/960%2016%20Column%20Template_thumb.jpg" alt="960 16 Column Template" width="460" height="188" border="0"&gt; &lt;/a&gt;&lt;a id="toc_4" href="#"&gt;&lt;/a&gt;&lt;a id="toc_4" href="#"&gt;&lt;/a&gt;&lt;a id="toc_4" href="#"&gt;&lt;/a&gt;&lt;a id="toc_4" href="#"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="h3_128-columns"&gt;12/8 Columns&lt;/h3&gt;
&lt;p&gt;Again, using the same margin and gutter sizes above, and a using a grid spacing of 60 pixels, this creates a design pattern of 12 columns (large) or 8 columns (medium), but with the same overall dimensions for each basic column.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/OneSizeToBindThem_F532/960%2012%20Column%20Template_6.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/OneSizeToBindThem_F532/960%2012%20Column%20Template_thumb_2.jpg" alt="960 12 Column Template" width="460" height="186" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="h3_13-columns"&gt;13 Columns&lt;/h3&gt;
&lt;p&gt;After some further review, I found that using 13 columns of 40 pixels each and a 20 pixel gutter allowed a 780 pixel wide format with an internal width of 760 pixels.&amp;nbsp; While this allowed a slightly wider content, the symmetry of the 12 and 16 column layouts is in my opinion lost and this approach is less elegant in my opinion, despite have slightly more room for content.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/OneSizeToBindThem_F532/800%2013%20Column_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/OneSizeToBindThem_F532/800%2013%20Column_thumb.jpg" alt="800 13 Column" width="460" height="223" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_variable-fixed-width-sizes"&gt;Variable Fixed Width Sizes&lt;/h2&gt;
&lt;p&gt;Variable fixed width sizes sounds like an oxymoron.&amp;nbsp; Like a 50" big screen LCD TV the size of an iPod, how do you get both variable widths and fixed widths. Richard Rutter outlined in &lt;a title="http://www.clagnut.com/blog/1663/" href="http://www.clagnut.com/blog/1663/" target="_blank" rel="noopener"&gt;Variable Fixed Width Layout&lt;/a&gt; using some different techniques to accomplish the result.&amp;nbsp; The net from my perspective is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use JavaScript to switch between alternate the class settings based on browser width.&lt;/li&gt;
&lt;li&gt;Use JavaScript to set alternate style sheets based on browser width.&lt;/li&gt;
&lt;li&gt;Use CSS Floats to set the "extra" columns position based on the layout.&lt;/li&gt;
&lt;li&gt;Use CSS to set multiple columns width based on the layout.&lt;/li&gt;
&lt;li&gt;Use a cookie to set the layout width.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I can't say that any one technique above would be preferred by me, but it would entirely depend on the designer's and coders decision on which technology they prefer and how they want to minimize multiple style maintenance.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Based off my experience of having to support both IE and a mobile device using the same application, the cookie combined with JavaScript and multiple style sheets when done correctly seems the most flexible, albeit a bit more maintenance.&lt;/p&gt;
&lt;h2 id="h2_screen-sizes-in-use-in-2008"&gt;Screen Sizes In Use in 2008&lt;/h2&gt;
&lt;p&gt;As a side note, it appears to me the percentage of users using 800x600 resolution is decreasing each year. Joshua David McClurg-Genevese reports in &lt;a href="http://www.digital-web.com/articles/designing_for_the_web/"&gt;Designing for the Web&lt;/a&gt;&amp;nbsp; in 2004 it was 35% and in 2005 it was 28%. In 2007, &lt;a href="http://www.w3schools.com/browsers/browsers_display.asp"&gt;browser display statistics&lt;/a&gt; for users at 800x600 resolution might typically be 14% of all users. The usage on this site and others I monitor indicates that typically a size of 1024x768 or larger is used to access a site with typically 800x600 in the 2-4% of overall users.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Does that mean people are buying new systems with bigger monitors or are they replacing their 800x600 monitors with bigger ones?&amp;nbsp; I don't know.&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/OneSizeToBindThem_F532/Site%20Usage_3.jpg" alt="Site Usage" width="460" height="279" border="0"&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="h2_conclusions"&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;Nathan Smith's 960 grid ultimately help me find what I was looking for, a set of common column sizes to use for design regardless of the browser width.&amp;nbsp; The Variable Fixed width technique also helped me reach a decision for some size layout issues I was struggling with.&amp;nbsp; The next step for me is to try a few of these techniques in some new sites to see how I like the concepts.&lt;/p&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://particletree.com/features/dynamic-resolution-dependent-layouts/"&gt;Dynamic Resolution Dependent Layouts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.themaninblue.com/writing/perspective/2004/09/21/" href="http://www.themaninblue.com/writing/perspective/2004/09/21/"&gt;Resolution dependent layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.alistapart.com/articles/switchymclayout"&gt;Switchy McLayout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.useit.com/alertbox/screen_resolution.html"&gt;Screen Resolution and Page Layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.w3.org/TR/CSS21/syndata.html#length-units" href="http://www.w3.org/TR/CSS21/syndata.html#length-units" target="_blank" rel="noopener"&gt;W3C CSS2.1 Length Units&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hobo-web.co.uk/tips/25.htm"&gt;Best Screen Size For Web Design in 2008&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.digital-web.com/articles/designing_for_the_web/"&gt;Designing for the Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.digital-web.com/articles/web_beyond_the_desktop"&gt;The Web Beyond the Desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://mezzoblue.com/archives/2008/03/18/mediatyping/" href="http://mezzoblue.com/archives/2008/03/18/mediatyping/" target="_blank" rel="noopener"&gt;Server side methods of selectively dishing up style and content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://wurfl.sourceforge.net/" href="http://wurfl.sourceforge.net/" target="_blank" rel="noopener"&gt;WURFL - Wireless Universal Resource File&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.clagnut.com/blog/1663/" href="http://www.clagnut.com/blog/1663/" target="_blank" rel="noopener"&gt;Variable Fixed Width Layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://muffinresearch.co.uk/archives/2006/02/07/css-drop-column-layout/" href="http://muffinresearch.co.uk/archives/2006/02/07/css-drop-column-layout/"&gt;CSS Drop Column Layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.colly.com/?/comments/redesign-notes-1-width-based-layout/" href="http://www.colly.com/?/comments/redesign-notes-1-width-based-layout/"&gt;Redesign Notes 1 Width Based Layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.alistapart.com/articles/dao/" href="http://www.alistapart.com/articles/dao/"&gt;A Dao of Web Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.alistapart.com/articles/bodyswitchers/"&gt;Body Switchers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.alistapart.com/articles/alternate/"&gt;Style Switchers&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>css</category>
  <category>design</category>
  <category>internet-explorer</category>
  <category>layout</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/one-layout-to-bind-them-all/</guid>
  <pubDate>Mon, 21 Apr 2008 22:36:00 GMT</pubDate>
</item>
<item>
  <title>Adding An Account For Windows Live Writer</title>
  <link>https://tim-stanley.com/post/adding-an-account-for-windows-live-writer/</link>
  <description>&lt;p&gt;How to create a new account in Windows Live Writer for a site using BlogEngine.Net 1.3.0.18 or later.&lt;/p&gt;
&lt;p&gt;Add a new weblog account.&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/AddingAnAccountForWindowsLiveWriter_890F/WLW%20Config%200_3.jpg" alt="WLW Add Weblog Account" width="225" height="175" border="0" /&gt; [more]&lt;/p&gt;
&lt;p&gt;Select Another weblog service.&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/AddingAnAccountForWindowsLiveWriter_890F/WLW%20Config%201_3.jpg" alt="WLW Choose Weblog Type" width="464" height="404" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Enter the Homepage URL, username, and password.&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/AddingAnAccountForWindowsLiveWriter_890F/WLW%20Config%202_3.jpg" alt="WLW Account Login" width="464" height="404" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Live Writer will detect the weblog settings (If you use another service that supports other formats, you'll be prompted what API and URL to use).&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/AddingAnAccountForWindowsLiveWriter_890F/WLW%20Config%203_3.jpg" alt="WLW Config 3" width="464" height="406" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;I recommend letting Live Writer detect the theme.&amp;nbsp; Live Writer does not successfully delete the test post so you will have to do that manually later.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/AddingAnAccountForWindowsLiveWriter_890F/WLW%20Config%204_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/AddingAnAccountForWindowsLiveWriter_890F/WLW%20Config%204_thumb.jpg" alt="WLW Config 4" width="464" height="88" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Your done.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/AddingAnAccountForWindowsLiveWriter_890F/WLW%20Config%205_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/AddingAnAccountForWindowsLiveWriter_890F/WLW%20Config%205_thumb.jpg" alt="WLW Config 5" width="464" height="404" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>tips</category>
  <category>blogengine-net</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/adding-an-account-for-windows-live-writer/</guid>
  <pubDate>Wed, 16 Apr 2008 15:46:00 GMT</pubDate>
</item>
<item>
  <title>ASP.Net Cached XML File Settings</title>
  <link>https://tim-stanley.com/post/aspnet-cached-xml-file-settings/</link>
  <description>&lt;p&gt;How to use ASP.Net Cache settings to automatically read and update values from an XML file when the file is updated, and how to lookup a value in the XML file.&lt;/p&gt;
&lt;p&gt;.Net surprises me every day.&amp;nbsp; I think about how I want to do things and then I dig a little (some time a lot) into .Net components and viola, I find it provides some new interesting functionality that I didn't know about before.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I recently wanted to implement some features for using configuration values for an ASP.NET application.&amp;nbsp; My requirements were as follows. [more]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Implement an Admin page to allow writing / updating the configuration file.&lt;/li&gt;
&lt;li&gt;Use an XML file format for the configuration data.&lt;/li&gt;
&lt;li&gt;Cache the data in the IIS cache once read&lt;/li&gt;
&lt;li&gt;Update the cache if the XML file was updated&lt;/li&gt;
&lt;li&gt;I did not want to utilize a database&lt;/li&gt;
&lt;li&gt;Since these would be updated frequently, I did not want to utilize the web.config&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I found the ASP.NET Cache.Insert method to be the key for my needs.&amp;nbsp; By creating a Cache Dependency tied to the configuration file, when the file is updated, it will automatically update the cache.&amp;nbsp; This is the same behavior as the web.config file, but without some of the same permission access issues when trying to write to the file.&lt;/p&gt;
&lt;p&gt;I could have used a NameValueCollection to do the same thing, but I wanted to use the DataSet in this instance.&amp;nbsp; I added the PrimaryKey value to the DataSet and .Net took care of the lookup of the data with Rows.Find().&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Note: In order to write to an XML file via ASP.NET code, the directory must have write permissions enabled on the IIS user account (ASPNET, or Network Service, or the ID used in the application pool, or virtual directory).&lt;/p&gt;
&lt;p&gt;The code for this particular logic was placed in the App_Code directory, so it could be accessed from code as well as ASP.NET pages via something like the following.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cshtml&gt;
&amp;lt;%=tsisys.Settings.CustomSettings(&amp;quot;SiteName&amp;quot;)%&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C# Code Example located in the App_Code directory&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
public static String CustomSettings(String keyValue)
{
    DataSet oDS;
    String szXMLFileName;
    String foundValue = "";
    oDS = (DataSet)System.Web.HttpContext.Current.Cache["Settings"];
    if (oDS == null)
    {
        szXMLFileName = SettingFileName();
        oDS = new DataSet();
        oDS.ReadXml(szXMLFileName);
    
        CacheDependency oCacheDependency;
        oCacheDependency = new CacheDependency(szXMLFileName);
    
        System.Web.HttpContext.Current.Cache.Insert("Settings", oDS, oCacheDependency);
        
    }
	
    DataColumn[] oKeyCols = new DataColumn[1];
    DataTable oTable;
    DataRow oRow;
    
    oTable = oDS.Tables["Attribute"];
    oKeyCols[0] = oTable.Columns["Key"];
    oTable.PrimaryKey = oKeyCols;   
    oRow = oTable.Rows.Find((object)keyValue);
    if (oRow != null)
    {
        foundValue = (string)oRow["Value"];
    }
	
    return foundValue;
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Settings.xml located in the App_Data directory&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-xml"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;
&amp;lt;Configuration&amp;gt;
    &amp;lt;Attributes&amp;gt;
        &amp;lt;Attribute&amp;gt;
            &amp;lt;Key&amp;gt;PageTitlePrefix&amp;lt;/Key&amp;gt;
            &amp;lt;Text&amp;gt;Page Title Prefix&amp;lt;/Text&amp;gt;
            &amp;lt;Value&amp;gt;&amp;lt;/Value&amp;gt;
        &amp;lt;/Attribute&amp;gt;
        &amp;lt;Attribute&amp;gt;
            &amp;lt;Key&amp;gt;PageTitleSuffix&amp;lt;/Key&amp;gt;
            &amp;lt;Text&amp;gt;Page Title Suffix&amp;lt;/Text&amp;gt;
            &amp;lt;Value&amp;gt; - Tim-Stanley.com&amp;lt;/Value&amp;gt;
        &amp;lt;/Attribute&amp;gt;
        &amp;lt;Attribute&amp;gt;
            &amp;lt;Key&amp;gt;SiteName&amp;lt;/Key&amp;gt;
            &amp;lt;Text&amp;gt;Site Name&amp;lt;/Text&amp;gt;
            &amp;lt;Value&amp;gt;Tim-Stanley.com&amp;lt;/Value&amp;gt;
        &amp;lt;/Attribute&amp;gt;
        &amp;lt;Attribute&amp;gt;
            &amp;lt;Key&amp;gt;CopyrightName&amp;lt;/Key&amp;gt;
            &amp;lt;Text&amp;gt;Copyright Name&amp;lt;/Text&amp;gt;
            &amp;lt;Value&amp;gt;TSI Systems LLC&amp;lt;/Value&amp;gt;
        &amp;lt;/Attribute&amp;gt;
    &amp;lt;/Attributes&amp;gt;
&amp;lt;/Configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>asp-net</category>
  <category>visual-studio</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/aspnet-cached-xml-file-settings/</guid>
  <pubDate>Tue, 15 Apr 2008 20:29:00 GMT</pubDate>
</item>
<item>
  <title>Extensible CSS Interface Articles</title>
  <link>https://tim-stanley.com/post/extensible-css-interface-articles/</link>
  <description>&lt;p&gt;Cameron Moll has posted some incredibly useful information on his site regarding CSS, JQuery, AJAX and extensibility in a set of articles titled &lt;a href="http://cameronmoll.com/articles/extensible-css/"&gt;The Highly Extensible CSS Interface&lt;/a&gt;.&amp;nbsp; The information is PHP oriented, but the concepts certainly apply to ASP.NET. [more]&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cameronmoll.com/articles/extensible-css/"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/ExtensibleCSSInterface_D090/Extensible%20CSS_3.jpg" alt="Highly Extensible CSS Interface" width="485" height="484" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>css</category>
  <category>ajax</category>
  <category>jquery</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/extensible-css-interface-articles/</guid>
  <pubDate>Fri, 04 Apr 2008 18:51:00 GMT</pubDate>
</item>
<item>
  <title>Visual Studio 2008 Hot Fix Recommended</title>
  <link>https://tim-stanley.com/post/visual-studio-2008-hot-fix-recommended/</link>
  <description>&lt;p&gt;Short on the heels of the Visual Studio 2008 release in November 2007, Microsoft released in early February a hot fix that contains several fixes.&amp;nbsp; I took a bit of time before jumping on the Hot fix for production projects, but there are several IDE editing and build improvements for those using ASP.NET.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Based on the list of fixes surrounding HTML source view / HTML editing, JavaScript editing, and web site&amp;nbsp; build performance, it looks very compelling to apply this fix .&amp;nbsp; I've updated today and see no adverse side effects yet.&amp;nbsp; The hot fix installation instructions state it can be uninstalled in the future if needed.&lt;/p&gt;
&lt;p&gt;The information on the hot fix details and the download can be found in Scott Guthrie's post &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/02/08/vs-2008-web-development-hot-fix-roll-up-available.aspx"&gt;VS 2008 Web Development Hot-Fix Roll-Up Available&lt;/a&gt;.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>asp-net</category>
  <category>visual-studio</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/visual-studio-2008-hot-fix-recommended/</guid>
  <pubDate>Fri, 04 Apr 2008 15:05:00 GMT</pubDate>
</item>
<item>
  <title>Why Adding Resources Doesn't Always Help</title>
  <link>https://tim-stanley.com/post/why-adding-resources-doesnt-always-help/</link>
  <description>&lt;p&gt;Those who've read the book &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month" target="_blank" rel="nofollow noopener"&gt;The Mythical Man-Month: Essays on Software Engineering&lt;/a&gt;&amp;nbsp;&lt;/em&gt;know the mantra &lt;em&gt;&lt;strong&gt;Adding manpower to a late software project makes it later&lt;/strong&gt;.&lt;/em&gt;&amp;nbsp; But why does it make it later?&amp;nbsp; How many resources should you put on a project to optimize the delivery date?&amp;nbsp; How do you explain and justify to the customers and teams the optimal number of resources to be on a project?&amp;nbsp; How do you explain that adding more than the optimal resources won't make the delivery date sooner?&amp;nbsp; Resource saturation is my answer. [more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_optimal-delivery-date-and-optimum-resources"&gt;Optimal Delivery Date And Optimum Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_resource-vs-time"&gt;Resource vs Time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_resource-vs-cost"&gt;Resource vs Cost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_adding-resources-makes-a-project-later"&gt;Adding Resources Makes a Project Later&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_optimal-delivery-date-and-optimum-resources"&gt;Optimal Delivery Date And Optimum Resources&lt;/h2&gt;
&lt;p&gt;I started with a simple premise for planning project.&amp;nbsp; Something that was a known size, I could add as many resources as possible, but the delivery date needed to be as soon as possible. I don't often get offered unlimited resources, so I was intrigued with the plan.&amp;nbsp; Some assumptions I noted for estimation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The scope was 24 man months effort&lt;/li&gt;
&lt;li&gt;The lowest granularity of the work is one month&lt;/li&gt;
&lt;li&gt;There are no critical path dependencies between 24 work items&lt;/li&gt;
&lt;li&gt;There is zero ramp up time for adding a resource to a project&lt;/li&gt;
&lt;li&gt;There are no vacations, sick time, or holidays&lt;/li&gt;
&lt;li&gt;1-24 resources could be added&lt;/li&gt;
&lt;li&gt;Optimize delivery calendar time&lt;/li&gt;
&lt;li&gt;10% communication time between team members (four hours per week)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Adding resources to a project helps initially.&amp;nbsp; Once the team reaches a certain size, the amount of time saved by adding an additional resource has very little impact on the delivery time.&amp;nbsp; I used a factor of 10% of the time per resource spent in just communications (e-mail, meetings, discussions or interactions with other members of the team).&amp;nbsp; That number is likely too low compared to an average organization and likely unrealistically low for large organizations which have a significantly higher communication overhead, but for the initial optimization of resources, it doesn't really affect the optimum number of resources by a significant amount of calendar time.&amp;nbsp; I built a simple spreadsheet to do the calculations.&amp;nbsp; My spreadsheet had more detail, but hopefully you get the idea.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 resource, 24 months&lt;/li&gt;
&lt;li&gt;4 resources, 6.4 months&lt;/li&gt;
&lt;li&gt;6 resources, 4.6 months&lt;/li&gt;
&lt;li&gt;8 resources, 3.4 months&lt;/li&gt;
&lt;li&gt;12 resources, 3.2 months&lt;/li&gt;
&lt;li&gt;16 resources, 3.1 months&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We can see that four resources instead of one cuts the time to 25% of the original 2 calendar years.&amp;nbsp; Six resources, cuts it to about four months and two weeks.&amp;nbsp; Eight resources, cuts it down to three months and two weeks.&amp;nbsp; From there, it takes an additional four resources (for a total of twelve) just to bring the delivery date in one week earlier (3.2 months).&amp;nbsp; Doubling our eight resources to sixteen only saved two weeks on the calendar time delivery.&amp;nbsp; What happened?&amp;nbsp; We hit resource saturation.&amp;nbsp; I put together the image below to show what resource saturation looks like and how adding resources affects the project time it takes to complete the work.&lt;/p&gt;
&lt;h2 id="h2_resource-vs-time"&gt;Resource vs Time&lt;/h2&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/WhyAddingResourcesDoesntAlwaysHelp_13C62/ResourceVsTime_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/WhyAddingResourcesDoesntAlwaysHelp_13C62/ResourceVsTime_thumb.jpg" alt="Resource Vs Time" width="484" height="296" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Resource vs Time showing resource saturation above eight resources.&lt;/p&gt;
&lt;p&gt;If only 10% of developer time was spent in communication, by the time we hit 10 resources, we had the equivalent of one full time person doing nothing but communicating.&amp;nbsp; That causes and interesting thing to our costs.&amp;nbsp; As we add resources, we are adding communication to the team.&amp;nbsp; That adds costs, which goes up non linearly.&lt;/p&gt;
&lt;h2 id="h2_resource-vs-cost"&gt;Resource vs Cost&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/WhyAddingResourcesDoesntAlwaysHelp_13C62/ResourceVsCost_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/WhyAddingResourcesDoesntAlwaysHelp_13C62/ResourceVsCost_thumb.jpg" alt="Resource Vs Cost" width="484" height="300" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Adding more than eight resources didn't affect our delivery date by more than two weeks, but adding more, certainly increases our costs.&amp;nbsp; Optimizing both resources and costs gives us a a good range for planning.&amp;nbsp; I've rounded the numbers up to the nearest week.&amp;nbsp; This is the type of information that we might need to present to a team or a customer.&amp;nbsp; This doesn't take into account vacations, sick time, or holidays, but it does give a rough number for resource planning and allocation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;6 resources for 4 months and 3 weeks&lt;/li&gt;
&lt;li&gt;7 resources for 4 months and 1 week&lt;/li&gt;
&lt;li&gt;8 resources for 4 months&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We now have enough data to logically explain planning questions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How long do we anticipate the project to take?&amp;nbsp; Approximately 4 months with 8 resources or 5 months with 6 resources.&lt;/li&gt;
&lt;li&gt;Can the project be completed in two calendar months? No, regardless of the number of resources, the full scope can not be complete in two months.&lt;/li&gt;
&lt;li&gt;Can the project be completed in three calendar months? It may be possible, but it's unlikely it can be completed in three months.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The most significant thing that can be done to improve the delivery time is to prioritize the features and delivery less feature and function in a shorter time and then follow with a subsequent release with the remaining function.&amp;nbsp; The next most significant thing that will affect the delivery date is the injection of overtime.&amp;nbsp; While I'm not a fan of using overtime for planning, once resource saturation occurs a 10% increase in time can shorten the delivery date because it doesn't typically add an increase in ramp up time or an increase in communications to the team.&amp;nbsp; Planning more than 10% overtime over any extended period of time is unsustainable and unrealistic planning.&lt;/p&gt;
&lt;h2 id="h2_adding-resources-makes-a-project-later"&gt;Adding Resources Makes a Project Later&lt;/h2&gt;
&lt;p&gt;We found an optimal number of resources, and an optimal time and delivery date, but I still haven't answered the question, why does adding resources make a late project later?&amp;nbsp; Once resource saturation is achieved, adding resources to a project underway does two things.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It Increases the amount of time that an existing team member must spend in explaining what has been done already and what is planned.&amp;nbsp; This increases the overall communication time spent by the team.&lt;/li&gt;
&lt;li&gt;It increases the amount of ramp up time that a resource must spend on learning what has been completed already.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I was reminded of this both by prompting from a customer and by an article Jeff Atwood wrote on &lt;a href="http://www.codinghorror.com/blog/archives/001083.html" rel="nofollow"&gt;Revisiting The Facts and Fallacies of Software Engineering&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The model I show doesn't exactly simulate adding resources to a late project, but it does show what happens when communications is increased.&amp;nbsp; Instead of having 10% communication, what if we increase the model to 33% communication overhead, what happens?&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/WhyAddingResourcesDoesntAlwaysHelp_9F69/ResourceVsTime33_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/WhyAddingResourcesDoesntAlwaysHelp_9F69/ResourceVsTime33_thumb.jpg" alt="Resource Vs Time With 33% Communication" width="488" height="387" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Instead of decreasing the time to delivery, it actually takes more time.&amp;nbsp; 24 resources take the same amount of time as 3 resources.&amp;nbsp; After resource saturation, adding resources makes projects later.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>project-management</category>
  <category>project-management</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/why-adding-resources-doesnt-always-help/</guid>
  <pubDate>Wed, 02 Apr 2008 17:00:00 GMT</pubDate>
</item>
<item>
  <title>Help Generation Tools</title>
  <link>https://tim-stanley.com/post/help-generation-tools/</link>
  <description>&lt;p&gt;Help authoring tools like RoboHelp and Doc To Help provide the ability to generate PDF, Word .DOC, and compiled html help (.CHM) from a single HTML source.&lt;/p&gt;
&lt;p&gt;Some time ago, I needed the ability to generate other forms of documentation for help files other than HTML.&amp;nbsp; The original content was authored as a standalone simple HTML (h1, h2, ul, ol, dd, dt, p, etc.) with images and used a common style sheet.&amp;nbsp; I needed the ability to generate other forms of documentation that could be printed and transmitted over the Internet to clients (Word documents, PDF, etc.).&amp;nbsp; [more]&lt;/p&gt;
&lt;div&gt;
&lt;ul class="xoxo"&gt;
&lt;li&gt;&lt;a href="#toc_0"&gt;Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#toc_1"&gt;Help Authoring Tools Evaluated&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#toc_2"&gt;Differences In Output&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#toc_3"&gt;Sample Output&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#toc_4"&gt;API Documentation Tools and Links&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;p&gt;The general requirement was for end user help for administration screens, not for programmer internal object or API help.&amp;nbsp; There are further tools that are more suited for generation of programmer API documentation (like Microsoft &lt;a href="http://www.sandcastledocs.com/" target="_blank" rel="nofollow noopener"&gt;&lt;span style="color: #669966;"&gt;Sand Castle&lt;/span&gt;&lt;/a&gt; on the &lt;a href="http://www.codeplex.com/Sandcastle" target="_blank" rel="nofollow noopener"&gt;&lt;span style="color: #669966;"&gt;Codeplex Sand Castle site&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Help documentation was originally written in HTML pages (standalone read from files, no ASP.NET or IIS Server)&lt;/li&gt;
&lt;li&gt;Generation and distribution of standalone PDF&amp;rsquo;s&lt;/li&gt;
&lt;li&gt;Generation and distribution of standalone .CHM (Microsoft Compiled Help)&lt;/li&gt;
&lt;li&gt;Generation and distribution of standalone HTML files viewable in Internet Explorer&lt;/li&gt;
&lt;li&gt;Generation and distribution of standalone Microsoft Word.doc files.&lt;/li&gt;
&lt;li&gt;HTML Used as primary Help and displayed in IE.&lt;/li&gt;
&lt;li&gt;Table of Contents written in HTML Pages&lt;/li&gt;
&lt;li&gt;Include HTML Images in all output (PDF, DOC, CHM) without requiring re-work.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Help Authoring Tools Evaluated&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a id="toc_1" href="#"&gt;RoboHelp by Adobe&lt;/a&gt; new $999, upgrades from $499&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.componentone.com/" rel="nofollow"&gt;Doc To Help by Component One&lt;/a&gt; new $900, upgrades from $500&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms670169.aspx" target="_blank" rel="nofollow noopener"&gt;Microsoft HTML Help 1.4 SDK&lt;/a&gt; - Free&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In evaluating the tools, I already had existing HTML documentation with images present.&amp;nbsp; If I were creating a new documentation solution from scratch, I might have chosen a different tool or approach.&lt;/p&gt;
&lt;p&gt;The Microsoft HTML help compiler generates .CHM files from HTML, but it does not generate Word .DOC, or PDF formats so this didn't meet the requirements.&amp;nbsp; Both RoboHelp and Doc To Help utilize the help compiler to generate the .CHM files.&lt;/p&gt;
&lt;p&gt;Doc To Help generated CHM files, PDF files and Word Documents, but generation of documents took a very long time (i.e. 20 minutes or more).&amp;nbsp; The output of the images in the PDF and Word Document was problematic.&amp;nbsp; I never could figure out how to generate the "contents" of those documents correctly.&lt;/p&gt;
&lt;p&gt;RoboHelp generated the CHM files, PDF files and Word documents fairly quickly (less than 5 minutes).&amp;nbsp; The images were placed correctly, and with only minimal work I was able to generate the table of contents for all documents correctly.&lt;/p&gt;
&lt;p&gt;Both tools provided the ability to edit HTML content, but this wasn't really utilized since all content was already in HTML format.&amp;nbsp;&amp;nbsp; Both tools also provided the ability to utilize the existing CSS style information when it generated the documentation.&lt;/p&gt;
&lt;p&gt;Robohelp was selected because it was significantly faster and had fewer errors in generating the required output than the Doc To Help product. Doc To Help would have required further investigation and &amp;ldquo;manipulation&amp;rdquo; of the original HTML source in order to generate .CHM or .DOC files without errors.&amp;nbsp;&amp;nbsp; It's been used for several revisions of the documentation and it still works fine.&lt;/p&gt;
&lt;p&gt;RoboHelp has also been a consistent Award Winning help generation product and has won the &lt;a href="http://www.ftponline.com/vsm/2007_bg/magazine/features/readerschoice/" target="_blank" rel="nofollow noopener"&gt;Best .NET Products of 2007 for Help Authoring&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Differences In Output&lt;/h2&gt;
&lt;p&gt;Why generate different output formats?&amp;nbsp; Each format has unique features that the other formats don't offer.&amp;nbsp; Some clients reviewing our documentation prefer one format over the other.&amp;nbsp; In particular, many clients prefer the ability to print the full set of documentation for review when evaluating the product.&amp;nbsp; Each format helps support the sales cycle as the circumstances dictate.&amp;nbsp; Printing in HTML and CHM formats is listed as poor because these formats only allow printing one page at a time.&lt;/p&gt;
&lt;table style="width: 400px;" border="0" cellspacing="0" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;&lt;strong&gt;Format&lt;/strong&gt;&lt;/td&gt;
&lt;td valign="top" width="80"&gt;&lt;strong&gt;Size in bytes&lt;/strong&gt;&lt;/td&gt;
&lt;td valign="top" width="80"&gt;&lt;strong&gt;View&lt;/strong&gt;&lt;/td&gt;
&lt;td valign="top" width="80"&gt;&lt;strong&gt;Search&lt;/strong&gt;&lt;/td&gt;
&lt;td valign="top" width="80"&gt;&lt;strong&gt;Print&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;HTML&lt;/td&gt;
&lt;td valign="top" width="80"&gt;15,398,787&lt;/td&gt;
&lt;td valign="top" width="80"&gt;Excellent&lt;/td&gt;
&lt;td valign="top" width="80"&gt;Poor&lt;/td&gt;
&lt;td valign="top" width="80"&gt;Poor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;CHM&lt;/td&gt;
&lt;td valign="top" width="80"&gt;4,431,489&lt;/td&gt;
&lt;td valign="top" width="80"&gt;Good&lt;/td&gt;
&lt;td valign="top" width="80"&gt;Excellent&lt;/td&gt;
&lt;td valign="top" width="80"&gt;Poor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;DOC&lt;/td&gt;
&lt;td valign="top" width="80"&gt;6,974,976&lt;/td&gt;
&lt;td valign="top" width="80"&gt;Excellent&lt;/td&gt;
&lt;td valign="top" width="80"&gt;Average&lt;/td&gt;
&lt;td valign="top" width="80"&gt;Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;PDF&lt;/td&gt;
&lt;td valign="top" width="80"&gt;3,538,957&lt;/td&gt;
&lt;td valign="top" width="80"&gt;Excellent&lt;/td&gt;
&lt;td valign="top" width="80"&gt;Average&lt;/td&gt;
&lt;td valign="top" width="80"&gt;Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Sample Output&lt;/h2&gt;
&lt;p&gt;HTML Help sample viewed in Internet Explorer&lt;/p&gt;
&lt;p&gt;&lt;a id="toc_3" href="/image.axd?picture=WindowsLiveWriter/HelpGenerationTools_123D2/Help%20HTML%20Employee%20Maint_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/HelpGenerationTools_123D2/Help%20HTML%20Employee%20Maint_thumb.jpg" alt="Help HTML Employee Maint" width="204" height="249" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PDF Help Sample Output from RoboHelp&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/HelpGenerationTools_123D2/Help%20PDF%20Employee%20Maint_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/HelpGenerationTools_123D2/Help%20PDF%20Employee%20Maint_thumb.jpg" alt="Help PDF Employee Maint" width="204" height="245" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Microsoft Word Sample output from RoboHelp&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/HelpGenerationTools_123D2/Help%20DOC%20Employee%20Maint_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/HelpGenerationTools_123D2/Help%20DOC%20Employee%20Maint_thumb.jpg" alt="Help DOC Employee Maint" width="204" height="234" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Compiled Help Sample output from RoboHelp&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/HelpGenerationTools_123D2/Help%20CHM%20Employee%20Maint_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/HelpGenerationTools_123D2/Help%20CHM%20Employee%20Maint_thumb.jpg" alt="Help CHM Employee Maint" width="218" height="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;API Documentation Tools and Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a id="toc_4" href="#"&gt;Sand Castle&lt;/a&gt; on Codeplex and &lt;a href="http://www.sandcastledocs.com" target="_blank" rel="nofollow noopener"&gt;Sand Castle Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.innovasys.com/products/dx2008/overview.aspx" target="_blank" rel="nofollow noopener"&gt;DocumentX&lt;/a&gt; by Innovasys about $594 USD for one user, 2008 version&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ndoc.sourceforge.net/" target="_blank" rel="nofollow noopener"&gt;NDoc&lt;/a&gt; on Sourceforge - no longer updated&lt;/li&gt;
&lt;li&gt;VB Commenter in &lt;a href="http://msdn2.microsoft.com/en-us/vs2005/aa718340.aspx" target="_blank" rel="nofollow noopener"&gt;Power Toys for Visual Studio&lt;/a&gt;&amp;nbsp; - No longer needed in Visual Studio 2008&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>visual-studio</category>
  <category>help</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/help-generation-tools/</guid>
  <pubDate>Wed, 02 Apr 2008 00:43:00 GMT</pubDate>
</item>
<item>
  <title>Best Company Ever Award For LOD Checklist</title>
  <link>https://tim-stanley.com/post/best-company-ever-award-for-lod-checklist/</link>
  <description>&lt;p&gt;We strive for good quality, a job well done, making the client happy. Having a customer or client that is so enthusiastic about a solution my team and I delivered that they use dramatic phrases like &amp;ldquo;&lt;strong&gt;&lt;em&gt;improved the way we do business and increased our competitive advantage&lt;/em&gt;&lt;/strong&gt;&amp;rdquo; from Bob Ulrich the chairman and CEO and &amp;ldquo;&lt;strong&gt;&lt;em&gt;Life just got simpler in our stores&lt;/em&gt;&lt;/strong&gt;&amp;rdquo; from Craig Lindner Senior Manager, Store operations both from one of the largest retail organizations in North America can only be described as an honor and a privilege. [more]&lt;/p&gt;
&lt;p&gt;Last week I was at Target Corporation in Minneapolis for the formal presentation of the &amp;ldquo;&lt;em&gt;Best Company Ever&lt;/em&gt;&amp;rdquo; team recognition award to the Target TTS team for the LOD Checklist project.&amp;nbsp; Junction Solutions provided the front end graphical solution, and approximately half of the numerous back end services for the LOD Checklist solution.&amp;nbsp; I've been working as the project manager for this project at Junction Solutions for the last two and a half years.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardToJunctionSolutionsP_D858/BCE_Thanks3_4.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardToJunctionSolutionsP_D858/BCE_Thanks3_thumb_1.jpg" alt="Thanks Junction Solutions!" width="464" height="385" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardToJunctionSolutionsP_D858/DSC_8465.JPG_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardToJunctionSolutionsP_D858/DSC_8465.JPG_thumb.jpg" alt="Bob Ulrich" width="464" height="486" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bob Ulrich Chairman and CEO Target Corporation&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardToJunctionSolutionsP_D858/Target2_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardToJunctionSolutionsP_D858/Target2_thumb.jpg" alt="BCE Presentation" width="464" height="629" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardToJunctionSolutionsP_D858/Target3_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardToJunctionSolutionsP_D858/Target3_thumb.jpg" alt="BCE Red" width="464" height="614" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardToJunctionSolutionsP_D858/DSC_8463.JPG_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardToJunctionSolutionsP_D858/DSC_8463.JPG_thumb.jpg" alt="Target Managers Anand Sing and Pat Connolly" width="464" height="311" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Target Managers Anand Sing and Pat Connolly&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardToJunctionSolutionsP_D858/Video1_2.jpg"&gt;&lt;img style="width: 464px; height: 316px; border: 0px;" title="LOD Checklist" src="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardToJunctionSolutionsP_D858/Video1_thumb.jpg" alt="LOD Checklist" width="464" height="316" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>awards</category>
  <category>awards</category>
  <category>project-management</category>
  <category>target</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/best-company-ever-award-for-lod-checklist/</guid>
  <pubDate>Wed, 19 Mar 2008 19:37:00 GMT</pubDate>
</item>
<item>
  <title>Best Company Ever Award Invitation</title>
  <link>https://tim-stanley.com/post/best-company-ever-award-invitation/</link>
  <description>&lt;p&gt;For the last two and a half years, I've been working on helping Target corporation with a project to bring a&amp;nbsp;dashboard&amp;nbsp;reporting application to work on a mobile device.&amp;nbsp; The project has been well received and so popular among store managers, that it's won an award within Target. Not just any award, but the &lt;em&gt;Best Company Ever Award&lt;/em&gt;. It feels like winning an Oscar. [more]&lt;/p&gt;
&lt;p&gt;Why did it win?&amp;nbsp; First and foremost for the vision the business leaders had in providing the software tools that make the day to day life of the store managers easier.&amp;nbsp; The bottom line, it saves time, not just a little bit of time mind you, but a big chunk of time that managers had to spend getting data from multiple systems and from multiple printouts now combined into a real time display of events as they unfold in the store.&amp;nbsp; Everything from unloading of stock on trucks to stocking of shelves and price changes. The vision didn't come easy.&amp;nbsp; Numerous releases were put through the paces before the team hit on the award winning combination with a graphical interface&amp;nbsp;that worked on a touch screen without requiring a stylus.&lt;/p&gt;
&lt;p&gt;The second reason I believe it won was an extremely high quality deliverable. The last release provided for testing only had one issue reported against over 100,000 source lines.&amp;nbsp; The high quality made for quick pilot and rapid deployment throughout the 1600 stores.&amp;nbsp;&amp;nbsp; The high quality allowed the team to focus on developing new features, and not become encumbered with&amp;nbsp;extensive support issues.&lt;/p&gt;
&lt;p&gt;The solution was developed by Junction solutions, and the development was completed by the development team&amp;nbsp;at ISS India PLC.&amp;nbsp; I was fortunate to participate as the project manager for Junction Solutions on this project.&lt;/p&gt;
&lt;h2&gt;Quick Application Stats&lt;/h2&gt;
&lt;p&gt;The application is a true service oriented application gathering data from numerous enterprise and store specific systems to present them in a seamless interface to the store managers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ASP.NET 2005 application&lt;/li&gt;
&lt;li&gt;SQL 2005 database for main response information&lt;/li&gt;
&lt;li&gt;Oracle database for news information&lt;/li&gt;
&lt;li&gt;Over 100,000 source lines&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;24 client screens (full IE and mobile device touch screen based layouts)&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;6 ISP .Net Services&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;1 POS .Net Service (Real time&amp;nbsp;sales)&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;6&amp;nbsp;Headquarters Java based Services (Sales, Payroll, REDcard, Guest Survey, Birthdays and Anniversaries, Transitions)&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;15 admin screens&lt;/li&gt;
&lt;li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle;"&gt;2 admin reports&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Award Information&lt;/h2&gt;
&lt;p&gt;The Best Company Ever award at Target is presented twice a year to the project that is the &amp;ldquo;Best&amp;rdquo; overall project within the entire Target Corporation.&amp;nbsp; The award is selected from all projects (not just IT) within the company and was awarded to the October 2007 release of iLeader (Automated Leader).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The award invitation reads:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You deserve our highest recognition&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Your team delivered more than major results on a major initiative. Your Energy, Enthusiasm, Execution and Excellence demonstrate what it means to be the Best Company Ever.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You did it!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Thanks to your work in creating a new tool that delivers real-time actionable information through an easy-to-use, easy-to-understand interface, leaders on duty now get an instant big-picture view of store performance in the palm of their hands.&amp;nbsp; This ultimately helps them operate their stores more efficiently and deliver on our &amp;ldquo;Expect More. Pay Less.&amp;rdquo; Brand promise for our guests.&lt;/p&gt;
&lt;p&gt;The formal presentation of the award will be Wednesday, March 19, 2008 by the president and CEO, Bob Ulrich.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardInvitation_1248E/IMG_0585.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardInvitation_1248E/IMG_0585_thumb.jpg" alt="Best Company Ever Team Recognition" width="244" height="212" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardInvitation_1248E/IMG_0588.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardInvitation_1248E/IMG_0588_thumb.jpg" alt="IMG_0588" width="244" height="202" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardInvitation_1248E/IMG_0589.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/BestCompanyEverAwardInvitation_1248E/IMG_0589_thumb.jpg" alt="IMG_0589" width="244" height="210" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>awards</category>
  <category>awards</category>
  <category>project-management</category>
  <category>software-development</category>
  <category>target</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/best-company-ever-award-invitation/</guid>
  <pubDate>Tue, 18 Mar 2008 01:23:00 GMT</pubDate>
</item>
<item>
  <title>Sites For CSS Design Themes</title>
  <link>https://tim-stanley.com/post/sites-for-css-design-themes/</link>
  <description>&lt;p&gt;Don't pick a web site&amp;nbsp;engine (blog,&amp;nbsp;CMS, or other), unless you have the ability to customize the style. A web site should have the ability to change designs over time as personal preferences, and desired style and color preferences change.&amp;nbsp; Sites using a site builder tool&amp;nbsp;require a lot of hand coding or a complete re-generation of the site.&amp;nbsp; This can add additional cost or time to customize.&amp;nbsp; Sites that use a theme engine can be modified or changed quickly with minimal cost or time.&lt;/p&gt;
&lt;p&gt;For a better example of what theme switching can do, see &lt;a href="/post/Themes-Galore.aspx"&gt;Themes Galore&lt;/a&gt;. [more]&lt;/p&gt;
&lt;p&gt;Engines that use a theme engine to allow quick styling and deployment include the following.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="BlogEngine.Net" href="http://dotnetblogengine.net"&gt;BlogEngine.Net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drupal.org/"&gt;Drupal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dotnetnuke.com/"&gt;DotNetNuke&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.joomla.org/"&gt;Joomla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wordpress.org"&gt;Wordpress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blogger.com"&gt;Blogger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.typepad.com/"&gt;TypePad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a more extensive list of Content Management Systems (CMS), refer to the post on &lt;a href="http://www.openjason.com/2008/02/23/50-content-management-systems/"&gt;50 Content Management Systems&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some of the more interesting CSS templates, or themes I've seen are listed below. These themes include the CSS and the templates uses for posts, pages, headers, footers, etc.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://templates.arcsin.se/" rel="nofollow"&gt;Arcsin CSS Design Templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://themes.wordpress.net/" rel="nofollow"&gt;Themes.Wordpress.Net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogger-templates.blogspot.com/"&gt;Bloggger blogspot templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.freecsstemplates.org/" rel="nofollow"&gt;Free CSS Templates.Org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.free-css-templates.com/" rel="nofollow"&gt;Free CSS Templates.Com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.styleshout.com/" rel="nofollow"&gt;StyleShout.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wpthemesfree.com" rel="nofollow"&gt;Wordpress Themes Free&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.smashingmagazine.com/2007/02/09/83-beautiful-wordpress-themes-you-probably-havent-seen/" href="http://www.smashingmagazine.com/2007/02/09/83-beautiful-wordpress-themes-you-probably-havent-seen/" rel="nofollow"&gt;83 Beautiful Wordpress Themes You Probably Havent Seen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.templateworld.com/free_templates.html" rel="nofollow"&gt;Template World&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.4templates.com/"&gt;4 Templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.snowcovered.com/Snowcovered2/Default.aspx?r=21f0bc05e4"&gt;SnowCovered&lt;/a&gt;&amp;nbsp;- DotNetNuke Skins&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.csstemplateheaven.com/"&gt;Css Template Heaven&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tags: Free themes, CSS templates, Wordpress themes, XHTML templates&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>blogengine-net</category>
  <category>css</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/sites-for-css-design-themes/</guid>
  <pubDate>Tue, 11 Mar 2008 20:37:00 GMT</pubDate>
</item>
<item>
  <title>BlogEngine.Net Secret Links</title>
  <link>https://tim-stanley.com/post/blogenginenet-secret-links/</link>
  <description>&lt;p&gt;&lt;a href="http://www.dotnetblogengine.net/" rel="nofollow"&gt;BlogEngine.Net&lt;/a&gt; provides quite a lot of very rich functionality, but the rich functionality is not documented as extensively.&amp;nbsp; I've tried to put together a list of all the types of links that BlogEngine.Net supports.&amp;nbsp; [more]&lt;/p&gt;
&lt;h2&gt;Posts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tim-stanley.com"&gt;http://tim-stanley.com&lt;/a&gt; displays the &lt;em&gt;home&lt;/em&gt; page.&amp;nbsp; The home page can be configured to show a specific page, or the most recent list of posts.&lt;/li&gt;
&lt;li&gt;&lt;a href="/blog.aspx"&gt;http://tim-stanley.com/blog.aspx&lt;/a&gt;&amp;nbsp;displays the list of first blog page entries, even if a page is configured to show a specific page first.&lt;/li&gt;
&lt;li&gt;&lt;a title="http://tim-stanley.com/post/How-to-Remove-Projects-in-the-Visual-Studio-Project-MRU-List.aspx" href="/post/BlogEngineNet-Expanding-Categories-And-Tags.aspx"&gt;http://tim-stanley.com/post/{Post-Name}.aspx&lt;/a&gt; displays a specific post.&lt;/li&gt;
&lt;li&gt;&lt;a title="http://tim-stanley.com/2008/Default.aspx" href="/2008/Default.aspx"&gt;http://tim-stanley.com/2008/Default.aspx&lt;/a&gt; displays posts for a specific year.&lt;/li&gt;
&lt;li&gt;&lt;a title="http://tim-stanley.com/2008/03/Default.aspx" href="/2008/03/Default.aspx"&gt;http://tim-stanley.com/2008/03/Default.aspx&lt;/a&gt; displays posts for a specific month.&lt;/li&gt;
&lt;li&gt;&lt;a title="http://tim-stanley.com/2008/03/07/Default.aspx" href="/2008/03/07/Default.aspx"&gt;http://tim-stanley.com/2008/03/07/Default.aspx&lt;/a&gt; displays posts for a specific date.&lt;/li&gt;
&lt;li&gt;&lt;a href="/author/%7Bauthor%7D.aspx"&gt;http://tim-stanley.com/author/{author}.aspx&lt;/a&gt;&amp;nbsp;displays all posts by {author}.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Pages&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://tim-stanley.com/page/About.aspx" href="/page/About.aspx"&gt;http://tim-stanley.com/page/{Page-Name}.aspx&lt;/a&gt; displays a specific page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Categories&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://tim-stanley.com/category/Photography.aspx" href="/category/Photography.aspx"&gt;http://tim-stanley.com/category/{Category-Name}.aspx&lt;/a&gt; displays a list of posts with the named category.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;RSS Feeds&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="http://tim-stanley.com/syndication.axd" href="/syndication.axd"&gt;http://tim-stanley.com/syndication.axd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="http://tim-stanley.com/category/syndication.axd?category=20180679-d7ea-4b7a-b248-4fc60f5ba3a7" href="/category/syndication.axd?category={GUID}"&gt;http://tim-stanley.com/category/syndication.axd?category={GUID}&lt;/a&gt; category syndication feed.&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.joshwilliamsmusic.com/syndication.axd?post=d5533fa2-059a-4427-b871-49cc7252274d" href="/syndication.axd?post={GUID}"&gt;http://tim-stanley.com/syndication.axd?post={GUID}&lt;/a&gt; - comment syndication feed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Special Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/archive.aspx"&gt;http://tim-stanley.com/archive.aspx&lt;/a&gt; displays a list of archives grouped by category.&lt;/li&gt;
&lt;li&gt;&lt;a href="/contact.aspx"&gt;http://tim-stanley.com/contact.aspx&lt;/a&gt; displays a contact e-mail entry form.&lt;/li&gt;
&lt;li&gt;&lt;a title="http://tim-stanley.com/error404.aspx" href="/error404.aspx"&gt;http://tim-stanley.com/error404.aspx&lt;/a&gt; displays the custom file not found error page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;AXD Handlers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/file.axd"&gt;http://tim-stanley.com/file.axd&lt;/a&gt; used for file downloads.&lt;/li&gt;
&lt;li&gt;&lt;a href="/image.axd"&gt;http://tim-stanley.com/image.axd&lt;/a&gt; used for images, i.e. src="/image.axd?picture=SomeImage.jpg".&lt;/li&gt;
&lt;li&gt;&lt;a href="/syndication.axd"&gt;http://tim-stanley.com/syndication.axd&lt;/a&gt; used for &lt;a title="Really Simple Syndication" href="http://en.wikipedia.org/wiki/RSS_(file_format)" target="_blank" rel="nofollow noopener"&gt;RSS&lt;/a&gt; feeds.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tim-stanley.com/sitemap.axd"&gt;http://www.tim-stanley.com/sitemap.axd&lt;/a&gt; used in robots.txt to create a sitemap for search services.&lt;/li&gt;
&lt;li&gt;&lt;a href="/trackback.axd"&gt;http://tim-stanley.com/trackback.axd&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="/pingback.axd"&gt;http://tim-stanley.com/pingback.axd&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="/opensearch.axd"&gt;http://tim-stanley.com/opensearch.axd&lt;/a&gt; used for &lt;a href="http://www.opensearch.org/Home" target="_blank" rel="nofollow noopener"&gt;open search&lt;/a&gt; results.&amp;nbsp; If the link was found by a search result from another site, the site will display other "similar" pages that match the search criteria.&lt;/li&gt;
&lt;li&gt;&lt;a href="/metaweblog.axd"&gt;http://tim-stanley.com/metaweblog.axd&lt;/a&gt; used for &lt;a href="http://en.wikipedia.org/wiki/MetaWeblog" target="_blank" rel="nofollow noopener"&gt;MetaWeblog API&lt;/a&gt; defined at &lt;a href="http://www.xmlrpc.com/metaWeblogApi" target="_blank" rel="nofollow noopener"&gt;XMLRPC.com&lt;/a&gt; for services like &lt;a href="http://get.live.com/writer/overview" target="_blank" rel="nofollow noopener"&gt;Windows Live Writer&lt;/a&gt;, &lt;a href="http://flickr.com/" target="_blank" rel="nofollow noopener"&gt;Flickr&lt;/a&gt;, Google Docs and others services to allow post, edit, or deleted posts or pages on a site.&lt;/li&gt;
&lt;li&gt;&lt;a href="/rsd.axd"&gt;http://tim-stanley.com/rsd.axd&lt;/a&gt;&amp;nbsp;&lt;a title="Really Simple Discoverability" href="http://cyber.law.harvard.edu/blogs/gems/tech/rsd.html" target="_blank" rel="noopener"&gt;RSD&lt;/a&gt; handler used to publish the links used by services to read, edit, or work with the site.&lt;/li&gt;
&lt;li&gt;&lt;a href="/css.axd"&gt;http://tim-stanley.com/css.axd&lt;/a&gt; CSS compression handler.&lt;/li&gt;
&lt;li&gt;&lt;a href="/js.axd"&gt;http://tim-stanley.com/js.axd&lt;/a&gt; JavaScript compression handler, i.e. src="/js.axd?path=%2fblog.js".&lt;/li&gt;
&lt;li&gt;&lt;a href="/rating.axd"&gt;http://tim-stanley.com/rating.axd&lt;/a&gt; rating feedback handler.&lt;/li&gt;
&lt;li&gt;&lt;a href="/opml.axd"&gt;http://tim-stanley.com/opml.axd&lt;/a&gt; handler for &lt;a title="Outline Processor Markup Language" href="http://en.wikipedia.org/wiki/OPML" target="_blank" rel="nofollow noopener"&gt;OPML&lt;/a&gt; at &lt;a href="http://www.opml.org/" target="_blank" rel="nofollow noopener"&gt;OPML.org&lt;/a&gt; that allows sharing of site information.&lt;/li&gt;
&lt;li&gt;&lt;a href="/monster.axd"&gt;http://tim-stanley.com/monster.axd&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="/blogml.axd"&gt;http://tim-stanley.com/blogml.axd&lt;/a&gt; blog export / import XML standard at &lt;a href="http://blogml.org/" target="_blank" rel="nofollow noopener"&gt;blogml.org&lt;/a&gt;.&amp;nbsp; Supported on engines like CommunityServer, Subtext, DasBlog, .Text, and others.&lt;/li&gt;
&lt;li&gt;&lt;a href="/sioc.axd"&gt;http://tim-stanley.com/sioc.axd&lt;/a&gt; handler for &lt;a title="Semantically-Interlinked Online Communities Project" href="http://en.wikipedia.org/wiki/SIOC" target="_blank" rel="nofollow noopener"&gt;SIOC&lt;/a&gt; that allows sharing of data based on profiles for content, author, comments, and sites.&amp;nbsp; Read more on the &lt;a href="http://johndyer.name/post/2008/02/SIOC-implementation-for-BlogEngineNET.aspx" target="_blank" rel="noopener"&gt;SIOC Implementation for BlogEngine.Net&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="/apml.axd"&gt;http://tim-stanley.com/apml.axd&lt;/a&gt; handler for &lt;a title="Attention Profiling Markup Language" href="http://www.apml.org/" target="_blank" rel="nofollow noopener"&gt;APML&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>blogengine-net</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/blogenginenet-secret-links/</guid>
  <pubDate>Mon, 10 Mar 2008 23:15:00 GMT</pubDate>
</item>
<item>
  <title>How to Remove Projects in the Visual Studio Project MRU List</title>
  <link>https://tim-stanley.com/post/how-to-remove-projects-in-the-visual-studio-project-mru-list/</link>
  <description>&lt;p&gt;Visual Studio.Net (2003, 2005 and 2008) keeps a list of recent projects shown on the Start Page in the IDE. Sometimes when moving projects around on the disk, one can end up with duplicate names and this can be confusing. To resolve this, the list in the registry must be updated.&lt;/p&gt;
&lt;p&gt;[more]&lt;/p&gt;
&lt;h2&gt;Visual Studio Recent Projects&lt;/h2&gt;
&lt;p&gt;Visual Studio .Net keeps it's list of projects in the registry. Depending on which version depends on which location the list is stored.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio 2002 - 7.0&lt;/li&gt;
&lt;li&gt;Visual Studio 2003 - 7.1&lt;/li&gt;
&lt;li&gt;Visual Studio 2005 - 8.0&lt;/li&gt;
&lt;li&gt;Visual Studio 2008 - 9.0&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\7.0\ProjectMRUList]
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\7.1\ProjectMRUList]
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\ProjectMRUList]
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\ProjectMRUList]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There is also a FileMRUList that is maintained for individual files as well.&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;Warning:&lt;/span&gt; All the normal cautions to editing the registry apply. Editing the registry can corrupt your system. If you don't know what your doing and don't know how to fix it, don't even think about doing it.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The registry entry contains a list of files as REG_EXPAND_SZ values similar to what is shown below.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
File1 - C:\Projects\Test\Test1.sln
File2 - %USERPROFILE%\My Documents\Temp\ReportTest.sln
File3 - %USERPROFILE%\My Documents\Projects\ReportTest.sln
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All you have to do is find the entry that you want removed, and delete the registry entry.&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;Update:&lt;/span&gt; If you remove an entry in the middle of the list, then Visual Studio does not show any entries after the entry that is removed. For example, consider a list that contains the following registry entries before editing.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
File1 - C:\Projects\Test\Test1.sln
File2 - %USERPROFILE%\My Documents\Temp\ReportTest.sln
File3 - %USERPROFILE%\My Documents\Projects\ReportTest.sln
File4 - %USERPROFILE%\My Documents\Projects\Solution4.sln
File5 - %USERPROFILE%\My Documents\Projects\Solution5.sln
File6 - %USERPROFILE%\My Documents\Projects\Solution6.sln
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you remove the entry for File4 then you would be left with the following.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
File1 - C:\Projects\Test\Test1.sln
File2 - %USERPROFILE%\My Documents\Temp\ReportTest.sln
File3 - %USERPROFILE%\My Documents\Projects\ReportTest.sln
File5 - %USERPROFILE%\My Documents\Projects\Solution5.sln
File6 - %USERPROFILE%\My Documents\Projects\Solution6.sln
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Visual Studio however, will show only the entries for 1 through 3. If you want entries after 3 to show, then you must renumber the subsequent entries to have the following.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
File1 - C:\Projects\Test\Test1.sln
File2 - %USERPROFILE%\My Documents\Temp\ReportTest.sln
File3 - %USERPROFILE%\My Documents\Projects\ReportTest.sln
File4 - %USERPROFILE%\My Documents\Projects\Solution5.sln
File5 - %USERPROFILE%\My Documents\Projects\Solution6.sln
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Josh Beach wrote a tool &lt;a href="http://www.codeproject.com/dotnet/VSProjectListEditor.asp"&gt;Visual Studio Project MRU List Editor&lt;/a&gt; that appears quite useful if you have to do this on a recurring basis. &lt;a href="#1"&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Updates&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;May 22, 2007 - original post.&lt;/li&gt;
&lt;li&gt;Mar 8, 2008 - update with Visual Studio 2008 notes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a id="#1"&gt;&lt;/a&gt;[1] &lt;a href="http://www.codeproject.com/useritems/vsprojectlisteditor.asp"&gt;Visual Studio Project MRU List Editor&lt;/a&gt; codeproject.com&lt;/li&gt;
&lt;li&gt;&lt;a id="#2"&gt;&lt;/a&gt;[2] &lt;a href="http://www.codeproject.com/useritems/vsprojectlisteditor.asp"&gt;Visual Studio Project MRU List Editor II&lt;/a&gt; codeproject.com&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>tips</category>
  <category>net</category>
  <category>visual-studio</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/how-to-remove-projects-in-the-visual-studio-project-mru-list/</guid>
  <pubDate>Sat, 08 Mar 2008 13:41:00 GMT</pubDate>
</item>
<item>
  <title>Themes Galore</title>
  <link>https://tim-stanley.com/post/themes-galore/</link>
  <description>&lt;p&gt;Web sites use templates called skins, themes, and styles to describe how web sites can be modified to change the look and layout of a web site without changing the content.&amp;nbsp; Wordpress, Blogspot, DotNetNuke and others all provide the ability to modify the color, layout and style with thousands of templates that are available.&amp;nbsp; Many are free, some cost only a small fee.&amp;nbsp; The ones that do cost something range from less than $50 to about $200 for a bundle.&lt;/p&gt;
&lt;p&gt;One of the greatest sites to extol the virtues of using CSS to modify layout, colors, images, and style of a stie but using the the unchanged same content is the &lt;a href="http://www.csszengarden.com/"&gt;CSS Zen Garden&lt;/a&gt;.&amp;nbsp; A lot of significant design effort went into the styles used at the CSS Zen Garden, but they look great.&lt;/p&gt;
&lt;p&gt;[more]Predesigned themes can be invaluable for a small business or organization operating on a limited budget.&amp;nbsp; Something that would cost $3000 to $6000 or more to have a custom designer generate, can be obtained for less than $100.&lt;/p&gt;
&lt;p&gt;There a new web site engine making headway in the market today called BlogEngine.NET.&amp;nbsp; It's been very popular as more and more new features become available.&amp;nbsp; One of the most interesting features is BlogEngine.Net's ability to support multiple themes.&lt;/p&gt;
&lt;p&gt;Here's a list of current &lt;a href="http://www.dotnetblogengine.net/page/themes.aspx"&gt;BlogEngine.Net Themes&lt;/a&gt; that are supported (with some custom ones added by me):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/post/Themes-Galore/?theme=BrightSide"&gt;BrightSide&lt;/a&gt; **&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=Clarity"&gt;Clarity&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=CoffeeHouse"&gt;CoffeeHouse&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore?theme=Cogitation"&gt;Cogitation&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=Curiously Green"&gt;Curiously Green&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=DarkBlog"&gt;DarkBlog&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore?theme=Dirtylicious"&gt;Dirtylicious&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=Discovery"&gt;Discovery&lt;/a&gt; **&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore?theme=Envision.1.0"&gt;Envision.1.0&lt;/a&gt; **&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore?theme=GirlGeek"&gt;GirlGeek&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=Gluttony"&gt;Gluttony&lt;/a&gt; *&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=Indigo"&gt;Indigo&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=iTheme"&gt;iTheme&lt;/a&gt; **&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=Leaves"&gt;Leaves&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=Mobile"&gt;Mobile&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=MWRT-002"&gt;MWRT-002&lt;/a&gt; *&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=NaturalEssence.1.0"&gt;NaturalEssence.1.0&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=NonZero"&gt;NonZero&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=StableStart-Black"&gt;StableStart-Black&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=Standard"&gt;Standard&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=StarGazer"&gt;StarGazer&lt;/a&gt; *&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=swandive"&gt;Swandive&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=Terrafirma"&gt;Terrafirma&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=TheGreenHouse"&gt;TheGreenHouse&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=ThemeEngine.LayoutGala.1.0"&gt;ThemeEngine.LayoutGala.1.0&lt;/a&gt; **&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=ThemeEngine.NFL.1.0"&gt;ThemeEngine.NFL.1.0&lt;/a&gt; **&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href="/post/Themes-Galore/?theme=Tim-Stanley"&gt;Tim-Stanley&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;** - these are definately worth taking a look at.&lt;/div&gt;
&lt;div&gt;* - you might be interested.&lt;/div&gt;
&lt;div&gt;Several of the themes were created by Jesse Foster.&amp;nbsp; Jesse explains more about how the different layouts are accomplished in his post on &lt;a href="http://www.gravitycube.net/blog/post/New-BlogEngine-Theme---ThemeEngineLayoutGala.aspx"&gt;Layout Gala&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;Envision.1.0: &lt;br /&gt;&lt;img src="/image.axd?picture=BrightSide.jpg" alt="" width="480" height="403" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Discovery: &lt;br /&gt;&lt;img src="/image.axd?picture=Discovery.jpg" alt="" width="480" height="413" /&gt;&lt;/p&gt;
&lt;p&gt;Updates&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;8/31/2022 - .aspx extensions removed, note themes no longer supported under asp.net core.&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>blogengine-net</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/themes-galore/</guid>
  <pubDate>Thu, 28 Feb 2008 13:23:00 GMT</pubDate>
</item>
<item>
  <title>Focus Causes Change Blindness</title>
  <link>https://tim-stanley.com/post/focus-causes-change-blindness/</link>
  <description>&lt;p&gt;Focus or stress causes us to overlook things we would normally notice (&lt;a href="http://www.scholarpedia.org/wiki/index.php?title=inattentional_blindness&amp;amp;oldid=12232" rel="nofollow"&gt;inattentional blindness&lt;/a&gt;).&amp;nbsp; When people focus too much on one thing, &lt;a href="http://quirkology.com/USA/Video_ColourChangingTrick.shtml" rel="nofollow"&gt;people don't notice&lt;/a&gt; other changes.&amp;nbsp; Take the video example below that&amp;nbsp;illustrates this example.&amp;nbsp; There are&amp;nbsp;five changes that occur during this video. [more]&lt;/p&gt;
&lt;p&gt;[youtube:voAntzB7EwE]&lt;/p&gt;
&lt;p&gt;What if you have a project, and you want to communicate a change. How can you be sure that people will correctly observe and act on the change accordingly? [more] The first obvious answer is to have a change control process.&amp;nbsp; But even then, changes that are identified still get lost if the information is too much to process, or it it's not clearly presented. I've found the following techniques useful from my own personal experiences and projects.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;First, be aware that &lt;a href="http://en.wikipedia.org/wiki/Inattentional_blindness" rel="nofollow"&gt;inattentional blindness&lt;/a&gt; or change blindness exists.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Minimize&amp;nbsp;other distractions&amp;nbsp;when presenting information about changes.&amp;nbsp; If changes are presented when other priorities have focus, the changes will be lost.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Minimize the quantity of changes presented at any given time.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Provide breaks (hours, days) between blocks of changes.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Give ample time between changes for people to evaluate the impact to other systems or processes.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Clearly identify&amp;nbsp;visually in distinct colors or blocks any changes.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Break out specifically changes separate from the overall context of other documents, or e-mails.&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In software development projects, I have witnessed both within my own software development and within all software development teams a phenomenon I've not seen documented in any software development process. There is a period of time&amp;nbsp;between when a development team has completed a release and when within days of not working on the code on a day to day basis, without performing any code reviews or other analysis, issues are identified that need to be further tested or changes made in code to resolve code or design&amp;nbsp;issues.&amp;nbsp; The only thing I've been able to attribute this too is too much&amp;nbsp;information during development which when removed allows the developer to focus on things more clearly and these things then come to light.&amp;nbsp; I now plan for these "aha" moments in my software development projects.&lt;/p&gt;
&lt;p&gt;Any successful project has changes that occur from the begging to the end of a project.&amp;nbsp; Too many changes presented with other priorities will be lost and won't get successfully delivered.&amp;nbsp; Be aware of change blindness so your projects don't get caught blind.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>communication</category>
  <category>communication</category>
  <category>project-management</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/focus-causes-change-blindness/</guid>
  <pubDate>Fri, 25 Jan 2008 16:37:00 GMT</pubDate>
</item>
<item>
  <title>Communication Illusions</title>
  <link>https://tim-stanley.com/post/communication-illusions/</link>
  <description>&lt;div class="pane-image"&gt;&lt;a href="http://web.mit.edu/persci/people/adelson/checkershadow_illusion.html" rel="nofollow"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/CommunicationIllusions_84EA/checkershadow_illusion4med_3.jpg" alt="checkershadow_illusion4med" width="260" height="207" border="0" /&gt;&lt;/a&gt;
&lt;div class="caption"&gt;image: &lt;a href="http://web.mit.edu/persci/people/adelson/" rel="nofollow"&gt;Edward H. Adelson&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Every sense we use to communicate with can be tricked, or confused into perceiving things that don't exist and not perceiving things that do exist.&amp;nbsp; Our senses are good at what they do, but have limitations and adaptations that work for or against us in a certain way.&amp;nbsp; If we know the limitations, we can better compensate using other techniques. [more]&lt;/p&gt;
&lt;h2&gt;Optical Illusions&lt;/h2&gt;
&lt;p&gt;Take the image above for example. Are the squares A and B the same color, or are they different colors?&amp;nbsp; They are the same color. &lt;a href="http://web.mit.edu/persci/people/adelson/" rel="nofollow"&gt;Adelson&lt;/a&gt; of MIT explains the &lt;a href="http://web.mit.edu/persci/people/adelson/checkershadow_illusion.html" rel="nofollow"&gt;checker shadow illusion&lt;/a&gt; and why these appear to be different colors, but are in fact the same color.&amp;nbsp; Both colors are the hex color code #777777.&amp;nbsp; The visual system breaks down what it sees into components, allowing us to perceive the nature of what we see.&amp;nbsp; In this case, assumptions on physical space and light lead us to a false conclusion.&lt;/p&gt;
&lt;p&gt;In one study, at the &lt;a href="http://viscog.beckman.uiuc.edu/grafs/demos/15.html" rel="nofollow"&gt;Visual Cognition Lab&lt;/a&gt; at the University of Illinois, individuals were asked to count how many passes of a basketball were made by a specific team.&amp;nbsp; Interestingly enough, about half failed to notice a gorilla that moves across the court and pounds it's chest.&lt;/p&gt;
&lt;p&gt;Some key points on optical illusions (visual communication limitations):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We see things that aren't there.&lt;/li&gt;
&lt;li&gt;We don't see things that are there.&lt;/li&gt;
&lt;li&gt;Focus or stress causes us to overlook things we would normally notice.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If our eyes can be deceived, then so can our other senses.&amp;nbsp; When we try to &lt;a href="http://en.wikipedia.org/wiki/Communication" rel="nofollow"&gt;communicate&lt;/a&gt;, we use written, visual, verbal, and nonverbal means to convey our message.&amp;nbsp; Just like the &lt;a href="http://www.michaelbach.de/ot/" rel="nofollow"&gt;optical illusion&lt;/a&gt; above, in every mode of communication there is the opportunity for illusions of communication to occur which can often lead to miscommunication.&lt;/p&gt;
&lt;h2&gt;Verbal Illusions&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www-news.uchicago.edu/releases/02/020426.speakers.shtml" rel="nofollow"&gt;Speakers overestimate their effectiveness&lt;/a&gt;.&amp;nbsp; I've known this from personal experience, but I wasn't aware of the significant degree of miscommunication that occurs.&amp;nbsp; Experiments by Boaz Keysar and Anne Henly proved to me verbal illusions exist just as do optical illusions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Speakers are confident they are effective even if the information is ambiguous or unclear.&lt;/li&gt;
&lt;li&gt;Speakers are not understood as much as they think they are (less than &amp;frac12; the time).&lt;/li&gt;
&lt;li&gt;Listeners are confident in understanding speakers&lt;/li&gt;
&lt;li&gt;Listeners do not understand as much as they think they do (less than &amp;frac12; the time).&lt;/li&gt;
&lt;li&gt;Listeners are as confident when they are understanding correctly as when they misunderstand.&lt;/li&gt;
&lt;li&gt;Observers (not involved in the exchange) are more likely to identify potential misunderstandings.&lt;/li&gt;
&lt;li&gt;People that are anxious or depressed are more likely to incorrectly process ambiguous situations as threatening.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Written Illusions&lt;/h2&gt;
&lt;p&gt;Written communication can be even more prone to miscommunication.&amp;nbsp; Ambiguity in verbal communications is even more detrimental to miscommunication in written form (e-mail, documents, requirements, etc.). Communication that takes place in written form is devoid of explanation, original intent, body language and inflexion that come with communication in person.&amp;nbsp; Furthermore, most written communication tends to be viewed as more formal.&lt;/p&gt;
&lt;p&gt;Think about it, if written communication were so easy and clear, why does the U.S. Constitution call for a panel of justices on the supreme Court to &lt;em&gt;interpret&lt;/em&gt; the written laws?&lt;/p&gt;
&lt;h2&gt;Compensate for Illusions&lt;/h2&gt;
&lt;p&gt;We see things that aren't there, we don't see things that are.&amp;nbsp; We think we hear things, clearly, but don't.&amp;nbsp; No wonder software development projects fail.&amp;nbsp; If we want to communicate better, what can we do?&lt;/p&gt;
&lt;p&gt;When I was the chairman of the ActiveStore committee, I worked with team members from multiple companies in Europe, Asia, the Middle East, and the US.&amp;nbsp; I learned that these senior people (presidents, vice presidents, directors)&amp;nbsp; were good at communicating, but not immune from these illusions of communication.&amp;nbsp; We would discuss a topic, come to a conclusion, reach an agreement, and then write it down.&amp;nbsp; We found that only by using multiple avenues of communication (white boards, verbal, in-person meetings, and written summaries), did we actually agree on what we were trying to communicate.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I've since then worked with development and customer teams in four or five different physical locations, anywhere from 700 to 7000 miles apart.&amp;nbsp; The problem only gets more complicated and complex the further the distance is involved.&amp;nbsp; I've used the following points to help me communicate clearly.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The burden of communication falls on the communicator.&lt;/li&gt;
&lt;li&gt;Assume only &amp;frac12; of what is communicated is understood.&lt;/li&gt;
&lt;li&gt;Repeat important communication points multiple times in different ways.&lt;/li&gt;
&lt;li&gt;Don't be ambiguous, be specific.&lt;/li&gt;
&lt;li&gt;Have the recipient repeat what is understood.&lt;/li&gt;
&lt;li&gt;If something can be interpreted in multiple ways, clarify the original intent.&lt;/li&gt;
&lt;li&gt;Have the recipient state assumptions that are made.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Every instance that I have seen where there were significant gaps in what was expected versus what's been delivered in a software development project have all been preceded by&amp;nbsp; little explanation, and large assumptions that were not clearly communicated.&amp;nbsp; I've seen the above techniques clearing up communicating help improve understandings significantly.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.michaelbach.de/ot/" rel="nofollow"&gt;Optical Illusions &amp;amp; Visual Phenomena&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.embl.org/aboutus/news/press/2007/03jun07/index.html" rel="nofollow"&gt;New insights into the neural basis of anxiety&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.troxlerforum.ch/" rel="nofollow"&gt;Troxler effect&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9c949bc5-5f99-4031-945c-9b80efa5eac3" class="wlWriterSmartContent" style="display: inline; float: none; margin: 0px; padding: 0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Communication" rel="tag"&gt;Communication&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>communication</category>
  <category>communication</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/communication-illusions/</guid>
  <pubDate>Thu, 24 Jan 2008 03:00:00 GMT</pubDate>
</item>
<item>
  <title>Software Is Not Done</title>
  <link>https://tim-stanley.com/post/software-is-not-done/</link>
  <description>&lt;div class="pane-image"&gt;&lt;img src="/image.axd?picture=WindowsLiveWriter/SoftwareIsNotDone_7572/Puzzle_thumb.jpg" alt="Puzzle" width="204" height="154" /&gt;
&lt;div class="caption"&gt;photo: Willi Heidelbach &lt;a href="http://www.sxc.hu/"&gt;stock xchng&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It's not that software is never finished.&amp;nbsp; It's just that &lt;em&gt;done&lt;/em&gt; is not a good description to describe the status of software.&lt;/p&gt;
&lt;p&gt;What's the status of the "&lt;em&gt;Buy 12 get one free promotion&lt;/em&gt;?"&lt;/p&gt;
&lt;p&gt;It's done!&lt;/p&gt;
&lt;p&gt;What's done for one particular team isn't done for another.&amp;nbsp; Done for the business analyst isn't done for the the person doing deployment.&amp;nbsp; It leads to a lot of confusion among teams, particularly when teams are in multiple physical locations. [more]&lt;/p&gt;
&lt;p&gt;What's needed to help communicate the status is a common set of terms used by the teams in all locations to consistently indicate status.&amp;nbsp; I use the following terms with my teams.&amp;nbsp; This not only helps identify the status of a particular feature, it takes the emphasis off a particular phase and helps the team realize that one shot isn't the game.&amp;nbsp; Half time isn't done.&amp;nbsp; The goal of a software service or product is to rollout the features desired by the business, not to just complete one particular phase.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Business requirements complete&lt;/li&gt;
&lt;li&gt;Graphical User Interface (GUI) requirements complete&lt;/li&gt;
&lt;li&gt;System requirements complete&lt;/li&gt;
&lt;li&gt;Technical design complete&lt;/li&gt;
&lt;li&gt;Code construction complete&lt;/li&gt;
&lt;li&gt;Code review complete&lt;/li&gt;
&lt;li&gt;Code review changes complete&lt;/li&gt;
&lt;li&gt;Unit test complete&lt;/li&gt;
&lt;li&gt;Unit test issues changes complete&lt;/li&gt;
&lt;li&gt;First pass system test complete&lt;/li&gt;
&lt;li&gt;System test issues complete&lt;/li&gt;
&lt;li&gt;Final system test complete&lt;/li&gt;
&lt;li&gt;Customer acceptance test complete&lt;/li&gt;
&lt;li&gt;Customer acceptance issues complete&lt;/li&gt;
&lt;li&gt;Deployment complete&lt;/li&gt;
&lt;li&gt;Pilot complete&lt;/li&gt;
&lt;li&gt;Rollout complete&lt;/li&gt;
&lt;/ol&gt;
&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:379bfe29-e1a9-4510-9c62-8acd372d5c2e" class="wlWriterSmartContent" style="display: inline; margin: 0px; padding: 0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Project%20Management" rel="tag"&gt;Project Management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Software%20Development" rel="tag"&gt;Software Development&lt;/a&gt;&lt;/div&gt;</description>
  <author>email@nospam.com</author>
  <category>project-management</category>
  <category>project-management</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/software-is-not-done/</guid>
  <pubDate>Mon, 21 Jan 2008 14:52:00 GMT</pubDate>
</item>
<item>
  <title>What Is Heard Is Not What Is Said</title>
  <link>https://tim-stanley.com/post/what-is-heard-is-not-what-is-said/</link>
  <description>&lt;p&gt;In the days of global development teams, communication can be difficult.&amp;nbsp; It's what the recipient hears that is more important than what the communicator says.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: small;"&gt;What was said:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;I believe in you. Love, Mose&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: small;"&gt;What was heard:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;I be leaving you. Love, Mose.&lt;/blockquote&gt;
&lt;p&gt;The next time you communicate with your team members, get them to repeat what they understood&amp;nbsp;in their words.&amp;nbsp; It's better to straighten out any misunderstandings up front than to let things go misunderstood. [more]&lt;/p&gt;
&lt;p&gt;The full entry from December 2007 Reader's Digest:&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;My wife struggled with a career crisis: Should she quit her job? Knowing how panicked she was, I called our florist and sent her a bouquet with a card saying "I believe in you. Love Mose." Later she called to thank me. "But I'm confused by the card," she said. "Really? Why?" "Because it reads 'I be leaving you. Love, Mose.'" &lt;/cite&gt;&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>communication</category>
  <category>communication</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/what-is-heard-is-not-what-is-said/</guid>
  <pubDate>Sat, 29 Dec 2007 18:59:00 GMT</pubDate>
</item>
<item>
  <title>ASP.NET 3.5 Extensions CTP Preview Released</title>
  <link>https://tim-stanley.com/post/aspnet-35-extensions-ctp-preview-released/</link>
  <description>&lt;p&gt;On Dec 9, Microsoft released&amp;nbsp;the &lt;a href="http://asp.net/downloads/3.5-extensions/"&gt;ASP.NET 3.5 Extensions CTP Preview&lt;/a&gt; for Visual Studio 2008.&amp;nbsp; Scott Guthrie outlines some&amp;nbsp;&amp;nbsp;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/12/09/asp-net-3-5-extensions-ctp-preview-released.aspx"&gt;ASP.NET 3.5 Extensions CTP Preview&amp;nbsp;key features&lt;/a&gt; this&amp;nbsp;preview release&amp;nbsp;provides.&lt;/p&gt;
&lt;p&gt;These include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;ASP.NET Ajax Improvements&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;ASP.NET MVC&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;ASP.NET Dynamic Data Support&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;ASP.NET Silverlight Support&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;ADO.NET Data Services&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[more]A set of &lt;a href="http://quickstarts.asp.net/3-5-extensions/"&gt;ASP.NET 3.5 quickstart samples&lt;/a&gt; are also available.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A quick take:&lt;/p&gt;
&lt;p&gt;Q: Should I use this for production development?&lt;br /&gt;A: No, this is a CTP Preivew.&amp;nbsp; See the &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/11/29/net-web-product-roadmap-asp-net-silverlight-iis7.aspx"&gt;ASP.NET Product Roadmap&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;Q: If I shouldn't use this for production development, what&amp;nbsp;good is&amp;nbsp;this release?&lt;br /&gt;A: It provides the ASP.NET MVC which if your requirements need it provide the ability for enhanced URL control for your ASP.NET applications.&amp;nbsp; Previously, the only ways to do a very complex URL structure was a painstaking folder path, or installing an Isapi extension.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>software</category>
  <category>asp-net</category>
  <category>visual-studio</category>
  <category>microsoft</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/aspnet-35-extensions-ctp-preview-released/</guid>
  <pubDate>Mon, 10 Dec 2007 20:55:00 GMT</pubDate>
</item>
<item>
  <title>Visual Studio 2008 Released</title>
  <link>https://tim-stanley.com/post/visual-studio-2008-released/</link>
  <description>&lt;p&gt;On November 19, 2007, Microsoft released Visual Studio 2008.&amp;nbsp; Scott Guthrie outlines some of the &lt;a title="Visual Studio 2008 and .Net 3.5 Released" href="http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx"&gt;Visual Studio 2008 key features.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some reasons on why you may want to upgrade.&lt;/p&gt;
&lt;h2&gt;Key VS 2008 Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Full tool support in VS 2008 for WF, WCF, and WPF&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Target builds for .Net 2.0, 3.0 or 3.5&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Java Script intellisense and richer Java Script debugging&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Nested ASP.Net master pages&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/07/25/vs-2008-web-designer-and-css-support.aspx"&gt;Rich CSS editing and layout support within the WYSIWYG designer&lt;/a&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Continued support for &lt;em&gt;web site&lt;/em&gt; and &lt;em&gt;web application &lt;/em&gt;project models&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;ASP.NET AJAX support&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;ASP.NET 3.5 ListView control&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;LINQ (language integrated query) support&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Intellisense code editing improvements&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Key .Net 3.5&amp;nbsp;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;LINQ support&lt;/li&gt;
&lt;li&gt;ASP.NET AJAX&lt;/li&gt;
&lt;li&gt;New WCF Protocols (including AJAX, JSON, REST, POX, RSS, ATOM, and several new WS-* standards)&lt;/li&gt;
&lt;li&gt;New base class library features&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[more]Silverlight 1.1 tools and Web Deployment project add-ins are not available at this time.&lt;/p&gt;
&lt;p&gt;Microsoft released .Net 3.0 for VS 2005 earlier.&amp;nbsp; This added support for new Microsoft technologies for WPF, WCF, and WWF for the existing VS 2005 IDE.&amp;nbsp; Although the technology was there, the lack of typical IDE tools&amp;nbsp;made the use of some of these very very awkward (how fun is it to really modify XAML files directly).&amp;nbsp; WPF really needed Microsoft Expression and WCF needed hand generation via tools of the proxy clients and hand configuration of configuration settings. The integration of these technologies into the VS 2008 IDE really brings these back in line with the typical VS.NET development environment.&lt;/p&gt;
&lt;p&gt;Some releases like VS 2003 to 2005 require&amp;nbsp;significant migration steps.&amp;nbsp; When this happens it requires&amp;nbsp;significant development time, expense, and planning and that makes the update process&amp;nbsp;painful and slower to adopt.&amp;nbsp;&amp;nbsp;The most painful step in the process is the number of hours it takes to download the DVD ISO image from the MSDN web site.&amp;nbsp; The first pass is that existing windows forms applications will migrate somewhat painlessly, web application projects remain to be tested.&lt;/p&gt;
&lt;p&gt;There should be no hesitation in updating to this release.&amp;nbsp;&amp;nbsp;If you update, you can still target builds for .Net 2.0, 3.0, and 3.5, so you aren't&amp;nbsp;&lt;em&gt;forced&lt;/em&gt; to update anything from a deployment perspective&amp;nbsp;just yet and yet you get the benefit of the updated IDE.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If you haven't tried the Microsoft tools, there are also a set of&amp;nbsp;&amp;nbsp;&lt;a href="/post/Visual-Studio-2008-Express-Free.aspx"&gt;Visual Studio Express editions that are free&lt;/a&gt;.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>software</category>
  <category>net</category>
  <category>visual-studio</category>
  <category>microsoft</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/visual-studio-2008-released/</guid>
  <pubDate>Fri, 30 Nov 2007 19:08:00 GMT</pubDate>
</item>
<item>
  <title>Visual Studio 2008 Express Free</title>
  <link>https://tim-stanley.com/post/visual-studio-2008-express-free/</link>
  <description>&lt;p&gt;Microsoft announced on Nov 19, 2007 the availability of Visual Studio 2008.&amp;nbsp; It also made available to the public a free version of the developer tools.&amp;nbsp; Check out the following links to obtain your free copy of these tools.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="linkVb" href="http://go.microsoft.com/?linkid=7653517"&gt;Visual Basic 2008 Express Edition&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="linkCs" href="http://go.microsoft.com/?linkid=7653518"&gt;Visual C# 2008 Express Edition&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="linkCpp" href="http://go.microsoft.com/?linkid=7653520"&gt;Visual C++ 2008 Express Edition&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="linkVwd" href="http://go.microsoft.com/?linkid=7653519"&gt;Visual Web Developer 2008 Express Edition&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a class="linkPopfly" href="http://www.microsoft.com/express/popfly/default.aspx"&gt;Popfly&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a href="http://www.microsoft.com/express/sql/default.aspx"&gt;SQL Server Express&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;a href="http://www.microsoft.com/express/sql/default.aspx"&gt;SQL Server Compact Edition&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Visual Web Developer version includes a significantly improved HTML web designer also used in Visual Studio 2008 and Microsoft Expression Web.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>software</category>
  <category>net</category>
  <category>visual-studio</category>
  <category>microsoft</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/visual-studio-2008-express-free/</guid>
  <pubDate>Fri, 30 Nov 2007 17:31:00 GMT</pubDate>
</item>
<item>
  <title>Nikon Lens Best Values</title>
  <link>https://tim-stanley.com/post/nikon-lens-best-values/</link>
  <description>&lt;p&gt;In researching the type of lenses I wanted for a Nikon D80, I became increasingly frustrated by the type and quality of information available. User suggestions and ratings tended to focus on the most expensive lenses and ignored price. I had a limited budget, but wanted to know what would give me a good value for my budget.&lt;/p&gt;
&lt;p&gt;I've summarized in this article what I believe as of October 2007 are very good quality lenses for very good value. I favor zoom lenses over a fixed focal length prime lens so I have a bias towards zooms. I also don't favor really wide angle lenses so I've not listed those. [more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_why-these-lenses"&gt;Why These Lenses?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_budget-of-250-or-less"&gt;Budget of $250 or Less&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_budget-of-500-or-less"&gt;Budget of $500 or Less&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_budget-of-900-or-less"&gt;Budget of $900 or Less&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_budget-of-1000-or-more"&gt;Budget of $1000 or More&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_other-popular-lenses"&gt;Other Popular Lenses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_notes"&gt;Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_updates"&gt;Updates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_why-these-lenses"&gt;Why These Lenses?&lt;/h2&gt;
&lt;p&gt;Caveat: Unless I own a specific lens, I didn't test it. I have researched the test results, reviews, and comments recommendations of others. All prices are listed as of October 2007. I own the D80, the Nikon 18-135mm f/3.5-5.6G. I also have some older pre-1972 Nikon lenses, but those are pre-AI lenses and do not fit the D80.&lt;/p&gt;
&lt;p&gt;I've listed these lenses because in my opinion, they exhibit good value for the price range. If you read some of the news groups on lens recommendations, folks always recommend the $1600 lens. That's not my budget and I suspect it's not everyone else's either. I wanted to know if I spend a certain amount, what was the best value I could get for my money. That was is the primary reason I wrote this list. The second reason was people kept recommending lenses and I had no idea of the cost or quality.&lt;/p&gt;
&lt;p&gt;I looked for good quality recommendations, popular lenses that if I decided to sell, others would want as well, and I also looked for lenses that retained their value. The Nikon lenses seem to retain their value very well. The prices of Nikon lenses on e-bay are sometimes higher than the price of a new lens. Unless I thought it was a very good value and highly recommended, I've listed only Nikon lenses.&lt;/p&gt;
&lt;p&gt;I've listed the filter size because when buying multiple lenses, it's nice and more cost effective to have filters that fit multiple lenses.&lt;/p&gt;
&lt;p&gt;All lenses listed below work on digital DX format Nikon D80 or D200 bodies. The G lenses do not have an aperture ring and so do not work on manual focus (Manual) Nikon bodies. Vibration Reduction (VR) will not work on manual focus cameras.&lt;/p&gt;
&lt;p&gt;IQ in the tables below refers to the Image Quality ranking from SLR Gear. BR refers to the rating (1-5) provided by Bj&amp;oslash;rn R&amp;oslash;rslett.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nikon D40 D40x users:&lt;/strong&gt; If you are considering one of these lenses, I would recommend you check the compatibility of the D40 or D40x to support auto focus on these lenses. The D4o and D40x support autofocus only on lenses with AF-S and AF-I which are equipped with an autofocus motor.&lt;/p&gt;
&lt;h2 id="h2_budget-of-250-or-less"&gt;Budget of $250 or Less&lt;/h2&gt;
&lt;div class="divGrid"&gt;
&lt;table class="tableGrid" border="0" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;2007 Cost&lt;/th&gt;
&lt;th&gt;Filter&lt;/th&gt;
&lt;th&gt;Film&lt;/th&gt;
&lt;th&gt;Manual&lt;/th&gt;
&lt;th&gt;IQ&lt;/th&gt;
&lt;th&gt;BR&lt;/th&gt;
&lt;th&gt;Reviews&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nikon 50mm f/1.8D AF Standard Auto Focus Nikkor Lens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$109.95&lt;/td&gt;
&lt;td&gt;52mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;9.13&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/5018af.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/97/cat/12"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photodo.com/product_257.html"&gt;Photodo&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_norm.html"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=2137"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_50_18_ais/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 18mm - 55mm f/3.5-5.6G ED II AF-S DX&lt;/td&gt;
&lt;td&gt;$114.95&lt;/td&gt;
&lt;td&gt;52mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;7.81&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/18-55-ii.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/130/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=2170"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_1855_3556_II/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 55mm - 200mm f/4-5.6G ED-IF AF-S DX VR&lt;/td&gt;
&lt;td&gt;$229.95&lt;/td&gt;
&lt;td&gt;52mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;8.20&lt;/td&gt;
&lt;td&gt;3.5&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/55-200mm-vr.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/1088/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_zoom_03.html#AFS55-200VRDX"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=2166"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_55200_456vr/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 id="h2_budget-of-500-or-less"&gt;Budget of $500 or Less&lt;/h2&gt;
&lt;div class="divGrid"&gt;
&lt;table class="tableGrid" border="0" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Filter&lt;/th&gt;
&lt;th&gt;Film&lt;/th&gt;
&lt;th&gt;Manual&lt;/th&gt;
&lt;th&gt;IQ&lt;/th&gt;
&lt;th&gt;Reviews&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 18mm - 135mm f/3.5-5.6G ED-IF AF-S DX&lt;/td&gt;
&lt;td&gt;$329.95&lt;/td&gt;
&lt;td&gt;62mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;9.25&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/18-135.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/993/cat/13"&gt;SLRgear.com&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.bythom.com/18135lens.htm"&gt;Thom Hogan&lt;/a&gt; &lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=2162"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_18135_3556/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 85mm f/1.8D AF&lt;/td&gt;
&lt;td&gt;$399.95&lt;/td&gt;
&lt;td&gt;62mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;9.50&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/85AF.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/100/cat/12"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=1931"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_85_18/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sigma 18-50mm f/2.8 EX DC Macro&lt;/td&gt;
&lt;td&gt;$399.95&lt;/td&gt;
&lt;td&gt;72mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;8.83&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/1008/cat/31"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/sigma_1850_28m_nikon/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nikon 70-300mm f/4.5 - 5.6G ED-IF AF-S VR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$479.00&lt;/td&gt;
&lt;td&gt;62mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;9.13&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/70-300-vr.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/992/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://nikonimaging.com/global/products/lens/af/zoom/af-s_vr_zoom70-300mmf_45-56g_if/index.htm"&gt;Nikon Imaging&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=2161"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_70300_4556vr/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tamron 17-50mm f/2.8 Di II LD Asperical IF SP AF&lt;/td&gt;
&lt;td&gt;$449.95&lt;/td&gt;
&lt;td&gt;67mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;9.14&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/355/cat/23"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/tamron_1750_28_nikon/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 id="h2_budget-of-900-or-less"&gt;Budget of $900 or Less&lt;/h2&gt;
&lt;div class="divGrid"&gt;
&lt;table class="tableGrid" border="0" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;2007 Cost&lt;/th&gt;
&lt;th&gt;Filter&lt;/th&gt;
&lt;th&gt;Film&lt;/th&gt;
&lt;th&gt;Manual&lt;/th&gt;
&lt;th&gt;IQ&lt;/th&gt;
&lt;th&gt;BR&lt;/th&gt;
&lt;th&gt;Reviews&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nikon 18mm - 200mm f/3.5-5.6G ED IF AF-S DX VR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$769.95&lt;/td&gt;
&lt;td&gt;72mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;8.24&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/18200.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/250/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.bythom.com/18200lens.htm"&gt;Thom Hogan&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_zoom_02.html#AFS18-200VR"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=2159"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_18200_3556vr/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 80-200mm f/2.8D ED AF&lt;/td&gt;
&lt;td&gt;$899.95&lt;/td&gt;
&lt;td&gt;77mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;9.42&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/80200.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.kenrockwell.com/nikon/80200afs.htm"&gt;Ken Rockwell (afs)&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/124/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://nikonimaging.com/global/products/lens/af/zoom/zoom80-200mmf_28d/index.htm"&gt;Nikon Imaging&lt;/a&gt; &lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_zoom_03.html#AFS80-200f2.8"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=1986"&gt;Nikon USA&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 id="h2_budget-of-1000-or-more"&gt;Budget of $1000 or More&lt;/h2&gt;
&lt;div class="divGrid"&gt;
&lt;table class="tableGrid" style="height: 617px;" border="0" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr style="height: 18px;"&gt;
&lt;th style="height: 18px; width: 294.047px;"&gt;Description&lt;/th&gt;
&lt;th style="height: 18px; width: 67.4062px;"&gt;2007 Cost&lt;/th&gt;
&lt;th style="height: 18px; width: 45.0469px;"&gt;Filter&lt;/th&gt;
&lt;th style="height: 18px; width: 33.5px;"&gt;Film&lt;/th&gt;
&lt;th style="height: 18px; width: 56.7188px;"&gt;Manual&lt;/th&gt;
&lt;th style="height: 18px; width: 31.7969px;"&gt;IQ&lt;/th&gt;
&lt;th style="height: 18px; width: 36.25px;"&gt;BR&lt;/th&gt;
&lt;th style="height: 18px; width: 135.234px;"&gt;Reviews&lt;/th&gt;
&lt;/tr&gt;
&lt;tr style="height: 109px;"&gt;
&lt;td style="height: 109px; width: 294.047px;"&gt;Nikon 17mm-55mm f/2.8G ED-IF AF-S DX Nikkor&lt;/td&gt;
&lt;td style="height: 109px; width: 67.4062px;"&gt;$1199.95&lt;/td&gt;
&lt;td style="height: 109px; width: 45.0469px;"&gt;77mm&lt;/td&gt;
&lt;td style="height: 109px; width: 33.5px;"&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td style="height: 109px; width: 56.7188px;"&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td style="height: 109px; width: 31.7969px;"&gt;9.18&lt;/td&gt;
&lt;td style="height: 109px; width: 36.25px;"&gt;4.5-5&lt;/td&gt;
&lt;td style="height: 109px; width: 135.234px;"&gt;&lt;a href="http://www.kenrockwell.com/nikon/1755.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/129/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_zoom_01.html#AFS17-55G"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=2147"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_1755_28/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="height: 127px;"&gt;
&lt;td style="height: 127px; width: 294.047px;"&gt;Nikon 17mm-35mm f/2.8G ED-IF AF-S Nikkor&lt;/td&gt;
&lt;td style="height: 127px; width: 67.4062px;"&gt;$1499.95&lt;/td&gt;
&lt;td style="height: 127px; width: 45.0469px;"&gt;77mm&lt;/td&gt;
&lt;td style="height: 127px; width: 33.5px;"&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td style="height: 127px; width: 56.7188px;"&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td style="height: 127px; width: 31.7969px;"&gt;9.11&lt;/td&gt;
&lt;td style="height: 127px; width: 36.25px;"&gt;5&lt;/td&gt;
&lt;td style="height: 127px; width: 135.234px;"&gt;&lt;a href="http://www.kenrockwell.com/nikon/1735.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/112/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_zoom_01.html#AFS17-35ED"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/17_35_review.html#top"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Review&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=1960"&gt;Nikon USA&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="height: 145px;"&gt;
&lt;td style="height: 145px; width: 294.047px;"&gt;Nikon 80mm - 400mm f/4.5-5.6D ED AF VR&lt;/td&gt;
&lt;td style="height: 145px; width: 67.4062px;"&gt;$1429.95&lt;/td&gt;
&lt;td style="height: 145px; width: 45.0469px;"&gt;77mm&lt;/td&gt;
&lt;td style="height: 145px; width: 33.5px;"&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td style="height: 145px; width: 56.7188px;"&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td style="height: 145px; width: 31.7969px;"&gt;8.77&lt;/td&gt;
&lt;td style="height: 145px; width: 36.25px;"&gt;4&lt;/td&gt;
&lt;td style="height: 145px; width: 135.234px;"&gt;&lt;a href="http://www.kenrockwell.com/nikon/80400vr.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/125/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_zoom_03.html#AF80-400VR"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating &lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/VR80_400_review.html"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Review&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=1996"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_80400_4556/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="height: 109px;"&gt;
&lt;td style="height: 109px; width: 294.047px;"&gt;Nikon 28mm - 70mm f/2.8 ED-IF AF-S&lt;/td&gt;
&lt;td style="height: 109px; width: 67.4062px;"&gt;$1434.95&lt;/td&gt;
&lt;td style="height: 109px; width: 45.0469px;"&gt;77mm&lt;/td&gt;
&lt;td style="height: 109px; width: 33.5px;"&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td style="height: 109px; width: 56.7188px;"&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td style="height: 109px; width: 31.7969px;"&gt;9.6&lt;/td&gt;
&lt;td style="height: 109px; width: 36.25px;"&gt;5&lt;/td&gt;
&lt;td style="height: 109px; width: 135.234px;"&gt;&lt;a href="http://www.kenrockwell.com/nikon/2870afs.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/116/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_zoom_02.html#AFS28-70ED"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating &lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=1961"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_2870_28/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="height: 109px;"&gt;
&lt;td style="height: 109px; width: 294.047px;"&gt;&lt;strong&gt;Nikon 70-200mm f/2.8G AF-S VR&lt;/strong&gt;&lt;/td&gt;
&lt;td style="height: 109px; width: 67.4062px;"&gt;$1624.95&lt;/td&gt;
&lt;td style="height: 109px; width: 45.0469px;"&gt;77mm&lt;/td&gt;
&lt;td style="height: 109px; width: 33.5px;"&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td style="height: 109px; width: 56.7188px;"&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td style="height: 109px; width: 31.7969px;"&gt;9.83&lt;/td&gt;
&lt;td style="height: 109px; width: 36.25px;"&gt;5&lt;/td&gt;
&lt;td style="height: 109px; width: 135.234px;"&gt;&lt;a href="http://www.kenrockwell.com/nikon/70200vr.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/134/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_zoom_03.html#AFS70-200VR"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating &lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=2139"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_70200_28vr/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 id="h2_other-popular-lenses"&gt;Other Popular Lenses&lt;/h2&gt;
&lt;p&gt;These lenses are good values, but in my opinion, not the best. I've listed them because they get recommended frequently. In the cases of the f/1.4 lenses, the similar f/1.8 lenses are better values in my opinion.&lt;/p&gt;
&lt;p&gt;The Nikon 105mm f/2.8G ED-IF AF-S VR while recommended by some, it's not recommended by others and the older non VR version appears to be a better value. Unfortunately, it's no longer available new.&lt;/p&gt;
&lt;div class="divGrid"&gt;
&lt;table class="tableGrid" border="0" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;2007 Cost&lt;/th&gt;
&lt;th&gt;Filter&lt;/th&gt;
&lt;th&gt;Film&lt;/th&gt;
&lt;th&gt;Manual&lt;/th&gt;
&lt;th&gt;IQ&lt;/th&gt;
&lt;th&gt;BR&lt;/th&gt;
&lt;th&gt;Reviews&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 70mm-300mm f.4-5.6G&lt;/td&gt;
&lt;td&gt;$134.95&lt;/td&gt;
&lt;td&gt;62mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;7.43&lt;/td&gt;
&lt;td&gt;3-3.5&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/70300g.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/123/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_zoom_03.html#AF70-300f4.5G"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=1928"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_70300_456/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 50mm f1.4D AF&lt;/td&gt;
&lt;td&gt;$284.95&lt;/td&gt;
&lt;td&gt;52mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;8.79&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/5014af.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/96/cat/12"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=1902"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_50_14/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 18mm - 70mm f/3.5-4.5G ED-IF AF-S DX Nikkor&lt;/td&gt;
&lt;td&gt;$349.95&lt;/td&gt;
&lt;td&gt;67mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;8.28&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/1870.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/131/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=2149"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_1870_3545/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 60mm f/2.8D AF Micro-Nikkor&lt;/td&gt;
&lt;td&gt;$349.95&lt;/td&gt;
&lt;td&gt;62mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;9.50&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/98/cat/12"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=1987"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_60_28/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tamron 28-75mm f/2.8 XR Di LD-IF AF&lt;/td&gt;
&lt;td&gt;$369.95&lt;/td&gt;
&lt;td&gt;67mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;8.85&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/49/cat/23"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/tamron_2875_28_nikon/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sigma 10mm-20mm f/4-5.6 EX DC AF&lt;/td&gt;
&lt;td&gt;$499.00&lt;/td&gt;
&lt;td&gt;77mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;8.48&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/tech/digital-wide-zooms/comparison.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/171/cat/31"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/sigma_1020_456_nikon/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tokina 12mm-24mm f/4.0 PRO DX AF&lt;/td&gt;
&lt;td&gt;$499.00&lt;/td&gt;
&lt;td&gt;77mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;8.08&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/tech/digital-wide-zooms/comparison.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/178/cat/33"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/tokina_1224_4_nikon/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 24 - 120mm f/3.5-5.6G ED-IF AF-S VR&lt;/td&gt;
&lt;td&gt;$514.95&lt;/td&gt;
&lt;td&gt;72mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;8.00&lt;/td&gt;
&lt;td&gt;3.5&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/24120vr.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/132/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_zoom_01.html#AF24-120"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=2145"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_24120_3556/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 105mm f/2.8G ED-IF AF-S VR&lt;/td&gt;
&lt;td&gt;$759.95&lt;/td&gt;
&lt;td&gt;62mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;9.50&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/105vr.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/351/cat/12"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=2160"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_105_28vr/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 12mm-24mm f/4.0G ED-IF AF&lt;/td&gt;
&lt;td&gt;$899.95&lt;/td&gt;
&lt;td&gt;77mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/failed-sm.gif" alt="no" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;8.07&lt;/td&gt;
&lt;td&gt;3.5-5&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/1224.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/128/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_zoom_01.html#AFS12-24DX"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=2144"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_1224_4/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 85mm f/1.4D IF AF&lt;/td&gt;
&lt;td&gt;$1024.95&lt;/td&gt;
&lt;td&gt;77mm&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=common/images/success-sm.gif" alt="yes" width="14" height="14"&gt;&lt;/td&gt;
&lt;td&gt;10.00&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/8514AF.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/99/cat/12"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.naturfotograf.com/lens_short.html"&gt;Bj&amp;oslash;rn R&amp;oslash;rslett Rating&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonusa.com/template.php?cat=1&amp;amp;grp=5&amp;amp;productNr=1933"&gt;Nikon USA&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.photozone.de/8Reviews/lenses/nikkor_85_14/index.htm"&gt;PhotoZone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 id="h2_notes"&gt;Notes&lt;/h2&gt;
&lt;p&gt;All lenses have some trade offs. When I see a pattern of multiple reviews reporting similar symptoms for a particular lens, I've noted it below. In many instances, some users report a lens as being not sharp, but other users report it is sharp. I would trust the measured lens results at SLR Gear and the MTF published results more than the users when it comes to sharpness.&lt;/p&gt;
&lt;p&gt;Read the lens reviews and ratings carefully. Not all lenses that are f/2.8 provide the best image quality&amp;nbsp; at f/2.8.&lt;/p&gt;
&lt;p&gt;The Nikon 18-135mm lens has had reports of motor noise and repairs needed under warranty. I own this lens and I have personally experienced the noise problem with this lens when the lens was turned at a 90 degree angle, but it went away when turned back to the horizontal. I have not sent this lens in under any warranty repair. I am extremely happy with this lens and it's range and results.&lt;/p&gt;
&lt;p&gt;The Nikon 105 mm VR is not recommended by Ken Rockewell due to focusing problems.&lt;/p&gt;
&lt;p&gt;Many users of the Nikon 18-200mm have reported having the lens barrel slips when pointed down.&lt;/p&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ul class="References"&gt;
&lt;li&gt;&lt;a id="#1"&gt;&lt;/a&gt;[1] &lt;a href="http://www.slrgear.com/reviews/showcat.php?cat=13&amp;amp;stype=1&amp;amp;si=&amp;amp;perpage=48&amp;amp;sort=4&amp;amp;stype=&amp;amp;limit=&amp;amp;cat=13&amp;amp;ppuser="&gt;SLR Gear Nikon Zooms&lt;/a&gt; SLRgear.com&lt;/li&gt;
&lt;li&gt;&lt;a id="#2"&gt;&lt;/a&gt;[2] &lt;a href="http://www.slrgear.com/reviews/showcat.php?cat=12&amp;amp;stype=1&amp;amp;si=&amp;amp;perpage=48&amp;amp;sort=4&amp;amp;stype=&amp;amp;limit=&amp;amp;cat=12&amp;amp;ppuser="&gt;SLR Gear Nikon Primes&lt;/a&gt; SLRGear.com&lt;/li&gt;
&lt;li&gt;&lt;a id="#3"&gt;&lt;/a&gt;[3] &lt;a href="http://www.flickr.com/groups/nikondigital/discuss/61619/page2/"&gt;What is your favorite lens?&lt;/a&gt; Flickr.com&lt;/li&gt;
&lt;li&gt;&lt;a id="#4"&gt;&lt;/a&gt;[4] &lt;a href="http://www.flickr.com/groups/nikondigital/discuss/72157594452791503/"&gt;What lens do you use most in photography?&lt;/a&gt; Flickr.com&lt;/li&gt;
&lt;li&gt;&lt;a id="#5"&gt;&lt;/a&gt;[5] &lt;a href="http://www.naturfotograf.com/bestof.html"&gt;Best of the Best&lt;/a&gt; Bj&amp;oslash;rn R&amp;oslash;rslett&lt;/li&gt;
&lt;li&gt;&lt;a id="A2"&gt;&lt;/a&gt;[6] &lt;a href="http://home.zonnet.nl/famwakker/nikonlinkslensesreviewnikonlenses01.htm"&gt;Nikon Lens Links&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_updates"&gt;Updates&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Nov 1, 2007 - Added Sigma 10-20, Tokina 12-24 and Nikon 12-24.&lt;/li&gt;
&lt;/ol&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>nikon</category>
  <category>photography</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/nikon-lens-best-values/</guid>
  <pubDate>Fri, 12 Oct 2007 20:00:00 GMT</pubDate>
</item>
<item>
  <title>Nikon D80</title>
  <link>https://tim-stanley.com/post/nikon-d80/</link>
  <description>&lt;p&gt;In early 2007, I decided to get a digital SLR. This is a summary of the research and reasoning that led me to purchase the Nikon D80 and the Nikon 18-135mm lens and various accessories as well as my feedback and review of the products. [more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_why-nikon"&gt;Why Nikon?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_nikon-d40x-d80-d200-comparison"&gt;Nikon D40x, D80, D200 Comparison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_equipment-bought"&gt;Equipment Bought&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_equipment-to-buy"&gt;Equipment To Buy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_other-popular-equipment"&gt;Other Popular Equipment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_updates"&gt;Updates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_why-nikon"&gt;Why Nikon?&lt;/h2&gt;
&lt;p&gt;I was looking for a medium level SLR. I narrowed my selection to the two top SLR Manufacturers, Canon and Nikon. Out of the offerings from those manufactures, I considered the following SLR's.&lt;/p&gt;
&lt;div class="divGrid"&gt;
&lt;table class="tableGrid" border="0" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Camera&lt;/th&gt;
&lt;th&gt;Resolution&lt;/th&gt;
&lt;th&gt;Sep 2007 Prices&lt;/th&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;Nikon D40 Digital SLR&lt;/td&gt;
&lt;td&gt;6.1 mp&lt;/td&gt;
&lt;td&gt;$499.95 w/ 18-55mm lens &lt;a href="http://www.bhphotovideo.com/c/product/471716-REG/Nikon_25420_D40_SLR_Digital_Camera.html"&gt;now $479.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;Canon EOS Digital Rebel XT&lt;/td&gt;
&lt;td&gt;8.0 mp&lt;/td&gt;
&lt;td&gt;$449.95 &lt;a href="http://www.bhphotovideo.com/c/product/371189-REG/Canon_0209B001_EOS_Digital_Rebel_XT.html"&gt;now $409.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;Canon Digital Rebel XTi SLR&lt;/td&gt;
&lt;td&gt;10.1 mp&lt;/td&gt;
&lt;td&gt;$595.95 &lt;a href="http://www.adorama.com/?sku=ICADRXTI"&gt;now $517.00&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;&lt;strong&gt;Nikon D40x Digital SLR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10.2 mp&lt;/td&gt;
&lt;td&gt;$635.99 &lt;a href="http://www.adorama.com/?sku=INKD40X"&gt;refurbished at $449.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;&lt;strong&gt;Nikon D80 Digital SLR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10.2 mp&lt;/td&gt;
&lt;td&gt;$874.95 &lt;a href="http://www.adorama.com/?sku=INKD80"&gt;now $729.95 &lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;Canon EOS 30D Digital SLR&lt;/td&gt;
&lt;td&gt;8.2 mp&lt;/td&gt;
&lt;td&gt;$999.95 &lt;a href="http://www.bhphotovideo.com/c/product/423708-REG/Canon_1234B004_EOS_30D_Digital_Camera.html"&gt;now $799.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;Canon EOS 40D Digital SLR&lt;/td&gt;
&lt;td&gt;10.1 mp&lt;/td&gt;
&lt;td&gt;$1299.95 pre-order &lt;a href="http://www.bhphotovideo.com/c/product/518207-REG/Canon_1901B004_EOS_40D_SLR_Digital.html"&gt;now $939.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;&lt;strong&gt;Nikon D200 Digital SLR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10.2 mp&lt;/td&gt;
&lt;td&gt;$1499.95 &lt;a href="http://www.bhphotovideo.com/c/product/407284-REG/Nikon_25235_D200_Digital_Camera_Camera.html"&gt;now $1259.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;Nikon D300 Digital SLR&lt;/td&gt;
&lt;td&gt;12.3 mp&lt;/td&gt;
&lt;td&gt;$1799.95 &lt;a href="http://www.bhphotovideo.com/c/product/518489-REG/Nikon_25432_D300_Digital_Camera_Camera.html"&gt;now $1799.95&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;The jump from 6 mega pixels to 10 mega pixels was $135.&amp;nbsp; The jump from 8 mega pixels to 10 mega pixels was $145. The difference was justified to me at this point so I knew I wanted a minimum 10 mega pixel camera. For my considerations this eliminated the D40 and the Rebel XT.&lt;/p&gt;
&lt;p&gt;After handling the Canon Digital Rebel XTi, it just didn't feel right to me. I already owned the Canon Rebel Ti, and I got it because it was lighter than the Nikon N55, but it's always felt awkward in my hands but my wife loved it because of it's lighter weight and smaller size. The popular reviews made it a tough choice to eliminate, but I removed the Canon XTi from my list of choices because it just didn't feel right in my hands.&lt;/p&gt;
&lt;p&gt;This left the selection of currently available equipment to the Nikon D40x, D80, D200 and the non EOS 30D. I had both some Canon 35mm film equipment and access to quite a bit older Nikon 35mm film equipment (circa 1972). I decided to eliminate the Canon 30D and narrow the selection to the three Nikons.&lt;/p&gt;
&lt;h2 id="h2_nikon-d40x-d80-d200-comparison"&gt;Nikon D40x, D80, D200 Comparison&lt;/h2&gt;
&lt;p&gt;Most of the features are very similar between the Nikon D40x, D80, and D200. The price difference of $600 to $1500 is a pretty big spread.&amp;nbsp; What made the features so much better on the D80 and D200 to justify the cost?&amp;nbsp; I had to gleam most of this information from the Nikon specifications, but the article &lt;a href="http://www.kenrockwell.com/nikon/d80/vs-d200.htm"&gt;Nikon D80 vs D200 &lt;/a&gt;was also helpful.&amp;nbsp; I included an importance factor to evaluate these.&amp;nbsp; There are some features that I have weighted more heavily after use than when I initially evaluated them.&amp;nbsp; These turned out to be more important than I thought.&lt;/p&gt;
&lt;div class="divGrid"&gt;
&lt;table class="tableGrid" border="0" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Importance&lt;/th&gt;
&lt;th&gt;D40x&lt;/th&gt;
&lt;th&gt;D80&lt;/th&gt;
&lt;th&gt;D200&lt;/th&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;&lt;strong&gt;Viewfinder&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1&lt;/td&gt;
&lt;td&gt;.8x&lt;/td&gt;
&lt;td&gt;.95x&lt;/td&gt;
&lt;td&gt;.94x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;&lt;strong&gt;Aperture Dial&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1&lt;/td&gt;
&lt;td&gt;&lt;span style="color: #ff0000;"&gt;No*&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;&lt;strong&gt;Shutter Dial&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;&lt;strong&gt;ISO Button&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1&lt;/td&gt;
&lt;td&gt;No*&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;&lt;strong&gt;White Balance Button&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1&lt;/td&gt;
&lt;td&gt;No*&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;&lt;strong&gt;Weight&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;1&lt;/td&gt;
&lt;td&gt;495g&lt;br&gt;1lb 1oz&lt;/td&gt;
&lt;td&gt;585g&lt;br&gt;1lb 5oz&lt;/td&gt;
&lt;td&gt;830g&lt;br&gt;1lb 13oz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;&lt;strong&gt;Wired remote&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;2&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;MC-DC1&lt;/td&gt;
&lt;td&gt;MC-30 or MC-36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;&lt;strong&gt;Frame Rate&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;3&lt;/td&gt;
&lt;td&gt;2.5 / sec&lt;/td&gt;
&lt;td&gt;3 / sec&lt;/td&gt;
&lt;td&gt;5 / sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;&lt;strong&gt;Weather sealed&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;3&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;&lt;strong&gt;ISO in finder&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;3&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No*&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItet"&gt;
&lt;td&gt;&lt;strong&gt;Pre-AI Lens&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;3&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;&lt;strong&gt;AI Metering&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;3&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;AF Lens (Body driven)&lt;/td&gt;
&lt;td style="text-align: center;"&gt;4&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;Auto Focus Points&lt;/td&gt;
&lt;td style="text-align: center;"&gt;4&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;Metering Sensor&lt;/td&gt;
&lt;td style="text-align: center;"&gt;4&lt;/td&gt;
&lt;td&gt;420 segment&lt;/td&gt;
&lt;td&gt;420 segment&lt;/td&gt;
&lt;td&gt;1,005 segment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;Lens mount&lt;/td&gt;
&lt;td style="text-align: center;"&gt;4&lt;/td&gt;
&lt;td&gt;plastic&lt;/td&gt;
&lt;td&gt;metal&lt;/td&gt;
&lt;td&gt;metal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;Bracketing&lt;/td&gt;
&lt;td style="text-align: center;"&gt;5&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;2-3 steps&lt;/td&gt;
&lt;td&gt;2-9 steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;Width&lt;/td&gt;
&lt;td style="text-align: center;"&gt;5&lt;/td&gt;
&lt;td&gt;5.0"&lt;/td&gt;
&lt;td&gt;5.2"&lt;/td&gt;
&lt;td&gt;5.8"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;Height&lt;/td&gt;
&lt;td style="text-align: center;"&gt;5&lt;/td&gt;
&lt;td&gt;3.7"&lt;/td&gt;
&lt;td&gt;4.1"&lt;/td&gt;
&lt;td&gt;4.4"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;Depth&lt;/td&gt;
&lt;td style="text-align: center;"&gt;5&lt;/td&gt;
&lt;td&gt;3"&lt;/td&gt;
&lt;td&gt;3.0"&lt;/td&gt;
&lt;td&gt;2.9"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;Wireless remote&lt;/td&gt;
&lt;td style="text-align: center;"&gt;5&lt;/td&gt;
&lt;td&gt;ML-L3&lt;/td&gt;
&lt;td&gt;ML-L3&lt;/td&gt;
&lt;td&gt;ML-3 or WT-3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;Qual Button&lt;/td&gt;
&lt;td style="text-align: center;"&gt;5&lt;/td&gt;
&lt;td&gt;No*&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;Memory Card Type&lt;/td&gt;
&lt;td style="text-align: center;"&gt;5&lt;/td&gt;
&lt;td&gt;SD&lt;/td&gt;
&lt;td&gt;SD&lt;/td&gt;
&lt;td&gt;CF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;Battery&lt;/td&gt;
&lt;td style="text-align: center;"&gt;5&lt;/td&gt;
&lt;td&gt;EN-EL9&lt;/td&gt;
&lt;td&gt;EN-EL3e&lt;/td&gt;
&lt;td&gt;EN-EL3e&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;Timelapse&lt;/td&gt;
&lt;td style="text-align: center;"&gt;5&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;ISO&lt;/td&gt;
&lt;td style="text-align: center;"&gt;5&lt;/td&gt;
&lt;td&gt;100 - 3200&lt;/td&gt;
&lt;td&gt;100 - 3200&lt;/td&gt;
&lt;td&gt;100 - 3200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItem"&gt;
&lt;td&gt;Intervalometer&lt;/td&gt;
&lt;td style="text-align: center;"&gt;5&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="gridItemAlt"&gt;
&lt;td&gt;Shutter Exp Delay&lt;/td&gt;
&lt;td style="text-align: center;"&gt;5&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Yes 400ms&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;The D40 has a minimum ISO of 200 and shoots 2.5 frames / sec.&amp;nbsp; All other specifications on the D40 are similar to the D40x.&lt;/p&gt;
&lt;p&gt;The viewfinder was noticeably different between the D40x and D80 and I'm much more in favor of the D80/D200 size and view.&lt;/p&gt;
&lt;p&gt;The lack of two dials to control both the aperture and the shutter speed were very important for me.&amp;nbsp; With the Canon Rebel Ti, which has one dial, this made manual mode &lt;strong&gt;very annoying&lt;/strong&gt;.&amp;nbsp; I was used to using a Nikon F with full manual mode and this turned out to be the single most important factor for me in evaluating the three camera bodies.&amp;nbsp; I found that having to use the menus to set the Aperture / Shutter speed / ISO was very distracting for me.&amp;nbsp; I much preferred the ability to controls these directly on the D80 and D200.&lt;/p&gt;
&lt;p&gt;The weight doesn't look that different on paper but in actual use my perception was very different.&amp;nbsp; For my personal preference, the D40x is light, the D80 moderate, but the D200 is moderately heavy.&amp;nbsp; There have been some &lt;a href="http://www.flickr.com/groups/d200/discuss/72057594074453325/"&gt;discussions&lt;/a&gt; on this fact so don't disregard it lightly.&amp;nbsp; The feedback is it's either sturdy or heavy depending on your point of view.&amp;nbsp; The only way to tell is to hold it with a lens attached.&lt;/p&gt;
&lt;p&gt;Having the ability to set the ISO and White Balance with a button and dial instead of using the menus as on the D40/D40x is a convenience.&amp;nbsp; I found I did not like ISO Auto and instead preferred more manual control.&amp;nbsp; Therefore the ability to set the ISO became something that was more important to me over time.&lt;/p&gt;
&lt;p&gt;The D40/D40x does not show having a wired remote ability.&amp;nbsp; If you want to take exposures longer than the 30 seconds on Bulb, you'll be limited to holding the button on the camera down and if you're like me, you'll shake the camera.&lt;/p&gt;
&lt;p&gt;For the frame rate, 2.5 or 3 frames per second sounds like a lot on paper.&amp;nbsp; After shooting a few soccer games, my feeling is it's slow.&amp;nbsp; Not so slow as to be aggravating, but it's come up about once per game that I'd like faster frames / second.&amp;nbsp; Not enough that I'd be willing to pay the price increase for a D200 or D300.&lt;/p&gt;
&lt;p&gt;The D80 does have the ability to show the ISO in the view finder, but the FUNC button has to be configured to show this.&amp;nbsp; Again, this isn't something I thought was important, but in using Auto ISO, or changing the ISO manually it does become more important.&lt;/p&gt;
&lt;p&gt;Supporting a Pre-AI lens was important to me since I had access to my Father's circa 1974 set of Nikon lenses.&amp;nbsp; It turns out these are pre-AI lenses and although they were Nikon F mount, the aperture ring conflicts with a minimum aperture sensor on both the D80 and D200 bodies.&amp;nbsp; The Pre-AI lenses could be &lt;a href="http://www.aiconversions.com/"&gt;modified&lt;/a&gt; to fit the AI required mount for the D80 and D200.&lt;/p&gt;
&lt;p&gt;Reading all the reviews on the D40x, D80, and D200 led me to believe there was not any significant difference in image performance between these bodies.&lt;/p&gt;
&lt;p&gt;I could spend $250 more than the D40x and get the D80 which gave me the important two command dials and external buttons, and the wired remote feature.&amp;nbsp; Below is a picture of the front and back dials on the D80 that show the features (1 dial, 4 buttons) that are present on the D80 that are not on the D40x.&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/NikonD80_D878/D80Front_3.jpg" alt="D80Front" width="480" height="480" border="0"&gt;&lt;/p&gt;
&lt;p&gt;Nikon D80 Front&lt;/p&gt;
&lt;p&gt;The front of the D80 has one button and one dial that are not present on the D40x. The D80 button can be configured to be used for several different features. I have mine configured to display the ISO setting in the viewfinder.&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/NikonD80_D878/D80Back_3.jpg" alt="D80Back" width="480" height="480" border="0"&gt;&lt;/p&gt;
&lt;p&gt;Nikon D80 Back&lt;/p&gt;
&lt;p&gt;The back of the D80 has three buttons that are not present on the D40x. These are for White balance, ISO, and Quality settings. When presed in combination with the command dial in the upper right, these allow direct setting of these values without having to use the full screen LCD menu.&lt;/p&gt;
&lt;p&gt;I could spend $850 more than the D40x or $600 than the D80 and get the D200 which gave me better metering, a faster frame rate, and the ability to meter on AI manual lenses.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In the end, I purchased the Nikon D80 as the most appropriate feature for cost value for my situation and I've never regretted it.&lt;/p&gt;
&lt;h2 id="h2_equipment-bought"&gt;Equipment Bought&lt;/h2&gt;
&lt;p&gt;This is equipment I've actually bought and used. It's not just a wish list. I am happy with all of this equipment.&lt;/p&gt;
&lt;div class="divGrid"&gt;
&lt;table class="tableGrid" border="0" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;2007 Cost&lt;/th&gt;
&lt;th&gt;Reviews&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon D80 Digital SLR&lt;/td&gt;
&lt;td&gt;$874.95&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/d80.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.dpreview.com/reviews/nikond80/"&gt;DP Review&lt;/a&gt; &lt;br&gt;&lt;a href="http://www.bythom.com/d80review.htm"&gt;Thom Hogan&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.nikonians.org/nikon/d80/"&gt;Nikonians&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 18mm - 135mm f/3.5-5.6G ED-IF AF-S DX&lt;/td&gt;
&lt;td&gt;$299.95&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/18-135.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/993/cat/13"&gt;SLRgear.com&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.bythom.com/18135lens.htm"&gt;Thom Hogan&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon MC-DC1 Remote Release Cord for D80&lt;/td&gt;
&lt;td&gt;$24.95&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon ML-L3 IR Remote Control Transmitter for D-80&lt;/td&gt;
&lt;td&gt;$16.95&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lowepro Topload Zoom Mini, Holster Style Camera Case, Red.&lt;/td&gt;
&lt;td&gt;$19.95&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon BM-7 LCD Monitor Cover D80&lt;/td&gt;
&lt;td&gt;$9.95&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SanDisk 2 GB, Ultra II Secure Digital (SD) Memory Card&lt;/td&gt;
&lt;td&gt;$34.95&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Giottos Rocket Air Blaster&lt;/td&gt;
&lt;td&gt;$9.95&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Op/Tech 18" Rainsleeve&lt;/td&gt;
&lt;td&gt;$5.99&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;I had a 28-90mm zoom and a 43-86mm Nikkor zoom. I knew I wanted a zoom lens and not a fixed focus length lens.&lt;/p&gt;
&lt;p&gt;What I really wanted was the 18-200mm Nikon zoom. For most of 2007 this lens has been on back order and I couldn't see waiting three months to get a lens that has problems with the zoom barrel slipping. I had this problem on the 43-86mm and while for some it may be just a nuisance, I can't see spending that kind of money with something that has that kind of a problem.&lt;/p&gt;
&lt;p&gt;I went with the Nikon 18-135mm zoom lens. The Nikon 18-135 is a great lens for me. There are reports that this lens has some quality problems and I have found on two occasions when shooting with the camera rotated 90 degrees, that the motor made an unusual grating sound. I repositioned the camera back to horizontal and the problem went away. Others have reported this problem as well.&amp;nbsp; I don't know if this is going to be a problem in the future or not.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Other than this one problem, I love this lens. In discussion, a lot of professional photographers mock this lens since it's not "professional" quality. The lens takes better pictures than I have skill for at this point in time so I really have no complaints.&amp;nbsp; I've read the MTF and spec charts on the lens compared to "professional" lenses and I've come to the conclusion that it's just as good a lens, but has only one drawback when compared to those lenses, it has a plastic mount.&amp;nbsp; It has a manual focus ring which can be overridden without flipping a switch.&amp;nbsp; I do find myself with a lot of shots taken at 135mm so that's got me wanting a little more focal length.&amp;nbsp; 135mm is fine for about 50 yards or less on the soccer field, but beyond that shots require cropping.&lt;/p&gt;
&lt;p&gt;The MC-DC1 is a must buy.&amp;nbsp; I've used it several times for lunar eclipses and some slower landscape shots with the shutter delay on.&amp;nbsp; I I should have bought this when I bought the camera.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The BM-7 LCD cover is my second one.&amp;nbsp; I have no idea where I lost the original, but I'm glad their not expensive.&lt;/p&gt;
&lt;p&gt;The Lowepro Topload Zoom Mini case holds the Nikon and the 18-135 but just barely so.&amp;nbsp; I had this case previously with a Canon so I just continued to use it with the Nikon.&amp;nbsp; If I get another, it's going to be something with a little more room at the end of the zoom. &lt;a id="toc_3" href="#"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_equipment-to-buy"&gt;Equipment To Buy&lt;/h2&gt;
&lt;div class="divGrid"&gt;
&lt;table class="tableGrid" border="0" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;2007 Cost&lt;/th&gt;
&lt;th&gt;Reviews&lt;/th&gt;
&lt;th&gt;My Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 50mm f/1.8D AF Standard Auto Focus Nikkor Lens&lt;/td&gt;
&lt;td&gt;$109.95&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/5018af.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/97/cat/12"&gt;SLR Gear&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;52mm filter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 70-300mm f/4.5 - 5.6G ED-IF AF-S VR&lt;/td&gt;
&lt;td&gt;$479.00&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/70-300-vr.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/1088/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://nikonimaging.com/global/products/lens/af/zoom/af-s_vr_zoom70-300mmf_45-56g_if/index.htm"&gt;Nikon Imaging&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;62mm filter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lowepro Rezo TLZ-20 Holster-style Bag&lt;/td&gt;
&lt;td&gt;$34.95&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;The selection of these two lenses is based off feedback from discussions and users in other groups.&amp;nbsp; Everyone seems very happy with the 70-300mm VR and the only complaint is that it's not 2.8.&amp;nbsp; For $400 compared to the 80-200mm f2.8 or $1200 compared to the 70-200mm f2.8 VR, I'll stick with this one.&amp;nbsp; In addition, it's a perfect match to the 62mm filter size to correspond with the 18-135mm lens.&lt;/p&gt;
&lt;p&gt;The 50mm f1.8 has gotten rave reviews and I want to try the fixed lens and it's not a big cost.&amp;nbsp; I had the 50mm f1.4 Nikkor-S and the faster lens does make a significant difference in some circumstances.&lt;/p&gt;
&lt;h2 id="h2_other-popular-equipment"&gt;Other Popular Equipment&lt;/h2&gt;
&lt;div class="divGrid"&gt;
&lt;table class="tableGrid" border="0" cellspacing="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;2007 Cost&lt;/th&gt;
&lt;th&gt;Reviews&lt;/th&gt;
&lt;th&gt;My Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 55mm - 200mm f/4-5.6G ED-IF AF-S DX VR&lt;/td&gt;
&lt;td&gt;$229.95&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/55-200mm-vr.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/1088/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;MF Ring hard to use, outside.&lt;br&gt;DX Only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 18mm - 200mm f/3.5-5.6G ED IF AF-S DX VR&lt;/td&gt;
&lt;td&gt;$769.95&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/18200.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/250/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.bythom.com/18200lens.htm"&gt;Thom Hogan&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Zoom slips&lt;br&gt;Very very popular.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 80-200mm f/2.8D ED AF&lt;/td&gt;
&lt;td&gt;$884.95&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/80200.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.kenrockwell.com/nikon/80200afs.htm"&gt;Ken Rockwell (afs)&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/124/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;br&gt;&lt;a href="http://nikonimaging.com/global/products/lens/af/zoom/zoom80-200mmf_28d/index.htm"&gt;Nikon Imaging&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Heavy&lt;br&gt;Very popular.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 70-200mm f/2.8G AF-S VR&lt;/td&gt;
&lt;td&gt;$1624.95&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/70200vr.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/134/cat/13"&gt;SLR Gear&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Expensive.&lt;br&gt;Very popular.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 105mm f/2.8G ED-IF AF-S VR Micro-Nikkor&lt;/td&gt;
&lt;td&gt;$759.95&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/351/cat/12"&gt;SLR Gear&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 85mm f/1.8D AF&lt;/td&gt;
&lt;td&gt;$399.95&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/85AF.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/100/cat/12"&gt;SLR Gear&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;62 mm filter&lt;br&gt;F stop range 1.8-16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 85mm f/1.4D IF AF&lt;/td&gt;
&lt;td&gt;$1024.95&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/8514AF.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/99/cat/12"&gt;SLR Gear&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nikon 50mm f1.4D AF&lt;/td&gt;
&lt;td&gt;$284.95&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.kenrockwell.com/nikon/5014af.htm"&gt;Ken Rockwell&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.slrgear.com/reviews/showproduct.php/product/96/cat/12"&gt;SLR Gear&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;F stop range 1.4 - 16&lt;br&gt;52mm filter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;After reading about all the plethora of lenses available both older F mounts with AF and the newer lenses, this is the list that I've put together.&amp;nbsp; When folks are asked what equipment they have and they recommend, these lenses keep popping up in the lists.&amp;nbsp; I looked at these, and most of them are a bit more expensive than I'm willing to invest in what is mostly a hobby or would duplicate what I already own.&amp;nbsp; If I made income doing photography, the price of these would be easier to justify.&lt;/p&gt;
&lt;p&gt;The one exception in cost is the Nikon 55-200 mm.&amp;nbsp; This is a very compelling lens in quality and range.&amp;nbsp; It fills the gap beyond the 135mm lens I have without having to spend a lot of money.&amp;nbsp; All the tech specs look good for the cost.&amp;nbsp; When I tried it out, it just didn't seem to feel right for me.&amp;nbsp; I don't have a good way to explain it, I much preferred the 70-300mm VR with the manual focus ring and the feel for the lens and that's why it's on the list to buy instead of this one.&amp;nbsp;&amp;nbsp; There is not really enough difference in 200mm versus 300mm to really worry about, but the 70-300mm VR is just more appealing to me.&lt;/p&gt;
&lt;p&gt;I've listed these here for my benefit.&amp;nbsp; People seem fond of the lenses in this list and I like to refer back to them from time to time.&amp;nbsp; Who know,s maybe I'll hit the lottery and the $1600 for the 70-200 VR will seem worth it to me at some point.&lt;/p&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ul class="References"&gt;
&lt;li&gt;&lt;a href="http://nikonimaging.com/global/products/digitalcamera/slr/d40x/index.htm"&gt;Nikon D40x&lt;/a&gt; Nikon.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nikonimaging.com/global/products/digitalcamera/slr/d80/index.htm"&gt;Nikon D80&lt;/a&gt; Nikon.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nikonimaging.com/global/products/digitalcamera/slr/d200/index.htm"&gt;Nikon D200&lt;/a&gt; Nikon.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kenrockwell.com/nikon/d80/vs-d200.htm"&gt;Nikon D80 vs D200&lt;/a&gt; Ken Rockwell&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kenrockwell.com/nikon/d40/d40-specifications.htm"&gt;D40 Specifications&lt;/a&gt; Ken Rockwell&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kenrockwell.com/nikon/d80.htm#spex"&gt;D80 Specifications&lt;/a&gt; Ken Rockwell&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kenrockwell.com/nikon/d200specifications.htm"&gt;D200 Specifications&lt;/a&gt; Ken Rockwell&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.aiconversions.com/"&gt;AI Conversions&lt;/a&gt; John White&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2_updates"&gt;Updates&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Nov 12, 2007 - Added intervalometer and shutter delay options.&lt;/li&gt;
&lt;li&gt;May 30, 2008 - Updated prices on equipment.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As of May 2008, it's been over a year since I bought the Nikon.&amp;nbsp; I've purchased the 50mm f1.4 and I really love the camera and the lens.&amp;nbsp; There are some circumstances where the 18-135mm lens just doesn't grab enough light (indoor band concerts and indoor basketball courts) but the 50mm f1.4 really helps.&amp;nbsp; The 135mm lens does not have quite enough reach beyond 50 yards on a football or soccer field.&amp;nbsp; 200mm or 300mm is much better. I've tried the non VR 70-300mm lens and I'd definitely recommend the VR.&amp;nbsp; It's kind of difficult for me to get a sharp focus at 300mm even in a bright sunny day on a soccer field without VR.&amp;nbsp; The 18mm lens also gives a good wide angle when needed.&amp;nbsp; I still find a lot of my shots are beyond 100mm.&lt;/p&gt;
&lt;p&gt;There are several folks who have had problems with the 18-135mm lens from what appear to be a loose connection.&amp;nbsp; I've experienced problems on three occasions with a strange noise trying to focus when the camera is turned on it's side.&amp;nbsp; Straightening the camera out made the noise quit.&lt;/p&gt;
&lt;p&gt;I've also found I can use some of the old equipment with a few tricks.&amp;nbsp; A 50mm macro lens can be fit to the D80 with adapter rings, and a Vivitar 283 can be made to fire from the onboard flash.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>nikon</category>
  <category>photography</category>
  <category>nikon-d80</category>
  <category>nikon-d200</category>
  <category>nikon-d40</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/nikon-d80/</guid>
  <pubDate>Wed, 26 Sep 2007 19:35:00 GMT</pubDate>
</item>
<item>
  <title>How Do Google Gadgets Work</title>
  <link>https://tim-stanley.com/post/how-do-google-gadgets-work/</link>
  <description>&lt;p&gt;&lt;a href="http://www.google.com/ig?hl=en"&gt;iGoogle&lt;/a&gt; allows you to customize your Google home page by adding &lt;em&gt;gadgets&lt;/em&gt; which take content from other sites. These can be categorized with tabs and you can even customize your own web pages by adding &lt;em&gt;gadgets&lt;/em&gt; developed by others.&lt;/p&gt;
&lt;p&gt;I was curious how this worked and how to take advantage of it and this is a summary of what I found. [more]&lt;/p&gt;
&lt;p&gt;The following gadget is a photo of the minute gadget using Flickr photos.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Webmasters can get code to place on their web pages from &lt;a href="http://www.google.com/webmasters/gadgets/"&gt;Google Webmasters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Users can find gadgets to place on their iGoogle home page at &lt;a href="http://www.google.com/ig/directory"&gt;iGoogle Gadgets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following is the script code that was provided from &lt;a href="http://www.google.com/webmasters/gadgets/"&gt;Google Webmasters&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://gmodules.com/ig/ifr?url=http://flickr-photo-of-the-minute.googlecode.com/svn/trunk/flickr.xml&amp;amp;amp;up_refresh=5&amp;amp;amp;up_displayDetails=1&amp;amp;amp;synd=open&amp;amp;amp;w=320&amp;amp;amp;h=320&amp;amp;amp;title=Photo+of+the+minute&amp;amp;amp;border=%23ffffff%7C3px%2C1px+solid+%23999999&amp;amp;amp;output=js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="cf"&gt;
&lt;p class="cl"&gt;The source of the gadget is located at: &lt;a href="http://flickr-photo-of-the-minute.googlecode.com/svn/trunk/flickr.xml"&gt;http://flickr-photo-of-the-minute.googlecode.com/svn/trunk/flickr.xml&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;From what I can tell, this is what the Google gadget appears to do.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It runs a script at Goggle gmodules using the URL: http://gmodules.com/ig/ifr&lt;/li&gt;
&lt;li&gt;That URL loads another script from http://gmodules.com/ig/f/U1pEe_3SJYU/ig.js&lt;/li&gt;
&lt;li&gt;The Google script builds an IFRAME for the output content for the gadget.&lt;/li&gt;
&lt;li&gt;The content of the CDATA section is placed in an the IFRAME&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you notice the code in the script, you see a section on that embeds Google Analytics information. This isn't really a security risk, but you are being tracked as a user of the Gadget.&lt;/p&gt;
&lt;h2&gt;Content Combination Techniques&lt;/h2&gt;
&lt;p&gt;Showing a web page with content from multiple locations is what 99% of what the Internet and intra-net is about. There are a handful of techniques, but multiple technologies that support the different techniques.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frames:&lt;/strong&gt; The Goggle gadget (and others similar to this) use a frame. A frame basically takes content from another web page, but allows it to be displayed as if it were part of the current page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pre Rendered Content:&lt;/strong&gt; Content is combined prior to output of the page. This often involves templates some type of code logic to combine the templates and data. Data is obtained from databases, XML files, static CSV files, or other web services. IIS and Apache servers use technologies including ASP, ASP.NET, and PHP to name a few.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Post Rendered Content:&lt;/strong&gt; Content is combined in the client browser after the initial page is loaded. This requires a browser client that supports some level of scripting and at the lowest level HTTP requests. This technique takes XML or HTML after the page loads and parses it to update or output the content to local page. XMLHTTP, AJAX, ATLAS, and JavaScript are all technologies uses to make post rendered content sites work. &lt;a href="http://www.netflix.com"&gt;Netflix&lt;/a&gt; was one of the sites to make post rendered content a feature to imitate.&lt;/p&gt;
&lt;p&gt;Another interesting way to combine information and to allow filtering and sorting was published at MIT called &lt;a href="http://simile.mit.edu/wiki/Exhibit"&gt;Exhibit&lt;/a&gt;. An interesting example is the list of &lt;a href="http://www.cse.msu.edu/~dunham/exhibit/top100.html"&gt;San Francisco Bay Restaurants&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The iframe&lt;/h2&gt;
&lt;p&gt;The Google gadget really isn't anything new for the web. It's just an &lt;a href="http://www.w3.org/TR/html4/present/frames.html"&gt;iFrame&lt;/a&gt; which is a section of the HTML document that contains another HTML document. This is useful when trying to merge content from multiple sources into a single page.&lt;/p&gt;
&lt;p&gt;Frames are generally considered bad by designers for web design and navigation. They cause page sections to load irregularly and in an uncontrolled order and if there are errors loading the page section, then the page looks terrible from a design perspective (the user sees 404 file not found errors).&lt;/p&gt;
&lt;p&gt;Instead of frames, designers like to use CSS on &lt;span class="cb1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cb2"&gt;div&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="cb2"&gt;div&lt;/span&gt;&lt;span class="cb1"&gt;&amp;gt;&lt;/span&gt; sections to control positioning and layout.&lt;/p&gt;
&lt;h2&gt;Gadgets Pros and Cons&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pro: You don't have to develop the code.&lt;/li&gt;
&lt;li&gt;Pro: You get to leverage other peoples code (almost as good as leveraging other peoples money)&lt;/li&gt;
&lt;li&gt;Pro: Gadgets use client bandwidth, not server bandwidth (at least not the original hosting page server)&lt;/li&gt;
&lt;li&gt;Pro and Con: If the gadget changes, you don't know about it&lt;/li&gt;
&lt;li&gt;Con: The gadgets can and often do embed tracking information&lt;/li&gt;
&lt;li&gt;Con: The gadgets can contain advertisements&lt;/li&gt;
&lt;li&gt;Con: Google knows the page that requested it&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Recommendations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I prefer not to use JavaScript if possible.&amp;nbsp; Because JavaScript is runtime checked, not compile time checked, it's impossible to remove all the errors.&amp;nbsp; There are pages everywhere on the web with JavaScript errors and every programmer makes them. If I use them, I prefer debugged and tested scripts that have been tested in multiple browsers.&lt;/li&gt;
&lt;li&gt;I do prefer pre rendered server side solutions (my preference is ASP.Net) with compiled code (VB.Net is my preference).&lt;/li&gt;
&lt;li&gt;If I use post rendered techniques, I like the use of XMLHTTP with simple DIV replacement techniques.&lt;/li&gt;
&lt;li&gt;Leverage other peoples debugged code instead of writing new code.&lt;/li&gt;
&lt;li&gt;Use the technique you can most likely make work most cost effectively.&lt;/li&gt;
&lt;li&gt;Be aware of the fact that Google gadgets are not necessarily doing things in your web sites best interest.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul class="References"&gt;
&lt;li&gt;&lt;a href="http://www.flickr.com/services/"&gt;Flickr Services&lt;/a&gt; flickr.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/webmasters/gadgets/"&gt;Google Gadgets for Webmasters&lt;/a&gt; goggle.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/ig/directory"&gt;iGoogle Gadgets Directory&lt;/a&gt; goggle.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.w3.org/TR/html4/present/frames.html"&gt;W3C Frames&lt;/a&gt; w3.org&lt;/li&gt;
&lt;li&gt;&lt;a href="http://simile.mit.edu/wiki/Exhibit"&gt;Exhibit&lt;/a&gt; MIT&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/how-do-google-gadgets-work/</guid>
  <pubDate>Fri, 03 Aug 2007 20:39:00 GMT</pubDate>
</item>
<item>
  <title>HTML Horizontal And Vertical Bar Charts</title>
  <link>https://tim-stanley.com/post/html-horizontal-and-vertical-bar-charts/</link>
  <description>&lt;p&gt;Displaying tabular information in a graphical form is helpful for a visual representation of the data. I've summarized a few simple techniques for displaying information in an HTML page in both horizontal and vertical form.&lt;/p&gt;
&lt;p&gt;There are a few techniques I've used to make this simple. [more]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A table is used for the data&lt;/li&gt;
&lt;li&gt;An image is used for the horizontal data&lt;/li&gt;
&lt;li&gt;The values shown are the width of the image (or proportional)&lt;/li&gt;
&lt;li&gt;An image is used for the vertical data&lt;/li&gt;
&lt;li&gt;The values shown are the height of the image (or proportional)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Horizontal Bar Chart Sample&lt;/h2&gt;
&lt;div class="bar-table"&gt;
&lt;table border="0"&gt;&lt;caption&gt;Pages Completed Per Month&lt;/caption&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="bar-label"&gt;Jan&lt;/div&gt;
&lt;/td&gt;
&lt;td class="bar-full"&gt;&lt;img src="/image.axd?picture=bars/hk.png" alt="120" width="120" height="12" /&gt;
&lt;p&gt;120&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="bar-label"&gt;Feb&lt;/div&gt;
&lt;/td&gt;
&lt;td class="bar-full"&gt;&lt;img src="/image.axd?picture=bars/hp.png" alt="220" width="220" height="12" /&gt;
&lt;p&gt;220&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="bar-label"&gt;Mar&lt;/div&gt;
&lt;/td&gt;
&lt;td class="bar-full"&gt;&lt;img src="/image.axd?picture=bars/hh.png" alt="267" width="267" height="12" /&gt;
&lt;p&gt;267&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="bar-label"&gt;Apr&lt;/div&gt;
&lt;/td&gt;
&lt;td class="bar-full"&gt;&lt;img src="/image.axd?picture=bars/hx.png" alt="275" width="275" height="12" /&gt;&amp;nbsp;
&lt;p&gt;275&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sample Horizontal Table Data&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;div class=&amp;quot;BarTable&amp;quot;&amp;gt;
    &amp;lt;table&amp;gt;
        &amp;lt;caption&amp;gt;Pages Completed Per Month&amp;lt;/caption&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;div class=&amp;quot;BarLabel&amp;quot;&amp;quot;&amp;gt;Jan&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td class=&amp;quot;BarFull&amp;quot;&amp;gt;
                &amp;lt;img src=&amp;quot;hk.png&amp;quot; height=&amp;quot;12&amp;quot; alt=&amp;quot;320&amp;quot; width=&amp;quot;320&amp;quot; /&amp;gt;
                &amp;lt;p&amp;gt;320&amp;lt;/p&amp;gt;
            &amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;div class=&amp;quot;BarLabel&amp;quot;&amp;quot;&amp;gt;Feb&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td class=&amp;quot;BarFull&amp;quot;&amp;gt;
                &amp;lt;img src=&amp;quot;hp.png&amp;quot; height=&amp;quot;12&amp;quot; alt=&amp;quot;420&amp;quot; width=&amp;quot;420&amp;quot; /&amp;gt;
                &amp;lt;p&amp;gt;420&amp;lt;/p&amp;gt;
            &amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;div class=&amp;quot;BarLabel&amp;quot;&amp;quot;&amp;gt;Mar&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td class=&amp;quot;BarFull&amp;quot;&amp;gt;
                &amp;lt;img src=&amp;quot;hh.png&amp;quot; height=&amp;quot;12&amp;quot; alt=&amp;quot;467&amp;quot; width=&amp;quot;467&amp;quot; /&amp;gt;
                &amp;lt;p&amp;gt;467&amp;lt;/p&amp;gt;
            &amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;div class=&amp;quot;BarLabel&amp;quot;&amp;quot;&amp;gt;Apr&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td class=&amp;quot;BarFull&amp;quot;&amp;gt;
                &amp;lt;img src=&amp;quot;hx.png&amp;quot; height=&amp;quot;12&amp;quot; alt=&amp;quot;510&amp;quot; width=&amp;quot;510&amp;quot; /&amp;gt;
                &amp;lt;p&amp;gt;510&amp;lt;/p&amp;gt;
            &amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
    &amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vertical Bar Chart Sample&lt;/p&gt;
&lt;div class="bar-table-vertical"&gt;
&lt;table border="0"&gt;&lt;caption&gt;Pages Completed Per Month&lt;/caption&gt;
&lt;tbody&gt;
&lt;tr class="bar-vertical"&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=bars/vh.png" alt="320" width="12" height="120" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=bars/vk.png" alt="220" width="12" height="220" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=bars/vp.png" alt="267" width="12" height="267" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="/image.axd?picture=bars/vu.png" alt="310" width="12" height="310" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;320&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;220&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;267&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;310&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="bar-label"&gt;Jan&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="bar-label"&gt;Feb&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="bar-label"&gt;Mar&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;div class="bar-label"&gt;Apr&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Sample Vertical Table Data&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;div class=&amp;quot;BarTableVertical&amp;quot;&amp;gt;
    &amp;lt;table&amp;gt;
        &amp;lt;caption&amp;gt;Pages Completed Per Month&amp;lt;/caption&amp;gt;
        &amp;lt;tr class=&amp;quot;BarVertical&amp;quot;&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;img src=&amp;quot;vh.png&amp;quot; height=&amp;quot;120&amp;quot; alt=&amp;quot;320&amp;quot; width=&amp;quot;12&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;img src=&amp;quot;vk.png&amp;quot; height=&amp;quot;220&amp;quot; alt=&amp;quot;420&amp;quot; width=&amp;quot;12&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;img src=&amp;quot;vp.png&amp;quot; height=&amp;quot;267&amp;quot; alt=&amp;quot;467&amp;quot; width=&amp;quot;12&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;img src=&amp;quot;vu.png&amp;quot; height=&amp;quot;310&amp;quot; alt=&amp;quot;510&amp;quot; width=&amp;quot;12&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;p&amp;gt;320&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;p&amp;gt;420&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;p&amp;gt;467&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;p&amp;gt;510&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;div class=&amp;quot;BarLabel&amp;quot;&amp;quot;&amp;gt;Jan&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;div class=&amp;quot;BarLabel&amp;quot;&amp;quot;&amp;gt;Feb&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;div class=&amp;quot;BarLabel&amp;quot;&amp;quot;&amp;gt;Mar&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;div class=&amp;quot;BarLabel&amp;quot;&amp;quot;&amp;gt;Apr&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
    &amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;CSS Styles&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-css"&gt;
.Caption
{
    font-size: .9em;
    font-style: italic;
    margin: 0;
    padding: 4px;
}
.BarTable
{
    border: solid 1px #000000;
    padding: 0px;
    margin: 0px 4em 0px 4em;
    width: 80%;
}
.BarTableVertical
{
    border: solid 1px #000000;
    padding: 0px;
    margin: 0px 4em 0px 4em;
}
.BarTable tr, .BarTableVertical tr
{
    vertical-align: top;
    padding: 0px;
    margin: 0px;
    background-color: #00CC66;
}
.BarTableVertical tr td
{
    background-color: #CCFFFF;
}
.BarTable tr p, .BarTableVertical tr p
{
    position: relative;
    display: inline;
    font-size: .8em;
    padding: 0px;
    margin: 0px;
    z-index: +1;
}
 
.BarFull
{
    background-image: url(gridline58.gif);
    background-repeat: repeat-x;
    background-position: left top;
    width: 100%;
    background-color: #CCFFFF;
}
.BarFull p
{
    margin: 0px 4px 4px 4px;
    background-color: #FFFF99;
    color: #000000;
}
.BarVertical
{
    height: 100%;
    background-color: #CCFFFF;
}
tr.BarVertical
{
    vertical-align: bottom;
    text-align: center;
}
.BarVertical p
{
    margin: 0px 4px 4px 4px;
    background-color: #FFFF99;
    color: #000000;
    text-align: center;
}
.BarLabel
{
    padding: 0px 4px 0px 4px;
    width: 2.5em;
    font-size: .9em;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.siteexperts.com/tips/contents/ts13/page1.asp"&gt;HTML Bar Charts&lt;/a&gt; siteexperts.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/useritems/HTMLHorizontalBarChart.asp"&gt;HTML Horizontal Bar Chart&lt;/a&gt; Codeproject.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eggheadcafe.com/tutorials/aspnet/58a3094c-3e00-4d40-ab76-3370bea2c012/html-horizontal-bar-chart.aspx"&gt;HTML Horizontal Bar Chart &lt;/a&gt;eggheadcafe.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/soap/xsltcharts.asp"&gt;Digits to Charts&lt;/a&gt; Codeproject.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aspwebsolution.com/articles/xmlrep/xmlbarchart.htm"&gt;XML Bar Chart&lt;/a&gt; aspwebsolution.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.standards-schmandards.com/exhibits/barchart/"&gt;An accessible bar chart&lt;/a&gt; standards-schmandards.com&lt;/li&gt;
&lt;li&gt;&lt;a title="http://applestooranges.com/blog/post/css-for-bar-graphs/?id=55" href="http://applestooranges.com/blog/post/css-for-bar-graphs/?id=55"&gt;CSS For Bar Graphs&lt;/a&gt; ApplesToOranges.com&lt;/li&gt;
&lt;li&gt;&lt;a title="http://meyerweb.com/eric/css/edge/bargraph/demo.html" href="http://meyerweb.com/eric/css/edge/bargraph/demo.html"&gt;Bar Graph&lt;/a&gt; Eric Meyer meyerweb.com&lt;/li&gt;
&lt;li&gt;&lt;a title="http://www.terrill.ca/design/vertical_bar_graphs/" href="http://www.terrill.ca/design/vertical_bar_graphs/"&gt;Vertical Bar Graphs&lt;/a&gt; Terrill.ca&lt;/li&gt;
&lt;li&gt;&lt;a title="http://dhtmlsite.com/cssgraphs.php" href="http://dhtmlsite.com/cssgraphs.php"&gt;10 Free CSS Graph Resources&lt;/a&gt; DHTMLsite.com&lt;/li&gt;
&lt;/ol&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>css</category>
  <category>html</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/html-horizontal-and-vertical-bar-charts/</guid>
  <pubDate>Thu, 12 Apr 2007 12:28:00 GMT</pubDate>
</item>
<item>
  <title>How To Install a Web Application for a Site with a Specific Port</title>
  <link>https://tim-stanley.com/post/how-to-install-a-web-application-for-a-site-with-a-specific-port/</link>
  <description>&lt;p&gt;MSI installation projects created in Visual Studio 2003 allowed the setting of a PORT value. This port value would be used to search the IIS sites and install the web application by default on the first site that corresponded to the specific port.&lt;/p&gt;
&lt;p&gt;Users migrating from Visual Studio 2003 to Visual Studio 2005 have found that support for the PORT property has been removed and there are few technical options available to solve this problem.&lt;/p&gt;
&lt;p&gt;This article outlines how using Visual Studio 2005 SP1 and a command line and MSI custom actions to install a web application on a site configured for a specific port.&lt;/p&gt;
&lt;p&gt;After an update to VS 2008, I see no options that resolves this in VS 2008 either.&lt;/p&gt;
&lt;p&gt;[more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_visual-studio-2003-background"&gt;Visual Studio 2003 Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_command-line-options-for-targetsite"&gt;Command Line Options for TARGETSITE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_getting-the-targetsite-in-a-custom-action"&gt;Getting the TARGETSITE in a Custom Action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_setting-the-targetsite-in-the-custom-action"&gt;Setting the TARGETSITE in the Custom Action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_visual-studio-2003-background"&gt;Visual Studio 2003 Background&lt;/h2&gt;
&lt;p&gt;In IIS, on Windows Server 2003, multiple sites with multiple ports are used in most deployments. For example, if two sites are configured, one with port 80, the other with port 8080, they would appear as follows in the IIS administration tool.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/HowToInstallaWebApplicationforaSitewitha_CB6C/DefaultSiteProperties8080_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToInstallaWebApplicationforaSitewitha_CB6C/DefaultSiteProperties8080_thumb.jpg" alt="DefaultSiteProperties8080" width="242" height="244" border="0"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/HowToInstallaWebApplicationforaSitewitha_CB6C/DefaultSiteProperties2_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToInstallaWebApplicationforaSitewitha_CB6C/DefaultSiteProperties2_thumb.jpg" alt="DefaultSiteProperties2" width="242" height="244" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In IIS admin, the port value and the host header value can also be set under the advanced settings.&lt;/p&gt;
&lt;p&gt;If one wanted an MSI package to install a Web Application by default on the site that used port 8080, and the virtual directory to "TestWeb", Visual Studio 2003 made this easy.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the File System view of the Web Setup project for the web application&lt;/li&gt;
&lt;li&gt;Select the properties view of the Web Application Folder&lt;/li&gt;
&lt;li&gt;Set the Port property to 8080&lt;/li&gt;
&lt;li&gt;Set the VirtualDirectory Property to "TestWeb"&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If one wanted to pass this as a command line parameters the MSI these MSI properties could also be set.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; TARGETPORT=8080 &lt;br&gt;&amp;nbsp;&amp;nbsp; TARGETVDIR=TestWeb &lt;br&gt;&amp;nbsp;&amp;nbsp; TARGETDIR="C:\Program Files\..."&lt;/p&gt;
&lt;p&gt;The property TARGETDIR can also be used to specify the physical path where the application should be installed.&lt;/p&gt;
&lt;h2 id="h2_command-line-options-for-targetsite"&gt;Command Line Options for TARGETSITE&lt;/h2&gt;
&lt;pre&gt;Msiexec /I "Websetup1.msi" TARGETSITE="/LM/W3SVC/1"&lt;/pre&gt;
&lt;p&gt;The problem with this approach is that the site will not be the same number on every server. We can use this approach to know what site number is used based on the port number assigned to that site. We can use the algorithm noted below in a VB script to find the server number and use the update the TARGETSITE on the command line.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;serverNumber = FindServerNumber( 9115)&lt;/li&gt;
&lt;li&gt;tgtSite = "/LM/W3SVC/" &amp;amp; serverNumber&lt;/li&gt;
&lt;li&gt;shell.Run "msiexec /passive /I """ &amp;amp; argInstallerName &amp;amp; """ TARGETSITE=" &amp;amp; tgtSite&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
Function FindServerNum(strPort) 
    Dim MD_SERVER_STATE_STARTED, MachineName, IISObjectPath, IISObjects
    Dim ChildObject, ChildObjectName
    'Dim Servers 
    Dim ServerNum, i, strBindings, strSvrPort, BindArray, binding
    Dim svrCount, arrCount, Servers(10), site
    svrCount = 0 
    arrCount = 0 
    i = 0 
    MD_SERVER_STATE_STARTED = 2 
    MachineName = "localhost" 
    IISObjectPath = "IIS://" &amp; MachineName &amp; "/W3SVC" 
 
    Set IISObject = GetObject(IISObjectPath) 
    'Find all the server numbers pu into an array 
    for each ChildObject in IISObject 
        ChildObjectName = ChildObject.AdsPath 
        ChildObjectName = Right(ChildObjectName, Len(ChildObjectName)- InStrRev(ChildObjectName, "/")) 
    on error resume next 
        ServerNum = Clng(ChildObjectName) 
        If (Err = 0) Then 
            Servers(arrCount) = ServerNum 
            arrCount = arrCount + 1 
        End If 
    next 
 
    'Get the port number and compare with the passed port number. If match, return the server number 
    while i &lt;= arrCount 
        set site = IISObject.GetObject("IIsWebServer", Servers(i)) 
        ' Gets the Port Number of the current IISObject. 
        BindArray = site.ServerBindings 
    on error resume next 
        strBindings = BindArray(0) 
        If Err = 0 Then 
            'remove the : char from begining and end of the port number 
            strSvrPort = Left(strBindings, InStrRev(strBindings, ":") - 1) 
            strSvrPort = Right(strSvrPort, Len(strSvrPort) - InStr(strSvrPort, ":"))    
    on error resume next 
            If cint(strPort) = cint(strSvrPort) Then 
                If Err = 0 Then 
                    If IISObject.ServerState = MD_SERVER_STATE_STARTED Then 
                    ' Determines if this is our server. IIS can only have one 
                    ' active port, so if the port is active it is the port where 
                    ' the application is installed.                    
                    FindServerNum = Servers(i) 
                    svrCount = svrCount + 1                    
                    exit function 
                End If 
            End If 
        End If
        i = i + 1 
    wend 
 
    If svrCount = 0 Then 
    ' Err.Raise 9999, "FindServerNum", "No Active Servers with the requested port were found. Port=" &amp; strPort &amp;  ". " 
    End If 
 
End Function 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A copy of the script can be downloaded &lt;a href="http://www.tsisys.com/MSIInstallScript.zip"&gt;MSIInstallScript.zip&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="h2_getting-the-targetsite-in-a-custom-action"&gt;Getting the TARGETSITE in a Custom Action&lt;/h2&gt;
&lt;p&gt;If you follow the basic line of logic from the article at &lt;a href="http://msdn2.microsoft.com/en-us/library/9cdb5eda(VS.71).aspx"&gt;Walkthrough: Passing Data to a Custom Action&lt;/a&gt; then getting the TARGESITE value is fairly simple.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create an Installer Class (Add new item, Installer class)&lt;/li&gt;
&lt;li&gt;Put the code in the installer class to process the parameters &lt;br&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary) 
    ' Gets the parameter passed across in the CustomActionData. 
    MyBase.Install(stateSaver) 
 
    Dim strSite As String = Nothing 
    strSite = Me.Context.Parameters.Item("SITE").ToString 
    MsgBox("SITE=" &amp; strSite, MsgBoxStyle.Information, "Custom Install")     
    Me.Context.LogMessage("JS Action Before SITE=" &amp; strSite) 
End Sub 
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Add the output from the installer class to the web installation (View File System, Add project output, select primary output from the project with the installer class)&lt;/li&gt;
&lt;li&gt;Create the custom action (View custom actions, add custom action, select Web Application Folder, select Primary output from the project with the installer class)&lt;/li&gt;
&lt;li&gt;5. Set the CustomActionData property for the custom action as follows:
&lt;pre&gt;&lt;code class="language-markup"&gt;
/SITE=[TARGETSITE] /PORT=[TARGETPORT] /VDIR=[TARGETVDIR] /TDIR="[TARGETDIR]\"
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you run the following command, you should see a message box that appears showing the SITE value.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-markup"&gt;
msiexec.exe /qf /norestart /Liwearucmopvx! MSIInstall.log /i WebSetupald.msi
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_setting-the-targetsite-in-the-custom-action"&gt;Setting the TARGETSITE in the Custom Action&lt;/h2&gt;
&lt;p&gt;So now we have read it, we should be able to set it.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-markup"&gt;
Me.Context.Parameters.Item("SITE") = "/LM/W3SVC/1"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Actually, this is misleading, you can&amp;rsquo;t set the TARGETSITE. Ok, you can, but by the time you set it, the TARGETSITE has already been established and so setting it is a moot point.&lt;/p&gt;
&lt;p&gt;If you actually run this, you will see there are two problems with this approach. First, the component that executes the custom action actually gets installed in the TARGETSITE and TARGETVDIR. Second, since the TARGETSITE has already been set in the User Dialog or Acquisition or User Dialog phase of gathering the data to set the properties for the installation.&lt;/p&gt;
&lt;p&gt;The Windows Installer goes through a series of sequences for the MSI package: Initialization; User Dialog; Finalization or Rollback. A full explanation of these phases is best explain in the article &lt;a href="http://www.installsite.org/pages/en/isnews/200108/index.htm"&gt;Installation Phases and In-Script Execution Options for Custom Actions in Windows Installer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Essentially, this is a chicken and egg problem. One can&amp;rsquo;t set the property in the custom action because by the time the custom action is invoked, the property for TARGETSITE is already set.&lt;/p&gt;
&lt;p&gt;Phil Wilson also explains the same sequencing problem in his article &lt;a href="http://www.simple-talk.com/dotnet/visual-studio/visual-studio-setup---projects-and-custom-actions/"&gt;Visual Studio Setup - projects and custom actions&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="h2_conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Essentially if you have to solve the problem of installing an application on a site with a specific port, there are two options. Set the TARGETSITE property and pass this as a parameter prior to invoking msi install, or moving to another tool like &lt;a href="http://www.wise.com/Products/Installations.aspx"&gt;Windows Installation Studio 7&lt;/a&gt; by Wise (aka Altiris) or &lt;a href="http://www.installshield.com"&gt;InstallShield&lt;/a&gt; from Marco Vision. These products allow the creation of dialog windows which can be customized with further custom actions and logic far beyond what the Visual Studio 2003 or 2005 products allow.&lt;/p&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a id="#1"&gt;&lt;/a&gt;[1] &lt;a href="http://msdn2.microsoft.com/en-us/library/aa289522(VS.71).aspx"&gt;Modifying Internet Information Services During Deployment with Custom Actions &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id="#2"&gt;&lt;/a&gt;[2] &lt;a href="http://www.codeproject.com/dotnet/command_lines_setups.asp"&gt;How to Pass Command Line Arguments to MSI Installer Custom Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id="#3"&gt;&lt;/a&gt;[3] &lt;a href="http://msdn2.microsoft.com/en-us/library/9cdb5eda(VS.71).aspx"&gt;Walkthrough: Passing Data to a Custom Action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id="#4"&gt;&lt;/a&gt;[4] &lt;a href="http://www.simple-talk.com/dotnet/visual-studio/visual-studio-setup---projects-and-custom-actions/"&gt;Visual Studio Setup - projects and custom actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id="#5"&gt;&lt;/a&gt;[5] &lt;a href="http://www.devx.com/dotnet/Article/20849/1954?pf=true"&gt;Building Custom Installer Classes in .NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id="#6"&gt;&lt;/a&gt;[6] &lt;a href="http://blog.benday.com/archive/2007/01/02/22221.aspx"&gt;Custom Installer Actions: Edit Connection Strings, IIS Directory Security Settings, etc.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id="#7"&gt;&lt;/a&gt;[7] &lt;a href="http://wix.sourceforge.net/"&gt;Windows Installer XML (WIX) Toolset &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[8] &lt;a href="http://www.thescripts.com/forum/thread464699.html"&gt;How to get the installed WebSite in VS2005 WebSetup installer customAction?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id="#9"&gt;&lt;/a&gt;[9] &lt;a href="http://groups.google.com/group/microsoft.public.dotnet.framework.setup/browse_thread/thread/64772ee5f7ba13d5/d0f309241ee6ced3%23d0f309241ee6ced3"&gt;How do I set property in Custom Action?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id="#10"&gt;&lt;/a&gt;[10] &lt;a href="http://www.installsite.org/pages/en/msi/ca.htm"&gt;Windows Installer Custom Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id="#11"&gt;&lt;/a&gt;[11] &lt;a href="http://www.installsite.org/pages/en/isnews/200108/index.htm"&gt;] Installation Phases and In-Script Execution Options for Custom Actions in Windows Installer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>net</category>
  <category>iis</category>
  <category>iis6</category>
  <category>visual-studio</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/how-to-install-a-web-application-for-a-site-with-a-specific-port/</guid>
  <pubDate>Tue, 10 Apr 2007 18:39:00 GMT</pubDate>
</item>
<item>
  <title>2007 Keystone Colorado Trip</title>
  <link>https://tim-stanley.com/post/2007-keystone-colorado-trip/</link>
  <description>&lt;p&gt;I recently had the opportunity to travel to Keystone, Colorado.&amp;nbsp; This is a summary of the wonderful experiences I had on the trip, including a sleigh ride, snowmobiling, and dinner atop a ski lodge. [more]&lt;/p&gt;
&lt;p&gt;The camera and lens used in all pictures is a &lt;a href="http://www.adorama.com/?kbid=62978&amp;amp;sku=INKD80"&gt;Nikon D80&lt;/a&gt; with the &lt;a href="http://www.adorama.com/?kbid=62978&amp;amp;sku=NK18135DXU"&gt;Nikon 18-135 mm lens&lt;/a&gt; available at &lt;a href="http://www.adorama.com/?kbid=62978&amp;amp;sku=INKD80K2"&gt;Adorama&lt;/a&gt;.&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_sleigh-ride-dinner"&gt;Sleigh Ride Dinner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_mountain-sunrise"&gt;Mountain Sunrise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_snowmobile-trip"&gt;Snowmobile Trip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_fondue-lodge-dinner"&gt;Fondue Lodge Dinner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_the-camera-and-lens"&gt;The Camera and Lens&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_sleigh-ride-dinner"&gt;Sleigh Ride Dinner&lt;/h2&gt;
&lt;p&gt;The activity for the first evening was a &lt;a href="http://keystone.snow.com/info/din.exp.sleigh.asp"&gt;horse drawn sleigh ride and dinner&lt;/a&gt;. This started at about 4:30 pm in a national park just outside of Keystone, Colorado. The scenery was absolutely beautiful. It was dark when we came back, but the moon was out and the stars were extremely bright. If you are visiting with friends or family, I would highly recommend a sleigh ride, but I recommend it during the daylight hours. When the sun goes down, it gets cold quickly in the Colorado mountains.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/SleighRide_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/SleighRide_thumb.jpg" alt="SleighRide" width="524" height="351" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sleigh Ride&lt;/p&gt;
&lt;p&gt;Nikon D80 18-135 mm lens @ 70 mm F5.6 1/60 sec ISO-100.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/Ranch_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/Ranch_thumb.jpg" alt="Ranch" width="524" height="351" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dinner at the ranch&lt;/p&gt;
&lt;p&gt;Nikon D80 18-135 mm lens @ 70 mm F5.6 1/400 sec ISO-100. &lt;a id="toc_1" href="#"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_mountain-sunrise"&gt;Mountain Sunrise&lt;/h2&gt;
&lt;p&gt;I stayed at the &lt;a href="http://keystone.snow.com/info/lakeside.asp"&gt;Lakeside Village&lt;/a&gt; at Keystone Lake. My body was still on east coast time and I woke up early the next morning so I went for a walk around the lake and I caught a glimpse of the sunrise cascading over the mountain tops.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/SunriseMountains2_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/SunriseMountains2_thumb.jpg" alt="SunriseMountains2" width="524" height="351" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sunrise on the mountains&lt;/p&gt;
&lt;p&gt;Nikon D80 18-135 mm lens @ 135 mm F5.6 1/200 sec ISO-100.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/SunriseMountains1_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/SunriseMountains1_thumb.jpg" alt="SunriseMountains1" width="524" height="351" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sunrise complete&lt;/p&gt;
&lt;p&gt;Nikon D80 18-135 mm lens @ 120 mm F5.6 1/320 sec ISO-100. &lt;a id="toc_2" href="#"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_snowmobile-trip"&gt;Snowmobile Trip&lt;/h2&gt;
&lt;p&gt;Later the second day I went on a &lt;a href="http://keystone.snow.com/info/winter.snowmobile.asp"&gt;Snowmobile trip&lt;/a&gt;. That was a lot of fun. It's like a waverunner on the snow.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/Snowmobile1_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/Snowmobile1_thumb.jpg" alt="Snowmobile1" width="524" height="351" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Snowmobile trip&lt;/p&gt;
&lt;p&gt;Nikon D80 18-135 mm lens @ 20 mm F10 1/400 sec ISO-100.&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/Snowmobile2_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/Snowmobile2_thumb.jpg" alt="Snowmobile2" width="524" height="351" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Snowmobilers in waiting&lt;/p&gt;
&lt;p&gt;Nikon D80 18-135 mm lens @ 18 mm F8 1/250 sec ISO-100.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/MountainRange_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/2007KeystoneColoradoTrip_D50D/MountainRange_thumb.jpg" alt="MountainRange" width="524" height="351" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The view from the top&lt;/p&gt;
&lt;p&gt;Nikon D80 18-135 mm lens @ 85 mm F6.3 1/640 sec ISO-100. &lt;a id="toc_3" href="#"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_fondue-lodge-dinner"&gt;Fondue Lodge Dinner&lt;/h2&gt;
&lt;p&gt;On the evening of the second day, there was a Fondue dinner at &lt;a href="http://keystone.snow.com/info/din.exp.chessel.asp"&gt;Der Fondue Chessel&lt;/a&gt;. Most of the pictures inside the restaurant were quite dark so I've not posted them. &lt;a id="toc_4" href="#"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="h2_the-camera-and-lens"&gt;The Camera and Lens&lt;/h2&gt;
&lt;p&gt;The camera and lens used in all pictures is a &lt;a href="http://www.adorama.com/?kbid=62978&amp;amp;sku=INKD80"&gt;Nikon D80&lt;/a&gt; with the &lt;a href="http://www.adorama.com/?kbid=62978&amp;amp;sku=NK18135DXU"&gt;Nikon 18-135 mm lens&lt;/a&gt; available at &lt;a href="http://www.adorama.com/?kbid=62978&amp;amp;sku=INKD80K2"&gt;Adorama&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All images and content are Copyright &amp;copy; 2007 Tim Stanley, All Rights Reserved.&lt;/p&gt;
&lt;p&gt;Some of the images of the sunrise in the mountains exhibit the falloff or darkened corners that Ken Rockwell mentions in his &lt;a href="http://www.kenrockwell.com/nikon/18-135.htm#falloff"&gt;Nikon 18-135 mm lens review&lt;/a&gt;. It gives either a nice effect or not depending on ones preference.&lt;/p&gt;</description>
  <author>email@nospam.com</author>
  <category>photography</category>
  <category>nikon</category>
  <category>photography</category>
  <category>keystone</category>
  <category>sleigh-ride</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/2007-keystone-colorado-trip/</guid>
  <pubDate>Wed, 28 Feb 2007 18:58:00 GMT</pubDate>
</item>
<item>
  <title>How To Get The Optimal Web Page Layout</title>
  <link>https://tim-stanley.com/post/how-to-get-the-optimal-web-page-layout/</link>
  <description>&lt;p&gt;If you are creating a web site with a consistent layout, there are a few very critical decisions that you must make now. If you don't make them correctly, and you want to change the layout in the future, you'll likely have to modify the design on all the pages on your web site.&lt;/p&gt;
&lt;p&gt;Experience teaches you which decisions you have to make now that matter and which decisions you can postpone. This article shares some of the experiences I've learned and hopefully how to avoid some of the headaches of having to change the design for all pages on a site.&lt;/p&gt;
&lt;p&gt;[more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_simple-layouts"&gt;Simple Layouts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_three-rows-top-middle-bottom"&gt;Three Rows: Top Middle, Bottom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_three-columns-left-middle-right"&gt;Three Columns: Left, Middle, Right&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_layout-styles-and-recommendations"&gt;Layout Styles and Recommendations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;If you just want the solution and not the reason why I recommend this approach, jump straight to &lt;a href="#toc_2"&gt;Three Rows: Top, Middle, Bottom&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you want to see what it looks like before reading all the detail, you can visit the &lt;a href="http://www.tsisys.com/Patterns/Layout/"&gt;sample layout page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This article is not about how to utilize a CSS hack for IE 6, IE7, Firefox or other browsers, but how to create a html layout that has some longevity and that a designer can decide how best to utilize CSS hacks or not. After reading numerous posts, hacks, fixes, and running many experiments and tests in different browsers, this is my opinion on how to avoid a lot of the headaches and aggravation.&lt;/p&gt;
&lt;p&gt;Writing is probably the most important tool for human advancement.&lt;sup&gt;&lt;a href="#8"&gt;[8]&lt;/a&gt;&lt;/sup&gt; Word processors allow us to easily create documents and format the fonts into headings and paragraphs. You can e-mail those documents to friends and family and if they have the same word processor viewer, the documents show up basically if not 100% the same as when you created them.&lt;/p&gt;
&lt;p&gt;In 2007, even with all the "features" of today's tools, If you want to create simple layouts for web pages, we are stuck in the same state word processor users were in the 1970's.&lt;/p&gt;
&lt;p&gt;The layout of a web page or site is an extremely important aspect of the information that is presented. If the layout or font looks unprofessional, people trust the content less. The layout also affects how well people retain the information on a web page.&lt;sup&gt;&lt;a href="#10"&gt;[10]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;People who spend their full time jobs creating web sites can't get it right all of the time and when they do get it right, it often breaks when the next version of Internet Explorer or Firefox or another browser is released. Most people in the web design profession know that all browsers don't support the &lt;a href="http://www.w3.org/TR/css3-box/"&gt;W3C CSS box model&lt;/a&gt;&lt;sup&gt;&lt;a href="#7"&gt;[7]&lt;/a&gt;&lt;/sup&gt; the same. Yet, almost in the same breath, they rant when all browsers don't support CSS positioning the same &lt;sup&gt;&lt;a href="#11"&gt;[11]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;These layouts break because people expect &lt;a href="http://en.wikipedia.org/wiki/CSS"&gt;CSS&lt;/a&gt; to solve the positioning and layout problems for them and when it doesn't, the "professionals" result to various workarounds and bugs. These vary from one browser to another and then when the bugs are fixed or altered they cause re-work. Save yourself, and your the companies you help a lot of time, effort, and aggravation and don't use these hacks, quirks, or bugs.&lt;/p&gt;
&lt;p&gt;All browsers interpret CSS differently and will therefore behave differently. No one can afford to test all content in all browsers. Settle for the lowest common denominator. If you want to have that level of explicit control over how an item is going to appear when presented to the user, in my opinion, use a Microsoft Word document, and Adobe PDF file or an image.&lt;/p&gt;
&lt;h2 id="h2_simple-layouts"&gt;Simple Layouts&lt;/h2&gt;
&lt;p&gt;The approach I have taken is to be CSS hack free if possible. Ironically, this might be considered a hack that div sections are used to control the layout. If I choose to utilize a CSS hack or not, I need to have the foundation in place in the HTML content in order to do so. This solution I believe allows flexibility down the road for layout irrespective of which (if any) CSS tricks or hacks are used.&lt;/p&gt;
&lt;p&gt;This approach also lends itself to template based solutions (i.e. #includes, ASPX, PHP, etc.). I do recommend that an external style sheet be use for CSS.&lt;/p&gt;
&lt;p&gt;The concept utilized is very similar to Russian stacking dolls. All sections exist within another.&lt;/p&gt;
&lt;p&gt;Simple layout guidelines.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use a container for all the sections.&lt;/li&gt;
&lt;li&gt;Use Three rows for content: Top, Middle, Bottom&lt;/li&gt;
&lt;li&gt;Make each row 100% of the width of the container&lt;/li&gt;
&lt;li&gt;Use a Middle row with an inner and outer section&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Use Three columns for the middle row inner section: Left, Center, Right&lt;/li&gt;
&lt;li&gt;Make the sum of the widths of the columns 100% of the width of the container&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In some sites or applications, not all rows or columns are visible. Even if the left and right sections are not going to be visible, I like to plan on the ability to add the future content in without having to redesign the content of the page and I believe this lays down a good foundation.&lt;/p&gt;
&lt;h2 id="h2_three-rows-top-middle-bottom"&gt;Three Rows: Top Middle, Bottom&lt;/h2&gt;
&lt;p&gt;Most professional web site developers seem to agree that the use of tables to build a layout is a bad idea at this point in time with the current tools and technology. It's a lot of work, and if you want to change something, it's a lot of rework.&lt;/p&gt;
&lt;p&gt;The premise of my approach is that a container is created and within it three rows are used. The main container in some respects is redundant for the body element. I've included it because some hacks want a larger container to manipulate the CSS.&lt;/p&gt;
&lt;p&gt;Each row can be subdivided into further rows if needed. A layout of what this looks like on a web page is shown on the left.&lt;/p&gt;
&lt;p&gt;The content for the rows is created in three simple div sections all within a section. Each section appears on each page in the order listed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PanelContainer - The outer wrapper for the entire contents&lt;/li&gt;
&lt;li&gt;PanelTop - The top most section. This may be divided into further rows (i.e. PanelBanner, PanelTop).&lt;/li&gt;
&lt;li&gt;PanelMiddle&lt;/li&gt;
&lt;li&gt;PanelFooter - The bottom most section. This may be divided into further rows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The XHTML for the Container three rows is shown below.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;div class="PanelContainer"&amp;gt;
   &amp;lt;div class="PanelTop"&amp;gt;
   &amp;lt;/div&amp;gt;
   &amp;lt;div class="PanelMiddle"&amp;gt;
   &amp;lt;/div&amp;gt;
   &amp;lt;div class="PanelFooter"&amp;gt;
   &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_three-columns-left-middle-right"&gt;Three Columns: Left, Middle, Right&lt;/h2&gt;
&lt;div&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToGetTheOptimalWebPageLayout_BE10/Layout3Rows_3.jpg" alt="3 Row Layout" width="204" height="151" align="left" border="0"&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Within the PanelMiddleOuter section, another PanelMiddleInner section and then within that, three columns are created in div sections similar to the rows created earlier. The PanelMiddleInner section is to allow some hacks which utilize an inner section within a section to resolve the IE min-width problem &lt;sup&gt;&lt;a href="#13"&gt;[13]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;The key concept in this example is that these three columns are all &lt;strong&gt;within&lt;/strong&gt; the center (PanelMiddleOuter row. If this looks remarkably like a table, your right and that's part of what forces the browser to display it correctly.&lt;/p&gt;
&lt;p&gt;These three sections have two key attributes. First they have the float: right CSS property. Second they are set with the width property so that each of the three sections are divided so that they utilize 100% of the width.&lt;/p&gt;
&lt;p&gt;If you have looked at the layout, you'll notice that the columns are not all equal length. If you want them all equal length, you have two choices. Use a CSS hack &lt;a href="#3"&gt;[3]&lt;/a&gt;&lt;a href="#5"&gt;[5]&lt;/a&gt;, or use a javascript. My experience is that the java script is likely going to stand the test of time better than the CSS hack, but in general, I don't like java scripts because of the dreaded unknown java script error (80% of sites I see have them, they just don't seem to know it). Turn on display notification about every script error to see them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PanelMiddleInner - An additional full width container inside the PanelMiddle section&lt;/li&gt;
&lt;li&gt;PanelLeftRail - The left section usually for menus or news&lt;/li&gt;
&lt;li&gt;PanelCenterRail&lt;/li&gt;
&lt;li&gt;PanelRightRail - The right section usually for advertisements, or news&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The XHTML for the list of the layout now looks like the following. The indentation is added for clarity.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
&amp;lt;div class="PanelContainer"&amp;gt;
   &amp;lt;div class="PanelTop"&amp;gt;
   &amp;lt;/div&amp;gt;
   &amp;lt;div class="PanelMiddle"&amp;gt;
       &amp;lt;div class="PanelMiddleInner"&amp;gt;
          &amp;lt;div class="PanelLeftRail"&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;div class="PanelCenterRail"&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;div class="PanelRightRail"&amp;gt;
          &amp;lt;/div&amp;gt;
       &amp;lt;/div&amp;gt;
   &amp;lt;/div&amp;gt;
   &amp;lt;div class="PanelFooter"&amp;gt;
   &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_layout-styles-and-recommendations"&gt;Layout Styles and Recommendations&lt;/h2&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/HowToGetTheOptimalWebPageLayout_BE10/Layout3_2.jpg"&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToGetTheOptimalWebPageLayout_BE10/Layout3_thumb.jpg" alt="3 Column Layout" width="244" height="210" align="left" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Given the above "content" layout, one can then style the page as desired. I use the following guides.&lt;/p&gt;
&lt;p&gt;Disclaimer: Everyone that knows and has experience with CSS is going to have an opinion on this approach. Most people invest so much time into this it's usually a strong emotional opinion. I don't intend to sway anyone from their current position. I do hope that I can save some folks a lot of time and aggravation by giving an example that is simple and will allow future "tweaking" as they may see fit.&lt;/p&gt;
&lt;p&gt;I use a fixed width centered layout. Most studies show a flow layout is preferred by most users so they can adjust their layout to the width desired. However, due to Internet Explorer bugs, IE doesn't support a minimum width CSS value properly without applying some CSS hacks. Therefore, when the flow layout is used and it is collapsed sufficiently small enough width wise, the page collapses on itself in a horrible an unreadable manner. Good designers have workarounds or hacks. Good designers spend a lot of time on this problem in all the different browsers. Every designer rants when the next browser breaks their hacks. This is the whole point of this article. Don't use the hacks.&lt;/p&gt;
&lt;p&gt;I've decided to simplify my pages and just go with a fixed width layout. There is only one line of difference in the body section in my simple layout between a flow layout and a fixed width layout.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;
Fixed Width width: 760px;
Flow Layout width: 100%;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;I use center text with a fixed width of 600px. Studies I have seen prefer Flow layout, then fixed centered, then least of all left centered.&lt;/li&gt;
&lt;li&gt;I use a font-family as follows: Calibri, Verdana, Arial, Sans-Serif. Studies I have seen show that these fonts are viewed as "most" professional.&lt;/li&gt;
&lt;li&gt;I use a font-size in ems, not px.; The use of an em font size allows the viewer to resize the page if they need a larger font.&lt;/li&gt;
&lt;li&gt;I use a min-width: 500px; and a width: 600px on the body.&lt;/li&gt;
&lt;li&gt;I use width: 100% on the main three rows (or all rows if there are more).&lt;/li&gt;
&lt;li&gt;I use a width of 60% on the PanelCenterRail and 20% on the PanelLeftRail and PanelRightRail.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a id="#1"&gt;&lt;/a&gt;[1] &lt;a href="http://cross-browser.com/x/examples/x_3col_fm.html"&gt;Collapsible 3-Column Layout&lt;/a&gt; cross-broswer.com&lt;/li&gt;
&lt;li&gt;&lt;a id="#2"&gt;&lt;/a&gt;[2] &lt;a href="http://www.positioniseverything.net/articles/onetruelayout/"&gt;One True Layout&lt;/a&gt; PositionIsEverything.net&lt;/li&gt;
&lt;li&gt;&lt;a id="#3"&gt;&lt;/a&gt;[3] &lt;a href="http://www.alistapart.com/articles/fauxcolumns/"&gt;Faux Columns&lt;/a&gt; Alistapart.com by Dan Ceaderholm&lt;/li&gt;
&lt;li&gt;&lt;a id="#4"&gt;&lt;/a&gt;[4] &lt;a href="http://alistapart.com/articles/multicolumnlayouts"&gt;Multi-Column Layouts Climb Out of the Box&lt;/a&gt; Alistapart.com by Alan Pearce&lt;/li&gt;
&lt;li&gt;&lt;a id="#5"&gt;&lt;/a&gt;[5] &lt;a href="http://builder.com.com/5100-6371_14-5268973.html"&gt;Getting equal-heigh columns in a three-column layout&lt;/a&gt; builder.com by Michael Meadhra&lt;/li&gt;
&lt;li&gt;&lt;a id="#6"&gt;&lt;/a&gt;[6] &lt;a href="http://www.sitepoint.com/newsletter/viewissue.php?id=3&amp;amp;issue=70"&gt;Exploring the Limits of CSS Layout&lt;/a&gt; Sitepoint.com&lt;/li&gt;
&lt;li&gt;&lt;a id="#7"&gt;&lt;/a&gt;[7] &lt;a href="http://www.w3.org/TR/css3-box/"&gt;CSS3 module: The box model&lt;/a&gt; The W3C CSS box model&lt;/li&gt;
&lt;li&gt;&lt;a id="#8"&gt;&lt;/a&gt;[8] &lt;a href="http://www.jnd.org/dn.mss/things_that_make_us.html"&gt;Things That Make Us Smart&lt;/a&gt; Forbes article by Donald A. Norman&lt;/li&gt;
&lt;li&gt;&lt;a id="#9"&gt;&lt;/a&gt;[9] &lt;a href="http://docs.google.com/"&gt;Google Docs and Spreadsheets&lt;/a&gt; Google documents and spreadsheets&lt;/li&gt;
&lt;li&gt;&lt;a id="#10"&gt;&lt;/a&gt;[10] &lt;a href="http://psychology.wichita.edu/surl/usabilitynews/62/whitespace.htm"&gt;Reading Online Text: A Comparison of Four White Space Layouts&lt;/a&gt; Research by the Department of Psychology at Wichita State University&lt;/li&gt;
&lt;li&gt;&lt;a id="#11"&gt;&lt;/a&gt;[11] &lt;a href="http://www.quirksmode.org/css/quirksmode.html"&gt;Quirks mode and strict mode&lt;/a&gt; quirksmode.org&lt;/li&gt;
&lt;li&gt;&lt;a id="#12"&gt;&lt;/a&gt;[12] &lt;a href="http://hsivonen.iki.fi/doctype/"&gt;Activating the Right Layout Mode Using the Doctype Declaration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id="#13"&gt;&lt;/a&gt;[13] &lt;a href="http://www.cssplay.co.uk/"&gt;CSS Play&lt;/a&gt; Stu Nicholls site on CSS&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>css</category>
  <category>html</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/how-to-get-the-optimal-web-page-layout/</guid>
  <pubDate>Wed, 14 Feb 2007 18:19:00 GMT</pubDate>
</item>
<item>
  <title>How To Restore A SQL User After a SQL Database Restore</title>
  <link>https://tim-stanley.com/post/how-to-restore-a-sql-user-after-a-sql-database-restore/</link>
  <description>&lt;p&gt;You backed up your Microsoft SQL Database and restored it on another system, but the user id's you've used before can not access the database.&amp;nbsp; This article is a summary of how to quickly configure the SQL Server database so that your previous user id's can access the database properly.&lt;/p&gt;
&lt;p&gt;[more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_why-does-this-happen"&gt;Why Does This Happen?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_find-the-missing-users"&gt;Find The Missing Users&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_create-the-user-account"&gt;Create The User Account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_restore-the-sql-user"&gt;Restore The SQL User&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_why-does-this-happen"&gt;Why Does This Happen?&lt;/h2&gt;
&lt;p&gt;When transferring a database to a new server using backup and restore or when detaching and re-attaching the database, the links for the database users are broken. The SQL User information stored in the "master" database in the original server is usually not moved. This information lives in the "syslogins" table in the master database.&lt;/p&gt;
&lt;h2 id="h2_find-the-missing-users"&gt;Find The Missing Users&lt;/h2&gt;
&lt;p&gt;Unless you already know the all the user id's, you'll need to find which ones are missing.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;
EXEC sp_change_users_login 'Report'
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_create-the-user-account"&gt;Create The User Account&lt;/h2&gt;
&lt;p&gt;To automatically create and restore the SQL User Account:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;
EXEC sp_change_users_login 'Auto_Fix', 'UserName', NULL, 'password' 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To create the SQL User Account (you'll need to restore the SQL user in the next step):&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;
CREATE LOGIN 'UserName' WITH PASSWORD= 'password'
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_restore-the-sql-user"&gt;Restore The SQL User&lt;/h2&gt;
&lt;p&gt;To restore the SQL User Account:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;
EXEC sp_change_users_login 'Update_One', 'UserName', 'NewUserName' 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.databasejournal.com/features/mssql/print.php/1438491"&gt;Fixing Broken Logins and Transferring Passwords&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ca-cz_8qzy.asp"&gt;MSDN TSQL Reference for sp_change_users_login&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms174378.aspx"&gt;MSDN2 TSQL Reference for sp_change_users_login&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>tips</category>
  <category>sql</category>
  <category>tips</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/how-to-restore-a-sql-user-after-a-sql-database-restore/</guid>
  <pubDate>Wed, 12 Jul 2006 17:19:00 GMT</pubDate>
</item>
<item>
  <title>How To Enable SQL 2005 For Remote Access</title>
  <link>https://tim-stanley.com/post/how-to-enable-sql-2005-for-remote-access/</link>
  <description>&lt;p&gt;If you have recently installed SQL Server 2005, for security purposes, external and remote access is not enabled by default. If you try to connect to a SQL Server database from an external machine you may see one of the following errors.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL server does not allow remote connections&lt;/li&gt;
&lt;li&gt;SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified&lt;/li&gt;
&lt;li&gt;An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005,this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections.(provider:Named Pipes Provider,error:40-Could not open connection to SQL Server))&lt;/li&gt;
&lt;li&gt;Server does not exist or access denied&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="http://ad.linksynergy.com/fs-bin/show?id=*OS9xcaFZSE&amp;amp;bids=102327.10000054&amp;amp;type=4&amp;amp;subid=0" alt="" width="1" height="1" border="0" /&gt;[more]&lt;/p&gt;
&lt;h2&gt;Three steps to Enable SQL 2005 for Remote Access&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Enable the TCP/IP protocol using the Surface Area Configuration Utility&lt;/li&gt;
&lt;li&gt;Enable the TCP/IP protocol for the network adapter in the SQL Server Configuration Utility&lt;/li&gt;
&lt;li&gt;Start the SQL Server Browser&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/HowToEnableSQL2005ForRemoteAccess_B87E/SQLServerSurfaceAreaConfiguration_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToEnableSQL2005ForRemoteAccess_B87E/SQLServerSurfaceAreaConfiguration_thumb.jpg" alt="SQL Server Surface Area Configuration" width="244" height="220" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/HowToEnableSQL2005ForRemoteAccess_B87E/Remote%20Connections_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToEnableSQL2005ForRemoteAccess_B87E/Remote%20Connections_thumb.jpg" alt="Remote Connections" width="244" height="188" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/image.axd?picture=WindowsLiveWriter/HowToEnableSQL2005ForRemoteAccess_B87E/SQLServerConfigurationManager_2.jpg"&gt;&lt;img style="border: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToEnableSQL2005ForRemoteAccess_B87E/SQLServerConfigurationManager_thumb.jpg" alt="SQL Server Configuration Manager" width="244" height="126" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms156468.aspx"&gt;Microsoft - Troubleshooting Server and Database Connection Problems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.datamasker.com/SSE2005_NetworkCfg.htm"&gt;Configuring SQL Server Express 2005 for Remote Access when SQL Server does not allow remote connections&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>tips</category>
  <category>sql</category>
  <category>tips</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/how-to-enable-sql-2005-for-remote-access/</guid>
  <pubDate>Thu, 06 Jul 2006 17:14:00 GMT</pubDate>
</item>
<item>
  <title>How To Recover Hard Deleted Outlook Items</title>
  <link>https://tim-stanley.com/post/how-to-recover-hard-deleted-outlook-items/</link>
  <description>&lt;p&gt;If you have accidentally pressed SHIFT-DELETE in Outlook 2003 and erased an important item and need to recover it, this is a summary of how to restore the item before it is permanently deleted. [more]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_act-now"&gt;Act Now&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_change-the-registry"&gt;Change the Registry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_recover-the-items-in-outlook-2003"&gt;Recover the Items in Outlook 2003&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_act-now"&gt;Act Now&lt;/h2&gt;
&lt;p&gt;Don't panic (just yet). The Exchange server on where your item was stored most likely still has your item. All you need to do is coax the Exchange Server into restoring your information into your folder where the item originally existed. Typically, the default retention time in Exchange 2003 is configured for seven days.&lt;/p&gt;
&lt;p&gt;To configure the Microsoft Exchange 2003 retention time on the Exchange 2003 server:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the Exchange System Manager, expand the Administrative Group, Server, and Storage Group&lt;/li&gt;
&lt;li&gt;Select the Mailbox Store, right click, select properties.&lt;/li&gt;
&lt;li&gt;Select the limits tab on the Mailbox Store Properties.&lt;/li&gt;
&lt;li&gt;Set the Deletion settings (Keep deleted items for (days).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToRecoverHardDeletedOutlookItems_8E1A/ExchangeProperties_3.gif" alt="ExchangeProperties" width="404" height="466" border="0"&gt;&lt;/p&gt;
&lt;h2 id="h2_change-the-registry"&gt;Change the Registry&lt;/h2&gt;
&lt;p&gt;The following registry value when set on the client computer will allow you to use Outlook 2003 to recover the hard deleted item.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-markup"&gt;
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Exchange\Client\Options] 
"DumpsterAlwaysOn"=dword:00000001 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can obtain a copy of the &lt;a href="http://www.tsisys.com/RecoverOutlook.reg.txt"&gt;registry file&lt;/a&gt; that has these values set by downloading it and saving the extension as .reg.&lt;/p&gt;
&lt;h2 id="h2_recover-the-items-in-outlook-2003"&gt;Recover the Items in Outlook 2003&lt;/h2&gt;
&lt;p&gt;Now the registry is configured on the Outlook 2003 client to allow recovering items, you can proceed with high hopes of recovering that needed item.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Restart Outlook 2003.&lt;/li&gt;
&lt;li&gt;Select Tools&lt;/li&gt;
&lt;li&gt;Select Recover Deleted Items (which should appear after the previous registry change).&lt;/li&gt;
&lt;li&gt;You can now select the item which was hard deleted and restore it to it's original folder.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToRecoverHardDeletedOutlookItems_8E1A/OutlookRecover_3.gif" alt="OutlookRecover" width="211" height="386" border="0"&gt;&lt;/p&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://support.microsoft.com/?kbid=246153"&gt;Microsoft - How to recover items that have been hard deleted in Outlook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.microsoft.com/default.aspx?kbid=178630"&gt;Microsoft - How to use Exchange Server 5.5 or Exchange 2000 Server to recover items that are not first transferred to the Deleted Items folder in Outlook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/228934/"&gt;Microsoft - XCLN: Understanding Deleted Item Recovery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>tips</category>
  <category>microsoft</category>
  <category>office</category>
  <category>outlook</category>
  <category>tips</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/how-to-recover-hard-deleted-outlook-items/</guid>
  <pubDate>Tue, 16 May 2006 14:06:00 GMT</pubDate>
</item>
<item>
  <title>How To Enable HTM Server Side Include Parsing in IIS</title>
  <link>https://tim-stanley.com/post/how-to-enable-htm-server-side-include-parsing-in-iis/</link>
  <description>&lt;p&gt;In order to make web sites manageable, using some sort of include file processing is usually used. IIS is configured to support include processing (Server Side Includes or SSI) for ASP, ASP.NET, .SHTM and .SHTML files, but it is not configured by default to process include files on .HTML or .HTM files. This article is a summary of how to configure IIS to support include processing for those file types.&lt;/p&gt;
&lt;p&gt;[more]&lt;/p&gt;
&lt;div id="tocautogen"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#h2_iis-mmc"&gt;IIS MMC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_configure-mappings"&gt;Configure Mappings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_add-extension-mappings"&gt;Add Extension Mappings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_samples-using-includes"&gt;Samples Using #includes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_best-practices"&gt;Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#h2_references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="h2_iis-mmc"&gt;IIS MMC&lt;/h2&gt;
&lt;p&gt;The Internet Information Services Microsoft Management Console can be run using the Start menu: &lt;br&gt;Start-&amp;gt; Control Panel -&amp;gt; Administrative Tools -&amp;gt; Internet Information Services &lt;br&gt;The command line listed below will also launch the IIS MSC.&lt;/p&gt;
&lt;pre&gt;%SystemRoot%\System32\inetsrv\iis.msc 
&lt;/pre&gt;
&lt;p&gt;IIS MMC console:&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToEnableHTMServerSideIncludeParsingin_A4B5/IISMMC_3.jpg" alt="IIS MMC console image" width="524" height="236" border="0"&gt;&lt;/p&gt;
&lt;h2 id="h2_configure-mappings"&gt;Configure Mappings&lt;/h2&gt;
&lt;p&gt;To configure the IIS Web Site Mappings:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the IIS MMC&lt;/li&gt;
&lt;li&gt;Select the Web Site to configure.&lt;/li&gt;
&lt;li&gt;Right click, select properties.&lt;/li&gt;
&lt;li&gt;Select the Home Directory tab.&lt;/li&gt;
&lt;li&gt;Select the configuration option&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Web Site Properties&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToEnableHTMServerSideIncludeParsingin_A4B5/WebsitePropertiesHome_3.jpg" alt="IIS Website Properties Home" width="476" height="469" border="0"&gt;&lt;/p&gt;
&lt;p&gt;Configuration&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToEnableHTMServerSideIncludeParsingin_A4B5/Configuration_3.jpg" alt="IIS Application Configuration" width="410" height="459" border="0"&gt;&lt;/p&gt;
&lt;h2 id="h2_add-extension-mappings"&gt;Add Extension Mappings&lt;/h2&gt;
&lt;p&gt;If server side includes are configured when IIS is setup, the file extension types .shtm and .shtml are configured in IIS to parse and process any #include statements.&amp;nbsp; This same extension mapping needs to be completed for .htm and .html file types.&lt;/p&gt;
&lt;p&gt;If you look at .htm and .html file types, you can see that processing is enabled on the GET and POST verbs. To add and configure an extension mapping for .htm and .html files, from the Mappings tab:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select Add&lt;/li&gt;
&lt;li&gt;Press Browse and go to the location in %SystemRoot%\System32\Inetsrv&lt;/li&gt;
&lt;li&gt;Select the ssinc.dll and press open to use this executable&lt;/li&gt;
&lt;li&gt;In Extension, add .htm&lt;/li&gt;
&lt;li&gt;In Verbs, select Limit to: GET, POST&lt;/li&gt;
&lt;li&gt;Press OK&lt;/li&gt;
&lt;li&gt;Perform the same steps for .html files.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Extension Mapping:&lt;/p&gt;
&lt;p&gt;&lt;img style="border-width: 0px;" src="/image.axd?picture=WindowsLiveWriter/HowToEnableHTMServerSideIncludeParsingin_A4B5/ExtensionMapping_3.jpg" alt="ExtensionMapping" width="433" height="254" border="0"&gt;&lt;/p&gt;
&lt;h2 id="h2_samples-using-includes"&gt;Samples Using #includes&lt;/h2&gt;
&lt;p&gt;Within a valid HTML document, when you utilize #include directives, all the contents of the included file will be placed in the file when it is processed by IIS. An example #include directive:&lt;/p&gt;
&lt;pre&gt;&amp;lt;!-- #include file="Include.Header.inc.htm" --&amp;gt;  &amp;lt;!-- #include virtual="/Path/Include.Header.inc.htm" --&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Example contents of "Include.Header.inc.htm"&lt;/p&gt;
&lt;pre&gt;&amp;lt;!-- Header Begin --&amp;gt;  &amp;lt;div class="BannerPanel" id="BannerPanel"&amp;gt;   &amp;lt;div class="Banner"&amp;gt;  &amp;lt;div class="BannerURL"&amp;gt;   &amp;lt;a href="/" title="TSI Systems LLC. Home"&amp;gt;TSI Systems LLC.&amp;lt;/a&amp;gt;  &amp;lt;/div&amp;gt;   &amp;lt;/div&amp;gt;  &amp;lt;/div&amp;gt;  &amp;lt;!-- Header End --&amp;gt;
&lt;/pre&gt;
&lt;p&gt;If you are using a UNIX / Linux based or Apache system, you will need to create a .htaccess file and place the following contents in it:&lt;/p&gt;
&lt;pre&gt;AddType text/x-server-parsed-html .html  AddType text/x-server-parsed-html .htm 
&lt;/pre&gt;
&lt;h2 id="h2_best-practices"&gt;Best Practices&lt;/h2&gt;
&lt;p&gt;The configuration changes described here apply to both IIS 6 on Windows XP and Windows 2003 Server.&lt;/p&gt;
&lt;p&gt;Turning on .htm processing slows down IIS to some degree so if you are including large files you may want to evaluate the impact to performance.&lt;/p&gt;
&lt;p&gt;File types for .SHTM and .SHTML are more industry standard for include processing, but the Windows XP, Office and Visual Studio systems do not come configured by default to have Open / Edit handlers from the file system so I prefer the .htm extension for include processing.&lt;/p&gt;
&lt;p&gt;I often use a naming convention "Include.Name.inc.htm" to help clearly indicate this file is a file included from other .htm files.&amp;nbsp; Visual studio will complain with validation errors that these HTML snippets or included files are not a valid HTML or XHTML document (which they are not, they are only snippets to be included into other files).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ASP and ASP.NET could file types could be used for #include processing as well. However in my experience, if the only goal is managing #include processing and no other server side logic needs to be performed, it is much faster to have .htm #include processing and to not incur the overhead of ASP.NET compiling the application each time it gets removed from the application pool. I know there are strategies to deal with making ASP.NET 2.0 sites "pre-compiled" and to place them into application pools other than the default application pool, but I believe that is emphasizing the point I'm trying to make. Why add additional overhead in deployment headaches if it's not really necessary.&lt;/p&gt;
&lt;p&gt;If you are hosting with an external hosting services, most web hosting providers either allow you to configure your hosting environment to turn on #include processing, or they will do it under a change or support request.&lt;/p&gt;
&lt;p&gt;Lastly, using #include processing on a site gives one a little more flexibility in moving from a Windows hosted server to a Linux / Unix based or Apache server if needed. While for the most part ASP and ASP.NET based #include processing schemes require a Windows host.&lt;/p&gt;
&lt;h2 id="h2_references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q203064"&gt;IIS: Notes on Server-Side Includes (SSI) syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wilsonweb.com/articles/ssi.htm"&gt;Server Side Includes (SSIs) and Navigation Systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ssi-developer.net/ssi/"&gt;Apache Server Side Includes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>email@nospam.com</author>
  <category>web-development</category>
  <category>iis</category>
  <category>iis6</category>
  <category>web-development</category>
  <guid isPermaLink="false">https://tim-stanley.com/post/how-to-enable-htm-server-side-include-parsing-in-iis/</guid>
  <pubDate>Sun, 12 Feb 2006 15:40:00 GMT</pubDate>
</item></channel>
</rss>