<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss 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/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Digging My Blog - Dan Hounshell</title><link>http://danhounshell.com/blogs/dan/default.aspx</link><description>Another .Dan Powered Site</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><geo:lat>39.441008</geo:lat><geo:long>-84.365828</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/DiggingMyBlog" type="application/rss+xml" /><feedburner:emailServiceId>666364</feedburner:emailServiceId><feedburner:feedburnerHostname>http://www.feedburner.com</feedburner:feedburnerHostname><item><title>How to use Kigg as a service from other sites</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/335814788/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><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9640</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx#comments</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><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/07/15/how-to-use-kigg-as-a-service-from-other-sites.aspx</feedburner:origLink></item><item><title>How I got started in Software Development</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/334848020/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><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9627</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx#comments</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><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/07/14/how-i-got-started-in-software-development.aspx</feedburner:origLink></item><item><title>How to decouple the ASP.NET Membership database from Kigg</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/334803175/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>2</slash:comments><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9623</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx#comments</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><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/07/14/how-to-decouple-the-asp-net-membership-database-from-kigg.aspx</feedburner:origLink></item><item><title>Now with a picture</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/332443855/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><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9594</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx#comments</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><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/07/11/now-with-a-picture.aspx</feedburner:origLink></item><item><title>Lan &amp; Deon #1</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/330860617/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><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9550</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx#comments</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><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/07/09/lan-amp-deon-1.aspx</feedburner:origLink></item><item><title>AspDotNetMVC.com</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/329492213/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><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9527</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx#comments</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><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/07/08/aspdotnetmvc-com.aspx</feedburner:origLink></item><item><title>Hello Community Server Team</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/329469919/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>7</slash:comments><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9524</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx#comments</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><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/07/07/hello-community-server-team.aspx</feedburner:origLink></item><item><title>A Cheap and Green Windows Home Server</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/328975711/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><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9517</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx#comments</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><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/07/07/a-cheap-and-green-windows-home-server.aspx</feedburner:origLink></item><item><title>Upgrading Kigg Unit Tests to MVC ASP.NET Preview 3</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/317240895/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>4</slash:comments><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9406</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx#comments</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><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/06/22/upgrading-kigg-unit-tests-to-mvc-asp-net-preview-3.aspx</feedburner:origLink></item><item><title>Upgrading Kigg to ASP.NET MVC Preview 3</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/316721098/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><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9401</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx#comments</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><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/06/21/upgrading-kigg-to-asp-net-mvc-preview-3.aspx</feedburner:origLink></item><item><title>LINQ to SQL - How to "Where in (value1,value2, ... valueN)"</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/314001061/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><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9349</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx#comments</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><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/06/17/linq-to-sql-how-to-quot-where-in-value1-value2-valuen-quot.aspx</feedburner:origLink></item><item><title>Things I learned this weekend</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/303011258/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><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9208</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/06/02/things-i-learned-this-weekend.aspx#comments</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/06/02/things-i-learned-this-weekend.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/02/things-i-learned-this-weekend.aspx&amp;amp;;title=Things+I+learned+this+weekend&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/06/02/things-i-learned-this-weekend.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9208" 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><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/06/02/things-i-learned-this-weekend.aspx</feedburner:origLink></item><item><title>Missing some Tweets from Friends on Twitter?</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/301947019/missing-some-tweets-from-friends-on-twitter.aspx</link><pubDate>Sat, 31 May 2008 17:21:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9197</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9197</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/05/31/missing-some-tweets-from-friends-on-twitter.aspx#comments</comments><description>&lt;P&gt;In the past month or so I've seen lots of comments from people stating something like, "I'm not getting all the tweets from my friends. I end up getting only part of the conversations." In addition to the recent poor performance from Twitter, I have a couple of other explanations, and some tips to help decrease some of the tweets you are missing.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Twitter has a request limit. Make sure you're using it wisely.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Twitter normally has a rate limit of 70 request per hour from any application:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Clients are allowed 70 requests per 60 sixty minute time period, starting from their first request.&amp;nbsp; This is enough to make just over one request per minute, per hour, which should meet the needs of most applications.&amp;nbsp; Rate limiting applies only to authenticated API requests; requests for the public timeline do not count.&amp;nbsp; POST requests (ex: updating status, sending a direct message) also do not count against the rate limit.&lt;/EM&gt;&amp;nbsp; &lt;BR&gt;&lt;A href="http://groups.google.com/group/twitter-development-talk/web/api-documentation#RateLimit"&gt;http://groups.google.com/group/twitter-development-talk/web/api-documentation#RateLimit&lt;/A&gt;&lt;A title=http://groups.google.com/group/twitter-development-talk/web/api-documentation href="http://groups.google.com/group/twitter-development-talk/web/api-documentation" mce_href="http://groups.google.com/group/twitter-development-talk/web/api-documentation"&gt;&lt;/A&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Understanding and making best use of this rate limit is important. Some desktop Twitter clients, Twhirl is an example, allow you to fine tune the number of requests you'd like to make per timeline (friends, replies, direct). Each one of these requests counts against your 70 per hour limit. Each of these types of requests to the API (friend, replies, direct) only return the last 20 messages of each type. So if you're only checking your friends timeline once every five minutes and your friends are making 30 updates in that five minutes there is a chance that you'll miss 10 of them. &lt;/P&gt;
&lt;P&gt;Now that you understand that you can see that there is an opportunity for tweaking the settings for your usage. There is no use wasting requests on direct messages if you only get a couple per day (like me). Instead you can reduce the amount of requests for direct messages and maximize your the requests to your friends timelines. On the other hand if you follow thousands of people, replies and direct messages may be more important to you so you would want to maximize those and reduce the noise of your friends timeline. Here is an example of my settings:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=344 alt=ratelimit src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/MissingTweetsImayknowwhy_B088/ratelimit_3.jpg" width=294 border=0 mce_src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/MissingTweetsImayknowwhy_B088/ratelimit_3.jpg"&gt; &lt;/P&gt;
&lt;P&gt;You can see that I have Tweets (friends timeline) sent to once per minute and replies and direct messages set lower. This greatly reduces the chance that I'll miss any tweets from my friends.&lt;/P&gt;
&lt;P&gt;NOTE: recently Twitter updated their API and stated that they reserve the right to limit requests to lower than normal rates to preserve system stability. As I write this post the limit is set to 30 requests/hour:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;[Added May 27, 2008] From time to time, Twitter may lower the rate limit to preserve system stability. To find the current rate limit, use &lt;/EM&gt;&lt;EM&gt;&lt;A href="http://twitter.com/account/rate_limit_status.xml" mce_href="http://twitter.com/account/rate_limit_status.xml"&gt;http://twitter.com/account/rate_limit_status.xml&lt;/A&gt; &lt;/EM&gt;&lt;EM&gt;(available in .xml and .json). Calls to rate_limit_status require authentication, but will not count against the rate limit.&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Understand the @replies Notification Settings&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;No doubt you've seen these options in the Settings &amp;gt; Notifications section of your Twitter account:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=304 alt=atreplies src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/MissingTweetsImayknowwhy_B088/atreplies_thumb.jpg" width=504 border=0 mce_src="http://danhounshell.com/blogs/dan/WindowsLiveWriter/MissingTweetsImayknowwhy_B088/atreplies_thumb.jpg"&gt;&lt;/P&gt;
&lt;P&gt;Notice the red circled option (I know it's hard to miss :)). The three options are&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;All @replies&lt;/LI&gt;
&lt;LI&gt;@replies to the people I'm following&lt;/LI&gt;
&lt;LI&gt;no @replies&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;The one shown in the image is the default setting. Without some further investigation you might believe that these options are about @replies made to you and that the default setting is sufficient. However, you'd be wrong - as was I. &lt;/P&gt;
&lt;P&gt;If you click on the "What is this?" link you'll be shown this page: &lt;A title=http://help.twitter.com/index.php?pg=kb.page&amp;amp;id=85 href="http://help.twitter.com/index.php?pg=kb.page&amp;amp;id=85" mce_href="http://help.twitter.com/index.php?pg=kb.page&amp;amp;id=85"&gt;http://help.twitter.com/index.php?pg=kb.page&amp;amp;id=85&lt;/A&gt;, which explains:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;In the &lt;/EM&gt;&lt;A href="http://twitter.com/account/notifications" mce_href="http://twitter.com/account/notifications"&gt;&lt;EM&gt;notices&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt; section of your settings page, you can choose how you will see the @replies of others.&amp;nbsp; You have three options: &lt;/EM&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;EM&gt;&lt;STRONG&gt;all @replies: &lt;/STRONG&gt;see all of the @replies made by people you follow, whether or not you follow the person to whom the reply is directed.&amp;nbsp; &lt;/EM&gt;
&lt;LI&gt;&lt;EM&gt;&lt;STRONG&gt;@replies to the people I'm following: &lt;/STRONG&gt;see @replies from people you follow directed toward other people that you also follow. This is the default setting. &lt;/EM&gt;
&lt;LI&gt;&lt;EM&gt;&lt;STRONG&gt;no @replies: &lt;/STRONG&gt;never see any @replies in your timeline, ever&lt;/EM&gt; &lt;/LI&gt;&lt;/UL&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;So you see that the options are not about @replies to you at all. They are about @replies the people you are following make. So if you keep the default setting you will never see updates from people you are following if they @reply someone you are not following. This may be the cause for some of your complaints about missing tweets from your friends. I recommend you change it to "all @replies".&lt;/P&gt;
&lt;P&gt;I believe that the items I discussed are the two primary reasons people miss tweets from their friends. Hopefully the two tips I've provided will improve your experience and lead to you living happily ever after.&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/05/31/missing-some-tweets-from-friends-on-twitter.aspx&amp;amp;;subject=Missing+some+Tweets+from+Friends+on+Twitter%3f" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/31/missing-some-tweets-from-friends-on-twitter.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/05/31/missing-some-tweets-from-friends-on-twitter.aspx&amp;amp;;title=Missing+some+Tweets+from+Friends+on+Twitter%3f" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/31/missing-some-tweets-from-friends-on-twitter.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/05/31/missing-some-tweets-from-friends-on-twitter.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/31/missing-some-tweets-from-friends-on-twitter.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/05/31/missing-some-tweets-from-friends-on-twitter.aspx&amp;amp;;title=Missing+some+Tweets+from+Friends+on+Twitter%3f" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/31/missing-some-tweets-from-friends-on-twitter.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/05/31/missing-some-tweets-from-friends-on-twitter.aspx&amp;amp;;title=Missing+some+Tweets+from+Friends+on+Twitter%3f&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/31/missing-some-tweets-from-friends-on-twitter.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9197" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Twitter/default.aspx">Twitter</category><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/05/31/missing-some-tweets-from-friends-on-twitter.aspx</feedburner:origLink></item><item><title>Who is digging TFF Ratio?</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/301021503/who-is-digging-tff-ratio.aspx</link><pubDate>Fri, 30 May 2008 05:22:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9188</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9188</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/05/30/who-is-digging-tff-ratio.aspx#comments</comments><description>&lt;P&gt;I noticed over the Memorial Day weekend that traffic for &lt;A title="Twitter Ratio" href="http://twitterratio.com/" mce_href="http://twitterratio.com"&gt;TwitterRatio.com&lt;/A&gt; picked up quite a bit. I've also seen the TFF Ratio auto-responder sending out replies to a lot of newcomers to the TFF party. I'm excited to see the site and bot getting some love and the following are some of the reasons Twitterers have discovered it recently:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;TwitterRatio.com on &lt;/STRONG&gt;&lt;A title=StumbleUpon href="http://www.stumbleupon.com/" mce_href="http://www.stumbleupon.com"&gt;&lt;STRONG&gt;StumbleUpon&lt;/STRONG&gt;&lt;/A&gt;&lt;BR&gt;&lt;A title=http://www.stumbleupon.com/url/twitterratio.com/ href="http://www.stumbleupon.com/url/twitterratio.com/" mce_href="http://www.stumbleupon.com/url/twitterratio.com/"&gt;http://www.stumbleupon.com/url/twitterratio.com/&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;TwitterRatio.com reviewed on &lt;/STRONG&gt;&lt;A title=SheGeeks.net href="http://shegeeks.net/" mce_href="http://shegeeks.net"&gt;&lt;STRONG&gt;SheGeeks.net&lt;/STRONG&gt;&lt;/A&gt;&lt;BR&gt;&lt;A title=http://shegeeks.net/twitter-apps-twitter-ratio-and-doesfollow/ href="http://shegeeks.net/twitter-apps-twitter-ratio-and-doesfollow/" mce_href="http://shegeeks.net/twitter-apps-twitter-ratio-and-doesfollow/"&gt;http://shegeeks.net/twitter-apps-twitter-ratio-and-doesfollow/&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;TwitterRatio.com reviewed on &lt;/STRONG&gt;&lt;A title=KillerStartups.com href="http://www.killerstartups.com/" mce_href="http://www.killerstartups.com"&gt;&lt;STRONG&gt;KillerStartups.com&lt;/STRONG&gt;&lt;/A&gt;&lt;BR&gt;&lt;A title=http://www.killerstartups.com/Web-App-Tools/twitterratiocom-get-follower-to-friend-ratio/ href="http://www.killerstartups.com/Web-App-Tools/twitterratiocom-get-follower-to-friend-ratio/" mce_href="http://www.killerstartups.com/Web-App-Tools/twitterratiocom-get-follower-to-friend-ratio/"&gt;http://www.killerstartups.com/Web-App-Tools/twitterratiocom-get-follower-to-friend-ratio/&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;TwitterRatio.com reviewed by &lt;/STRONG&gt;&lt;A title="Alana Taylor's Blog" href="http://alanataylor.blogspot.com/" mce_href="http://alanataylor.blogspot.com"&gt;&lt;STRONG&gt;Alana Taylor&lt;/STRONG&gt;&lt;/A&gt;&lt;BR&gt;&lt;A title=http://alanataylor.blogspot.com/2008/05/twitterratio.html href="http://alanataylor.blogspot.com/2008/05/twitterratio.html" mce_href="http://alanataylor.blogspot.com/2008/05/twitterratio.html"&gt;http://alanataylor.blogspot.com/2008/05/twitterratio.html&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;TwitterRatio.com listed in Twitter Links on &lt;/STRONG&gt;&lt;A title="Blogger's Blog" href="http://bloggersblog.com/" mce_href="http://bloggersblog.com"&gt;&lt;STRONG&gt;Blogger's Blog&lt;/STRONG&gt;&lt;/A&gt;&lt;BR&gt;&lt;A title=http://bloggersblog.com/twitterlinks/ href="http://bloggersblog.com/twitterlinks/" mce_href="http://bloggersblog.com/twitterlinks/"&gt;http://bloggersblog.com/twitterlinks/&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;TwitterRatio.com listed on &lt;/STRONG&gt;&lt;A title="Twitter Apps" href="http://twitterapps.co.uk/" mce_href="http://twitterapps.co.uk/"&gt;&lt;STRONG&gt;Twitter Apps&lt;/STRONG&gt;&lt;/A&gt;&lt;BR&gt;&lt;A title=http://twitterapps.co.uk/2008/05/23/twitter-ratio/ href="http://twitterapps.co.uk/2008/05/23/twitter-ratio/" mce_href="http://twitterapps.co.uk/2008/05/23/twitter-ratio/"&gt;http://twitterapps.co.uk/2008/05/23/twitter-ratio/&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;TwitterRatio.com listed in Twitter Tools on &lt;/STRONG&gt;&lt;A title=Mashable href="http://mashable.com/" mce_href="http://mashable.com/"&gt;&lt;STRONG&gt;Mashable&lt;/STRONG&gt;&lt;/A&gt;&lt;BR&gt;&lt;A title=http://mashable.com/2008/05/24/14-more-twitter-tools/ href="http://mashable.com/2008/05/24/14-more-twitter-tools/" mce_href="http://mashable.com/2008/05/24/14-more-twitter-tools/"&gt;http://mashable.com/2008/05/24/14-more-twitter-tools/&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Hooray! TwitterRatio.com is now the #1 result when searching on &lt;A title=Google href="http://google.com/" mce_href="http://google.com"&gt;Google&lt;/A&gt; for "Twitter ratio"&lt;/STRONG&gt;&lt;BR&gt;&lt;A title=http://www.google.com/search?q=twitter+ratio href="http://www.google.com/search?q=twitter+ratio" mce_href="http://www.google.com/search?q=twitter+ratio"&gt;http://www.google.com/search?q=twitter+ratio&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Additionally, TwitterRatio.com (TFF Ratio) is now registered as an application with Twitter. You'll now see "from TFF Ratio" (or "via TFF Ratio", depending on your Twitter Client) displayed with a link to TwitterRatio.com in all automated replies from TFF Ratio. Also, I'm told that TFF Ratio will be displayed as an App on the &lt;A title=Twitter href="http://twitter.com/" mce_href="http://twitter.com"&gt;Twitter&lt;/A&gt; site or &lt;A title="Twitter Fan Wiki" href="http://twitter.pbwiki.com/Apps" mce_href="http://twitter.pbwiki.com/Apps"&gt;Twitter Fan Wiki&lt;/A&gt; soon.&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/05/30/who-is-digging-tff-ratio.aspx&amp;amp;;subject=Who+is+digging+TFF+Ratio%3f" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/30/who-is-digging-tff-ratio.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/05/30/who-is-digging-tff-ratio.aspx&amp;amp;;title=Who+is+digging+TFF+Ratio%3f" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/30/who-is-digging-tff-ratio.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/05/30/who-is-digging-tff-ratio.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/30/who-is-digging-tff-ratio.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/05/30/who-is-digging-tff-ratio.aspx&amp;amp;;title=Who+is+digging+TFF+Ratio%3f" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/30/who-is-digging-tff-ratio.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/05/30/who-is-digging-tff-ratio.aspx&amp;amp;;title=Who+is+digging+TFF+Ratio%3f&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/30/who-is-digging-tff-ratio.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9188" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Twitter/default.aspx">Twitter</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/tffratio/default.aspx">tffratio</category><category domain="http://danhounshell.com/blogs/dan/archive/tags/Twitter+Ratio/default.aspx">Twitter Ratio</category><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/05/30/who-is-digging-tff-ratio.aspx</feedburner:origLink></item><item><title>Hannah Montana sings my favorite song</title><link>http://feeds.feedburner.com/~r/DiggingMyBlog/~3/291067317/hannah-montana-sings-my-favorite-song.aspx</link><pubDate>Thu, 15 May 2008 16:45:00 GMT</pubDate><guid isPermaLink="false">77552a6a-5aec-40f5-92f3-52e0639c4162:9068</guid><dc:creator>Dan Hounshell</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://danhounshell.com/blogs/dan/rsscomments.aspx?PostID=9068</wfw:commentRss><comments>http://danhounshell.com/blogs/dan/archive/2008/05/15/hannah-montana-sings-my-favorite-song.aspx#comments</comments><description>&lt;P&gt;Now I know why I couldn't get that new Hannah Montana (Miley Cyrus) song, "Rockstar", out of my head. It sounds a lot like one of my favorite songs of all time... Lustra's "Scotty doesn't know". Well that and the fact that my 9-year-old daughter plays it &lt;STRONG&gt;constantly&lt;/STRONG&gt;!&lt;/P&gt;
&lt;P&gt;&lt;A title="Read more and listen to both songs" href="http://www.eonline.com/uberblog/b137090_does_hannah_montana_know_scotty.html" mce_href="http://www.eonline.com/uberblog/b137090_does_hannah_montana_know_scotty.html"&gt;Read more and listen to both songs on E! Online.&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/05/15/hannah-montana-sings-my-favorite-song.aspx&amp;amp;;subject=Hannah+Montana+sings+my+favorite+song" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/15/hannah-montana-sings-my-favorite-song.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://danhounshell.com/blogs/dan/archive/2008/05/15/hannah-montana-sings-my-favorite-song.aspx&amp;amp;;title=Hannah+Montana+sings+my+favorite+song" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/15/hannah-montana-sings-my-favorite-song.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://danhounshell.com/blogs/dan/archive/2008/05/15/hannah-montana-sings-my-favorite-song.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/15/hannah-montana-sings-my-favorite-song.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://danhounshell.com/blogs/dan/archive/2008/05/15/hannah-montana-sings-my-favorite-song.aspx&amp;amp;;title=Hannah+Montana+sings+my+favorite+song" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/15/hannah-montana-sings-my-favorite-song.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/05/15/hannah-montana-sings-my-favorite-song.aspx&amp;amp;;title=Hannah+Montana+sings+my+favorite+song&amp;amp;;top=1" target="_blank" title = "Post http://danhounshell.com/blogs/dan/archive/2008/05/15/hannah-montana-sings-my-favorite-song.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://danhounshell.com/aggbug.aspx?PostID=9068" width="1" height="1"&gt;</description><category domain="http://danhounshell.com/blogs/dan/archive/tags/Music/default.aspx">Music</category><feedburner:origLink>http://danhounshell.com/blogs/dan/archive/2008/05/15/hannah-montana-sings-my-favorite-song.aspx</feedburner:origLink></item></channel></rss>
