<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://scottonwriting.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Scott On Writing.NET : Blog Enhancements</title><link>http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx</link><description>Tags: Blog Enhancements</description><dc:language>en</dc:language><generator>CommunityServer 2007 (Build: 20423.869)</generator><item><title>New Software Running ScottOnWriting.NET</title><link>http://scottonwriting.net/sowblog/archive/2010/05/27/new-software-running-scottonwriting-net.aspx</link><pubDate>Thu, 27 May 2010 18:50:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:163404</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=163404</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2010/05/27/new-software-running-scottonwriting-net.aspx#comments</comments><description>&lt;p&gt;When I &lt;a href="http://scottonwriting.net/sowblog/archive/2003/07/02/162659.aspx" mce_href="http://scottonwriting.net/sowblog/archive/2003/07/02/162659.aspx"&gt;started this blog in July 2003&lt;/a&gt; there weren't many available blog engines build atop ASP.NET. One of the more interesting ones at the time was &lt;a href="http://scottw.com/" mce_href="http://scottw.com/"&gt;Scott Watermasysk&lt;/a&gt;'s &lt;b&gt;.Text&lt;/b&gt; blog engine (which eventually became part of &lt;a href="http://telligent.com/" mce_href="http://telligent.com/"&gt;&lt;b&gt;Community Server&lt;/b&gt;&lt;/a&gt;. Over the past nearly seven years ScottOnWriting.NET has continued to be powered by .Text, even though the code base was discontinued circa 2004. There were two primary reasons I stuck with .Text for so long:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;I could find no easy way to migrate my existing content from .Text into Community Server. I believe there was such a tool created in the early days of Community Server, but I had no luck with it, as I recall. Eventually, this product disappeared and the only migration tools I could find were from older versions of Community Server to newer ones, but none for .Text.&lt;/li&gt;&lt;li&gt;There were URL changes between .Text and Community Server, so switching over would immediately result in a slew of broken URLs. I am &lt;a href="http://scottonwriting.net/sowblog/archive/2005/04/12/163063.aspx" mce_href="http://scottonwriting.net/sowblog/archive/2005/04/12/163063.aspx"&gt;a strong believer in URLs as public interfaces&lt;/a&gt; and view broken URLs and believe each broken URL makes the Internet that less useful. Plus it makes the Internet Founding Fathers - Tim Berners-Lee, Vint Cerf, and Al Gore - cry. &lt;img src="http://nbaweblog.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Well, this week I decided to take the plunge and move ScottOnWriting.NET and its hundreds of posts over to a new blog engine, namely Community Server (albeit an older version of Community Server - when will I learn?). I wrote some custom SQL scripts to (the best of my ability) move over all blog posts and categories (or tags, as they're called now-a-days). I also spent a good deal of time writing some regular expressions and very big switch statements to properly reroute URLs. For example, if you try to visit an old ScottOnWriting.NET URL, like http://scottonwriting.net/sowBlog/posts/145.aspx, you should be automatically redirected to the new URL, http://scottonwriting.net/sowBlog/archive/0000/00/00/162659.aspx. Likewise, if you visit an old category URL or an old moth/year archive URL you should be redirected to the new URLs. &lt;b&gt;If this is not the case, if you find a broken URL or other problem on this site, please &lt;a href="http://scottonwriting.net/sowblog/contact.aspx" mce_href="http://scottonwriting.net/sowblog/contact.aspx"&gt;let me know&lt;/a&gt;.&lt;/b&gt; &lt;/p&gt;&lt;p&gt;Note that I did not mention bringing over the past blog comments. I'm still on the fence as to whether I want to spend the time to do this. There were hundreds of comments left over the years, many of them quite helpful and many that added substantially to the discussion. However, I've already sunk a number of hours into this migration and am hesitant to burn too much more time. Plus I still have a number of aesthetic and cosmetic things to do, like update the site's CSS, add in some of the widgets from the original site that aren't part of the default Community Server setup, and so forth. My goal is to eventually import these past comments, but I wouldn't be at all surprised if this is still on my TODO list come 2011.&lt;/p&gt;&lt;p&gt;In closing, please do &lt;a href="http://scottonwriting.net/sowblog/contact.aspx" mce_href="http://scottonwriting.net/sowblog/contact.aspx"&gt;let me know if you run into any problems&lt;/a&gt; with the new blog engine.&lt;/p&gt;&lt;p&gt;Thanks! &lt;br&gt;&lt;/p&gt;&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=163404" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/Miscellaneous/default.aspx">Miscellaneous</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category></item><item><title>Search Your Site Using Google's Custom Search Engine</title><link>http://scottonwriting.net/sowblog/archive/2008/09/15/163311.aspx</link><pubDate>Mon, 15 Sep 2008 12:51:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:163311</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=163311</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2008/09/15/163311.aspx#comments</comments><description>&lt;p&gt;Remember when people used to debate what search engine was the best among the bunnch? Do you remember back in the day when Yahoo! differentiated itself from other search engines by having actual human beings catalog, summarize, and rate large swaths of the World Wide Web? Today, search is a commodity. It's ubiquitous. Web surfers expect there to be a search box and expect accurate results returned in the blink of an eye. Because of these expectations, it's now more important than ever that your website offers search. I don't care if the site has only five static web pages that only get updated once in a blue moon, you still need search. &lt;/p&gt;
&lt;p&gt;The good news is that Google offers free tools for quickly and easily adding search to your site. With Google's &lt;a href="http://www.google.com/coop/cse/"&gt;Custom Search Engine (CSE)&lt;/a&gt; you can add search to your site within a matter of minutes. All it takes is configuring a few settings and then copying and pasting a snippet or two of HTML and JavaScript into your site. A couple of months ago I used CSE to add search to this blog. You can find the search interface in the upper right hand corner of every page or by visiting the &lt;a href="http://scottonwriting.net/sowBlog/SearchResults.htm"&gt;Search page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To learn how to add a search engine to your site using CSE check out my latest article on &lt;a href="http://dotnetslackers.com/"&gt;DotNetSlackers&lt;/a&gt;: &lt;em&gt;&lt;a href="http://dotnetslackers.com/articles/aspnet/Implementing-Search-in-ASP-NET-with-Google-Custom-Search.aspx"&gt;Implementing Search in ASP.NET with Google Custom Search&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site Note: &lt;/strong&gt;Another technique for making your site more searchable is to create an &lt;a href="http://www.opensearch.org/"&gt;OpenSearch provider&lt;/a&gt;. By adding a simple XML file to your website you can have your site searchable through the search box that's baked into the user interface of browsers like Internet Explorer and Firefox. Learn more about this technique by reading: &lt;em&gt;&lt;a href="http://aspnet.4guysfromrolla.com/articles/073008-1.aspx"&gt;Helping Visitors Search Your Site By Creating an OpenSearch Provider&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=163311" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/ASP.NET+Talk/default.aspx">ASP.NET Talk</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category></item><item><title>Giving a CAPTCHA a Whirl</title><link>http://scottonwriting.net/sowblog/archive/2006/07/06/163185.aspx</link><pubDate>Thu, 06 Jul 2006 21:17:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:163185</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=163185</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2006/07/06/163185.aspx#comments</comments><description>&lt;p&gt;Comment spam is evil. I've been getting on the tune of 25-50 comment spams per day the past several weeks. My custom utility to &lt;a href="http://scottonwriting.net/sowblog/posts/5498.aspx"&gt;quickly delete comments in .Text&lt;/a&gt; has helped delete comment spams after the fact; additionally, SQL triggers have, to date, proactively nuked over 20,700 comment spams (although they have also stopped valid posters who have added common spam 'keywords' to their posts).&lt;/p&gt;
&lt;p&gt;Since the SQL triggers are clearly no longer working, I'm going to give CAPTCHAs a try. In theory, &lt;a href="http://scottonwriting.net/sowblog/posts/3154.aspx"&gt;CAPTCHAs can be broken&lt;/a&gt;... easily. However, I'm hoping/assuming that the vast majority of scum known as comment spammers aren't using programs that can decode CAPTCHAs and aren't using the social engineering/free pr0n!! techniques detailed &lt;a href="http://www.boingboing.net/2004/01/27/solving_and_creating.html"&gt;here&lt;/a&gt;. Rather, I'm assuming a scant few of the comment spams (the ones I get like one or two of a day) are entered by actual humans; the majority, of which I get a blast of, say, 30 in a five second period, are probably coming from a pretty dumb HTTP screen scraping/HTTP posting program. If my assumptions are sound, then the CAPTCHA ought to drastically reduce the amount of comment spam appearing on my blog.&lt;/p&gt;
&lt;p&gt;I've taken down my comment spam-related triggers and replaced them with &lt;a href="http://blogs.clearscreen.com/migs/"&gt;Miguel Jimenez&lt;/a&gt;'s free &lt;a href="http://blogs.clearscreen.com/migs/archive/2005/02/01/905.aspx"&gt;Clearscreen SharpHIP CAPTCHA Control&lt;/a&gt;. The nice thing about this control is that it automatically checks for validity on postback so it integrates with .Text without having to modify the codebase. One downside, however, is that any other postback sections on the web page will no longer work unless the CAPTCHA is filled out (you may have noticed &lt;a href="http://scottonwriting.net/sowblog/posts/1028.aspx"&gt;the blog entry rating feature&lt;/a&gt; has been removed).&lt;/p&gt;
&lt;p&gt;Hopefully the CAPTCHA cuts down on the comment spam, as having to wade through and delete 50+ comments every day or two is really started to get mundane and annoying. (&lt;em&gt;I do take removing comment spam seriously, though. I challenge you to find a single piece of irrefutable spam in one of my blog entries that's older than, say, a week.&lt;/em&gt;)&lt;/p&gt;&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=163185" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Comment+Spam/default.aspx">Comment Spam</category></item><item><title>Quickly Deleting Comments in .Text</title><link>http://scottonwriting.net/sowblog/archive/2006/03/28/163158.aspx</link><pubDate>Tue, 28 Mar 2006 16:27:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:163158</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=163158</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2006/03/28/163158.aspx#comments</comments><description>&lt;p&gt;While I'm certain that &lt;a href="http://communityserver.org/"&gt;Community Server&lt;/a&gt; has the ability to easily delete comments en mass, this blog still uses &lt;a href="http://scottwater.com/blog/"&gt;Scott Watermasysk&lt;/a&gt;'s close to originally-released version of .Text (gasp!). I've been &lt;em&gt;meaning&lt;/em&gt; to upgrade, I promise, but with &lt;a href="http://scottonwriting.net/sowblog/category/114.aspx"&gt;the assorted customizations I've done&lt;/a&gt; and the time needed to make the transition, it's hard to justify taking the time to fix something that's really not broken.&lt;/p&gt;
&lt;p&gt;My one complaint, however, has been &lt;a href="http://scottonwriting.net/sowblog/category/138.aspx"&gt;comment spam&lt;/a&gt;. This blog is blasted with dozens of comment spam messages on a daily basis. Most of these are filtered out proactively with some machine-level tests (essentially looking for keywords that indicate spamminess), which &lt;a href="http://scottonwriting.net/sowblog/posts/3083.aspx"&gt;I've blogged about before&lt;/a&gt;. In fact, to date the technique I use to stop comment spam has quashed 13,046 messages from making their way to the ScottOnWriting.NET blog.&lt;/p&gt;
&lt;p&gt;Regardless, comment spam still creeps in and deleting it through the .Text admin page is a pain. You see a list of the comments, each with a Delete button. Cicking Delete takes you to a screen that says, “Are you sure you want to delete this?” Hitting Confirm takes you back to the main page with the comment deleted. This is OK when there are one or two comment spams to delete, but a carpal tunnel-inducing nuissance when you are blasted with, say, 15 spam messages in a two minute period. Ideally I would be able to check a number of checkboxes and click a “Delete Selected” button.&lt;/p&gt;
&lt;p&gt;To further put off the upgrade to Community Server and to get some good ol' ASP.NET 2.0 practice, I decided to create a simple ASP.NET 2.0 website locally that would provide such an interface. And I was able to create it in under 5 minutes with having to write less than 10 lines of code. 2.0 rocks.&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://datawebcontrols.com/images/BlogTools.Big.jpg"&gt;&lt;img height="226" src="http://datawebcontrols.com/images/BlogTools.jpg" width="300" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Anyway, the code is available for download &lt;a href="http://datawebcontrols.com/demos/BlogTools.zip"&gt;here&lt;/a&gt;. It's just a single page, &lt;font face="Courier New"&gt;Default.aspx&lt;/font&gt;, which lists the 50 most recent comments in a GridView. Each GridView row has a CheckBox. At the bottom there's a “Delete Selected Comments” Button that, when clicked, iterates through each GridView row and, if selected, programmatically invokes the SqlDataSource control's Delete() method (which is wired up to the &lt;font face="Courier New"&gt;blog_DeletePost&lt;/font&gt; sproc). (The exact sprocs/queries used here may differ for more modern versions of .Text or Community Server.)&lt;/p&gt;
&lt;p&gt;For those three people still using .Text who haven't upgraded to Community Server, enjoy!&lt;/p&gt;&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=163158" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Comment+Spam/default.aspx">Comment Spam</category></item><item><title>FeedBurner Summary</title><link>http://scottonwriting.net/sowblog/archive/2005/09/15/163108.aspx</link><pubDate>Thu, 15 Sep 2005 16:33:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:163108</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=163108</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2005/09/15/163108.aspx#comments</comments><description>&lt;p&gt;In August I moved over my RSS feed from the default .Text RSS feed source (&lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;) to using &lt;a href="http://www.feedburner.com/"&gt;FeedBurner&lt;/a&gt;'s free service.  Part of the challenge in this process was having existing subscribers automatically switch from using &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt; to using FeedBurner's generated feed (&lt;a href="http://feeds.feedburner.com/ScottOnWriting"&gt;http://feeds.feedburner.com/ScottOnWriting&lt;/a&gt;).  I ended up getting everything to work by retooling Rss.aspx to send an HTTP 301 status code to aggregators, which instructed them to update their information using the new feed URL.  For more on the reasons why I switched to FeedBurner along with how I made the needed changes in .Text to send an HTTP 301, refer to &lt;em&gt;&lt;a href="http://scottonwriting.net/sowblog/posts/4336.aspx"&gt;FeedBurner and Changing a Blog's Feed URL&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I've now been using the FeedBurner service for coming on three weeks, and wanted to share a quick review of the service.  In my previous blog entry I mentioned the three motivating factors that prompted me to switch to FeedBurner were:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Subscription statistics&lt;/strong&gt; - FeedBurner provides a number of free statistics, including number of subscribers, number of requests, and aggregator breakdown.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Someone else handles the bandwidth&lt;/strong&gt; - currently requests to the RSS feed on ScottOnWriting.NET consume roughly 1.5 GB of traffic per week, or 6 GB of traffic per month (in total, ScottOnWriting does about 11 GB of traffic per month).  That's a lot of 1s and 0s that would be nice to offload to another party.  (I don't believe the pre-0.94 version of .Text I was using supported conditional HTTP GETs (although if I'm not mistaken the "official" 0.94 release does; had I been using a version that supported conditional GETs this bandwidth requirement would be an order of magnitude lower, I'd wager, perhaps just a GB for the month.)  (To clarify, while FeedBurner does make requests to the blog's RSS URL, it caches the results for a period of time, thereby reducing the bandwidth demands for my server.)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FeedBurner has a couple of neat “publicizing“ tools&lt;/strong&gt; - FeedBurner includes a number of tools to easily make links to add your blog to My Yahoo!, MyMSN, newgator Online, and so on.  Additionally, there are nifty little tools you can use to “show off“ how many folks subscribe to your blog, a la: &lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="26" alt="" src="http://feeds.feedburner.com/%7Efc/ScottOnWriting?bg=99CCFF&amp;amp;fg=444444&amp;amp;anim=0" width="88" /&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;The free FeedBurner service provides three traffic metrics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Feed Circulation&lt;/strong&gt;, which shows how many folks subscribe to your blog, how many requests there were to your RSS feed, and how many click throughs there were.  The circulation data can be broken down by day or by hour, and shown in terms of the current week, the current date, the current month, and so on.  Here's a bar graph that shows the circulation for ScottOnWriting.NET since I started using FeedBurner in late August:&lt;br /&gt;&lt;br /&gt;
&lt;center&gt;&lt;img height="116" src="http://www.datawebcontrols.com/images/readership.png" width="400" border="1" /&gt;&lt;/center&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Readership&lt;/strong&gt; - the readership stats allow me to see what aggregators are being used to subscribe to my site's content, along with a breakdown of bots and browser aggregators.  As the following graphic shows, the most popular aggregator that's reporting itself (or that FeedDemon knows of) is &lt;a href="http://bloglines.com/"&gt;Bloglines&lt;/a&gt;, followed by &lt;a href="http://www.rssbandit.org/"&gt;RssBandit&lt;/a&gt; (my aggregator of choice).&lt;br /&gt;&lt;br /&gt;
&lt;center&gt;&lt;img height="208" src="http://www.datawebcontrols.com/images/aggUsage.png" width="400" border="1" /&gt;&lt;br /&gt;&lt;/center&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Item Stats&lt;/strong&gt; - this shows the click throughs on an item-by-item basis over a specified date range.  For example, the most popular blog entry of mine since late August (at least in terms of subscribers “clicking through“) is &lt;a href="http://scottonwriting.net/sowblog/posts/4409.aspx"&gt;&lt;em&gt;How Big is Too Big a ViewState?&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;with 171 click throughs.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;The second motive of mine for using FeedBurner was to have someone else (namely FeedBurner) bear the bandwidth costs.  (Thanks, guys!)  Anywho, in the three weeks prior to using FeedBurner the daily bandwidth for ScottOnWriting.NET was 388 MB.  Since moving to FeedBurner my daily bandwidth average has dropped to 211 MB.  FeedBurner alone is saving me 177 MB per day, which is more than 5 GB per month.  Sweet!&lt;/p&gt;
&lt;p&gt;One of my initial concerns with FeedBurner was that once you were using FeedBurner you were “locked in.“  That is, I worried that if, down the road, I wanted to switch back to hosting the RSS feed on my site (or use some FeedBurner competitor, or if FeedBurner went out of business), I'd be SOL, since how would I get my subscribers who subscribe to my FeedBurner feed to switch to a different feed?  I'd need to HTTP 301 my FeedBurner feed and since that's hosted with FeedBurner, they have the ultimate say as to whether or not that would be possible.&lt;/p&gt;
&lt;p&gt;This fear was assuaged by a blog post by FeedBurner cofounder and CTO, Eric Lunt.  In &lt;a href="http://www.burningdoor.com/feedburner/archives/001251.html"&gt;the post&lt;/a&gt; Eric mentions that it is possible to have your FeedBurner feed use an HTTP 301 and spells out their business rules for implementing this (namely, different actions are taken by the feed as time progresses... the HTTP 301 isn't used indefinately, it eventually unwinds to use, basically, a 404).  From Eric's entry:&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;... when you start directing subscribers to FeedBurner, you may, in the future (way way way in the future) change your mind and want those subscribers pointing back to your original feed. You would probably also like this to happen automatically, and you would probably like some fallbacks for subscribers who don't get redirected for some reason. To date, there has been no simple way to do this. Steve Gillmor first raised this point with us during an interview late last year, and it has also been discussed more recently. We think we have the best feed management service, we think that providing publishers with the ability to do whatever they want is always the right answer, and most importantly, we think your subscribers are your subscribers, not ours or anybody else's.&lt;/p&gt;
&lt;p&gt;So, beginning today [June 10, 2005], we're providing a detailed service for publishers who choose to leave FeedBurner. When you delete your FeedBurner feed, we have added an option to redirect your feed. If you select this, we begin a one month process of transitioning your subscribers back to your source feed. &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;That's reassuring to know.  If you couldn't guess, I highly recommend FeedBurner.  The stats and bandwidth savings make this free service an invaluable one, and the ability to leave FeedBurner clealy and crisply takes away any potential downside in switching over your feed.&lt;/p&gt;
&lt;p align="center"&gt;&lt;em&gt;For more entries on customizing .Text be sure to check out the &lt;a href="http://scottonwriting.net/sowblog/category/114.aspx"&gt;Blog Enhancements category&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=163108" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category></item><item><title>FeedBurner and Changing a Blog's Feed URL</title><link>http://scottonwriting.net/sowblog/archive/2005/08/28/163103.aspx</link><pubDate>Sun, 28 Aug 2005 21:23:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:163103</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=163103</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2005/08/28/163103.aspx#comments</comments><description>&lt;p&gt;This weekend I moved over my RSS feed - previously &lt;a href="http://scottonwriting.net/sowBlog/Rss.aspx"&gt;http://ScottOnWriting.NET/sowBlog/Rss.aspx&lt;/a&gt; - to a feed managed by &lt;a href="http://www.feedburner.com/"&gt;FeedBurner&lt;/a&gt; (&lt;a href="http://feeds.feedburner.com/ScottOnWriting"&gt;http://feeds.feedburner.com/ScottOnWriting&lt;/a&gt;).  FeedBurner serves as a sort of feed URL proxy.  Basically you give FeedBurner a link to your RSS feed and it creates a feed based on that feed.  You then point your subscribers to the FeedBurner feed and FeedBurner serves up your site's content, maintains statistics on who's subscribing to your blog, and so on.&lt;/p&gt;
&lt;p&gt;I decided to move to FeedBurner to realize three benefits (keep in mind that ScottOnWriting.NET (still) runs off of an old version of &lt;a href="http://scottwater.com/blog"&gt;Scott Watermasysk&lt;/a&gt;'s &lt;a href="http://workspaces.gotdotnet.com/dottext"&gt;.Text blogging engine&lt;/a&gt;, as I've yet to upgrade to &lt;a href="http://communityserver.org/"&gt;Community Server&lt;/a&gt;; previous to today, I was actually using a pre-0.94 version, but today "upgraded" to the official 0.94 release downloadable from the .Text GotDotNet Workspace):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Subscription statistics&lt;/strong&gt; - FeedBurner provides a number of free statistics, including number of subscribers, number of requests, and aggregator breakdown. 
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Someone else handles the bandwidth&lt;/strong&gt; - currently requests to the RSS feed on ScottOnWriting.NET consume roughly 1.5 GB of traffic per week, or 6 GB of traffic per month (in total, ScottOnWriting does about 11 GB of traffic per month).  That's a lot of 1s and 0s that would be nice to offload to another party.  (I don't believe the pre-0.94 version of .Text I was using supported &lt;a href="http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers"&gt;conditional HTTP GETs&lt;/a&gt; (although if I'm not mistaken the "official" 0.94 release does; had I been using a version that supported conditional GETs this bandwidth requirement would be an order of magnitude lower, I'd wager, perhaps just a GB for the month.)  (&lt;em&gt;To clarify, while FeedBurner does make requests to the blog's RSS URL, it caches the results for a period of time, thereby reducing the bandwidth demands for my server.&lt;/em&gt;)
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;FeedBurner has a couple of neat “publicizing“ tools&lt;/strong&gt; - FeedBurner includes a number of tools to easily make links to add your blog to My Yahoo!, MyMSN, newgator Online, and so on.  Additionally, there are nifty little tools you can use to “show off“ how many folks subscribe to your blog, a la: &lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="26" alt="" src="http://feeds.feedburner.com/~fc/ScottOnWriting?bg=99CCFF&amp;amp;fg=444444&amp;amp;anim=0" width="88" /&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;When changing over your RSS feed URL the main challenge is making sure that your existing subscriber base starts to use the new feed URL.  There are, to my knowledge, to ways this can be done, with the first of the two ways being the ideal way:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Have your old feed URL emit an HTTP 301 status code&lt;/strong&gt; - The &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"&gt;HTTP 301 status code&lt;/a&gt; is a message from the server to the client saying, “Hey, this resource has been permanently moved to URL &lt;em&gt;xyz&lt;/em&gt;.“  The client, then, can make a new request to the specified URL; too, if there's some database being used to track the URL, this message informs the client that it's time to update the database and use the new location.  If I'm not mistaken, virtually all modern aggregators support HTTP 301 status codes and will automatically update a site's feed URL to use the newly specified location. 
&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Tell people of your new feed URL&lt;/strong&gt; - if you do not have control over your blog website you may not be able to take the steps needed to replace the current feed URL with an HTTP 301 status code.  In this case, the only approach I know of to inform users of the new feed URL is simply through word of mouth.  That is, you'll just have to post on your blog an entry telling users to update their aggregators.  As &lt;a href="http://www.acmebinary.com/blogs/kent/"&gt;Kent Sharkey&lt;/a&gt; has noted, though, &lt;a href="http://www.acmebinary.com/blogs/kent/archive/2005/08/22/212.aspx"&gt;the results may be somewhat disappointing&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Since I run ScottOnWriting.NET myself (well, through a web hosting company), I have control over these matters.  The only challenge, then, was getting .Text to play nice.  In .Text version 0.94 the site's RSS feed comes from a file named &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;.  This file, though, does not actually exist; rather, in the &lt;font face="Courier New"&gt;Web.config&lt;/font&gt; file all requests are handed off to a .Text &lt;a href="http://msdn.microsoft.com/asp.net/default.aspx?pull=/library/en-us/dnaspp/html/httphandl.asp"&gt;HTTP Handler&lt;/a&gt;.  When a request comes in for &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;, .Text generates the appropriate output.&lt;/p&gt;
&lt;p&gt;To get Rss.aspx replaced with an HTTP 301 status code, the first step is to create an &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt; file in your blog's root directory.  The code needed for this page is alarmingly simple - all you want to do is return an HTTP 301 specifying the new feed URL, like so:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a52a2a"&gt;script&lt;/font&gt; &lt;font color="#ff0000"&gt;runat&lt;/font&gt;&lt;font color="#0000ff"&gt;="server"&lt;/font&gt; &lt;font color="#ff0000"&gt;language&lt;/font&gt;&lt;font color="#0000ff"&gt;="C#"&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt; Page_Load(&lt;font color="#0000ff"&gt;object&lt;/font&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    Response.Status = &lt;font color="#800080"&gt;"301 Moved Permanently"&lt;/font&gt;;&lt;br /&gt;    Response.AddHeader(&lt;font color="#800080"&gt;"Location"&lt;/font&gt;, &lt;font color="#800080"&gt;"&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" color="#800080"&gt;http://feeds.feedburner.com/ScottOnWriting&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#800080"&gt;"&lt;/font&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#a52a2a"&gt;script&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;(Of course replace the &lt;a href="http://feeds.feedburner.com/ScottOnWriting"&gt;http://feeds.feedburner.com/ScottOnWriting&lt;/a&gt; Location header value with the URL of &lt;em&gt;your&lt;/em&gt; new RSS feed...)&lt;/p&gt;
&lt;p&gt;Creating this file is not enough.  In fact, even after creating this file if you visit &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt; through your browser you'll &lt;em&gt;still&lt;/em&gt; see the complete RSS feed rather than being auto-redirected to the specified URL.  This is because the ASP.NET engine is handing off the request to the .Text HTTP Handler rather than handling the request itself.  If you look at the &lt;font face="Courier New"&gt;&amp;lt;httpHandlers&amp;gt;&lt;/font&gt; section in the &lt;font face="Courier New"&gt;Web.config&lt;/font&gt; file you'll find an entry like:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a52a2a"&gt;add&lt;/font&gt; &lt;font color="#ff0000"&gt;verb&lt;/font&gt;&lt;font color="#0000ff"&gt;="*" &lt;/font&gt;&lt;font color="#ff0000"&gt;path&lt;/font&gt;&lt;font color="#0000ff"&gt;="*.aspx"&lt;/font&gt; &lt;font color="#ff0000"&gt;type&lt;/font&gt;&lt;font color="#0000ff"&gt;="Dottext.Framework.UrlManager.UrlReWriteHandlerFactory,Dottext.Framework" /&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;This entry says, “Any request for an ASP.NET page should be handled by the class &lt;font face="Courier New"&gt;Dottext.Framework.UrlManager.UrlReWriteHandlerFactory,Dottext.Framework&lt;/font&gt;,” and HTTP Handler. This includes requests for &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;.  Hence we need to add the following line to the &lt;font face="Courier New"&gt;&amp;lt;httpHandlers&amp;gt;&lt;/font&gt; section:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a52a2a"&gt;add &lt;/font&gt;&lt;font color="#ff0000"&gt;verb&lt;/font&gt;&lt;font color="#0000ff"&gt;="*"&lt;/font&gt; &lt;font color="#a52a2a"&gt;path&lt;/font&gt;&lt;font color="#0000ff"&gt;="Rss.aspx" &lt;/font&gt;&lt;font color="#ff0000"&gt;type&lt;/font&gt;&lt;font color="#0000ff"&gt;="System.Web.UI.PageHandlerFactory" /&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;That tells the ASP.NET engine to take care of requests to &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;.  At first I naively thought that I was done, but I had just unwittingly setup an infinite loop!  When a request comes into &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;, it sends back a 301 status code to the client, saying, “No, no, no, you want to go to this FeedBurner URL.“  This is what we want to tell people coming through a browser or aggregator, but remember that FeedBurner &lt;em&gt;also&lt;/em&gt; needs to know the URL of the site's feed, which, at this point, I had set simply as &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;!  So when FeedBurner periodically checked to see if a new version of my feed was available it requested &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;, which told it to check itself, which says to check &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;, which says to check itself, which... you get the point.&lt;/p&gt;
&lt;p&gt;Instead, what I needed to do was &lt;em&gt;rename&lt;/em&gt; .Text's &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt; to something else, like &lt;font face="Courier New"&gt;RssFromText.aspx &lt;/font&gt;and instruct FeedBurner to use this alternate, “secretive” feed URL.  With this setup, a user who already subscribes to ScottOnWriting.NET through &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt; will automatically be switched over to FeedBurner.  FeedBurner's RSS content will be populated from &lt;font face="Courier New"&gt;RssFromText.aspx&lt;/font&gt;, which will be generated from .Text, reflecting the most recent blog entries.  No more infinite loops!&lt;/p&gt;
&lt;p&gt;To accomplish this I had to edit blog.config to tell .Text that it should use &lt;font face="Courier New"&gt;RssFromText.aspx&lt;/font&gt; as its RSS feed URL as opposed to &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;.  This involved updating the appropriate &lt;font face="Courier New"&gt;&amp;lt;HttpHandler&amp;gt;&lt;/font&gt; line like so:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a52a2a"&gt;HttpHandler &lt;/font&gt;&lt;font color="#ff0000"&gt;Pattern &lt;/font&gt;&lt;font color="#0000ff"&gt;= "(?:\/&lt;strong&gt;RssFromText.aspx&lt;/strong&gt;)$"&lt;/font&gt; &lt;font color="#ff0000"&gt;Type &lt;/font&gt;&lt;font color="#0000ff"&gt;= "Dottext.Framework.Syndication.RssHandler, Dottext.Framework"&lt;/font&gt; &lt;font color="#ff0000"&gt;HandlerType&lt;/font&gt; &lt;font color="#0000ff"&gt;= "Direct" /&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;With this addition, requests now to &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt; are sent back an HTTP 301 status code, but FeedBurner can still slurp down the site's content through &lt;font face="Courier New"&gt;RssFromText.aspx&lt;/font&gt;.&lt;/p&gt;
&lt;p&gt;Next, you'll probably want to update the link to the site's feed in the &lt;strong&gt;My Links&lt;/strong&gt; section (since this will point the users to &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;, but you want them to go directly to the FeedBurner link).  (In actuality, this step is probably optional since even if you do leave it as Rss.aspx, when the attempt to view that page through a browser or slurp it through an aggregator, they'll get the 301 status code and auto-redirect to the FeedBurner URL... but still, for completeness let's change this link.)  To accomplish this, simply edit the &lt;font face="Courier New"&gt;MyLinks.ascx&lt;/font&gt; file in the &lt;font face="Courier New"&gt;~/Skins/&lt;em&gt;skin_name&lt;/em&gt;/Controls/&lt;/font&gt; directory.  With version 0.94 you'll find two HyperLink controls that .Text automatically looks for and sets their &lt;font face="Courier New"&gt;NavigateUrl&lt;/font&gt; properties to &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt; - these controls have &lt;font face="Courier New"&gt;ID&lt;/font&gt;s &lt;font face="Courier New"&gt;Syndication&lt;/font&gt; and &lt;font face="Courier New"&gt;XMLLink&lt;/font&gt;.  Even if you explicitly set the &lt;font face="Courier New"&gt;NavigateUrl&lt;/font&gt; properties to your FeedBurner URL, .Text will overwrite it and the link will be rendered as &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;.  If you try to simply remove these HyperLink controls you'll find that (at least with 0.94) .Text will barf.  What I did was simply set their &lt;font face="Courier New"&gt;Visible&lt;/font&gt; property to False.  I then added two HyperLink Web controls of my own that referenced the new feed URL.&lt;/p&gt;
&lt;p&gt;There's one more facet that should be changed, although I've not made the change since (to my understanding) you'd need to actually hack the .Text source code, recompile, and re-deploy.  In the &lt;font face="Courier New"&gt;&lt;/font&gt;portion of the web pages in your blog you'll find a &lt;font face="Courier New"&gt;&lt;link /&gt;&lt;/font&gt;tag that's used for RSS feed auto-discovery:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#a52a2a"&gt;link &lt;/font&gt;&lt;font color="#ff0000"&gt;rel&lt;/font&gt;&lt;font color="#0000ff"&gt;="alternate"&lt;/font&gt; &lt;font color="#ff0000"&gt;href&lt;/font&gt;&lt;font color="#0000ff"&gt;="&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" color="#0000ff"&gt;http://scottonwriting.net/sowblog/rss.aspx&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;" &lt;/font&gt;&lt;font color="#ff0000"&gt;type&lt;/font&gt;&lt;font color="#0000ff"&gt;="application/rss+xml"&lt;/font&gt; &lt;font color="#ff0000"&gt;title&lt;/font&gt;&lt;font color="#0000ff"&gt;="RSS" &amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Ideally the href attribute would contain the URL of your new feed... but I didn't feel like going through the headache of pecking through the source, making a change, testing, and so forth.  So I just left it as-is, figuring in the worst case someone will “discover” my feed to be &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;, which will automatically be updated to the FeedBurner syndication URL as soon as their aggregator makes its first request to &lt;font face="Courier New"&gt;Rss.aspx&lt;/font&gt;.&lt;/p&gt;
&lt;p&gt;The FeedBurner service looks pretty cool upon first glance.  Once this new feed URL gets some use and I get some metrics in FeedBurner's database, I plan on sharing some of the stats... it'll be interesting to see what the most popular aggregator out there is for those who are ASP.NET developers (the primary audience of this blog, I imagine), among other data points.&lt;/p&gt;&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=163103" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/ASP.NET+Talk/default.aspx">ASP.NET Talk</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Miscellaneous/default.aspx">Miscellaneous</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category></item><item><title>Searching Your Blog Got a Whole Lot Easier</title><link>http://scottonwriting.net/sowblog/archive/2005/02/01/163043.aspx</link><pubDate>Tue, 01 Feb 2005 14:54:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:163043</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=163043</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2005/02/01/163043.aspx#comments</comments><description>&lt;p&gt;If you check out the &lt;a href="http://scottonwriting.net/sowblog/"&gt;ScottOnWriting.NET homepage&lt;/a&gt; you'll now find that in the upper-left hand corner there's a spiffy “Search” box.  Go ahead, type a query in there... you'll be redirected to &lt;a href="http://scottonwriting.net/Search.aspx?s=ScottOnWriting.NET&amp;amp;count=10&amp;amp;first=1&amp;amp;query=query"&gt;http://scottonwriting.net/Search.aspx?s=ScottOnWriting.NET&amp;amp;count=10&amp;amp;first=1&amp;amp;query=&lt;em&gt;query&lt;/em&gt;&lt;/a&gt;, which will show you the results of your search.&lt;/p&gt;
&lt;p&gt;The new search page - which you, too, can add to your site in a matter of minutes - is possible in large part thanks to Microsoft's new &lt;a href="http://search.msn.com/"&gt;MSN Search&lt;/a&gt;.  Today Microsoft unveiled their new “built from the ground up” search and one of the cool features it that the search results can be returned as RSS.  (To try it out, go to the MSN Search page and enter a query; at the bottom of the Web page you'll find that little, friendly orange RSS button.)  Once I found this, I realized adding search to ScottOnWriting.NET would be a cinch &lt;em&gt;if&lt;/em&gt; MSN Search let me search for pages on a particular domain.  Thankfully, you can search by a specific site by simply adding &lt;font face="Courier New"&gt;site:&lt;em&gt;siteName&lt;/em&gt;&lt;/font&gt; syntax in the search query.&lt;/p&gt;
&lt;p&gt;Creating a search engine for a local site, then, is as easy as having a page that requests the remote RSS file based on the query entered by a user, and displaying the resulting RSS in the page.  With my free &lt;a href="http://scottonwriting.net/sowBlog/RssFeed.htm"&gt;RssFeed&lt;/a&gt; control doing exactly this is a no-brainer, requiring just two lines of code.  Therefore, the code and markup for the search page for ScottOnWriting.NET basically looks like:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&gt;&lt;br /&gt;&lt;font face="Courier New"&gt;// Build up the request URL for the RSS data&lt;br /&gt;string requestUrl = string.Format("&lt;/font&gt;&lt;a href="http://beta.search.msn.com/results.aspx?q={0}+site%3a{1}&amp;amp;format=rss&amp;amp;first={2}&amp;amp;count={3"&gt;&lt;font face="Courier New"&gt;http://beta.search.msn.com/results.aspx?q={0}+site%3a{1}&amp;amp;format=rss&amp;amp;first={2}&amp;amp;count={3&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New"&gt;}", searchQuery, “http://ScottOnWriting.NET/“, startIndex, resultsPerPage);&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;// Bind the results to the RssFeed control&lt;br /&gt;searchResults.DataSource = requestUrl;&lt;br /&gt;searchResults.DataBind();&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Markup&lt;br /&gt;&lt;/strong&gt;&lt;font face="Courier New"&gt;&amp;lt;skm:rssfeed width="80%" id="searchResults" runat="server" Font-Names="Verdana"&lt;br /&gt;  Font-Size="Medium" CellPadding="5" ShowHeader="False" GridLines="None"&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt; &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;  &amp;lt;span class="title"&amp;gt;&amp;lt;a href='&amp;lt;%# DataBinder.Eval(Container.DataItem, "Link") %&amp;gt;'&amp;gt;&amp;lt;%# DataBinder.Eval(Container.DataItem, "Title") %&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;  &amp;lt;span class="desc"&amp;gt;&amp;lt;%# HighlightSearchTerm(DataBinder.Eval(Container.DataItem, "Description").ToString()) %&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;  &amp;lt;span class="url"&amp;gt;&amp;lt;%# DataBinder.Eval(Container.DataItem, "Link") %&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt; &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;  &lt;br /&gt;&amp;lt;/skm:rssfeed&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Some example results can be seen &lt;a href="http://scottonwriting.net/Search.aspx?s=ScottOnWriting.NET&amp;amp;count=10&amp;amp;first=1&amp;amp;query=orlando"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is pretty cool, but there are some gotchas.  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The RSS feed doesn't provide any information if there's more results.  There may be 15 results for the query DataGrid, but the RSS feed, by default, will only return the first 10.  There's no way of knowing for sure if there are more results unless you grab &lt;em&gt;another&lt;/em&gt; RSS feed, this time asking for records starting at 11.  What complicates things is that if there are exactly 10 records, getting the RSS feed starting at 11 won't return nothing; rather it will re-return the first 10 records.  Ick.  My current solution is to just display a Next button if there are 10 records on the page... it's a hack, since it won't really do what is expected for queries that return a multiple of 10 records, but it's good enough.&lt;/li&gt;
&lt;li&gt;I don't know how legal all this is.  If you look at the RSS feed's &lt;font face="Courier New"&gt;&amp;lt;copyright&amp;gt;&lt;/font&gt; tag it says:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Copyright © 2005 Microsoft. All rights reserved. These XML results may not be used, reproduced or transmitted in any manner or for any purpose other than rendering MSN Search results within an RSS aggregator for your personal, non-commercial use. Any other use of these results requires express written permission from Microsoft Corporation. By accessing this web page or using these results in any manner whatsoever, you agree to be bound by the foregoing restrictions.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I doubt MS is going to care too much if I use these results for my dinky little blog, but clearly they'd care if I was a company that used this approach to provide search on my Web site in lieu of buying Index Server or &lt;a href="http://www.google.com/enterprise/"&gt;Google's searching server&lt;/a&gt;, or whatever.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Of course, MSN Search is not the first search engine to provide a programmatic means for accessing their results.  Google offers the &lt;a href="http://www.google.com/apis/"&gt;Google API&lt;/a&gt;, a set of Web services that can be used to run queries on Google.  In fact, I've written an article on 4Guys on how to create a search engine with the Google API: &lt;a href="http://aspnet.4guysfromrolla.com/articles/030503-1.aspx"&gt;Searching Google Using the Google Web Service&lt;/a&gt;.  (And I will likely write up an article on using the MSN Search technique...)  The downside of using the Google API is that users are limited to 1,000 queries per day and creating a page to work with the API takes a bit more heavy lifting than just bringing back RSS data and displaying it (although not much more).&lt;/p&gt;
&lt;p&gt;A future blog entry, or 4Guys article, will delve into the MSN Search techniques I used to add search to ScottOnWriting.NET, but don't let that stop you from adding this feature to your site today.  Armed with RssFeed you could do it without further information in a matter of minutes.&lt;/p&gt;&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=163043" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/ASP.NET+Talk/default.aspx">ASP.NET Talk</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Miscellaneous/default.aspx">Miscellaneous</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category></item><item><title>My AggBug Experiment</title><link>http://scottonwriting.net/sowblog/archive/2004/10/13/163002.aspx</link><pubDate>Wed, 13 Oct 2004 13:58:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:163002</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=163002</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2004/10/13/163002.aspx#comments</comments><description>&lt;p&gt;This blog is powered by &lt;a href="http://scottwater.com/blog"&gt;Scott Watermasysk&lt;/a&gt;'s .Text blogging engine, but it's an older version of the software, one that doesn't support statistics.  More recent versions of .Text provide a rough estimate as to how many folks have read your blog through the use of &lt;em&gt;AggBugs&lt;/em&gt;.  Prior to the popularization of syndicated content, determining how many folks read your content was a rather simple task of parsing the Web server's log files.  But with syndicated content, examining the number of people who requested the RSS feed does not give a strong estimate.  For example, my aggregator might slurp down a particular RSS feed 24 times over the course of the day, yet I may read a particular entry only once or twice, or maybe not at all.&lt;/p&gt;
&lt;p&gt;To surmount these problems, AggBugs are commonly used.  An AggBug is a tiny bit of HTML in the RSS feed that typically is an &lt;font face="Courier New"&gt;&amp;lt;img&amp;gt;&lt;/font&gt; tag that requests a 1x1 transparent GIF file.  Each time someone loads up a particular entry in their aggregator (or visits the particular blog entry page), a request is made to that GIF file.  To determine how many times your blog has been read, you can simply lookup in your Web server's log files to see how many times that GIF has been requested.&lt;/p&gt;
&lt;p&gt;Since the version of .Text I use lacks the AggBug feature, I have never really had a good idea as to how many folks read my blog entries.  The suspense has been killing me, so I decided to implement by own AggBug feature for a particular blog entry, &lt;a href="http://scottonwriting.net/sowblog/posts/2181.aspx"&gt;Sample Chapter of my .NET Web Services DVD&lt;/a&gt;.  (Rather than using just a simple 1x1 GIF, I created an ASP.NET page that returned a 1x1 GIF, but logged more information than just a simple hit (namely the user's IP, their User-Agent string, and so on.)  It's now been 24 hours since that blog entry was posted, and here are the results:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;553 unique IP addresses requests&lt;/li&gt;
&lt;li&gt;860 total requests&lt;/li&gt;
&lt;li&gt;Twice as many people (2) hit my site with Netscape 3 than did with IE 4 (1).  Only 2 folks visited with Opera, which is as many people as visited with Safari.  &lt;/li&gt;
&lt;li&gt;The vast majority (95+%) use IE 6.0 (I believe the popular blog readers - RssBandit, FeedReader, FeedDemon, etc. - use IE as their browser by default, so this makes sense).&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;It'll be interesting to see how the readership for a particular blog entry shrinks or grows as the days progress.  I'd wager something like 80% of the views occur in the first week (maybe two), and the remaining 20% occur over the rest of the year.&lt;/p&gt;&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=163002" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/Miscellaneous/default.aspx">Miscellaneous</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category></item><item><title>The Highest Rated Entries</title><link>http://scottonwriting.net/sowblog/archive/2004/04/30/162946.aspx</link><pubDate>Fri, 30 Apr 2004 15:54:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:162946</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=162946</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2004/04/30/162946.aspx#comments</comments><description>&lt;p&gt;A couple weeks ago I enhanced my blog so that &lt;a href="http://scottonwriting.net/sowblog/posts/1028.aspx"&gt;readers could rate blog entries&lt;/a&gt;.  I even wrote an article with the requisite SQL queries and User Control code and markup on 4Guys: &lt;a href="http://aspnet.4guysfromrolla.com/articles/042104-1.aspx"&gt;Creating a Content Reader&lt;/a&gt;.  I decided to take a few minutes out of my day and display the five highest rated articles.  If you visit &lt;a href="http://scottonwriting.net/sowBlog/"&gt;my blog&lt;/a&gt; you'll see on the left-hand side, beneath the Post Categories list, is a Top Rated Entries list.  It shows the five highest rated entries that have at least three votes, and uses partial page caching so that it only updates twice per hour.&lt;/p&gt;
&lt;p&gt;While whipping out this little blog add-on only took a few minutes, I should have known better that I wouldn't be able to just write code without going hog wild and writing an entire article, which stretched that planned five minute break into an hour long break.  In any event, you can learn more at my latest 4Guys article, &lt;a href="http://aspnet.4guysfromrolla.com/articles/043004-1.aspx"&gt;Improving the Content Rater&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=162946" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category></item><item><title>Follow-Up to Allowing Readers to Rate Blog Entries</title><link>http://scottonwriting.net/sowblog/archive/2004/04/19/162909.aspx</link><pubDate>Mon, 19 Apr 2004 16:27:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:162909</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=162909</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2004/04/19/162909.aspx#comments</comments><description>In an &lt;a href="http://scottonwriting.net/sowblog/posts/1028.aspx"&gt;ealier entry&lt;/a&gt; I discussed a new feature I added to allow my blog readers to rate individual blog entries, much like one can rate the articles on &lt;a href="http://msdn.microsoft.com"&gt;MSDN&lt;/a&gt;.  I have written an article on creating the content rater at 4Guys called, aptly, &lt;a href="http://aspnet.4guysfromrolla.com/articles/042104-1.aspx"&gt;Creating a Content Rater&lt;/a&gt;.  The article includes the source code for the User Control, along with the stored procedures and table schema I added to my blog (which is running .Text 0.94).&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=162909" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/Miscellaneous/default.aspx">Miscellaneous</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category></item><item><title>Enhancing Your .Text Blog - Allowing Readers to Rate Blog Entries</title><link>http://scottonwriting.net/sowblog/archive/2004/04/15/162908.aspx</link><pubDate>Thu, 15 Apr 2004 20:12:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:162908</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=162908</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2004/04/15/162908.aspx#comments</comments><description>&lt;p&gt;One of the things I really like about .Text is just how easy it is to customize and enhance it.  Of course, the complete source is available, so you can customize to your heart's content, but I'm talking about customizing it without modifying the source and recompiling.  I've had past blog entries about customizing and digging into .Text (see &lt;a href="http://scottonwriting.net/sowblog/posts/708.aspx"&gt;Giving .Text a Calendar View&lt;/a&gt; and &lt;a href="http://scottonwriting.net/sowblog/posts/930.aspx"&gt;Analyzing your .Text Blog&lt;/a&gt;), and wanted to share my latest enhancement here on ScottOnWriting.NET: the ability for readers to rate a blog entry and leave feedback on why they made their rating (just like how &lt;a href="http://msdn.microsoft.com"&gt;MSDN&lt;/a&gt;'s online articles have a “Rate this feedback“ section at the end of each article).  The end result, you'll agree, looks pretty much just like Microsoft's rating interface, save that mine only allows you to rate from 1 to 5 instead of 1 to 9.  It uses cookies to do a half-assed effort at ensuring that folks only rate a blog entry once.&lt;/p&gt;
&lt;p&gt;If you're interested in adding this rating User Control to your .Text blog, I'll have the source for the User Control and an article discussing it on &lt;a href="http://www.4guysfromrolla.com"&gt;4Guys&lt;/a&gt; sometime next week.  What is cool about .Text (at least .Text 0.94, the version I'm using) is that the page layouts are specified in User Controls themselves (in the &lt;font face="Courier New"&gt;/Skins/&lt;em&gt;skinName&lt;/em&gt;/Controls/&lt;/font&gt; directory).  This means that I could, with just a quick edit in Notepad, adjust the main page so that after each blog entry in addition to the Feedback (&lt;em&gt;xxx&lt;/em&gt;) link, there's also a Rate Entry link, which will take you directly to the interface to link the blog entry.&lt;/p&gt;
&lt;p&gt;The natural extension to this would be to allow users to read / view the most popular (and perhaps least liked) posts...&lt;/p&gt;
&lt;p&gt;(The Rate Entry option is only available by visiting the ScottOnWriting.NET Web site directly.  I guess I could attempt to embed the necessary HTML into the RSS feed, but I doubt I'll do that, since for that (I believe), I &lt;em&gt;will&lt;/em&gt; need to edit the .Text source and recompile/redeploy.)&lt;/p&gt;
&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=162908" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/ASP.NET+Talk/default.aspx">ASP.NET Talk</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Miscellaneous/default.aspx">Miscellaneous</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category></item><item><title>Some More Interesting (To Me) Comment Statistics</title><link>http://scottonwriting.net/sowblog/archive/2004/03/28/162915.aspx</link><pubDate>Sun, 28 Mar 2004 15:03:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:162915</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=162915</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2004/03/28/162915.aspx#comments</comments><description>&lt;p&gt;After posting &lt;a href="http://scottonwriting.net/sowblog/posts/930.aspx"&gt;yesterday's analysis of comments on my blog&lt;/a&gt;, I decided to run a few more statistics.  My previous entry examined if there was a correlation between when a blog was posted (either day of the week or hour of the day) and how many comments it received.  As the stats showed, there was virtually no correlation between what hour of the day the blog entry was posted and the number of comments, but there was a slight correlation between the day of the week the entry was posted - specifically, entries made on Monday, Tuesday, or Wednesday had a much higher probability of generating more comments than those posted on Thursday, Friday, Saturday, or Sunday.  (&lt;a href="http://weblogs.asp.net/asmith/"&gt;Andy Smith&lt;/a&gt; &lt;a href="http://scottonwriting.net/sowblog/posts/930.aspx#937"&gt;mused&lt;/a&gt; that perhaps I had more interesting things to say on Monday as opposed to Friday; my assumption is that I am equally as likely to say interesting things on any given day of the week.)&lt;/p&gt;
&lt;p&gt;Anywho, I decided to examine when, on average, my readers made their comments, both in terms of time of day and day of week.  The results aren't too surprising.  For the day of the week, people were more likely to post during the week, especially during the middle of the weed (Tuesday, Wednesday, or Thursday):&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="3" align="center"&gt;
&lt;tbody&gt;
&lt;tr style="FONT-WEIGHT: bold; BACKGROUND-COLOR: rgb(153,153,153)" align="middle"&gt;
&lt;td&gt;Day&lt;/td&gt;
&lt;td&gt;Total&lt;/td&gt;
&lt;td&gt;% of Total&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sunday &lt;/td&gt;
&lt;td align="right"&gt;28&lt;/td&gt;
&lt;td align="right"&gt;8.8%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;Monday &lt;/td&gt;
&lt;td align="right"&gt;36&lt;/td&gt;
&lt;td align="right"&gt;11.4%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tuesday &lt;/td&gt;
&lt;td align="right"&gt;67&lt;/td&gt;
&lt;td align="right"&gt;21.1%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;Wednesday &lt;/td&gt;
&lt;td align="right"&gt;64&lt;/td&gt;
&lt;td align="right"&gt;20.2%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thursday &lt;/td&gt;
&lt;td align="right"&gt;62&lt;/td&gt;
&lt;td align="right"&gt;19.6%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;Friday &lt;/td&gt;
&lt;td align="right"&gt;41&lt;/td&gt;
&lt;td align="right"&gt;12.9%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saturday &lt;/td&gt;
&lt;td align="right"&gt;19&lt;/td&gt;
&lt;td align="right"&gt;6.0%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(255,255,204)"&gt;
&lt;td&gt;&lt;b&gt;Total&lt;/b&gt; &lt;/td&gt;
&lt;td align="right"&gt;317&lt;/td&gt;
&lt;td align="right"&gt;100.0%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;As for the hour of the day, the most probable posting time was between 8:00 AM and 12:00 PM PST (GMT -8).  This correlates to the working hours during most of the US, especially near the lunch hours in all four mainland US time zones.  There was also an increase in posting later at night, 9:00 PM and 10:00 PM.  I wonder if this was people posting at home, or people in Western Europe posting at their lunch break.&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="3" align="center"&gt;
&lt;tbody&gt;
&lt;tr style="FONT-WEIGHT: bold; BACKGROUND-COLOR: rgb(153,153,153)" align="middle"&gt;
&lt;td&gt;Hour&lt;/td&gt;
&lt;td&gt;Total&lt;/td&gt;
&lt;td&gt;% of Total&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12:00 AM &lt;/td&gt;
&lt;td align="right"&gt;9&lt;/td&gt;
&lt;td align="right"&gt;2.8%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;1:00 AM &lt;/td&gt;
&lt;td align="right"&gt;10&lt;/td&gt;
&lt;td align="right"&gt;3.2%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2:00 AM &lt;/td&gt;
&lt;td align="right"&gt;6&lt;/td&gt;
&lt;td align="right"&gt;1.9%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;3:00 AM &lt;/td&gt;
&lt;td align="right"&gt;8&lt;/td&gt;
&lt;td align="right"&gt;2.5%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4:00 AM &lt;/td&gt;
&lt;td align="right"&gt;2&lt;/td&gt;
&lt;td align="right"&gt;0.6%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;5:00 AM &lt;/td&gt;
&lt;td align="right"&gt;13&lt;/td&gt;
&lt;td align="right"&gt;4.1%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6:00 AM &lt;/td&gt;
&lt;td align="right"&gt;9&lt;/td&gt;
&lt;td align="right"&gt;2.8%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;7:00 AM &lt;/td&gt;
&lt;td align="right"&gt;11&lt;/td&gt;
&lt;td align="right"&gt;3.5%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8:00 AM &lt;/td&gt;
&lt;td align="right"&gt;18&lt;/td&gt;
&lt;td align="right"&gt;5.7%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;9:00 AM &lt;/td&gt;
&lt;td align="right"&gt;19&lt;/td&gt;
&lt;td align="right"&gt;6.0%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:00 AM &lt;/td&gt;
&lt;td align="right"&gt;19&lt;/td&gt;
&lt;td align="right"&gt;6.0%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;11:00 AM &lt;/td&gt;
&lt;td align="right"&gt;21&lt;/td&gt;
&lt;td align="right"&gt;6.6%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12:00 PM &lt;/td&gt;
&lt;td align="right"&gt;23&lt;/td&gt;
&lt;td align="right"&gt;7.3%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;1:00 PM &lt;/td&gt;
&lt;td align="right"&gt;17&lt;/td&gt;
&lt;td align="right"&gt;5.4%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2:00 PM &lt;/td&gt;
&lt;td align="right"&gt;12&lt;/td&gt;
&lt;td align="right"&gt;3.8%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;3:00 PM &lt;/td&gt;
&lt;td align="right"&gt;13&lt;/td&gt;
&lt;td align="right"&gt;4.1%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4:00 PM &lt;/td&gt;
&lt;td align="right"&gt;20&lt;/td&gt;
&lt;td align="right"&gt;6.3%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;5:00 PM &lt;/td&gt;
&lt;td align="right"&gt;12&lt;/td&gt;
&lt;td align="right"&gt;3.8%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6:00 PM &lt;/td&gt;
&lt;td align="right"&gt;7&lt;/td&gt;
&lt;td align="right"&gt;2.2%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;7:00 PM &lt;/td&gt;
&lt;td align="right"&gt;16&lt;/td&gt;
&lt;td align="right"&gt;5.0%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8:00 PM &lt;/td&gt;
&lt;td align="right"&gt;8&lt;/td&gt;
&lt;td align="right"&gt;2.5%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;9:00 PM &lt;/td&gt;
&lt;td align="right"&gt;17&lt;/td&gt;
&lt;td align="right"&gt;5.4%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:00 PM &lt;/td&gt;
&lt;td align="right"&gt;17&lt;/td&gt;
&lt;td align="right"&gt;5.4%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(238,238,238)"&gt;
&lt;td&gt;11:00 PM &lt;/td&gt;
&lt;td align="right"&gt;10&lt;/td&gt;
&lt;td align="right"&gt;3.2%&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="BACKGROUND-COLOR: rgb(255,255,204)"&gt;
&lt;td&gt;&lt;b&gt;Total&lt;/b&gt; &lt;/td&gt;
&lt;td align="right"&gt;317&lt;/td&gt;
&lt;td align="right"&gt;100.0%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;These stats - the distribution of when comments are made, and when comments are made relative to the date/time the blog entry was made - are not on my blog homepage, &lt;a href="http://www.scottonwriting.net/"&gt;ScottOnWriting.NET&lt;/a&gt;.  They are output cached for 15 minutes or so, but if you are interested you can always get a quick glance at when comments are made here on my blog.&lt;/p&gt;
&lt;p&gt;The last statistic I was interested in computing was the delta between when a blog entry was made and when a comment was made.  That is, does the average person who leaves a comment make the comment in an hour after the entry has been made?  12 hours?  24 hours?  48?  I ran the following query to determine this average delta:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;select avg(ParentDateAdded)&lt;br /&gt;from&lt;br /&gt;  (select dateadded, &lt;br /&gt;         (select datediff(hh, c.dateadded, b.dateadded) &lt;br /&gt;          from blog_content c &lt;br /&gt;          where c.id = b.parentid) as ParentDateAdded&lt;br /&gt;   from blog_content b &lt;br /&gt;   where b.blogid=0 and b.posttype=3) as blah&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The results?  The average time between when a blog entry was made and when a comment was left was 253 hours, or ten and a half days.  This number is skewed, though, by the fact that there are a handful of comments that are made to a blog entry several &lt;em&gt;months&lt;/em&gt; after the entry was made.  If we look at the median delta, it is a more reasonable 33 hours.&lt;/p&gt;
&lt;p&gt;With all of this information at our disposal, it's not surprising that Monday, Tuesday, and Wednesday are the days of the week whose blog entries generate the most comments.  After all, the average commenter leaves his or her comment a day and a half after the blog entry is made, and most people leave comments on Tuesday, Wednesday, or Thursday, so it follows, naturally, that the best time to make a blog entry would be on Monday, Tuesday, or Wednesday.&lt;/p&gt;
&lt;p&gt;So, let me leave you with this observation.  Assuming your blog's comments follow the same commenting distribution that mine does, if you enjoy comment discussions on your blog and have something interesting to blog about, make sure you save it til Monday, Tuesday, or Wednesday for maximum comments.&lt;/p&gt;&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=162915" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/Miscellaneous/default.aspx">Miscellaneous</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category></item><item><title>Analyzing Your .Text Blog</title><link>http://scottonwriting.net/sowblog/archive/2004/03/27/162914.aspx</link><pubDate>Sat, 27 Mar 2004 15:30:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:162914</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=162914</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2004/03/27/162914.aspx#comments</comments><description>&lt;p&gt;I'll be the first to admit it - I love statistics.  I like seeing pretty graphs and numbers and sums and averages and calculations and standard deviations and variances and forecasts and trends.  Anyway, one thing that annoys me with blogs is that it's impossible to know how many people read it.  Yes, there are Web site logs, which say that I had X total Web page requests per day, and Y unique sessions per day, but these numbers, when it comes to blogs, are terribly misleading.  The #1 requested page, for instance, is the syndication feed, &lt;font face="Courier New"&gt;/rss.aspx&lt;/font&gt;.  One person, who leaves their aggregator running 24-7, might request this page 12, 24, or 48 times per day.  Fine, you say, take the number of requests to the syndication feed and divide by, say, 15, to get a rough estimate on those who read the blog via aggregators.  But even that number could be way off.  For example, &lt;a href="http://www.bloglines.com/"&gt;BlogLines&lt;/a&gt; might hit my syndication feed 48 times a day, but there could be dozens, hundreds, or even thousands of readers who read the blog from that single requestor.&lt;/p&gt;
&lt;p&gt;So I've resigned myself to the fact that I won't ever be able to get a truly accurate guage on my blog readership, but what I can get a handle on is the comments.  As the default .Text interface shows, my blog has had - as of the time of writing this - 91 entries and 311 comments.  This morning my curiosity got the better of me and I wondered how those comments were distributed.  That is, do blog entries that occur on Mondays generate more comments on average than those blog entires made on Friday?  Also, when is the best time (relative to my time zone) to make a blog entry?  Midnight?  In the morning?  Around lunchtime?  In the afternoon?  After dinner?  Again, the “best time” I am interested in if posting at a certain time is more likely to generate more comments. (Another metric worth looking at is trackbacks (seeing if the date/time an entry is made increases/decreases the likelihood of folks using trackbacks), but I'll save that anaysis for another day.) &lt;/p&gt;
&lt;p&gt;Here are the statistics for my blog, as of March 27, 2004:&lt;/p&gt;
&lt;table cellspacing="1" cellpadding="4" align="center" border="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th bgcolor="#ffffee"&gt;Day of Week&lt;/th&gt;
&lt;th bgcolor="#ffffee"&gt;Avg. Comments&lt;/th&gt;
&lt;th bgcolor="#ffffee"&gt;Total Comments&lt;/th&gt;
&lt;th bgcolor="#ffffee"&gt;Blog Entries&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sunday&lt;/td&gt;
&lt;td align="right"&gt;4.2&lt;/td&gt;
&lt;td align="right"&gt;21&lt;/td&gt;
&lt;td align="right"&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monday&lt;/td&gt;
&lt;td align="right"&gt;4.4&lt;/td&gt;
&lt;td align="right"&gt;44&lt;/td&gt;
&lt;td align="right"&gt;10&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tuesday&lt;/td&gt;
&lt;td align="right"&gt;3.2&lt;/td&gt;
&lt;td align="right"&gt;54&lt;/td&gt;
&lt;td align="right"&gt;17&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wednesday&lt;/td&gt;
&lt;td align="right"&gt;4.1&lt;/td&gt;
&lt;td align="right"&gt;65&lt;/td&gt;
&lt;td align="right"&gt;16&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thursday&lt;/td&gt;
&lt;td align="right"&gt;3.7&lt;/td&gt;
&lt;td align="right"&gt;77&lt;/td&gt;
&lt;td align="right"&gt;21&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Friday&lt;/td&gt;
&lt;td align="right"&gt;2.3&lt;/td&gt;
&lt;td align="right"&gt;37&lt;/td&gt;
&lt;td align="right"&gt;16&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saturday&lt;/td&gt;
&lt;td align="right"&gt;2.2&lt;/td&gt;
&lt;td align="right"&gt;13&lt;/td&gt;
&lt;td align="right"&gt;6&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td bgcolor="#eeeeee"&gt;&lt;b&gt;TOTAL:&lt;/b&gt;&lt;/td&gt;
&lt;td align="right" bgcolor="#eeeeee"&gt;3.4&lt;/td&gt;
&lt;td align="right" bgcolor="#eeeeee"&gt;311&lt;/td&gt;
&lt;td align="right" bgcolor="#eeeeee"&gt;91&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;table cellspacing="1" cellpadding="4" align="center" border="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th bgcolor="#ffffee"&gt;Hour of Day&lt;/th&gt;
&lt;th bgcolor="#ffffee"&gt;Avg. Comments&lt;/th&gt;
&lt;th bgcolor="#ffffee"&gt;Total Comments&lt;/th&gt;
&lt;th bgcolor="#ffffee"&gt;Blog Entries&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12:00 AM&lt;/td&gt;
&lt;td align="right"&gt;7.5&lt;/td&gt;
&lt;td align="right"&gt;15&lt;/td&gt;
&lt;td align="right"&gt;2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8:00 AM&lt;/td&gt;
&lt;td align="right"&gt;0&lt;/td&gt;
&lt;td align="right"&gt;0.0&lt;/td&gt;
&lt;td align="right"&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9:00 AM&lt;/td&gt;
&lt;td align="right"&gt;7.3&lt;/td&gt;
&lt;td align="right"&gt;44&lt;/td&gt;
&lt;td align="right"&gt;6&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:00 AM&lt;/td&gt;
&lt;td align="right"&gt;3.7&lt;/td&gt;
&lt;td align="right"&gt;26&lt;/td&gt;
&lt;td align="right"&gt;7&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11:00 AM&lt;/td&gt;
&lt;td align="right"&gt;2.2&lt;/td&gt;
&lt;td align="right"&gt;28&lt;/td&gt;
&lt;td align="right"&gt;13&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12:00 PM&lt;/td&gt;
&lt;td align="right"&gt;4.3&lt;/td&gt;
&lt;td align="right"&gt;34&lt;/td&gt;
&lt;td align="right"&gt;8&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1:00 PM&lt;/td&gt;
&lt;td align="right"&gt;3.2&lt;/td&gt;
&lt;td align="right"&gt;25&lt;/td&gt;
&lt;td align="right"&gt;8&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2:00 PM&lt;/td&gt;
&lt;td align="right"&gt;3.7&lt;/td&gt;
&lt;td align="right"&gt;41&lt;/td&gt;
&lt;td align="right"&gt;11&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3:00 PM&lt;/td&gt;
&lt;td align="right"&gt;2.5&lt;/td&gt;
&lt;td align="right"&gt;10&lt;/td&gt;
&lt;td align="right"&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4:00 PM&lt;/td&gt;
&lt;td align="right"&gt;0.5&lt;/td&gt;
&lt;td align="right"&gt;2&lt;/td&gt;
&lt;td align="right"&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5:00 PM&lt;/td&gt;
&lt;td align="right"&gt;1.7&lt;/td&gt;
&lt;td align="right"&gt;5&lt;/td&gt;
&lt;td align="right"&gt;3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6:00 PM&lt;/td&gt;
&lt;td align="right"&gt;3.5&lt;/td&gt;
&lt;td align="right"&gt;21&lt;/td&gt;
&lt;td align="right"&gt;6&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7:00 PM&lt;/td&gt;
&lt;td align="right"&gt;0&lt;/td&gt;
&lt;td align="right"&gt;0&lt;/td&gt;
&lt;td align="right"&gt;3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8:00 PM&lt;/td&gt;
&lt;td align="right"&gt;5.2&lt;/td&gt;
&lt;td align="right"&gt;26&lt;/td&gt;
&lt;td align="right"&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9:00 PM&lt;/td&gt;
&lt;td align="right"&gt;5.5&lt;/td&gt;
&lt;td align="right"&gt;22&lt;/td&gt;
&lt;td align="right"&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:00 PM&lt;/td&gt;
&lt;td align="right"&gt;3.7&lt;/td&gt;
&lt;td align="right"&gt;11&lt;/td&gt;
&lt;td align="right"&gt;3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11:00 PM&lt;/td&gt;
&lt;td align="right"&gt;0.3&lt;/td&gt;
&lt;td align="right"&gt;1&lt;/td&gt;
&lt;td align="right"&gt;3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td bgcolor="#eeeeee"&gt;&lt;b&gt;TOTAL:&lt;/b&gt;&lt;/td&gt;
&lt;td align="right" bgcolor="#eeeeee"&gt;3.4&lt;/td&gt;
&lt;td align="right" bgcolor="#eeeeee"&gt;311&lt;/td&gt;
&lt;td align="right" bgcolor="#eeeeee"&gt;91&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;center&gt;&lt;img src="/sowblog/images/postsbyWeekDay.gif" /&gt;&lt;/center&gt;
&lt;p&gt; &lt;/p&gt;
&lt;center&gt;&lt;img src="/sowblog/images/postsbyHour.gif" /&gt;&lt;/center&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;The black lines in the graphs are trendlines. As you can see, the later in the week a blog entry is made, the less likely it is to receive comments. However, the hour of the day the entry is posted makes little difference on the number of comments it attracts. Of course, the strongest correlation between a blog entry and the number of comments it receives is likely the quality of the blog entry, but, assuming a "comment-provoking" blog entry is as likely to be made on one day of the week versus any other, the data shows that it's best to make that blog entry earlier in the week than later. &lt;/p&gt;
&lt;p&gt;Interested in running these statistical reports on your own .Text blog? If you have access to run queries on the SQL box your .Text blog uses, you can get these reports with just a single SQL statement. To get the comments by the day of week the blog entry was posted, use the following query:&lt;/p&gt;&lt;pre&gt;SELECT DayOfWeek, 
       AVG(CONVERT(decimal(5,0),PostCount)) as AvgPosts, 
       SUM(PostCount) as TotalComments, 
       COUNT(*) as BlogEntries
FROM
  (SELECT DATEPART(dw, DateAdded) as DayOfWeek, 
          (SELECT COUNT(*) FROM blog_content bc2 
           WHERE bc2.posttype = 3 AND bc2.blogid = 0 AND
                 bc2.ParentID = bc.ID) as PostCount
   FROM blog_content bc
   WHERE posttype = 1 AND blogid = 0) as SOWBlog
GROUP BY DayOfWeek
WITH ROLLUP
&lt;/pre&gt;
&lt;p&gt;To get the comments by hour the blog entry was posted use:&lt;/p&gt;&lt;pre&gt;SELECT HourAdded, 
       AVG(CONVERT(decimal(5,0),PostCount)) as AvgPosts, 
       SUM(PostCount) as TotalComments, 
       COUNT(*) as BlogEntries
FROM
  (SELECT DATEPART(hh, DateAdded) as HourAdded, 
          (SELECT COUNT(*) FROM blog_content bc2 
           WHERE bc2.posttype = 3 AND bc2.blogid = 0 AND
                 bc2.ParentID = bc.ID) as PostCount
   FROM blog_content bc
   WHERE posttype = 1 AND blogid = 0) as SOWBlog
GROUP BY HourAdded
WITH ROLLUP
&lt;/pre&gt;
&lt;p&gt;If enough people run (and publish) these queries, and the day of the week / hour of the day are standardized to some standard time zone, like GMT, we could determine, globally, when the best time to make a blog entry was for maximum commenting. :-) Another interesting statistic to help ascertain when folks were reading your blog would be to determine the average number of comments made per given day of the week / per given hour of the day. (Recall that the above statistics look at the comment count based on the day of the week / hour of the day the blog &lt;i&gt;entry&lt;/i&gt; was made.)&lt;/p&gt;&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=162914" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/Miscellaneous/default.aspx">Miscellaneous</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category></item><item><title>Giving .Text a Calendar View</title><link>http://scottonwriting.net/sowblog/archive/2004/02/12/162890.aspx</link><pubDate>Fri, 13 Feb 2004 02:13:00 GMT</pubDate><guid isPermaLink="false">2814ed8b-42a8-4dfe-b0b1-a7acb3e6d762:162890</guid><dc:creator>Scott Mitchell</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://scottonwriting.net/sowblog/rsscomments.aspx?PostID=162890</wfw:commentRss><comments>http://scottonwriting.net/sowblog/archive/2004/02/12/162890.aspx#comments</comments><description>&lt;p&gt;Many blog engines provide a calendar view when visiting the blog via the Web.  Typically the calendar shows the current month, with days that have one or more entries rendered as hyperlinks.  Clicking on the link for a given day displays the posts for that day.  Unfortunately .Text doesn't provide such a built-in calendar view, so I decided to create my own.  (As to why .Text doesn't include a calendar view, &lt;a href="http://scottwater.com/blog/"&gt;Scott Watermasysk&lt;/a&gt; indicated that there were issues with the &lt;a href="http://www.asp.net/Forums/ShowPost.aspx?tabindex=1&amp;amp;PostID=465946"&gt;ASP.NET Calendar control and CSS&lt;/a&gt;.  Not being a CSS expert, I'm not sure exactly what issues there are, but in my own experiment I'm happy with the rendered display of my calendar, and all stylesheets seem to be playing nicely together...)&lt;/p&gt;
&lt;p&gt;In any event, take a minute to check out the &lt;a href="http://scottonwriting.net/sowblog/"&gt;Scott on Writing&lt;/a&gt; homepage - up in the upper-right hand corner you can see a calendar view.  Pretty cool, eh?  I'd like to share how I accomplished this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DISCLAIMER: &lt;/strong&gt;To add the Calendar control I decided to take a path of least resistance, and actually had the entire thing written in under ten minutes.  I used a user control - a compiled control might be a better choice.  There may be more efficient techniques to use than I employed.  If you have suggestions on improvements, feel free to post them; if you want to use the code, feel free, but realize it was created hastily with a “let's get something working before my fiancee gets home from work”-attitude.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;TECHNICAL NOTE:&lt;/b&gt; I am using .Text 0.94 - I have no idea if this code will work “as-is“ with different versions. I imagine it would, although if the database schema has changed, that would require a slight update of the SQL query used to get the blog entries for a given month/year.... &lt;/p&gt;
&lt;p&gt;I started by creating a User Control and adding a Calendar.  My aim was to create an event handler for the Calendar's &lt;code&gt;DayRender&lt;/code&gt; event, and then see if the particular day being rendered had any posts and, if so, display a hyperlink to the correct &lt;code&gt;/archive/&lt;/code&gt; URL.  (To view the posts on MM/DD/YYYY, you can simply visit &lt;code&gt;/archive/MMDDYYYY.aspx&lt;/code&gt; - ah, the power of HTTP handlers.)&lt;/p&gt;
&lt;p&gt;Of course, I didn't want to have to hit the database once for &lt;b&gt;each&lt;/b&gt; day in the month, so I loaded &lt;i&gt;all&lt;/i&gt; of the blog entries from the month into a DataTable (ordered by the date of entry, in ascending order). The SQL query to run (which was moved into a stored procedure) was:&lt;/p&gt;
&lt;table bgcolor="#cccccc" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;SELECT DateAdded FROM blog_Content (nolock)
WHERE PostType=1 
      AND BlogID = @BlogID
      AND DATEPART(yyyy, DateAdded) = @Year 
      AND DATEPART(m, DateAdded) = @Month
ORDER BY DateAdded
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Here, &lt;code&gt;@BlogID&lt;/code&gt; is the ID of the blog whose dates of posts you want to show (if you are hosting multiple blogs on a single .Text install, each blog has its own &lt;code&gt;BlogID&lt;/code&gt;). &lt;code&gt;@Year&lt;/code&gt; and &lt;code&gt;@Month&lt;/code&gt; are the year and month of blog entries to get. (The &lt;code&gt;PostType=1&lt;/code&gt; gets only blog entries - not comments, tracebacks, etc.) &lt;/p&gt;
&lt;p&gt;In my User Control I have a DataTable (named &lt;code&gt;dates&lt;/code&gt;) scoped at the class level that is populated with the results of the above SQL query. The code that performs this follows: &lt;/p&gt;
&lt;table bgcolor="#cccccc" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;private void LoadMonthData()&lt;br /&gt;{&lt;br /&gt;   SqlConnection myConnection = new SqlConnection(&lt;i&gt;connection string&lt;/i&gt;);&lt;br /&gt;&lt;br /&gt;   SqlCommand myCommand = new SqlCommand("blog_GetBlogEntriesForMonth", myConnection);&lt;br /&gt;   myCommand.CommandType = CommandType.StoredProcedure&lt;br /&gt;&lt;br /&gt;   // selDate is the currently selected date...&lt;br /&gt;   myCommand.Parameters.Add(new SqlParameter("@Year", selDate.Year));&lt;br /&gt;   myCommand.Parameters.Add(new SqlParameter("@Month", selDate.Month));&lt;br /&gt;&lt;br /&gt;   SqlParameter blogID = new SqlParameter();&lt;br /&gt;   blogID.Value = 0;&lt;br /&gt;   blogID.ParameterName = "@BlogID";&lt;br /&gt;   myCommand.Parameters.Add(blogID);&lt;br /&gt;&lt;br /&gt;   // Fill the dates DataTable...&lt;br /&gt;   SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand);&lt;br /&gt;   myAdapter.Fill(dates);&lt;br /&gt;&lt;br /&gt;   myConnection.Close();&lt;br /&gt;&lt;br /&gt;   // Keep track of how many records are in the DataTable...&lt;br /&gt;   dateCount = dates.Rows.Count;&lt;br /&gt;} &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;In addition to having the &lt;code&gt;dates&lt;/code&gt; DataTable scoped at class level, I also have two additional &lt;code&gt;int&lt;/code&gt;s: one keeps track of how many total entries there are for the month (&lt;code&gt;dateCount&lt;/code&gt;), the other stored the index of the current record being examined in &lt;code&gt;dates&lt;/code&gt; (this variable is named &lt;code&gt;currentDate&lt;/code&gt;). &lt;/p&gt;
&lt;p&gt;In the event handler for the Calendar control's &lt;code&gt;DayRender&lt;/code&gt; event, I check to see if the current date being rendered equals the date in the current row in &lt;code&gt;dates&lt;/code&gt; being examined. If it does, I change the TableCell's &lt;code&gt;Text&lt;/code&gt; property to a hyperlink and update &lt;code&gt;currentDate&lt;/code&gt; accordingly - otherwise I do nothing. The code for this event handler follows:&lt;/p&gt;
&lt;table bgcolor="#cccccc" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;private void dayRender(object sender, DayRenderEventArgs e)&lt;br /&gt;{&lt;br /&gt;   if (currentDate &amp;lt; dateCount &amp;amp;&amp;amp; &lt;br /&gt;         e.Day.Date == Convert.ToDateTime(dates.Rows[currentDate]["DateAdded"]).Date)&lt;br /&gt;   {&lt;br /&gt;      e.Cell.Text = "&amp;lt;A href="\" +="" ?? archive sowBlog&amp;gt;&lt;br /&gt;               String.Format("{0:d2}{1:d2}{2:d4}",&lt;br /&gt;                     e.Day.Date.Month, e.Day.Date.Day, e.Day.Date.Year) + &lt;br /&gt;                     ".aspx\"&amp;gt;&amp;lt;U&amp;gt;" + e.Day.Date.Day + "&amp;lt;/U&amp;gt;&amp;lt;/A&amp;gt;";&lt;br /&gt;      // There might be multiple entries per day, so advance currentDate until&lt;br /&gt;      // we're on a different day...&lt;br /&gt;      do&lt;br /&gt;      {&lt;br /&gt;         currentDate++;&lt;br /&gt;      } while ((currentDate &amp;lt; dateCount &amp;amp;&amp;amp; &lt;br /&gt;            e.Day.Date == Convert.ToDateTime(dates.Rows[currentDate]["DateAdded"]).Date));&lt;br /&gt;   }&lt;br /&gt;} &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;There are some other slight details involved, but the above description spells out the bulk of the work that needed to be done. In order to insert the calendar view I edited the &lt;code&gt;PageTemplate.ascx&lt;/code&gt; User Control for my blog's appropriate skin. I also had to do a bit of tweaking with the &lt;code&gt;#leftmenu&lt;/code&gt;, &lt;code&gt;#main&lt;/code&gt;, and &lt;code&gt;#rightmenu&lt;/code&gt; CSS items to get the calendar to fit without forcing the user to have to scroll off to the right.&lt;/p&gt;
&lt;p&gt;If you are interested, you download the complete source code for the Calendar User Control &lt;a href="http://scottonwriting.net/sowBlog/CodeProjectFiles/cal.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://scottonwriting.net/aggbug.aspx?PostID=162890" width="1" height="1"&gt;</description><category domain="http://scottonwriting.net/sowblog/archive/tags/Miscellaneous/default.aspx">Miscellaneous</category><category domain="http://scottonwriting.net/sowblog/archive/tags/Blog+Enhancements/default.aspx">Blog Enhancements</category></item></channel></rss>