<?xml version="1.0" encoding="iso-8859-1"?>
<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>Big Nick&#039;s Blog</title>
	<atom:link href="http://bignickolson.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://bignickolson.com</link>
	<description>...my blog on what I&#039;m learning, working, or playing with in technology</description>
	<lastBuildDate>Fri, 08 Jul 2011 04:31:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>MVVM and Speech using the Kinect-Pt. II</title>
		<link>http://bignickolson.com/2011/07/07/mvvm-and-speech-using-the-kinect-pt-ii/</link>
		<comments>http://bignickolson.com/2011/07/07/mvvm-and-speech-using-the-kinect-pt-ii/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 16:12:34 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[Kinect]]></category>
		<category><![CDATA[MVVM]]></category>
		<category><![CDATA[Speech Recognition]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://bignickolson.com/?p=328</guid>
		<description><![CDATA[In the last post I talked about what I recently done with Speech recognition and tying it in with MVVM's concepts of Commands. In this post, I want to walkthrough, step by step of how I set things up.&#160; To get everything installed I just followed the directions for setting up the Kinect SDK, which [...]]]></description>
			<content:encoded><![CDATA[<p>In the last post I talked about what I recently done with Speech recognition and tying it in with MVVM's concepts of Commands.</p>
<p>In this post, I want to walkthrough, step by step of how I set things up.&#160; To get everything installed I just followed the directions for setting up the Kinect SDK, which also included the direction on setting up the Speech API.&#160; Google that and you'll be well on your way.</p>
<p>After getting it setup, I recommend you give the Kinect SDK samples a try to make sure everything installed correctly.&#160; From there I took a look at what the Kinect speech sample was doing and modified it to work with the default audio source instead of the Kinect.&#160; Mostly, because my Kinect needs to pull double duty between my hacking and actually letting me play on the Xbox.&#160; Not sure how I can convince the wife we need a second one just yet.</p>
<p>Note that some of the code examples use some extensions methods in a little library of mine.&#160; So you might not be able to directly copy/paste.  Hit up the continue reading link for the rest...</p>
<p><span id="more-328"></span></p>
<h2>Speech Command</h2>
<p>Nothing groundbreaking here.&#160; This is basically a note for note reimplementation of the DelegateCommand found in Prism and other MVVM frameworks.&#160; The main purpose here is to give somewhere for the Phrase attached property to live.&#160; As I look back, I could have very easily done this entire thing with one class, but I didn't want to take time to setup an entire MVVM framework just for my little proof of concept so I still needed something that implemented ICommand and it just made sense to put it there.</p>
<p>The attached property does one bit of magic.&#160; I provide a callback for when the value changes and in there we do this:</p>
<div>
<pre style="border-bottom-style: none; text-align: left; 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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> PhraseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){    <span style="color: #0000ff">if</span> (DesignerProperties.GetIsInDesignMode(d))        <span style="color: #0000ff">return</span>;

    <span style="color: #0000ff">if</span> (!d.Is&lt;ICommandSource&gt;())        <span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span> InvalidCastException(<span style="color: #006080">&quot;Can only use objects that implement the ICommandSource interface&quot;</span>);

    SpeechFactory.AddPhrase(e.NewValue.ToString(), d.As&lt;ICommandSource&gt;());}</pre>
</div>
<div>&#160;</div>
<div>So we basically pass the phrase and the object that has the attached property set on it.&#160; We do a quick check to make sure it implements the ICommandSource interface.&#160; Objects that do this provide a Command property and a CommandParameter that we will use to execute the command later on.</div>
<div>&#160;</div>
<div>&#160;</div>
<h2>Speech Factory</h2>
<p>This is where 95% of the work is done.&#160; Basically, it's a static class that does all the instantiation and setup of the speech recognition engine.&#160; It also maintains the list of phrases the developer has entered in the Xaml.</p>
<p>The first thing we do is setup all the recognition engine code:</p>
<div id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; 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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">

<span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">bool</span> _commandMode;<span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> Timer _timer = <span style="color: #0000ff">new</span> Timer(3000);<span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> SpeechRecognitionEngine _engine;<span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> Dictionary&lt;<span style="color: #0000ff">string</span>, ICommandSource&gt; _phrases =    <span style="color: #0000ff">new</span> Dictionary&lt;<span style="color: #0000ff">string</span>, ICommandSource&gt;();<span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">string</span> _commandWord = <span style="color: #006080">&quot;computer&quot;</span>;

<span style="color: #0000ff">static</span> SpeechFactory(){

    _engine = <span style="color: #0000ff">new</span> SpeechRecognitionEngine();    _engine.SpeechRecognized += SpeechRecognized;    _engine.SpeechHypothesized += SpeechHypothesized;    _engine.SpeechRecognitionRejected += SpeechRecognitionRejected;    _engine.SetInputToDefaultAudioDevice();

    _engine.LoadGrammar(<span style="color: #0000ff">new</span> Grammar(<span style="color: #0000ff">new</span> GrammarBuilder(<span style="color: #0000ff">new</span> Choices(_commandWord))));    _engine.RecognizeAsync(RecognizeMode.Multiple);

    _timer.Elapsed += <span style="color: #0000ff">new</span> ElapsedEventHandler(_timer_Elapsed);}
</pre>
<p></div>
<p>We setup all the recognition events and kick it off.&#160; Whenever a new phrase is added we reload the grammar and choice lists the engine uses to determine what has been spoken.</p>
<div>
<pre style="border-bottom-style: none; text-align: left; 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: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> AddPhrase(<span style="color: #0000ff">string</span> phrase, ICommandSource source){

    _phrases.Add(phrase.Trim().ToLower(), source);

    <span style="color: #008000">// TODO: There are culture considerations to take into effect</span>    var choices = _phrases.Keys.Union(<span style="color: #0000ff">new</span> <span style="color: #0000ff">string</span>[]{_commandWord}).ToArray();    var gb = <span style="color: #0000ff">new</span> GrammarBuilder(<span style="color: #0000ff">new</span> Choices(choices));

    _engine.UnloadAllGrammars();    _engine.LoadGrammar(<span style="color: #0000ff">new</span> Grammar(gb));}</pre>
</div>
<div>&#160;</div>
<div>One final little thing I do is the concept of a command word.&#160; So it</p>
]]></content:encoded>
			<wfw:commentRss>http://bignickolson.com/2011/07/07/mvvm-and-speech-using-the-kinect-pt-ii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MVVM and Speech using the Kinect&#8211;Pt. I</title>
		<link>http://bignickolson.com/2011/06/30/mvvm-and-speech-using-the-kinectpt-i/</link>
		<comments>http://bignickolson.com/2011/06/30/mvvm-and-speech-using-the-kinectpt-i/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 16:13:10 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Kinect]]></category>
		<category><![CDATA[MVVM]]></category>
		<category><![CDATA[Speech Recognition]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://bignickolson.com/2011/06/30/mvvm-and-speech-using-the-kinectpt-i/</guid>
		<description><![CDATA[I have always been fascinated by interacting with a computer in ways beyond the traditional keyboard and mouse.&#160; The problem is, as I learned while getting my degree in computer science, some problems are really hard. I didn't want to dedicate years to obtaining PhD in computer vision or spend my life doing statistics. But, [...]]]></description>
			<content:encoded><![CDATA[<p>I have always been fascinated by interacting with a computer in ways beyond the traditional keyboard and mouse.&#160; The problem is, as I learned while getting my degree in computer science, some problems are really hard. </p>
<p>I didn't want to dedicate years to obtaining PhD in computer vision or spend my life doing statistics. But, like any other good developer, I'll just take the toolkit someone else came up with to solve the hard problems.</p>
<p>Enter the Kinect.</p>
<p>In reality, Microsoft has had a Speech API for quite some time and I've played with it in the past, but with the Kinect they've produced a beautiful piece of hardware that can do 3D depth sensing, speech recognition and directional detection, live skeletal tracking and more all in package that doesn't cost a lot more than a high-end web cam.&#160; This first example doesn't actually require the Kinect, in fact, the code itself just uses the default audio input.&#160; But it can be easily changed to use the Kinect audio stream.&#160; Later projects I'm working on will use the Kinect camera's to do some hopefully neat things.</p>
<p>Since the Kinect hacking started my brain has been churning with ideas.&#160; Of the most pragmatic, was the thought to tie in speech recognition to an MVVM application.&#160; The nice thing about a well implemented screen using MVVM is that you have your UI described seperately in XAML on the front end and a class (ViewModel) containing your library of commands that can be executed.&#160; Using a Command object you can tie a specific element, like a button, to perform a specific command like Save very cleanly and easily. </p>
<p>This clean seperation of concerns mean you don't really care how a command is invoked, whether it's a button press, keyboard shortcut, or voice command it all works the same.&#160; Your ViewModel executes the command and the UI happily updates through the powerful databinding of XAML.</p>
<p>Aside from the obvious scifi references that this brings to mind, it could also help by making programs more accessible to the vision or mobility impaired.&#160; Also, it could be just plain more efficient in some scenarios.</p>
<p>Most of the work is done for us by the commanding infrastructure in WPF.&#160; So first I'd like ta take a look at how this implementation will be used.&#160; Below is a standard button declaration with a command attached.</p>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">=&quot;Save&quot;</span> <span class="attr">Command</span><span class="kwrd">=&quot;{Binding Save}&quot;</span> <span class="kwrd">/&gt;</span></pre>
<p>&#160;</p>
<p>The other great thing about XAML is the extensibility, so by the time we've implemented this speech API the only thing that will change is this:</p>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">=&quot;Save&quot;</span> <span class="attr">Command</span><span class="kwrd">=&quot;{Binding Save}&quot;</span>
             <span class="attr">voice:SpeechCommand</span>.<span class="attr">Phrase</span><span class="kwrd">=&quot;save&quot;</span> <span class="kwrd">/&gt;</span></pre>
<p>&#160;</p>
<p>One simple property added and that's pretty much all the end developer needs to do.&#160; The only other thing we need for using the speech recognition is something I call a SpeechCommand, which is basically just an implementation of the standard DelegateCommand found in MVVM frameworks.&#160; The SpeechCommand acts exactly like the standard commands, but it is also the place for the Phrase AttachedProperty to live and is the glue that bridges the application to my wrapper around the Speech API.</p>
<p>In the next post I'll walkthrough how I built the app and post some source code.&#160; Until then, I leave you with a screenshot.&#160; Please note, that no mouse or keyboards were harmed (or used <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://bignickolson.com/wp-content/uploads/2011/06/wlEmoticon-smile.png" />) in the taking of this screenshot.</p>
<p><a href="http://bignickolson.com/wp-content/uploads/2011/06/voice.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="voice" border="0" alt="voice" src="http://bignickolson.com/wp-content/uploads/2011/06/voice_thumb.jpg" width="454" height="340" /></a></p>
<p>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style></p>
]]></content:encoded>
			<wfw:commentRss>http://bignickolson.com/2011/06/30/mvvm-and-speech-using-the-kinectpt-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Custom Markup Extension To Replace IValueConverter</title>
		<link>http://bignickolson.com/2011/04/18/custom-markup-extension-to-replace-ivalueconverter/</link>
		<comments>http://bignickolson.com/2011/04/18/custom-markup-extension-to-replace-ivalueconverter/#comments</comments>
		<pubDate>Mon, 18 Apr 2011 19:24:24 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Tech. Discussions]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://bignickolson.com/?p=313</guid>
		<description><![CDATA[Something that's been around in WPF for a long time but is just seeing the light of day in the upcoming Silverlight 5 release is the concept of a custom MarkupExtension.&#160; For those unfamiliar with the concept, a MarkupExtension is anything within the curly braces "{}" of your xaml. Some examples include, Binding, Static- and [...]]]></description>
			<content:encoded><![CDATA[<p>Something that's been around in WPF for a long time but is just seeing the light of day in the upcoming Silverlight 5 release is the concept of a custom MarkupExtension.&#160; For those unfamiliar with the concept, a MarkupExtension is anything within the curly braces "{}" of your xaml.</p>
<p>Some examples include, Binding, Static- and DynamicResource, Type, Static, etc.&#160; You can look at the code below and see some examples:</p>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">Grid</span> <span class="attr">x:Name</span><span class="kwrd">=&quot;LayoutRoot&quot;</span> <span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">ContentControl</span> <span class="attr">Style</span><span class="kwrd">=&quot;{StaticResource BgBlueTop}&quot;</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Border</span> <span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">ItemsControl</span> <span class="attr">ItemsSource</span><span class="kwrd">=&quot;{Binding Messages}&quot;</span><span class="kwrd">&gt;</span>
             ...
        <span class="kwrd">&lt;/</span><span class="html">ItemsControl</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">Border</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">Grid</span><span class="kwrd">&gt;</span></pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Basically, the xaml parser can interpret an attribute as a string literal value or convert it to an object through some means.&#160; Markup extensions allow you to do the deciding about how the value you're setting should be interpreted by the xaml parser.&#160; For a much more in depth look at how this all works, a decent place to start is this link on MSDN:</p>
<p><a title="http://msdn.microsoft.com/en-us/library/ms747254.aspx" href="http://msdn.microsoft.com/en-us/library/ms747254.aspx">http://msdn.microsoft.com/en-us/library/ms747254.aspx</a></p>
<p>One interesting use of MarkupExtensions I've been playing with is a reimplementation of the Binding markup extension to provide an alternative to the IValueConverter interface. Sometimes you really only need to do a conversion once or a couple times on a specific screen.&#160; When you implement a value converter it feels like you are taking a tiny bit of view or business logic and stuffing it in an unrelated portion of your application.&#160; That being said, a standardized library of value converters like boolean-to-visibility and so on can make developing on a project much easier to use.&#160; But for the one off scenarios, it'd be nice to keep all that logic contained in your ViewModel and not have to worry about spinning up a new class for such a simple thing.</p>
<p>I used the post <a href="http://www.hardcodet.net/2008/04/wpf-custom-binding-class" target="_blank">here</a> as a starting point for my custom binding because working with Binding or BindingBase was not going so well.&#160; From there I created my own Binding class and added a ConverterDelegate property.&#160; This property looks for a method on the same DataContext of the binding and uses a generic IValueConverter behind the scenes to call that method of the DataContext.&#160; This helps get rid of all those little one-off classes that you have to create for specific conversion scenarios. </p>
<p>The code is far from production ready but the gist of it is that a custom MarkupExtension overrides the ProvideValue method of the abstract MarkupExtension class. In the background I look up the method on my DataContext and use a IValueConverter that calls that method to do the conversion. So to wire up my converter I can simply do this:</p>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">Window</span> <span class="attr">x:Class</span><span class="kwrd">=&quot;CustomMarkup.Window1&quot;</span>
    <span class="attr">xmlns</span><span class="kwrd">=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span>
    <span class="attr">xmlns:x</span><span class="kwrd">=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span>
    <span class="attr">xmlns:local</span><span class="kwrd">=&quot;clr-namespace:CustomMarkup&quot;</span>
    <span class="attr">Title</span><span class="kwrd">=&quot;Window1&quot;</span> <span class="attr">Height</span><span class="kwrd">=&quot;300&quot;</span> <span class="attr">Width</span><span class="kwrd">=&quot;300&quot;</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Grid</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Content</span><span class="kwrd">=&quot;{local:ExBinding Path=ButtonText,
                ConverterDelegate=ToUpper}&quot;</span>
                <span class="attr">Height</span><span class="kwrd">=&quot;25&quot;</span> <span class="attr">Width</span><span class="kwrd">=&quot;100&quot;</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">Grid</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">Window</span><span class="kwrd">&gt;</span></pre>
<p>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>You can see I have a converter delegate called ToUpper and in my code behind or ViewModel I can simply write whatever methods I need to do conversions like this:</p>
<pre class="csharpcode">    <span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> Window1 : Window
    {
        <span class="kwrd">public</span> Window1()
        {
            DataContext = <span class="kwrd">this</span>;
            InitializeComponent();
        }

        <span class="rem">// our converter method</span>
        <span class="kwrd">public</span> <span class="kwrd">object</span> ToUpper(<span class="kwrd">object</span> <span class="kwrd">value</span>)
        {
            <span class="kwrd">return</span> (<span class="kwrd">object</span>)<span class="kwrd">value</span>.ToString().ToUpper();
        }

        <span class="kwrd">public</span> <span class="kwrd">string</span> ButtonText { get; set;}
    }</pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>I can post the sample project if I get interest but the real point is to give a small showing of what's possible with custom MarkupExtensions in WPF and SL5.</p>
]]></content:encoded>
			<wfw:commentRss>http://bignickolson.com/2011/04/18/custom-markup-extension-to-replace-ivalueconverter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Switching Windows Versions &#8211; &#8220;Downgrading&#8221; to Enterprise</title>
		<link>http://bignickolson.com/2011/01/20/switching-windows-versions/</link>
		<comments>http://bignickolson.com/2011/01/20/switching-windows-versions/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 19:52:33 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Off Topic]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.bignickolson.com/?p=300</guid>
		<description><![CDATA[So I recently bought a new laptop and asked the IT people at RBA about which version of Windows to install on it. They said it was all on our network so I went out and saw we had both Ultimate and Enterprise versions. Being a sucker for marketing gimmicks I grabbed the Ultimate version [...]]]></description>
			<content:encoded><![CDATA[<p>So I recently bought a new laptop and asked the IT people at RBA about which version of Windows to install on it. They said it was all on our network so I went out and saw we had both Ultimate and Enterprise versions. Being a sucker for marketing gimmicks I grabbed the Ultimate version because it sounded cooler.</p>
<p>Unfortunately, I chose wrong. I should have used the Enterprise version because that's what we are licensed for. In the end, they are the same version, but Enterprise is sold only to businesses and Ultimate is sold to home users.</p>
<p>So you think it would be an easy task to switch from one to the other, but the only officially supported way is to completely reinstall and start over. I had just spent the entire night setting up all my software, so I didn't really feel like doing it twice two nights in a row.</p>
<p>Luckily, there is a way to workaround the limitation, I've pulled and simplified from here: <a href="http://www.mydigitallife.info/2009/11/03/hack-to-in-place-downgrade-from-windows-7-ultimate-or-professional-to-less-premium-editions/">http://www.mydigitallife.info/2009/11/03/hack-to-in-place-downgrade-from-windows-7-ultimate-or-professional-to-less-premium-editions/</a></p>
<p>The condensed version is to:</p>
<ol>
<li>Run RegEdit on your computer and navigate to HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Current Version</li>
<li>In the right hand side change the word "Ultimate" to "Enterprise" under both the EditionID and ProductName entries</li>
<li>From there I inserted the Windows 7 DVD and ran setup and chose upgrade and everything worked flawlessly</li>
</ol>
<p><strong>Note: I reran the setup from inside of Windows. I did not boot from the DVD to do the upgrade so I don't know if it works that way or not.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://bignickolson.com/2011/01/20/switching-windows-versions/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wii Remote Force Calculator</title>
		<link>http://bignickolson.com/2010/08/11/wii-remote-force-calculator/</link>
		<comments>http://bignickolson.com/2010/08/11/wii-remote-force-calculator/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 03:36:01 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Neat Ideas]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[TKD]]></category>
		<category><![CDATA[Wii]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://blog.bignickolson.com/?p=296</guid>
		<description><![CDATA[Recently, I've been doing a fun side project.  It's always fun when you can come up with an excuse to combine your hobbies or interests.   So I came up with the idea of using a Wii remote to calculate the force of a strike on a heavy bag. I've had to dredge up old [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Recently, I've been doing a fun side project.  It's always fun when you can come up with an excuse to combine your hobbies or interests.   So I came up with the idea of using a Wii remote to calculate the force of a strike on a heavy bag.</p>
<p style="text-align: center;"><a href="http://bignickolson.com/wp-content/uploads/2010/08/force-tracker.jpg"><img class="aligncenter size-full wp-image-295" title="Screenshot" src="http://bignickolson.com/wp-content/uploads/2010/08/force-tracker.jpg" alt="Screenshot" width="413" height="265" /></a></p>
<p style="text-align: center;">
<p style="text-align: left;">I've had to dredge up old memories from my college physics classes, and I'm not entirely sure what I've got is hundred percent accurate, but I feel with proper setup it's pretty good.  The calculation is easy enough, to get the force you just multiply the mass times the acceleration of the object.  The accelerometers in the Wii remote are accurate to about  +/- 3 Gs with about a ten percent range of error.  Not too terrible for a fifty dollar bluetooth enable accelerometer you can pick up at any store in town.  The problem is, if you try to hold it in your hand you can generate massive amounts of acceleration well above 3 Gs.  So instead,  I tied the remote onto a heavy bag.  Much more mass, means you get the same amount of force with acceleration levels well within the remotes acceptable range.</p>
<p style="text-align: left;">Force = mass * acceleration</p>
<p style="text-align: left;">Because I'm not punching any harder, the force stays the same.  The heavy bag has a lot more mass, so the acceleration has to be a lot less to equal the same force.</p>
<p style="text-align: left;">The thing I'm not sure of is whether I have to take into account the fact the bag is on a chain so it actually swings up in an arc.  I don't know how much that affects the calculations, but I don't think it would be a lot with the small amount of time range we're talking about.</p>
<p style="text-align: left;">My next steps are to try and rig up some testing system to try to determine the accuracy of the measurements.  I also want to get the opinion of some physics people to get my calculations even more accurate.  It's been a fun project so far and I'd like to get it to the point where I could bring it into the gym and have my students play around with it a little bit.</p>
<p style="text-align: left;">The application itself is written in C#, using WPF, MVVM, and <a href="http://wiimotelib.codeplex.com/">Wiimote Lib</a></p>
<p style="text-align: left;">I'll try to post any updates here as they develop.</p>
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>http://bignickolson.com/2010/08/11/wii-remote-force-calculator/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Uses for Silverlight reflection, pt. II</title>
		<link>http://bignickolson.com/2010/04/27/uses-for-silverlight-reflection-pt-ii/</link>
		<comments>http://bignickolson.com/2010/04/27/uses-for-silverlight-reflection-pt-ii/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 16:17:20 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Tech. Discussions]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[localization]]></category>
		<category><![CDATA[Reflection]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://blog.bignickolson.com/?p=288</guid>
		<description><![CDATA[So, as promised, here is the followup to what I was doing with Silverlight reflection that made me need access to Internal members of a class. Localization in Silverlight is still an interesting story and everybody seems to have their own way of doing it.  The client I'm on uses Excel spreadsheets that load into [...]]]></description>
			<content:encoded><![CDATA[<p>So, as promised, here is the followup to what I was doing with Silverlight reflection that made me need access to Internal members of a class.</p>
<p>Localization in Silverlight is still an interesting story and everybody seems to have their own way of doing it.  The client I'm on uses Excel spreadsheets that load into a database. The localization data then pulls when a usercontrol loads and changes the controls data based on the locale and what was in the database.</p>
<p>This was very tedious for developers to setup.  You would create your UI and then have to go back and pull the default text for your controls and add them all to the spreadsheet.</p>
<p>Using reflection I can create an instance of all the user controls in my assembly and display them to the user in a listbox.  From there, when they select a user control, I can reflect on that type and display all the controls defined in the UserControl to the user.  When you define a control in xaml and give it a name, it becomes an internal member of a partial class generated by Visual Studio.</p>
<p>So, what I do is when you are all done with your UserControl you simply run my tool on the assembly and it reflects through and shows all the UserControls. When you select one, it uses reflection to create an instance with the default constructor, which initializes all your controls properties.</p>
<p>From there I grab all the controls through reflection and use some logic to get which properties of each I want to localize.  For TextBlocks I grab the Text property, for ContentControls it's the Content property, and so on.</p>
<p>Using that I generate a simple tab-delimited string with all the default localization for all the controls and the user can copy/paste right into Excel and move on to their next task and let someone else do the translating/localizing for them.</p>
]]></content:encoded>
			<wfw:commentRss>http://bignickolson.com/2010/04/27/uses-for-silverlight-reflection-pt-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Silverlight Reflection and internal members</title>
		<link>http://bignickolson.com/2010/04/20/silverlight-reflection-and-internal-members/</link>
		<comments>http://bignickolson.com/2010/04/20/silverlight-reflection-and-internal-members/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 03:55:49 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[Reflection]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://blog.bignickolson.com/2010/04/20/silverlight-reflection-and-internal-members/</guid>
		<description><![CDATA[If you want to use reflection in Silverlight you have to come to grips with the fact that you can only reflect on public members of the class.&#160; This is a very important part of the security features in Silverlight. However, I have a scenario that would be greatly helped by being able to reflect [...]]]></description>
			<content:encoded><![CDATA[<p>If you want to use reflection in Silverlight you have to come to grips with the fact that you can only reflect on public members of the class.&#160; This is a very important part of the security features in Silverlight.</p>
<p>However, I have a scenario that would be greatly helped by being able to reflect on internal members.&#160; The documentation I found on MSDN said that as long as the member was visible at compile time you could reflect on it.&#160; This should include internal members in the same assembly or an assembly that's the target of InternalsVisibleTo.</p>
<p>I was having problems, at first I just tried setting the InternalsVisibleTo attribute in the AssemblyInfo.cs for my project to the project that had my reflection code.&#160; </p>
<p>No such luck, even though I could access the members through normal means.&#160; What I was missing was setting the BindingFlags attribute while calling GetMembers on my type.&#160; </p>
<p>If you pass in <strong>BindingFlag.NonPublic | BindingFlags.Public | BindingFlags</strong>.Instance it should all work for you now.</p>
<p>Up next will be a post sometime about why I wanted this ability.</p>
]]></content:encoded>
			<wfw:commentRss>http://bignickolson.com/2010/04/20/silverlight-reflection-and-internal-members/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cradling Device Emulator on Windows 7 in VS 2008</title>
		<link>http://bignickolson.com/2010/04/02/cradling-device-emulator-on-windows-7-in-vs-2008/</link>
		<comments>http://bignickolson.com/2010/04/02/cradling-device-emulator-on-windows-7-in-vs-2008/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 15:25:46 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[ActiveSync]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[Windows Mobile]]></category>

		<guid isPermaLink="false">http://blog.bignickolson.com/2010/04/02/cradling-device-emulator-on-windows-7-in-vs-2008/</guid>
		<description><![CDATA[I've been doing some Windows Mobile work again and keep getting an issue with the Windows Mobile Device Center and my emulator.&#160; Sometimes when I cradle the emulator it works just fine, other times it doesn't pick up the connection.&#160; It seemed rebooting fixd the problem, but I'm not gonna reboot everytime I cradle and [...]]]></description>
			<content:encoded><![CDATA[<p>I've been doing some Windows Mobile work again and keep getting an issue with the Windows Mobile Device Center and my emulator.&#160; Sometimes when I cradle the emulator it works just fine, other times it doesn't pick up the connection.&#160; </p>
<p>It seemed rebooting fixd the problem, but I'm not gonna reboot everytime I cradle and un-cradle.</p>
<p>So I found another solution that seems to work, when you cradle and nothing happens, uncradle the device again and open up Windows Mobile Device Center, formerly ActiveSync on XP.</p>
<p>Under Connection Settings, click the checkbox to <strong>disable </strong>DMA connections.&#160; Then hit ok.&#160; Once that is set, reopen the settings and re-enable DMA connections.&#160; Once the settings are applied you can go into the Device Emulator Manager and cradle the device again, it should work now!</p>
]]></content:encoded>
			<wfw:commentRss>http://bignickolson.com/2010/04/02/cradling-device-emulator-on-windows-7-in-vs-2008/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Overlaying Controls in WPF with Adorners</title>
		<link>http://bignickolson.com/2009/10/15/overlaying-controls-in-wpf-with-adorners/</link>
		<comments>http://bignickolson.com/2009/10/15/overlaying-controls-in-wpf-with-adorners/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 15:40:22 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Adorner]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://blog.bignickolson.com/2009/10/15/overlaying-controls-in-wpf-with-adorners/</guid>
		<description><![CDATA[One of the common things that comes up on multiple projects using WPF is the ability to overlay the screen or a certain portion of it.&#160; Either to create a richer modal-type experience than a message box provides or to block access to a certain portion of the screen while an asynchronous or long running [...]]]></description>
			<content:encoded><![CDATA[<p>One of the common things that comes up on multiple projects using WPF is the ability to overlay the screen or a certain portion of it.&#160; Either to create a richer modal-type experience than a message box provides or to block access to a certain portion of the screen while an asynchronous or long running operation is happening.</p>
<p>There are a number of ways to do this but the one I've settled on after tackling it on a few projects is an adorner that automatically overlays and control with any content you want.&#160; </p>
<p>Other options include using the Popup control, which is problematic because popups are not part of the normal visual layout.&#160; They are always on top of all other content and don't move when you resize or move the window, at least not automatically.&#160; Another way you can do it is put everything inside a grid, and add the content you want to overlay with at the end of the Grid's content with no Row or Column specification.&#160; You can set the visibility to collapsed and show or hide based on databinding or triggers, etc.&#160; This works better than the popup for resizing, but is not as reusable.&#160; Even though the adorner is a bit more code, I think it's more reusable and better than the Popup option.</p>
<p>The way I use it is I create a UserControl that will be my overlay, let's call it ProgressMessage.&#160; I've got a Grid I want to overlay called LayoutRoot.&#160; I can then call OverlayAdorner&lt;ProgressMessage&gt;.Overlay(LayoutRoot).&#160; Now my grid will be overlaid with the ProgressMessage user control.&#160; I've also provided an override of the Overlay method so you can actually pass in an instance of the content you want to overlay with.</p>
<p>I use a factory pattern and how IDisposable/using statements work to automatically create/remove the adorner.&#160; You could also store the IDisposable that's returned and call Dispose later to remove the AdornerLayer</p>
<pre class="csharpcode"><span class="kwrd">using</span> (OverlayAdorner&lt;ProgressMessage&gt;.Overlay(LayoutRoot))
{
  <span class="rem">// do some stuff here while overlaid</span>
}</pre>
<p>A couple of quick notes, because of the way WPF layout and hit-testing works, you should not have any height or width set on your overlay content, and the background needs to be non-transparent.&#160; To get a semi-transparent background use the alpha-portion of the aRGB color format on your background.&#160; So instead of Black, use #44000000 and that gives you a semi-transparent gray background.&#160; Additionally, all these methods block mouse input, but the keyboard navigation remains active.&#160; I've started playing with lost focus events and other methods to intercept losing focus and retain that.&#160; Otherwise the user can tab through the controls underneath the overlay and activate them using arrow keys, enter and space bar.&#160; You can either solve this, or once I straighten it out I'll post what I come up with</p>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</p>
<p>Here is the rest of the class, OverlayAdorner.cs</p>
<pre class="csharpcode">  <span class="rem">/// &lt;summary&gt;</span>
   <span class="rem">/// Overlays a control with the specified content</span>
   <span class="rem">/// &lt;/summary&gt;</span>
   <span class="rem">/// &lt;typeparam name=&quot;TOverlay&quot;&gt;The type of content to create the overlay from&lt;/typeparam&gt;</span>
   <span class="kwrd">public</span> <span class="kwrd">class</span> OverlayAdorner&lt;TOverlay&gt; : Adorner, IDisposable <span class="kwrd">where</span> TOverlay : UIElement, <span class="kwrd">new</span>()
   {
      <span class="kwrd">private</span> UIElement _adorningElement;
      <span class="kwrd">private</span> AdornerLayer _layer;

      <span class="rem">/// &lt;summary&gt;</span>
      <span class="rem">/// Overlay the specified element</span>
      <span class="rem">/// &lt;/summary&gt;</span>
      <span class="rem">/// &lt;param name=&quot;elementToAdorn&quot;&gt;The element to overlay&lt;/param&gt;</span>
      <span class="rem">/// &lt;returns&gt;&lt;/returns&gt;</span>
      <span class="kwrd">public</span> <span class="kwrd">static</span> IDisposable Overlay(UIElement elementToAdorn)
      {
         <span class="kwrd">return</span> Overlay(elementToAdorn, <span class="kwrd">new</span> TOverlay());
      }

      <span class="rem">/// &lt;summary&gt;</span>
      <span class="rem">/// Overlays the element with the specified instance of TOverlay</span>
      <span class="rem">/// &lt;/summary&gt;</span>
      <span class="rem">/// &lt;param name=&quot;elementToAdorn&quot;&gt;Element to overlay&lt;/param&gt;</span>
      <span class="rem">/// &lt;param name=&quot;adorningElement&quot;&gt;The content of the overlay&lt;/param&gt;</span>
      <span class="rem">/// &lt;returns&gt;&lt;/returns&gt;</span>
      <span class="kwrd">public</span> <span class="kwrd">static</span> IDisposable Overlay(UIElement elementToAdorn, TOverlay adorningElement)
      {
         var adorner = <span class="kwrd">new</span> OverlayAdorner&lt;TOverlay&gt;(elementToAdorn, adorningElement);
         adorner._layer = AdornerLayer.GetAdornerLayer(elementToAdorn);
         adorner._layer.Add(adorner);

         <span class="kwrd">return</span> adorner <span class="kwrd">as</span> IDisposable;
      }

      <span class="kwrd">private</span> OverlayAdorner(UIElement elementToAdorn, UIElement adorningElement)
         : <span class="kwrd">base</span>(elementToAdorn)
      {
         <span class="kwrd">this</span>._adorningElement = adorningElement;
         <span class="kwrd">if</span> (adorningElement != <span class="kwrd">null</span>)
         {
            AddVisualChild(adorningElement);
         }
         Focusable = <span class="kwrd">true</span>;

      }

      <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">int</span> VisualChildrenCount
      {
         get { <span class="kwrd">return</span> _adorningElement == <span class="kwrd">null</span> ? 0 : 1; }
      }

      <span class="kwrd">protected</span> <span class="kwrd">override</span> Size ArrangeOverride(Size finalSize)
      {
         <span class="kwrd">if</span> (_adorningElement != <span class="kwrd">null</span>)
         {
            Point adorningPoint = <span class="kwrd">new</span> Point(0,0);
            _adorningElement.Arrange(<span class="kwrd">new</span> Rect(adorningPoint, <span class="kwrd">this</span>.AdornedElement.DesiredSize));
         }
         <span class="kwrd">return</span> finalSize;
      }

      <span class="kwrd">protected</span> <span class="kwrd">override</span> Visual GetVisualChild(<span class="kwrd">int</span> index)
      {
         <span class="kwrd">if</span> (index == 0 &amp;&amp; _adorningElement != <span class="kwrd">null</span>)
         {
            <span class="kwrd">return</span> _adorningElement;
         }
         <span class="kwrd">return</span> <span class="kwrd">base</span>.GetVisualChild(index);
      }

      <span class="kwrd">public</span> <span class="kwrd">void</span> Dispose()
      {
         _layer.Remove(<span class="kwrd">this</span>);
      }

   }</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
]]></content:encoded>
			<wfw:commentRss>http://bignickolson.com/2009/10/15/overlaying-controls-in-wpf-with-adorners/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Back in Business</title>
		<link>http://bignickolson.com/2009/10/15/back-in-business/</link>
		<comments>http://bignickolson.com/2009/10/15/back-in-business/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 14:24:43 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
				<category><![CDATA[Off Topic]]></category>

		<guid isPermaLink="false">http://blog.bignickolson.com/2009/10/15/back-in-business/</guid>
		<description><![CDATA[So, it's been a few months. Been very busy, got married, closing on a house in November.&#160; Started a new project at work, for the government.&#160; Despite my repeated requests I have yet to receive a dark pair of sunglasses and handgun.&#160; I thought that they were standard issue for the project, oh well, I [...]]]></description>
			<content:encoded><![CDATA[<p>So, it's been a few months. Been very busy, got married, closing on a house in November.&#160; Started a new project at work, for the government.&#160; Despite my repeated requests I have yet to receive a dark pair of sunglasses and handgun.&#160; I thought that they were standard issue for the project, oh well, I guess not.</p>
<p>I've got some things I'd like to share, so expect more updates starting again soon.&#160; Continue doing a lot of WPF and related work.&#160; It's great fun and soon I hope to forget entirely what WinForms even looked like. <img src='http://bignickolson.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://bignickolson.com/2009/10/15/back-in-business/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

