<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2745968353541871665</id><updated>2011-11-28T16:01:13.192-08:00</updated><category term='Web Development'/><category term='TV'/><category term='SqlPromptSnippetEditor'/><category term='SQL'/><category term='RainbowText'/><category term='Programming'/><category term='.NET'/><category term='Fonts'/><title type='text'>How now, brown cow.</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-7272061494381228673</id><published>2010-05-21T21:41:00.000-07:00</published><updated>2010-11-05T15:00:03.577-07:00</updated><title type='text'>geenat.com Dina TTF</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;p&gt;If you're looking for the Dina TTF Download, it's &lt;a href="https://sites.google.com/site/rickard234/filecabinet"&gt;here&lt;/a&gt;.&lt;/p&gt;zvolkov asked what's different about the Dina TTF from the version at &lt;a href="http://www.geenat.com/?p=66"&gt;http://www.geenat.com/?p=66&lt;/a&gt;.&lt;br /&gt;The way I created the TTF version of Dina is really just a big hack. True Type Fonts are composed of vectors that describe the font instead of a pixel by pixel drawing of a bitmap font.However there is a feature of True Type Fonts that allow Bitmap Font information to be embedded.  See &lt;a href="http://karlshifflett.wordpress.com/2009/10/22/much-improved-net-4-0-wpf-text-rendering/"&gt;here&lt;/a&gt; under the East Asian Text heading. I embedded the 8pt, 9pt, and 10pt raster fonts which is why the font only works at those sizes.&lt;br /&gt;I don't actually know how Nathan did it but I would venture to guess that he opened the Dina.fon file with a program like Font Forge, let it approximate the Vectors, tweaked it until he got it to a usable state then generated the .TTF. This created a "true" TTF font which has good and bad aspects.&lt;br /&gt;The Good&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It's Scalable. This is one of the primary features of TTF. The geenat version works at 6pt to 72pt+. &lt;/li&gt;&lt;li&gt;It's available in a wider range of programs.Not every text rendering API supports the bitmap font embedding. I noticed Java Swing on Windows doesn't render the embedded version.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;The Bad&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Scaling at many sizes causes visual artifacts to appear. At smaller sizes many of the lines blur together.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://2.bp.blogspot.com/_n07tuwMNUu8/S84wqQqcwBI/AAAAAAAAALA/Oa_2kLA17BQ/s1600/gdina6pt.png" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_n07tuwMNUu8/S84wqQqcwBI/AAAAAAAAALA/Oa_2kLA17BQ/s320/gdina6pt.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://3.bp.blogspot.com/_n07tuwMNUu8/S84wzucIukI/AAAAAAAAALI/JNVzGQsTqWM/s1600/gdina12pt.png" imageanchor="1"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_n07tuwMNUu8/S84wzucIukI/AAAAAAAAALI/JNVzGQsTqWM/s320/gdina12pt.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;6pt&lt;/td&gt;&lt;td align="center"&gt;12pt&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Anti Alias/ClearType&lt;/strong&gt;: Bitmap fonts do not anti alias or get clear type applied to them. They are strictly monochrome, the color doesn't have to black of course but there is no lightened color in the angles to provide a soft look. Bitmap fonts are designed for this and they tend to look a little funny when these effects are applied.Visual Studio 2002-2008 will always apply these effects according to the Windows Settings. It would be great if Windows was more granular and could apply different settings on a per app basis or even by window class. Here are some examples:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_n07tuwMNUu8/S_deiJkjXlI/AAAAAAAAALQ/sbpHvw05RCI/s1600/gdinaclear.png" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_n07tuwMNUu8/S_deiJkjXlI/AAAAAAAAALQ/sbpHvw05RCI/s320/gdinaclear.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://4.bp.blogspot.com/_n07tuwMNUu8/S_dfmRzVr7I/AAAAAAAAALY/G7-u9Gf1M8g/s1600/gdinaclear2x.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_n07tuwMNUu8/S_dfmRzVr7I/AAAAAAAAALY/G7-u9Gf1M8g/s320/gdinaclear2x.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/_n07tuwMNUu8/S_df-rDeMeI/AAAAAAAAALg/jeuxOAoLe48/s1600/gdinaantialias3x.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_n07tuwMNUu8/S_df-rDeMeI/AAAAAAAAALg/jeuxOAoLe48/s320/gdinaantialias3x.png" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-7272061494381228673?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/7272061494381228673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=7272061494381228673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/7272061494381228673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/7272061494381228673'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2010/05/geenatcom-dina-ttf.html' title='geenat.com Dina TTF'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_n07tuwMNUu8/S84wqQqcwBI/AAAAAAAAALA/Oa_2kLA17BQ/s72-c/gdina6pt.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-2051349721945304364</id><published>2010-05-07T23:27:00.000-07:00</published><updated>2010-05-07T23:36:45.583-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Fonts'/><title type='text'>Visual Studio Color Scheme Gallery</title><content type='html'>&lt;a href="http://studiostyles.info/"&gt;http://studiostyles.info&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pretty new site with user submitted VS (2005-2010) Color Schemes downloadable in .vssettings format. People can vote on them too. This site was sorely needed especially after Ning screwed over IDE Hot or Not.&lt;br /&gt;&lt;br /&gt;It also includes a web based editor that is way more intuitive than the one in the options screen of Visual Studio. I have both a light and dark scheme I intend to submit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-2051349721945304364?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/2051349721945304364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=2051349721945304364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/2051349721945304364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/2051349721945304364'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2010/05/visual-studio-color-scheme-gallery.html' title='Visual Studio Color Scheme Gallery'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-4223993941616790608</id><published>2010-03-26T21:52:00.000-07:00</published><updated>2010-11-05T14:08:30.820-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Fonts'/><title type='text'>Dina font for Visual Studio 2010</title><content type='html'>&lt;b&gt;Updated:&lt;/b&gt; I've verified it works with VS2010 Release as well.&lt;br /&gt;Thanks to the hard work of Erik Olofsson &lt;a href="http://www.electronicdissonance.com/2010/01/raster-fonts-in-visual-studio-2010.html"&gt;decoding&lt;/a&gt; the mystery of Embedded Bitmap Fonts I was able to convert one of my all time favorite programming fonts &lt;a href="http://www.donationcoder.com/Software/Jibz/Dina/"&gt;Dina &lt;/a&gt; into TTF usable by Visual Studio. The beauty of this technique is that it preserves the bitmap glyphs perfectly and the text rendering does not try to apply anti-aliasing or cleartype. See?&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_n07tuwMNUu8/S603jWw9ZVI/AAAAAAAAAKs/Mvf02caNr74/s1600/DinaVS2010.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="115" src="http://2.bp.blogspot.com/_n07tuwMNUu8/S603jWw9ZVI/AAAAAAAAAKs/Mvf02caNr74/s200/DinaVS2010.png" valign="middle" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Visual Studio 2010&lt;br /&gt;*&lt;b&gt;bonus&lt;/b&gt;* I found that this font can also be used with any .NET application (WPF or Windows Forms) that normally can't handle raster fonts. Here's Dina used as the Grid font for SQL Server Management Studio&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_n07tuwMNUu8/S604WjdRXvI/AAAAAAAAAK0/iYXXV0S-9VI/s1600/DinaSsmsGridFont.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="103" src="http://3.bp.blogspot.com/_n07tuwMNUu8/S604WjdRXvI/AAAAAAAAAK0/iYXXV0S-9VI/s200/DinaSsmsGridFont.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/rickard234/filecabinet"&gt;Download from my File Cabinet&lt;/a&gt;If anyone wants to re-host this file let me know and I'll update the link&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-4223993941616790608?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/4223993941616790608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=4223993941616790608' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/4223993941616790608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/4223993941616790608'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2010/03/dina-font-for-visual-studio-2010.html' title='Dina font for Visual Studio 2010'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_n07tuwMNUu8/S603jWw9ZVI/AAAAAAAAAKs/Mvf02caNr74/s72-c/DinaVS2010.png' height='72' width='72'/><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-4604797546036027943</id><published>2010-03-23T11:46:00.000-07:00</published><updated>2010-03-23T11:47:31.315-07:00</updated><title type='text'>Cool motion blur</title><content type='html'>&lt;div style="margin: 0px auto 10px; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_n07tuwMNUu8/S6kMhpYIIAI/AAAAAAAAAKc/2lj0sRWzWtI/s1600-h/Photo0076.jpg"&gt;&lt;img alt="" border="0" src="http://2.bp.blogspot.com/_n07tuwMNUu8/S6kMhpYIIAI/AAAAAAAAAKc/2lj0sRWzWtI/s320/Photo0076.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;I ran across this picture while backing up Katie's phone. It's of me and Gracie at the vet. Gracie was just a tiny baby here and apparently I'm headbanging. The motion blur is pretty neat looking. It almost makes me look like I have Donald Trump hair.&lt;/div&gt;&lt;/div&gt;&lt;div style="clear: both; text-align: CENTER;"&gt;&lt;a href="http://picasa.google.com/blogger/" target="ext"&gt;&lt;img align="middle" alt="Posted by Picasa" border="0" src="http://photos1.blogger.com/pbp.gif" style="-moz-background-clip: initial; -moz-background-inline-policy: initial; -moz-background-origin: initial; background: transparent none repeat scroll 0% 50%; border: 0px none; padding: 0px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-4604797546036027943?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/4604797546036027943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=4604797546036027943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/4604797546036027943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/4604797546036027943'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2010/03/cool-motion-blur.html' title='Cool motion blur'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_n07tuwMNUu8/S6kMhpYIIAI/AAAAAAAAAKc/2lj0sRWzWtI/s72-c/Photo0076.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-3083369587337043029</id><published>2009-10-16T01:51:00.001-07:00</published><updated>2009-10-16T12:49:36.263-07:00</updated><title type='text'>WinForms/WPF Timers</title><content type='html'>&lt;p&gt;I find myself using a lot of timers when doing GUI programming. Usually these timers are used to invoke a block of code only once. Sometimes there’s a good reason to delay a call, say you show a tooltip for 1sec then hide it (though in WPF animations should be used). Usually it’s to solve a tricky problem, like you have to let the callstack unwind for some dependent state to take effect. This is usually considered bad practice and there are very few times when no other legitimate techniques can be used. However when deadlines start closing in the number of timers increase. I like to think of Timers as the duct tape of GUI programming.&lt;/p&gt;  &lt;p&gt;Using timers, especially for one-off calls is tedious and verbose&lt;/p&gt;  &lt;div style="height: 200px; overflow: auto"&gt;   &lt;div style="font-family: dina, consolas, courier new, monospaced; background: #F3F3F3; color: black; font-size: 6pt"&gt; &lt;span style="margin: 0px; font-family: dina, consolas, courier new, monospaced; font-size: smaller"&gt;&lt;span style="color: #b300b3"&gt;DispatcherTimer&lt;/span&gt; timer &lt;span style="color: #ff0080"&gt;=&lt;/span&gt; &lt;span style="color: #0080ff"&gt;new&lt;/span&gt; &lt;span style="color: #b300b3"&gt;DispatcherTimer&lt;/span&gt;();&lt;/span&gt; &lt;br /&gt;    &lt;span style="margin: 0px; font-family: dina, consolas, courier new, monospaced; font-size: smaller"&gt;timer&lt;span style="color: #ff0080"&gt;.&lt;/span&gt;Interval &lt;span style="color: #ff0080"&gt;=&lt;/span&gt; &lt;span style="color: #fd00fd"&gt;TimeSpan&lt;/span&gt;&lt;span style="color: #ff0080"&gt;.&lt;/span&gt;FromMilliseconds(&lt;span style="background: #fff5ec; color: #ff8000"&gt;10&lt;/span&gt;);&lt;/span&gt; &lt;br /&gt;    &lt;span style="margin: 0px; font-family: dina, consolas, courier new, monospaced; font-size: smaller"&gt;timer&lt;span style="color: #ff0080"&gt;.&lt;/span&gt;Tick &lt;span style="color: #ff0080"&gt;+=&lt;/span&gt; (&lt;span style="color: #0080ff"&gt;delegate&lt;/span&gt;(&lt;span style="color: #0080ff"&gt;object&lt;/span&gt; s, &lt;span style="color: #b300b3"&gt;EventArgs&lt;/span&gt; args)&lt;/span&gt; &lt;br /&gt;    &lt;span style="margin: 0px; font-family: dina, consolas, courier new, monospaced; font-size: smaller"&gt;{&lt;/span&gt; &lt;br /&gt;    &lt;span style="margin: 0px; font-family: dina, consolas, courier new, monospaced; font-size: smaller"&gt;&amp;#160;&amp;#160;&amp;#160; timer&lt;span style="color: #ff0080"&gt;.&lt;/span&gt;Stop();&lt;/span&gt; &lt;br /&gt;    &lt;span style="margin: 0px; font-family: dina, consolas, courier new, monospaced; font-size: smaller"&gt;&amp;#160;&amp;#160;&amp;#160; timer &lt;span style="color: #ff0080"&gt;=&lt;/span&gt; &lt;span style="color: #0080ff"&gt;null&lt;/span&gt;;&lt;/span&gt; &lt;br /&gt;    &lt;span style="margin: 0px; font-family: dina, consolas, courier new, monospaced; font-size: smaller"&gt;&amp;#160;&amp;#160;&amp;#160; DoSomethingCool();&lt;/span&gt; &lt;br /&gt;    &lt;span style="margin: 0px; font-family: dina, consolas, courier new, monospaced; font-size: smaller"&gt;});&lt;/span&gt; &lt;br /&gt;    &lt;span style="margin: 0px; font-family: dina, consolas, courier new, monospaced; font-size: smaller"&gt;timer&lt;span style="color: #ff0080"&gt;.&lt;/span&gt;Start();&lt;/span&gt;  &lt;/div&gt; &lt;/div&gt;  &lt;h3&gt;SetTimeout to the rescue.&lt;/h3&gt; The HTML DOM has a handy method called setTimeout. It's really easy to use, just pass it a function (or string) and the timeout value. That's it. There is no such time as setTimeout in .NET. But with some Extension methods combined with Lambda expressions we can get pretty close:   &lt;div style="font-family: Dina, Consolas, Courier New, monospaced; font-size: 6pt; color: black; background: #F3F3F3;"&gt; &lt;span style="margin: 4px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&lt;span style="color: #0080ff;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Action&lt;/span&gt;(() &lt;span style="color: #ff0080;"&gt;=&amp;gt;&lt;/span&gt; DoSomethingCool())&lt;span style="color: #ff0080;"&gt;.&lt;/span&gt;SetTimeout(&lt;span style="color: #ff8000; background: #fff5ec;"&gt;10&lt;/span&gt;);&lt;/span&gt; &lt;/div&gt;  &lt;br/&gt;Here's the code. It comes in 2 flavors: Windows Forms and WPF &lt;br/&gt;  &lt;div style="height: 500px; overflow: auto"&gt; &lt;div style="font-family: Dina, Consolas, Courier New, monospaced; font-size: 6pt; color: black; background: #F3F3F3;width:1000px;"&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&lt;span style="color: #0080ff;"&gt;namespace&lt;/span&gt; SetTimeout&lt;span style="color: #ff0080;"&gt;.&lt;/span&gt;Wpf&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;{&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0080ff;"&gt;using&lt;/span&gt; System;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0080ff;"&gt;using&lt;/span&gt; System&lt;span style="color: #ff0080;"&gt;.&lt;/span&gt;Windows&lt;span style="color: #ff0080;"&gt;.&lt;/span&gt;Threading;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0080ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0080ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0080ff;"&gt;class&lt;/span&gt; &lt;span style="color: #b300b3;"&gt;SettimeoutDelegateExtension&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Inspired by HTML DOM, executes a delegate via a DispatcherTimer once.&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;example&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;new Action(() =&amp;gt; someObject.DoSomethingCool()).SetTimeout(100);&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/example&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;Frequently things need to be executed in a timeout, but constructing a Timer is a pain especially for&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; one-off calls. Combined with Lambda expressions this makes the whole process relativey painless.&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;Any delegate to execute&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param name=&amp;quot;timeout&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;How long to wait to execute&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param name=&amp;quot;args&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;Any arguments to pass to the delegate&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0080ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0080ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0080ff;"&gt;void&lt;/span&gt; SetTimeout(&lt;span style="color: #0080ff;"&gt;this&lt;/span&gt; &lt;span style="color: #b300b3;"&gt;Delegate&lt;/span&gt; action, &lt;span style="color: #fd00fd;"&gt;TimeSpan&lt;/span&gt; timeout, &lt;span style="color: #0080ff;"&gt;params&lt;/span&gt; &lt;span style="color: #0080ff;"&gt;object&lt;/span&gt;[] args)&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #b300b3;"&gt;DispatcherTimer&lt;/span&gt; timer &lt;span style="color: #ff0080;"&gt;=&lt;/span&gt; &lt;span style="color: #0080ff;"&gt;new&lt;/span&gt; &lt;span style="color: #b300b3;"&gt;DispatcherTimer&lt;/span&gt;();&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; timer&lt;span style="color: #ff0080;"&gt;.&lt;/span&gt;Interval &lt;span style="color: #ff0080;"&gt;=&lt;/span&gt; timeout;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; timer&lt;span style="color: #ff0080;"&gt;.&lt;/span&gt;Tick &lt;span style="color: #ff0080;"&gt;+=&lt;/span&gt; &lt;span style="color: #0080ff;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;EventHandler&lt;/span&gt;(&lt;span style="color: #0080ff;"&gt;delegate&lt;/span&gt;(&lt;span style="color: #0080ff;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #b300b3;"&gt;EventArgs&lt;/span&gt; e)&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; timer&lt;span style="color: #ff0080;"&gt;.&lt;/span&gt;Stop();&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; timer &lt;span style="color: #ff0080;"&gt;=&lt;/span&gt; &lt;span style="color: #0080ff;"&gt;null&lt;/span&gt;;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; action&lt;span style="color: #ff0080;"&gt;.&lt;/span&gt;DynamicInvoke(args);&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; timer&lt;span style="color: #ff0080;"&gt;.&lt;/span&gt;Start();&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; Inspired by HTML DOM, executes a delegate via a DispatcherTimer once.&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;example&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;new Action(() =&amp;gt; someObject.DoSomethingCool()).SetTimeout(100);&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/example&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;Frequently things need to be executed in a timeout, but constructing a Timer is a pain especially for&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; one-off calls. Combined with Lambda expressions this makes the whole process relativey painless.&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param name=&amp;quot;action&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;Any delegate to execute&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param name=&amp;quot;timeout&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;How long to wait to execute in milliseconds&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param name=&amp;quot;args&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;Any arguments to pass to the delegate&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0080ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0080ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0080ff;"&gt;void&lt;/span&gt; SetTimeout(&lt;span style="color: #0080ff;"&gt;this&lt;/span&gt; &lt;span style="color: #b300b3;"&gt;Delegate&lt;/span&gt; action, &lt;span style="color: #0080ff;"&gt;int&lt;/span&gt; timeout, &lt;span style="color: #0080ff;"&gt;params&lt;/span&gt; &lt;span style="color: #0080ff;"&gt;object&lt;/span&gt;[] args)&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SetTimeout(action, &lt;span style="color: #fd00fd;"&gt;TimeSpan&lt;/span&gt;&lt;span style="color: #ff0080;"&gt;.&lt;/span&gt;FromMilliseconds(timeout), args);&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt; &lt;br /&gt;&lt;span style="margin: 0px; font-family:Dina, Consolas, Courier New, monospaced; font-size:smaller;"&gt;}&lt;/span&gt; &lt;/div&gt;  &lt;/div&gt; &lt;p&gt;p.s. I hope you enjoy the pretty print. I spent &lt;b&gt;way&lt;/b&gt; too much time on it&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-3083369587337043029?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/3083369587337043029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=3083369587337043029' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/3083369587337043029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/3083369587337043029'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2009/10/winformswpf-timers.html' title='WinForms/WPF Timers'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-1480470420917698302</id><published>2009-02-20T19:33:00.001-08:00</published><updated>2009-02-20T19:33:45.693-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TV'/><title type='text'>Chuck’s Low Flow Seinfeld Hair</title><content type='html'>&lt;p&gt;Let’s take a break from the techie stuff for a sec and focus on one of my other passions:TV. Specifically “Chuck”. Even more specifically, Chuck’s hair. It’s changed a little bit since season 1 and now looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_n07tuwMNUu8/SZ92FcjNexI/AAAAAAAAAEo/eP45ByK4wFI/s1600-h/image%5B2%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="213" alt="image" src="http://lh4.ggpht.com/_n07tuwMNUu8/SZ92FodiK1I/AAAAAAAAAEs/29k6F5qDtso/image_thumb.png?imgmax=800" width="220" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This hairstyle strikes me as familiar…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_n07tuwMNUu8/SZ92F2_9D0I/AAAAAAAAAEw/PouKSCB41jo/s1600-h/image%5B5%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://lh3.ggpht.com/_n07tuwMNUu8/SZ92GdPKgXI/AAAAAAAAAE0/7RCKqqEzUp4/image_thumb%5B1%5D.png?imgmax=800" width="226" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Looks like he got a low-flow shower head installed since season 1.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-1480470420917698302?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/1480470420917698302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=1480470420917698302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/1480470420917698302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/1480470420917698302'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2009/02/chucks-low-flow-seinfeld-hair.html' title='Chuck’s Low Flow Seinfeld Hair'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_n07tuwMNUu8/SZ92FodiK1I/AAAAAAAAAEs/29k6F5qDtso/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-1237079877416271348</id><published>2008-08-14T12:08:00.000-07:00</published><updated>2008-08-14T12:26:46.907-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Old School Wait Animation</title><content type='html'>I noticed today something a little funny about the Visual Studio 2008 SP1 setup screen:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_n07tuwMNUu8/SKSDVxT6s8I/AAAAAAAAADY/cUavHG6TwE8/s1600-h/vs+wait.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_n07tuwMNUu8/SKSDVxT6s8I/AAAAAAAAADY/cUavHG6TwE8/s400/vs+wait.png" alt="" id="BLOGGER_PHOTO_ID_5234453076948726722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Notice the little black line at the below the 2nd progress bar at the bottom right? It's actually an old school ASCII wait animation  that consists of displaying /-\|.&lt;br /&gt;&lt;br /&gt;I'm not sure why they felt a need to add it under a progress bar, the fact that there is a progress bar is kind of a tip off that I need to wait. But like I said, it's funny and may have just been some humor on a programmer's part.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-1237079877416271348?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/1237079877416271348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=1237079877416271348' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/1237079877416271348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/1237079877416271348'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2008/08/old-school-wait-animation.html' title='Old School Wait Animation'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_n07tuwMNUu8/SKSDVxT6s8I/AAAAAAAAADY/cUavHG6TwE8/s72-c/vs+wait.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-8762334020966134470</id><published>2008-08-11T12:19:00.000-07:00</published><updated>2008-08-11T12:25:28.249-07:00</updated><title type='text'>Do I have enough crap attached to my notebook?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_n07tuwMNUu8/SKCQ_Bfly1I/AAAAAAAAAB4/wsd1INp7-lw/s1600-h/IMG_0010.JPG"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_n07tuwMNUu8/SKCQ_Bfly1I/AAAAAAAAAB4/wsd1INp7-lw/s400/IMG_0010.JPG" alt="" id="BLOGGER_PHOTO_ID_5233342179411610450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Believe it or not I actually use all these items.&lt;br /&gt;On the left side going top to bottom:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Notebook Power Supply&lt;/li&gt;&lt;li&gt;HDMI cable going to my external monitor&lt;/li&gt;&lt;li&gt;Two USB cables going to a Maxtor External Hard Drive&lt;/li&gt;&lt;li&gt;ESATA cable attached to another hard drive. The ESATA card is plugged in to the PCMCIA slot&lt;/li&gt;&lt;/ol&gt;On the Right&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Ethernet cable for network&lt;/li&gt;&lt;li&gt;iPhone USB cable&lt;/li&gt;&lt;li&gt;USB cable going to the external monitor's USB hub for keyboard and mouse&lt;/li&gt;&lt;li&gt;Headphones&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-8762334020966134470?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/8762334020966134470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=8762334020966134470' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/8762334020966134470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/8762334020966134470'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2008/08/do-i-have-enough-crap-attached-to-my.html' title='Do I have enough crap attached to my notebook?'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_n07tuwMNUu8/SKCQ_Bfly1I/AAAAAAAAAB4/wsd1INp7-lw/s72-c/IMG_0010.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-978573548658716641</id><published>2008-02-18T20:33:00.000-08:00</published><updated>2008-02-18T20:48:02.006-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><category scheme='http://www.blogger.com/atom/ns#' term='RainbowText'/><title type='text'>RainbowText 2.0</title><content type='html'>This is the upgrade 8 years in the making!&lt;br /&gt;&lt;br /&gt;I was going over some of my old projects and I realized the &lt;a href="http://www12.brinkster.com/chrisrickard/development/Rainbow/oldrainbow.htm"&gt;old version&lt;/a&gt; of RainbowText was in sore need of an upgrade.&lt;br /&gt;&lt;br /&gt;Well a few hours later version 2.0 was ready to go. The biggest difference is this one supports all the latest major browsers. In order to do this I had to ditch the IE Behavior. However the new version is just as easy to use, and it is a bit clearer, in my opinion.&lt;br /&gt;&lt;br /&gt;RainbowText is one of those scripts that annoy the hell out of most people, and a handful of people absolutely love it. Which are you?&lt;br /&gt;&lt;br /&gt;View a demo and download the code &lt;a href="http://www12.brinkster.com/chrisrickard/development/Rainbow/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-978573548658716641?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www12.brinkster.com/chrisrickard/development/Rainbow/' title='RainbowText 2.0'/><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/978573548658716641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=978573548658716641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/978573548658716641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/978573548658716641'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2008/02/rainbowtext-20.html' title='RainbowText 2.0'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-3873658602004928970</id><published>2008-02-13T12:54:00.000-08:00</published><updated>2008-02-17T16:58:55.478-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>VS2008 Web Developer Hotfix</title><content type='html'>&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/02/08/vs-2008-web-development-hot-fix-roll-up-available.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2008/02/08/vs-2008-web-development-hot-fix-roll-up-available.aspx&lt;/a&gt;&lt;br /&gt;I would seriously recommend this to anyone who does web development with VS2008. Most of these are performance fixes, almost all of these I've personally experienced:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Source editor freezes for a few seconds when typing in a page with a custom control that has more than two levels of sub-properties&lt;br /&gt;&lt;br /&gt;Yep. Got this when working with Infragistics controls. Even hitting the down arrow to scroll through the intellisense list of attributes caused this delay. Very annoying.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;“View Code” right-click context menu command takes a long time to appear with web application projects&lt;br /&gt;&lt;br /&gt;Got this too, though I didn't notice too much of a difference after the hotfix. I guess my PC's just slow on this one.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Visual Studio has very slow behavior when opening large HTML documents.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Visual Studio has responsiveness issues when working with big HTML files with certain markup&lt;br /&gt;Check and check. I still get unresponsiveness issues, but mostly now just when a document loads, whereas before it would happen constantly. I noticed if there was a lot of invalid HTML this would cause problems, also when using custom namespaced elements (running on the client, not ASP.NET controls) the editor seemed to have problems with these kinds of documents too.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The Tab/Shift-Tab (Indent/Un-indent) operation is slow with large HTML selections&lt;br /&gt;That's always been the case, and not just in HTML but in any code section that has intellisense parsing.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Slow typing in design view with certain page markup configurations&lt;br /&gt;Got this one too, again when working with Infragistics Controls. Typing in labels directly in TDs in design view was REAALLLY slow, and it didn't seem to buffer properly so you couldn't just type the whole thing then wait.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When opening a JavaScript file, colorization of the client script is sometimes delayed several seconds.&lt;br /&gt;Sometimes? Anything more than a trivial document would exhibit this behavior.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-3873658602004928970?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/3873658602004928970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=3873658602004928970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/3873658602004928970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/3873658602004928970'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2008/02/vs2008-web-developer-hotfix.html' title='VS2008 Web Developer Hotfix'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-2069331752649323885</id><published>2008-02-11T23:25:00.000-08:00</published><updated>2008-02-17T16:58:55.478-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Development'/><title type='text'>AJAX</title><content type='html'>It's funny, the last time I was seriously into client side web development in mid 2004 it was so stagnant. The only framework that truly seemed to be harnessing the full power of the browsers was &lt;a href="http://www.bindows.net/"&gt;Bindows.net&lt;/a&gt;.  This was about the time that the original AJAX library was introduced. I had thought "What's the big deal? The underlying technologies have been around since around 1998." I still snicker whenever I see client heavy web development referred to as "Web 2.0".&lt;br /&gt;&lt;br /&gt;It's weird though how a good abstraction and clever name can shift momentum and spark creativity. Every major software vendor has their own AJAX library. In addition a slew of new browser based UI frameworks have come about. However they are all still based on the same old technologies. JavaScript hasn't changed since 1999 (ECMAScript v3) with V4 in a seemingly never ending development cycle. Even when it is released and all the major browsers implement it V3 will be the minimum supported for a llloooonnngg time. Even with this almost decade old base technology such great innovations have come about.&lt;br /&gt;&lt;br /&gt;Here are a couple of my favorite new libraries:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://extjs.com/"&gt;Ext JS&lt;/a&gt; this in many ways reminds me of Bindows in that it has a complete UI framework all the way from comboboxes and datepickers to dialogs, datagrids and multi column treeviews . It seems a lot easier to integrate individual components into a web site without having to initialize an application framework surface. Finally add that it has an LGPL license, most people (including companies) can use it free of charge.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.asp.net/ajax/"&gt;Microsoft AJAX&lt;/a&gt;. Well there are certain parts to this that I really enjoy. I'm not a big fan of the way ASP.NET does a lot of things. And wrapping the mechanics of ASP.NET into an XMLHTTP request seems incongruent. The end result is a huge abstraction over another huge abstraction which in the end makes it very difficult to do anything more than the most basic task. However, I do really like the way they've done their purely client side library. It creates a very .NETesque framework that in many ways makes it a lot easier to make truly OO JavaScript libraries. I bet I could even create a pretty sweet ASP classic framework on top of it.&lt;/li&gt;&lt;li&gt;&lt;a href="http://labs.adobe.com/technologies/spry/home.html"&gt;Adobe Spry&lt;/a&gt;: I really enjoy the Spry.Data library. It seems by far the most intuitive way of working with a variety of data sources. This is great for working with different server side technologies. Also their Widget design is the most backwards compatible with both down level browsers and JavaScript disabled browsers (that I've seen).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The best side effect of all this new fervor is people are now using JavaScript/DOM best practices. It used to be that JavaScript libraries were the worst in development practices. The global namespace was polluted with variables and functions, many of which had common names that would stomp over other libraries'. Additionally it was common to stomp over the window.onload delegate instead of using addEventListener or attachEvent. Now people fully use prototypes, object notation (JSON), nested anonymous functions, and all the other great features of JavaScript that mostly went unused.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-2069331752649323885?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/2069331752649323885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=2069331752649323885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/2069331752649323885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/2069331752649323885'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2008/02/ajax.html' title='AJAX'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-8027991632064430480</id><published>2008-02-11T22:22:00.000-08:00</published><updated>2008-02-11T23:13:15.362-08:00</updated><title type='text'>Upgrading to XP</title><content type='html'>I did what all the cool kids are doing and upgraded my main PC from Vista to XP. I actually do have good reasons:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The top reason is that my network just stops working at random. There doesn't seem to be any rhyme or reason that I can tell. Sometimes its when I'm web surfing, sometimes its when I'm copying files or remote desktop. It could go hours or days before it happens. Then once it does nothing short of a reboot makes it work. I've tried swapping out the OEM with MS supplied drivers to no avail and I couldn't find anything like this on any support forums. If I was planning on keeping Vista I would have actually contacted the manufacturer's support, but since this is no longer happening on XP why bother?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I was doing a huge chunk of my work over  VPN connections, and here are a list of VPN clients that either flat out don't work or barely work at all on Vista:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Cisco: On a sunny day when the stars are aligned I &lt;span style="font-style: italic;"&gt;might &lt;/span&gt;be able to connect to &lt;span style="font-style: italic;"&gt;some&lt;/span&gt; networks.&lt;/li&gt;&lt;li&gt;Citrix: This is supposed to work, I just couldn't get it to.&lt;/li&gt;&lt;li&gt;Juniper: This just flat out doesn't work&lt;/li&gt;&lt;/ol&gt;This means I had to use an XP Virtual PC to connect to a remote network. If I was deploying software I have to copy the files locally to the VPC then copy to the remote network. Basically it was just a big pain in the ass.&lt;/li&gt;&lt;li&gt;Everything runs slower/less responsive. I'm talking about general file system navigation, program launching, and switching between applications. Yeah we all said the same thing about XP when it came out, but it was true at the time as well. I'm sure in 7 years after a couple service packs and PC hardware quadrupling in power Vista will run just as fast as XP does today.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Additionally I don't have any compelling reason to use Vista over XP. While I do like the Vista theme and Aero look I wouldn't say it really adds any significant value to my general user experience. I disabled UAC because it was so annoying. I get by just fine with XP home networking, all the .NET 3.0 technologies (WPF, WCF, Cardspace) work just fine. While I think that Vista's WPF rendering takes better advantage of the video hardware acceleration, WPF hasn't really become wide spread enough to matter yet. I like XP's Windows explorer better than Vista's.&lt;br /&gt;&lt;br /&gt;I'll still run Vista over a VPC in order to test application compatibility, but I'm really much more productive using Windows XP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-8027991632064430480?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/8027991632064430480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=8027991632064430480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/8027991632064430480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/8027991632064430480'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2008/02/upgrading-to-xp.html' title='Upgrading to XP'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-8980569564443806746</id><published>2007-07-20T08:41:00.000-07:00</published><updated>2008-02-17T16:58:55.479-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQL Assistant Part 1</title><content type='html'>I just recently found out about another SQL intellisense product called &lt;a href="http://www.softtreetech.com/sqlassist/index.htm"&gt;SQL Asisstant&lt;/a&gt; by &lt;a href="http://www.softtreetech.com/"&gt;SoftTree Technologies&lt;/a&gt;. Well calling it a SQL intellisense product is a bit of an understatement as it also offers SQL reformatting, spell checking, and code structure tree.&lt;br /&gt;&lt;br /&gt;There really is so much ground to cover that I can't possibly do it in one post or I'd be spending all day on it (I do have to actually work, you know :)&lt;br /&gt;&lt;br /&gt;This post I'll focus on the basic intellisense engine, which is probably considered the core functionallity. I used it with both Query Analyzer and SQL Server Management Studio, as I'm a SQL Server developer. I couldn't find any difference in functionality between the two. I tested against a SQL server on my local network.&lt;br /&gt;&lt;br /&gt;The first thing I noticed is that it's &lt;span style="font-style: italic;"&gt;damned &lt;/span&gt;fast. It didn't delay the load time of the editor applications at all. And when I expected it to pop up, it did immediately. It also doesn't pop up in unexpected places. This is crucial, as an overly aggressive intellisense hurts productivity and is really anoying. I think they found the right balance.&lt;br /&gt;&lt;br /&gt;The popup window itself is small and elegant. It displays as a kind of tree-grid, where you can expand a parent object to see it's children. I've found that it works as a great quick schema browser.&lt;br /&gt;Here's an example. I invoked the SQL Assistant via Ctrl+Space, and typed in a partial name of a table, that allowed me to find and browse it's schema &lt;span style="font-style: italic;"&gt;very&lt;/span&gt; quickly, especially when comparing how long it takes to find something in the object browser.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_n07tuwMNUu8/RqDjeeDdCxI/AAAAAAAAABE/Uc9qQmO9kBM/s1600-h/schemabrowse.PNG"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_n07tuwMNUu8/RqDjeeDdCxI/AAAAAAAAABE/Uc9qQmO9kBM/s400/schemabrowse.PNG" alt="" id="BLOGGER_PHOTO_ID_5089317691531791122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It also has a great JOIN assistant, which detects FKs and automatically brings these to the top of the list. Furthermore if you choose the actual column (by expanding the hierarchy) it will also fill in the ON condition for you.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_n07tuwMNUu8/RqDmdeDdCyI/AAAAAAAAABM/9iaNAU_-doI/s1600-h/join1.PNG"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_n07tuwMNUu8/RqDmdeDdCyI/AAAAAAAAABM/9iaNAU_-doI/s400/join1.PNG" alt="" id="BLOGGER_PHOTO_ID_5089320972886805282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;However it does have a flaw, once you reach the ON condition this happens:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_n07tuwMNUu8/RqDn6ODdCzI/AAAAAAAAABU/CXy0OZ3vqrM/s1600-h/join2.PNG"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_n07tuwMNUu8/RqDn6ODdCzI/AAAAAAAAABU/CXy0OZ3vqrM/s400/join2.PNG" alt="" id="BLOGGER_PHOTO_ID_5089322566319672114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Oops! What if I don't want to JOIN on that? It's perfectly valid to have alternative JOIN conditions. (Note: there is a workaround for this which I'll cover at a later time)&lt;br /&gt;&lt;br /&gt;Other supported items are local variables. Temp tables aren't supported, and table variables are semi supported, in that you can see them in candidate lists like scalar variables, but you can't get the column information.&lt;br /&gt;&lt;br /&gt;Well that's it for now. Like I said above this is just the 1st of a multi part series.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-8980569564443806746?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/8980569564443806746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=8980569564443806746' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/8980569564443806746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/8980569564443806746'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2007/07/sql-assistant.html' title='SQL Assistant Part 1'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_n07tuwMNUu8/RqDjeeDdCxI/AAAAAAAAABE/Uc9qQmO9kBM/s72-c/schemabrowse.PNG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-8844271407871080617</id><published>2007-07-10T09:24:00.000-07:00</published><updated>2007-07-10T10:56:46.778-07:00</updated><title type='text'>Media Player Tray Control for Vista</title><content type='html'>As someone who programs for a living and works from home it goes without saying that one of my primary applications is none other than &lt;a href="http://en.wikipedia.org/wiki/Windows_Media_Player"&gt;Windows Media Player&lt;/a&gt;. When listening to music I rarely need to actually bring up the application window. Coupled with the fact that only one instance of the application is ever used it makes a perfect candidate for an alternative to the &lt;a href="http://en.wikipedia.org/wiki/Taskbar"&gt;Windows Taskbar&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The most popular way to do this is to use &lt;a href="http://www.microsoft.com/windows/windowsmedia/knowledgecenter/howto/mini_full_how_to.aspx"&gt;Media Player Mini Mode&lt;/a&gt;, which adds a new toolbar to the taskbar. This provides some advantages over minimizing to the taskbar:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Media Player Toolbar is in a fixed location. You always know where it is if you ever need to pause or skip to the next track. If you have a lot of windows open you don't have to hunt for it.&lt;/li&gt;&lt;li&gt;Every time a track changes a popup window displays the track info like Song Title, Album, and Artist.&lt;/li&gt;&lt;li&gt;The player controls are always displayed, you don't have to switch to the application to control it.&lt;/li&gt;&lt;/ul&gt;However I personally don't like the mini mode, here's why:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It takes up too much screen real estate. Under most people's Windows setup it takes up the same amount of space on the taskbar as traditional taskbar application. However I run my taskbar at &lt;a href="http://en.wikipedia.org/wiki/Rack_unit"&gt;2U&lt;/a&gt;, which means that twice the real estate is used, as the media player toolbar is separated from the taskbar applications.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_n07tuwMNUu8/RpO7yL87oNI/AAAAAAAAAAU/OoaOoNRGyrw/s1600-h/XPToolbar.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_n07tuwMNUu8/RpO7yL87oNI/AAAAAAAAAAU/OoaOoNRGyrw/s400/XPToolbar.png" alt="" id="BLOGGER_PHOTO_ID_5085614875107631314" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;I actually find the song information popup window annoying. Especially because it activates when your mouse wanders over any part of the toolbar. And the popup lingers for a full &lt;span style="font-weight: bold;"&gt;seven second&lt;/span&gt;s, which seems like an eternity when you want to get to whatever is behind the window. What makes it worse is that it is located directly underneath where I have the &lt;a href="http://msdn2.microsoft.com/en-us/library/26k97dbc%28VS.80%29.aspx"&gt;Solution Explorer&lt;/a&gt;/Property Window Tab Group docked in &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/default.aspx"&gt;Visual Studio&lt;/a&gt;. My mouse is always wandering that direction, and if I happen to wander a few pixels down too far I get this for seven seconds.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_n07tuwMNUu8/RpO9TL87oOI/AAAAAAAAAAc/Dptdda176A4/s1600-h/popup.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_n07tuwMNUu8/RpO9TL87oOI/AAAAAAAAAAc/Dptdda176A4/s400/popup.png" alt="" id="BLOGGER_PHOTO_ID_5085616541554942178" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;What I prefer to use instead is the &lt;a href="http://www.microsoft.com/windows/windowsmedia/player/bonuspack/powertoys.aspx#traycontrol"&gt;Media Player Tray Control&lt;/a&gt;. It takes up a mere 17x17 area of my tray and allows me to do my most common media tasks with ease as well. Clicking the tray icon itself pauses/unpauses. A context menu lets you skip or go back a track and gives you rudimentry volume control.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_n07tuwMNUu8/RpPBsb87oPI/AAAAAAAAAAk/qCRK4Uz1tTc/s1600-h/tray.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_n07tuwMNUu8/RpPBsb87oPI/AAAAAAAAAAk/qCRK4Uz1tTc/s400/tray.png" alt="" id="BLOGGER_PHOTO_ID_5085621373393150194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Not to say that the tray control doesn't have its share of flaws as well:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It seems to have a hard time keeping track of the Media Player application, it's supposed to hide it but various things will cuase media player to come back which confuses the tray app.&lt;/li&gt;&lt;li&gt;If &lt;a href="http://en.wikipedia.org/wiki/Windows_Explorer"&gt;Explorer &lt;/a&gt;crashes for any reason you can't get the tray icon back without first &lt;a href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ts_cmd_tskill.mspx?mfr=true"&gt;killing&lt;/a&gt; the mpxptray.exe process.&lt;/li&gt;&lt;li&gt;Having the volume controls as menu items? Come on...&lt;/li&gt;&lt;li&gt;Sometimes that Information Popup window is quite handy when you really want it With the tray control you have to right click the tray app, unhide the media player, find the app in the taskbar, then activate it.&lt;/li&gt;&lt;/ul&gt;However as I said above I still prefer it over the Mini Mode. So when I tried to install the &lt;a href="http://www.microsoft.com/windows/windowsmedia/player/bonuspack/default.aspx"&gt;Windows Media Player Bonus Pack for XP &lt;/a&gt;(it comes bundled with this, no standalone install). Windows is kind enough to tell me that it won't allow it to install because of compatibility issues.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_n07tuwMNUu8/RpPFub87oQI/AAAAAAAAAAs/0dFLlFADLyI/s1600-h/CompatIssues.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_n07tuwMNUu8/RpPFub87oQI/AAAAAAAAAAs/0dFLlFADLyI/s400/CompatIssues.png" alt="" id="BLOGGER_PHOTO_ID_5085625805799399682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I clicked the "Check for solutions online" button, but it was unable to find any solutions (big surprise).&lt;br /&gt;&lt;br /&gt;However I was pretty confident that there was only one or two applications that were &lt;span style="font-style: italic;"&gt;actually &lt;/span&gt;incompatible with Vista. Since I noticed that the executable I downloaded was a self extracting archive, I figured I'd poke around the files it extracted. It even gave me the path where it dumped everything.&lt;br /&gt;&lt;br /&gt;Low and behold I found mpxptray.exe in the temp directory. I copied it to a new folder in the Program Files and ran it. Apparently it has no file dependencies because it ran just fine.  Right click the tray control, open options, check "Run Tray Control at Startup" and your install is done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-8844271407871080617?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/8844271407871080617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=8844271407871080617' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/8844271407871080617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/8844271407871080617'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2007/07/media-player-tray-control-for-vista.html' title='Media Player Tray Control for Vista'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_n07tuwMNUu8/RpO7yL87oNI/AAAAAAAAAAU/OoaOoNRGyrw/s72-c/XPToolbar.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-3449654703413502035</id><published>2007-07-09T17:33:00.000-07:00</published><updated>2008-02-17T16:57:29.940-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Friend of Red Gate</title><content type='html'>&lt;span&gt;After seeing my &lt;a href="http://chrisrickard.blogspot.com/2007/07/sqlpromptsnippeteditor.html"&gt;SqlPromptSnippetEditor&lt;/a&gt; application &lt;a href="http://www.simple-talk.com/community/user/Profile.aspx?UserID=2110"&gt;Bart Reed&lt;/a&gt;, the project manager for &lt;a href="http://www.red-gate.com/products/SQL_Prompt/index.htm"&gt;SQL Prompt&lt;/a&gt; nominated me for the &lt;a href="http://www.red-gate.com/about/community_relations/friends_of_RG.htm"&gt;Friends of Red Gate&lt;/a&gt; program, which I gladly accepted. For those of you unfamiliar with the program (like I was), it is a lot like a Red Gate version of the &lt;a href="http://mvp.support.microsoft.com/"&gt;Microsoft MVP Program&lt;/a&gt;. In fact if you are a Microsoft MVP there's a good chance you are eligible for the Friends of Red Gate program, especially if it is of a SQL or .NET flavor.&lt;br /&gt;&lt;br /&gt;I'm not quite &lt;/span&gt;&lt;span&gt;yet &lt;/span&gt;&lt;span&gt;sure how I'll use this new award, if anything my opinions may carry more weight in future versions of SQL Prompt, which I intend to become even more active in.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-3449654703413502035?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/3449654703413502035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=3449654703413502035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/3449654703413502035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/3449654703413502035'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2007/07/friend-of-red-gate.html' title='Friend of Red Gate'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-4907167506549944784</id><published>2007-07-03T10:52:00.000-07:00</published><updated>2008-02-17T16:58:55.479-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='SqlPromptSnippetEditor'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SqlPromptSnippetEditor</title><content type='html'>&lt;p&gt;After being fed up with the ability to use copy and paste in the Snippet editor in SQL Prompt I decided to create my own editor.&lt;br /&gt;&lt;br /&gt;While I was at it I got a little carried away and created a full blown Snippet Management application. The funny thing is I know that SQL Prompt 3.5 is slated to be Release Candidated (heh) this month and the full release will come shortly after. At the very least the aforementioned bug will be fixed and probably some of the other features I put in will be included as well since people kept asking for them in the support forums.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www12.brinkster.com/chrisrickard/development/SqlPromptSnippetEditor/"&gt;Get it here&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;IMPORTANT!&lt;/strong&gt;&lt;/span&gt; Back up your Snippets file before using, as I make no warranties that it won't completely mangle your file.&lt;br /&gt;&lt;br /&gt;Some other things to note: (As I don't have any help written) &lt;/p&gt;&lt;ul&gt;&lt;li&gt;I did my best to make the app very keyboard friendly, get to learn the different shortcuts.&lt;/li&gt;&lt;li&gt;Most of the list views have the ability to perform multi selected operations &lt;/li&gt;&lt;li&gt;On the import screen if you see a snippet colored &lt;span style="color: rgb(204, 153, 51);"&gt;DarkGoldenRod&lt;/span&gt; it means that you already have the snippet defined and it is exactly the same as the import snippet. If you see a snippet colored &lt;span style="color: rgb(255, 0, 0);"&gt;Red &lt;/span&gt;it means you already have the snippet defined and it is different from the import snippet (conflicted). Double click the colored snippet to view a comparison.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-4907167506549944784?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/4907167506549944784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=4907167506549944784' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/4907167506549944784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/4907167506549944784'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2007/07/sqlpromptsnippeteditor.html' title='SqlPromptSnippetEditor'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2745968353541871665.post-6468888094591871492</id><published>2007-06-26T23:22:00.000-07:00</published><updated>2008-02-17T16:57:29.941-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>AddWithValue is evil!</title><content type='html'>I'm of course talking about &lt;a href="http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx"&gt;SqlParameterCollection.AddWithValue&lt;/a&gt;. As with any blanket statement about some kind of technology being evil of course it isn't, but it sure did throw me for a loop today.&lt;br /&gt;&lt;br /&gt;First let me give you a little background, for the last couple of years I've had the privilege of using a technology called SPEW, which reads the definition of a Stored Procedure from the Database and Generates a wrapper class which provides a strongly typed interface to a stored procedure. It means that I never had to instanciate my own SqlCommand objects and add Parameters and have to worry about if I spelled it correctly or look up types.&lt;br /&gt;&lt;br /&gt;However that was proprietary technology to the company I no longer work for :( so until I can come up with an equivalent, it's manual creation for me.&lt;br /&gt;&lt;br /&gt;So when my options for creating a SqlParamater are:&lt;br /&gt;&lt;br /&gt;cmd.Parameters.Add("@SomeID", SqlDbType.Int, 4).Value = _someID;&lt;br /&gt;or&lt;br /&gt;cmd.Paramaters.AddWithValue("@SomeID", _someID);&lt;br /&gt;&lt;br /&gt;of course I chose the latter, as I'm adding 20 or so parameters at a time on many stored procedures. It seemed to work just fine at the time.&lt;br /&gt;&lt;br /&gt;Now AddWithValue uses type inference since they aren't explicitly set. string maps to NVARCHAR, decimal to DECIMAL, bool to BIT, etc.&lt;br /&gt;&lt;br /&gt;So I developed an ASP.NET application locally using the built in development web server. When I deployed it to the target IIS server and tested it it gave me a SQL error to the effect of trying to use an NVARCHAR value as type MONEY, try using CONVERT. Eh? I then profiled it, the SQL generated by ADO.NET was perfectly valid and ran without errors. After messing around with the server configuration and re-deploying the site twice without fixing the problem I went back to the code and on a whim converted it to explicitly  state the  Sql Type. What do you know it worked on the IIS server.&lt;br /&gt;&lt;br /&gt;It seems really weird that this would happen, as one would think the Web Hosting environment would have nothing to do with the way ADO.NET operates a SqlCommand aside from connection pooling.&lt;br /&gt;&lt;br /&gt;So lesson learned, don't be lazy and avoid AddWithValue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2745968353541871665-6468888094591871492?l=chrisrickard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chrisrickard.blogspot.com/feeds/6468888094591871492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2745968353541871665&amp;postID=6468888094591871492' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/6468888094591871492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2745968353541871665/posts/default/6468888094591871492'/><link rel='alternate' type='text/html' href='http://chrisrickard.blogspot.com/2007/06/addwithvalue-is-evil.html' title='AddWithValue is evil!'/><author><name>Chris Rickard</name><uri>http://www.blogger.com/profile/02922415735349341360</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='29' src='http://bp1.blogger.com/_n07tuwMNUu8/R7E6Kc-pZOI/AAAAAAAAABg/1e28UDJ2N_E/S220/me.png'/></author><thr:total>2</thr:total></entry></feed>
