<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://danhounshell.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>The Hounshells' Website</title><link>http://danhounshell.com/blogs/</link><description>This is the website for the Hounshell family (Dan, Dawn, Jared, and Regan) of Monroe, OH.</description><dc:language>en-US</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Community Server does "Am I ___ or Not?"</title><link>http://danhounshell.com/blogs/dan/archive/2008/07/29/community-server-does-quot-am-i-or-not-quot.aspx</link><pubDate>Tue, 29 Jul 2008 04:05:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9709</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>5</slash:comments><description>&lt;A href="http://danhounshell.com/blogs/dan/WindowsLiveWriter/CommunityServerdoesAmIHotorNot_14938/CommunityServer_AmIHotOrNot_2.jpg" mce_href="http://danhounshell.com/blogs/dan/WindowsLiveWriter/CommunityServerdoesAmIHotorNot_14938/CommunityServer_AmIHotOrNot_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; MARGIN: 5px 0px 5px 5px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=274 alt=CommunityServer_AmIHotOrNot src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/CommunityServerdoesAmIHotorNot_14938/CommunityServer_AmIHotOrNot_thumb.jpg" width=354 align=right border=0 mce_src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/CommunityServerdoesAmIHotorNot_14938/CommunityServer_AmIHotOrNot_thumb.jpg"&gt;&lt;/A&gt; 
&lt;P&gt;We're always working on something cool at &lt;A class="" title=Telligent href="http://telligent.com/" mce_href="http://telligent.com"&gt;Telligent&lt;/A&gt;, whether it be &lt;A title=Graffiti href="http://graffiticms.com/" mce_href="http://graffiticms.com/"&gt;an entirely new product&lt;/A&gt; or some type of addition or extension to &lt;A title="Community Server" href="http://communityserver.com/" mce_href="http://communityserver.com/"&gt;Community Server&lt;/A&gt;. Some good examples are some of the things we came up with in Hackathon II, including the couple of IM clients that work with Community Server messaging. If you haven't already read about some of the thing we came up with you can see them &lt;A title="Community Server Hack-a-thon II" href="http://communityserver.com/news/team-blog/community-server-hack-a-thon/" mce_href="http://communityserver.com/news/team-blog/community-server-hack-a-thon/"&gt;here&lt;/A&gt; and &lt;A title="More Hack-a-thon videos" href="http://communityserver.com/news/team-blog/more-hack-a-thon-videos/" mce_href="http://communityserver.com/news/team-blog/more-hack-a-thon-videos/"&gt;here&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Recently over a late night IM session with &lt;A title="Dave D" href="http://arcware.net/" mce_href="http://arcware.net/"&gt;Dave Donaldson&lt;/A&gt;, we pondered the benefits of certain types of social bookmarking functionality as well as other Web 2.0-like features. After our talk my thoughts turned to even more features and functionality and eventually settled on "Am I Hot or Not?". No, I'm not a perv - well not most of the time. However, a long time ago I built a clone called "Am I Dan Hounshell or Not?" in about an evening and ran it as part of my site for a while. My friends and I had a lot of fun with it. &lt;/P&gt;
&lt;P&gt;I began wondering what it would take to to build the same type of application on top of Community Server. CS has a media gallery, right? It shouldn't be too difficult to build the rest of the needed functionality on top of the media gallery, right? As I began looking into it I realized that my initial assumptions were wrong. Everything for Am I ___ or Not? is already there. In fact if you look at the screen shot at right you'll see a mini Am I Hot or Not application running right inside of Community Server! That's with a bone stock installation of Community Server 2008 running on my local PC right now, with no modifications, no skin changes, nothing. Everything is built in :). [Editor's Note: Maybe in the case of the jokers in the screenshot it should be "Am I Nerdy or Not?"]&lt;/P&gt;
&lt;P&gt;Community Server already has a Media Gallery which allows for uploading and viewing images, among other things. But it also has ratings and comments for each image/file built-in as well. You can also sort by Most Recent, Most Downloads, Most Popular and Most Comments. You can view all the images as a slideshow and there is even RSS! What more do you need for an Am I ___ or Not site? The only thing I needed to do was create a new Media Gallery, named "Am I Hot or Not?" (of course) and then give Registered Users permission to upload files to that gallery. If you want you could even add a link to the gallery in your site's main navigation.&lt;/P&gt;
&lt;P&gt;I doubt that most people and organizations running Community Server need or even want an Am I ___ or Not? application as part of their site (or give all registered users the ability to upload files to a gallery), but for the one or two of you out there who do - look no further than the Community Server platform you already have!&lt;/P&gt;
&lt;P&gt;And if you're wondering what else you can do with Community Server, come join us at &lt;A title=in.telligent href="http://in.telligent.com/" mce_href="http://in.telligent.com/"&gt;in.telligent 2008 in Dallas October 20-22&lt;/A&gt; and take part in some of the great workshops, including &lt;A title="theming and extending Community Server" href="http://in.telligent.com/sessions-and-workshops/#tech1" mce_href="http://in.telligent.com/sessions-and-workshops/#tech1"&gt;theming and extending Community Server&lt;/A&gt;.&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/07/29/community-server-does-quot-am-i-or-not-quot.aspx&amp;amp;;subject=Community+Server+does+%26quot%3bAm+I+___+or+Not%3f%26quot%3b" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/29/community-server-does-quot-am-i-or-not-quot.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/07/29/community-server-does-quot-am-i-or-not-quot.aspx&amp;amp;;title=Community+Server+does+%26quot%3bAm+I+___+or+Not%3f%26quot%3b" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/29/community-server-does-quot-am-i-or-not-quot.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/07/29/community-server-does-quot-am-i-or-not-quot.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/29/community-server-does-quot-am-i-or-not-quot.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/07/29/community-server-does-quot-am-i-or-not-quot.aspx&amp;amp;;title=Community+Server+does+%26quot%3bAm+I+___+or+Not%3f%26quot%3b" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/29/community-server-does-quot-am-i-or-not-quot.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/07/29/community-server-does-quot-am-i-or-not-quot.aspx&amp;amp;;title=Community+Server+does+%26quot%3bAm+I+___+or+Not%3f%26quot%3b&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/29/community-server-does-quot-am-i-or-not-quot.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9709" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Community+Server/default.aspx">Community Server</category></item><item><title>Lan and Deon #3</title><link>http://danhounshell.com/blogs/dan/archive/2008/07/23/lan-and-deon-3.aspx</link><pubDate>Wed, 23 Jul 2008 18:33:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9683</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>9</slash:comments><description>&lt;P mce_keep="true"&gt;Lan and Deon go to their local .NET User Group meeting...&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A title="Those who live in glass houses..." href="http://danhounshell.com/photos/diggerdanh/picture9682.aspx" target=_blank mce_href="http://danhounshell.com/photos/diggerdanh/picture9682.aspx"&gt;&lt;IMG alt="Those who live in glass houses..." src="http://danhounshell.com/photos/diggerdanh/images/9682/500x375.aspx" border=0 mce_src="http://danhounshell.com/photos/diggerdanh/images/9682/500x375.aspx"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/07/23/lan-and-deon-3.aspx&amp;amp;;subject=Lan+and+Deon+%233" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/23/lan-and-deon-3.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/07/23/lan-and-deon-3.aspx&amp;amp;;title=Lan+and+Deon+%233" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/23/lan-and-deon-3.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/07/23/lan-and-deon-3.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/23/lan-and-deon-3.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/07/23/lan-and-deon-3.aspx&amp;amp;;title=Lan+and+Deon+%233" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/23/lan-and-deon-3.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/07/23/lan-and-deon-3.aspx&amp;amp;;title=Lan+and+Deon+%233&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/23/lan-and-deon-3.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9683" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Lan+and+Deon/default.aspx">Lan and Deon</category></item><item><title>I like VisualSVN</title><link>http://danhounshell.com/blogs/dan/archive/2008/07/21/i-like-visualsvn.aspx</link><pubDate>Mon, 21 Jul 2008 20:39:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9671</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>5</slash:comments><description>&lt;P&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; MARGIN: 5px 0px 5px 5px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=504 alt=VisualSVN src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/VisualSVN_9DF7/VisualSVN_3.jpg" width=286 align=right border=0 mce_src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/VisualSVN_9DF7/VisualSVN_3.jpg"&gt; I'm not a big fan of Source Code Management integration with Visual Studio. I don't know, maybe VSS soured me years ago. When using Vault in the past I installed the Visual Studio integration tools once and uninstalled them a few days later. While using &lt;A title=Subversion href="http://subversion.tigris.org/" mce_href="http://subversion.tigris.org/"&gt;Subversion&lt;/A&gt; almost exclusively over the last three years I've been more than happy using &lt;A title=TortoiseSVN href="http://tortoisesvn.tigris.org/" mce_href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/A&gt; in an explorer window. The separation of SCM and programming IDE has been refreshing and actually lends itself well to the way Subversion works by default, not requiring a checkout or lock when editing a file.&lt;/P&gt;
&lt;P&gt;A few months ago, however, I won a license for &lt;A title=VisualSVN href="http://www.visualsvn.com/" mce_href="http://www.visualsvn.com/"&gt;VisualSVN&lt;/A&gt; at the &lt;A title="Indy Code Camp" href="http://www.indycodecamp.com/" mce_href="http://www.indycodecamp.com/"&gt;Indy Code Camp&lt;/A&gt;. The license sat on a table beside my desk for about a month before I finally decided to give it a spin. I have to admit that I'm growing fond of it. I still don't run updates and commits inside VS using VisualSVN (even though it just defaults to TortoiseSVN), but I really like the visual indicators that it provides. Showing me which files I've added or modified with the yellow icon greatly reduces any chance of me forgetting files when I make a commit. Or it helps me quickly find any files that I may have forgotten to commit. &lt;/P&gt;
&lt;P&gt;The other cool thing is that when I add any new files to a project via Visual Studio, VisualSVN automatically adds the file to SVN. I don't have to remember to browse to the file in Windows Explorer, right click the file, choose TortoiseSVN and then click Add. That may not seem like much of a time saver, but I always forget to manually add the files until after I've done commit (and maybe broken the build).&lt;/P&gt;
&lt;P&gt;Even it you don't like mixing your chocolate and peanut butter, um... I mean SCM tools with your IDE, you may like some of the features that VisualSVN provides. &lt;A title=VisualSVN href="http://www.visualsvn.com/visualsvn/download/" mce_href="http://www.visualsvn.com/visualsvn/download/"&gt;Give it a try, they offer a 30-day trial and the licenses start at $49 per seat&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Okay, that probably came off sounding like a commercial for VisualSVN. I am in no way affilated with the product or company and I stand to make no money from a couple more licenses being sold. I simply like the product and I thought I'd pass on my experiences with it. Besides, "if I can change and you can change, we all can change!" :)&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/07/21/i-like-visualsvn.aspx&amp;amp;;subject=I+like+VisualSVN" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/21/i-like-visualsvn.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/07/21/i-like-visualsvn.aspx&amp;amp;;title=I+like+VisualSVN" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/21/i-like-visualsvn.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/07/21/i-like-visualsvn.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/21/i-like-visualsvn.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/07/21/i-like-visualsvn.aspx&amp;amp;;title=I+like+VisualSVN" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/21/i-like-visualsvn.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/07/21/i-like-visualsvn.aspx&amp;amp;;title=I+like+VisualSVN&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/21/i-like-visualsvn.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9671" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/Subversion/default.aspx">Subversion</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/VisualSVN/default.aspx">VisualSVN</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/TortoiseSVN/default.aspx">TortoiseSVN</category></item><item><title>Adding OpenID to your web site in conjunction with ASP.NET Membership</title><link>http://danhounshell.com/blogs/dan/archive/2008/07/18/adding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx</link><pubDate>Sat, 19 Jul 2008 02:17:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9658</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>14</slash:comments><description>&lt;P&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; MARGIN: 5px 15px 5px 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=235 alt=AspDotNetMVC_OpenIdLogin src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/AddingOpenIDtoyourwebsitei.NETMembership_1CDC/AspDotNetMVC_OpenIdLogin_3.jpg" width=304 align=left border=0 mce_src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/AddingOpenIDtoyourwebsitei.NETMembership_1CDC/AspDotNetMVC_OpenIdLogin_3.jpg"&gt;I recently added membership, accounts, login, etc. to the &lt;A class="" title=AspDotNetMVC href="http://aspdotnetmvc.com/members/login/" mce_href="http://aspdotnetmvc.com/members/login/"&gt;AspDotNetMVC&lt;/A&gt; site. While doing so I decided I wanted to support OpenID, too. However, I didn't want to go with only OpenID because I needed ASP.NET Membership in place to work in conjunction with another application, a Kigg site used as a service for rating content on the AspDotNetMVC site. I could have probably converted the Kigg code base to use OpenID but I also wanted to allow people who may not have OpenID to create traditional accounts on the site without signing up for OpenID. Following are the steps I took to implement an OpenID login and integrate it with "traditional ASP.NET" membership. Follow these six steps and you can do the same.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;1.&lt;/STRONG&gt; Download the awesome C# OpenID library, &lt;A title=DotNetOpenId href="http://code.google.com/p/dotnetopenid/" mce_href="http://code.google.com/p/dotnetopenid/"&gt;DotNetOpenId&lt;/A&gt; from Google Code, and add it as a reference in your project. This is a great open source library developed by Andrew Arnott, Jason Alexander, Scott Watermasysk, Scott Hanselman, Joe Brinkman and others. It seriously does all the heavy lifting, comes with some good examples, and &lt;A href="http://blog.nerdbank.net/search/label/OpenID" mce_href="http://blog.nerdbank.net/search/label/OpenID"&gt;Andrew Arnott is doing a great job of making posts about fringe cases on his blog&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2.&lt;/STRONG&gt; Add some nice usability features to your OpenID login. Go to &lt;A title="ID Selector" href="https://www.idselector.com/" mce_href="https://www.idselector.com/"&gt;ID Selector&lt;/A&gt;, create an account and grab the couple of lines of JavaScript to create the cool OpenID service selector shown in the image at right.&lt;/P&gt;
&lt;P&gt;Did I mention that this is so easy that I don't know why everyone isn't supporting OpenID? Going forward I will be doing so in every new site that I create and I'll retrofit existing sites when I get the chance.&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; MARGIN: 5px 0px 5px 5px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=236 alt=AspDotNetMVC_OpenIdLogin2 src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/AddingOpenIDtoyourwebsitei.NETMembership_1CDC/AspDotNetMVC_OpenIdLogin2_4.jpg" width=304 align=right border=0 mce_src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/AddingOpenIDtoyourwebsitei.NETMembership_1CDC/AspDotNetMVC_OpenIdLogin2_4.jpg"&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3.&lt;/STRONG&gt; Read the following articles:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A title="How to add OpenID to your ASP.NET web site (in C# or VB.NET)" href="http://blog.nerdbank.net/2008/04/how-to-add-openid-to-your-aspnet-web.html" mce_href="http://blog.nerdbank.net/2008/04/how-to-add-openid-to-your-aspnet-web.html"&gt;How to add OpenID to your ASP.NET web site (in C# or VB.NET)&lt;/A&gt; - Andrew Arnott&lt;/LI&gt;
&lt;LI&gt;&lt;A title="Add OpenID login support to your ASP.NET MVC site" href="http://blog.nerdbank.net/2008/04/add-openid-login-support-to-your-aspnet.html" mce_href="http://blog.nerdbank.net/2008/04/add-openid-login-support-to-your-aspnet.html"&gt;Add OpenID login support to your ASP.NET MVC site&lt;/A&gt; - Andrew Arnott&lt;/LI&gt;
&lt;LI&gt;&lt;A title="Enhancing the ASP.NET MVC OpenID login experience" href="http://blog.nerdbank.net/2008/04/enhancing-aspnet-mvc-openid-login.html" mce_href="http://blog.nerdbank.net/2008/04/enhancing-aspnet-mvc-openid-login.html"&gt;Enhancing the ASP.NET MVC OpenID login experience&lt;/A&gt; - Andrew Arnott&lt;/LI&gt;
&lt;LI&gt;&lt;A title="How to add OpenID to your ASP.NET forms web site without using ASP.NET Controls" href="http://blog.nerdbank.net/2008/07/how-to-add-openid-to-your-aspnet-forms.html" mce_href="http://blog.nerdbank.net/2008/07/how-to-add-openid-to-your-aspnet-forms.html"&gt;How to add OpenID to your ASP.NET forms web site without using ASP.NET Controls&lt;/A&gt; - Andrew Arnott&lt;/LI&gt;
&lt;LI&gt;&lt;A title="How to use DotNetOpenId's Attribute Exchange extension" href="http://blog.nerdbank.net/2008/07/how-to-use-dotnetopenid-attribute.html" mce_href="http://blog.nerdbank.net/2008/07/how-to-use-dotnetopenid-attribute.html"&gt;How to use DotNetOpenId's Attribute Exchange extension&lt;/A&gt; - Andrew Arnott&lt;/LI&gt;
&lt;LI&gt;&lt;A title="The Weekly Source Code #35 - OpenID Edition" href="http://www.hanselman.com/blog/TheWeeklySourceCode25OpenIDEdition.aspx" mce_href="http://www.hanselman.com/blog/TheWeeklySourceCode25OpenIDEdition.aspx"&gt;The Weekly Source Code #35 - OpenID Edition&lt;/A&gt; - Scott Hanselman&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;After reading the above you will have a pretty good understanding of how to add OpenID to your site. Some of the code examples in the earlier 3 posts by Andrew are a little out of date. As of the writing of this post the code provided in Hanselman's blog post are the most up to date. Go ahead and read the two "MVC" posts by Andrew even if you are not interested in ASP.NET MVC. The concepts displayed in those posts can be used anywhere. In fact, it was in of those posts where I found my inspiration for overcoming my next hurdle. &lt;/P&gt;
&lt;P&gt;The only thing that was missing for me was integration with ASP.NET membership. I actually found very little information for accomplishing this. I found quite a lot of questions asking how to do it, but most of the answers were just more questions asking why you would want to do it. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;4.&lt;/STRONG&gt; Create your login form (or user control or composite server control or whatever you prefer). In my case I created a user control that holds just the fields necessary for OpenID login&amp;nbsp;and the logic behind them. Doing so allows me to drop that control into&amp;nbsp;any existing login page (shown in image above) or my existing create account page or anywhere else I want to use it. Make sure you add the javascript for the ID Selector. &lt;/P&gt;
&lt;P&gt;For allowing traditional ASP.NET membership login and user account creation I just dropped the basic out of the box controls on the page.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;5.&lt;/STRONG&gt; Wire up the login submit button. I did something like below, which is very similar to examples that Andrew and Scott Hanselman provided. Basically I'm just telling the OpenID provider that I need the user's email and nickname (for use in the next step): &lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; loginButton_Click(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; sender, EventArgs e) {&lt;/PRE&gt;&lt;PRE&gt;   &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (!openidValidator.IsValid) &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt;; &lt;SPAN class=rem&gt;// don't login if custom validation failed.  &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;   OpenIdRelyingParty openid = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; OpenIdRelyingParty();&lt;/PRE&gt;&lt;PRE&gt;   &lt;SPAN class=kwrd&gt;try&lt;/SPAN&gt; {&lt;/PRE&gt;&lt;PRE class=alt&gt;      IAuthenticationRequest request = openid.CreateRequest(openid_identifier.Text);&lt;/PRE&gt;&lt;PRE&gt;      ClaimsRequest fetch = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ClaimsRequest();&lt;/PRE&gt;&lt;PRE class=alt&gt;      fetch.Nickname = DemandLevel.Require;&lt;/PRE&gt;&lt;PRE&gt;      fetch.Email = DemandLevel.Require;&lt;/PRE&gt;&lt;PRE class=alt&gt;      request.AddExtension(fetch);&lt;/PRE&gt;&lt;PRE&gt;      request.RedirectToProvider();&lt;/PRE&gt;&lt;PRE class=alt&gt;   } &lt;SPAN class=kwrd&gt;catch&lt;/SPAN&gt; (OpenIdException ex) {&lt;/PRE&gt;&lt;PRE&gt;      &lt;SPAN class=rem&gt;// The user probably entered an Identifier that   &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;      &lt;SPAN class=rem&gt;// was not a valid OpenID endpoint.  &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;      openidValidator.Text = ex.Message;&lt;/PRE&gt;&lt;PRE class=alt&gt;      openidValidator.IsValid = &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;   }&lt;/PRE&gt;&lt;PRE class=alt&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;
&lt;STYLE type=text/css&gt;.csharpcode {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: consolas, "Courier New", courier, monospace; BACKGROUND-COLOR: #ffffff
}
.csharpcode PRE {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: consolas, "Courier New", courier, monospace; BACKGROUND-COLOR: #ffffff
}
.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 {
	MARGIN: 0em; WIDTH: 100%; BACKGROUND-COLOR: #f4f4f4
}
.csharpcode .lnum {
	COLOR: #606060
}
&lt;/STYLE&gt;
&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;6.&lt;/STRONG&gt; Handle the response from the OpenID provider. This snippet of code is part of the login process and expands upon examples from Andrew Arnott's and Scott Hanselman's posts linked to previously. &lt;/P&gt;
&lt;P&gt;Here I'm pulling the alias and email address that I requested in the previous step. With that information I check to see if the user already exists in the ASP.NET membership datastore. If not I will create a Membership account for them using their OpenID URI as their username. When I create the account you can see that I'm generating a random string for the user's password field and password answer field. You'll also see that I'm adding "This is an OpenID account. You should log in with your OpenID." as the password question. That way if a user forgets they used OpenID and tries to login through the traditional username/password login form and selects that they forgot their password when the login doesn't work, he or she will get a reminder about their OpenID in the form of the password question. I know it's a hack, but it works for now for my modest needs and I'm happy with it. &lt;/P&gt;
&lt;P&gt;Next you'll see that after I create the Membership User I then set the user's "comment" field to their Nickname. This is because the "Hello, Username. Welcome back to the site." message at the top of the page would normally display the user's "username". In the case of OpenID users their username would be their OpenID URI - something like: &lt;A href="http://danhounshell.openidprovidername.com/" mce_href="http://danhounshell.openidprovidername.com/"&gt;http://danhounshell.openidprovidername.com/&lt;/A&gt;. That's a bit ugly and I'd rather use the Nickname that I asked from then when they logged in with OpenID. By shoving the Nickname into the comments field I can first check to see if&amp;nbsp;it has a value&amp;nbsp;and if so use it in the display rather than their username. If it doesn't have a value then&amp;nbsp;I can&amp;nbsp;default to the username. So now using my previous example it will say "Hello, DanHounshell. Welcome back to the site." This same thing could be accomplished in a couple of other ways. Throwing the nickname into the session object or putting it in a cookie are other reasonable alternatives. In my case I don't use the comments field for anything else so once again - I know it's a hack, but it works for now for my modest needs and I'm happy with it. Plus it's easy to get to by just writing "user.Comment". Thinking about it, it might be nice to write an extension method for MembershipUser called DisplayName that determines whether to use the user.Comment property or the user.Username property. &lt;/P&gt;
&lt;P&gt;Finally, I just call FormsAuthentication.RedirectFromLoginPage() passing in their OpenID URI that they provided, logging them into the site.&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=kwrd&gt;case&lt;/SPAN&gt; AuthenticationStatus.Authenticated:&lt;/PRE&gt;&lt;PRE&gt;   ClaimsResponse fetch = openid.Response.GetExtension(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(ClaimsResponse)) &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; ClaimsResponse;&lt;/PRE&gt;&lt;PRE class=alt&gt;   &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; alias = fetch.Nickname;&lt;/PRE&gt;&lt;PRE&gt;   &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; email = fetch.Email; &lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;   &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;.IsNullOrEmpty(alias))&lt;/PRE&gt;&lt;PRE class=alt&gt;      alias = openid.Response.ClaimedIdentifier;&lt;/PRE&gt;&lt;PRE&gt;   &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;.IsNullOrEmpty(email))&lt;/PRE&gt;&lt;PRE class=alt&gt;      email = openid.Response.ClaimedIdentifier;&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;   &lt;SPAN class=rem&gt;//Now see if the user already exists, if not create them&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;   &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (Membership.GetUser(openid.Response.ClaimedIdentifier) == &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;) &lt;/PRE&gt;&lt;PRE class=alt&gt;   {&lt;/PRE&gt;&lt;PRE&gt;      MembershipCreateStatus membershipCreateStatus;&lt;/PRE&gt;&lt;PRE class=alt&gt;      MembershipUser user = Membership.CreateUser(openid.Response.ClaimedIdentifier, &lt;/PRE&gt;&lt;PRE&gt;         Common.GetRandomString(5,7), &lt;/PRE&gt;&lt;PRE class=alt&gt;         email, &lt;/PRE&gt;&lt;PRE&gt;         &lt;SPAN class=str&gt;"This is an OpenID account. You should log in with your OpenID."&lt;/SPAN&gt;, &lt;/PRE&gt;&lt;PRE class=alt&gt;         Common.GetRandomString(5,7), &lt;/PRE&gt;&lt;PRE&gt;         &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;, &lt;/PRE&gt;&lt;PRE class=alt&gt;         &lt;SPAN class=kwrd&gt;out&lt;/SPAN&gt; membershipCreateStatus);&lt;/PRE&gt;&lt;PRE&gt;       &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (membershipCreateStatus != MembershipCreateStatus.Success) &lt;/PRE&gt;&lt;PRE class=alt&gt;      {&lt;/PRE&gt;&lt;PRE&gt;          loginFailedLabel.Text += &lt;SPAN class=str&gt;": Unsuccessful creation of Account: "&lt;/SPAN&gt; + membershipCreateStatus.ToString();&lt;/PRE&gt;&lt;PRE class=alt&gt;          loginFailedLabel.Visible = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;          &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;       }&lt;/PRE&gt;&lt;PRE&gt;       user.Comment = alias;&lt;/PRE&gt;&lt;PRE class=alt&gt;       Membership.UpdateUser(user);&lt;/PRE&gt;&lt;PRE&gt;    }&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=rem&gt;// Use FormsAuthentication to tell ASP.NET that the user is now logged in,  &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=rem&gt;// with the OpenID Claimed Identifier as their username. &lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;    FormsAuthentication.RedirectFromLoginPage(openid.Response.ClaimedIdentifier, chkRememberMe.Checked);&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;.csharpcode {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: consolas, "Courier New", courier, monospace; BACKGROUND-COLOR: #ffffff
}
.csharpcode PRE {
	FONT-SIZE: small; COLOR: black; FONT-FAMILY: consolas, "Courier New", courier, monospace; BACKGROUND-COLOR: #ffffff
}
.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 {
	MARGIN: 0em; WIDTH: 100%; BACKGROUND-COLOR: #f4f4f4
}
.csharpcode .lnum {
	COLOR: #606060
}
&lt;/STYLE&gt;

&lt;P&gt;That's all there is to it. Now you can allow your user's to choose whether they'd like to create an account on your site by creating a new username and password or by using their new or existing OpenID. The bonus with this method is that it allows you to add OpenID support to an existing site that already has traditional membership without breaking anything.&lt;/P&gt;
&lt;P&gt;Enjoy and let me know if you have any questions or comments.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fdanhounshell.com%2fblogs%2fdan%2farchive%2f2008%2f07%2f18%2fadding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx"&gt;&lt;IMG alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fdanhounshell.com%2fblogs%2fdan%2farchive%2f2008%2f07%2f18%2fadding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx" border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/07/18/adding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx&amp;amp;;subject=Adding+OpenID+to+your+web+site+in+conjunction+with+ASP.NET+Membership" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/18/adding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/07/18/adding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx&amp;amp;;title=Adding+OpenID+to+your+web+site+in+conjunction+with+ASP.NET+Membership" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/18/adding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/07/18/adding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/18/adding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/07/18/adding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx&amp;amp;;title=Adding+OpenID+to+your+web+site+in+conjunction+with+ASP.NET+Membership" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/18/adding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/07/18/adding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx&amp;amp;;title=Adding+OpenID+to+your+web+site+in+conjunction+with+ASP.NET+Membership&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/18/adding-openid-to-your-web-site-in-conjunction-with-asp-net-membership.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9658" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/AspDotNetMVC.com/default.aspx">AspDotNetMVC.com</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/DotNetOpenId/default.aspx">DotNetOpenId</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/OpenID/default.aspx">OpenID</category></item><item><title>How to use Kigg as a service from other sites</title><link>http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx</link><pubDate>Tue, 15 Jul 2008 06:33:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9640</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; MARGIN: 5px 0px 5px 5px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=204 alt=AspDotNetMVCGetsKigg src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/IntegratingKiggintoanothersite_2A61/AspDotNetMVCGetsKigg_3.jpg" width=352 align=right border=0 mce_src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/IntegratingKiggintoanothersite_2A61/AspDotNetMVCGetsKigg_3.jpg"&gt; &lt;/P&gt;
&lt;P&gt;In &lt;A title="How to decouple the ASP.NET Membership database from Kigg" href="http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx" mce_href="http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx"&gt;yesterday's post&lt;/A&gt; I started providing some detail about my use of &lt;A title="Kigg on Codeplex" href="http://codeplex.com/kigg" mce_href="http://codeplex.com/kigg"&gt;Kigg&lt;/A&gt; to add rating functionality to the &lt;A title=AspDotNetMVC href="http://aspdotnetmvc.com/" mce_href="http://aspdotnetmvc.com"&gt;AspDotNetMVC site&lt;/A&gt;. Because I wanted to integrate the ASP.NET Membership store between the two sites into an external database I started by decoupling the membership data from the Kigg database, model and code. &lt;/P&gt;
&lt;P&gt;My end goal was to allow visitors to the AspDotNetMVC site to view the number of existing votes for each article (blog post, buzz, news, or video) and to vote for an article if they were logged in without having to jump over to the Kigg site to do so. Because each of the items listed on the AspDotNetMVC are basically just pointers to some content on the Internet at a unique URL I needed a way to request the rating count from Kigg by URL. I also needed a way to vote for an article by passing some (url, title, description, category, tags and user) from the main site to Kigg. Of course as a web developer my first thought was to create a web service in Kigg with two methods, GetVoteCount(url) and SubmitOrVote(url, title, desc...). Since I had never previously created a WCF web service I chose to go that route rather than the asmx approach. &lt;/P&gt;
&lt;P&gt;YMMV, but the first thing I needed was a new method in my Kigg data model to allow for retrieving the "story details" by url rather than id. In Kigg, like Digg, a story is an item submitted to the site. Since I'd be using an external site I wouldn't know the ID of a story (or care what the id was) I wanted to be able to perform lookups by the story's URL. I added the following to the KiggDataContext model (and the signature to the IDataContext interface):&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; StoryDetailItem GetStoryDetailByUrl(Guid userId, &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; url) {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=kwrd&gt;   return&lt;/SPAN&gt; Stories&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Where(s =&amp;gt; s.Url.ToLower() == url.ToLower())&lt;/PRE&gt;&lt;PRE&gt;      .Select(s =&amp;gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; StoryDetailItem&lt;/PRE&gt;&lt;PRE&gt;         {&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID = s.ID,&lt;/PRE&gt;&lt;PRE&gt;            Title = s.Title,&lt;/PRE&gt;&lt;PRE class=alt&gt;            Description = s.Description,&lt;/PRE&gt;&lt;PRE&gt;            Url = s.Url,&lt;/PRE&gt;&lt;PRE class=alt&gt;            Category = s.Category.Name,&lt;/PRE&gt;&lt;PRE&gt;            Tags = s.StoryTags.Select(st =&amp;gt; st.Tag.Name).ToArray(),&lt;/PRE&gt;&lt;PRE class=alt&gt;            PostedBy = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; UserItem(s.PostedBy),&lt;/PRE&gt;&lt;PRE&gt;            PostedOn = s.PostedOn,&lt;/PRE&gt;&lt;PRE class=alt&gt;            PublishedOn = s.PublishedOn,&lt;/PRE&gt;&lt;PRE&gt;            VoteCount = s.Votes.Count(),&lt;/PRE&gt;&lt;PRE class=alt&gt;            HasVoted = (s.Votes.Count(v =&amp;gt; v.UserID == userId) &amp;gt; 0),&lt;/PRE&gt;&lt;PRE&gt;            VotedBy = s.Votes&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .OrderBy(v =&amp;gt; v.Timestamp)&lt;/PRE&gt;&lt;PRE&gt;               .Select(v =&amp;gt; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; UserItem(v.UserID))&lt;/PRE&gt;&lt;PRE class=alt&gt;               .ToArray(),&lt;/PRE&gt;&lt;PRE&gt;            Comments = s.Comments&lt;/PRE&gt;&lt;PRE class=alt&gt;               .OrderBy(c =&amp;gt; c.PostedOn)&lt;/PRE&gt;&lt;PRE&gt;               .Select(c =&amp;gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; CommentItem&lt;/PRE&gt;&lt;PRE&gt;                  {&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PostedBy = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; UserItem(c.PostedBy),&lt;/PRE&gt;&lt;PRE&gt;                     PostedOn = c.PostedOn,&lt;/PRE&gt;&lt;PRE class=alt&gt;                     Content = c.Content&lt;/PRE&gt;&lt;PRE&gt;                  }&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ).ToArray()&lt;/PRE&gt;&lt;PRE&gt;         }&lt;/PRE&gt;&lt;PRE class=alt&gt;      )&lt;/PRE&gt;&lt;PRE&gt;      .FirstOrDefault();&lt;/PRE&gt;&lt;PRE class=alt&gt;  } &lt;/PRE&gt;&lt;/DIV&gt;
&lt;DIV class=csharpcode&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;This is very much just a copy and paste of the existing GetStoryDetailById method, just querying by URL rather than ID. &lt;/P&gt;
&lt;P&gt;Next I needed to create the web service and two new methods in it. I created the service at /services/KiggService.svc and the two methods look like the following:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;[WebGet(ResponseFormat = WebMessageFormat.Xml)]&lt;/PRE&gt;&lt;PRE&gt;[OperationContract]&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; GetVoteCount(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; url) {&lt;/PRE&gt;&lt;PRE&gt;       &lt;SPAN class=rem&gt;//MembershipID doesn't matter because we're just getting the vote count.&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;       Guid _currentUserID = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Guid();&lt;/PRE&gt;&lt;PRE&gt;       IDataContext db = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; KiggDataContext();&lt;/PRE&gt;&lt;PRE class=alt&gt;       var story = db.GetStoryDetailByUrl(_currentUserID, url);&lt;/PRE&gt;&lt;PRE&gt;       &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (story != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE class=alt&gt;            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; story.VoteCount.ToString();&lt;/PRE&gt;&lt;PRE&gt;       &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=str&gt;"0"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;}&lt;/PRE&gt;&lt;/DIV&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;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;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;[WebGet(ResponseFormat = WebMessageFormat.Xml)]&lt;/PRE&gt;&lt;PRE&gt;[OperationContract]&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; SubmitOrVote(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; userid, &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; url, &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; title, &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; desc, &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; categoryName, &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; tag)&lt;/PRE&gt;&lt;PRE&gt;{&lt;/PRE&gt;&lt;PRE class=alt&gt;   &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;.IsNullOrEmpty(userid))&lt;/PRE&gt;&lt;PRE&gt;      &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt;(&lt;SPAN class=str&gt;"You must be authenticated prior hitting this url"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE class=alt&gt;   Guid _currentUserID = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Guid(userid);&lt;/PRE&gt;&lt;PRE&gt;   Category[] _categories;&lt;/PRE&gt;&lt;PRE class=alt&gt;   IDataContext db = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; KiggDataContext();&lt;/PRE&gt;&lt;PRE&gt;   _categories = db.GetCategories();&lt;/PRE&gt;&lt;PRE class=alt&gt;   &lt;SPAN class=kwrd&gt;try&lt;/SPAN&gt; {&lt;/PRE&gt;&lt;PRE&gt;       Category cat = _categories.First(c =&amp;gt; c.Name == &lt;SPAN class=str&gt;"General"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE class=alt&gt;       &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (!&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;.IsNullOrEmpty(categoryName)) {&lt;/PRE&gt;&lt;PRE&gt;           cat = _categories.First(c =&amp;gt; c.Name.ToLower() == categoryName.ToLower());&lt;/PRE&gt;&lt;PRE class=alt&gt;       }&lt;/PRE&gt;&lt;PRE&gt;       var categoryId = cat.ID;&lt;/PRE&gt;&lt;PRE class=alt&gt;       var story = db.GetStoryDetailByUrl(_currentUserID, url);&lt;/PRE&gt;&lt;PRE&gt;       &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (story == &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;) {&lt;/PRE&gt;&lt;PRE class=alt&gt;           db.SubmitStory(url, title, categoryId, desc, tag, _currentUserID);&lt;/PRE&gt;&lt;PRE&gt;           &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=str&gt;"1"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;       } &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt; {&lt;/PRE&gt;&lt;PRE&gt;           db.KiggStory(story.ID, _currentUserID, 3);&lt;/PRE&gt;&lt;PRE class=alt&gt;           var story2 = db.GetStoryDetailById(_currentUserID, story.ID);&lt;/PRE&gt;&lt;PRE&gt;           &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; story2.VoteCount.ToString();&lt;/PRE&gt;&lt;PRE class=alt&gt;       }&lt;/PRE&gt;&lt;PRE&gt;   } &lt;SPAN class=kwrd&gt;catch&lt;/SPAN&gt; (Exception e) {&lt;/PRE&gt;&lt;PRE class=alt&gt;       &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; &lt;SPAN class=str&gt;"error"&lt;/SPAN&gt; + e.Message;&lt;/PRE&gt;&lt;PRE&gt;   }           &lt;/PRE&gt;&lt;PRE class=alt&gt;}&lt;/PRE&gt;&lt;/DIV&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;P&gt;There's not much to the GetVoteCount method, it just checks to see if a story already exists in Kigg for the given URL, if it does then it returns the vote count, otherwise it returns 0.&lt;/P&gt;
&lt;P&gt;The second method SubmitOrVote probably needs a little more explanation. It allows for a user to click a vote button on the AspDotNetMVC site and if the story already exists then it adds an additional vote. If the story does not already exist in Kigg then it submits it. Sounds simple enough. Since the category the story belongs in is passed in by a string I need to check the categories that exist in Kigg to find a match for that passed in categoryName string. First I set "cat" to the default category, "General", and then try to find the match. If there is a match then I use the Kigg category that I found, otherwise I stick with General. Next I just lookup the story and then give it the additional vote or create it if it doesn't exist and then return the appropriate new vote count. &lt;/P&gt;
&lt;P&gt;You'll notice that I'm passing the userId across the wire. In my case it's not a big deal because my calls to the service are done server side in my client application and the Kigg site is not publicly accessible. Since the Kigg site is only accessible by the AspDotNetMVC site I also don't have to worry about authentication or authorization either. Again YMMV. Also you may not want to expose your exception like I have to callers of your Kigg service. In my case it's fine because I'm the only one calling it and I wanted to be able to log any exceptions in the client application for later review.&lt;/P&gt;
&lt;P&gt;You'll have to add appropriate error handling around the calls to these web service service and it would be a good idea to cache the votes for each article/url/story in your consuming application so you aren't calling that method every time you need to show the votecount. &lt;/P&gt;
&lt;P&gt;That's all the adjustments that you need to make to Kigg to allow it act as a service for other applications. I'll admit that it did take me a while to get the web.config setup properly to allow for the WCF services, but that has more to do with my first time doing doing anything with WCF than it does with the Kigg updates. If you have any WCF experience at all I'm sure it will take you much less time than the 30 minutes I spent doing so (mostly spent searching for answers on Google).&lt;/P&gt;
&lt;P&gt;Hopefully these last two posts will provide you with a jumpstart for integrating Digg-style ratings (um... I mean Kigg-style) into your existing or new web applications. Have fun with those new mashups.&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx&amp;amp;;subject=How+to+use+Kigg+as+a+service+from+other+sites" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx&amp;amp;;title=How+to+use+Kigg+as+a+service+from+other+sites" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx&amp;amp;;title=How+to+use+Kigg+as+a+service+from+other+sites" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx&amp;amp;;title=How+to+use+Kigg+as+a+service+from+other+sites&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9640" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Kigg/default.aspx">Kigg</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category></item><item><title>How I got started in Software Development</title><link>http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx</link><pubDate>Mon, 14 Jul 2008 06:34:22 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9627</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;I've finally gotten around to answering Michael Eaton's question: &lt;a title="How did you get started in software development?" href="http://michaeleatonconsulting.com/blog/archive/2008/06/04/how-did-you-get-started-in-software-development.aspx"&gt;How did you get started in software development?&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;How old were you when you started programming? &lt;strong&gt;How did you get started in programming?&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I think that the first time that I got the concept of writing instructions for computers to execute was probably somewhere around 7th or 8th grade - 12 years old I guess. A couple of classmates were playing around on the one Apple IIc (?) in our math classroom and wrote one of the all time classic computer programs, something similar to:&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;10 print &lt;span class="str"&gt;"Danny Hounshell shops at goodwill"&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;20 &lt;span class="kwrd"&gt;goto&lt;/span&gt; 10&lt;/pre&gt;&lt;/div&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;p&gt;A couple of years later I was finally able to get a Commodore64 and typed in every program from every magazine I could get my hands and tweaked them as much as I could.&amp;nbsp; Later in high school I took Computer Programming I and Computer Programming II, both BASIC on an old Apple II - we had one Macintosh, that had just come out, but we didn't get to work with it much. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What was your first language?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;BASIC was my first language. I was exposed to several different flavors: the Commodore BASIC that I had at home, whatever the BASIC was for the Apple II's that I used at school, and then I had a friend who had an Atari and another who later had an Amiga.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What was the first real program you wrote?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The first real program that I wrote was the culmination of Computer Programming II class in high school. At the time text based games like Zork were at their peak in popularity. I wrote a text-based baseball simulation that was based on the current (at the time) lineup of the Cincinnati Reds. If you threw heat at Dave Parker low and inside he would knock it out of the park! And when you batted you faced Jose Rijo on the mound, the Red's once-upon-a-time unhitable ace. &lt;/p&gt;
&lt;p&gt;The next real program that I wrote was probably 10 years later using VB3. It was a Roulette game and was my final project for the Intro to Programming (Visual Basic) class at Miami University. &lt;/p&gt;
&lt;p&gt;In the time in between I spent 6 years in the Army and had a couple of short stints working with training software and building ammunition and meal forecasting spreadsheets, which I found I was pretty good at, but never any "real" programming. They usually don't let grunts touch computers. &lt;/p&gt;
&lt;p&gt;Later, while working at a paper company as an intern just before starting my programming classes, I found something wrong with some queries (a couple of years later I realized in was SQL) in some reports for our inventory system that were causing duplicate counts to be reported for some parts. By fixing the query I "reduced" our inventory by about a million dollars (about 15%) in about 30 minutes of work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What languages have you used since you started programming?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Miami did a good job of exposing us to different languages. In my classes I worked with Visual Basic (3 &amp;amp; 4), Visual C++, Assembler, JCL, COBOL, VBScript (ASP), some SmallTalk, and more VC++ (in that order) and SQL of course. Miami has since moved to JAVA rather than the Microsoft stack, so if I ever decide to go back for more I may have to learn something new.&amp;nbsp; Since joining the ranks of the employed I've mostly used VB, VBScript (ASP), VB.NET and C# along with SQL and the normal web stuff (HTML, CSS, JavaScript).&amp;nbsp; &lt;/p&gt;
&lt;p&gt;After my first experience with ASP I knew I was hooked on web development. I took the ball and ran and I haven't looked back since.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What was your first professional programming gig?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before leaving the previously mentioned paper company I wrote some intranet type applications in ASP (pages for departments and a conference room reservation system) but since I was actually paid to be an intern for the maintenance department so those really don't count.&lt;/p&gt;
&lt;p&gt;My first real job in the biz was for a web agency in Cincinnati that was quickly getting a good reputation in the region, SharkBytes. Sadly the company is no longer around - it couldn't handle the slow period after the dotcom crash in 2000/2001. I really have to thank &lt;a title="Ryan Walker" href="http://webdevelopreneur.com/"&gt;Ryan&lt;/a&gt; and &lt;a title="Clark Marx" href="http://clarkmarx.com/nblog/"&gt;Clark&lt;/a&gt; for giving me a shot because looking back I had no experience and no skills at all the day I walked in their door for the interview. They must have seen passion and a willingness to learn and hoped it would be worth something. I spent about 6 years with SharkBytes and sibling/parent companies - at the peak I was the Technical Director for the company with about a 10-12 person team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you knew then what you know now, would you have started programming?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shortest answer of the bunch: Definitely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If there is one thing that you learned along the way that you would tell new developers, what would it be?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I like the comment Mike made, &lt;a title="Mike Eaton said it!" href="http://michaeleatonconsulting.com/blog/archive/2008/06/04/how-did-you-get-started-in-software-development.aspx"&gt;"Don't get stuck in a cube farm."&lt;/a&gt; I do see some benefit from doing it for a while, but mostly from experiencing and observing how larger organizations work. I also like &lt;a title="Steve Smith's advice" href="http://stevesmithblog.com/blog/how-i-got-started-in-software-development/"&gt;Steve Smith's advice&lt;/a&gt;, "I would suggest that new grads strongly consider doing some consulting work... to be able to see how things worked at a variety of companies and work on a variety of technologies". I think that both say the same thing in different ways. I've always believed that no experience is a bad experience because at worst you've learned about something that you don't like or like to do. Having your eyes opened to as many things as possible will help you decide what it is that you like to do. The same can be said for classes in college. I tried a little bit of everything: accounting, political science, statistics, lots of history and I took a programming class on a whim. I re-discovered that I loved it. My plans to be an accountant were foiled. &lt;/p&gt;
&lt;p&gt;My best advice is to not let yourself get stuck in a rut. If you've worked at a place too long that you've learned everything you can from the people that you work with, you're not doing anything new, and you've become the "go to" person then it's time to move on to a more difficult challenge. That doesn't necessarily mean that you need to look for another job, though it may. Finding an open source project to get involved in might be a good alternative. Seeking out experts or others with differing techniques at local or regional user groups and events can be another alternative. Just looking and and experimenting with new(er) or different technologies might fill that need for you, too. Just make sure that you continually keep expanding your horizons.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What's the most fun you've ever had... programming?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I can define "fun" in a lot of different ways - even learning something new or the occasions when something just clicks and the light bulb comes on I consider fun. Digging through some difficult code and finally figuring out how it works is fun. Figuring out how to write a unit test for something I thought untesable is fun. I even find something to laugh about every day in our daily stand ups. Nearly everything about being a software developer is fun for me. It's all about solving puzzles and there's nothing more fun than that. &lt;/p&gt;
&lt;p&gt;That being said the most day-to-day enjoyable job I've ever had was working with two of my best friends in a small office each and every day. We were always playing practical jokes on each other, bouncing ideas off each other, complaining about something or another, and we always went out to lunch together. Best of all we'd laugh about 100 times or more a day.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx&amp;amp;;subject=How+I+got+started+in+Software+Development" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx&amp;amp;;title=How+I+got+started+in+Software+Development" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx&amp;amp;;title=How+I+got+started+in+Software+Development" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx&amp;amp;;title=How+I+got+started+in+Software+Development&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9627" width="1" height="1"&gt;</description></item><item><title>How to decouple the ASP.NET Membership database from Kigg</title><link>http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx</link><pubDate>Mon, 14 Jul 2008 04:57:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9623</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>3</slash:comments><description>&lt;P&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; MARGIN: 5px 0px 5px 5px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=204 alt=AspDotNetMVCGetsKigg src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/DecouplingmembershipfromKigg_2A76/AspDotNetMVCGetsKigg_3.jpg" width=352 align=right border=0 mce_src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/DecouplingmembershipfromKigg_2A76/AspDotNetMVCGetsKigg_3.jpg"&gt; &lt;/P&gt;
&lt;P&gt;This evening I posted an update to the &lt;A href="http://aspdotnetmvc.com/" mce_href="http://aspdotnetmvc.com/"&gt;AspDotNetMVC&lt;/A&gt; site that includes allowing voting on the ASP.NET MVC blog posts, buzz, articles and news that the site collects. You can see a page that uses it here: &lt;A href="http://aspdotnetmvc.com/blogs" mce_href="http://aspdotnetmvc.com/blogs"&gt;http://aspdotnetmvc.com/blogs&lt;/A&gt;. Rather than create my own rating system I decided to leverage &lt;A href="http://codeplex.com/Kigg" mce_href="http://codeplex.com/Kigg"&gt;Kigg&lt;/A&gt; instead. I mentioned in a previous post that I had been looking at Kigg and that I had &lt;A title="Upgrading Kigg to ASP.NET MVC Preview 3" href="http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx" mce_href="http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx"&gt;upgraded it from ASP.NET MVC Preview 2 to Preview 3&lt;/A&gt;. Why not use Kigg? It has nearly everything that I need, it is open source, and it's built on ASP.NET MVC. It seems appropriate to use it for a site that's all about ASP.NET MVC. Additionally, my mucking around in the project is helping me learn ASP.NET MVC a little so I can convert the AspDotNetMVC site to it at some point. &lt;/P&gt;
&lt;P&gt;This is the first of a couple of articles where I will describe some of the changes that I had to make to Kigg to allow it to support the way that I wanted to use it on AspDotNetMVC. My goal was to allow voting on items on the AspDotNetMVC site without requiring visitors to bounce over to a Kigg site to do so. Because Kigg only allows members to vote once on an article and I wanted the same for the main site I had to hook up ASP.NET Membership to the AspDotNetMVC site and have both sites use the same membership database. Yes, I probably could have just used cookies, session, IP address or something else to accomplish the same thing, but I will have site "members" in the future (for forums, etc) so I didn't want to invent something now just to end up rewriting it in the future when membership was really needed. I hear some of you mumbling "YAGNI" already, and I don't disagree, but in reality the path of least resistance was to go ahead and wire up membership now on the main site rather than rewrite Kigg to use something other than ASP.NET membership. &lt;/P&gt;
&lt;P&gt;Today I'll talk about decoupling the ASP.NET membership database from the Kigg database and codebase (why will be explained below). The follow-up post will be about writing two WCF web services for Kigg to allow other sites to retrieve the count of votes for "articles" and to vote on articles. The final post of the three will show how easy it is to setup support for OpenID and integrate it with your ASP.NET Membership system to allow users the option of using OpenID or creating a traditional account on the site.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I wrote a paragraph or two above that I needed to create one ASP.NET membership store and let both the AspDotNetMVC site and the Kigg site use it. The Kigg site database already comes with the asp.net membership stuff baked into it. I didn't want the main site's membership to depend on the Kigg database, though. In fact I wanted to use a different database for membership, one that is solely for membership, that I use for several sites. Upon trying to use an external membership database for Kigg I found a couple of "issues". There are a couple of foreign key relationships setup between the Kigg tables and the aspnet_Users table and the Kigg data model actually includes the aspnet_Membership and aspnet_Users tables. I can't really lay too much blame on the original authors because I know I've done similar before: expect the membership tables to be local (as part of the primary database) but over the years I've learned better so I set about removing those dependencies. Following are the steps required to break the ASP.NET membership stuff away from Kigg to allow you to use an external data store for membership.&lt;/P&gt;
&lt;P&gt;1. Remove foreign key constraints between Kigg tables and asp.net membership tables. If I remember correctly there are three: Story -&amp;gt; aspnet_Users, Comment - &amp;gt; aspnet_Users, Vote -&amp;gt; aspnet_Users. &lt;/P&gt;
&lt;P&gt;2. [Optional] Remove asp.net membership tables, view, sprocs from the Kigg database. I did it manually, but you probably should use aspnet_regsql if you're going to remove them. &lt;/P&gt;
&lt;P&gt;3. Remove the User and Membership tables from the model, Kigg.dbml. Just open up the designer, click on them and hit the delete key then save.&lt;/P&gt;
&lt;P&gt;4. Update the UserItem model, adding the following public constructor. Rather than use the "else anonymous" branch you may want to throw a "user does not exist" exception or something like that, but setting it to a "generic" user was what I wanted for my situation.&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; UserItem(Guid membershipId)&lt;/PRE&gt;&lt;PRE&gt;{&lt;/PRE&gt;&lt;PRE class=alt&gt;    MembershipUser user = Membership.GetUser(membershipId);&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (user != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE class=alt&gt;    {&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.Name = user.UserName;&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.Email = user.Email;&lt;/PRE&gt;&lt;PRE&gt;    }&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;    {&lt;/PRE&gt;&lt;PRE class=alt&gt;        &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.Name = &lt;SPAN class=str&gt;"Anonymous"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE&gt;        &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.Email = &lt;SPAN class=str&gt;"anonymous@somedomain.com"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=alt&gt;    }&lt;/PRE&gt;&lt;PRE&gt;}&lt;/PRE&gt;&lt;/DIV&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;P&gt;5. Update the KiggDataContext model, replace any instance of:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;PostedBy = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; UserItem&lt;/PRE&gt;&lt;PRE&gt;   {&lt;/PRE&gt;&lt;PRE class=alt&gt;       Name = s.User.UserName,&lt;/PRE&gt;&lt;PRE&gt;       Email = s.User.UserDetail.Email&lt;/PRE&gt;&lt;PRE class=alt&gt;   }&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;with this: PostedBy = new UserItem(s.PostedBy)&lt;/P&gt;
&lt;P&gt;6. Add a new connectionstring to your web.config, probably named something like "Membership" :), to point to your membership database.&lt;/P&gt;
&lt;P&gt;7. Update the Membership, RoleManager, and Profiles providers sections of your web.config to use the new connection string. Remember to change the "ApplicationName" property if appropriate.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;That's all you need to do. Now you can use Kigg in conjunction with any other existing applications and/or membership store you already have.&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx&amp;amp;;subject=How+to+decouple+the+ASP.NET+Membership+database+from+Kigg" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx&amp;amp;;title=How+to+decouple+the+ASP.NET+Membership+database+from+Kigg" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx&amp;amp;;title=How+to+decouple+the+ASP.NET+Membership+database+from+Kigg" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx&amp;amp;;title=How+to+decouple+the+ASP.NET+Membership+database+from+Kigg&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9623" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Kigg/default.aspx">Kigg</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category></item><item><title>Now with a picture</title><link>http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx</link><pubDate>Fri, 11 Jul 2008 06:29:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9594</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>2</slash:comments><description>&lt;P mce_keep="true"&gt;I finally got around to adding a picture of me to this blog, thanks to some prodding (you know who you are!). After doing so I realized that this theme is getting a little bit crowded and dated. I hate to add to my to-do list but I'm now in search of something else.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Move my personal blog to &lt;A class="" title=Graffiti href="http://graffiticms.com/" mce_href="http://graffiticms.com/"&gt;Graffiti&lt;/A&gt;.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Choose one of the existing out of the box Graffiti themes, choose one of &lt;A class="" title="Rich Mercer does Graffiti Themes!" href="http://richmercer.com/blog/bonus-graffiti-themes-pointspace-orange-amp-blue/" mce_href="http://richmercer.com/blog/bonus-graffiti-themes-pointspace-orange-amp-blue/"&gt;Rich's themes&lt;/A&gt; - I really like the PointSpace one, or create a new one. I want something much simpler than this one whatever way I choose to go.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Convert the rest of this site (families blogs) to &lt;A class="" title="Community Server" href="http://communityserver.com/" mce_href="http://communityserver.com"&gt;Community Server 2008&lt;/A&gt; or Graffiti - I haven't decided&amp;nbsp;which yet - probably Graffiti. I hate to give up running a copy of our flagship product day-to-day, but I really only use it for blogs and photos and Graffiti will handle what I need. Maybe I'll find somewhere else to run Community Server :)&lt;/DIV&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx&amp;amp;;subject=Now+with+a+picture" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx&amp;amp;;title=Now+with+a+picture" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx&amp;amp;;title=Now+with+a+picture" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx&amp;amp;;title=Now+with+a+picture&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9594" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Personal/default.aspx">Personal</category></item><item><title>Lan &amp; Deon #1</title><link>http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx</link><pubDate>Wed, 09 Jul 2008 11:59:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9550</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>6</slash:comments><description>&lt;P mce_keep="true"&gt;Hopefully the first of many...&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A title="Not that there is anything wrong with tramp stamps. Just not on Deon." href="http://danhounshell.com/photos/diggerdanh/picture9549.aspx" target=_blank mce_href="http://danhounshell.com/photos/diggerdanh/picture9549.aspx"&gt;&lt;IMG alt="Not that there is anything wrong with tramp stamps. Just not on Deon." src="http://danhounshell.com/photos/diggerdanh/images/9549/500x375.aspx" border=0 mce_src="http://danhounshell.com/photos/diggerdanh/images/9549/500x375.aspx"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx&amp;amp;;subject=Lan+%26amp%3b+Deon+%231" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx&amp;amp;;title=Lan+%26amp%3b+Deon+%231" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx&amp;amp;;title=Lan+%26amp%3b+Deon+%231" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx&amp;amp;;title=Lan+%26amp%3b+Deon+%231&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9550" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Lan+and+Deon/default.aspx">Lan and Deon</category></item><item><title>AspDotNetMVC.com</title><link>http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx</link><pubDate>Tue, 08 Jul 2008 04:32:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9527</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>1</slash:comments><description>&lt;P&gt;I know what you're thinking, "Three posts in one day? This can't be the same blog I've been following for the last month or so. What is wrong with my RSS reader?" As far as I know there is nothing wrong with your RSS reader. This is my third post today. &lt;/P&gt;
&lt;P&gt;My recent lack of regular blog posts and my sadly unnoticed disappearance from Twitter and the rest of the microblogging universe can simply be explained by the following:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Doing some recovering and catching up on delinquent household maintenance after speaking at four regional Days of .NET over a five week period a couple of months ago.&lt;/LI&gt;
&lt;LI&gt;Some family time (see above)&lt;/LI&gt;
&lt;LI&gt;A couple of deep dives into some new(er) technologies, specifically LINQ to SQL and a peek at ASP.NET MVC&lt;/LI&gt;
&lt;LI&gt;The transition to &lt;A title="Hello Community Server Team" href="http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx" mce_href="http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx"&gt;the new job that I mentioned in my previous post&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;My newest baby, &lt;A title=ASPDotNetMVC.com href="http://aspdotnetmvc.com/" mce_href="http://aspdotnetmvc.com/"&gt;ASPDotNetMVC.com&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;The first couple of items are nothing worth writing about. The third item has caused me to create a couple of blog posts about LINQ and ASP.NET MVC. I covered the new job in my previous post. What I really want to tell you about is my newest site, &lt;A href="http://aspdotnetmvc.com/" mce_href="http://aspdotnetmvc.com/"&gt;ASPDotNetMVC.com&lt;/A&gt;, which I believe &lt;A title="Keith Elder's Blog" href="http://keithelder.net/blog/" mce_href="http://keithelder.net/blog/"&gt;Keith Elder&lt;/A&gt; called "YADHS" - Yet Another Dan Hounshell Site. &lt;/P&gt;
&lt;P&gt;&lt;A title="Michael Eaton's Blog - The ASP.NET MVC Information Portal" href="http://michaeleatonconsulting.com/blog/archive/2008/07/01/the-asp.net-mvc-information-portal.aspx" mce_href="http://michaeleatonconsulting.com/blog/archive/2008/07/01/the-asp.net-mvc-information-portal.aspx"&gt;Mike Eaton beat me to the punch and attributed the site to me&lt;/A&gt; early last week, but let me catch you up anyway. I won't go into too much detail about the why's and how's here because I think I did a pretty good job of covering the why on &lt;A title="About ASPDotNetMVC.com" href="http://aspdotnetmvc.com/about/" mce_href="http://aspdotnetmvc.com/about/"&gt;the About page of the site itself&lt;/A&gt;. Briefly, I started diving into ASP.NET MVC and found lots of information (great blog posts, articles, lots of stuff on Twitter, etc) but no one place served as the hub for all that information. There was no official Microsoft site, like with &lt;A title=Silverlight.net href="http://silverlight.net/" mce_href="http://silverlight.net"&gt;Silverlight.net&lt;/A&gt;, to serve as a starting point and launch point. I said to myself that there should be a portal for everything ASP.NET MVC, asked myself why I shouldn't be the one to build it, decided to take the plunge, found a good domain name and went about doing that voodoo that I do.&lt;/P&gt;
&lt;P&gt;The site is really pretty simple, it's just made up of a bunch of little pieces that do just the one thing and do it well. And each of the little pieces work pretty well together. I was explaining how simple it was to Mike last week and when I finished he said, "Wow, that sounds awesome... I don't know how to do any of those things. You should make this an open source application." I'm not sure that I'm quite ready to do that just yet because I have plans for a similar site on a similar topic. But there are a couple of pieces that I do plan on sharing - one of them being a very simple Pingback library. &lt;/P&gt;
&lt;P&gt;On the plus side for me the site basically runs itself. Now that I have all of the basic parts in place and I've finished all the features planned for Iteration 1* (and some of Iteration 2) it doesn't require much day-to-day from me. There are some other things that I'd like to add to the site over time, as I have time, to build in more "Community". One of those is building voting for blog posts, articles, etc, that are listed on the site by integrating with &lt;A title=Kigg href="http://codeplex.com/Kigg" mce_href="http://codeplex.com/Kigg"&gt;Kigg&lt;/A&gt;, an open source MVC starter kit application on CodePlex. I'm about 60% finished with this, I just need to add some final touches and some polish. Additionally I'd like to definitely add forums (not much of a surprise there, huh? :) ) and then depending on how that goes taking a look at adding blogs and other Community Server community features.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;* Side Note - RE: Iteration #1 - I treated this as a real project with a lot of help from &lt;A title=unfuddle href="http://unfuddle.com/" mce_href="http://unfuddle.com/"&gt;Unfuddle&lt;/A&gt;, which I discovered a couple of months ago based on the recommendation from a buddy to look into it for free SVN hosting. Unfuddle can do that and oh so much more. More posts on Unfuddle are queued up in Windows Live Writer and should be coming soon.&lt;/EM&gt;&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx&amp;amp;;subject=AspDotNetMVC.com" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx&amp;amp;;title=AspDotNetMVC.com" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx&amp;amp;;title=AspDotNetMVC.com" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx&amp;amp;;title=AspDotNetMVC.com&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9527" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/AspDotNetMVC.com/default.aspx">AspDotNetMVC.com</category></item><item><title>Hello Community Server Team</title><link>http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx</link><pubDate>Tue, 08 Jul 2008 03:36:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9524</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>8</slash:comments><description>&lt;P&gt;The last couple of weeks have been very busy and very different for me. Two weeks ago today I relinquished my hold on the ASP.NET Sites' Team, where for nearly the last two years I have been working on &lt;A href="http://www.asp.net/" mce_href="http://www.asp.net"&gt;www.asp.net&lt;/A&gt;, &lt;A title=forums.asp.net href="http://forums.asp.net/" mce_href="http://forums.asp.net"&gt;forums.asp.net&lt;/A&gt;, &lt;A title=weblogs.asp.net href="http://weblogs.asp.net/" mce_href="http://weblogs.asp.net"&gt;weblogs.asp.net&lt;/A&gt; and &lt;A title=wiki.asp.net href="http://wiki.asp.net/" mce_href="http://wiki.asp.net"&gt;wiki.asp.net&lt;/A&gt;. I transitioned to the &lt;A title="Telligent Systems" href="http://telligent.com/" mce_href="http://telligent.com"&gt;Telligent&lt;/A&gt; Product Team, specifically the &lt;A title="Community Server" href="http://communityserver.com/" mce_href="http://communityserver.com"&gt;Community Server&lt;/A&gt; Team. Joining the CS team was actually a goal of mine since I joined Telligent in September 2006. Since I started in the business (early '99) I've always been part of a services-based team, building and maintaining sites for clients. For a few years I've wanted to take a peek at the greener grass on the other side of the fence to see what working as part of a product-based team was like. I am not disappointed - it has been great. And the team that I work with is made up of unbelievably talented and hard-working individuals. They are really amazing and I am really amazed to be part of such a team.&lt;/P&gt;
&lt;P&gt;While I've worked with Community Server nearly every day for the past two years (and some before that, and .Text and ASP.NET Forums before that) there has still been quite a learning curve for me. There is a big difference between working &lt;STRONG&gt;with&lt;/STRONG&gt; Community Server and working &lt;STRONG&gt;on&lt;/STRONG&gt; Community Server. I imagine the same can be said for nearly any product. I hope my never-ending barrage of email questions to the rest of the team isn't growing tiring. But I think I see light at the end of the tunnel and I think I'm starting to get warmed up.&lt;/P&gt;
&lt;P&gt;&lt;A title=FallenRogue href="http://fallenrogue.com/" mce_href="http://fallenrogue.com"&gt;&lt;IMG style="MARGIN: 5px" height=193 alt="Leon Gersing's Facebook profile" src="http://badge.facebook.com/badge/574101921.114.874186882.png" width=120 align=right border=0 mce_src="http://badge.facebook.com/badge/574101921.114.874186882.png"&gt;&lt;/A&gt;My petty personal feelings of inadequacy aside, I'm really pumped about the direction we are taking Community Server, the new features we are adding, and the glut of just really cool stuff that I am seeing showing up in the build each and every day. Josh just today posted &lt;A title="what to expect from the Community Server 2008.1 release this fall" href="http://evolvingwe.com/software/what-to-expect-in-cs-2008-1-this-fall/" mce_href="http://evolvingwe.com/software/what-to-expect-in-cs-2008-1-this-fall/"&gt;a really good overview of what to expect from the Community Server 2008.1 release this fall.&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;BTW, yes &lt;A title="Jobs at Telligent" href="http://jobburner.com/search/?t=telligent" mce_href="http://jobburner.com/search/?t=telligent"&gt;we're still hiring&lt;/A&gt;. If you are a good SharePoint dev you could &lt;A class="" title="Fallen Rogue - Leon Gersing" href="http://www.fallenrogue.com/articles/265-Wanna-hear-me-complain-in-person-Work-for-Telligent" mce_href="http://www.fallenrogue.com/articles/265-Wanna-hear-me-complain-in-person-Work-for-Telligent"&gt;work hand-in-hand with this guy&lt;/A&gt; (pictured at right), who is inarguably the best SharePoint developer in the country - at least that's what he tells me. Finally, if you live and breath Community Server then consider joining us for our 2nd Annual Conference, &lt;A title="in.Telligent 2008" href="http://in.telligent.com/" mce_href="http://in.telligent.com/"&gt;in.Telligent 2008&lt;/A&gt;, in Dallas in October.&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx&amp;amp;;subject=Hello+Community+Server+Team" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx&amp;amp;;title=Hello+Community+Server+Team" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx&amp;amp;;title=Hello+Community+Server+Team" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx&amp;amp;;title=Hello+Community+Server+Team&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9524" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Community+Server/default.aspx">Community Server</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/Telligent/default.aspx">Telligent</category></item><item><title>A Cheap and Green Windows Home Server</title><link>http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx</link><pubDate>Mon, 07 Jul 2008 15:26:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9517</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>0</slash:comments><description>&lt;P&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; MARGIN: 5px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=227 alt=image src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/BuildaGreenWindowsHomeServerfor400_7A74/image_3.png" width=244 align=right border=0 mce_src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/BuildaGreenWindowsHomeServerfor400_7A74/image_3.png"&gt;A couple of months ago I wrote two posts with some specs that I had been considering for building an inexpensive Windows Home Server ("&lt;A title="In Search of an eco-friendly economical Home Server" href="http://danhounshell.com/blogs/dan/archive/2008/03/27/in-search-of-an-eco-friendly-economical-home-server.aspx" mce_href="http://danhounshell.com/blogs/dan/archive/2008/03/27/in-search-of-an-eco-friendly-economical-home-server.aspx"&gt;In Search of an eco-friendly economical Home Server&lt;/A&gt;" and "&lt;A title="In Search of an eco-friendly economical Home Server 2" href="http://danhounshell.com/blogs/dan/archive/2008/03/28/in-search-of-an-eco-friendly-economical-home-server-2-electric-boogaloo.aspx" mce_href="http://danhounshell.com/blogs/dan/archive/2008/03/28/in-search-of-an-eco-friendly-economical-home-server-2-electric-boogaloo.aspx"&gt;In Search of an eco-friendly economical Home Server 2&lt;/A&gt;"). Unfortunately I have yet to pull the trigger on buying the hardware to build a little WHS box, but I am getting closer (and smaller and more energy efficient) to buying and building. I will post a list of parts once I've made my decision and completed my order. &lt;/P&gt;
&lt;P&gt;In the meantime I found an article a few weeks ago on &lt;A title="Home Server Hacks" href="http://www.homeserverhacks.com/" mce_href="http://www.homeserverhacks.com"&gt;Home Server Hacks&lt;/A&gt; about &lt;A title="building a WHS server on a Shuttle KPC Barebone setup for around $400" href="http://www.homeserverhacks.com/2008/04/build-green-400-windows-home-server_2871.html" mce_href="http://www.homeserverhacks.com/2008/04/build-green-400-windows-home-server_2871.html"&gt;building a WHS server on a Shuttle KPC Barebone setup for around $400&lt;/A&gt; ($409 including the price of WHS!). That is tough to beat and I think you can actually do better now as the cost of the Shuttle KPC Barebone has dropped $10, the cost of hard drive used in the example has dropped $15, and you can now get a little bit more processor for less money than when the article was originally published. I think you can easily come in under $400, including shipping.&lt;/P&gt;
&lt;P&gt;&lt;A title=http://www.homeserverhacks.com/2008/04/build-green-400-windows-home-server_2871.html href="http://www.homeserverhacks.com/2008/04/build-green-400-windows-home-server_2871.html" mce_href="http://www.homeserverhacks.com/2008/04/build-green-400-windows-home-server_2871.html"&gt;http://www.homeserverhacks.com/2008/04/build-green-400-windows-home-server_2871.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Taking that idea and running with it - what if you started with this &lt;A title="Intel Atom 945GC Mini ITX Motherboard/CPU Combo" href="http://www.newegg.com/Product/Product.aspx?Item=N82E16813121342" mce_href="http://www.newegg.com/Product/Product.aspx?Item=N82E16813121342"&gt;Intel Atom 945GC Mini ITX Motherboard/CPU Combo&lt;/A&gt; as a base. Check out the Combo deal that includes the board/cpu with the &lt;A title="tiny little APEX case" href="http://www.newegg.com/Product/Product.aspx?Item=N82E16811154084" mce_href="http://www.newegg.com/Product/Product.aspx?Item=N82E16811154084"&gt;tiny little APEX case&lt;/A&gt; for $118! Add a stick of RAM and a &lt;A title="Western Digital Green Power Hard Drive" href="http://www.newegg.com/Product/Product.aspx?Item=N82E16822136149" mce_href="http://www.newegg.com/Product/Product.aspx?Item=N82E16822136149"&gt;WD Green Power drive or two&lt;/A&gt; and that would be slick, small, and energy efficient package!&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx&amp;amp;;subject=A+Cheap+and+Green+Windows+Home+Server" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx&amp;amp;;title=A+Cheap+and+Green+Windows+Home+Server" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx&amp;amp;;title=A+Cheap+and+Green+Windows+Home+Server" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx&amp;amp;;title=A+Cheap+and+Green+Windows+Home+Server&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9517" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Windows+Home+Server/default.aspx">Windows Home Server</category></item><item><title>Upgrading Kigg Unit Tests to MVC ASP.NET Preview 3</title><link>http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx</link><pubDate>Sun, 22 Jun 2008 04:11:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9406</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>5</slash:comments><description>&lt;P&gt;Yesterday &lt;A title="I posted about updating Kigg to Preview 3" href="http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx" mce_href="http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx"&gt;I posted about updating Kigg to Preview 3&lt;/A&gt;. Immediately after publishing that post I realized that other than doing a find-and-replace of some of the code in the unit tests I had not tried running them, I assumed they would work. Bad assumption, lesson learned. &lt;/P&gt;
&lt;P&gt;While upgrading the code for the Kigg web site was fairly simple, upgrading the unit tests to get all passing green lights was not as easy. The biggest issue was that in Preview 2 the return type of the Contoller methods were void, whereas in Preview 3 they are ActionResult. The unit tests had to be refactored to use that ActionResult. Below is an example of before and after:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Before - based on Preview 2&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;controller.Category(&lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Assert.AreEqual(viewEngine.ViewContext.ViewName, &lt;SPAN class=str&gt;"Category"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;Assert.IsInstanceOfType(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(StoryListByCategoryData), viewEngine.ViewContext.ViewData);&lt;/PRE&gt;&lt;PRE class=alt&gt;Assert.AreEqual(((StoryListByCategoryData)viewEngine.ViewContext.ViewData.Model).Category, &lt;SPAN class=str&gt;"All"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;Assert.AreEqual(((StoryListByCategoryData)viewEngine.ViewContext.ViewData.Model).PageCount, 200);&lt;/PRE&gt;&lt;PRE class=alt&gt;Assert.AreEqual(((StoryListByCategoryData)viewEngine.ViewContext.ViewData.Model).CurrentPage, 1);&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;STRONG&gt;After - based on Preview 3&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;ViewResult viewResult = (ViewResult)controller.Category(&lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Assert.AreEqual(viewResult.ViewName, &lt;SPAN class=str&gt;"Category"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;Assert.IsInstanceOfType(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(StoryListByCategoryData), viewResult.ViewData.Model);&lt;/PRE&gt;&lt;PRE class=alt&gt;Assert.AreEqual(((StoryListByCategoryData)viewResult.ViewData.Model).Category, &lt;SPAN class=str&gt;"All"&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE&gt;Assert.AreEqual(((StoryListByCategoryData)viewResult.ViewData.Model).PageCount, 200);&lt;/PRE&gt;&lt;PRE class=alt&gt;Assert.AreEqual(((StoryListByCategoryData)viewResult.ViewData.Model).CurrentPage, 1);&lt;/PRE&gt;&lt;/DIV&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;P&gt;You'll see that I cast the return type as ViewResult in this case, in three cases (discussed more below) it should be RedirectToRouteResult.&lt;/P&gt;
&lt;P&gt;The other major change, which took me a while to figure out, is in the three tests that previously expected a redirect. Those three tests need to be changed from expecting the redirect to expecting a RedirectToRouteResult with the proper values. Below is an example of before and after:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Before - based on Preview 2&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; (mocks.Record())&lt;/PRE&gt;&lt;PRE&gt;{&lt;/PRE&gt;&lt;PRE class=alt&gt;     mocks.MockControllerContext(controller);&lt;/PRE&gt;&lt;PRE&gt;     Expect.Call(&lt;SPAN class=kwrd&gt;delegate&lt;/SPAN&gt; { controller.HttpContext.Response.Redirect(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;.Empty); }).IgnoreArguments();&lt;/PRE&gt;&lt;PRE class=alt&gt;}&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; (mocks.Playback())&lt;/PRE&gt;&lt;PRE class=alt&gt;{&lt;/PRE&gt;&lt;PRE&gt;     Assert.IsNull(viewEngine.ViewContext);&lt;/PRE&gt;&lt;PRE class=alt&gt;}&lt;/PRE&gt;&lt;/DIV&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;P&gt;&lt;STRONG&gt;After - based on Preview 3&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; (mocks.Record())&lt;/PRE&gt;&lt;PRE&gt;{&lt;/PRE&gt;&lt;PRE class=alt&gt;     mocks.MockControllerContext(controller);&lt;/PRE&gt;&lt;PRE&gt;     &lt;SPAN class=rem&gt;//Expect.Call(delegate { controller.HttpContext.Response.Redirect(string.Empty); }).IgnoreArguments();&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;}&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; (mocks.Playback())&lt;/PRE&gt;&lt;PRE class=alt&gt;{&lt;/PRE&gt;&lt;PRE&gt;     RedirectToRouteResult actionResult = (RedirectToRouteResult)controller.Tag(&lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE class=alt&gt;     Assert.IsNotNull(actionResult);&lt;/PRE&gt;&lt;PRE&gt;     Assert.AreEqual(&lt;SPAN class=str&gt;"category"&lt;/SPAN&gt;, actionResult.Values[&lt;SPAN class=str&gt;"action"&lt;/SPAN&gt;].ToString().ToLower());&lt;/PRE&gt;&lt;PRE class=alt&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;For now I just commented out the call to expect the HTTP Redirect in the mock setup. The change is that the return value is now checked for NotNull rather than the context being checked for IsNull before and then the "action" value is checked to make sure it is "category". All three unit tests about redirects are expecting a redirect to the category action so the code is basically the same for all three.&lt;/P&gt;
&lt;P&gt;BTW, I used the NUnit tests project, but I'm sure updates to the VSTest project would be similar if not the same.&lt;/P&gt;
&lt;P&gt;Hopefully, I've now corrected my foul. I know I'm a lot happier now that I see all green when I run my tests. :)&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx&amp;amp;;subject=Upgrading+Kigg+Unit+Tests+to+MVC+ASP.NET+Preview+3" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx&amp;amp;;title=Upgrading+Kigg+Unit+Tests+to+MVC+ASP.NET+Preview+3" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx&amp;amp;;title=Upgrading+Kigg+Unit+Tests+to+MVC+ASP.NET+Preview+3" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx&amp;amp;;title=Upgrading+Kigg+Unit+Tests+to+MVC+ASP.NET+Preview+3&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9406" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Kigg/default.aspx">Kigg</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category></item><item><title>Upgrading Kigg to ASP.NET MVC Preview 3</title><link>http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx</link><pubDate>Sat, 21 Jun 2008 06:15:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9401</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>3</slash:comments><description>&lt;P&gt;I downloaded &lt;A title="Kigg - A Digg clone written with ASP.NET MVC" href="http://www.codeplex.com/Kigg" mce_href="http://www.codeplex.com/Kigg"&gt;Kigg&lt;/A&gt; from CodePlex, a Digg like application written with ASP.NET MVC, a few weeks ago and began playing around with it this evening. The current source code is setup for the MIX08 Preview 2 version not the current version, Preview 3. I have Preview 3 installed and did not want to go back so I set about updating it. The process went pretty well considering this was my first time really doing anything with the MVC framework. &lt;/P&gt;
&lt;P&gt;I plan on submitting a patch of the needed updates once I can actually connect to the source code repo (I'm able to do so with other projects on CodePlex, like &lt;A title=SVNBridge href="http://www.codeplex.com/SVNBridge" mce_href="http://www.codeplex.com/SVNBridge"&gt;SVNBridge&lt;/A&gt;, but I am having trouble specifically with Kigg). But in the meantime if you'd like to upgrade Kigg to Preview 3 simply follow the steps in the &lt;A title="Preview 3 Readme Release Notes" href="http://download.microsoft.com/download/1/1/a/11a63bc7-7124-42b5-a3ce-c54d1d45561d/Preview3%20Readme.doc" mce_href="http://download.microsoft.com/download/1/1/a/11a63bc7-7124-42b5-a3ce-c54d1d45561d/Preview3%20Readme.doc"&gt;Preview 3 Readme Release Notes&lt;/A&gt; in the section "Upgrading an Existing Preview2 Application to Preview 3" and it will work fine. Those instructions along with some help from Intellisense and the C# compiler are all that you'll need to do so.&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx&amp;amp;;subject=Upgrading+Kigg+to+ASP.NET+MVC+Preview+3" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx&amp;amp;;title=Upgrading+Kigg+to+ASP.NET+MVC+Preview+3" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx&amp;amp;;title=Upgrading+Kigg+to+ASP.NET+MVC+Preview+3" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx&amp;amp;;title=Upgrading+Kigg+to+ASP.NET+MVC+Preview+3&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9401" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Kigg/default.aspx">Kigg</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/ASP.NET+MVC/default.aspx">ASP.NET MVC</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/CodePlex/default.aspx">CodePlex</category></item><item><title>LINQ to SQL - How to "Where in (value1,value2, ... valueN)"</title><link>http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx</link><pubDate>Tue, 17 Jun 2008 18:33:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9349</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>5</slash:comments><description>&lt;P&gt;According to FeedBurner the count of my blog subscribers has been steadily decreasing the last couple of weeks. I can't blame those quitters because my posts have been few and far between. But for those of you beautiful and intelligent people with enough patience to wait for something worthwhile - you're in luck today.&lt;/P&gt;
&lt;P&gt;Several days ago I was working with a LINQ to SQL statement where I wanted to get an item if it's name existed in a string array of passed in values. I needed a LINQ translation for the SQL " where in (value1, value2, ... , valueN)" syntax. Intellisense provided little value. I had to turn to Google for answers. Do you realize how difficult it is to search for the keyword "in" on Google?!? It was nightmare. I think I got lucky when I tried "where in value". I found this post from &lt;A title="Dan Wahlin" href="http://weblogs.asp.net/dwahlin/" mce_href="http://weblogs.asp.net/dwahlin/"&gt;Dan Wahlin&lt;/A&gt; that provided an example of exactly what I was trying to do:&lt;/P&gt;
&lt;P&gt;&lt;A title=http://weblogs.asp.net/dwahlin/archive/2008/05/09/using-linq-to-perform-quot-where-in-value1-value2-quot-queries.aspx href="http://weblogs.asp.net/dwahlin/archive/2008/05/09/using-linq-to-perform-quot-where-in-value1-value2-quot-queries.aspx" mce_href="http://weblogs.asp.net/dwahlin/archive/2008/05/09/using-linq-to-perform-quot-where-in-value1-value2-quot-queries.aspx"&gt;http://weblogs.asp.net/dwahlin/archive/2008/05/09/&lt;WBR&gt;using-linq-to-perform-quot-where-in-value1-value2-quot-queries.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The solution is actually rather simple if you look at it from a programming perspective, but I have a tough time remembering that LINQ is not a SQL syntax, but is instead a first class part of the framework/language that is used for querying. Below is the example that Dan provided in his post:&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; Product[] GetProducts(Guid[] prodIDs)
{
    &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; GetProducts().Where(p =&amp;gt; prodIDs.Contains(p.ProductID)).ToArray&amp;lt;Product&amp;gt;();
}&lt;/PRE&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;P&gt;Just like you can say "if (myobj == null)" and it means the same thing as "if (null == myobj)" the LINQ syntax is a bit clearer if you think about reversing the order of the equality. So instead of thinking about it as "if my object is in this bucket" think of it instead as "if this bucket contains my object". After seeing this it made sense to me. And LINQ and I became closer, maybe even friends. &lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx&amp;amp;;subject=LINQ+to+SQL+-+How+to+%26quot%3bWhere+in+(value1%2cvalue2%2c+...+valueN)%26quot%3b" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx&amp;amp;;title=LINQ+to+SQL+-+How+to+%26quot%3bWhere+in+(value1%2cvalue2%2c+...+valueN)%26quot%3b" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx&amp;amp;;title=LINQ+to+SQL+-+How+to+%26quot%3bWhere+in+(value1%2cvalue2%2c+...+valueN)%26quot%3b" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx&amp;amp;;title=LINQ+to+SQL+-+How+to+%26quot%3bWhere+in+(value1%2cvalue2%2c+...+valueN)%26quot%3b&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9349" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/SQL/default.aspx">SQL</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Things I learned this weekend</title><link>http://danhounshell.com/blogs/dan/archive/2008/06/02/things-i-learned-this-weekend.aspx</link><pubDate>Mon, 02 Jun 2008 14:34:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9208</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>8</slash:comments><description>&lt;P&gt;&lt;STRONG&gt;Wield Chkdsk sparingly&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Do not set large hard drives (and especially not two large hard drives) to run an error check (chkdsk) on next reboot if: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;your PC only supports USB keyboards and &lt;/LI&gt;
&lt;LI&gt;your PC's bios does not support "Legacy USB settings" and &lt;/LI&gt;
&lt;LI&gt;you've never installed the Recovery Console to your PC.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;You'll have no way to cancel the chkdsk* and you'll have to wait several (like 12+) hours for it to complete. No, regular Safe Mode doesn't help, because it still tries to run chkdsk before booting the OS.&lt;/P&gt;
&lt;P&gt;* - "no way" technically is not correct. If you had another OS installed then you may be able to boot into it and update the dirty flags on the hard drives so you could&amp;nbsp;get around&amp;nbsp;the chkdsk. Something like a Live CD from a Linux distribution might work. I'm sure there are other alternatives as well. "no way that the average PC user would consider easy" is probably the proper phrasing.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;LINQ to SQL is gooood!&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;LINQ to SQL creates SQL just as good as I would write by hand, and most of the times better, and sometimes much better.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.linqpad.net/" mce_href="http://www.linqpad.net/"&gt;LINQPad&lt;/A&gt; = For The WIN !!!&lt;/LI&gt;
&lt;LI&gt;To gain a better understanding of LINQ to SQL use LINQPad to see what the query syntax looks like as Lambda syntax and SQL Profiler (and/or LINQPad) to see the SQL being generated. &lt;/LI&gt;
&lt;LI&gt;You can pass IQueryable around as many times as you want and the SQL is never executed until its turned into a list (think used as a datasource even if ToList() is not specifically called). I had a tough time wrapping my head around this one - SQL Profiler helped prove it to me.&lt;/LI&gt;
&lt;LI&gt;The new ListView + the new DataPager + LINQ = beautiful music&lt;/LI&gt;
&lt;LI&gt;Between LINQ to SQL, Subsonic, and Castle ActiveRecord I may never hand-code another line of SQL ever again.&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Miscellaneous&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;The installation of VS 2008 to my workstation was nowhere near as difficult as I'd feared it to be. As far as I can tell it didn't muck anything up.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://graphjam.com/" mce_href="http://graphjam.com/"&gt;GraphJam&lt;/A&gt; is hilarious&lt;/LI&gt;
&lt;LI&gt;a Sunday afternoon nap is not a blessing, it is a right !&lt;/LI&gt;&lt;/UL&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://danhounshell.com/blogs/dan/archive/2008/06/02/things-i-learned-this-weekend.aspx&amp;amp;;subject=Things+I+learned+this+weekend" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/02/things-i-learned-this-weekend.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/06/02/things-i-learned-this-weekend.aspx&amp;amp;;title=Things+I+learned+this+weekend" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/02/things-i-learned-this-weekend.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/06/02/things-i-learned-this-weekend.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/02/things-i-learned-this-weekend.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/06/02/things-i-learned-this-weekend.aspx&amp;amp;;title=Things+I+learned+this+weekend" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/0