<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;D0IHQ3Y7eCp7ImA9WhRUE0o.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559</id><updated>2012-01-23T21:25:32.800-06:00</updated><category term=".net" /><category term="serialization" /><category term="json" /><category term="TFS" /><title>new Christian(new Developer(new Man())).Thoughts;</title><subtitle type="html">A .NET Developer's worldview from a Christian perspective.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://toddmeinershagen.blogspot.com/" /><author><name>Todd Meinershagen</name><uri>http://www.blogger.com/profile/15973461415802595901</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/toddmeinershagen" /><feedburner:info uri="blogspot/toddmeinershagen" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0IHQ3Y6eSp7ImA9WhRUE0o.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-7735913782213558477</id><published>2012-01-23T21:24:00.003-06:00</published><updated>2012-01-23T21:25:32.811-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-23T21:25:32.811-06:00</app:edited><title>AgileDotNet 2012</title><content type="html">My company, Improving, is hosting our third annual AgileDotNet conference in Dallas on Friday, February 17th. It will be a day of presentations and discussion focused on agile software development on the Microsoft stack, ALM tools, and the leadership and cultural issues involved in agile IT. &amp;nbsp;Hope you can &amp;nbsp;join us!&lt;br /&gt;
&lt;br /&gt;
Full details can be found &lt;a href="http://www.agiledotnet.com/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-7735913782213558477?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YI1fBNZqV_Zb2GeUMK5nVpGma0k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YI1fBNZqV_Zb2GeUMK5nVpGma0k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YI1fBNZqV_Zb2GeUMK5nVpGma0k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YI1fBNZqV_Zb2GeUMK5nVpGma0k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/dozyOsdPjKw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/7735913782213558477/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=7735913782213558477" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/7735913782213558477?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/7735913782213558477?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/dozyOsdPjKw/my-company-improving-is-hosting-our.html" title="AgileDotNet 2012" /><author><name>Todd Meinershagen</name><uri>http://www.blogger.com/profile/15973461415802595901</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2012/01/my-company-improving-is-hosting-our.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUNQnkzfip7ImA9WhRWFU4.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-454356646858399916</id><published>2011-12-26T14:42:00.001-06:00</published><updated>2012-01-02T13:41:33.786-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T13:41:33.786-06:00</app:edited><title>Using Gists for Code Snippets</title><content type="html">Normally, I use Windows LiveWriter to write my blogs at &lt;a href="http://www.blogspot.com/"&gt;BlogSpot&lt;/a&gt;. &amp;nbsp;And I have always used syntax highlighter plug-ins to insert code snippets. &amp;nbsp;These utilities in the past inserted a lot of html elements and style definitions in-line with the rest of the post or required setting up global stylesheets and javascript in order to work.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In the last few weeks, as I have been looking at transitioning my blog to a ruby-based engine called &lt;a href="http://www.octopress.org/"&gt;OctoPress&lt;/a&gt;, I found another mechanism for inserting code snippets - &lt;a href="http://gist.github.com/"&gt;gists&lt;/a&gt; from &lt;a href="http://www.github.com/"&gt;GitHub&lt;/a&gt;. &amp;nbsp;It allows you to store your code snippets online and easily add them to your posts with one line of code.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
All you need to do is:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
1. &amp;nbsp;Go to http://gists.github.com&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
2. &amp;nbsp;Sign up for &amp;nbsp;a free GitHub account&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
All you have to do is click on the link in the upper, right-hand corner "Sign up for a GitHub account". &amp;nbsp;It leads you through a process.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-PRKOl9vQD7w/TvjYNKibLuI/AAAAAAAAAB8/NNQ_JlliI7Q/s1600/Screen+Shot+2011-12-26+at+2.24.49+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="441" src="http://3.bp.blogspot.com/-PRKOl9vQD7w/TvjYNKibLuI/AAAAAAAAAB8/NNQ_JlliI7Q/s640/Screen+Shot+2011-12-26+at+2.24.49+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
If you don't wish to create an account, you can create gists anonymously as well.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
3. &amp;nbsp;Add gist to GitHub&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-Ti1IQuZlWHQ/TvjYmxnwvxI/AAAAAAAAACI/a-1AtmJniTM/s1600/Screen+Shot+2011-12-26+at+2.26.43+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="352" src="http://4.bp.blogspot.com/-Ti1IQuZlWHQ/TvjYmxnwvxI/AAAAAAAAACI/a-1AtmJniTM/s640/Screen+Shot+2011-12-26+at+2.26.43+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
All you need to do in order to add a new gist is:&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
a. &amp;nbsp;Create a name for the gist&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
b. &amp;nbsp;Create a name for the file (this is optional)&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
c. &amp;nbsp;Select a language&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
If you give the file a name, the system will determine what the language is from the extension.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
d. &amp;nbsp;Put the text of the code snippet in the body of the gist&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
e. &amp;nbsp;Save the gist by clicking on the Save Gist button.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-dbyAlfyIkbI/TvjZoTpr6gI/AAAAAAAAACU/3d8jFBBqpWI/s1600/Screen+Shot+2011-12-26+at+2.26.23+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="214" src="http://2.bp.blogspot.com/-dbyAlfyIkbI/TvjZoTpr6gI/AAAAAAAAACU/3d8jFBBqpWI/s640/Screen+Shot+2011-12-26+at+2.26.23+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
4. &amp;nbsp;Add the gist in your post&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
In order to add the gist to your post, you will need to click on the show embed link and add the html snippet to the html content of your post. &amp;nbsp;In this case,&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&amp;lt;script src="https://gist.github.com/1522062.js"&amp;gt; &amp;lt;/script&amp;gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
Once you have added this, the code should appear in the post as below.&lt;/div&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1522037.js"&gt;
&lt;/script&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
5. &amp;nbsp;Add line numbers via additional css styles&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
You may notice once using the steps above that the native gists from GitHub do not support line numbers currently, so in order to add them I found a gist that contains the .css styles that you need to add to your blog site. &amp;nbsp;Once added, all snippets appear with line numbers as you saw in point number 4.&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;script src="https://gist.github.com/1243028.js"&gt;
 
&lt;/script&gt;
&lt;br /&gt;
&lt;div&gt;
If you find another way to do this by adjusting settings at GitHub, let me know in the comments. &lt;br /&gt;
&lt;br /&gt;
Hope this helps!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-454356646858399916?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9cNKnCxuxTw0XRZFCRKFN2V0ucI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9cNKnCxuxTw0XRZFCRKFN2V0ucI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9cNKnCxuxTw0XRZFCRKFN2V0ucI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9cNKnCxuxTw0XRZFCRKFN2V0ucI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/b3CAR9qMSNc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/454356646858399916/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=454356646858399916" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/454356646858399916?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/454356646858399916?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/b3CAR9qMSNc/using-gists-for-code-snippets.html" title="Using Gists for Code Snippets" /><author><name>Todd Meinershagen</name><uri>http://www.blogger.com/profile/15973461415802595901</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-PRKOl9vQD7w/TvjYNKibLuI/AAAAAAAAAB8/NNQ_JlliI7Q/s72-c/Screen+Shot+2011-12-26+at+2.24.49+PM.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2011/12/using-gists-for-code-snippets.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04HSX05cSp7ImA9WhRWFU4.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-4638440554595826736</id><published>2011-02-11T03:18:00.003-06:00</published><updated>2012-01-02T14:25:38.329-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T14:25:38.329-06:00</app:edited><title>Creating Data-Driven Tests in MS Test</title><content type="html">For my current client, I was looking for a way to create a data-driven unit test in MSTest.&amp;nbsp; Basically, you can define a test once and then define a data source that provides multiple rows of data to be sent through the same test.&amp;nbsp; That way, you don’t have to write redundant tests.&lt;br /&gt;
I had done this previously, but I couldn’t remember how it was done.&amp;nbsp; I’m writing this post in order to remind myself and hopefully help someone out there.&lt;br /&gt;
1.&amp;nbsp; Create a Test Method&lt;br /&gt;
The first step is to make sure you have a test method.&amp;nbsp; You can do this by making sure that in your test project you have at least one class decorated with the [TestClass] attribute and a method with the [TestMethod] attribute.&amp;nbsp; &lt;br /&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;[TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Add_when_two_numbers_returns_proper_result()&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;style type="text/css"&gt;
.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; }
&lt;/style&gt;&lt;br /&gt;
&lt;br /&gt;
When creating this test class, make sure to keep the TestContext property as it is defaulted.&amp;nbsp; You will be using this when coding your test.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; TestContext _testContext;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;///Gets or sets the test context which provides&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;///information about and functionality for the current test run.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; TestContext TestContext&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;get&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; _testContext;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;set&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;_testContext = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;style type="text/css"&gt;
.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; }
&lt;/style&gt;&lt;br /&gt;
&lt;br /&gt;
2.&amp;nbsp; Add a Test Data File&lt;br /&gt;
&lt;br /&gt;
For the purposes of this explanation we will be using a simple .csv file (TestData.csv).&amp;nbsp; Make sure to add a text file, preferably at the root of your project with that extension.&amp;nbsp; In the file, you will want to add data.&amp;nbsp; I have added three columns per row:&amp;nbsp; Operand1, Operand2, and ExpectedValue which represents the expected result of adding the two operands together.&amp;nbsp; You can add as many rows of data to check all of the boundary conditions that express your intentions for your unit test.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_3gdMjuMkpX4/TVT-x3LTJMI/AAAAAAAAAzs/7WSC_pfPJEg/s1600-h/image%5B66%5D.png"&gt;&lt;img alt="image" border="0" height="158" src="http://lh4.ggpht.com/_3gdMjuMkpX4/TVT-yPYTFHI/AAAAAAAAAzw/C49cS0f4O6c/image_thumb%5B38%5D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="410" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Right-click on the file and select Properties to set the Build Action to Content and the Copy to Output Directory to Copy Always as shown below.&amp;nbsp; This will ensure that the file is copied to the Bin folder when running your unit tests.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_3gdMjuMkpX4/TVT-yc4ZdhI/AAAAAAAAAz0/ugITp5yT1YA/s1600-h/image%5B27%5D.png"&gt;&lt;img alt="image" border="0" height="266" src="http://lh5.ggpht.com/_3gdMjuMkpX4/TVT-ygga9aI/AAAAAAAAAz4/yfNT0egZxMA/image_thumb%5B17%5D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="299" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
3.&amp;nbsp; Open the Test View from the Test menu.&lt;br /&gt;
&lt;br /&gt;
From the Test menu, select the Windows –&amp;gt; Test View option as shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh6.ggpht.com/_3gdMjuMkpX4/TVT-zNBhbHI/AAAAAAAAAz8/TWJvdP7Q-yA/s1600-h/image%5B4%5D.png"&gt;&lt;img alt="image" border="0" height="345" src="http://lh4.ggpht.com/_3gdMjuMkpX4/TVT-zrs5-RI/AAAAAAAAA0A/Zs2Z8rQOv8s/image_thumb%5B2%5D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="430" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Once you open the Test View, you should see a list of the test methods that are available.&amp;nbsp; When a test is highlighted, you will see the properties for that particular test in the Properties pane as shown below.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_3gdMjuMkpX4/TVT-0GECXTI/AAAAAAAAA0E/DK-UYStZ4c8/s1600-h/image%5B36%5D.png"&gt;&lt;img alt="image" border="0" height="725" src="http://lh3.ggpht.com/_3gdMjuMkpX4/TVT-0ri4qkI/AAAAAAAAA0I/fgDlSDkWBqQ/image_thumb%5B22%5D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="386" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
4.&amp;nbsp; Assign Test File as Test Data Source&lt;br /&gt;
&lt;br /&gt;
Find the row for Data Connection String in the Properties pane and click on the button to the far right with the ellipses (…).&amp;nbsp; That should open the following dialog where you will be presented with an option to set up a database, csv file, or xml file.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh6.ggpht.com/_3gdMjuMkpX4/TVT-02i6S0I/AAAAAAAAA0M/ZhwHZ_SQiuM/s1600-h/image%5B17%5D.png"&gt;&lt;img alt="image" border="0" height="356" src="http://lh5.ggpht.com/_3gdMjuMkpX4/TVT-1Rd7OtI/AAAAAAAAA0Q/3Qo9Y4F573U/image_thumb%5B11%5D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="378" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The database option should be self explanatory.&amp;nbsp; It is like any other database connection, and the most popular option is to use a simple MS Access DB or SQL Express database that you can include with your project.&lt;br /&gt;
&lt;br /&gt;
The other two options are file based.&amp;nbsp; The CSV file will be explained in further detail below.&amp;nbsp; The main difference between a CSV and XML file is that you can have multiple test data sets in the XML file while only one set of data would be accessible for a CSV.&amp;nbsp; So, if you need to set up data for multiple tests, you would need to maintain multiple files with the CSV option.&amp;nbsp; In the XML option, you could just maintain one with multiple sections within the XML file.&lt;br /&gt;
&lt;br /&gt;
Select the CSV File option and click Next.&lt;br /&gt;
&lt;br /&gt;
5.&amp;nbsp; Select Your CSV File&lt;br /&gt;
&lt;br /&gt;
At this point, you will be presented with a dialog to select a CSV file.&amp;nbsp; Click on the (…) button and select the location of the text file that you created for your test.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh6.ggpht.com/_3gdMjuMkpX4/TVT-1hsntAI/AAAAAAAAA0U/hbZuogtm908/s1600-h/image%5B40%5D.png"&gt;&lt;img alt="image" border="0" height="401" src="http://lh4.ggpht.com/_3gdMjuMkpX4/TVT-2L1T9SI/AAAAAAAAA0Y/dFF5qvdcgnE/image_thumb%5B24%5D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="433" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Once selected, the dialog will show the contents of your CSV file as a data grid to allow you to examine the contents to make sure that the data is what you were expecting.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_3gdMjuMkpX4/TVT-2W9liFI/AAAAAAAAA0c/-cQFninilUE/s1600-h/image%5B70%5D.png"&gt;&lt;img alt="image" border="0" height="381" src="http://lh4.ggpht.com/_3gdMjuMkpX4/TVT-2mklPKI/AAAAAAAAA0g/cuPXtUb5_ck/image_thumb%5B40%5D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="413" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Click the Finish button once you have confirmed the file contents.&amp;nbsp; You will notice that the properties have been updated to reflect the change.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_3gdMjuMkpX4/TVT-29mBjJI/AAAAAAAAA0k/Em7c81PdO4U/s1600-h/image%5B49%5D.png"&gt;&lt;img alt="image" border="0" height="225" src="http://lh3.ggpht.com/_3gdMjuMkpX4/TVT-3SpJdqI/AAAAAAAAA0o/M1uDhNr3aqE/image_thumb%5B29%5D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="430" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
In addition, Visual Studio will add a [DataSource] and [DeploymentItem] attributes to your original test method as shown below with the same information.&amp;nbsp; In the future, you can set these attributes up on a test without needing to use the Properties wizard for selecting a Data Source.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;[DataSource(&lt;span class="str"&gt;"Microsoft.VisualStudio.TestTools.DataSource.CSV"&lt;/span&gt;, &lt;span class="str"&gt;"|DataDirectory|\\TestData.csv"&lt;/span&gt;, &lt;span class="str"&gt;"TestData#csv"&lt;/span&gt;, DataAccessMethod.Sequential), DeploymentItem(&lt;span class="str"&gt;"Demo.DataDrivenTests\\TestData.csv"&lt;/span&gt;), DeploymentItem(&lt;span class="str"&gt;"TestData.csv"&lt;/span&gt;), TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Add_when_two_numbers_returns_proper_result()&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;style type="text/css"&gt;
.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; }
&lt;/style&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6.&amp;nbsp; Add Code to Reference Data Source&lt;br /&gt;
&lt;br /&gt;
Once you have added your test data to the test method, you will want to access it within the body of your unit test method.&amp;nbsp; This can be done by referencing the DataRow property of the TestContext class-level variable.&amp;nbsp; I have created a simple test to use the values to assert that the Add method of a simple Calculator class works as shown below.&amp;nbsp; Because a DataRow column returns an object, you will need to do some casting to the appropriate data types.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;[DeploymentItem(&lt;span class="str"&gt;"Demo.DataDrivenTests\\TestData.csv"&lt;/span&gt;), DeploymentItem(&lt;span class="str"&gt;"TestData.csv"&lt;/span&gt;), DataSource(&lt;span class="str"&gt;"Microsoft.VisualStudio.TestTools.DataSource.CSV"&lt;/span&gt;, &lt;span class="str"&gt;"|DataDirectory|\\TestData.csv"&lt;/span&gt;, &lt;span class="str"&gt;"TestData#csv"&lt;/span&gt;, DataAccessMethod.Sequential), TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Add_when_two_numbers_returns_proper_result()&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;//arrange&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;var operand1 = System.Convert.ToInt32(TestContext.DataRow[&lt;span class="str"&gt;"Operand1"&lt;/span&gt;]);&lt;/pre&gt;&lt;pre&gt;var operand2 = System.Convert.ToInt32(TestContext.DataRow[&lt;span class="str"&gt;"Operand2"&lt;/span&gt;]);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;/pre&gt;&lt;pre&gt;var sut = &lt;span class="kwrd"&gt;new&lt;/span&gt; Calculator();&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;//act&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;var result = sut.Add(operand1, operand2);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;//assert&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;var expectedValue = System.Convert.ToInt32(TestContext.DataRow[&lt;span class="str"&gt;"ExpectedValue"&lt;/span&gt;]);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;/pre&gt;&lt;pre&gt;Assert.AreEqual(expectedValue, result);&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;style type="text/css"&gt;
.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; }
&lt;/style&gt;&lt;br /&gt;
&lt;br /&gt;
7.&amp;nbsp; Run the Test&lt;br /&gt;
&lt;br /&gt;
You can run the test as you would any other in MS Test.&amp;nbsp; The result will look similar to other tests.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh5.ggpht.com/_3gdMjuMkpX4/TVT-3nFWkrI/AAAAAAAAA0s/18Wy09qAbVE/s1600-h/image%5B53%5D.png"&gt;&lt;img alt="image" border="0" height="128" src="http://lh5.ggpht.com/_3gdMjuMkpX4/TVT-3y-dB4I/AAAAAAAAA00/MeZgM-V9xss/image_thumb%5B31%5D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="380" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
However, if you right-click on the result row in the Test Results pane, and select View Test Results Details as shown below…&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_3gdMjuMkpX4/TVT-4ZmlLHI/AAAAAAAAA04/Q0OADe9ZlyA/s1600-h/image%5B57%5D.png"&gt;&lt;img alt="image" border="0" height="242" src="http://lh3.ggpht.com/_3gdMjuMkpX4/TVT-4iyUv9I/AAAAAAAAA08/tAwOtIcCkKQ/image_thumb%5B33%5D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="356" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
…you will see the detail of the results to see which data combinations failed and why.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/_3gdMjuMkpX4/TVT-4zuDzDI/AAAAAAAAA1A/E-62RPHM_sc/s1600-h/image%5B62%5D.png"&gt;&lt;img alt="image" border="0" height="238" src="http://lh5.ggpht.com/_3gdMjuMkpX4/TVT-5LvQ2II/AAAAAAAAA1E/PBHZDsuYhAU/image_thumb%5B36%5D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="397" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Hope this helps someone else out there.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-4638440554595826736?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kRI5XDNJ4do_XVz19_Mg1XbfGV4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kRI5XDNJ4do_XVz19_Mg1XbfGV4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kRI5XDNJ4do_XVz19_Mg1XbfGV4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kRI5XDNJ4do_XVz19_Mg1XbfGV4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/DovV22AA5Y4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/4638440554595826736/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=4638440554595826736" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/4638440554595826736?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/4638440554595826736?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/DovV22AA5Y4/creating-data-driven-tests-in-ms-test.html" title="Creating Data-Driven Tests in MS Test" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_3gdMjuMkpX4/TVT-yPYTFHI/AAAAAAAAAzw/C49cS0f4O6c/s72-c/image_thumb%5B38%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2011/02/creating-data-driven-tests-in-ms-test.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DQXo4eCp7ImA9WhRWFU4.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-6158494910193984410</id><published>2010-09-30T22:35:00.003-05:00</published><updated>2012-01-02T14:26:10.430-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T14:26:10.430-06:00</app:edited><title>Create Custom Test Category Attributes in Visual Studio</title><content type="html">In the past, for each class library project we create in Visual Studio, we have maintained separate unit test and integration test projects.&amp;nbsp; This has allowed us to easily configure continuous integration with TFS to run a given project’s unit tests on check-in and run the full suite of unit and integration tests on a nightly build.&lt;br /&gt;
With the introduction of Visual Studio 2010, build types now can filter tests based on test categories.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
For example, I can categorize a given test as a unit test by doing the following:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="font-family: COnsolas;"&gt;[TestClass]     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Test      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TestMethod]      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TestCategory("UnitTest")]      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void IsValid_returns_false_when_quantity_large()      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: COnsolas;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
This allows us to consolidate all tests into one project and distinguish by categories.&amp;nbsp; The only issue is that these categories are based on strings that the developer must type, and this can create inconsistencies using magic strings which may not be noticed during the course of development.&lt;br /&gt;
&lt;br /&gt;
In order to get around this, another option is to create your own custom test category attributes that return the proper string.&amp;nbsp; Microsoft has provided a base class, TestCategoryBaseAttribute for this very purpose.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;public class UnitTestAttribute : TestCategoryBaseAttribute     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public UnitTestAttribute()      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {} &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override IList&amp;lt;string&amp;gt; TestCategories     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return new List&amp;lt;string&amp;gt; {"UnitTest"}; }      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
By overriding the TestCategories property, you can return the appropriate string(s) that represent this classification.&amp;nbsp; In this case, we are returning the same string that the previous test category provided.&lt;br /&gt;
&lt;br /&gt;
In order to use this attribute, you merely need to add it to a given test method like so.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="font-family: Consolas;"&gt;[TestClass]     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Test      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TestMethod]      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [UnitTest]      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void IsValid_returns_false_when_quantity_large()      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
With this kind of flexibility, if you had a limited list of attributes that you wanted to provide to developers, you could also create an enum type and pass that into the constructor of the custom test category attribute.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Just create an enum type.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="font-family: Consolas;"&gt;public enum Category : int     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UnitTest = 0,      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IntegrationTest = 1      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Then, create the attribute using the enum as a constructor parameter.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="font-family: Consolas;"&gt;public class TestCategoryAttribute &lt;/span&gt;&lt;span style="font-family: Consolas;"&gt;: TestCategoryBaseAttribute     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private TestCategory _category; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Consolas;"&gt;&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="font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public TestCategoryAttribute(TestCategory category)     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _category = category;      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Consolas;"&gt;&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="font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public override IList&amp;lt;string&amp;gt; TestCategories     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var value = Enum.GetName(typeof (TestCategory), _category);      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new List&amp;lt;string&amp;gt;{ value };      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Consolas;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
To use the new attribute, you would do the following.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="font-family: Consolas;"&gt;[TestClass]     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Test      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TestMethod]      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TestCategory(Category.UnitTest)]      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void IsValid_returns_false_when_quantity_large()      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Hope this helps!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-6158494910193984410?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_QpMpZsHK2sdkK8Od2_5YN7sGa8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_QpMpZsHK2sdkK8Od2_5YN7sGa8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_QpMpZsHK2sdkK8Od2_5YN7sGa8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_QpMpZsHK2sdkK8Od2_5YN7sGa8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/D87pdriJNVY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/6158494910193984410/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=6158494910193984410" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/6158494910193984410?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/6158494910193984410?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/D87pdriJNVY/create-custom-test-category-attributes.html" title="Create Custom Test Category Attributes in Visual Studio" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2010/09/create-custom-test-category-attributes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04MQHY_eSp7ImA9WhRWFU4.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-3386561240904177631</id><published>2010-08-23T22:21:00.001-05:00</published><updated>2012-01-02T14:26:21.841-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T14:26:21.841-06:00</app:edited><title>Six Interview Questions for Agile Teams</title><content type="html">I was reading through my blogs tonight and came across &lt;a href="http://www.stickyminds.com/sitewide.asp?Function=edetail&amp;amp;ObjectType=COL&amp;amp;ObjectId=16277&amp;amp;tth=DYN&amp;amp;tt=siteemail&amp;amp;iDyn=2" target="_blank"&gt;one&lt;/a&gt; that did a nice job of explaining the qualities that an agile team member should possess.&amp;nbsp; In addition, the writer included a good behavioral interview question for each.&lt;br /&gt;
I briefly share each below, but I highly recommend reading the &lt;a href="http://www.stickyminds.com/sitewide.asp?Function=edetail&amp;amp;ObjectType=COL&amp;amp;ObjectId=16277&amp;amp;tth=DYN&amp;amp;tt=siteemail&amp;amp;iDyn=2" target="_blank"&gt;original article&lt;/a&gt;.&lt;br /&gt;
1. &lt;u&gt;People Who Collaborate&lt;/u&gt;&lt;br /&gt;
&lt;em&gt;"Think back to a recent project. Give me an example of a time you had to work with other people to make sure that you could finish something. What happened?"&lt;/em&gt; &lt;br /&gt;
2. &lt;u&gt;People Who Ask for Help&lt;/u&gt;&lt;br /&gt;
&lt;em&gt;"Think back to your most recent project. Tell me about a time you did not understand something. What did you do?" &lt;/em&gt;&lt;br /&gt;
3. &lt;u&gt;People Who are Willing to Take Small Steps and Get Feedback&lt;/u&gt;&lt;br /&gt;
&lt;em&gt;"When you work on your projects outside of work, how do you work?"&lt;/em&gt; &lt;br /&gt;
4. &lt;u&gt;People Who are Willing To Do Something That is Good Enough for Now&lt;/u&gt;&lt;br /&gt;
&lt;em&gt;"Tell me about a recent time you did not know everything at the beginning of the project. What did you do?"&lt;/em&gt; &lt;br /&gt;
5. &lt;u&gt;Adaptable People&lt;/u&gt;&lt;br /&gt;
&lt;em&gt;"Tell me about a time when you did not have the conditions you would've liked for your project. What did you do?"&lt;/em&gt; &lt;br /&gt;
6. &lt;u&gt;People Willing to Work Outside Their Expertise&lt;/u&gt;&lt;br /&gt;
&lt;em&gt;"Tell me about a time you took on work to help the team. What was that like?"&lt;/em&gt; &lt;br /&gt;
So, tell me dear Reader – what questions do you ask when interviewing candidates for an agile-oriented team?&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-3386561240904177631?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KsvrGho4eNspTl_EG0gEjf_Guxw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KsvrGho4eNspTl_EG0gEjf_Guxw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KsvrGho4eNspTl_EG0gEjf_Guxw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KsvrGho4eNspTl_EG0gEjf_Guxw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/DuJHh6QA_DI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/3386561240904177631/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=3386561240904177631" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/3386561240904177631?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/3386561240904177631?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/DuJHh6QA_DI/six-interview-questions-for-agile-teams.html" title="Six Interview Questions for Agile Teams" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2010/08/six-interview-questions-for-agile-teams.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcFQnozcCp7ImA9WhRWFU4.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-5519102175730917081</id><published>2010-05-29T07:30:00.000-05:00</published><updated>2012-01-02T14:26:53.488-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T14:26:53.488-06:00</app:edited><title>Motivations</title><content type="html">I found this &lt;a href="http://lifehacker.com/5550373/the-surprising-realities-behind-what-motivates-us-in-illustrated-form"&gt;video&lt;/a&gt;&amp;nbsp;about what motivates people to be very refreshing. &amp;nbsp;Basically, if the tasks that people are working on require more than a basic physical action, money rewards don't motivate, but rather demotivate people. &amp;nbsp;What really motivates others to perform well at conceptual tasks are three things: &amp;nbsp;autonomy, self mastery, and purpose. &amp;nbsp;What I find is that Agile practices tend to foster or work within these motivations. &amp;nbsp;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;For example, user stories really help to zero in on the purpose for a given feature request. &amp;nbsp;"As a [actor], I can [do something], so that I can [accomplish a goal]." &amp;nbsp;Developers really get a sense for why they are building a piece of functionality rather than just focusing on building a method, etc. &amp;nbsp;And the prioritization of these stories helps to clarify what is truly important within a sprint.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;As well, agile practices promote mastery by emphasizing continual improvement. &amp;nbsp;Teams are encouraged to use the processes that work for an individual team rather than trying to create a process that will work for an entire organization. &amp;nbsp;Other principles such as refactoring and unit testing also suggest an intense focus on continually improving the code base.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;And finally, the scrum meeting and agile planning in general focus on the team working together on deciding the priorities rather than having a central authority such as a PM do that. &amp;nbsp;Individuals make themselves accountable to the team by explaining what they accomplished yesterday and what they plan to accomplish for the current day. &amp;nbsp;This creates a sense of autonomy in those performing the work.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;I would be interested to hear your thoughts on the video as well as whether or not you agree that agile practices help to foster these motivations.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-5519102175730917081?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ii6ixSSzzjL4IfBNB_FAF1IWyVo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ii6ixSSzzjL4IfBNB_FAF1IWyVo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ii6ixSSzzjL4IfBNB_FAF1IWyVo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ii6ixSSzzjL4IfBNB_FAF1IWyVo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/H4PgbzH2CMo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/5519102175730917081/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=5519102175730917081" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/5519102175730917081?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/5519102175730917081?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/H4PgbzH2CMo/motivations.html" title="Motivations" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2010/05/motivations.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IBRX05eip7ImA9WxNaFU4.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-893449685542060548</id><published>2009-11-29T15:47:00.003-06:00</published><updated>2009-11-29T15:52:34.322-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-29T15:52:34.322-06:00</app:edited><title>Rick Warren Speaks on Meet the Press - Giving</title><content type="html">I really enjoyed seeing Rick Warren, the pastor of Saddleback Church in California, speak on giving on Meet the Press with David Gregory.  (below)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And what influence he has - not just because he has a platform on national television, but because he actually gives 90% of his income.  He has the authority to speak on this subject!&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;iframe height="339" width="425" src="http://www.msnbc.msn.com/id/22425001/vp/34193069#34193069" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;p style="font-size:11px; font-family:Arial, Helvetica, sans-serif; color: #999; margin-top: 5px; background: transparent; text-align: center; width: 425px;"&gt;Visit msnbc.com for &lt;a style="text-decoration:none !important; border-bottom: 1px dotted #999 !important; font-weight:normal !important; height: 13px; color:#5799DB !important;" href="http://www.msnbc.msn.com/"&gt;Breaking News&lt;/a&gt;, &lt;a href="http://www.msnbc.msn.com/id/3032507" style="text-decoration:none !important; border-bottom: 1px dotted #999 !important; font-weight:normal !important; height: 13px; color:#5799DB !important;"&gt;World News&lt;/a&gt;, and &lt;a href="http://www.msnbc.msn.com/id/3032072" style="text-decoration:none !important; border-bottom: 1px dotted #999 !important; font-weight:normal !important; height: 13px; color:#5799DB !important;"&gt;News about the Economy&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-893449685542060548?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dX7ui9klLnBODBCP5KZs24GDx-I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dX7ui9klLnBODBCP5KZs24GDx-I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dX7ui9klLnBODBCP5KZs24GDx-I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dX7ui9klLnBODBCP5KZs24GDx-I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/HHVH5FtmW9g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/893449685542060548/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=893449685542060548" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/893449685542060548?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/893449685542060548?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/HHVH5FtmW9g/rick-warren-speaks-on-meet-press-giving.html" title="Rick Warren Speaks on Meet the Press - Giving" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2009/11/rick-warren-speaks-on-meet-press-giving.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUMRX4-fCp7ImA9WxNREU4.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-3626720855270519703</id><published>2009-09-05T02:54:00.001-05:00</published><updated>2009-09-05T02:54:44.054-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-05T02:54:44.054-05:00</app:edited><title>Static Code Analysis - Part 2</title><content type="html">&lt;p&gt;In my last post, I showed how you could enable static code analysis for a visual studio project.&amp;#160; However, you can also set up static code analysis at a more global level if you are using Team Foundation Server for source code control.&lt;/p&gt;  &lt;p&gt;Within a Team Project, you can set up a check-in policy that requires the code to pass static code analysis.&amp;#160; You can do this by simply right-clicking on the Team Project and selecting Source Control from the Team Project Settings.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_3gdMjuMkpX4/SqIZNW0UXWI/AAAAAAAAAmI/XzARg-NQ7Q0/image%5B3%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="232" alt="image" src="http://lh3.ggpht.com/_3gdMjuMkpX4/SqIZNhxKznI/AAAAAAAAAmM/H0BLv7TKq1I/image_thumb%5B1%5D.png" width="370" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;From the Source Control Settings dialog, click on the Check-In Policy tab. and click the Add... button.&amp;#160; (Note - I already have the Code Analysis policy set for my project in the image below.)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_3gdMjuMkpX4/SqIZNy0T5bI/AAAAAAAAAmQ/Qrj9KtnOxkQ/image%5B7%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="167" alt="image" src="http://lh5.ggpht.com/_3gdMjuMkpX4/SqIZOSj9_JI/AAAAAAAAAmU/1UBK7rL6ke0/image_thumb%5B3%5D.png" width="395" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;Click the Add... button to add a new check-in policy and select Code Analysis from the menu.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_3gdMjuMkpX4/SqIZOvSsQaI/AAAAAAAAAmY/ktC3xVC_o0A/image%5B11%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="228" alt="image" src="http://lh6.ggpht.com/_3gdMjuMkpX4/SqIZOxVkH-I/AAAAAAAAAmc/cdpbrXsopDs/image_thumb%5B5%5D.png" width="334" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;From here, you should be able set up the rules just as you would at the project level.&amp;#160; Any rules you specify should generate an error when violated, and therefore, the code will not compile.&amp;#160; As a result, the developers will not be able to check-in code that violates any of the rules that you have set for the team.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_3gdMjuMkpX4/SqIZPcIQktI/AAAAAAAAAmg/jUugWSfxMIU/image%5B15%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="352" alt="image" src="http://lh5.ggpht.com/_3gdMjuMkpX4/SqIZPv40z3I/AAAAAAAAAmk/JocvvpOkzR8/image_thumb%5B7%5D.png" width="308" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So, if you have already set up rules within your projects, another nice feature in Visual Studio is the ability to synch up your settings in each project with those set at the check-in policy level.&amp;#160; You can do this by selecting the Replace with Check-in Policy under Analyze/Code Analysis Settings for Solution in Visual Studio.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_3gdMjuMkpX4/SqIZQOpfkeI/AAAAAAAAAmo/KmCglaxjHe0/image%5B19%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="167" alt="image" src="http://lh6.ggpht.com/_3gdMjuMkpX4/SqIZQqyd5lI/AAAAAAAAAms/9Bdog0L82FU/image_thumb%5B9%5D.png" width="370" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;All of the settings in your current projects will match those set at the Team Project level.&amp;#160; None of your previous suppressions attributes should have been removed.&lt;/p&gt;  &lt;p&gt;Hope this helps!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-3626720855270519703?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XFrWScdDbPZrwL84b2WbvZ8GoI0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XFrWScdDbPZrwL84b2WbvZ8GoI0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XFrWScdDbPZrwL84b2WbvZ8GoI0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XFrWScdDbPZrwL84b2WbvZ8GoI0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/rfddxsNuHxc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/3626720855270519703/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=3626720855270519703" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/3626720855270519703?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/3626720855270519703?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/rfddxsNuHxc/static-code-analysis-part-2.html" title="Static Code Analysis - Part 2" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_3gdMjuMkpX4/SqIZNhxKznI/AAAAAAAAAmM/H0BLv7TKq1I/s72-c/image_thumb%5B1%5D.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2009/09/static-code-analysis-part-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQNQXs8cCp7ImA9WxNREU4.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-5119370089627714787</id><published>2009-09-05T02:22:00.001-05:00</published><updated>2009-09-05T02:39:50.578-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-05T02:39:50.578-05:00</app:edited><title>Static Code Analysis - Part 1</title><content type="html">&lt;p&gt;The static code analysis within Visual Studio is a great way of automating initial code review.&amp;#160; In order to turn it on do the following.&lt;/p&gt;  &lt;p&gt;1.&amp;#160; Go to Properties within the particular project.&lt;/p&gt;  &lt;p&gt;Code analysis can only be enabled at the project level, so the first step is to go to your properties section of each project you want enabled for code analysis.&lt;/p&gt;  &lt;p&gt;2.&amp;#160; Go to the Code Analysis tab.&lt;/p&gt;  &lt;p&gt;3.&amp;#160; At the top, check the box that &amp;quot;Enable Code Analysis on Build...&amp;quot;&lt;/p&gt;  &lt;p&gt;4.&amp;#160; On the right-hand side of the screen, check the box for those rules that you want treated as an error.&amp;#160; (By default it is treated as a warning and will not stop the build process.)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_3gdMjuMkpX4/SqIRxDkZilI/AAAAAAAAAl4/PiJvgFwRJHU/image%5B9%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="137" alt="image" src="http://lh5.ggpht.com/_3gdMjuMkpX4/SqIRxf4lfBI/AAAAAAAAAl8/CvP9kj--zmg/image_thumb%5B5%5D.png" width="464" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Sometimes the rules may not make sense for projects where a lot of code is auto-generated.&amp;#160; In this case, you could leave that rule as a warning in the project settings.&amp;#160; &lt;/p&gt;  &lt;p&gt;In other cases, you may want to suppress the errors for particular members of your types or for whole namespaces.&amp;#160; This can be done by right-clicking on the rule violation in the Error List that appears when compiling your project and selecting a Suppress Message option.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_3gdMjuMkpX4/SqIRxz6OWRI/AAAAAAAAAmA/DpvHLcCOoOo/image%5B5%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="237" alt="image" src="http://lh6.ggpht.com/_3gdMjuMkpX4/SqIRySX-ryI/AAAAAAAAAmE/vI8gQLZXIxM/image_thumb%5B3%5D.png" width="452" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As seen above, this can either be set within your source or in a project suppression file.&amp;#160; You can learn more about this &lt;a href="http://blogs.msdn.com/fxcop/archive/2006/12/28/FAQ-What-is-the-GlobalSuppressions.cs-GlobalSuppressions.vb-file-and-why-is-it-needed-Is-it-possible-to-change-the-name-of-this-file-David-Kean.aspx"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-5119370089627714787?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CRizpDtjAljwuJAHR5ioQXpcluY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CRizpDtjAljwuJAHR5ioQXpcluY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CRizpDtjAljwuJAHR5ioQXpcluY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CRizpDtjAljwuJAHR5ioQXpcluY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/V5Eab_W1mEs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/5119370089627714787/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=5119370089627714787" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/5119370089627714787?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/5119370089627714787?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/V5Eab_W1mEs/suppressing-static-code-analysis.html" title="Static Code Analysis - Part 1" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_3gdMjuMkpX4/SqIRxf4lfBI/AAAAAAAAAl8/CvP9kj--zmg/s72-c/image_thumb%5B5%5D.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2009/09/suppressing-static-code-analysis.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIDRXo6eyp7ImA9WxVaGUU.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-8164876788885792768</id><published>2009-04-17T12:12:00.002-05:00</published><updated>2009-04-17T12:16:14.413-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-17T12:16:14.413-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="serialization" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="json" /><title>JSON Serialization in .NET</title><content type="html">&lt;p&gt;Many of you may be familiar with the use of JSON (JavaScript Object Notation).  It is a very tight syntax for expressing the state of an object and is very widely used in Web 2.0/AJAX style development in which objects are passed back and forth between the client using the XmlHttpRequest object out of band to eliminate the need to do a full page refresh.&lt;/p&gt;  &lt;p&gt;I found a great article by Rick Strahl that outlines the pros/cons of two built-in .NET serializers:  JavaScriptSerializer and DataContractJsonSerializer.  You can read about them &lt;a href="http://west-wind.net/Weblog/ShowPost.aspx?id=442969" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;After using both methods in my own application, I found that another con of the JavaScriptSerializer that is a pro for the DataContractJsonSerializer class is that it requires a public default, parameter-less constructor.  This means that I cannot serialize objects that I also would like to make read-only, and therefore, requires a constructor with the properties defined up front.&lt;/p&gt;  &lt;p&gt;One point I wanted to make in this post was that the extension class that Rick defines in his post for simplifying DataContractJsonSerializer usage does not work properly.  In order to correct it, I added the 'this' keyword to the first parameter so that .NET recognized the static methods as extensions to the object type.  In addition, I converted the FromJsonString() method to a generic FromJsonString&amp;lt;T&amp;gt;() method to allow the return object to be strongly typed.  &lt;/p&gt;  &lt;p&gt;Code is listed below, if you are interested.&lt;/p&gt; &lt;a href="http://lh3.ggpht.com/_3gdMjuMkpX4/Sei4_iG8_8I/AAAAAAAAAio/aR2w9YY3VZ4/image%5B12%5D.png"&gt;&lt;img style="border: 0px none ;" alt="image" src="http://lh6.ggpht.com/_3gdMjuMkpX4/Sei5AKv5p2I/AAAAAAAAAis/-hHQ4bY55IM/image_thumb%5B10%5D.png" border="0" height="441" width="473" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-8164876788885792768?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/E57GP4kjEeBw3l7wxrG7IcvR3Mg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E57GP4kjEeBw3l7wxrG7IcvR3Mg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/E57GP4kjEeBw3l7wxrG7IcvR3Mg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/E57GP4kjEeBw3l7wxrG7IcvR3Mg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/E27poQh17yc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/8164876788885792768/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=8164876788885792768" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/8164876788885792768?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/8164876788885792768?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/E27poQh17yc/json-serialization-in-net.html" title="JSON Serialization in .NET" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_3gdMjuMkpX4/Sei5AKv5p2I/AAAAAAAAAis/-hHQ4bY55IM/s72-c/image_thumb%5B10%5D.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2009/04/json-serialization-in-net.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUNRHk4eSp7ImA9WxVaGEk.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-9009076083603941081</id><published>2009-04-15T21:18:00.001-05:00</published><updated>2009-04-15T21:18:15.731-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-15T21:18:15.731-05:00</app:edited><title>Changing the Default Browser in Visual Studio 2008 with ASP.NET MVC</title><content type="html">&lt;p&gt;How frustrating!&amp;#160; I spent at least 15 minutes trying to figure out how to change the default browser for debugging to my preferred browser in Visual Studio 2008.&amp;#160; &lt;/p&gt;  &lt;p&gt;Apparently, with a normal ASP.NET application, you can just right-click on any .aspx file and select 'Browse With...' from the context menu.&amp;#160; The dialog that opens (shown below) has the option to select a browser and click 'Set as Default' button.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_3gdMjuMkpX4/SeaVXsUkqnI/AAAAAAAAAig/CdXGJd4w3H0/image%5B4%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="270" alt="image" src="http://lh3.ggpht.com/_3gdMjuMkpX4/SeaVY5fBmDI/AAAAAAAAAik/ihY5xT51jGU/image_thumb%5B2%5D.png" width="344" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Unfortunately, the .aspx files in ASP.NET MVC applications don't don't provide this option in the context menu.&amp;#160; The only one that works is the Default.aspx file.&amp;#160; &lt;/p&gt;  &lt;p&gt;I found the answer from this helpful blog &lt;a href="http://www.geeksandgurus.com/blogs/sjb/2009/03/how-to-change-default-browser-in-visual.html" target="_blank"&gt;post&lt;/a&gt;.&amp;#160; Thank you, Steve Bodnar!&amp;#160; &lt;/p&gt;  &lt;p&gt;My recommendation to Microsoft is to either put this setting in the Tools/Options menu, which seems to be the most natural place to look for this setting, or place it in the Properties of the Web Site/Application project - which might be even better if you want to specify this setting per project.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-9009076083603941081?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Tl6z_guw9Q0_6m8NF9QcDXxu0zQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Tl6z_guw9Q0_6m8NF9QcDXxu0zQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Tl6z_guw9Q0_6m8NF9QcDXxu0zQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Tl6z_guw9Q0_6m8NF9QcDXxu0zQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/4l08eNKopAk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/9009076083603941081/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=9009076083603941081" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/9009076083603941081?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/9009076083603941081?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/4l08eNKopAk/changing-default-browser-in-visual.html" title="Changing the Default Browser in Visual Studio 2008 with ASP.NET MVC" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_3gdMjuMkpX4/SeaVY5fBmDI/AAAAAAAAAik/ihY5xT51jGU/s72-c/image_thumb%5B2%5D.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2009/04/changing-default-browser-in-visual.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYCQXczeyp7ImA9WxVVGEw.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-915021363145235661</id><published>2009-03-11T19:36:00.001-05:00</published><updated>2009-03-11T19:36:00.983-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-11T19:36:00.983-05:00</app:edited><title>Transparency is a Core Value in Work/Life</title><content type="html">&lt;p&gt;I am working on a current project where we are trying to create a site that gives visibility/transparency into our company and its performance whether good or bad.&amp;#160; This is being done in order to build relationship with those we do business with.&amp;#160; And it occurred to me how fundamental transparency really is in work and life.&amp;#160; &lt;/p&gt;  &lt;p&gt;Lately, I have noticed a lot of examples of people and processes that are geared to pursuing transparency.&amp;#160; Regardless of what I think of President Obama's policies, I have to say that he has been fairly transparent with his decisions and agenda.&amp;#160; And every time some corruption (financial industry, legislative pork) or misbehavior is mentioned, his solution tends to be creating some framework (site or process) for exposing those ills through transparency.&lt;/p&gt;  &lt;p&gt;It also occurred to me that a lot of project management processes aid us in exposing the truth about projects.&amp;#160; Risk management helps to expose potential issues that can ruin a project's timeline or budget.&amp;#160; Issues lists keep track of potential flaws in a given system.&amp;#160; And project post-mortems can help teams to learn from past mistakes and improve for future iterations.&amp;#160; &lt;/p&gt;  &lt;p&gt;Even rating systems within eBay and Amazon or content updates from Facebook can help to bring a level of transparency that build trust.&lt;/p&gt;  &lt;p&gt;So, why should transparency be so important?&amp;#160; &lt;/p&gt;  &lt;p&gt;For one, transparency &lt;em&gt;&lt;strong&gt;builds trust&lt;/strong&gt;.&amp;#160; &lt;/em&gt;If someone knows the truth about me, whether good or bad, they can begin to expect certain behaviors from me.&amp;#160; They can trust that I am who I say I am, and there is no fear that I will change or that there is something they do not know about me.&lt;/p&gt;  &lt;p&gt;All relationships grow from a root of trust.&amp;#160; Without it, there is no basis for relationship.&amp;#160; So, if I want to grow quality relationships with my family, friends, and colleagues, I have to nurture trust, and therefore transparency.&lt;/p&gt;  &lt;p&gt;It also creates a level of &lt;strong&gt;&lt;em&gt;accountability&lt;/em&gt;&lt;/strong&gt;.&amp;#160; If I am transparent about my life and work to myself and others, I am forced to face reality.&amp;#160; And even though reality is not always pretty, it can allow me to choose to pursue change.&amp;#160; Without it, I can safely live in denial and be complacent with the way things are.&amp;#160; And worse, if I keep things a secret, those failures may grow worse.&amp;#160; It was once said, &amp;quot;You are only as sick as your secrets.&amp;quot; &lt;/p&gt;  &lt;p&gt;The Bible concurs with these benefits saying that, &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;quot;If we say we have fellowship with him while we walk in darkness, we lie and do not practice the truth. 7 But if we walk in the light, as he is in the light, we have fellowship with one another, and the blood of Jesus his Son cleanses us from all sin.&amp;quot;&lt;/em&gt;&amp;#160; (1 John 1:6-7)&lt;/p&gt;  &lt;p&gt;You cannot have fellowship (relationship) with others and grow in your life without a level of transparency.&lt;/p&gt;  &lt;p&gt;So, I have decided that &lt;strong&gt;transparency&lt;/strong&gt; or &lt;strong&gt;being transparent&lt;/strong&gt; needs to be a core value for me.&amp;#160; And this blog post is my first attempt at admitting that I need to work on it.&amp;#160; I need to be willing to be honest to others about my life and work regardless of the consequences and be humble enough to apologize when I have failed or hurt someone.&amp;#160; It's the only way to have the quality relationships and integrity I desire.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-915021363145235661?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jdbifoDnFWhCjAKoscNZjsJgnec/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jdbifoDnFWhCjAKoscNZjsJgnec/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jdbifoDnFWhCjAKoscNZjsJgnec/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jdbifoDnFWhCjAKoscNZjsJgnec/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/XEMGiFeOO6c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/915021363145235661/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=915021363145235661" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/915021363145235661?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/915021363145235661?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/XEMGiFeOO6c/transparency-is-core-value-in-worklife.html" title="Transparency is a Core Value in Work/Life" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2009/03/transparency-is-core-value-in-worklife.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUAQXw4eCp7ImA9WxVVEEQ.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-208776789005623976</id><published>2009-03-03T10:04:00.001-06:00</published><updated>2009-03-03T10:04:00.230-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-03T10:04:00.230-06:00</app:edited><title>Web Service Naming Conventions</title><content type="html">&lt;p&gt;I was reviewing an interface for a WCF web service today, and I began wondering about web service naming conventions.&lt;/p&gt;  &lt;p&gt;It is understood that a service should be a logical grouping of a set of functionality.&amp;#160; Therefore, if you have several pieces of functionality that center around a Project concept, then you should group them together under the name ProjectService.&amp;#160; &lt;/p&gt;  &lt;p&gt;So, the convention for service names is:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Casing:&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Pascal case&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Format:&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [concept noun] + 'Service' to construct the name.) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&amp;#160; ProjectService, TaskService, PersonService, etc.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;When creating methods for a data service, though, should you restate the concept in the title?&amp;#160; In this case, you would use the following methods:&amp;#160; CreateProject(), UpdateProject(), GetProjectByID().&amp;#160; Isn't this already understood by the title of the web service?&amp;#160; So that you could say Create(), Update(), and GetByID() instead.&amp;#160; &lt;/p&gt;  &lt;p&gt;I propose no.&lt;/p&gt;  &lt;p&gt;The latter might make more sense in an object-oriented world where you are operating on the object itself.&amp;#160; However, a service is more like a manager class that operates on Project objects.&amp;#160; Also, theoretically speaking, each one of these functions can live on their own apart from any other functionality.&amp;#160; So, specifying the concept in the title of each method would make sense.&amp;#160; And finally, there might be functionality in this service for sub-objects such as Task that would not be substantial/independent enough to live on its own in a TaskService. &lt;/p&gt;  &lt;p&gt;In that case, it would be important to understand which type of object your Create(), Update(), and GetByID() are operating on.&lt;/p&gt;  &lt;p&gt;So, my recommendation for a data web service methods is:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Casing:&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Pascal case&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Format:&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [operation] + [concept noun] + [optional extensions]&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Examples: &lt;/strong&gt; CreateProject(), UpdateProject(), GetProjectByID()&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;What are your thoughts?&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-208776789005623976?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/V4dpkiHTaxueWVAB9F2tS2mkRMk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V4dpkiHTaxueWVAB9F2tS2mkRMk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/V4dpkiHTaxueWVAB9F2tS2mkRMk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V4dpkiHTaxueWVAB9F2tS2mkRMk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/nwf4WuGqqOI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/208776789005623976/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=208776789005623976" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/208776789005623976?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/208776789005623976?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/nwf4WuGqqOI/web-service-naming-conventions.html" title="Web Service Naming Conventions" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2009/03/web-service-naming-conventions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEGQ3w5eSp7ImA9WxVQEEo.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-3218187146748444359</id><published>2009-01-27T11:49:00.001-06:00</published><updated>2009-01-27T11:50:22.221-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-27T11:50:22.221-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><title>Team Foundation Server - Identifying All File Changes</title><content type="html">&lt;p&gt;Within &lt;strong&gt;Visual Studio 2008&lt;/strong&gt;, it is very easy to view the Team Foundation Server history of either a given file, project, or solution.&amp;#160; All you have to do is right-click on the particular item, select &lt;strong&gt;View History&lt;/strong&gt; from the context menu, and you are presented with a list of changesets as shown below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_3gdMjuMkpX4/SX9JLExJHsI/AAAAAAAAAb4/lO7vkmDyKJU/image%5B9%5D.png"&gt;&lt;a href="http://lh6.ggpht.com/_3gdMjuMkpX4/SX9JLZLtTFI/AAAAAAAAAb8/hlEfczH5j68/image%5B11%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="273" alt="image" src="http://lh5.ggpht.com/_3gdMjuMkpX4/SX9JLwl2y4I/AAAAAAAAAcA/RacnuPvfgb8/image_thumb%5B7%5D.png" width="164" align="left" border="0" /&gt;&lt;/a&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="207" alt="image" src="http://lh6.ggpht.com/_3gdMjuMkpX4/SX9JMDxu6SI/AAAAAAAAAcE/PFPqwjqT6K4/image_thumb%5B5%5D.png" width="285" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;From there you can double-click on a given changeset and see the files that were a part of that atomic check-in.&lt;/p&gt;  &lt;p&gt;But how do you see a consolidated list of all files that have been modified since a particular date, label, or changeset?&amp;#160; That is a little less intuitive.&lt;/p&gt;  &lt;p&gt;The first step is to open the &lt;strong&gt;Source Control Explorer&lt;/strong&gt; from the &lt;strong&gt;Team Explorer&lt;/strong&gt; client window of &lt;strong&gt;Visual Studio&lt;/strong&gt; by double-clicking on the &lt;strong&gt;Source Control Explorer&lt;/strong&gt; node in the tree as shown below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_3gdMjuMkpX4/SX9JMEFiQlI/AAAAAAAAAcI/tndXVUV6jYo/image%5B17%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="180" alt="image" src="http://lh4.ggpht.com/_3gdMjuMkpX4/SX9JM_olLcI/AAAAAAAAAcM/HPGH6JEa_Po/image_thumb%5B11%5D.png" width="155" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;From the &lt;strong&gt;Source Control Explorer&lt;/strong&gt; window, select the node within the project (either Team Project, Solution, Project, or file) and right-click to select &lt;strong&gt;Compare&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_3gdMjuMkpX4/SX9JNF-RPaI/AAAAAAAAAcQ/nabUXTIjlYs/image%5B21%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="229" alt="image" src="http://lh4.ggpht.com/_3gdMjuMkpX4/SX9JNVEfkhI/AAAAAAAAAcU/of_cENfAco0/image_thumb%5B13%5D.png" width="205" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;From there you will be presented with the &lt;strong&gt;Compare&lt;/strong&gt; dialog shown below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_3gdMjuMkpX4/SX9JNsUH9lI/AAAAAAAAAcY/COTZw_oRcEE/image%5B24%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="217" alt="image" src="http://lh6.ggpht.com/_3gdMjuMkpX4/SX9JNwfLfRI/AAAAAAAAAcc/rgraRW92z9g/image_thumb%5B14%5D.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You can select to compare to a &lt;strong&gt;Changeset, Date, Label&lt;/strong&gt;, etc. from the list.&amp;#160; For purposes of this article, we have selected the compare by &lt;strong&gt;Date&lt;/strong&gt;.&amp;#160; Make sure that the only &lt;strong&gt;View Option&lt;/strong&gt; selected in the checkboxes at the end of the dialog is &amp;quot;Show files that are different.&amp;quot;&amp;#160; Once you click the &lt;strong&gt;OK&lt;/strong&gt; button, you will be presented with the following window displaying all of the files that have changed, grouped by solution and project.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_3gdMjuMkpX4/SX9JOM_LfmI/AAAAAAAAAcg/KjCLXqIdYkE/image%5B30%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="155" alt="image" src="http://lh6.ggpht.com/_3gdMjuMkpX4/SX9JOd75j-I/AAAAAAAAAck/4XBIcV142Ww/image_thumb%5B18%5D.png" width="466" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Hope this helps.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-3218187146748444359?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yOBl6xLfQRFu2HNM63QpRq7nIp4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yOBl6xLfQRFu2HNM63QpRq7nIp4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yOBl6xLfQRFu2HNM63QpRq7nIp4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yOBl6xLfQRFu2HNM63QpRq7nIp4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/jvq2mCpEerc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/3218187146748444359/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=3218187146748444359" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/3218187146748444359?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/3218187146748444359?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/jvq2mCpEerc/team-foundation-server-identifying-all.html" title="Team Foundation Server - Identifying All File Changes" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_3gdMjuMkpX4/SX9JLwl2y4I/AAAAAAAAAcA/RacnuPvfgb8/s72-c/image_thumb%5B7%5D.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2009/01/team-foundation-server-identifying-all.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEARHg-eyp7ImA9WxVSF0w.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-8734853643059560585</id><published>2009-01-11T17:45:00.001-06:00</published><updated>2009-01-11T17:47:25.653-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-11T17:47:25.653-06:00</app:edited><title>The Effective Executive - Part 1</title><content type="html">&lt;p align="left"&gt;&lt;a href="http://www.amazon.com/Effective-Executive-Definitive-Harperbusiness-Essentials/dp/0060833459/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231717386&amp;amp;sr=8-1" target="_blank"&gt;&lt;img height="188" src="http://ecx.images-amazon.com/images/I/51B7G1SKB0L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg" width="188" align="right" /&gt;&lt;/a&gt; So, I picked up a copy (used, by the way, from Amazon Marketplace for only $0.56 + shipping/handling) of &lt;a href="http://www.amazon.com/Effective-Executive-Definitive-Harperbusiness-Essentials/dp/0060833459/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1231717386&amp;amp;sr=8-1" target="_blank"&gt;The Effective Executive&lt;/a&gt; by Peter Drucker.&amp;#160; It is by no means a new book, being released in 1966, but it has some very valuable wisdom on how to effectively execute as a knowledge worker that is as relevant today as it was then.&lt;/p&gt;  &lt;p&gt;I am going to write several posts on the book, because I want to remember the important points from the book, and I would also like to share the most interesting portions with you.&amp;#160; This first post will be a quick intro to the book.&lt;/p&gt;  &lt;p&gt;The book is a mere 174 pages, but it takes time to read and digest the content.&amp;#160; The first chapter discusses the need for effectiveness and idea that effectiveness can be learned by anyone.&amp;#160; &lt;/p&gt;  &lt;p&gt;What is effectiveness you say?&amp;#160; Well, Drucker makes the distinction of doing the right things rather than do things the right way.&amp;#160; Too many are busy doing work with no clue as to what contribution that work is really making to the organization.&lt;/p&gt;  &lt;p&gt;After establishing the fact that effectiveness is important to knowledge workers and that effectiveness can be learned, the author then launches into 6 chapters explaining the most important aspects of practicing the habit of being effective.&lt;/p&gt;  &lt;p&gt;1.&amp;#160; Know where the time goes.&lt;/p&gt;  &lt;p&gt;2.&amp;#160; Focus on outward contribution.&lt;/p&gt;  &lt;p&gt;3.&amp;#160; Build on strengths - individual, peer, superior and subordinate.&lt;/p&gt;  &lt;p&gt;4.&amp;#160; Concentrate on a few major areas to achieve results.&lt;/p&gt;  &lt;p&gt;5.&amp;#160; Make effective decisions. &lt;/p&gt;  &lt;p&gt;I have not read all of the chapters, but just skimming the book has provided invaluable insights into becoming effective.&amp;#160; I will try to discuss each of the aspects above in future posts. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-8734853643059560585?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/A9yMXRC7SIMdjRWqLlWU5hu52xo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A9yMXRC7SIMdjRWqLlWU5hu52xo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/A9yMXRC7SIMdjRWqLlWU5hu52xo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A9yMXRC7SIMdjRWqLlWU5hu52xo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/jhq_dU6jA-0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/8734853643059560585/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=8734853643059560585" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/8734853643059560585?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/8734853643059560585?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/jhq_dU6jA-0/effective-executive-part-1.html" title="The Effective Executive - Part 1" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2009/01/effective-executive-part-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4FRnw-fCp7ImA9WxVSFEg.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-6125584710539662321</id><published>2009-01-08T16:48:00.001-06:00</published><updated>2009-01-08T16:48:37.254-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-08T16:48:37.254-06:00</app:edited><title>Random Resolution for the New Year 2009</title><content type="html">&lt;p&gt;Well, it's that time of year again when we make New Year's resolutions.&amp;#160; I am not a big fan of doing this once a year, because I believe that we should be daily looking for ways to grow and help others.&lt;/p&gt;  &lt;p&gt;However, I found out about a site that randomly chooses a resolution for you from Caleb Jenkin's &lt;a href="http://calebjenkins.com/"&gt;blog&lt;/a&gt; post &lt;a href="http://developingux.com/2009/01/07/resolution-randomizer/"&gt;today&lt;/a&gt;.&amp;#160; It sounded simple enough.&amp;#160; So, here's what it came up with for me.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://resolutionrandomizer.pop.us/ecard.aspx"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="382" alt="resolution_randomizer_2009_toddmeinershagen" src="http://lh6.ggpht.com/_3gdMjuMkpX4/SWaCw5_c-EI/AAAAAAAAAZ0/78KT-qL3bKI/resolution_randomizer_2009_toddmeinershagen%5B6%5D.jpg" width="455" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pretty appropriate, no?&amp;#160; Try it out by clicking &lt;a href="http://resolutionrandomizer.pop.us/ecard.aspx"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-6125584710539662321?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/q0StmGb3fWH9HteLdGYTp4n24jw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/q0StmGb3fWH9HteLdGYTp4n24jw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/q0StmGb3fWH9HteLdGYTp4n24jw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/q0StmGb3fWH9HteLdGYTp4n24jw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/NcEDoyePLsA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/6125584710539662321/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=6125584710539662321" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/6125584710539662321?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/6125584710539662321?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/NcEDoyePLsA/random-resolution-for-new-year-2009.html" title="Random Resolution for the New Year 2009" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_3gdMjuMkpX4/SWaCw5_c-EI/AAAAAAAAAZ0/78KT-qL3bKI/s72-c/resolution_randomizer_2009_toddmeinershagen%5B6%5D.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2009/01/random-resolution-for-new-year-2009.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YMRHwzfip7ImA9WxdaEU8.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-4144938836747160630</id><published>2008-08-18T23:44:00.002-05:00</published><updated>2008-08-18T23:46:25.286-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-18T23:46:25.286-05:00</app:edited><title>Type-Safe Enum Strings in .NET</title><content type="html">&lt;p&gt;One thing that has always bothered me in .NET is the inability to create a type-safe set of string constants like an enum.  I would like to create a type such as the following: &lt;/p&gt;  &lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;enum&lt;/span&gt; StoredProcedure : &lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;   DeleteConsumer = "&lt;span style="color: rgb(139, 0, 0);"&gt;DeleteConsumer&lt;/span&gt;",&lt;br /&gt;   EditConsumer = "&lt;span style="color: rgb(139, 0, 0);"&gt;EditConsumer&lt;/span&gt;",&lt;br /&gt;   GetConsumer = "&lt;span style="color: rgb(139, 0, 0);"&gt;GetConsumer&lt;/span&gt;"&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;This would be incredibly useful for those situations where you are passing constant strings to a given method and you would like to limit the options that are passed to a finite set of options that can be detected through a type-safe check during compile time. &lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; ExecuteDataSet(StoredProcedures storedProcedure)&lt;br /&gt;{&lt;br /&gt;   SqlCommand command = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SqlCommand();&lt;br /&gt;   command.CommandType = CommandType.StoredProcedure;&lt;br /&gt;   command.CommandText = storedProcedure.ToString();&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;Unfortunately, a simple constant does not provide type-safe protection for the method call.  If a developer is not aware of the pattern, they may end up sending in a literal string of their choosing.  So, instead you end up with the following: &lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt; ExecuteDataSet(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; storedProcedure)&lt;br /&gt;{&lt;br /&gt;   SqlCommand command = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; SqlCommand();&lt;br /&gt;   command.CommandType = CommandType.StoredProcedure;&lt;br /&gt;   command.CommandText = storedProcedure.ToString();&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;After working at a heterogeneous shop, I learned that Java has been creating their own type-safe string enum classes for solving this situation for years before the formal enum type was added to the 1.5 release of the Java Runtime. &lt;/p&gt;&lt;p&gt;The example below shows how a typical Java developer would implement this concept in Java syntax. &lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;final&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; Color {&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; String name;&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; Color(String name) {&lt;br /&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.name = name;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; String toString() {&lt;br /&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.id;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;final&lt;/span&gt; Color RED = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Color("&lt;span style="color: rgb(139, 0, 0);"&gt;Red&lt;/span&gt;");&lt;br /&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;final&lt;/span&gt; Color GREEN = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Color("&lt;span style="color: rgb(139, 0, 0);"&gt;Green&lt;/span&gt;");&lt;br /&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;final&lt;/span&gt; Color BLUE = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; Color("&lt;span style="color: rgb(139, 0, 0);"&gt;Blue&lt;/span&gt;");&lt;br /&gt;} &lt;/pre&gt;&lt;p&gt;The basic idea is simple:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1.  Define a class representing a single element of the enumerated type &lt;/p&gt;&lt;p&gt;2.  Don't provide any public constructors for it. &lt;/p&gt;&lt;p&gt;3.  Provide public static final fields, one for each constant in the enumerated type. &lt;/p&gt;&lt;p&gt;Because there is no way for clients to create objects of the type, there will never be any objects of the type besides those exported via the public static final fields. &lt;/p&gt;&lt;p&gt;In order to make this easier to use within .NET, I create an abstract base type, StringConstantBase, that allows a developer to quickly create the functionality above plus some other goodies such as GetNames(), CompareTo(), Equals(), GetHashCode(), and the == and != operators for comparison to string literals. &lt;/p&gt;&lt;p&gt;In order to use the code, you merely define your class as follows:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt; StoredProcedures : StringConstantBase&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;readonly&lt;/span&gt; StoredProcedures GetConsumer = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; StoredProcedures("&lt;span style="color: rgb(139, 0, 0);"&gt;GetConsumer&lt;/span&gt;");&lt;br /&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;readonly&lt;/span&gt; StoredProcedures EditConsumer = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; StoredProcedures("&lt;span style="color: rgb(139, 0, 0);"&gt;EditConsumer&lt;/span&gt;");&lt;br /&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;readonly&lt;/span&gt; StoredProcedures DeleteConsumer = &lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt; StoredProcedures("&lt;span style="color: rgb(139, 0, 0);"&gt;DeleteConsumer&lt;/span&gt;");&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(0, 0, 255);"&gt;private&lt;/span&gt; StoredProcedures(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; name) : &lt;span style="color: rgb(0, 0, 255);"&gt;base&lt;/span&gt;(name){}&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;The only part that does not work (this is the same for the Java version) is that it cannot be used in switch...case statements.  Those require the use of an underlying integral type which is not present.  Instead, you should use the if...else if construct to perform the same logic. &lt;/p&gt;&lt;p&gt;If you are interested in using the StringConstantBase class for your own code, you can download my Visual Studio 2008 project from here.  In addition to the class, I have included a unit test project to include my assumptions on its use.  &lt;/p&gt;&lt;p&gt;I hope this helps someone out there...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-4144938836747160630?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SmSU0qHHR-tuoMMuXryJCsTjheE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SmSU0qHHR-tuoMMuXryJCsTjheE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SmSU0qHHR-tuoMMuXryJCsTjheE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SmSU0qHHR-tuoMMuXryJCsTjheE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/oIQJGlL9Bz4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/4144938836747160630/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=4144938836747160630" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/4144938836747160630?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/4144938836747160630?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/oIQJGlL9Bz4/type-safe-enum-strings-in-net.html" title="Type-Safe Enum Strings in .NET" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2008/08/type-safe-enum-strings-in-net.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMHR3c-fCp7ImA9WxdVEkQ.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-302725152693215697</id><published>2008-07-17T07:23:00.001-05:00</published><updated>2008-07-17T07:23:56.954-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-17T07:23:56.954-05:00</app:edited><title>Turning on Intellisense with Visual Studio 2008</title><content type="html">&lt;p&gt;For whatever reason, when I was using Visual Studio 2008 this morning, I noticed that intellisense was not working.&amp;#160; Whenever I typed the period at the end of an object reference, no list of available methods and their associated parameters was made visible as a drop-down.&amp;#160; &lt;/p&gt;  &lt;p&gt;I know that I am &amp;quot;man&amp;quot; enough to work without it, but I have come to really enjoy the productivity I get using intellisense - especially when learning a new API.&lt;/p&gt;  &lt;p&gt;So, after exploring a bit, I found the settings and am documenting it here, so I don't forget for future reference.&lt;/p&gt;  &lt;p&gt;1.&amp;#160; Click on Tools/Options in the upper-menu.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/todd.alan.meinershagen/SH850m-Y__I/AAAAAAAAAGs/HSCkCCsEpUc/image9.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="344" alt="image" src="http://lh3.ggpht.com/todd.alan.meinershagen/SH851Jmz9DI/AAAAAAAAAGw/AHdmmEV-X8c/image_thumb5.png" width="202" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;2.&amp;#160; Under Text Editor/All Languages navigate to the Statement Completion section at the top of the dialog and check the appropriate settings&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/todd.alan.meinershagen/SH852YCsGyI/AAAAAAAAAG0/-645WJqA-F4/image8.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="296" alt="image" src="http://lh3.ggpht.com/todd.alan.meinershagen/SH853Ja7JyI/AAAAAAAAAG4/E7t_n-TcXMc/image_thumb4.png" width="471" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There are 3 settings with the following explanation:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Auto list members - this is essential for intellisense to begin working. &lt;/li&gt;    &lt;li&gt;Hide Advanced members - this will allow you to hide those properties, methods, and events that are not often used. &lt;/li&gt;    &lt;li&gt;Parameter information - by default the auto list members only displays the name of the property, event, or method.&amp;#160; You must have this option checked in order to display the actual parameter information. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I hope this was helpful...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-302725152693215697?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1QG6RpDc-MFYKJUn5cGTfdiOPzk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1QG6RpDc-MFYKJUn5cGTfdiOPzk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1QG6RpDc-MFYKJUn5cGTfdiOPzk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1QG6RpDc-MFYKJUn5cGTfdiOPzk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/E-DI3j-W810" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/302725152693215697/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=302725152693215697" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/302725152693215697?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/302725152693215697?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/E-DI3j-W810/turning-on-intellisense-with-visual.html" title="Turning on Intellisense with Visual Studio 2008" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="29" src="http://4.bp.blogspot.com/_3gdMjuMkpX4/SWqLkb2GpXI/AAAAAAAAAbg/YT12PMBXqts/S220/n782352829_1099896_2153.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/todd.alan.meinershagen/SH851Jmz9DI/AAAAAAAAAGw/AHdmmEV-X8c/s72-c/image_thumb5.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2008/07/turning-on-intellisense-with-visual.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8BSHY4fip7ImA9WB9UGE8.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-6742129648970139149</id><published>2007-12-16T11:40:00.001-06:00</published><updated>2007-12-16T11:40:59.836-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-16T11:40:59.836-06:00</app:edited><title>Alessio's In Westlake Village, CA</title><content type="html">&lt;p&gt;Tonight my manager and I are going to eat at Alessio's in Westlake Village, CA with a representative from IBM.&amp;#160; I just wanted to add this post as a reminder of the restaurant location.&amp;#160; I'm sure it will be very nice!&lt;/p&gt;  &lt;p&gt;I have placed a map of the directions from the Simi Valley office of Countrywide (2900 Madera Road) to the restaurant below for future reference.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;iframe marginwidth="0" marginheight="0" src="http://maps.google.com/maps?f=d&amp;amp;hl=en&amp;amp;geocode=18039757214202201069,34.164031,-118.828507&amp;amp;time=&amp;amp;date=&amp;amp;ttype=&amp;amp;saddr=2900+Madera+Road,+Simi+Valley,+CA&amp;amp;daddr=3731+E+Thousand+Oaks+Blvd,+Westlake+Village,+CA+91362&amp;amp;mra=pi&amp;amp;mrcr=0&amp;amp;sll=34.164031,-118.828507&amp;amp;sspn=0.007493,0.016909&amp;amp;ie=UTF8&amp;amp;om=1&amp;amp;ll=34.225005,-118.82652&amp;amp;spn=0.13727,0.07712&amp;amp;output=embed&amp;amp;s=AARTsJpBm7yXVmLy4PduERGiFUhBuXKPuQ" frameborder="0" width="425" scrolling="no" height="350"&gt;&lt;/iframe&gt;    &lt;br /&gt;&lt;small&gt;&lt;a style="color: #0000ff; text-align: left" href="http://maps.google.com/maps?f=d&amp;amp;hl=en&amp;amp;geocode=18039757214202201069,34.164031,-118.828507&amp;amp;time=&amp;amp;date=&amp;amp;ttype=&amp;amp;saddr=2900+Madera+Road,+Simi+Valley,+CA&amp;amp;daddr=3731+E+Thousand+Oaks+Blvd,+Westlake+Village,+CA+91362&amp;amp;mra=pi&amp;amp;mrcr=0&amp;amp;sll=34.164031,-118.828507&amp;amp;sspn=0.007493,0.016909&amp;amp;ie=UTF8&amp;amp;om=1&amp;amp;ll=34.225005,-118.82652&amp;amp;spn=0.13727,0.07712&amp;amp;source=embed"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt; &lt;/p&gt;  &lt;p&gt;Below is the actual location for the restaurant close up. &lt;/p&gt;  &lt;p&gt;&lt;iframe marginwidth="0" marginheight="0" src="http://maps.google.com/maps/ms?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;time=&amp;amp;date=&amp;amp;ttype=&amp;amp;ie=UTF8&amp;amp;cd=1&amp;amp;msa=0&amp;amp;msid=115608977194402490467.000440946915394130e38&amp;amp;ll=34.219751,-118.819199&amp;amp;spn=0.479604,1.082153&amp;amp;om=1&amp;amp;output=embed&amp;amp;s=AARTsJoCuusmbNtMPdSvaQqXi7RaaIEScw" frameborder="0" width="425" scrolling="no" height="350"&gt;&lt;/iframe&gt;    &lt;br /&gt;&lt;small&gt;&lt;a style="color: #0000ff; text-align: left" href="http://maps.google.com/maps/ms?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;time=&amp;amp;date=&amp;amp;ttype=&amp;amp;ie=UTF8&amp;amp;cd=1&amp;amp;msa=0&amp;amp;msid=115608977194402490467.000440946915394130e38&amp;amp;ll=34.219751,-118.819199&amp;amp;spn=0.479604,1.082153&amp;amp;om=1&amp;amp;source=embed"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-6742129648970139149?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qcG_qnny7ByANpKOYCEwhu5FTDg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qcG_qnny7ByANpKOYCEwhu5FTDg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qcG_qnny7ByANpKOYCEwhu5FTDg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qcG_qnny7ByANpKOYCEwhu5FTDg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/UuTTAphv1dI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/6742129648970139149/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=6742129648970139149" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/6742129648970139149?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/6742129648970139149?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/UuTTAphv1dI/alessio-in-westlake-village-ca.html" title="Alessio&amp;#39;s In Westlake Village, CA" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2007/12/alessio-in-westlake-village-ca.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AEQHw6cSp7ImA9WB5XFUg.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-1251813982810771196</id><published>2007-07-15T22:14:00.000-05:00</published><updated>2007-07-15T22:15:01.219-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-15T22:15:01.219-05:00</app:edited><title>Google for App Domains - Family Site</title><content type="html">&lt;span class="gmail_quote"&gt;&lt;/span&gt;My family and I are contemplating shutting down our existing family site at &lt;a href="http://www.meinershagen.net/community" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt; http://www.&lt;span id="st" name="st" class="st"&gt;meinershagen&lt;/span&gt;.net/community&lt;/a&gt; and actually setting up shop with Google for App Domains.&amp;nbsp; I am so blown away with the services that Google is offering for free (email, calendar, photos, pages, groups, blogs, docs, etc.) that I can&amp;#39;t justify paying to host my own site anymore. &lt;br&gt;&lt;br&gt;Have any of you had experience yet using the Google for App Domains?&amp;nbsp; If so, what are some of the gotchas that you ran into when starting to use the service?&amp;nbsp; Thanks in advance for any tips you have...&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-1251813982810771196?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KS5EDz0be0wo2Wp3lF-TLFF28_8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KS5EDz0be0wo2Wp3lF-TLFF28_8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KS5EDz0be0wo2Wp3lF-TLFF28_8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KS5EDz0be0wo2Wp3lF-TLFF28_8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/06bS-_HrO3s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/1251813982810771196/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=1251813982810771196" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/1251813982810771196?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/1251813982810771196?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/06bS-_HrO3s/google-for-app-domains-family-site.html" title="Google for App Domains - Family Site" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2007/07/google-for-app-domains-family-site.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08CSHgzcSp7ImA9WxdUEkg.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-3943235495353658183</id><published>2007-05-30T23:30:00.001-05:00</published><updated>2008-07-28T08:31:09.689-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-28T08:31:09.689-05:00</app:edited><title>New SiteAvailabilityHttpModule - Based on Client IP Address</title><content type="html">&lt;div class="Section1"&gt;   &lt;p class="MsoNormal"&gt;As part of my company&amp;#8217;s Technical Council, we are working on defining our process for promoting code from one environment to the next.&amp;#160; One of the items we wanted to standardize across our enterprise was how we stop a site during a promotion.&amp;#160; &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;ASP.NET 2.0 has a nice feature for shutting down a site called App Offline.&amp;#160; As Scott Guthrie from Microsoft puts it, &amp;#8220;the way [App Offline] works is that you place this file in the root of the application.&amp;#160; When ASP.NET sees it, it will shut-down the app-domain for the application (and not restart it for requests) and instead send back the contents of the app_offline.htm file in response to all new dynamic requests for the application.&amp;#160; When you are done updating the site, just delete the file and it will come back online.&amp;#8221;&amp;#160; You can find more out about this technique from the original blog entry &lt;a href="http://weblogs.asp.net/scottgu/archive/2006/04/09/442332.aspx"&gt;here&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Unfortunately, our requirements were a bit more complicated than was intended with the app_offline.htm.&amp;#160; First, most of our applications were written with the 1.1 framework, so this built-in functionality was not available for our use.&amp;#160; In addition, we wanted the ability for testers to be able to validate the site once the changes had been made.&amp;#160; However, we didn&amp;#8217;t want to have to bring the site back up in order to do that.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;As I was looking on line, I found another option called the &lt;a href="http://www.jameskovacs.com/blog/InDepthLookAtTheSiteAvailabilityModule.aspx"&gt;SiteAvailabilityHttpModule&lt;/a&gt;.&amp;#160; This module allowed for the site to be shut down by merely configuring an HttpModule within the web.config.&amp;#160; In the Init() event, the module subscribes to the PostAuthorizeRequest event.&amp;#160; Within the event handler, the system determines whether or not the request occurred during an accepted time frame and whether or not the requesting user belonged to the administrator role.&amp;#160; &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;We didn&amp;#8217;t need either of those features for our deployment.&amp;#160; Instead of using a role-based mechanism for determining a user&amp;#8217;s access, we wanted to base access on a configured list of client IP addresses.&amp;#160; As a result, we didn&amp;#8217;t need to wait until the PostAuthorizeRequest event &amp;#8211; we could check these aspects within the first event &amp;#8211; BeginRequest instead.&amp;#160; The code is listed below. &lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: blue; font-family: consolas"&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; color: blue; font-family: consolas"&gt;void&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt; context_BeginRequest(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;{&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&lt;span style="color: blue"&gt;&lt;font color="#000000"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;string&lt;/span&gt; ext = Path.GetExtension(HttpContext.Current.Request.Path).ToLower();&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt;(ext == &amp;quot;.aspx&amp;quot;) &lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;.IsEnabled)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!IsClientIPValid())&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; HttpContext.Current.RewritePath(&amp;quot;~/SiteUnavailable.htm&amp;quot;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;}&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: consolas"&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Notice that you must place a SiteUnavailable.htm file at the root of the site in order to display content if the user&amp;#8217;s client IP address does not match one that is configured in the web.config.&amp;#160; You can find the current release for this component &lt;a href="http://meinershagen.net/community/files/folders/files_ewh_releases/entry155.aspx"&gt;here&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-3943235495353658183?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XG26kdIsGSsy8pf1vLnq6-OjxRI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XG26kdIsGSsy8pf1vLnq6-OjxRI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XG26kdIsGSsy8pf1vLnq6-OjxRI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XG26kdIsGSsy8pf1vLnq6-OjxRI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/C9VJwNGUcw4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/3943235495353658183/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=3943235495353658183" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/3943235495353658183?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/3943235495353658183?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/C9VJwNGUcw4/new-siteavailabilityhttpmodule-based-on.html" title="New SiteAvailabilityHttpModule - Based on Client IP Address" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2007/05/new-siteavailabilityhttpmodule-based-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MDRn08eip7ImA9WxdUEkg.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-2905361155465381336</id><published>2007-05-30T22:36:00.001-05:00</published><updated>2008-07-28T08:24:37.372-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-28T08:24:37.372-05:00</app:edited><title>Decision to Reject a Counter Offer</title><content type="html">&lt;div class="Section1"&gt;   &lt;p class="MsoNormal"&gt;So &amp;#8211; I have decided to leave my company of 4 &amp;#189; years.&amp;#160; It was a difficult decision, as any decision is to leave your company is.&amp;#160; I really have enjoyed working with the various teams that I have been involved with.&amp;#160; The main driving force was a greater need to connect with people locally.&amp;#160; I currently work out of a remote office in Dallas, with the rest of my team being in Chicago, but I enjoy the atmosphere of working with a local team and being able to informally discuss issues and connect at a more personal level.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;The problem &amp;#8211; I submit my resignation, and &lt;span style="color: #1f497d"&gt;within a day&lt;/span&gt;, I receive a counter offer.&amp;#160; I won&amp;#8217;t go into the specifics of what they offered me, but suffice it to say that I began to wonder if it wouldn&amp;#8217;t be worth my while to stay for another year or two.&amp;#160; &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;I write this post to explain to others and remind myself of why I decided to stick with my decision to leave my current employer.&lt;o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;1.&amp;#160; It&amp;#8217;s all a mirage.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoListParagraph"&gt;The offer from my current employer only really existed the moment that I put my resignation in.&amp;#160; Therefore, it&amp;#8217;s really just an illusion.&amp;#160; I can&amp;#8217;t rationalize or try to get myself to believe that these two options were going to exist at the time of my initial decision.&amp;#160; It was flattering, though. &lt;/p&gt;    &lt;p class="MsoListParagraph"&gt;2.&amp;#160; Potential Problems&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoListParagraph"&gt;I did all of the online research I could to see if accepting a counter offer was legitimate.&amp;#160; Most information that I gathered suggested that it would not be a good idea, because 99% of the time the employee is gone within 6-12 months either because the original issue was not addressed by the counter offer or the employer replaced the person since they were disloyal.&amp;#160; And most posts mentioned that it was an unethical move.&lt;o:p&gt;&lt;/p&gt;    &lt;p class="MsoListParagraph"&gt;3.&amp;#160; &lt;span style="mso-list: ignore"&gt;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160;&lt;/span&gt;&lt;/span&gt;Integrity is at issue.&lt;/p&gt;    &lt;p class="MsoListParagraph"&gt;The moment that I began to entertain accepting the counter offer, I began to feel wrong inside.&amp;#160; Although I agreed with all of the information I found online, that wasn&amp;#8217;t what was really eating at me.&amp;#160; I felt that I was wronging the company that I had said, &amp;#8220;yes,&amp;#8221; to.&amp;#160; They would have to start their search all over again.&amp;#160; That didn&amp;#8217;t feel right.&amp;#160; I couldn&amp;#8217;t face myself in the mirror if I felt that I had done something to hurt someone.&lt;/p&gt;    &lt;p class="MsoListParagraph"&gt;4.&amp;#160; &lt;span style="mso-list: ignore"&gt;&lt;span style="font: 7pt " times new roman""&gt;&amp;#160;&lt;/span&gt;&lt;/span&gt;Spiritual&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt;And finally, as I lay in bed at night, I found myself crying out to God to give me wisdom.&amp;#160; I wanted to make sure that whatever I chose to do, it was what the Lord thought was right.&amp;#160; And at 2:00 am in the morning, the day before I rejected the counter offer, a verse came to my mind that I had not read for over 6 months:&amp;#160; &amp;#8220;Who swears to his own hurt, and does not change&amp;#8230;&amp;#8221;&amp;#160; This is part of a larger passage of scripture in Psalms chapter 15, where King David asks &amp;#8220;O &lt;span class="small-caps"&gt;Lord&lt;/span&gt;, who shall sojourn in your tent?&amp;#160; Who shall dwell on your holy hill?&amp;#8221;&amp;#160; And the list that follows explains the qualities of one who can fellowship with the Lord.&amp;#160; And keeping promises must be high on His list.&amp;#160; &lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;I couldn&amp;#8217;t deny the voice of God.&amp;#160; Accepting a counter offer was wrong not only because it isn&amp;#8217;t real, it might potentially cause me harm, and it might damage my reputation with others.&amp;#160; It might also cause harm to my neighbor &amp;#8211; or in this case, my future employer.&amp;#160; I couldn&amp;#8217;t do that with a good conscience.&amp;#160; It would keep me from fellowshipping with the One whom I don&amp;#8217;t want to miss out on.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-2905361155465381336?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/i7Yv_wfGB1woiczSvh6ci9Sdhp0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i7Yv_wfGB1woiczSvh6ci9Sdhp0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/i7Yv_wfGB1woiczSvh6ci9Sdhp0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i7Yv_wfGB1woiczSvh6ci9Sdhp0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/aNuo1QpCu-4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/2905361155465381336/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=2905361155465381336" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/2905361155465381336?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/2905361155465381336?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/aNuo1QpCu-4/decision-to-reject-counter-offer.html" title="Decision to Reject a Counter Offer" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2007/05/decision-to-reject-counter-offer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QNR3o4eCp7ImA9WBNUGU0.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-2274665112165570524</id><published>2006-09-10T11:19:00.000-05:00</published><updated>2006-09-10T11:23:16.430-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2006-09-10T11:23:16.430-05:00</app:edited><title>New Photo Albums</title><content type="html">I just began using Google's new beta Picasa Web Photo albums.  It is so easy to upload photos from my existing Picasa photo organizer system.  You can download the application &lt;a href="http://picasa.google.com/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here are a few new photo albums that I have posted from the month of June and July of '06.  Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; width: 194px; font-family: arial,sans-serif; font-size: 83%;"&gt;&lt;div style="background: transparent url(http://picasaweb.google.com/f/img/transparent_album_background.gif) no-repeat scroll left center; height: 194px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;a href="http://picasaweb.google.com/todd.meinershagen/2006EndOfSummer"&gt;&lt;img src="http://lh3.google.com/todd.meinershagen/RQGjHpo4ABE/AAAAAAAAAFs/b-XQN4-rxi4/2006EndOfSummer.jpg?imgmax=160&amp;crop=1" style="border: medium none ; padding: 0px; margin-top: 16px;" height="160" width="160" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://picasaweb.google.com/todd.meinershagen/2006EndOfSummer"&gt;&lt;div style="color: rgb(77, 77, 77); font-weight: bold; text-decoration: none;"&gt;2006 - End of Summer&lt;/div&gt;&lt;/a&gt;&lt;div style="color: rgb(128, 128, 128);"&gt;Jul 5, 2006 - 42 Photos&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center; width: 194px; font-family: arial,sans-serif; font-size: 83%;"&gt;&lt;div style="background: transparent url(http://picasaweb.google.com/f/img/transparent_album_background.gif) no-repeat scroll left center; height: 194px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;a href="http://picasaweb.google.com/todd.meinershagen/2006BirthOfSophiaGrace"&gt;&lt;img src="http://lh5.google.com/todd.meinershagen/RQIBeLjDABE/AAAAAAAAAHY/7UznbWMRLA8/2006BirthOfSophiaGrace.jpg?imgmax=160&amp;crop=1" style="border: medium none ; padding: 0px; margin-top: 16px;" height="160" width="160" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://picasaweb.google.com/todd.meinershagen/2006BirthOfSophiaGrace"&gt;&lt;div style="color: rgb(77, 77, 77); font-weight: bold; text-decoration: none;"&gt;2006 - Birth of Sophia Grace&lt;/div&gt;&lt;/a&gt;&lt;div style="color: rgb(128, 128, 128);"&gt;Jun 22, 2006 - 10 Photos&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center; width: 194px; font-family: arial,sans-serif; font-size: 83%;"&gt;&lt;div style="background: transparent url(http://picasaweb.google.com/f/img/transparent_album_background.gif) no-repeat scroll left center; height: 194px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;a href="http://picasaweb.google.com/todd.meinershagen/2006SummerFun"&gt;&lt;img src="http://lh5.google.com/todd.meinershagen/RQIjIXb2ABE/AAAAAAAAAKY/9EkfwfQLuZo/2006SummerFun.jpg?imgmax=160&amp;crop=1" style="border: medium none ; padding: 0px; margin-top: 16px;" height="160" width="160" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://picasaweb.google.com/todd.meinershagen/2006SummerFun"&gt;&lt;div style="color: rgb(77, 77, 77); font-weight: bold; text-decoration: none;"&gt;2006 - Summer Fun&lt;/div&gt;&lt;/a&gt;&lt;div style="color: rgb(128, 128, 128);"&gt;Jun 2, 2006 - 23 Photos&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-2274665112165570524?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xZ8BSmwJD6wgfwIPTHtO_yzsAEU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xZ8BSmwJD6wgfwIPTHtO_yzsAEU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xZ8BSmwJD6wgfwIPTHtO_yzsAEU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xZ8BSmwJD6wgfwIPTHtO_yzsAEU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/hR7faoBscxU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/2274665112165570524/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=2274665112165570524" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/2274665112165570524?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/2274665112165570524?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/hR7faoBscxU/new-photo-albums.html" title="New Photo Albums" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2006/09/new-photo-albums.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEFQn8zfSp7ImA9WBNUF04.&quot;"><id>tag:blogger.com,1999:blog-2681574040796476559.post-6679807752631721029</id><published>2006-09-08T12:38:00.001-05:00</published><updated>2006-09-08T12:46:53.185-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2006-09-08T12:46:53.185-05:00</app:edited><title>Free Services Online</title><content type="html">I am amazed at the amount of free services being provided on the internet!  Will there be a day when I no longer have to maintain my own file share on a local hard drive?  Will I be able to store everything out in the "cloud"?&lt;br /&gt;&lt;br /&gt;Google has capitalized the market with free services like email, chat, calendaring, and photo albums.  They are even offering to let you use their services as a suite for free within your small organization under your own domain.  (&lt;a href="http://www.google.com/a"&gt;http://www.google.com/a)&lt;/a&gt;  Microsoft and others are trying to catch up with the services bandwagon, but clearly Google is in the lead.&lt;div class="blogger-post-footer"&gt;&lt;div&gt;
&lt;br/&gt;
&lt;span style="border-top: solid 1px #000000;"&gt;
&lt;span style="text-align: left;"&gt;
Todd Meinershagen is a Principal Consultant with &lt;/span&gt;&lt;a href="http://www.improvingenterprises.com/" style="text-align: left;"&gt;Improving Enterprises&lt;/a&gt;&lt;span style="text-align: left;"&gt; in Dallas, Texas.&lt;/span&gt;
&lt;/span&gt;
&lt;br/&gt;
&lt;/div&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2681574040796476559-6679807752631721029?l=toddmeinershagen.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/L4iFtsaH9EqPjUNO1yFpIxKJ_oY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/L4iFtsaH9EqPjUNO1yFpIxKJ_oY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/L4iFtsaH9EqPjUNO1yFpIxKJ_oY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/L4iFtsaH9EqPjUNO1yFpIxKJ_oY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/toddmeinershagen/~4/AJB7U8-5eBE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://toddmeinershagen.blogspot.com/feeds/6679807752631721029/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2681574040796476559&amp;postID=6679807752631721029" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/6679807752631721029?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2681574040796476559/posts/default/6679807752631721029?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/toddmeinershagen/~3/AJB7U8-5eBE/free-services-online.html" title="Free Services Online" /><author><name>Todd Meinershagen</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://toddmeinershagen.blogspot.com/2006/09/free-services-online.html</feedburner:origLink></entry></feed>

