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

<channel>
	<title>GeekTieGuy &#187; Software development</title>
	<atom:link href="http://www.geektieguy.com/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.geektieguy.com</link>
	<description>News and views from the geek tie guy.</description>
	<lastBuildDate>Sat, 04 Feb 2012 18:16:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>A brief history of five TouchSmart generations&#8211;pioneering ideas for Windows 8</title>
		<link>http://www.geektieguy.com/2011/09/26/a-brief-history-of-five-touchsmart-generationspioneering-ideas-for-windows-8/</link>
		<comments>http://www.geektieguy.com/2011/09/26/a-brief-history-of-five-touchsmart-generationspioneering-ideas-for-windows-8/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 17:15:00 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[HP TouchSmart]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Windows 8]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2011/09/26/a-brief-history-of-five-touchsmart-generationspioneering-ideas-for-windows-8/</guid>
		<description><![CDATA[A few weeks ago I attended Microsoft’s BUILD conference to get ready for what’s coming in Windows 8. As I was sitting in the first day’s keynotes and big picture sessions, I couldn’t help but think back on the work HP has done with its TouchSmart software and notice areas where the TouchSmart software pioneered [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago I attended Microsoft’s <a href="http://www.buildwindows.com" target="_blank">BUILD</a> conference to get ready for what’s coming in Windows 8. As I was sitting in the first day’s keynotes and big picture sessions, I couldn’t help but think back on the work HP has done with its TouchSmart software and notice areas where the TouchSmart software pioneered ideas that Microsoft is now building into Windows 8 for the new Metro style of programming and the new touch-first Start screen. I decided to dig a little deeper and give you a brief tour of the history of TouchSmart and highlight some of the ideas now in Windows 8 that we put into the TouchSmart software a long time ago. I’ll put a [+Win8] marker by the ideas as I go along. Let’s get started!</p>
<h2>TouchSmart 1, aka SmartCenter, aka LaunchPad (January 2007)</h2>
<p>The first version of TouchSmart was not called that. It was named SmartCenter and shipped with the very first modern all-in-one touch-enabled PC, the HP TouchSmart IQ770.</p>
<p><img src="http://t2.gstatic.com/images?q=tbn:ANd9GcSVeH0JQN-rnjtLp8t9UGHxyx86YGJMJRHTymkZWVrPCQOWh-0M" alt="" width="128" height="214" />                <img src="http://t1.gstatic.com/images?q=tbn:ANd9GcS-bl_301aTIEQbnQaFz9g95iWebNXJXIAVAvYC5i6v8MciYDonpg" alt="" width="225" height="225" /></p>
<p>This machine was one of the so-called “Dream PCs” for Microsoft’s introduction of Windows Vista in January of 2007. <a href="http://www.geektieguy.com/2008/04/04/inside-the-hp-touchsmart-pc-software-hp-smartcenter-part-1/" target="_blank">I’ve written about this version of SmartCenter before</a>, so I won’t repeat much of that here.</p>
<p><strong>Touch-first [+Win8]</strong></p>
<p>Of course, the main point of even embarking on a project such as the SmartCenter software was that Windows wasn’t even remotely ready for touch interactions. Every app on the Windows Desktop requires the precision that the mouse pointer provides. Fingers and touch can’t hit the tiny controls accurately enough. So SmartCenter was designed with that in mind, and as a result had large targets all throughout its user interface. Here are some sample screenshots:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/SmartCenter_1_Home.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="SmartCenter_1_Home" src="http://www.geektieguy.com/wp-content/uploads/2011/09/SmartCenter_1_Home_thumb.png" alt="SmartCenter_1_Home" width="304" height="192" border="0" /></a><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/SmartCenter_1_Personalize_1.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="SmartCenter_1_Personalize_1" src="http://www.geektieguy.com/wp-content/uploads/2011/09/SmartCenter_1_Personalize_1_thumb.png" alt="SmartCenter_1_Personalize_1" width="304" height="192" border="0" /></a><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/SmartCenter_1_Personalize_2.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="SmartCenter_1_Personalize_2" src="http://www.geektieguy.com/wp-content/uploads/2011/09/SmartCenter_1_Personalize_2_thumb.png" alt="SmartCenter_1_Personalize_2" width="304" height="192" border="0" /></a><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/SmartCenter_1_Personalize_3.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="SmartCenter_1_Personalize_3" src="http://www.geektieguy.com/wp-content/uploads/2011/09/SmartCenter_1_Personalize_3_thumb.png" alt="SmartCenter_1_Personalize_3" width="304" height="192" border="0" /></a><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/SmartCenter_1_Weather_2.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="SmartCenter_1_Weather_2" src="http://www.geektieguy.com/wp-content/uploads/2011/09/SmartCenter_1_Weather_2_thumb.png" alt="SmartCenter_1_Weather_2" width="304" height="192" border="0" /></a><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/SmartCenter_1_Weather_3.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="SmartCenter_1_Weather_3" src="http://www.geektieguy.com/wp-content/uploads/2011/09/SmartCenter_1_Weather_3_thumb.png" alt="SmartCenter_1_Weather_3" width="304" height="192" border="0" /></a></p>
<p>Note that all buttons, checkboxes, radio buttons, scrollbars, etc. are large enough to be easily tapped with a finger. Note also that, for example, the on-screen keyboard that is used for entering a ZIP code in the Weather app defaults to the correct layout, i.e. the numeric one.</p>
<p><strong>Live app data in shortcuts [+Win8]</strong></p>
<p>This idea wasn’t really all that new, of course. Snippets of live app data displayed in a mini-view of sorts had been introduced with Windows Sidebar gadgets and other widget-like UIs on other operating systems, but SmartCenter was the first to use live data as part of the shortcut that launches an app. You could say the shortcuts were more like mini-versions of the full app. Live data is of course hard to demo with screenshots, so here is a small video clip of the SmartCenter home screen (or start screen, if you will), showing shortcuts that update their information as time passes:</p>
<p><iframe style="background-color: #fcfcfc; width: 320px; height: 199px; padding: 0px;" title="Preview" src="https://skydrive.live.com/embedphoto.aspx/.Public/Videos%20for%20Blog%20posts/TouchSmart%20history/TouchSmart1.4^_3.mp4?cid=8bf3893855b5d3ae&amp;sc=documents" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></p>
<p>This major version of the SmartCenter software was delivered with four total releases: 1.0, 1.1, 1.2, and 1.4. Towards the final delivery of version 1.0, it became clear that a standardized way of getting the live information from the apps was needed. This became a major area of investigation and investment for the next major version of the software.</p>
<p>&nbsp;</p>
<h2>TouchSmart 2 (June 2008)</h2>
<p>The second generation of TouchSmart software, 2.x, was introduced with IQ500/IQ800 series hardware. These two hardware models marked the beginning of the monitor-like appearance of the TouchSmart PCs. The IQ770 was a “multi-volume” chassis – these new models had a “single volume” design, supported by the “easel” style feet that were used in the follow-on generation as well.</p>
<p><img src="http://t3.gstatic.com/images?q=tbn:ANd9GcSoRytlIFNYpKmd5pBl6GfxNHzou74v1yKkgsW41RuRTWqGHgCcKA" alt="" width="223" height="226" />          <img src="http://t2.gstatic.com/images?q=tbn:ANd9GcQw7L7CkRZpY9t-PD10yDYzvjnpWBL2k3c9efoAWCBGf6qwC35kAA" alt="" width="233" height="217" /></p>
<p>The 2.x series of software was released in three versions: 2.0, 2.5 and 2.8.</p>
<p><strong>Fixed layouts for apps [+Win8]</strong></p>
<p>With SmartCenter 2.0, we introduced the concept of fixed sized layouts for the TouchSmart apps. We initially picked three: small, medium and large. You can see two of the three illustrated by this screenshot:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/image.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.geektieguy.com/wp-content/uploads/2011/09/image_thumb.png" alt="image" width="644" height="404" border="0" /></a></p>
<p>The Tutorials, Canvas and Calendar apps are shown in medium size, while the remaining apps are shown in small size. By tapping on an app, you would go to the large size:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/image1.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.geektieguy.com/wp-content/uploads/2011/09/image_thumb1.png" alt="image" width="644" height="404" border="0" /></a></p>
<p>This layout is purposely not called full screen, since there is a reserved area at the top of the screen for navigation, app name/time and music playback controls.</p>
<p><strong>Tiles concept [+Win8]</strong></p>
<p>In order to make it clear that the app representations in SmartCenter were not just icons, we decided to call them tiles, or rather “live tiles.” This term was used in the developer documentation that was produced to help other people plug their apps into SmartCenter, and so we had “small tiles,” “medium tiles” and “large tiles.” For each tile size we gave guidance about how to use it appropriately. We introduced the term “layouts” to suggest that each tile size should use a different layout of basically the same content or information. As you notice from the screenshots above, when the Weather tile is small, it shows only basic information. In the large tile, the information is more full-featured and also provides access to settings for the Weather app. The medium tile for Weather looks like this:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/Medium.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="Medium" src="http://www.geektieguy.com/wp-content/uploads/2011/09/Medium_thumb.png" alt="Medium" width="644" height="404" border="0" /></a></p>
<p>As you can see, this layout for Weather includes only the current conditions and the forecast for the day.</p>
<p>With TouchSmart 2.0, a big investment was made to produce media consumption applications: Music, Video and Photo (often shortened to “MVP”) as well as a WebCam and DVD app. The screenshot above shows other apps that were published later (Netflix and Recipe Box, for example), but that just goes to show that following development guidelines has benefits: newer apps can work with older SmartCenter versions…</p>
<p>Other changes from the 1.0 version include the top and bottom row of “tile scrollers” and the music playback control set (aka. “media plate”) that I already mentioned. The tile scrollers had two different behaviors, depending on how full they were. If enough tiles were present, the scroller would become an infinitely looping container. If not enough tiles were present, it would have “snap-to” endpoints.</p>
<p>The TouchSmart 2.0 software was unveiled at a big press event in Berlin, Germany. Several of my colleagues were invited to attend to make sure everything went smoothly from a technical perspective. The most nerve-wracking part was that the TouchSmart IQ500 was to come out of a pedestal on stage after sitting inside said pedestal for an extended period of time before its unveiling. People were not sure the thermals were designed to handle as little exchange of air as this posed. Here’s a video from the introduction to give you a better idea of what I’m talking about (skip towards 1:18 or so to see the pedestal and the TouchSmart lifting out of it):</p>
<div id="scid:53357c8b-5919-4e32-8c25-305d27c17a37:9e415f70-27e7-4be9-9a2d-e122c944cd95" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;"><object width="425" height="350" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/6K3XBC6gH1g&amp;rel=0" /><param name="wmode" value="transparent" /><embed width="425" height="350" type="application/x-shockwave-flash" src="http://www.youtube.com/v/6K3XBC6gH1g&amp;rel=0" wmode="transparent" /></object></div>
<p>As you can see, everything worked out pretty well. This was the biggest introduction ever made for a TouchSmart PC line. No event after that had that much effort put into it.</p>
<p>&nbsp;</p>
<h2>TouchSmart 3 (October 2009)</h2>
<p>With the third generation of SmartCenter, we piggybacked onto the 600/300 series of hardware. The enclosures still used the easel stand design with three feet for support, and the exterior was tweaked a bit along with the screen aspect ratio (now 16:9 instead of 16:10).</p>
<p><img src="http://t3.gstatic.com/images?q=tbn:ANd9GcR1kS5T4LL4BiWT-bNXlaOpDLkvFw2lraVj6w5fTCSs9BvhH81sLA" alt="" width="178" height="283" />          <img src="http://t3.gstatic.com/images?q=tbn:ANd9GcT-UPF_83O9CdfL2QdhKj43zOcZ5FU3S94be845fjQRQfFBCyfH2Q" alt="" width="267" height="189" /></p>
<p>Generally, though the concept was largely the same, except for the software. A big investment was made to produce more apps for the TouchSmart software suite, and this brought us apps like Canvas, Twitter, Hulu, Live TV, Link, Movie Store, Recipe Box and a bunch of others. The TouchSmart software development guidelines were augmented with more of a proper SDK with app samples, installer samples and more guidance.</p>
<p><strong>New layout</strong></p>
<p>SmartCenter 3.0 introduced another layout that we called wide-interactive. You see, in SmartCenter 2.x there was no way to interact with the medium sized tiles in the upper tile scroller (except for in the browser, but that’s a small detail). In this version we wanted to provide interaction with the app in the upper scroller. In order to do that properly we needed a bigger size tile and a new layout to have enough space for interaction to make sense. Here’s a screenshot of 3.0 (running on a 16:10 screen, not the aspect ratio it was designed for – so circular elements are “squished”):</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/image2.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.geektieguy.com/wp-content/uploads/2011/09/image_thumb2.png" alt="image" width="644" height="404" border="0" /></a></p>
<p>In SmartCenter 3.0 the touch scrollers no longer “looped” infinitely, but each had a “snap to” end regardless of how many tiles were present; each wide-interactive tile was given a colored title bar to add a little splash of variety and visual interest. In addition, the “media plate” and other control elements on the home screen were redesigned to appear a bit lighter than before. Also, standard button glyphs were introduced for closing and minimizing SmartCenter. Oh, and the clock was moved around and given a day of the week display. Phew – at least the Personalize button stayed almost in place…</p>
<p>The final big change was that tiles in the bottom scroller no longer used the small layout. They were simply icons to launch the app into large layout directly. This was done to improve performance and load less stuff at the startup of SmartCenter.</p>
<p>&nbsp;</p>
<h2>TouchSmart 4 (September 2010)</h2>
<p>Okay, so here we are, almost at the last chapter of this brief history (which is turning out not so brief after all…) TouchSmart 4.0 was introduced with the TouchSmart 310 (and 610) series of hardware. These departed from the easel-type stand and went to a single-foot design (I know there’s a better term for it, I just can’t think of it at the moment).</p>
<p><img src="http://t2.gstatic.com/images?q=tbn:ANd9GcQHWV_WEWdK950GupTCW0B-y8siZSw69WByfokdnZpbJNP6u6pz" alt="" width="105" height="226" />          <img src="http://t3.gstatic.com/images?q=tbn:ANd9GcT-rqxf9gb5s2ARWvhjq5mVK9FuthTyoNOCz09cTxCdgmQ1Ez6TYw" alt="" width="225" height="225" /></p>
<p><img src="http://t0.gstatic.com/images?q=tbn:ANd9GcRQ9aIpbPXpAnh8bKtjyeSButfLXCPBQqnwz5GWdJxf4Nqpifz7" alt="" width="155" height="324" /><img src="data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhQQEBUQEhAVFRQVFhgVFhQYFREUFBIVFxAWFBQVFRYXHiYeGBsjGRUUHy8gJScpLCwtFR8xNTAqNSYrLCkBCQoKDAwNDQwPDSkYFBgpKSkpKSkpKSkpKSkpKSkpKSkqKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKf/AABEIAOwA1gMBIgACEQEDEQH/xAAcAAEAAwADAQEAAAAAAAAAAAAABAUGAQMHAgj/xABFEAABAwEEBQgGCAUEAgMAAAABAAIDEQQFITEGEkFRcRMiMmGBkaGxByNSwdHwFDNCYnKywuEWQ1OS8RWCk6Ikgwg0c//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/8QAFREBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhEDEQA/APcUREBERAREQEREBERAREQFEtt5sh6Rx3ClVLWHveQmd1Tt8NiDYWS3MlFWGtMxkRxCkLG2W0mMiVubcHD2m7QVr4pQ5ocMQRUcCg+0REBERAREQEREBERAREQEREBERAREQEREBERAREQFiL6FJ3cStusVfw9e752lB82Vw25HDvwV/o3PzHRHNhw4H9696z0kdLPrbS6ndl4qwui00tDHbJG07afEDvQalERAREQcOdQVKgOv2IGmv1VxoO1RdJrdqx6gzdnw+fcs3ZG4oN6CuVW3BMXQgH7BLOwHDwIVkgIiICIiAiIgIiICIiAiIgIiICIiAsbpEPXns962Sx+kw9cezy/dB0SY2ThIPzD4rrs8tGMftjf79b3Lsb/9WTqcD4tXRZ+jK3g7uOPgg3rTUVXKiXTLrQRn7oHaMD5KWgLhzqCp2LlVOkNu1I9UHF3l8+SDOXra+VlJ2ZD5+cgvqxR4rosVmMjqd/UFIbKNd2r0WNPaTgCqL/Rn6kne9x8ArdV9wRatnZ11Pe408KKwUBERAREQEREBERAREQEREBERAREQFkdKB6359lq1yyelI9Z87moIcGNmmHVXw/ZdNl+tI9prh3iq77AKxTD7h/K5RYX0lYfw+Ip70Gr0YkrZwNznDx1verZUOizqcqzc4HvqP0q+QcOdQVKxN9W3lZTuGA+fnJaO/wC3cnHQZny+fAFZKzQl7wN5/wAlBMYeSgL/ALT+a34+Z7FGszKRYZvcGjgP3X3e89X6o6MY1B+KnO7hQd6nXZZqzxR7IxrHjn56qDU2eLUY1vsgDuFF2IiAiIgIiICIiAiIgIiICIiAiIgIiICyulY544D58FqlmNLBzhwH6/gggXRjrjew/Piq9xoIz1MPgFPuQ88je0+YVfKOY38NO4ke5BpNH3UtErd4r4g/qWiJWVuh9LW37zP0V/Srm/LbycZG0+W3vqB2lBm78t3KSHcPkeHmVzYfVRumpj0WjeTh508VXxgvfvJPiSp95PALYxlGKnreRze4VPagiWeKsjWk1A5zjvpiT3rR6MQ115j9o0HAYn3DsWes4pG52151RwzPwW3u+y8lE1m4Y8cz41QSF8ueBmaLrtVqbG3WcaBZC9b2dM6mTRkPn59wbJkoORBX2sZdDiyRhBzeARvqaHwJWzQEREBERAREQEREBERAREQEREBZnSwYjgP1rTLN6VjLgPM/FBU3K71o4FRZ280dRcO6Ry77p+sb2+RS35YADnOwG/WNSglXc+k8B3ho8CPeuL/t/KPoMtnDZ4En/coE1o1Gwu+aB+PnTtXwSXOrtJQTrrYGh0zsmA99PnvUS0OOR6TjV34nbOzAdin2vmNZDu57+vHmjtd4NUKy4vLzk0V4nYO9BZ3VZNedjPsxCp4jH81O5aS3Xg2FtXHgN6oLqtYgidIcXyHAdQr76lVVrtjpXazig7LwvJ0zqk4bB8/PmeuCFSWWRsbQ+U0r0W7TxXzFMaa9AAcGNG3rO9UWF02bXnA2R84/iyaPf2FadQLnsHJR49J3Odx3dnxU9QEREBERAREQEREBERAREQEREBZ3SsZfh/WPitEs/pUMB+E/nYgz92n1jePuXZbx0vxu8TVRYH0II2GqsL+laYRI3bnTMYYniMu5BmbztdeTaNh8A7Dxqf7Vorrgq/WOAbiT17Pj2LGOk1gD1nsx+e5bos1I2s2u57uAxA76dxQRLbIauJzcanbQDBorw81FtNqEbGxjpvNT5Adm3d4KLb7xGtTt7Ph8jeI90xulkMhx2NHWd3AeaC2Li6g3YAKxZE2ztD3irz0Wba7/AN9iNa2zgEjWlI5rdjesnYOvuVe5xkcSXYnpPOAA3DcNw2oOxoMzy+Q4DM7APZar247ByjuWcKNbgxvDb2efBUFgvayyytgFpjDQaautR7yM+07s+rYt9CAGjVpq0FKZUphRB9oiICIiAiIgIiICIiAiIgIiICIiAqLSgc0cD+ZpV6qPScc0cHeQKDJsVfeNvx1RkcCOqvvI/wCoUq0TarTjT3bz2CqoHy6zifkDIDyCDtghALQctfwqFe6SXuGkhpzAGOwAfJp147jl7bb6ABuY27v38uOU6SAzSNAxJFeA2koOmGNzsgS55y20WzskAskYYKOlpU+yyuZPV4lVNiLYnHVI1mjFxFQzDAU2mlTq9pWev/TlrKsg5xObya1O8kdI8DTrOIVF9e19MhBc9+JzJ6TyNgA3bhltpmsFfGlctorHHVkZ73bMSPIYby5VruUtL6uLnOOzM8ABs6hgNytbHcbgQHMIrvFPNBFuq7cdZxoAKk7gMfD3L3nQcuN3WYvrrGJpxzoRVtf9pC8vu+4za7Q2wx9HpWh4+wwHFtd5y4n8S9piiDWhrRQAAADIACgA7Eo+0RFAREQEREBERAREQEREBERAREQFS6TjmDg/8iulmtNbe2OICvOOthuGrQk7ggwd7WnYOHYDj3kf9SqCe3fZb3/D4+7PqvC8TI4gZZcRu4dXfuCxWQuxyAxLjkAMyT89dEEizWQyEBuPuV/et7RWSPVa8axbQuFC4gE1DBXHHCtQ0bTVZi8dKGxN5KAVO1+YPXQ9Lt5vU4YrPxQy2mSlHPe45YuJ/wAeHUFRLvC/nzDUZVse6pJdXMvP2u4Dqrip1waIyWj1jjycQxdK7KgzIrnxy61Yx3PZ7va2S2HlJnYx2VnOc49Y2jeTRo61RX7pDPb3iEjmk0ZZYzWMUy5V2HKEdjBRBbWvTCKzUs92xa5J1XWgipkNaasQpV5rtwaNlUslnlZIASZrdLzQK63IB32W7Nbr2cM4MMTbDWhElqIo5+bIBlqM3u2V/wAL0P0dWOCyzhkrta2yA1b0jZ6sMmpIc2yOaCTuwBpXENdodos2wQamDpX86V/tOpkD7IqQO07VfoigIiICIiAiIgIiICIiAiIgIiICIqS9r8DQWsPUXe5u8oJN53uIwQCNbadjeO89S8s0rvR07qCpxIG0nDEn5oBXirW+L1AaS5wFBXMc0HDWcTgK7zSuzcsDeulYFWQjHLXI8gfNwrua04oO17I7ONaZ2NKiMEaxrkSdg68t2tkqe8b7fPzRzWDJjcBhkTvPWctgaosFmknfQBz3uNaCpJJzPX1krWwXHBYQ19rPKTO+rsrBrueeH2usmjRvKoq7g0RktHPPq4hi6V2AoMyK58cutWsukMVnYY7vAAyfbXjWBIzELT9aevBg61XaQX+6YUtBaGDo2Rh9U2mXLOH1rhuFGDrVZZrC+1eulfyVnGGuRnTJkTdp4YDrpRB8QtktMrmQ6z3uxlme4lxHtSP2Nw6IwwwCsPpUdkYYrOdaR2Elo+07e2L2W9f7FRrde7Ws5CBnJxbR9qQ+1K7bw86ClXY76himBmYZaAuEYoA94Hq2POxhdmBiRhtqgs5rcbDGyan/AJMo1rO0ivIsrT6U4HM1qIwcyC7IN1vVPQ7oQbLCbbOCZ5xUF2LmsJqSScdZxxJWK9F+hcl6Wp942urow/WJyEsgyY0ZBjRQUGAwA2U9+a2goMlByiIgIiICIiAiIgIiICIiAiIgLhzgBU5L4mnDBrONAsLpNpyxoIBGq00xJDa7nEYuP3WgnzQXN+aQgNIDtVm01oXfALznSHTNsdQDzhhqjBw6jWvJ8CC7qHSWYv3TSSZx1CR9/J27mgGkY4Eu+9sWfZESalBKvC9pLQecaCtQ0VABO3Mmv3iS471Z3Fos+dpc7VjhHOdK4AUABrqk5jtp1q00J0XbMXTSj1cew5OdSuPUBid9R1rrv+/sTyrmuDTzIWVETaHmudkXuy4bKZKiy+nRWezuFiIY7WDTaJWFxe2hLnRt+0QaUBDW41x24+1XpRzhFrvkkNHSOJfNKdxO7c0UHUuGNntziQdWNvSkdzY2Ddu7B4KWy0x2UFtmGs84OtDhzjvEY+yPHzQfEV0Mg9Za+fIcW2cHLcZSMh93z2dF4Xk+Y1ccBg1owawbmDZx811Oqaucak4muJJ3k7VU3peYYKDPZ8SoPi8rwDBQdI/NSrX0e6Cy3naQzEMHOmk/pt3D7xyA/dV+iOic14WlsUYq92JcejE3a9+6m7gv1JorovFd1mbZ4RgMXPPSkftc74bEE667sjs0LIImBsbBqtA3de8nOqlIiAiIgIiICIiAiIgIiICIuue0NY0ue4NaMyTQBB2KtvnSCKytrI7nHosGL3HYA0LHaU+k9sTSICAMRypFS6mfJM+1xyG0heQX1pXJaHOoTR3SJNXvG5zt33RQb9bNBstMPSY6QloOGQY12A/G9uZ+608XDJee2u3yTuq93UBgABuAGAHUO2q6I4ScSrCz2RB0wWZWdmsakWSwVpQK9isTIG68zgB7O09X7DFUfF7XubLY4rJHUyy1e5oxdRx5ooN4Hcs026mRnXtbi52Ygacf/Y4dHgMVNtd8Fz3uhaWl/SlP1hGwA/YaBQADcoLLPjU4neoOy2W58oDaBkbejG0arG9m/rXQ2NdzgAFLgsLWRm0Wk6kTcafafuFM8d2Z6s0Ee1XHKbFNbQA2GKgDnEN5R5cG6rASNalamm6gqVk7guKW2TsijYXyyGjRu3uduAGNdgCudINJpryfHE1pbBHRkFnbvOAcQOk9xPjgvdvRj6Pm3ZBykgBtUoHKOz5NuYiadw2naeoBBZ6DaFRXXZxEyjpHUMstMXu3Dc0bB25laREQEREBERAREQEREBERARdFttrIWGSRwa1oqSV5Vph6TnOqxjjFGcgKctKN+5jTvPZrZINxpDptFZasZ6yWh5oIo2mZc7IAf5IXj2k/pEknJBeHnY0fUs4DDlD1mjep6y95X5JPVo5rK11RXE7C4nF56zgNgCiRQVQczzvlcXPcSTtJ3Zdg3ZDZRdkNmUiCyqysthVEezWNXVkuza7mjeVwx7Y8hrHwR0b5MXGg3ft7ygkyXq2IasLan2j8+VO1VU7HSHWkcT8+HYpbmNYFWy28veIoWOkkd0Y2Nc954Nbig7QwDBS7DdcloeIoYy952DYN5OTR1nBaHRr0SWmYia3yCzx58k0tdKR952LI/wDseC9Ku+0XfYI+Sjms8Q21lj1nHe4l2s49ZUHnV56HxXbAJbS8PmdVxz5OFjcyNr3VoKnsG1eU37fj7bLrGoib9Wz9Tt5K9P8ATJpfHIPo8Ra8PaBrChBYaOqDuy8F5hdFhEkrYyQ1tRrOJo0NrtOwIPVPQjoQCf8AUZm9HmwA76c6TjTAcV7Os3c2kd3wwsgjttn1WNDR62Ntd5xO01ParmC94ZOhPE78MjHeRQS0XFVygIiICIiAiIgIiICIiDxn0vaXScv9HjNGRCrjnztrgN4yHhnUeUF7pXB1ag85xNS6p9onb48V7r6QfRq61ym0Q0Jd0oyQDXe0nA8CRmd9F5narjbZpDDM8RyNxLCY2uociASajrCCkisim2eyVyFeHxyUh1ss8eePWa08cPBdsWkcGQJefZaCfAYqjthsNOkadQ+K5lla3JSbLcVvtzv/ABrHK1mHOlHIMHAyULh+EFae6/QhM+htdtDRtZC0uP8AySYf9EGTsN4RgO1iARjU7uJVnBdlptDDJHCWxAazp5SIYGtGbi9+Y62gr1O4fR3YbFR0dna6QfzZPWyV3guwb/tAXk/pjvi1Wqd9l54gjfQRta/UkoAdd5HTNchWgplWpUGRvDSCBryC82gA0q0viidwpSRw66sruXMPpBtEbCyzD6Ow5iCNsVfxSAa7uLnFUcdzSbWvH4Y3DxpVdoubfHKeLH/BBzbNJZpDWR5cd75Nc+JJUX/WH7C0cA74Kb/ptP5L/wCx/wAENhP9J/8Axu+CCumvVz3Bz6uo0NGeAGQxXEd5FoNMCequHFWH0N39J/8AY74Lg2R/9J/9jvgghi93+2O53wX229X72d9PMBSPobv6Tv7HfBPoBP8AJd/Y74IO6x6V2iI+rke3/wDOUj8rlf2L0u3jD/PlI++1sg73tJ8Vmjddf5L/AO1/wXAukjoslbwa8eQQek3b/wDIWdtBLDDJvprxu7wSPBbnRb0z2S2SCF4MD3YN13NMbnbG6+FCdlQK8V+fX3bKdkjvxRud+ZpXUbnkP8k9jJG+WHgg/Y6LzP0M3xanxOs9oLnsiaCx8gIkbjTk6mhe2mRzFKVpSnpiAiIgIiICIiD5e2ooslfXozstrdrzM1jvxwWvRBjbF6L7LDTUaBTLAK+slyckKMkc3h8FaIg6Y2OGbtbiKHwXaFyiAqy36PxTGrm4qzRBmJNCY9i6joa3cFrEQZL+D2+yF8nQ5vsrXogx/wDBrfZXH8Gt9lbFEGN/g1vsp/BzfZWyRBjf4PHshcjQ0blsUQZNmhTNqlxaHxDYtCiCLYrtZEOaFKREBERAREQf/9k=" alt="" width="214" height="236" /><img src="http://t3.gstatic.com/images?q=tbn:ANd9GcRsb905ukxjDnuMuFW59XdAxsRErnQn5bwJYWBNv6Cosj8fucM40g" alt="" width="292" height="172" /></p>
<p>TouchSmart 4 didn’t see much investment in new apps, but focused on new capabilities provided by the SmartCenter framework.</p>
<p><strong>Infinite Canvas [+Win8, sort of, on the Metro Start screen]</strong></p>
<p>A major goal of the SmartCenter framework software had been to provide an almost limitless space for apps to live in. With SmartCenter 4.0 that goal was finally realized. Not only did the framework provide for an infinitely expanding space for hosted apps to live in, it also did away with the upper tile scroller and let the apps be positioned freely on the canvas. This is what TouchSmart 4.0 looks like after initial startup:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/image3.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.geektieguy.com/wp-content/uploads/2011/09/image_thumb3.png" alt="image" width="644" height="404" border="0" /></a></p>
<p>And once again, things were moved around on screen: The clock from lower left to lower right (and it was given a function: click to show a mini-calendar), personalize from lower right to lower left (and the word personalize removed). The “media plate” music playback controls were removed and put into the music app instead. The volume control was separated out from the media plate and put in the upper left. The bottom carousel was redesigned and had the infinite looping re-introduced (to allow for a bit of visual and interactive playfulness). Tapping a tile launches the corresponding app:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/image4.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.geektieguy.com/wp-content/uploads/2011/09/image_thumb4.png" alt="image" width="644" height="404" border="0" /></a></p>
<p>Apps can be moved around freely and the carousel shows a colored highlight for each running app:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/image5.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.geektieguy.com/wp-content/uploads/2011/09/image_thumb5.png" alt="image" width="644" height="404" border="0" /></a></p>
<p>If you look at the above shot closely, you&#8217;ll notice the Weather app in what looks like another layout. What&#8217;s happening there is not a new layout, though. It&#8217;s simply the wide-interactive layout, shrunk down to an &#8220;inactive&#8221; size. Thus we called it &#8220;shrunk layout&#8221; or &#8220;shrunk view&#8221;.</p>
<p>The button next to personalize in the lower left can be used if the app you’re looking for in the carousel is hard to find: QuickLaunch is sorted alphabetically:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/image6.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.geektieguy.com/wp-content/uploads/2011/09/image_thumb6.png" alt="image" width="644" height="404" border="0" /></a></p>
<p><strong>Parallax background [+Win8, sort of, on the Metro Start screen]</strong></p>
<p>Scrolling the canvas (or panning it, if you prefer) is done by grabbing empty space (with mouse or touch) and moving from side to side. To add a little visual interest to this, and to demonstrate the departure from the 3.0 tile scrollers, we added a parallax effect to the background to give you the illusion of looking into the distance on your screen. Several sets of parallax backgrounds were developed for variety’s sake, to be picked in the personalize area.</p>
<p><strong>Magnets</strong></p>
<p>Another major feature of SmartCenter 4.0 was the introduction of something we called “magnets”. These represent active content that originally came either from an app or from SmartCenter itself (in the case of Graffiti magnets). Magnets eliminate the need to start an app when you want to enjoy a favorite piece of content, be it a photo, video or some music you want to keep handy for quick enjoyment. Here are a few magnets placed on the canvas (they can be “pinned” so they always stay visible or “unpinned” to scroll with the canvas):</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/image7.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.geektieguy.com/wp-content/uploads/2011/09/image_thumb7.png" alt="image" width="644" height="404" border="0" /></a></p>
<p>Here’s what it looks like after panning a bit (while playing the fireplace video):</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/image8.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.geektieguy.com/wp-content/uploads/2011/09/image_thumb8.png" alt="image" width="644" height="404" border="0" /></a></p>
<p>You can see the pinned magnets haven’t moved and the background looks slightly different (the islands have moved at different paces to give the illusion of depth as they’re moving).</p>
<p>Okay, let’s see what it looks like in action:</p>
<p><iframe style="background-color: #fcfcfc; width: 320px; height: 187px; padding: 0px;" title="Preview" src="https://skydrive.live.com/embedphoto.aspx/.Public/Videos%20for%20Blog%20posts/TouchSmart%20history/TouchSmart4.0^_2.mp4?cid=8bf3893855b5d3ae&amp;sc=documents" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></p>
<p>&nbsp;</p>
<h2>TouchSmart 5 (September 2011)</h2>
<p>And that brings us to the latest generation of SmartCenter (as of this date), i.e. 5.0. This version of the TouchSmart framework software was brought to market with the just recently introduced 520/420/320 series of TouchSmart PCs. The exterior of the machines has been updated once more to keep up with design trends, but otherwise the single-volume enclosure is still the chosen form.</p>
<p><img src="http://t3.gstatic.com/images?q=tbn:ANd9GcT2FOVSBPmi3M2h9WJbvKnsTXMyiLwvEUVmc8-2IIq9jW32YS8M" alt="" width="275" height="183" />             <img src="http://t3.gstatic.com/images?q=tbn:ANd9GcQYC2d6dXlc0FSq7w7ybkDRoyvPTLqZ368gmz68pZ_GqnDslro8" alt="" width="177" height="184" /></p>
<p><strong>Integration of Windows apps, desktop icons</strong></p>
<p>The biggest change in SmartCenter 5.0 regards the blending of the two environments that were previously separated: SmartCenter and the Windows Desktop. This means you no longer need to exit the SmartCenter environment when you want to run Windows apps. Here’s a screenshot of SmartCenter 5.0:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/image9.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.geektieguy.com/wp-content/uploads/2011/09/image_thumb9.png" alt="image" width="644" height="404" border="0" /></a></p>
<p>Note that the Windows 7 taskbar is fully visible and that you can use it for launching apps and seeing what apps are running. The SmartCenter app carousel now has the icon highlight turned on permanently and only shows a short animated starburst as an app is launched. You also see all your desktop icons represented on the SmartCenter canvas. As you can see, the magnets overlap the desktop icons, which can be a bit of a clutter issue. No worries, you can turn off the desktop icons via Settings, if you don’t like them on the canvas. Or you can rearrange your magnets so they occupy different space:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/09/image10.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://www.geektieguy.com/wp-content/uploads/2011/09/image_thumb10.png" alt="image" width="644" height="404" border="0" /></a></p>
<p>In general, SmartCenter 5.0 attempts to bring the touch-first environment of past generations together with the traditional, mouse-centric desktop. That’s a value-proposition you don’t have in Windows 8, which is most likely not available until sometime in late 2012 anyway…</p>
<p><strong>Automatic panning/scrolling</strong></p>
<p>One additional thing SmartCenter 5.0 does is automatic panning of the canvas/desktop whenever an app is launched. This removes the need for you to have to rearrange app windows frequently when you want to switch from one app to another. The canvas pans automatically to make more room for every app you start. To return to an app, you just click on it in the taskbar or the app carousel. Another video might explain it a bit better:</p>
<p><iframe style="background-color: #fcfcfc; width: 320px; height: 187px; padding: 0px;" title="Preview" src="https://skydrive.live.com/embedphoto.aspx/.Public/Videos%20for%20Blog%20posts/TouchSmart%20history/TouchSmart5.0^_1.mp4?cid=8bf3893855b5d3ae&amp;sc=documents" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="320" height="240"></iframe></p>
<p>This behavior can be turned off in Settings as well, in case it’s not useful to you. There are many, many areas that I haven&#8217;t touched on in this post, such as all the personalization and customization aspects that SmartCenter contains and how they changed over time. Or the fact that you can make your own parallax backgrounds (not documented anywhere, unfortunately, but pretty easy to figure out for enterprising souls). Or the easter eggs, oh yes&#8230;</p>
<p>Let me make some general remarks about the last four generations of SmartCenter: Any apps written to observe the guidelines of SmartCenter 2.0 are able to run on SmartCenter 2.0 through 5.0. A nice compatibility feature. Of course, older versions of apps needed updates as new SmartCenter functionality was introduced (or removed, as with the media plate removal in 4.0), but as you’ve seen, the Netflix app (which was published with SmartCenter 3.0) runs just fine in SmartCenter 2.0 and 5.0 as well. What’s more, if you know what you’re doing, you can have all the versions of SmartCenter 2.0 – 5.0 running on the same system. That’s how I was able to collect screenshots and videos for this post. Oh, and the technology underlying all these versions of SmartCenter is Microsoft’s Windows Presentation Foundation (WPF), 3.0, 3.5, and 4.0. The various apps were written in anything from compiled-to-native-code-Python to WPF to Adobe Flash. The software development process used since about SmartCenter 2.5 is anchored in Scrum, an Agile software development framework.</p>
<p>This concludes my brief history of the TouchSmart software. As you have seen, Windows 8 definitely picked up a lot of the features that the SmartCenter framework pioneered: Live tiles, fixed layout sizes for apps, parallax scrolling with an expandable space and touch-first design. Until Windows 8 is available, the TouchSmart 5.0 software suite is most likely the best alternative for touch &#8211; combined with new thinking on how to add something more to the the desktop environment &#8211; that you’ll find on an all-in-one PC anywhere.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2011/09/26/a-brief-history-of-five-touchsmart-generationspioneering-ideas-for-windows-8/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Custom RSS feeds for BUILD 2011 videos</title>
		<link>http://www.geektieguy.com/2011/09/17/custom-rss-feeds-for-build-2011-videos/</link>
		<comments>http://www.geektieguy.com/2011/09/17/custom-rss-feeds-for-build-2011-videos/#comments</comments>
		<pubDate>Sat, 17 Sep 2011 20:25:09 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2011/09/17/custom-rss-feeds-for-build-2011-videos/</guid>
		<description><![CDATA[Now that //build/ is over, lots of people want to download the sessions they missed because there was an ocean of stuff being presented and you couldn’t possibly catch it all live. One way to do this is to use a PowerShell script (I found one here). Here’s the script code in case you don’t [...]]]></description>
			<content:encoded><![CDATA[<p>Now that //build/ is over, lots of people want to download the sessions they missed because there was an ocean of stuff being presented and you couldn’t possibly catch it all live.</p>
<p>One way to do this is to use a PowerShell script (I found one <a href="http://mobile.dzone.com/news/download-all-microsoft-build" target="_blank">here</a>). </p>
<p>Here’s the script code in case you don’t want to follow the link:</p>
<div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">cd <span style="color: #006080">&quot;C:\build11&quot;</span></pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">[Environment]::CurrentDirectory=(Get-Location -PSProvider FileSystem).ProviderPath</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">$a = ([xml](<span style="color: #0000ff">new</span>-<span style="color: #0000ff">object</span> net.webclient).downloadstring(<span style="color: #006080">&quot;http://channel9.msdn.com/Events/BUILD/BUILD2011/RSS/wmvhigh&quot;</span>))</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">$a.rss.channel.item | <span style="color: #0000ff">foreach</span>{ </pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">    $url = New-Object System.Uri($_.enclosure.url)</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">    $file = $url.Segments[-1]</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">    $file</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">if</span> (!(test-path $file))</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">    {</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">        (New-Object System.Net.WebClient).DownloadFile($url, $file)</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">    }</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px">}</pre>
</div>
<p>One problem with this might be that you don’t want all videos. So you’d have to filter the RSS feed that the script pulls down. There’s no documentation on how to do that, but a little experimentation shows that you can do this:</p>
<pre><a href="http://channel9.msdn.com/Events/BUILD/BUILD2011/RSS/wmvhigh?t=.net%2Bframework">http://channel9.msdn.com/Events/BUILD/BUILD2011/RSS/wmvhigh?t=.net%2Bframework</a></pre>
<p>The available filters (for the t parameter) are:</p>
<p>.NET%2BFramework<br />
  <br />Access%2BControl </p>
<p>Applications </p>
<p>ASP.NET </p>
<p>Assessment%2Band%2BDeployment Kit </p>
<p>Async </p>
<p>C# </p>
<p>C++ </p>
<p>Certification </p>
<p>Charms </p>
<p>Cloud </p>
<p>Compliance ​ </p>
<p>Continuous%2BAvailability </p>
<p>Data </p>
<p>Database </p>
<p>Debugging </p>
<p>DirectX </p>
<p>Drivers </p>
<p>Elasticity </p>
<p>Expression%2BBlend </p>
<p>Files </p>
<p>Games </p>
<p>Graphics </p>
<p>HTML5%2Band%2BJavaScript </p>
<p>Hyper-V </p>
<p>IHV </p>
<p>Keynote </p>
<p>Manageability </p>
<p>Media </p>
<p>Metro%2Bstyle%2Bapps </p>
<p>Metro%2Bstyle%2Bdevice%2Bapps </p>
<p>Networking </p>
<p>Odata </p>
<p>OEM </p>
<p>Parallel%2BComputing </p>
<p>Performance </p>
<p>Power </p>
<p>Pre-​Recorded </p>
<p>Printing </p>
<p>Remote%2BDesktop </p>
<p>REST </p>
<p>Roaming </p>
<p>Scalability </p>
<p>Security </p>
<p>Sensors </p>
<p>Silicon </p>
<p>SQL </p>
<p>Storage </p>
<p>Touch </p>
<p>UI </p>
<p>Platform </p>
<p>User%2BExperience </p>
<p>Virtualization </p>
<p>Visual%2BBasic </p>
<p>Visual%2BStudio </p>
<p>WCF </p>
<p>Web </p>
<p>Windows%2BAzure </p>
<p>Windows%2BPhone </p>
<p>Windows%2BRuntime </p>
<p>Windows%2BStore </p>
<p>Wireless </p>
<p>Workflow </p>
<p>XAML </p>
<p>If you’re just interested in the slides, use a query like this:</p>
<pre><a href="http://channel9.msdn.com/Events/BUILD/BUILD2011/RSS/slides?t=.net%2Bframework">http://channel9.msdn.com/Events/BUILD/BUILD2011/RSS/slides?t=.net%2Bframework</a></pre>
<p>In general, the query can be constructed like this:</p>
<pre>http://channel9.msdn.com/Events/BUILD/BUILD2011/RSS/</pre>
<pre>[type]?t=[tag]&amp;term=[free text]</pre>
<p>Where [type] can be one of: wmv, wmvhigh, mp4, slides</p>
<p>You can add multiple t arguments.</p>
<p>So if you’re interested in slides related to “client” topics, this might be your query:</p>
<pre><a href="http://channel9.msdn.com/Events/BUILD/BUILD2011/RSS/slides?t=async&amp;t=charms&amp;t=expression%2Bblend&amp;t=files&amp;t=games&amp;t=metro%2Bstyle%2Bapps&amp;t=metro%2Bstyle%2Bdevice%2Bapps&amp;t=touch&amp;t=ui%2Bplatform&amp;t=user%2Bexperience&amp;t=windows%2Bphone&amp;t=windows%2Bruntime&amp;t=windows%2Bstore&amp;t=xaml">http://channel9.msdn.com/Events/BUILD/BUILD2011/RSS/slides?t=async&amp;t=charms&amp;t=expression%2Bblend&amp;t=files&amp;t=games&amp;t=metro%2Bstyle%2Bapps&amp;t=metro%2Bstyle%2Bdevice%2Bapps&amp;t=touch&amp;t=ui%2Bplatform&amp;t=user%2Bexperience&amp;t=windows%2Bphone&amp;t=windows%2Bruntime&amp;t=windows%2Bstore&amp;t=xaml</a></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2011/09/17/custom-rss-feeds-for-build-2011-videos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebOS and Windows Phone 7 development &#8211; Part 2: Windows Phone 7</title>
		<link>http://www.geektieguy.com/2011/08/11/webos-and-windows-phone-7-development-part-2-windows-phone-7/</link>
		<comments>http://www.geektieguy.com/2011/08/11/webos-and-windows-phone-7-development-part-2-windows-phone-7/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 18:20:10 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/?p=676</guid>
		<description><![CDATA[This is part two of a &#8220;miniseries&#8221; on my forays into mobile development. Part one is here. My interest in Windows Phone 7 development grew partly out of my experience with writing a simple app for WebOS and partly out of conversations with a friend at work who was really excited about what at the [...]]]></description>
			<content:encoded><![CDATA[<p>This is part two of a &#8220;miniseries&#8221; on my forays into mobile development. <a href="http://www.geektieguy.com/2011/08/10/webos-and-windows-phone-7-development-part-1-webos/" target="_blank">Part one is here</a>.</p>
<p><a href="http://windowsphone.com/s?appid=6a4bfba5-cfda-df11-a844-00237de2db9e" target="_blank"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="3 WindowClipping" src="http://www.geektieguy.com/wp-content/uploads/2011/07/3-WindowClipping.png" alt="3 WindowClipping" width="148" height="244" border="0" /></a></p>
<p>My interest in Windows Phone 7 development grew partly out of my experience with writing a simple app for WebOS and partly out of conversations with a friend at work who was really excited about what at the time was the &#8220;forthcoming&#8221; new mobile OS from Microsoft. I hadn&#8217;t paid much attention to Microsoft&#8217;s moves in the mobile space, since I&#8217;d always been a fan of Palm PDAs and didn&#8217;t own a cell phone for a really long time. I figured I was reachable either at my desk or at home most of the time, so why carry a phone and pay another monthly bill on top of all the other ones?</p>
<p>A long conversation on a BART ride got me curious, though, so I checked out the announcements and demos Microsoft gave at the Mobile World Congress 2010 in Barcelona. All I can say is &#8211; I was hooked. The user experience presented by Microsoft made sense to me, the user interface was clean, simple and fresh, and the development toolset / technology was something I was pretty familiar with (Silverlight being the close cousin to WPF, which I&#8217;ve worked with intensively over the last few years as part of creating the TouchSmart software UI framework.)</p>
<p>Since I had already gotten my feet wet writing a simple app for WebOS, I thought it would be fun to write the same app (more or less) for Windows Phone 7. I had to wait a while for the tools to come out, though, so I had some time to read and learn more in the meantime.</p>
<p>My friend at work heard about <a href="http://groups.live.com/learnwp7" target="_blank">a group that was forming</a> around some people from the Silicon Valley <a href="http://baynetug.org" target="_blank">Bay.NET</a> user group who wanted to study and learn Windows Phone 7 app development. He had already joined the group, which had its first meeting on June 15, and encouraged me to join as well, so I did, somewhere around late June 2010. The group was incredibly useful in pointing out resources, encouraging people to follow a sort of curriculum and generally keeping one&#8217;s spirit up. Not to mention getting to know the Windows Phone 7 developer evangelists in Silicon Valley, William Leong, Kenny Spade and Doris Chen. Without the group, I&#8217;m not sure I would have stuck with it.</p>
<p>When I started work on my app, I took advantage of what I had done on the WebOS predecessor. As it turned out, Microsoft&#8217;s phone app templates use a close cousin to the WebOS Model-View-Controller pattern that&#8217;s very familiar to WPF/Silverlight developers: Model-View-ViewModel. Transferring some of the business logic (the Controller) was relatively straightforward. But because of the differences between C# (the language initially supported by WP7) and JavaScript (the WebOS business logic language) I decided I could do better with my data model than I had done in JavaScript. Ah, the joys of a typed language with excellent tooling support (Visual Studio 2010 Express)! So I rewrote most of the business logic and added a proper unit testing project to my solution. Producing the user interface was an entirely different matter, of course. On WP7, the UI has to be built in either Silverlight or XNA Game Studio. I went with Silverlight, since I already know WPF quite well.</p>
<p>Unfortunately, the version of Silverlight on the phone (version 3, &#8220;plus&#8221;) leaves out lots of good stuff from WPF, so I couldn&#8217;t do some things that I would have liked to do. One thing that I had come to appreciate in particular from WebOS were &#8220;editable&#8221; text blocks, where the normal mode of operation is that the text is simply displayed without any adornments, but when you tap on the text, it turns into an edit box, where you can change the content. I liked this control so much, I just <em>had</em> to <a href="http://www.geektieguy.com/2010/10/16/windows-phone-7-no-editable-textblock/" target="_blank">write my own version</a> of it. The Silverlight limitations on WP7 (I can&#8217;t remember at this late stage if it was lack of style inheritance or something else) made the result not quite as elegant as it would have been with WPF, but it ended up working well enough. Mobile apps are all about removing clutter and unnecessary steps, so eliminating the need for an edit screen seems to be a good choice, even if the control that enables this isn’t a “standard” control everyone knows about.</p>
<p>On the WebOS app, I didn’t have to worry too much about application lifetime management, in other words I didn’t have to write much code to save and restore the state of the app. WebOS provides multitasking abilities for apps; Windows Phone 7 on the other hand only provides for a single app to run at a time (at least Silverlight apps, “native” apps have more advanced capabilities, including the ability to do things in the “background”, but non-OEM developers can’t currently write “native” apps [Microsoft will remedy some of this with the now final “Mango” update]). Writing the required “tombstoning” code was some extra work, but Microsoft had provided good sample code at a free developer event that I attended. Part of that sample code also included methods that make it easy to work with “isolated storage”, which is what used for storing an app’s data. Thankfully, I didn’t have to resort to using typeless JavaScript objects, but could use fully typed first-class objects with methods and persist them in isolated storage without having to write my own translation code like I had to with WebOS.</p>
<p>After I had made good progress bringing the <a href="http://windowsphone.com/s?appid=6a4bfba5-cfda-df11-a844-00237de2db9e" target="_blank">Open</a> app to the same level of functionality that my WebOS app had, I noticed that there was a Bing Maps control available from Microsoft, and thought it would be interesting to see what I could do with that. The Open app allows the user to enter a store address. Wouldn’t it be nice if the app could draw you a map to the store, and based on the route’s duration tell you if you can get to the store in time before closing or if the store will be open by the time you get there? Certainly! It was surprisingly easy to use the Bing Map control (except for one thing that I’ve <a href="http://www.geektieguy.com/2010/10/02/windows-phone-7-bing-map-phonedesktop-diffs-maplayer-setposition-missing-on-phone/" target="_blank">blogged about before</a>), and I had the new feature implemented in a matter of hours. I think what took longest was to get my API key to actually be approved/deployed by Microsoft.</p>
<p>After testing the finished app and checking it against Microsoft’s publishing guidelines, I proceeded to the Windows Phone 7 Marketplace (now called <a href="http://create.msdn.com/" target="_blank">AppHub</a>) to start the publishing process. Because of my involvement with the <a href="http://groups.live.com/learnwp7" target="_blank">peer learning group</a> hosted at Microsoft, I had gained access to the second wave of “early access” certification for Windows Phone developers. This meant that I was able to work through the submission process before it was open to the public. I had a few hiccups getting that far, eventually got approval to start submitting my app for certification.</p>
<p>Publishing an app is probably about the same amount of work for both WebOS and Windows Phone. I get the impression that Microsoft’s testers are quite thorough, at least they were when I went through the process. They’re also pretty fast. After preparing all the required materials (several app icons, background image for the Phone Marketplace, marketing text, etc.) and submitting the app, it took about 3 days to get it approved, if I remember correctly. According to my xap file timestamp, I produced the 1.0 version on October 18, 2010 and it was released on October 21, 2010. The awesome folks at <a href="http://www.wp7applist.com" target="_blank">wp7applist.com</a> (thanks Luigi!) helped me track down that it was among the first 2000 apps submitted, at #1983 or so. [Incidentally, I published a second app, called <a href="http://windowsphone.com/s?appid=ec6182d5-3d11-e011-9264-00237de2db9e" target="_blank">Countdown</a>, which also took 3 days to get approved (submitted on December 26, 2010 and published on December 29, 2010; it was #5123 in the Marketplace).] When I updated one of my apps to version 1.1, I got a failure report back (I hadn’t tested tombstoning well enough) and was impressed by the quality of the report. It really helped me find and reproduce the issue quickly.</p>
<p>I have not had time to update either of my apps any further since publishing version 1.1, but perhaps some of the new features in “Mango” will encourage me to do so. A live tile for the Countdown app has been requested in the reviews of the app, for example, and producing that functionality without Mango would require me to create and host a web service, not something I’m willing to pay for at the moment. With Mango, the app itself will be able to update its tile…</p>
<p>Speaking of payment, you may wonder if this venture has been worth it from a monetary perspective. I would say “not quite”, but since I haven’t spent anything on promoting my apps I don’t know if it could have gone better. Open is $1.99 and Countdown is free. Open has a trial version, which is ad supported and Countdown is free with ads. I’ve sold 5 copies (at this point) of Open and made perhaps fifteen dollars in ad revenue from both apps (so no payouts on either front yet). I was lucky enough to get my $99 Marketplace fee refunded due to publishing two apps by a certain deadline for a Microsoft promotion. But figure in the time I spent on creating the apps, and this definitely has been an exercise more for the sake of learning and personal enjoyment than for the sake of financial gain.</p>
<p>Finally, since this is part two of a series on mobile development, I need to comment a little on the two experiences of doing WebOS versus Windows Phone. To me, the phone/OS experiences on the two come pretty close. WebOS is similar to the HP TouchSmart 2.x/3.x concept of an app carousel and works beautifully. I like WebOS a lot from a user perspective (I just REALLY wish there was a WebOS phone model closer in size to the iPhone or my current LG Quantum or the Samsung Focus), but developing for WebOS is hampered (for me at least) by the relative lack of good development tools. Windows Phone provides a unique user experience, hampered a little by the lack of multitasking, but absolutely SHINES in the area of development tools. Microsoft also invests a LOT into the developer ecosystem, as evidenced by the evangelists participating (on their own time, no less) in peer learning groups, such as the one I participated in. They use this as a vehicle to give people early access to phone hardware for testing and to keep the energy and motivation up among developers. I’ve not been aware of such support existing for WebOS.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2011/08/11/webos-and-windows-phone-7-development-part-2-windows-phone-7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WebOS and Windows Phone 7 development &#8211; Part 1: WebOS</title>
		<link>http://www.geektieguy.com/2011/08/10/webos-and-windows-phone-7-development-part-1-webos/</link>
		<comments>http://www.geektieguy.com/2011/08/10/webos-and-windows-phone-7-development-part-1-webos/#comments</comments>
		<pubDate>Wed, 10 Aug 2011 18:20:46 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Experiment]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/?p=671</guid>
		<description><![CDATA[This is the first of a two part &#8220;miniseries&#8221; of my forays into developing for mobile platforms. Part two is here. After Phil McKinney announced a WebOS app development contest at HP&#8217;s internal technology conference, Tech Con &#8217;10, I was somewhat drawn to trying my hands at this unknown “beast” (lure of the prize? Maybe.) [...]]]></description>
			<content:encoded><![CDATA[<p>This is the first of a two part &#8220;miniseries&#8221; of my forays into developing for mobile platforms. <a href="http://www.geektieguy.com/2011/08/11/webos-and-windows-phone-7-development-part-2-windows-phone-7/" target="_blank">Part two is here</a>.</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2011/08/01_Store_List_03.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="01_Store_List_03" src="http://www.geektieguy.com/wp-content/uploads/2011/08/01_Store_List_03_thumb.png" alt="01_Store_List_03" width="164" height="244" border="0" /></a></p>
<p>After Phil McKinney announced a WebOS app development contest at HP&#8217;s internal technology conference, Tech Con &#8217;10, I was somewhat drawn to trying my hands at this unknown “beast” (lure of the prize? Maybe.) In a conversation with Jon Rubinstein on the first evening of Tech Con I had mentioned how Microsoft’s tools provide incredible developer productivity and I asked if Palm’s toolset provides something similar. Jon mentioned project Ares and encouraged me to try it out. More on that later.</p>
<p>Over lunch that last day of Tech Con, I mentioned in a conversation with my colleagues that I was going to develop an app that helps you keep track of store opening hours. After lunch I had a little bit of time before my flight back to California, so I rudely ignored my fellow travelers and started downloading and installing the “regular” Palm WebOS tools: <a href="http://java.com/en">Java</a>, <a href="http://download.virtualbox.org/virtualbox/3.1.6/VirtualBox-3.1.6-59338-Win.exe">VirtualBox</a>, <a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR2/eclipse-java-ganymede-SR2-win32.zip">Eclipse</a>, the <a href="http://cdn.downloads.palm.com/sdkdownloads/1.4.1.427/sdkBinaries/Palm_webOS_SDK-Win-1.4.1-427-x64.exe">SDK toolset</a>, <a href="http://google.com/chrome">Google Chrome</a> and the Aptana Studio plugin for Eclipse. I didn’t start writing code right away. I had just finished installing stuff when it was time to get on the shuttle for the airport.</p>
<p>My next steps were to read up on the overview documentation that Palm provides at <a href="http://developer.palm.com">http://developer.palm.com</a> and to start running the emulator and toolset. I’m no stranger to (D)HTML/CSS and JavaScript. One of my first projects at HP was developed almost entirely using that combination. Admittedly, that was quite some years ago. I’m a little surprised that someone would build a mobile platform based on technology that old, but I guess the rationale is sound: anyone who can develop a webpage can now develop mobile apps. (I’m not entirely sure I’d want just anyone who theoretically <strong>can</strong> do it to <strong>actually</strong> do it. Sorry. Little digression.) So, I’m no stranger to the technology, but I still needed to brush up. So I went off to <a href="http://www.w3schools.com">www.w3schools.com</a> to check out the <a href="http://w3schools.com/js/default.asp">JavaScript</a> references (in particular the Date class docs) etc. Part of the journey also took me to <a href="http://www.linux-mag.com/id/7517 ">a</a> <a href="http://www.linux-mag.com/id/7563 ">few</a> <a href="http://www.linux-mag.com/id/7583 ">articles</a> <a href="http://www.linux-mag.com/id/7592 ">at</a> Linux Magazine (WebOS is based on Linux – another decades old technology stack, hmmmm &#8211; but then, so is the Windows Kernel and a bunch of other pieces of software) where some of the details around data persistence were explored. I knew that I’d have to store the data locally, since I couldn’t possibly support running a web/cloud service anywhere. Some other detours led me to the <a href="http://json.org/">JSON</a> website and the <a href="http://prototypejs.org/">Prototype</a> framework.</p>
<p>My first tentative steps were to get the app from the Linux Magazine articles up and running, which didn’t take too long. Then came experimenting with my “business logic”. Palm apps are nicely partitioned according to the Model – View – Controller software pattern, so trying out some “Model” approaches was worthwhile. During all this, I kept bouncing back and forth between the Linux Mag articles, the SDK documentation, Palm’s <a href="https://developer.palm.com/distribution/index.php">developer forums</a> and the JavaScript documentation at w3schools.</p>
<p>After working with the TimePicker widget for a bit (store opening hours are central to the app, after all), I settled on using Date as the main “Model” for the app. Unfortunately JavaScript can’t store Date in the local persistence layer of WebOS. What can be persisted are object primitives (strings, integers, lists, arrays and such), and Date is not one of those. The persistence format in WebOS is <a href="http://json.org/">JSON</a> (JavaScript Object Notation), which is a string representation of a JavaScript object that the JavaScript interpreter can “rehydrate” by calling “eval()” on the string that’s retrieved from storage (or a web service call). Date objects don’t persist well, so I had to work out a way to “dehydrate” and “rehydrate” my Date-based data model. I’m sure there are better ways to do it than what I came up with, but my method is basically to “dehydrate” by calling Date.getTime() and storing that away. “Rehydration” is the reverse: construct a Date object from the stored getTime() value (which is the number of milliseconds since the “epoch”, Midnight on January 1, 1970).</p>
<p>After settling on the data model, I started some work on the business logic. I figured out the rules for determining a single day’s open/closed status and did debugging on that. This is where one of my frustrations with the toolset started to surface. Debugging is pretty painful on WebOS at first. It seemed that all I had at my disposal were “tracing” statements in combination with looking at log files in the emulator. To do that, I had to connect to the emulator running the app by using Putty (an SSH client that’s included in the toolset) to localhost port 5522. And every time I made a code change, I had to re-deploy the app, etc. It wasn’t until the end of my project that I discovered the semi-standalone log viewer from palm, hosted at <a href="http://ares.palm.com/AresLog">http://ares.palm.com/AresLog</a> and the corresponding debugger at <a href="http://ares.palm.com/AresDebug">http://ares.palm.com/AresDebug</a>. The unfortunate thing, of course, is that these two only work if you have a live Internet connection. The other unfortunate thing is that my data model is an object that none of the tools know how to “Visualize”. By that I mean that even though AresDebug can show me my Date object, it can’t show me the various interesting “parts” like the Date, Month, Year or Day.</p>
<p>After making progress on the logic for one day of opening hours, I worked my way toward the logic for a whole week of opening hours. This meant starting to work with arrays of objects and that made the debugging situation worse. Now I had to trace a set of Date objects seven times in order to make headway. Seeing the log output from that was really messy.</p>
<p>In parallel to the business logic work, I started sketching out the UI flow and settled on four scenes/cards to use in creation/editing of store opening hour information. Most of these scenes were easy enough to come up with. The main problem was aligning items in list widgets so their placement was “pleasing to the eye”. That sometimes required padding and using tables in the HTML code along with general CSS tinkering. While using &lt;div&gt; elements with certain palm CSS class styles (“palm-group” in particular), I discovered that using a self-closing &lt;div /&gt; element could create issues with rendering the UI properly. I had to use opening &lt;div&gt; and closing &lt;/div&gt; elements to get the correct rendering. Another thing I found a bit maddening was that I had to resort to padding in list rows to get items centered vertically. The style inheritance tree was just too much for me to wade through. I tried a couple of times, using the Palm Inspector, but it didn’t get me very far.</p>
<p>After most of the UI was settled, I had to finalize the business logic. This took the bulk of my development time, and was quite frustrating because of the difficulties of debugging/tracing/seeing traces using the Palm log tool via SSH. I ended up spending all of Memorial Day weekend on this (except for a few hours on Sunday where I got away to spend some quality time at a pool party). Memorial Day was another full working day where I thought I had finalized all the business logic…</p>
<p>Alas, I discovered in preparing my app for submission to the Palm site that there were still bugs lurking and that I needed to tinker a bit more with the UI. So I added a few images, twiddled icon sizes around, wrote up the required “marketing” text, etc. Each morning and evening I tested the app only to conclude that there were still calculation bugs.</p>
<p>Finally I convinced myself that it was time to formalize my testing efforts, so I put together a table on paper, sketching out various valid and invalid/tricky test data scenarios. I then coded these up in some “unit tests” (really just part of the app’s logic, but the tests only run if a certain flag is set in the startup code).</p>
<p>Other finishing touches included making the store opening hours definition less repetitive/labor intensive, adding a splash of color here and there, making it possible to delete the entire database and enabling two buttons in the UI based on conditions related to the store data the user enters: If a phone number is entered, enable calling up the dialer app to make a quick call to the store &#8211; if an address is entered, enable a button to take the user to a map of the store using the built-in mapping app. And with all those things in place, I finally submitted the app to the Palm catalog on June 4, 2010.</p>
<p>You’ll notice that I didn’t mention the Ares development tool yet. That’s because I didn’t use it much. Once I started on the path of using the SDK tools, I was unable to “round-trip” the app between Ares and the SDK toolset. I could upload the app just fine, but the App UI didn’t show up in the Ares environment. So perhaps I should have started out using Ares, but then I would have been limited to developing only while having a live Internet connection. Not something I find very comforting.</p>
<p>How much time did I spend on this adventure? Since I didn’t keep a log, I can only make rough estimates, but here’s the breakdown from memory:</p>
<p>Reading SDK docs<br />
2 &#8211; 4 hours</p>
<p>Download and install tools<br />
2 hours</p>
<p>Reading other articles<br />
1 &#8211; 2 hours</p>
<p>Reading JavaScript docs<br />
4 &#8211; 6 hours</p>
<p>Coding<br />
6 &#8211; 8 hours</p>
<p>Debugging<br />
30 &#8211; 40 hours</p>
<p>Refining UI, testing<br />
8 hours</p>
<p>Preparing for submission<br />
2 &#8211; 4 hours</p>
<p>So that’s somewhere between 55 and 74 hours. A lot of effort for a simple app? Probably. Worth the time, considering the value of the prize? Perhaps not. Great value in learning the ins and outs of a new platform and having some serious geek fun? Absolutely!!!</p>
<p>Why the big number on Debugging? This is where I get back to the productivity question/issue I posed to Jon Rubinstein. Debugging was so painful and time-intensive because the tools just didn’t provide what I needed. What I would have wanted was an environment that provides a coding and debugging experience that helps track down bugs in a matter of minutes. Variables should be easily inspected, breakpoints set / made conditional, etc. etc. The Palm Ares debugger provides some of this, but there is still lots of room for improvement.</p>
<p>All in all, it was great fun writing a WebOS app and learning about the platform. I highly recommend you do it yourself, if you are so inclined.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2011/08/10/webos-and-windows-phone-7-development-part-1-webos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Windows Phone 7 &#8211; No &#8220;editable&#8221; TextBlock</title>
		<link>http://www.geektieguy.com/2010/10/16/windows-phone-7-no-editable-textblock/</link>
		<comments>http://www.geektieguy.com/2010/10/16/windows-phone-7-no-editable-textblock/#comments</comments>
		<pubDate>Sun, 17 Oct 2010 00:11:57 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/?p=642</guid>
		<description><![CDATA[As I’m diving into Windows Phone 7 development and making notes for myself on how WP7 compares to WebOS, I’ve come across one little wrinkle that works really nicely in WebOS (out-of-the-box) and doesn’t work so well in WP7 (out-of-the-box). I’m talking about a control (actually, a Widget in WebOS) that initially looks like a [...]]]></description>
			<content:encoded><![CDATA[<p>As I’m diving into Windows Phone 7 development and making notes for myself on how WP7 compares to WebOS, I’ve come across one little wrinkle that works really nicely in WebOS (out-of-the-box) and doesn’t work so well in WP7 (out-of-the-box).</p>
<p>I’m talking about a control (actually, a Widget in WebOS) that initially looks like a regular text label, but when you tap on it, it turns into a text box that lets you edit the contained text. WP7 does not have anything like this out-of-the-box. So I decided to create my own.</p>
<p>I made a UserControl that consists of a TextBlock and a TextBox. The TextBox is normally Collapsed (Hidden doesn’t exist on WP7, you’d have to use Opacity=&#8221;0&#8243; instead). When the user taps on the TextBlock, it is collapsed and the TextBox is made visible. Once the TextBox loses focus, the reverse happens, and the text from the TextBox is transferred to the TextBlock. Since it can be useful to be able to style the TextBlock and to provide InputScope, I&#8217;ve also added a few DependencyProperties to enable that. The code is a little &#8220;smelly&#8221;, perhaps, because it could be refactored into a proper CustomControl, but what I have so far works well enough for me.</p>
<p>If you want to use it or just have a look, feel free to download the source code for <a href="http://www.geektieguy.com/wp-content/uploads/2010/10/TextBlockEditable.zip">TextBlockEditable</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2010/10/16/windows-phone-7-no-editable-textblock/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Windows Phone 7 &#8211; Bing Map Phone/Desktop diffs: MapLayer.SetPosition() missing on Phone</title>
		<link>http://www.geektieguy.com/2010/10/02/windows-phone-7-bing-map-phonedesktop-diffs-maplayer-setposition-missing-on-phone/</link>
		<comments>http://www.geektieguy.com/2010/10/02/windows-phone-7-bing-map-phonedesktop-diffs-maplayer-setposition-missing-on-phone/#comments</comments>
		<pubDate>Sun, 03 Oct 2010 05:54:37 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2010/10/02/windows-phone-7-bing-map-phonedesktop-diffs-maplayer-setposition-missing-on-phone/</guid>
		<description><![CDATA[If you’re working on a Windows Phone 7 app that uses the Bing Map control, you might be interested in these little differences between the Desktop version and the Phone version of the map control. 1. The Location type on the Phone has no constructor that takes 2 parameters (the Desktop version does). You’ll have [...]]]></description>
			<content:encoded><![CDATA[<p>If you’re working on a Windows Phone 7 app that uses the Bing Map control, you might be interested in these little differences between the Desktop version and the Phone version of the map control.</p>
<p>1. The Location type on the Phone has no constructor that takes 2 parameters (the Desktop version does). You’ll have to construct a Location object with the default constructor and then set the Latitude and Longitude fields separately.</p>
<p>2. LocationRect also has no constructor that takes 2 parameters. Here you’ll need to do a little more work and assign the North, West, South and East fields appropriately after constructing a LocationRect object with the default constructor.</p>
<p>3. MapLayer has no static function called SetPosition that lets you map Location objects to something appropriate for a MapLayer. Use the regular instance member MapLayer.AddChild() instead.</p>
<p>With these changes, you can make the <a href="http://msdn.microsoft.com/en-us/library/ee681887.aspx" target="_blank">Desktop sample on the Bing developer site</a> work on a Windows Phone 7 device.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2010/10/02/windows-phone-7-bing-map-phonedesktop-diffs-maplayer-setposition-missing-on-phone/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Windows Phone 7 &#8211; XAML designer fails to resolve font resources</title>
		<link>http://www.geektieguy.com/2010/08/24/windows-phone-7-xaml-designer-fails-to-resolve-font-resources/</link>
		<comments>http://www.geektieguy.com/2010/08/24/windows-phone-7-xaml-designer-fails-to-resolve-font-resources/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 04:55:23 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2010/08/24/windows-phone-7-xaml-designer-fails-to-resolve-font-resources/</guid>
		<description><![CDATA[This evening I was attempting to go through the first lab of the Windows Phone 7 Developer Training Kit and discovered that I couldn’t even finish the first exercise because Visual Studio wouldn’t resolve the resources for the fonts used in the project. Nothing showed up in the XAML designer view, so I couldn’t follow [...]]]></description>
			<content:encoded><![CDATA[<p>This evening I was attempting to go through the first lab of the <a href="http://channel9.msdn.com/learn/courses/WP7TrainingKit/" target="_blank">Windows Phone 7 Developer Training Kit</a> and discovered that I couldn’t even finish the first exercise because Visual Studio wouldn’t resolve the resources for the fonts used in the project. Nothing showed up in the XAML designer view, so I couldn’t follow the lab directions. I guess I could have just worked my way around this, but not having the XAML designer work while creating a phone app seems to be a bit of a problem. So I mentioned the situation to a room full of fellow “<a href="http://learnwp7.groups.live.com/" target="_blank">Learn Windows Phone 7</a>” travelers, and someone (sorry, I don’t remember your name) said “Try a repair on the tools”. An hour later (slow dev box, plus had to download a bunch of stuff to be able to do the repair) and the XAML designer works again!</p>
<p>Along the way, I discovered that the lab exercises solution files show a different icon in Windows Explorer than the ones I create using VS 2010. The reason is that the lab exercise .sln files contain the following line:</p>
<blockquote><p># Visual Studio 2010 Express for Windows Phone</p>
</blockquote>
<p>which results in this icon <a href="http://www.geektieguy.com/wp-content/uploads/2010/08/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.geektieguy.com/wp-content/uploads/2010/08/image_thumb.png" width="33" height="30" /></a> (see the tiny phone next to the “10”?), </p>
<p>whereas the ones I create contain this line instead:</p>
<blockquote><p># Visual Studio 2010</p>
</blockquote>
<p>which results in this icon <a href="http://www.geektieguy.com/wp-content/uploads/2010/08/image1.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.geektieguy.com/wp-content/uploads/2010/08/image_thumb1.png" width="35" height="30" /></a> (no tiny phone)</p>
<p>When I open a .sln file with the former line in it, the Express version of VS2010 runs. When I open a .sln file with the latter line in it, the regular version of VS2010 runs. Strange. It seems that the line is just an innocent comment, but apparently not quite. Either way, after repairing the toolset both solution files allow me to work in the XAML designer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2010/08/24/windows-phone-7-xaml-designer-fails-to-resolve-font-resources/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Create a multi-lingual / multi-language MSI using WiX and custom build scripts</title>
		<link>http://www.geektieguy.com/2010/03/13/create-a-multi-lingual-multi-language-msi-using-wix-and-custom-build-scripts/</link>
		<comments>http://www.geektieguy.com/2010/03/13/create-a-multi-lingual-multi-language-msi-using-wix-and-custom-build-scripts/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 01:53:02 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/?p=612</guid>
		<description><![CDATA[Some people might find this useful, so I thought I’d write it up. If you want to create a multi-language MSI (Windows Installer package) that works without a bootstrapper executable, this is one possible way to do it. It relies on an undocumented feature of Windows Installer, so proceed with caution/at your own risk. Testing [...]]]></description>
			<content:encoded><![CDATA[<p>Some people might find this useful, so I thought I’d write it up. If you want to create a multi-language MSI (Windows Installer package) that works without a bootstrapper executable, this is one possible way to do it. It relies on an undocumented feature of Windows Installer, so proceed with caution/at your own risk. Testing your final output is a must.</p>
<p>Anyway, according to <a href="http://www.installsite.org/pages/en/msi/articles/embeddedlang/" target="_blank">this article at installsite.org</a>, you can embed transforms into an MSI in a way so that Windows Installer will automatically apply them according to the system language when your MSI is loaded. This is the undocumented feature. If your MSI is simple enough that you don’t need dialog boxes/UI, but you just blaze through a default install, yet you want the few messages that show up by default to be localized, what I’m about to describe might be enough for you.</p>
<p>Here’s what you need: <a href="http://wix.sourceforge.net/" target="_blank">WiX</a> (Windows Installer XML toolset), MsiTran.exe and some sample MSI scripts from the Windows SDK, and finally some custom-written scripts to glue the whole thing together.</p>
<p>I’ll assume you already have WiX installed (possibly in conjunction with Visual Studio), and that you have a simple, single-language WiX project handy.</p>
<p>You can get the Windows SDK from Microsoft as an <a href="http://www.microsoft.com/downloads/details.aspx?familyid=71DEB800-C591-4F97-A900-BEA146E4FAE1&amp;displaylang=en" target="_blank">ISO image</a> (this one is for Windows 7). You can then mount this image using <a href="http://www.magiciso.com/tutorials/miso-magicdisc-history.htm" target="_blank">Magic Disc</a>, <a href="http://www.daemon-tools.cc/eng/downloads" target="_blank">Daemon Tools Lite</a> or some other ISO-peeking utility. If you don’t want to install the entire SDK just to get the MsiTran.exe and MSI script samples, open the ISO up using your tool of choice and find the folder Setup.</p>
<p>To install just the tools package that will give you the MsiTran.exe, run WinSDKTools\WinSDKTools_x86.msi. MsiTran.exe will be found in %ProgramFiles%\Microsoft SDKs\Windows\v7.0\Bin after this. I suggest copying this file to your WiX installer project folder.</p>
<p>To get the script samples, run the MSI WinSDKSamples\WinSDKSamples_x86.msi. Once you’ve done this, you’ll find the sample scripts in %ProgramFiles%\Microsoft SDKs\Windows\v7.0\Samples\SysMgmt\Msi\scripts. Out of all these scripts you only need WiSubStg.vbs and WiLangId.vbs. I suggest copying them to your WiX installer project folder.</p>
<p>You should know ahead of building the original WiX project which languages and how many languages you’ll end up needing. Your original installer needs to list all of these in a comma separated list in the Summary Stream (and the list can’t contain 0). In WiX that looks like this:</p>
<pre>&lt;Package
  Compressed="yes"
  Description="My Installer"
  InstallerVersion="200"
  Comments="My Software Installer"
  Languages="1033,1031,1028,2052,1030,1043,1035,1036,1040,1041,1042,1044,1046,1034,1053,1049,1055,1045,2070"
/&gt;</pre>
<p>Once you’ve built the single language MSI using WiX, you run a script for each language you need your MSI localized in that does the following:</p>
<ul>
<li>Copy the original MSI to a new file</li>
<li>Modify the newly copied MSI so it contains a different ProductLanguage using WiLangId.vbs</li>
<li>Create a transform that captures the difference between the two MSIs using MSITran.exe</li>
<li>Embed the transform in the final master installer using WiSubStg.vbs</li>
</ul>
<p>Here’s the script that does it (I call this CreateEmbedLangTransform.cmd):</p>
<div style="line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 97.5%; font-family: consolas, 'Courier New', courier, monospace; height: 171px; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: gray 1px solid; padding: 4px;">
<div style="line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">set MsiName=%1</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">set lang=%2</pre>
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">set langcode=%3</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">copy %MsiName%.msi %MsiName%_%lang%.msi</pre>
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">cscript WiLangId.vbs %MsiName%_%lang%.msi Product %langcode% &gt; CreateLangTransform_%lang%.txt</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">MsiTran.exe -g %MsiName%.msi %MsiName%_%lang%.msi %lang%.mst &gt;&gt; CreateLangTransform_%lang%.txt</pre>
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">cscript wisubstg.vbs FinalMasterInstaller\%MsiName%.msi %lang%.mst %langcode% &gt;&gt; CreateLangTransform_%lang%.txt</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">cscript wisubstg.vbs FinalMasterInstaller\%MsiName%.msi &gt;&gt; CreateLangTransform_%lang%.txt</pre>
</div>
</div>
<p>All you have to do as a post-build step (either in Visual Studio or as part of your build engine of choice) is call this script once for each language you’re interested in (I call this CreateLocalizedInstallerAllLanguages.cmd):</p>
<div style="line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; width: 57.17%; font-family: consolas, 'Courier New', courier, monospace; height: 357px; max-height: 200px; font-size: 8pt; overflow: auto; cursor: text; border: gray 1px solid; padding: 4px;">
<div style="line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span style="color: #0000ff;">if</span> not exist FinalMasterInstaller md FinalMasterInstaller</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">copy MyInstaller.msi FinalMasterInstaller</pre>
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller da 1030</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller de 1031</pre>
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller es 1034</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller fi 1035</pre>
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller fr 1036</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller it 1040</pre>
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller jp 1041</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller ko 1042</pre>
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller nl 1043</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller no 1044</pre>
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller pt_br 1046</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller sv 1053</pre>
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller zh_cn 2052</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller zh_tw 1028</pre>
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller ru 1049</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller tr 1055</pre>
<pre style="line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller pl 1045</pre>
<pre style="line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: consolas, 'Courier New', courier, monospace; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">call CreateEmbedLangTransform.cmd MyInstaller pt_pt 2070</pre>
</div>
</div>
<p>You’ll need to look up additional language codes in Microsoft’s documentation if you need more than the ones listed above.</p>
<p>Note that I’ve modified the scripts above from the ones I’m actually using to make them a little more generic, and I haven’t tested every aspect of them, but they give you the gist of it.</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2010/03/MsiLanguageEmbedding.zip" target="_blank">Here</a> are the script files zipped up.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2010/03/13/create-a-multi-lingual-multi-language-msi-using-wix-and-custom-build-scripts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HP TouchSmart SDK 3.0 &#8211; Giveaways at PDC 09</title>
		<link>http://www.geektieguy.com/2009/11/17/hp-touchsmart-sdk-3-0-giveaways-at-pdc-09/</link>
		<comments>http://www.geektieguy.com/2009/11/17/hp-touchsmart-sdk-3-0-giveaways-at-pdc-09/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 16:00:00 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[HP TouchSmart]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2009/11/17/hp-touchsmart-sdk-3-0-giveaways-at-pdc-09/</guid>
		<description><![CDATA[To mark the release of the TouchSmart 3.0 SDK, HP has a goodie to give away at the Microsoft PDC 09: A super-slim 2 GB USB memory stick (embedded in a hard-plastic business card with a nice imprint). It contains the new SDK and a few documents about a software development partner program HP is [...]]]></description>
			<content:encoded><![CDATA[<p>To mark the release of the TouchSmart 3.0 SDK, HP has a goodie to give away at the Microsoft PDC 09: A super-slim 2 GB USB memory stick (embedded in a hard-plastic business card with a nice imprint). It contains the new SDK and a few documents about a software development partner program HP is starting.</p>
<p>If you see me at PDC, say hi, and I may be able to hand you one of these puppies. I only have a limited supply, though. 15 to be precise.</p>
<p>Check out the pictures:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2009/11/IMG_3135.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_3135" border="0" alt="IMG_3135" src="http://www.geektieguy.com/wp-content/uploads/2009/11/IMG_3135_thumb.jpg" width="644" height="484" /></a></p>
<p>Front of the card</p>
<p>&#160;</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2009/11/IMG_3136.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_3136" border="0" alt="IMG_3136" src="http://www.geektieguy.com/wp-content/uploads/2009/11/IMG_3136_thumb.jpg" width="644" height="484" /></a></p>
<p>Back of the card</p>
<p>&#160;</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2009/11/IMG_3137.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_3137" border="0" alt="IMG_3137" src="http://www.geektieguy.com/wp-content/uploads/2009/11/IMG_3137_thumb.jpg" width="644" height="484" /></a></p>
<p>Back of the card with USB memory stick flipped open/out </p>
<p>&#160;</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2009/11/IMG_3138.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_3138" border="0" alt="IMG_3138" src="http://www.geektieguy.com/wp-content/uploads/2009/11/IMG_3138_thumb.jpg" width="644" height="484" /></a>&#160;</p>
<p>Front of the card with USB memory stick flipped open/out</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2009/11/17/hp-touchsmart-sdk-3-0-giveaways-at-pdc-09/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>New SDK for HP TouchSmart software development &#8211; out now!</title>
		<link>http://www.geektieguy.com/2009/11/16/new-sdk-for-hp-touchsmart-software-development-out-now/</link>
		<comments>http://www.geektieguy.com/2009/11/16/new-sdk-for-hp-touchsmart-software-development-out-now/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 15:30:00 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[HP TouchSmart]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2009/11/16/new-sdk-for-hp-touchsmart-software-development-out-now/</guid>
		<description><![CDATA[Today HP is announcing a new Software Development Kit for helping you write apps that play well in the HP TouchSmart “shell” environment. The new SDK still contains the general guidelines that outline both what makes a good app that’s optimized for touch interaction and the general rules you have to play by in order [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.geektieguy.com/wp-content/uploads/2009/11/TS3SDK01.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TS3SDK01" src="http://www.geektieguy.com/wp-content/uploads/2009/11/TS3SDK01_thumb.png" border="0" alt="TS3SDK01" width="513" height="402" /></a></p>
<p>Today HP is announcing a new Software Development Kit for helping you write apps that play well in the HP TouchSmart “shell” environment. The new SDK still contains the general guidelines that outline both what makes a good app that’s optimized for touch interaction and the general rules you have to play by in order to “fit” into the HP TouchSmart shell.</p>
<p>But this time around there’s more: For the first time there is also documentation for a WPF library that you can use to more quickly write an app that heeds all of the rules that need to be followed. This library has actually existed for a few releases already, but it was not documented until now (for HP TouchSmart 3.0).</p>
<p>There are also two sample applications. One that demonstrates the basics of the WPF library (and that shows you what the shell does to the apps on a pretty detailed level – it’s great for seeing what registered messages are sent to the app, how the app gets sized, etc.) and one that’s a little game. To round out things, there’s some skeleton sample app code as well, so you can get started quickly with your app idea.</p>
<p>Here are a few screenshots of the two sample apps:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2009/11/TS3SDK03.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TS3SDK03" src="http://www.geektieguy.com/wp-content/uploads/2009/11/TS3SDK03_thumb.png" border="0" alt="TS3SDK03" width="504" height="316" /></a></p>
<p>“Hello world” Wide-interactive tile</p>
<p> </p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2009/11/TS3SDK08.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TS3SDK08" src="http://www.geektieguy.com/wp-content/uploads/2009/11/TS3SDK08_thumb.png" border="0" alt="TS3SDK08" width="504" height="316" /></a></p>
<p>“Hello world” Large tile</p>
<p> </p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2009/11/TS3SDK10.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TS3SDK10" src="http://www.geektieguy.com/wp-content/uploads/2009/11/TS3SDK10_thumb.png" border="0" alt="TS3SDK10" width="644" height="161" /></a></p>
<p>Notification with CircleX icon</p>
<p> </p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2009/11/TS3SDK11.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TS3SDK11" src="http://www.geektieguy.com/wp-content/uploads/2009/11/TS3SDK11_thumb.png" border="0" alt="TS3SDK11" width="644" height="160" /></a></p>
<p>Notification with CircleCheck icon</p>
<p> </p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2009/11/TS3SDK02.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TS3SDK02" src="http://www.geektieguy.com/wp-content/uploads/2009/11/TS3SDK02_thumb.png" border="0" alt="TS3SDK02" width="504" height="316" /></a> </p>
<p>“Hello Mole” Wide-interactive tile</p>
<p> </p>
<p>The documentation is provided in two forms: PDF for easy printing and reading offline as well as in Windows Help format for easy searching and looking at class library details.</p>
<p>You’ll notice that most of this only applies to WPF development. If you’re not using WPF yet (why aren’t you? – it’s a great platform), the general guidelines still apply and work. The shell is actually technology agnostic, since all it cares about, really, is the window (handle) your app produces. As long as your technology stack produces a Win32 window, you can “play”. The essence of that is <a href="http://www.geektieguy.com/2009/09/24/hp-touchsmart-application-development-in-a-nutshell/" target="_blank">something I’ve talked about before</a>.</p>
<p>So where can you get this newfangled contraption? Head right over to <a href="http://www.touchsmartdevzone.com/download/file/2074-27" target="_blank">http://www.touchsmartdevzone.com/download/file/2074-27</a> to start downloading. There’s still a license agreement in the installer (to make the lawyers happy), but I believe you can now download the thing without having to consent to the agreement first.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2009/11/16/new-sdk-for-hp-touchsmart-software-development-out-now/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>HP TouchSmart application development in a nutshell</title>
		<link>http://www.geektieguy.com/2009/09/24/hp-touchsmart-application-development-in-a-nutshell/</link>
		<comments>http://www.geektieguy.com/2009/09/24/hp-touchsmart-application-development-in-a-nutshell/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 00:09:27 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[HP TouchSmart]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/?p=447</guid>
		<description><![CDATA[There is a document available for download (wrapped in an MSI to keep the HP lawyers happy) that describes all the nitty-gritty details of how to create an app that &#8220;fits&#8221; into the HP TouchSmart software environment. But some people might enjoy just a quick introduction to what it takes to get an application to [...]]]></description>
			<content:encoded><![CDATA[<p>There is a <a href="http://www.touchsmartcommunity.com/download/60/HP-TouchSmart-Software-Developer-Guidelines/" target="_blank">document available for download </a>(wrapped in an MSI to keep the HP lawyers happy) that describes all the nitty-gritty details of how to create an app that &#8220;fits&#8221; into the HP TouchSmart software environment. But some people might enjoy just a quick introduction to what it takes to get an application to show up in the HP TouchSmart software. So here&#8217;s my attempt at providing just the essentials in a bulleted list:</p>
<ul>
<li>Create a Windows app using any technology you please (C++, MFC, VB, WPF, Flash, Air, whatever)</li>
<li>Do not use DirectX exclusive mode</li>
<li>Make sure the app produces one Win32 window (and <strong>only</strong> <strong>one</strong> window) and does this quickly</li>
<li>Make sure the window has no &#8220;chrome&#8221; whatsoever (no borders, resize grips, close/minimize/maximize buttons, system menu, etc.)</li>
<li>Make sure the window can still be resized by WM_SIZE and moved by WM_MOVE messages (and make sure it does so very responsively)</li>
<li>Make sure the window content is touch friendly</li>
</ul>
<p>That&#8217;s it. If you know how to produce a program that does the above, you&#8217;re all set. No need to learn any interfaces, new programming models, technologies, nothing. I&#8217;ve actually had partial success at getting apps designed for Windows 1.0 to run inside the HP TouchSmart environment.</p>
<p>Now, if you want to improve on things, here are some more things you could do:</p>
<ul>
<li>Make sure you have a black background for your window</li>
<li>Support the three &#8220;layouts&#8221;/sizes that HP TouchSmart uses as the user interacts with the UI (small, medium, large)</li>
<li>Take into account that the user can only interact with your window in large layout/size</li>
<li>Present something useful/informative in small and medium layout/size</li>
<li>Provide a beautiful, large icon</li>
</ul>
<p>And to make it really great:</p>
<ul>
<li>Use the notification mechanism that the environment provides (if your app needs to notify the user of anything)</li>
<li>Use the mechanism for launching IE that the environment provides (if your app needs to put the user in a full web browser experience)</li>
</ul>
<p>Finally, use the RegisterSmartCenterApp.exe registration mechanism (described in the document linked to above) in the package you deliver for installing your app. You need to do that so program you&#8217;ve developed can be integrated into the HP TouchSmart UI.</p>
<p>If you&#8217;ve climbed the WPF cliff, the latest version of the HP TouchSmart software (2.8) includes a library that you can use for even closer integration. Leave a comment if you&#8217;d like more information about that. I don&#8217;t consider that part of the &#8220;nutshell&#8221;, since it ends up binding you to a specific technology stack.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2009/09/24/hp-touchsmart-application-development-in-a-nutshell/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Why are you not a member of the ACCU?</title>
		<link>http://www.geektieguy.com/2009/08/06/why-are-you-not-a-member-of-the-accu/</link>
		<comments>http://www.geektieguy.com/2009/08/06/why-are-you-not-a-member-of-the-accu/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 16:36:00 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Work in general]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2009/08/06/why-are-you-not-a-member-of-the-accu/</guid>
		<description><![CDATA[You may never have heard of ACCU, the Association of C and C++ Users as it was originally called. It is a volunteer organization, consisting of programmers who care about programming. The ACCU publishes two magazines, both devoted to raising the standards of programming everywhere: C Vu and Overload. On top of that they organize [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://accu.org/index.php"><img alt="ACCU Home page" src="http://accu.org/themes/AccuBimini/graphics/accu_logo.gif" width="216" height="75" /></a></p>
<p>You may never have heard of <a href="http://www.accu.org" target="_blank">ACCU</a>, the Association of C and C++ Users as it was originally called. It is a volunteer organization, consisting of programmers who care about programming. The ACCU publishes two magazines, both devoted to raising the standards of programming everywhere: C Vu and Overload. On top of that they organize a conference every year, where some of the top names in C/C++ programming (and many other software development fields) come to speak and mingle with programmers from all around the globe.</p>
<p>I was introduced to the ACCU several years ago, when I first came to Silicon Valley, and still renew my membership every year, even though I don’t attend the local <a href="http://accu.org/index.php/accu_branches/accu_usa/" target="_blank">ACCU-USA</a> events anymore. Yes, there is a local “chapter” of the <a href="http://www.accu-usa.org/" target="_blank">ACCU in Silicon Valley</a>, and they have monthly events that you can attend for free. I had the good fortune of hearing Bjarne Stroustrup speak once (plus going to dinner with him and the rest of the attendees afterwards, and even getting to exchange a few words with him in private.)</p>
<p><img alt="C Vu Volume 21 Issue 3 Cover" src="http://accu.org/content/images/journals/CVu213Cover.png" />&#160;&#160;&#160;&#160; <a href="http://www.geektieguy.com/wp-content/uploads/2009/08/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.geektieguy.com/wp-content/uploads/2009/08/image_thumb.png" width="247" height="347" /></a> </p>
<p>At one time I also co-hosted an event for the ACCU, and I think it is this personal connection that has kept me going as a member, even though I’ve not been much directly involved since. What keeps me hanging on now are the two <a href="http://accu.org/index.php/aboutus/aboutjournals" target="_blank">excellent journals</a>, which are largely ad-free and contain almost nothing but passionately written articles and code samples, demonstrating how to become a better programmer.</p>
<p>If this is something you strive for, I highly recommend checking out the ACCU and encourage you to <a href="http://accu.org/index.php/joining" target="_blank">become a member</a>. Even if you live in the United States or elsewhere outside the UK.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2009/08/06/why-are-you-not-a-member-of-the-accu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows Vista Ultimate customers get the shaft &#8211; again</title>
		<link>http://www.geektieguy.com/2009/06/26/windows-vista-ultimate-customers-get-the-shaft-again/</link>
		<comments>http://www.geektieguy.com/2009/06/26/windows-vista-ultimate-customers-get-the-shaft-again/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 03:04:40 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2009/06/26/windows-vista-ultimate-customers-get-the-shaft-again/</guid>
		<description><![CDATA[A lot has been written about how Windows Vista Ultimate was a major disappointment. First it was billed as the version that would &#8220;keep on giving&#8221; in the form of Ultimate Extras &#8211; cool new features that would be exclusive to Ultimate customers. When those extras finally materialized most people were underwhelmed. The extras were [...]]]></description>
			<content:encoded><![CDATA[<p>A lot has been written about how <a href="http://www.bing.com/search?q=windows+vista+ultimate+sham" target="_blank">Windows Vista Ultimate was a major disappointment</a>. First it was billed as the version that would &#8220;keep on giving&#8221; in the form of Ultimate Extras &#8211; cool new features that would be exclusive to Ultimate customers. When those extras finally materialized most people were underwhelmed. The extras were mostly Language Packs, DreamScene (with a few content packs) and a game or two. And for that, people paid a hefty premium over the Home Premium edition.</p>
<p>Now Microsoft has published special early upgrade pricing to entice people to rush out and get Windows 7 &#8220;while supplies last&#8221;. And they&#8217;re at it again. Guess what the upgrade price for Windows 7 Ultimate is:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2009/06/WindowClipping.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="WindowClipping" src="http://www.geektieguy.com/wp-content/uploads/2009/06/WindowClipping_thumb.png" width="696" height="253"/></a> </p>
<p>Yup. <strong></strong></p>
<h1>$219.99!</h1>
<p>Sorry to shout there. At least this time there&#8217;s no promise of &#8220;Extras&#8221;. Only BitLocker and Language Packs (in addition to the Professional features). Not sure that&#8217;s worth $120 over the Professional Upgrade or $170 over Home Premium (even considering XP mode.)</p>
<p>Oh, and you can&#8217;t do an edition &#8220;downgrade&#8221; from Vista to 7. You can buy the upgrade package, but you&#8217;ll have to use it to do a &#8220;custom install&#8221; (i.e. clean install) and then reinstall all your programs and data. Despite that inconvenience, I&#8217;ll go for the Home Premium upgrade, thank you very much. I&#8217;m done being an Ultimate customer. Or is that Ultimate fool?</p>
<p>(And just for the record, Windows 7 is a fantastic product in my opinion. I hope Paul Thurrott is right when he says it may be the <a href="http://www.winsupersite.com/win7/win7_nt.asp" target="_blank">next Windows NT</a>. Unfortunately he also seems to be right about how Microsoft can <a href="http://windowsitpro.com/article/articleid/102303/pricing-malfunction-how-microsoft-will-bungle-the-windows-7-launch.html" target="_blank">mess things up with their pricing</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2009/06/26/windows-vista-ultimate-customers-get-the-shaft-again/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MSI custom action type 50 / 51 failures? Beware of quotes.</title>
		<link>http://www.geektieguy.com/2009/04/25/msi-custom-action-type-50-51-failures-beware-of-quotes/</link>
		<comments>http://www.geektieguy.com/2009/04/25/msi-custom-action-type-50-51-failures-beware-of-quotes/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 05:37:24 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/?p=408</guid>
		<description><![CDATA[This one cost me a lot of wasted time recently. I was authoring an MSI package using the otherwise excellent open source WiX package from Microsoft and kept getting 1721 errors when a custom action was supposed to run. If you get this problem, let me attempt to save you a bit of time. If you [...]]]></description>
			<content:encoded><![CDATA[<p>This one cost me a lot of wasted time recently. I was authoring an MSI package using the otherwise excellent open source <a href="http://wix.sourceforge.net" target="_blank">WiX</a> package from Microsoft and kept getting 1721 errors when a custom action was supposed to run. If you get this problem, let me attempt to save you a bit of time.</p>
<p>If you author a type 50 custom action that runs an exe on the system, based on a registry app search in combination with a type 51 action for example, make sure you don&#8217;t put quotes around the property that defines the exe path in the type 51 custom action. In other words, don&#8217;t author it as &#8220;EXEPROPERTY&#8221;, but just EXEPROPERTY.</p>
<p>You may think you need the quotes if your exe path has a space in it somewhere, but you don&#8217;t.</p>
<p>Now, if your type 50 action uses an ExeCommand and part of that has spaces in it, that usually needs to be quoted.</p>
<p>Looks inconsistent to me, but I guess the ways of the Windows Installer are inscrutable and mystical at times.</p>
<p>My type 50 action actually ended up as 1138 or something because of deferred execution and no impersonation, but basically the same idea applies.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2009/04/25/msi-custom-action-type-50-51-failures-beware-of-quotes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HP TouchSmart development on .NET Rocks!</title>
		<link>http://www.geektieguy.com/2008/12/02/hp-touchsmart-development-on-net-rocks/</link>
		<comments>http://www.geektieguy.com/2008/12/02/hp-touchsmart-development-on-net-rocks/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 06:54:00 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[HP TouchSmart]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Tech Toys]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2008/12/02/hp-touchsmart-development-on-net-rocks/</guid>
		<description><![CDATA[Check out the interview with some of the HP TouchSmart folks on .NET Rocks! It just went live earlier today. http://www.dotnetrocks.com/default.aspx?showNum=399 The parts for developers are mostly in the first 15 minutes. I have some PDF slides that might illustrate things for people who are just looking for a quick visual and not a whole [...]]]></description>
			<content:encoded><![CDATA[<p>Check out the interview with some of the HP TouchSmart folks on .NET Rocks! It just went live earlier today.</p>
<p><a href="http://www.dotnetrocks.com/default.aspx?showNum=399">http://www.dotnetrocks.com/default.aspx?showNum=399</a></p>
<p>The parts for developers are mostly in the first 15 minutes. I have some PDF slides that might illustrate things for people who are just looking for a quick visual and not a whole lot of depth. If you&#8217;re interested, let me know and I&#8217;ll post them here.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2008/12/02/hp-touchsmart-development-on-net-rocks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WIC metadata in .NET: Getting around &quot;Property cannot be found&quot; / System.ArgumentException /&quot;Exception from HRESULT: 0x88982F40&quot;</title>
		<link>http://www.geektieguy.com/2008/11/16/wic-metadata-in-net-getting-around-property-cannot-be-found-systemargumentexception-exception-from-hresult-0x88982f40/</link>
		<comments>http://www.geektieguy.com/2008/11/16/wic-metadata-in-net-getting-around-property-cannot-be-found-systemargumentexception-exception-from-hresult-0x88982f40/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 04:39:37 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Software development]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2008/11/16/wic-metadata-in-net-getting-around-property-cannot-be-found-systemargumentexception-exception-from-hresult-0x88982f40/</guid>
		<description><![CDATA[Here&#8217;s a bit of an obscure error message I&#8217;ve run into while working with WIC (Windows Imaging Component) on .NET/WPF, trying to write XMP metadata into an image: &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; So far, a search on Google has yielded few usable results. I hope this post will change [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a bit of an obscure error message I&#8217;ve run into while working with WIC (Windows Imaging Component) on .NET/WPF, trying to write XMP metadata into an image:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2008/11/image.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="368" alt="image" src="http://www.geektieguy.com/wp-content/uploads/2008/11/image-thumb.png" width="644" align="left" border="0"/></a> </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>So far, a search on Google has yielded few usable results. I hope this post will change that, yielding at least one useful thing. </p>
<p>The Exception message tells you that you&#8217;re trying to write data to a property that doesn&#8217;t exist in the file. <a href="http://www.microsoft.com/Downloads/details.aspx?FamilyID=a6d6ec6a-e4f2-405e-842d-7c3bcb5b1390&amp;displaylang=en" target="_blank">Microsoft has a tool called WICExplorer</a> that can show you the metadata like this:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2008/11/wic-before.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="503" alt="WIC_Before" src="http://www.geektieguy.com/wp-content/uploads/2008/11/wic-before-thumb.png" width="715" border="0"/></a> </p>
<p>The above shows an image in WICExplorer directly after coming off of my digital camera. Notice that there is no &#8220;XMP Reader&#8221; node, which would represent XMP metadata. So if you want to put new XMP metadata into the picture, you need to know two things: how to create a new metadata node and what the correct syntax is for doing so.</p>
<p>What helped me figure those two things out were these pages:</p>
<p><a title="http://social.msdn.microsoft.com/forums/en-US/wpf/thread/8f297b11-99ba-459c-b085-1ff3ae526487/" href="http://social.msdn.microsoft.com/forums/en-US/wpf/thread/8f297b11-99ba-459c-b085-1ff3ae526487/">http://social.msdn.microsoft.com/forums/en-US/wpf/thread/8f297b11-99ba-459c-b085-1ff3ae526487/</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb643802.aspx">http://msdn.microsoft.com/en-us/library/bb643802.aspx</a></p>
<p>The first one showed how one can create new metadata objects using WIC, the second showed the needed syntax for some of the queries.</p>
<p>So here&#8217;s an example of how to create XMP metadata in an image that doesn&#8217;t have XMP metadata embedded yet:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 280px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; height: 280px; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> <span style="color: #0000ff">string</span> file = <span style="color: #006080">"C:\Temp\IMG_1687.JPG"</span>;</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span> BitmapCreateOptions createOptions = BitmapCreateOptions.PreservePixelFormat | BitmapCreateOptions.IgnoreColorProfile;</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span> Stream originalFile = File.Open(file, FileMode.Open, FileAccess.ReadWrite)</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span> BitmapDecoder original = BitmapDecoder.Create(originalFile, createOptions, BitmapCacheOption.None);</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   5:</span> BitmapMetadata metadata = original.Frames[0].Metadata.Clone() <span style="color: #0000ff">as</span> BitmapMetadata;</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   6:</span>&nbsp; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   7:</span> <span style="color: #0000ff">string</span> q = <span style="color: #006080">"/xmp/exif:UserComment/x-default"</span>;</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   8:</span> <span style="color: #0000ff">if</span> (metadata.ContainsQuery(q))</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   9:</span> {</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  10:</span>   metadata.SetQuery(q, comment);</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  11:</span> }</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  12:</span> <span style="color: #0000ff">else</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  13:</span> {</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  14:</span>   metadata.SetQuery(<span style="color: #006080">"/xmp/exif:UserComment"</span>, <span style="color: #0000ff">new</span> BitmapMetadata(<span style="color: #006080">"xmpalt"</span>));</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  15:</span>   metadata.SetQuery(q, comment);</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  16:</span> }</pre>
</div>
</div>
<p>The keys are in line 7, where the initial metadata query is shown and in line 8, where the code tests if the metadata is already present. If not, line 14 shows how to create a new XMP metadata node, which then gets populated in line 15. The writing of the data can be done using a JpegBitmapEncoder according to <a href="http://blogs.msdn.com/rwlodarc/archive/2007/07/18/using-wpf-s-inplacebitmapmetadatawriter.aspx" target="_blank">Robert Wlodarczyk&#8217;s blog post</a> (without the InPlaceBitmapMetadataWriter piece.)</p>
<p>After running code like this, you&#8217;ll now have the metadata in the file, as shown by this WICExplorer screenshot (I added &#8220;App0 Reader&#8221; metadata to this image as well):</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2008/11/wic-after.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="503" alt="WIC_After" src="http://www.geektieguy.com/wp-content/uploads/2008/11/wic-after-thumb.png" width="715" border="0"/></a> </p>
<p>Hopefully this is useful to some folks out there. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2008/11/16/wic-metadata-in-net-getting-around-property-cannot-be-found-systemargumentexception-exception-from-hresult-0x88982f40/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>HP TouchSmart / badges at PDC 08</title>
		<link>http://www.geektieguy.com/2008/10/24/hp-touchsmart-badges-at-pdc-08/</link>
		<comments>http://www.geektieguy.com/2008/10/24/hp-touchsmart-badges-at-pdc-08/#comments</comments>
		<pubDate>Sat, 25 Oct 2008 05:44:10 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2008/10/24/hp-touchsmart-badges-at-pdc-08/</guid>
		<description><![CDATA[You&#8217;ll see a lot of the HP TouchSmart PC at the Microsoft PDC 2008 starting on Monday. Not only physically, but also as it relates to the software. Can&#8217;t say any more than that right now. We&#8217;ll have two of the HP TouchSmart software developers attending, so if you see them, don&#8217;t be shy. Please [...]]]></description>
			<content:encoded><![CDATA[<p>You&#8217;ll see a lot of the HP TouchSmart PC at the Microsoft PDC 2008 starting on Monday. Not only physically, but also as it relates to the software. Can&#8217;t say any more than that right now.</p>
<p>We&#8217;ll have two of the HP TouchSmart software developers attending, so if you see them, don&#8217;t be shy. Please come and say &quot;hi&quot;. </p>
<p>If you do, we&#8217;ll have some stuff to share that should make people who have commented on some of my previous posts a little happier, I think. Again, I can&#8217;t say any more than that now.</p>
<p>Oh, and we&#8217;ll have <a href="http://adamkinney.com/blog/366/default.aspx" target="_blank">PDC badges</a> to <a href="http://adamkinney.com/blog/371/default.aspx" target="_blank">hand</a> <a href="http://blogs.msdn.com/mswanson/archive/2008/10/01/pdc2008-a-day-in-the-life-5.aspx" target="_blank">out</a>. Here&#8217;s a sample:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2008/10/atouchdifferent.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="141" alt="ATouchDifferent" src="http://www.geektieguy.com/wp-content/uploads/2008/10/atouchdifferent-thumb.png" width="244" border="0" /></a> </p>
<p>We have five different ones, but only a limited supply.</p>
<p>Oh, and we may <a href="http://www.managed-world.com/2008/10/16/PDC2008OpenSpaceDetails.aspx" target="_blank">do an OpenSpace</a> session, although I&#8217;m not sure we&#8217;d be in &quot;compliance&quot; with the rules. Let&#8217;s see.</p>
<p>I&#8217;m definitely looking forward to PDC 08! </p>
<p>I&#8217;ll be wearing my geek tie (recently &quot;upgraded&quot;, too). Hope to see you there!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2008/10/24/hp-touchsmart-badges-at-pdc-08/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Going to SD West 2008 &#8211; a planning worksheet</title>
		<link>http://www.geektieguy.com/2008/03/01/going-to-sd-west-2008-a-planning-worksheet/</link>
		<comments>http://www.geektieguy.com/2008/03/01/going-to-sd-west-2008-a-planning-worksheet/#comments</comments>
		<pubDate>Sat, 01 Mar 2008 21:37:54 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2008/03/01/going-to-sd-west-2008-a-planning-worksheet/</guid>
		<description><![CDATA[I have the good fortune to be able to attend SD West this year. I&#8217;ve heard people at work rave about this conference right in my backyard, and was lucky to get approval to go this year. Unfortunately I&#8217;ve been so swamped with work (really exciting new stuff, too) that I haven&#8217;t been able to prepare [...]]]></description>
			<content:encoded><![CDATA[<p>I have the good fortune to be able to attend SD West this year. I&#8217;ve heard people at work rave about this conference right in my backyard, and was lucky to get approval to go this year.</p>
<p>Unfortunately I&#8217;ve been so swamped with work (really exciting new stuff, too) that I haven&#8217;t been able to prepare at all. In other words I still have no idea about what sessions to go to. Argh. To add to that frustration, the SD West website doesn&#8217;t make it really easy to plan your days for maximum efficiency. Double Argh.</p>
<p>Here&#8217;s how I like to plan my attendance: I have an idea at a high level about what kind of sessions I&#8217;d like to focus on (in my case .NET and People, Process &amp; Methods mostly). So I need to be able to filter all sessions by those high-level criteria. Next, I need to figure out which sessions in those high level tracks are available at what time and how they may conflict relative to how interesting they sound to me.</p>
<p>The information provided on the SD West website provides some ability to filter and search for sessions, but it doesn&#8217;t help you with detailed planning.</p>
<p>So I decided to spend a little time pulling down all sessions as an Excel sheet (which the site allows, thank goodness), and started to shape and mold the sheet to my needs. The result is available for you to use as well, in case you&#8217;re as late as I am: <a href="http://www.geektieguy.com/wp-content/uploads/2008/03/sdwest08_all.xlsx" title="sdwest08_all.xlsx">sdwest08_all.xlsx</a> (update: rename this file to have an .xlsx suffix after downloading, WordPress changed the extension on me).<br />
(I think I have all sessions in there, but I noticed that one session seemed to not be fully downloaded (a session with quotes in the description), so I added it back by hand. Maybe there are others missing too, but I think that was the only one.)</p>
<p>You&#8217;ll see all sessions sorted by time, color coded by time slot/event type (keynotes, birds-of-a-feather), color coded by track, and with filters on each column. I also added a priority column at the beginning to perhaps help making decisions if you change your mind while at the event.</p>
<p>And, yes, I will most likely be wearing my Geek Tie at the event (it has a Red Verbatim Store&#8217;n'Go USB memory stick and a gray CaseLogic case at the end).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2008/03/01/going-to-sd-west-2008-a-planning-worksheet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WPF ControlTemplate Trigger tip</title>
		<link>http://www.geektieguy.com/2008/01/05/wpf-controltemplate-trigger-tip/</link>
		<comments>http://www.geektieguy.com/2008/01/05/wpf-controltemplate-trigger-tip/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 09:11:10 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Software development]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2008/01/05/wpf-controltemplate-trigger-tip/</guid>
		<description><![CDATA[I didn&#8217;t fully realize how ControlTemplate Triggers work (or don&#8217;t) until I solved a problem with a UserControl today, with the help of this post on the MSDN forums. A Triggers&#8217; EnterActions or ExitActions don&#8217;t seem to get fired when a UserControl is constructed. If you want, say, an animation in your control to start [...]]]></description>
			<content:encoded><![CDATA[<p>I didn&#8217;t fully realize how ControlTemplate Triggers work (or don&#8217;t) until I solved a problem with a UserControl today, with the help of <a href="http://207.46.236.188/MSDN/ShowPost.aspx?PostID=2115735&amp;SiteID=1">this post on the MSDN forums</a>.</p>
<p>A Triggers&#8217; EnterActions or ExitActions don&#8217;t seem to get fired when a UserControl is constructed. If you want, say, an animation in your control to start on a property change, you can put a BeginStoryboard element into a Trigger&#8217;s EnterActions and a reverse BeginStoryboard into the ExitActions.</p>
<p>But for the control to start out right at initialization you also need to have the right Setter element on the Trigger to set initial states (in addition to setting the opposite initial states on the elements to be animated/initialized.)</p>
<p>Here&#8217;s a tiny example:</p>
<p style="display: inline; float: none; margin: 0px; padding: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:58d52c37-3145-4c1b-863f-0f57715a3603" class="wlWriterSmartContent">
<pre style="overflow: auto; background-color: white; word-wrap: break-word"><!-- 

Code highlighting produced by Actipro CodeHighlighter (freeware) 

http://www.CodeHighlighter.com/

--><span style="color: #008080"> 1</span> <span style="color: #0000ff">&lt;</span><span style="color: #800000">UserControl</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> </span><span style="color: #008000">&lt;!--</span><span style="color: #008000"> Namespaces omitted for brevity </span><span style="color: #008000">--&gt;</span><span style="color: #000000">
</span><span style="color: #008080"> 2</span> <span style="color: #000000">  </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Grid</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080"> 3</span> <span style="color: #000000">    </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ToggleButton </span><span style="color: #ff0000">x:Name</span><span style="color: #0000ff">="Toggle"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080"> 4</span> <span style="color: #000000">      </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ToggleButton.Template</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080"> 5</span> <span style="color: #000000">        </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ControlTemplate </span><span style="color: #ff0000">TargetType</span><span style="color: #0000ff">="</span><span style="color: #808000">{x:Type ToggleButton}</span><span style="color: #0000ff">"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080"> 6</span> <span style="color: #000000">          </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Grid</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080"> 7</span> <span style="color: #000000">            </span><span style="color: #008000">&lt;!--</span><span style="color: #008000"> Initial opacity is 1 for the initially unchecked ToggleButton state. A trigger changes it to 0 for an initial checked state. </span><span style="color: #008000">--&gt;</span><span style="color: #000000">
</span><span style="color: #008080"> 8</span> <span style="color: #000000">            </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Grid </span><span style="color: #ff0000">x:Name</span><span style="color: #0000ff">="HideMe"</span><span style="color: #ff0000"> Opacity</span><span style="color: #0000ff">="1"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080"> 9</span> <span style="color: #000000">              </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">TextBlock </span><span style="color: #ff0000">Text</span><span style="color: #0000ff">="Hidden"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">
</span><span style="color: #008080">10</span> <span style="color: #000000">            </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Grid</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">11</span> <span style="color: #000000">            </span><span style="color: #008000">&lt;!--</span><span style="color: #008000"> Other parts of the control go here </span><span style="color: #008000">--&gt;</span><span style="color: #000000">
</span><span style="color: #008080">12</span> <span style="color: #000000">          </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Grid</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">13</span> <span style="color: #000000">          </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ControlTemplate.Triggers</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">14</span> <span style="color: #000000">            </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Trigger </span><span style="color: #ff0000">Property</span><span style="color: #0000ff">="ToggleButton.IsChecked"</span><span style="color: #ff0000"> Value</span><span style="color: #0000ff">="True"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">15</span> <span style="color: #000000">              </span><span style="color: #008000">&lt;!--</span><span style="color: #008000"> This setter hides the desired element when the ToggleButton's initial state is checked </span><span style="color: #008000">--&gt;</span><span style="color: #000000">
</span><span style="color: #008080">16</span> <span style="color: #000000">              </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Setter </span><span style="color: #ff0000">TargetName</span><span style="color: #0000ff">="HideMe"</span><span style="color: #ff0000"> Property</span><span style="color: #0000ff">="Opacity"</span><span style="color: #ff0000"> Value</span><span style="color: #0000ff">="0"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">
</span><span style="color: #008080">17</span> <span style="color: #000000">              </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Trigger.EnterActions</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">18</span> <span style="color: #000000">                </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">BeginStoryboard</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">19</span> <span style="color: #000000">                  </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Storyboard</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">20</span> <span style="color: #000000">                    </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">DoubleAnimation </span><span style="color: #ff0000">BeginTime</span><span style="color: #0000ff">="00:00:00"</span><span style="color: #ff0000"> Duration</span><span style="color: #0000ff">="00:00:00.05"</span><span style="color: #ff0000"> Storyboard.TargetName</span><span style="color: #0000ff">="HideMe"</span><span style="color: #ff0000"> Storyboard.TargetProperty</span><span style="color: #0000ff">="(UIElement.Opacity)"</span><span style="color: #ff0000"> To</span><span style="color: #0000ff">="0"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">
</span><span style="color: #008080">21</span> <span style="color: #000000">                  </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Storyboard</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">22</span> <span style="color: #000000">                </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">BeginStoryboard</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">23</span> <span style="color: #000000">              </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Trigger.EnterActions</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">24</span> <span style="color: #000000">              </span><span style="color: #008000">&lt;!--</span><span style="color: #008000"> ExitActions go here to make the Grid with the TextBlock visible again </span><span style="color: #008000">--&gt;</span><span style="color: #000000">
</span><span style="color: #008080">25</span> <span style="color: #000000">            </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Trigger</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">26</span> <span style="color: #000000">          </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">ControlTemplate.Triggers</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">27</span> <span style="color: #000000">        </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">ControlTemplate</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">28</span> <span style="color: #000000">      </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">ToggleButton.Template</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">29</span> <span style="color: #000000">    </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">ToggleButton</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">30</span> <span style="color: #000000">  </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Grid</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #008080">31</span> <span style="color: #000000"></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">UserControl</span><span style="color: #0000ff">&gt;</span></pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></p>
<p>The ToggleButton contains a TextBlock in line 9 that I want hidden when the ToggleButton&#8217;s IsChecked state is True. The animation in line 18 takes care of doing that when the user interacts with the control, but when the control is initialized, I need the Setter in line 16 to hide the TextBlock initially if the ToggleButton is checked by default (through data binding, for example.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2008/01/05/wpf-controltemplate-trigger-tip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The software free-conomy</title>
		<link>http://www.geektieguy.com/2007/12/19/the-software-free-conomy/</link>
		<comments>http://www.geektieguy.com/2007/12/19/the-software-free-conomy/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 06:50:09 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2007/12/19/the-software-free-conomy/</guid>
		<description><![CDATA[After looking through the comments to Jeff Atwood&#8217;s recent post on software product keys, I noticed that quite a few went down the rabbit-hole of&#160; free versus paid software. People suggesting that if you don&#8217;t like paying for software, typing in license keys, managing them and other hassles, you can always go to using free [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.geektieguy.com/wp-content/uploads/2007/12/img-1453.jpg"><img style="border-right: 0px; border-top: 0px; margin: 0px 25px 0px 0px; border-left: 0px; border-bottom: 0px" height="184" alt="Richard Stallman, the prophet of free software, St. IGNUcius" src="http://www.geektieguy.com/wp-content/uploads/2007/12/img-1453-thumb.jpg" width="244" align="left" border="0"/></a> After looking through the comments to Jeff Atwood&#8217;s recent post on <a href="http://www.codinghorror.com/blog/archives/001021.html" target="_blank">software product keys</a>, I noticed that quite a few went down the rabbit-hole of&nbsp; free versus paid software. People suggesting that if you don&#8217;t like paying for software, typing in license keys, managing them and other hassles, you can always go to using free software.</p>
<p>I can see where these people are coming from. I use plenty of free software myself: Windows Live Writer, Audacity, WinMerge, Process Explorer, PowerMenu, WiX, Notepad2, Firefox, Reflector, JAlbum, Gallery, Linux (contribs.org), Paint .NET, etc. etc. etc. Many of these are essential for productive work and I&#8217;m glad they let me accomplish things.</p>
<p>In October 2002 I attended a talk by Richard Stallman, where he was spreading the gospel of free software, which is often equated with open source software, or OSS. It wasn&#8217;t the first time I&#8217;d started thinking about the implications of OSS, but his comments sparked further puzzlement: Is it really possible for programmers to make a living on open source software? Seeing the comments on Jeff&#8217;s blog brought back that question.</p>
<p>It seems to me that a lot of the more successful open source projects out there had their origin in the world of what I want to call the free-conomy, or perhaps the carefree-conomy. It&#8217;s the world all around us consisting of people who do not have to worry about real-world problems connected to making a living: Students, living on their parents&#8217; money or borrowed money; programmers employed by large corporations (that have other means of generating income that enable them to pay the programmer to work on free software); professors in tenured positions at universities, contributing as part of their research. You get the idea.</p>
<p>I&#8217;d be curious to know how many of the commenters to Jeff&#8217;s post fall into that category. I&#8217;d also be curious to know how all the people who contribute to open source, or free software make a living, or how they sustain themselves. These are honestly things I&#8217;m curious about. If you&#8217;re one of them, please tell me.</p>
<p>I think once you transition from the free-conomy to the reality-based economy (&#8220;real life&#8221;?), your perspective changes. You start realizing that you need an income to pay the rent, clothe yourself and your family, buy food, utilities and transportation. You begin to see that if you don&#8217;t pay for the music you like to listen to, the programs you like to use, the books you like to read, the movies you like to watch and the games you like to play, the people who produce those things will not be able to support themselves, and thus there may come a time when you will no longer have that music, those programs, those books, those movies or the games.</p>
<p>So all the hassles that the producers of software or other digitizable content make you go through to access their creations begin to seem like a small inconvenience to pay for the privilege.</p>
<p>Of course, you can still debate what a fair price for such creations is, but that&#8217;s a topic for a different post. You can also debate the principles of &#8220;fair use&#8221; of the creations you may have paid for. That&#8217;s also a topic for another post.</p>
<p>What&#8217;s your perspective on the implications of open source software for people who make a living at software programming/development?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2007/12/19/the-software-free-conomy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing CardSharkV</title>
		<link>http://www.geektieguy.com/2007/11/25/introducing-cardsharkv/</link>
		<comments>http://www.geektieguy.com/2007/11/25/introducing-cardsharkv/#comments</comments>
		<pubDate>Sun, 25 Nov 2007 08:06:56 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2007/11/25/introducing-cardsharkv/</guid>
		<description><![CDATA[Check out this program I&#8217;ve developed, called CardSharkV. It&#8217;s a digital picture storage card/camera &#8220;downloader&#8221; with a twist. It&#8217;s a bit of an experiment, and I&#8217;m looking for some real-world &#8220;beta&#8221; testers. My plan is to try my hand at charging for the program. But to see if word will spread, I&#8217;m planning to give [...]]]></description>
			<content:encoded><![CDATA[<p>Check out this program I&#8217;ve developed, called CardSharkV. It&#8217;s a digital picture storage card/camera &#8220;downloader&#8221; with a twist.</p>
<p>It&#8217;s a bit of an experiment, and I&#8217;m looking for some real-world &#8220;beta&#8221; testers. My plan is to try my hand at charging for the program. But to see if word will spread, I&#8217;m planning to give out 50 or so licenses without charge while I work out any kinks that might be in the program.</p>
<p>If you&#8217;re interested in trying it out, download the program, install and run it, and then click the &#8220;Request License&#8221; button.</p>
<p>Read more about it on the <a href="http://www.geektieguy.com/products/">CardSharkV page</a>.</p>
<p>Update (2007-11-25): CardSharkV depends on the .NET Framework 3.0. It&#8217;s thus meant to be installed on Vista systems only. If you have XP and the .NET Framework 3.0, it should still work. Also, since I posted the whole thing Saturday night after a whole day of re-shaping my first, never published version, I didn&#8217;t test the install too well. I&#8217;ve since had a little time to test and found some issues, especially with the license mechanism. I&#8217;ve posted version 1.0.2.0 to correct those issues and to improve the installer as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2007/11/25/introducing-cardsharkv/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Microsoft deprecates support for XBAP WPF apps in version 5.3 of the Media Center SDK</title>
		<link>http://www.geektieguy.com/2007/11/19/microsoft-deprecates-support-for-xbap-wpf-apps-in-version-53-of-the-media-center-sdk/</link>
		<comments>http://www.geektieguy.com/2007/11/19/microsoft-deprecates-support-for-xbap-wpf-apps-in-version-53-of-the-media-center-sdk/#comments</comments>
		<pubDate>Tue, 20 Nov 2007 05:02:28 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Software development]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2007/11/19/microsoft-deprecates-support-for-xbap-wpf-apps-in-version-53-of-the-media-center-sdk/</guid>
		<description><![CDATA[I downloaded and installed the latest version of the Media Center SDK just now, and was a bit surprised to see that WPF apps are now officially deprecated as a supported way of extending Windows Media Center on Vista. There&#8217;s no big announcement around this so far, it&#8217;s almost just a footnote in the &#8220;What&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I downloaded and installed the latest version of the Media Center SDK just now, and was a bit surprised to see that WPF apps are now officially deprecated as a supported way of extending Windows Media Center on Vista. There&#8217;s no big announcement around this so far, it&#8217;s almost just a footnote in the &#8220;What&#8217;s New&#8221; section:</p>
<blockquote><p><b>Deprecated features</b> </p>
<p>The following features have been deprecated:
<ul>
<li>Hosting for Microsoft .NET Framework 3.0 Extensible Application Markup Language (XAML) browser applications (XBAPs).  </li>
<li>The Triple-tap/Soft-keyboard ActiveX control for hosted HTML applications.  </li>
<li>Support for using alternative shells to run and host HTML applications.</li>
</ul>
</blockquote>
<p>The reason I&#8217;m surprised is that Microsoft announced the support for WPF based extensibility apps at PDC05 with some fanfare.</p>
<p>I guess interest among developers just hasn&#8217;t been there for WPF-based Media Center apps, and Microsoft needs to make judgment calls on where to invest in their extensibility platform. The rest of the deprecated features seem to have been made for the same reason: limited interest among developers for these features. In addition I think there might be issues of an architectural nature that just make the three things that got dropped too expensive to maintain or improve.</p>
<p>I&#8217;m sad about this development, mostly because I still don&#8217;t see a great set of development and design tools around for MCML. WPF seems to me to have a whole lot more momentum than MCML (WPF has the Expression suite of tools and has been billed as the &#8220;GDI for the next 20 years&#8221;), but who knows what may be coming for Windows 7, or even an earlier interim update for Media Center?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2007/11/19/microsoft-deprecates-support-for-xbap-wpf-apps-in-version-53-of-the-media-center-sdk/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>How to parse &quot;special&quot; .lnk files, aka. MSI shortcuts aka. Windows Installer advertised shortcuts using C#</title>
		<link>http://www.geektieguy.com/2007/11/19/how-to-parse-special-lnk-files-aka-msi-shortcuts-aka-windows-installer-advertised-shortcuts-using-c/</link>
		<comments>http://www.geektieguy.com/2007/11/19/how-to-parse-special-lnk-files-aka-msi-shortcuts-aka-windows-installer-advertised-shortcuts-using-c/#comments</comments>
		<pubDate>Tue, 20 Nov 2007 04:21:39 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2007/11/19/how-to-parse-special-lnk-files-aka-msi-shortcuts-aka-windows-installer-advertised-shortcuts-using-c/</guid>
		<description><![CDATA[[Update 2012-02-04: Jonathan pointed out a few additional things in the comments.] [Update 2010-01-20: It looks like the calls to MsiGetShortcutTarget() and MsiGetComponentPath() only work correctly on Windows 7 if you make them from a thread that has STA apartment state. So if you do a lengthy operation like iterating through the entire Start menu [...]]]></description>
			<content:encoded><![CDATA[<p>[<strong>Update 2012-02-04:</strong> Jonathan pointed out a few additional things in the comments.]</p>
<p>[<strong>Update 2010-01-20</strong>: It looks like the calls to MsiGetShortcutTarget() and MsiGetComponentPath() only work correctly on Windows 7 if you make them from a thread that has STA apartment state. So if you do a lengthy operation like iterating through the entire Start menu on a background thread, make sure to use the Thread class for that (remember to call SetApartmentState() before kicking it off) and not BackgroundWorker. BackgroundWorker threads are taken from a thread pool and are always MTA (they can't be forced to STA in any way). Thanks to the folks on <a href="http://stackoverflow.com/questions/4490361/c-dllimport-of-msigetshortcuttargetmsi-dll-failed-with-error-1603-under-window">stackoverflow</a> for discussing and figuring this out, especially <a href="http://stackoverflow.com/users/3496/arnout">Arnout</a>.]</p>
<p>This is a problem that&#8217;s been bugging me for about a year and I finally found time to dig in and work on how to solve it. A big thank you goes to <a href="http://blogs.msdn.com/astebner">Aaron Stebner</a> for pointing me in the right direction. Thanks Aaron!</p>
<p>Anyway, for various reasons I&#8217;ve wanted to display a list of applications the user has installed on the computer. Getting at the All Programs folder in the Start Menu is not too big a problem. You can get parts of it via Environment.GetFolderPath(SpecialFolder.Programs) and other parts of it (for all users) via a bunch of P/Invoke incantations that I&#8217;m not going into here. Iterating through all subfolders and picking out the .lnk files is not a problem either.</p>
<p>What is a problem (at least it was for me) is what to do with those .lnk files that you can&#8217;t get parsed correctly via WshShell.CreateShortcutFile() after adding a reference to the Windows Script Host Object Model to your project. The .TargetPath will usually return something down in a C:\Windows\Installer\{GUID} directory.</p>
<p>I had noticed that the Windows Installer XML 3.0 project creates shortcuts like that, and since Aaron is involved in that project, I asked him about it. He graciously told me that those shortcuts are &#8220;advertised&#8221; shortcuts, a kind of Windows Installer shortcut that enables putting a link in the Start Menu (or elsewhere) while not necessarily installing the whole product that the link points to. So I started digging in with Google. A CodeProject article contained a comment about two functions that can be used in combination to find the real target of and advertised shortcut: MsiGetShortcutTarget() and MsiGetComponentPath(). After some more digging, I had P/Invoke declarations for both of these from this <a href="http://sourceforge.net/project/showfiles.php?group_id=40188&amp;package_id=110212">SourceForge</a> project.</p>
<p>I ended up with this bit of code, which I use first on any shortcut file I need to interpret; then if it returns null, I use the WshShell way instead.</p>
<pre><!--   

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000ff;">public </span><span style="color: #0000ff;">static </span><span style="color: #0000ff;">string</span><span style="color: #000000;"> ParseShortcut(</span><span style="color: #0000ff;">string</span><span style="color: #000000;"> file) {
 </span><span style="color: #000000;">StringBuilder product </span><span style="color: #000000;">= </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder(MaxGuidLength </span><span style="color: #000000;">+</span><span style="color: #800080;">1</span><span style="color: #000000;">);
 StringBuilder feature </span><span style="color: #000000;">= </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder(MaxFeatureLength </span><span style="color: #000000;">+</span><span style="color: #800080;">1</span><span style="color: #000000;">);
 StringBuilder component </span><span style="color: #000000;">= </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder(MaxGuidLength </span><span style="color: #000000;">+</span><span style="color: #800080;">1</span><span style="color: #000000;">);
 MsiGetShortcutTarget(file, product, feature, component);
 </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> pathLength </span><span style="color: #000000;">=</span><span style="color: #000000;"> MaxPathLength;
 StringBuilder path </span><span style="color: #000000;">= </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder(pathLength);
 InstallState installState </span><span style="color: #000000;">=</span><span style="color: #000000;"> MsiGetComponentPath( </span><span style="color: #000000;">product.ToString(), component.ToString(), path, </span><span style="color: #0000ff;">ref</span><span style="color: #000000;"> pathLength);
 </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (installState </span><span style="color: #000000;">==</span><span style="color: #000000;"> InstallState.Local)
 </span><span style="color: #000000;">{
 </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> path.ToString();
 </span><span style="color: #000000;">}
 </span><span style="color: #0000ff;">else
 </span><span style="color: #000000;"> {
 </span><span style="color: #0000ff;">return </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;
 }
}</span> </pre>
<p>If you&#8217;re interested, you can <a title="msishortcutparser.zip" href="http://www.geektieguy.com/wp-content/uploads/2007/11/msishortcutparser.zip">download the class</a> with the rest of the needed declarations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2007/11/19/how-to-parse-special-lnk-files-aka-msi-shortcuts-aka-windows-installer-advertised-shortcuts-using-c/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Silicon Valley Code Camp impressions</title>
		<link>http://www.geektieguy.com/2007/10/29/silicon-valley-code-camp-impressions/</link>
		<comments>http://www.geektieguy.com/2007/10/29/silicon-valley-code-camp-impressions/#comments</comments>
		<pubDate>Tue, 30 Oct 2007 05:19:12 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2007/10/29/silicon-valley-code-camp-impressions/</guid>
		<description><![CDATA[I&#8217;m just about recovered from two interesting days at Silicon Valley Code Camp. Overall I found the time I spent there well invested. It was fun seeing the diversity of software developers we have here, and the talks were of high quality overall. Here&#8217;s part of the lunch line from the second day: Of all [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m just about recovered from two interesting days at Silicon Valley Code Camp. Overall I found the time I spent there well invested. It was fun seeing the diversity of software developers we have here, and the talks were of high quality overall.</p>
<p>Here&#8217;s part of the lunch line from the second day:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2007/10/img-9714.jpg" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" alt="IMG_9714" src="http://www.geektieguy.com/wp-content/uploads/2007/10/img-9714-thumb.jpg" width="240" border="0"/></a></p>
<p>Of all the sessions I attended, I&#8217;d say the top four were the introductory <a href="http://www.siliconvalley-codecamp.com/Sessions.aspx?OnlyOne=true&amp;id=191" target="_blank">LINQ talk by Beth Massi</a>, the <a href="http://www.siliconvalley-codecamp.com/Sessions.aspx?OnlyOne=true&amp;id=186" target="_blank">Architecture talk by Kim Greenlee</a>, the <a href="http://www.siliconvalley-codecamp.com/Sessions.aspx?OnlyOne=true&amp;id=148" target="_blank">Project talk by Jeff Atwood</a> and the <a href="http://www.siliconvalley-codecamp.com/Sessions.aspx?OnlyOne=true&amp;id=160" target="_blank">UI Designer talk by Uday Gajendar</a>. This picture&nbsp;is from Ujay&#8217;s talk (a bit fuzzy, sorry):</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2007/10/img-9715.jpg" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" alt="IMG_9715" src="http://www.geektieguy.com/wp-content/uploads/2007/10/img-9715-thumb.jpg" width="240" border="0"/></a></p>
<p>The talk on <a href="http://www.siliconvalley-codecamp.com/Sessions.aspx?OnlyOne=true&amp;id=193" target="_blank">what makes agile projects succeed by Chris Sims</a> was not a traditional presentation, but a highly interactive workshop, where Chris introduced us to the Nominal Group Technique; a way to brainstorm while making sure nobody gets to dominate the process. I think this was the session I enjoyed the most because it was so different and engaging. In that session&nbsp;we got a glimpse of the soon to be released XO laptop (one laptop per child), and later in the day, I got to grab a hold of it for a few minutes. It&#8217;s a very well made product. Check it out at <a href="http://www.laptop.org">www.laptop.org</a> (or <a href="http://www.xogiving.org">www.xogiving.org</a>, if you&#8217;re inclined to be charitable and help out a child in a developing country.)</p>
<p>I had quite a bit of fun trying out a new toy, too: a digital sound recorder. I used it to record a few of the sessions I attended. If the speakers permit it, the recordings&nbsp;might get placed on the <a href="http://codecamp.pbwiki.com/" target="_blank">Code Camp Wiki</a> over the course of the next few days.</p>
<p>To give you a bit of an impression of what it was like to be at Foothill College early on a Saturday morning (9 AM), here is a picture:</p>
<p><a href="http://www.geektieguy.com/wp-content/uploads/2007/10/img-9711.jpg" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" alt="IMG_9711" src="http://www.geektieguy.com/wp-content/uploads/2007/10/img-9711-thumb.jpg" width="240" border="0"/></a></p>
<p>I have a <a href="http://www.geektieguy.com/wp-content/uploads/2007/10/ds300014.WMA" target="_blank">sound recording</a> to go with it, too. The dog in the picture is Milo. How do I know? Listen to the recording.</p>
<p>I can recommend going to Code Camp next year, if you can make it. It&#8217;s worth it trying to step out of the typical programmer &#8220;introversion&#8221; and talk to people. It&#8217;s hard to overcome that&nbsp;initial shyness, but once you do, you&#8217;ll have a much better time. I&#8217;ll need to do more of that next time. Barring any serious scheduling problems, I&#8217;ll definitely be back next year.</p>
<p>Thanks to <a href="http://www.peterkellner.net/" target="_blank">Peter Kellner</a> and all the other people who supported the event. Also a big thank you to all the presenters, especially the ones I got to hear (<a href="http://www.technicalmanagementinstitute.com" target="_blank">Chris Sims</a>, <a href="http://krgreenlee.blogspot.com/" target="_blank">Kim Greenlee</a>, <a href="http://www.codinghorror.com" target="_blank">Jeff Atwood</a>, <a href="http://www.udanium.com" target="_blank">Uday Gajendar</a>, <a href="http://www.peterkellner.net/" target="_blank">Peter Kellner</a>, <a href="http://www.insteptech.com/" target="_blank">Deborah Kurata</a>, <a href="http://blogs.msdn.com/bethmassi/" target="_blank">Beth Massi</a>, <a href="http://cyberwebconsulting.com/" target="_blank">Wesley Chun</a> and <a href="http://blog.brandewinder.com/" target="_blank">Mathias Brandewinder</a>.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2007/10/29/silicon-valley-code-camp-impressions/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Windows Live Writer Beta 3 startup problems solved</title>
		<link>http://www.geektieguy.com/2007/09/11/windows-live-writer-beta-3-startup-problems-solved/</link>
		<comments>http://www.geektieguy.com/2007/09/11/windows-live-writer-beta-3-startup-problems-solved/#comments</comments>
		<pubDate>Tue, 11 Sep 2007 19:21:07 +0000</pubDate>
		<dc:creator>GeekTieGuy</dc:creator>
				<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.geektieguy.com/2007/09/11/windows-live-writer-beta-3-startup-problems-solved/</guid>
		<description><![CDATA[I like Windows Live Writer. Except for one thing: I couldn&#8217;t get it to start up on my machine at work. Beta 1 worked, but Beta 2 and Beta 3 just wouldn&#8217;t. I&#8217;d always get a UriException (not sure of the precise name anymore) thrown at some point after the splash screen. During Beta 2, [...]]]></description>
			<content:encoded><![CDATA[<p>I like <a href="http://get.live.com/betas/writer_betas" target="_blank">Windows Live Writer</a>. Except for one thing: I couldn&#8217;t get it to start up on my machine at work. Beta 1 worked, but Beta 2 and Beta 3 just wouldn&#8217;t. I&#8217;d always get a UriException (not sure of the precise name anymore) thrown at some point after the splash screen. </p>
<p>During Beta 2, I dutifully sent the crash reports to Microsoft, and even contacted their support email address once, hoping the problem would be addressed with Beta 3.</p>
<p>It wasn&#8217;t. Live Writer Beta 3 still crashed on me after the splash screen.</p>
<p>So I started digging into why it crashed. Luckily it&#8217;s a .NET app, so <a href="http://www.aisto.com/roeder/dotnet/" target="_blank">Reflector</a> came in handy. So did <a href="http://www.codeplex.com/deblector" target="_blank">Deblector</a>. I finally tracked it down to a registry key that contained a setting for a blog at work, where the HomePageUrl was a path of the form /some/path. I deleted the entire tree for that blog, and now Live Writer finally starts up properly.</p>
<p>The key I deleted was a subkey under this:</p>
<p>HKEY_CURRENT_USER\Software\Microsoft\Windows Live\Writer\Weblogs</p>
<p>I think Microsoft needs to fix this before shipping the final version.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geektieguy.com/2007/09/11/windows-live-writer-beta-3-startup-problems-solved/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

