﻿<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>Ayende @ Rahien</title><link>http://ayende.com/blog/</link><description>Ayende @ Rahien</description><copyright>Copyright (C) Ayende Rahien  2004 - 2012 (c) 2013</copyright><ttl>60</ttl><item><title>What happened to the blog?</title><description>&lt;p&gt;You might have noticed that during the last day, we had duplicated posts. When I first saw that, I was shocked, there was absolutely no reason for this to have happened, and it seems that somehow the index or the database were corrupted. &lt;/p&gt; &lt;p&gt;We started investigating this, and we were able to reproduce this locally by using the database export. That was a great relief, because it meant that at least we could debug this. Once we were able to do that, we found out what the problem was. And basically, there &lt;em&gt;was&lt;/em&gt; no problem. It was a configuration error (actually, two of them) that caused the problem.&lt;/p&gt; &lt;p&gt;We accidently enabled versioning for the blog’s database, you can read more about RavenDB’s &lt;a href="http://ravendb.net/bundles/versioning"&gt;versioning bundle&lt;/a&gt; if you want, but basically, it keep copies of modified documents so you have an audit trail around. So far, so good, and no one noticed anything. But then we &lt;em&gt;removed&lt;/em&gt; versioning from the blog’s database, since after all, we didn’t need it there in the first place.&lt;/p&gt; &lt;p&gt;The problem is that in the meantime, the versioning bundle created all of those additional documents. While it was in operation, it would hide those documents (since they were there for historical purposes only), but once we removed it, all those historical documents showed up. The reason for the duplicate posts was that we &lt;em&gt;had&lt;/em&gt; duplicate posts, it was just that they were duplicate posts of the same post (the historical review).&lt;/p&gt; &lt;p&gt;Why did we have so many? Whenever you comment, we update the CommentCount field, so we had as many historical copies for most posts as we had comments. &lt;/p&gt; &lt;p&gt;Fixed now, and I apologize for the trouble.&lt;/p&gt; &lt;p&gt;As a general point of interest, bundles allows great flexibility in the database, but they are design to &lt;em&gt;be&lt;/em&gt; with the database. Removing and adding bundles to a database on the fly is not something that is going to just work, as we have just re-learned.&lt;/p&gt; &lt;p&gt;I apologize for the problem, it was a simple misconfiguration error that caused all the historical records to show up when they didn’t need to. Nothing to see here, move along &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://ayende.com/blog/Images/Windows-Live-Writer/What-happened-to-the-blog_C1CD/wlEmoticon-smile_2.png"&gt;&lt;/p&gt;</description><link>http://ayende.com/blog/133121/what-happened-to-the-blog?key=feac9bec-4aec-4851-8d26-eddf5ecb447d</link><guid>http://ayende.com/blog/133121/what-happened-to-the-blog?key=feac9bec-4aec-4851-8d26-eddf5ecb447d</guid><pubDate>Thu, 10 Nov 2011 08:53:26 GMT</pubDate></item><item><title>Raccoon Blog and RavenDB–One month later</title><description>&lt;p&gt;One of the fun parts about RavenDB is that it will self optimize itself for you depending on how you are using your data. &lt;/p&gt; &lt;p&gt;With this blog, I decided when going live with RavenDB that I &lt;em&gt;would not&lt;/em&gt; follow the best practices of ensuring static indexes for everything, but would let it figure it out on its own.&lt;/p&gt; &lt;p&gt;Today, I got curious and decided to check up on that:&lt;/p&gt; &lt;p&gt;&lt;a href="http://ayende.com/blog/Images/Windows-Live-Writer/RaccoonBlog-and-RavenDBOne-month-later_D4AD/image_4.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://ayende.com/blog/Images/Windows-Live-Writer/RaccoonBlog-and-RavenDBOne-month-later_D4AD/image_thumb_1.png" width="771" height="397"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;What you see is pretty interesting.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The first three indexes were automatically created by RavenDB in response to queries made on the database.&lt;/li&gt; &lt;li&gt;The Raven/* indexes are created by RavenDB itself, for the Raven Studio.&lt;/li&gt; &lt;li&gt;The MapReduce indexes are for statistics on the blog, and are the only two that were actually created by the application explicitly.&lt;/li&gt;&lt;/ul&gt;</description><link>http://ayende.com/blog/24577/raccoon-blog-and-ravendb-one-month-later?key=0a6d03ae-d684-4ffe-b1c8-c7510704d330</link><guid>http://ayende.com/blog/24577/raccoon-blog-and-ravendb-one-month-later?key=0a6d03ae-d684-4ffe-b1c8-c7510704d330</guid><pubDate>Fri, 24 Jun 2011 09:00:00 GMT</pubDate></item><item><title>Elegant Code, Raccoon Blog’s CSS Controller</title><description>&lt;p&gt;The following piece of code is responsible for the CSS generation for this blog:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CssController : Controller
{
     &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Merge(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] files)
     {
         var builder = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();
         &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var file &lt;span class="kwrd"&gt;in&lt;/span&gt; files)
         {
             var pathAllowed = Server.MapPath(Url.Content(&lt;span class="str"&gt;"~/Content/css"&lt;/span&gt;));
             var normalizeFile = Server.MapPath(Url.Content(Path.Combine(&lt;span class="str"&gt;"~/Content/css"&lt;/span&gt;, file)));
             &lt;span class="kwrd"&gt;if&lt;/span&gt; (normalizeFile.StartsWith(pathAllowed) == &lt;span class="kwrd"&gt;false&lt;/span&gt;)
             {
                 &lt;span class="kwrd"&gt;return&lt;/span&gt; HttpNotFound(&lt;span class="str"&gt;"Path not allowed"&lt;/span&gt;);
             }
             &lt;span class="kwrd"&gt;if&lt;/span&gt; (System.IO.File.Exists(normalizeFile))
             {
                 Response.AddFileDependency(normalizeFile);
                 builder.AppendLine(System.IO.File.ReadAllText(normalizeFile));
             }
         }

         Response.Cache.VaryByParams[&lt;span class="str"&gt;"files"&lt;/span&gt;] = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
         Response.Cache.SetLastModifiedFromFileDependencies();
         Response.Cache.SetETagFromFileDependencies();
         Response.Cache.SetCacheability(HttpCacheability.Public);

         var css = dotless.Core.Less.Parse(builder.ToString(), &lt;span class="kwrd"&gt;new&lt;/span&gt; DotlessConfiguration());

         &lt;span class="kwrd"&gt;return&lt;/span&gt; Content(css, &lt;span class="str"&gt;"text/css"&lt;/span&gt;);
     }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are a &lt;em&gt;lot&lt;/em&gt; of things going on in a very short amount of code. The CSS for this blog is defined as:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;="stylesheet"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="text/css"&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;="/blog/css?files=ResetCss.css&amp;amp;files=custom/ayende.settings.less.css&amp;amp;files=base.less.css&amp;amp;files=custom/ayende.less.css"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;/blockquote&gt;
&lt;p&gt;This means that while we have multiple CSS files that make maintaining things easier, we only make a single request to the server to get all of them.&lt;/p&gt;
&lt;p&gt;Next, and &lt;strong&gt;important&lt;/strong&gt;, we have a security check that ensures that only files from the appropriate path can be served. If you aren’t in the CSS directory, you won’t be returned.&lt;/p&gt;
&lt;p&gt;Then we have a lot of code that is related to caching, which basically means that we will rely on the ASP.Net output cache to do everything for us. The really nice thing is that unless the files change, we will not be executing this code again, rather, it would be served directly from the cache, without any computation on our part.&lt;/p&gt;
&lt;p&gt;All in all, I am more than happy with this code.&lt;/p&gt;</description><link>http://ayende.com/blog/13314/elegant-code-raccoon-blogs-css-controller?key=825581e2-8891-4abc-ae67-779a0494cc46</link><guid>http://ayende.com/blog/13314/elegant-code-raccoon-blogs-css-controller?key=825581e2-8891-4abc-ae67-779a0494cc46</guid><pubDate>Tue, 07 Jun 2011 09:00:00 GMT</pubDate></item><item><title>A public request for code review: Raccoon Blog</title><description>&lt;p&gt;I really like this idea:&lt;/p&gt; &lt;p&gt;&lt;a href="http://ayende.com/blog/Images/Windows-Live-Writer/Dont-worry-shame-yourself_F461/image_2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://ayende.com/blog/Images/Windows-Live-Writer/Dont-worry-shame-yourself_F461/image_thumb.png" width="730" height="109"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The code is available here: &lt;a href="http://github.com/ayende/RaccoonBlog/"&gt;http://github.com/ayende/RaccoonBlog/&lt;/a&gt;&lt;/p&gt;</description><link>http://ayende.com/blog/6145/a-public-request-for-code-review-raccoon-blog?key=1cc67422-4c01-4c79-a2c4-54aa25df166b</link><guid>http://ayende.com/blog/6145/a-public-request-for-code-review-raccoon-blog?key=1cc67422-4c01-4c79-a2c4-54aa25df166b</guid><pubDate>Mon, 16 May 2011 09:00:00 GMT</pubDate></item><item><title>And now… Raccoon Blog</title><description>&lt;p&gt;&lt;img style="display: inline; float: right" align="right" src="http://www.gargmag.com/raccoon.jpg" /&gt;One of the things that people kept bugging me about is that I am not building applications any longer, another annoyance was with my current setup using this blog.&lt;/p&gt;  &lt;p&gt;Basically, my own usage pattern is quite different than most people. I tend to post to the blog in batches, usually of five or ten blog posts in a short amount of time. That means that future posts are pretty important to me, and that scheduling posts is something that I care deeply about. I managed to hack Subtext to do my bidding in that regard, but it was never perfect, and re-scheduling posts was always a pain in the ass.&lt;/p&gt;  &lt;p&gt;Then there is RavenDB, and my desire to run on it…&lt;/p&gt;  &lt;p&gt;What this means, in short, is that we now have the &lt;a href="https://github.com/ayende/RaccoonBlog"&gt;Raccoon Blog&lt;/a&gt;, which is a blog application suited specifically for my own needs, running on MVC 3 and with a RavenDB backend.&lt;/p&gt;  &lt;p&gt;By the time you read it, it will already be running our &lt;a href="http://blog.hibernatingrhinos.com/"&gt;company blog&lt;/a&gt; and it is scheduled to run &lt;a href="http://ayende.com/blog"&gt;ayende.com/blog&lt;/a&gt; this week.&lt;/p&gt;  &lt;p&gt;What is Raccoon Blog?&lt;/p&gt;  &lt;p&gt;It is a blog application running on top of RavenDB store and tailored specifically for our needs.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Strong scheduling features&lt;/li&gt;    &lt;li&gt;Strong re-scheduling features&lt;/li&gt;    &lt;li&gt;Support multiple authors in a single blog&lt;/li&gt;    &lt;li&gt;Single blog per site (no multi blog support)&lt;/li&gt;    &lt;li&gt;Recaptcha support&lt;/li&gt;    &lt;li&gt;Markdown support for comments (you’ll be able to post code!)&lt;/li&gt;    &lt;li&gt;Easy section support (for custom sidebar content)&lt;/li&gt;    &lt;li&gt;Smart tagging support&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And just for fun:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Fully HTML 5 compliant&lt;/li&gt; &lt;/ul&gt;</description><link>http://ayende.com/blog/4837/and-now-raccoon-blog?key=8365fa90-7086-4f77-a75c-701f4524d3a2</link><guid>http://ayende.com/blog/4837/and-now-raccoon-blog?key=8365fa90-7086-4f77-a75c-701f4524d3a2</guid><pubDate>Wed, 11 May 2011 09:00:00 GMT</pubDate></item><item><title>Goodbye, ayende.com</title><description>&lt;blockquote&gt;Originally posted at 5/5/2011&lt;/blockquote&gt;&lt;p&gt;The last time that I updated ayende.com was 2009, and I don’t see a lot of value in keeping it there. I am considering doing something drastic about that, and simply moving the blog to ayende.com.&lt;/p&gt;  &lt;p&gt;Do you have anything there that you really care about?&lt;/p&gt;  &lt;p&gt;Just to be clear, the &lt;em&gt;blog will still be here&lt;/em&gt;, we are talking about the site available at ayende.com, not ayende.com/blog.&lt;/p&gt;</description><link>http://ayende.com/blog/4834/goodbye-ayende-com?key=920079d9-3380-4d83-8a89-aa4277429f8c</link><guid>http://ayende.com/blog/4834/goodbye-ayende-com?key=920079d9-3380-4d83-8a89-aa4277429f8c</guid><pubDate>Sat, 07 May 2011 09:00:00 GMT</pubDate></item><item><title>Smart post re-scheduling with Subtext</title><description>&lt;p&gt;As you know, I uses future posting quite heavily, which is awesome, as long as I keep to the schedule. Unfortunately, when you have posts two or three weeks in advance, it is actually quite common for you need to post things in a more immediate sense.&lt;/p&gt;  &lt;p&gt;And that is just a pain. I just added smart re-scheduling to my &lt;a href="http://github.com/ayende/subtext"&gt;fork of Subtext&lt;/a&gt;. Basically, it is very simple. If I post now, I want the post now. If I post it in the future, move everything one day ahead. If I post with no date, put it as the last item on the queue.&lt;/p&gt;  &lt;p&gt;This is the test for this feature.&lt;/p&gt;</description><link>http://ayende.com/blog/4676/smart-post-re-scheduling-with-subtext?key=547d1de7-0c40-4cd7-b466-a97a774b8b75</link><guid>http://ayende.com/blog/4676/smart-post-re-scheduling-with-subtext?key=547d1de7-0c40-4cd7-b466-a97a774b8b75</guid><pubDate>Thu, 28 Oct 2010 14:45:00 GMT</pubDate></item><item><title>I need my own blog software, damn it</title><description>&lt;p&gt;I am well aware that I am… outside the curve for bloggers. For a long while I handled that by simply dumping the posts as soon as I wrote them, but that turned out to be quite a burden for some readers, and pieces that I think deserve more attention were skipped, because they were simply drowning in the noise of so many blog posts.&lt;/p&gt;  &lt;p&gt;I am &lt;em&gt;much &lt;/em&gt;happier with the future posting concept. It make things more predictable, both for me and for the readers. The problem happen when you push this to its logical conclusion. At the time of this writing, I have a month of scheduled posts ahead of me, and this is the third or forth blog post that I wrote in the last 24 hours.&lt;/p&gt;  &lt;p&gt;In essence, I created a convoy for my own blog. At some point, if this trend progresses, it will be a problem. But I kinda like the fact that I can relax for a month and the blog will function on auto pilot. There is also the nice benefit that by the time that the blog post is published, &lt;em&gt;I&lt;/em&gt; forgot what it said (I use the write &amp;amp; forget method), so I need to read the post again, which helps, a lot.&lt;/p&gt;  &lt;p&gt;But there are some disadvantages to this as well. My current system will simply schedule a post on the next day after the last day. This works, great, if I have posts that are not time sensitive. But what actually happen is that there are &lt;em&gt;lot&lt;/em&gt; of scenarios in which I want to set the date of the post to the near future. I still &lt;em&gt;try&lt;/em&gt; to keep it to one post a day, so that means that I need to shuffle the rest of the items in the queue, though. This is especially troubling when you consider that I usually write a series of posts that interconnect to a full story.&lt;/p&gt;  &lt;p&gt;So I can’t just take one of them and bump it to the end, I might have to do rearranging of the entire timeline. And there is no support for that, I have to go and manually update the timing for everything else. &lt;/p&gt;  &lt;p&gt;It is pretty clear why this feature is missing, it is an outlier one. But it probably means that i am going to fork SubText and add those things. And the &lt;em&gt;real&lt;/em&gt; problem is that I would really like to avoid doing any UI work there. So I need to think about a system that would let me do that without any UI work from my part.&lt;/p&gt;</description><link>http://ayende.com/blog/4619/i-need-my-own-blog-software-damn-it?key=f9b244d3-123e-4fbd-a1aa-6f7340656920</link><guid>http://ayende.com/blog/4619/i-need-my-own-blog-software-damn-it?key=f9b244d3-123e-4fbd-a1aa-6f7340656920</guid><pubDate>Sun, 05 Sep 2010 09:00:00 GMT</pubDate></item><item><title>On comments and social interaction</title><description>&lt;p&gt;I got a request in email to add something like &lt;a href="http://disqus.com/"&gt;Disqus&lt;/a&gt; to my blog, which would allow a richer platform for the commenting that goes on here. I think that the request and my reply are interesting enough to warrant this blog post. &lt;/p&gt;  &lt;p&gt;My comment system is the default subtext one, but there are several advantages to the way it works. You can read the full explanation in &lt;a href="http://www.joelonsoftware.com/articles/BuildingCommunitieswithSo.html"&gt;Joel on Software&lt;/a&gt; post about the matter, but basically, threading encourages people to go off in tangents, single thread of conversation make it significantly easier to have only one conversation.&lt;/p&gt;  &lt;p&gt;There is another reason, which is personally important to me, which is that I want to "own" the comments. Not own in terms of copyright, but own in terms of having control of the data itself. Having the comments (a hugely important part of the blog) being managed by a 3rd party which might shut down and take all the comments with it is not acceptable.&lt;/p&gt;  &lt;p&gt;That is probably a false fear, but it is something that I take under consideration. The reasoning about the type of interaction going on in the comments is a lot more important. There is also something else to consider, if a post gets too hot (generating too many comments), I am either going to close comments on it, or open a new post with summary of what went on in the previous post comment thread anyway, so it does have some checks &amp;amp; balances that keep a comment thread from growing too large.&lt;/p&gt;</description><link>http://ayende.com/blog/4354/on-comments-and-social-interaction?key=2fdfaa3f-4676-448f-a952-6bbef114de90</link><guid>http://ayende.com/blog/4354/on-comments-and-social-interaction?key=2fdfaa3f-4676-448f-a952-6bbef114de90</guid><pubDate>Thu, 07 Jan 2010 10:00:00 GMT</pubDate></item><item><title>What happened to technorati?</title><description>&lt;p&gt;Recently all my technorati feeds started to give me stuff like this: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Whathappenedtotechnorati_12481/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Whathappenedtotechnorati_12481/image_thumb.png" width="767" height="315" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;It looks like someone managed to crack the way that technorati is searching feeds, and I am getting what amounts to spammed search results. If this continues, it looks like I’ll just have to give up on it completely.&lt;/p&gt;  &lt;p&gt;Any good alternatives?&lt;/p&gt;</description><link>http://ayende.com/blog/4283/what-happened-to-technorati?key=521999c5-2e3d-4f20-bfa8-dd99ae698921</link><guid>http://ayende.com/blog/4283/what-happened-to-technorati?key=521999c5-2e3d-4f20-bfa8-dd99ae698921</guid><pubDate>Sun, 08 Nov 2009 18:48:32 GMT</pubDate></item><item><title>Impleo – a CMS I can tolerate</title><description>&lt;p&gt;If you head out to &lt;a title="http://hibernatingrhinos.com/" href="http://hibernatingrhinos.com/"&gt;http://hibernatingrhinos.com/&lt;/a&gt;, you will see that I finally had the time to setup the corporate site. This is still &lt;em&gt;very&lt;/em&gt; early, but I have a lot of content to add there, but it is a start.&lt;/p&gt;  &lt;p&gt;Impleo, the CMS running the site, doesn’t have any web based interface, instead, it is built explicitly to take advantage of Windows Live Writer and similar tools. The “interface” for editing the site is the MetaWeblog API. This means that in order to edit the site, there isn’t any Wiki syntax to learn, or XML files to edit, or anything of this sort.&lt;/p&gt;  &lt;p&gt;You have a powerful editor in your fingertips, one that properly handle things like adding images and other content. This turn the whole experience around. I usually find documentation boring, but I am &lt;em&gt;used&lt;/em&gt; to writing in WLW, it is fairly natural to do, and it removes all the pain from the equation. &lt;/p&gt;  &lt;p&gt;One of the things that I am trying to do with it is to setup a proper documentation repository for all my open source projects. This isn’t something new, and it is something that most projects have a hard time doing. I strongly believe in making things &lt;em&gt;simple&lt;/em&gt;, in reducing friction. What I hope to do is to be able to accept documentation contributions from the community for the OSS projects.&lt;/p&gt;  &lt;p&gt;I think that having a full fledged rich text editor in your hands is a game changer, compared to the usual way OSS handle documentation.  Take a look at what is &lt;a href="http://hibernatingrhinos.com/cms/setup"&gt;needed to make this works&lt;/a&gt;, it should take three minutes to get started, no learning curve, no “how do they do this”. &lt;/p&gt;  &lt;p&gt;So here is the deal, if you would like to contribute documentation (which can be &lt;em&gt;anything&lt;/em&gt; that would help users with the projects), I just made things much easier for you. Please contact me directly and I’ll send you the credentials to be able to edit the site.&lt;/p&gt;  &lt;p&gt;Thanks in advance for your support.&lt;/p&gt;</description><link>http://ayende.com/blog/4266/impleo-a-cms-i-can-tolerate?key=7cdc7e29-0baf-4fee-8d0a-66b834a92d7c</link><guid>http://ayende.com/blog/4266/impleo-a-cms-i-can-tolerate?key=7cdc7e29-0baf-4fee-8d0a-66b834a92d7c</guid><pubDate>Sun, 25 Oct 2009 03:50:00 GMT</pubDate></item><item><title>ayende.com move process completed</title><description>&lt;p&gt;The server is now hosted at &lt;a href="http://gogrid.com"&gt;GoGrid&lt;/a&gt;, it took longer than I anticipated because I also moved it to EC2 to test &lt;em&gt;that &lt;/em&gt;(post about this is already in the queue, and will show up in about 2 weeks).&lt;/p&gt;  &lt;p&gt;Commenting is now enabled, and it all should just work. Please let me know if something is broken.&lt;/p&gt;</description><link>http://ayende.com/blog/4214/ayende-com-move-process-completed?key=902e9cb7-5c7a-45df-b534-72da4e3e7ffe</link><guid>http://ayende.com/blog/4214/ayende-com-move-process-completed?key=902e9cb7-5c7a-45df-b534-72da4e3e7ffe</guid><pubDate>Fri, 25 Sep 2009 23:21:22 GMT</pubDate></item><item><title>ayende.com is moving servers – some interruption may result</title><description>&lt;p&gt;Well, the blog has grown a bit too large for my current host, and I decided that I need to move it elsewhere.&lt;/p&gt;  &lt;p&gt;In order to make the move easier, I am disabling commenting site-wide. I’ll try to make this as fast as possible.&lt;/p&gt;</description><link>http://ayende.com/blog/4211/ayende-com-is-moving-servers-some-interruption-may-result?key=b1cf0c95-aaef-4789-bbcf-f2f8a9c9d4e7</link><guid>http://ayende.com/blog/4211/ayende-com-is-moving-servers-some-interruption-may-result?key=b1cf0c95-aaef-4789-bbcf-f2f8a9c9d4e7</guid><pubDate>Thu, 24 Sep 2009 12:35:13 GMT</pubDate></item><item><title>Automation, Mark 1</title><description>&lt;p&gt;I just got this email:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;I seem to get automatic E-Mail notifications if you answer a comment from me on your blog. I asked our admin to enable this for our team blog, but he came up empty. Any hints?&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;My reply was a bit disappointing, I guess.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Yes,  &lt;/p&gt;    &lt;p&gt;It works like this. &lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;You post a comment to my blog. &lt;/li&gt;      &lt;li&gt;I get an email. &lt;/li&gt;      &lt;li&gt;I answer the comment in gmail, send it to you. &lt;/li&gt;      &lt;li&gt;I then copy the reply to the blog and post it.&lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;Sorry, no magic here :-)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It would be a nice feature, but by this time this is part of my workflow of answering comment.&lt;/p&gt;</description><link>http://ayende.com/blog/4188/automation-mark-1?key=4cc87609-2858-41ac-b848-7a6a366486b7</link><guid>http://ayende.com/blog/4188/automation-mark-1?key=4cc87609-2858-41ac-b848-7a6a366486b7</guid><pubDate>Fri, 11 Sep 2009 18:32:00 GMT</pubDate></item><item><title>Is blogging dead?</title><description>&lt;p&gt;This is a reply to &lt;a href="http://www.lostechies.com/blogs/chad_myers/archive/2009/08/31/is-blogging-dead.aspx"&gt;Chad Myers post about this question&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;My answer: No.&lt;/p&gt;</description><link>http://ayende.com/blog/4161/is-blogging-dead?key=b04ccb2b-e50c-4b49-8e13-29e9a830da48</link><guid>http://ayende.com/blog/4161/is-blogging-dead?key=b04ccb2b-e50c-4b49-8e13-29e9a830da48</guid><pubDate>Tue, 01 Sep 2009 07:47:25 GMT</pubDate></item><item><title>How do you manage to blog so much?</title><description>&lt;p&gt;In a recent email thread, I was asked:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;How come that you manage to post and comment that much? I bet you spend really loads of time on your blog.&lt;/p&gt;    &lt;p&gt;The reason why I ask is because roughly a month ago I've decided to roll out my own programming blog. I've made three or four posts there     &lt;br /&gt;(in 5 days) and abandoned the idea because it was consuming waaaaay too much time (like 2-3 hours per post)&lt;/p&gt;    &lt;p&gt;The only problem is time. If I'm gonna to post that much every day (and eventually also answer to comments), it seems that my effective working time would be cut by 3+ hours. Daily.  So here comes my original question. How come that you manage to post and comment that much?&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And here is my answer:&lt;/p&gt;  &lt;p&gt;I see a lot of people in a similar situation. I have been blogging for 6 years now (Wow! how the the time flies), and I have started from a blog that has zero readers to one that has a respectable readership. There are only two things that I do that are in any way unique. First, my "does it fit to be blogged about?" level is pretty low. If it is interesting (to &lt;em&gt;me&lt;/em&gt;), it will probably go to the blog.&lt;/p&gt;  &lt;p&gt;Second, I don't mind pushing a blog post that requires fixing later. It usually takes me ten minutes to put out a blog post, so I can literally have a thought, post it up and move on, without really noticing it hurting my workflow. And the mere act of putting things in writing for others to read is a significant one, it allows me to look at things in writing in a way that is hard to do when they are just in my head.&lt;/p&gt;  &lt;p&gt;It &lt;i&gt;does&lt;/i&gt; take time, make no mistakes about that. The 10 minutes blog post is about 30% of my posts, in a lot of cases, it is something that I have to work on for half an hour. In some rare cases, it goes to an hour or two. There have been several dozens of posts that took &lt;em&gt;days&lt;/em&gt;. But while it started out as a hobby, it has become part of my work now. The blog is my marketing effort, so to speak. And it is an &lt;em&gt;effective &lt;/em&gt;one.&lt;/p&gt;  &lt;p&gt;Right now, I have set it up so about once a week I am spending four or five hours crunching out blog posts and future posting them. Afterward, I can blog whenever I feel like, and that takes a lot of the pressure off. It helps that I am trying &lt;em&gt;hard&lt;/em&gt; to schedule most of them day after day. So I get a lot of breathing room, but there is new content every day. &lt;/p&gt;  &lt;p&gt;That doesn’t mean that I actually blog once a week, though. I push stuff to the blog all the time, but it is usually short notes, not posts that take a lot of time.&lt;/p&gt;  &lt;p&gt;As for comments, take a look at my commenting style, I am generally commenting only when I actually have something to add to the conversation, and I very rarely have long comments (if I do, they turn into posts :-) ).&lt;/p&gt;  &lt;p&gt;It also doesn’t take much time to reply to most of them, and it creates a feedback cycle that means that more people are participating and reading the blog. It is rare that I post a topic that &lt;em&gt;really&lt;/em&gt; stir people up and that I feel obligated to respond to all/most of the comments. That &lt;em&gt;does&lt;/em&gt; bother me, because it takes too much time. In those cases, I’ll generally close the comment threads with a note about that.&lt;/p&gt;  &lt;p&gt;One final thought, the time I spend blogging is not wasted. It is well spent. Because it is an investment in reputation, respectability and familiarization.&lt;/p&gt;</description><link>http://ayende.com/blog/4154/how-do-you-manage-to-blog-so-much?key=cafc83b4-eda7-4bf4-8e92-b14795473993</link><guid>http://ayende.com/blog/4154/how-do-you-manage-to-blog-so-much?key=cafc83b4-eda7-4bf4-8e92-b14795473993</guid><pubDate>Sat, 29 Aug 2009 07:44:00 GMT</pubDate></item><item><title>Blog posts ideas, remapped</title><description>&lt;p&gt;Wow,&lt;/p&gt;  &lt;p&gt;I got a &lt;em&gt;lot&lt;/em&gt; of suggestions for new blog posts. I am not promising that I would do all of them, but I am going to try.&lt;/p&gt;  &lt;p&gt;The experiment went well enough that I decided to create a &lt;a href="https://nhprof.uservoice.com/pages/24233-new-posts-suggestions"&gt;dedicated forum&lt;/a&gt; for this, which would allow people to also vote for individual post topics, and give me better idea what people want to see.&lt;/p&gt;  &lt;p&gt;I also moved all the previous suggestions to the &lt;a href="https://nhprof.uservoice.com/pages/24233-new-posts-suggestions"&gt;new forum&lt;/a&gt;, and I think that I’ll make it a regular feature.&lt;/p&gt;</description><link>http://ayende.com/blog/4081/blog-posts-ideas-remapped?key=2ef17eb0-f9bf-4b63-b491-772383b99ee6</link><guid>http://ayende.com/blog/4081/blog-posts-ideas-remapped?key=2ef17eb0-f9bf-4b63-b491-772383b99ee6</guid><pubDate>Fri, 24 Jul 2009 21:15:15 GMT</pubDate></item><item><title>Extending SubText to report Future Posts</title><description>&lt;p&gt;Since I am making so much use of future posts recently, I decided that it would be interesting to have a sidebar that shows the future posts. The problem is that I &lt;em&gt;really&lt;/em&gt; don’t want to mess around with SubText.&lt;/p&gt;  &lt;p&gt;This is not a slight against SubText, it has served me well for a &lt;em&gt;long&lt;/em&gt; time. It is simply that for what I wanted, the number of steps that I would have to go through is &lt;em&gt;way&lt;/em&gt; too long:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Get the relevant source&lt;/li&gt;    &lt;li&gt;Compile it on my machine&lt;/li&gt;    &lt;li&gt;Figure out SubText’s architecture and where I should make my changes&lt;/li&gt;    &lt;li&gt;Upload a new version of the blog engine&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;It is possible, but it just take too long. Moreover, it would most certainly break the next time that I would update SubText, because I would forget all about it. &lt;/p&gt;  &lt;p&gt;But it is not the only way to get stuff done, however. Here is my solution:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I actually had a bug here related to time zone handling, fixed now.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; I used the 3.5 TimeZone semantics for this, but my server is running 2.0, use an okay hack instead. And fixed potential issue with &amp;lt; &amp;amp; &amp;gt; in the titles.&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&amp;lt;%@ Page Language="&lt;span style="color: #8b0000"&gt;C#&lt;/span&gt;" %&amp;gt;
&amp;lt;%@ OutputCache Duration="&lt;span style="color: #8b0000"&gt;60&lt;/span&gt;" VaryByParam="&lt;span style="color: #8b0000"&gt;None&lt;/span&gt;" %&amp;gt;

&amp;lt;%@ Import Namespace="&lt;span style="color: #8b0000"&gt;System.Data.SqlClient&lt;/span&gt;" %&amp;gt;
&amp;lt;%@ Import Namespace="&lt;span style="color: #8b0000"&gt;System.Configuration&lt;/span&gt;" %&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;%
&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; connectionString = ConfigurationManager.ConnectionStrings["&lt;span style="color: #8b0000"&gt;subtextData&lt;/span&gt;"].ConnectionString;
&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;(SqlConnection connection = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SqlConnection(connectionString))
{
	connection.Open();
	
	&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;(SqlCommand cmd = connection.CreateCommand())
	{
		cmd.CommandText = @"&lt;span style="color: #8b0000"&gt;
select top 15 Id, DateSyndicated, Title from subtext_Content
where DateSyndicated &amp;gt; @nowIsrael
order by DateSyndicated
&lt;/span&gt;";
		DateTime nowIsrael = DateTime.UtcNow.AddHours(3);
		
		cmd.Parameters.AddWithValue("&lt;span style="color: #8b0000"&gt;nowIsrael&lt;/span&gt;",nowIsrael);
		
		&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;(SqlDataReader reader = cmd.ExecuteReader())
		{
			&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(reader.HasRows == &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;)
			{
				%&amp;gt;&amp;lt;li&amp;gt;Queue &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; empty&amp;lt;/li&amp;gt;&amp;lt;%
			}
			&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;(reader.Read())
			{
				DateTime dateSyndicated = (DateTime)reader["&lt;span style="color: #8b0000"&gt;DateSyndicated&lt;/span&gt;"];
				&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; title = (&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;) reader["&lt;span style="color: #8b0000"&gt;Title&lt;/span&gt;"];
				&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; formattedSyndication;
				TimeSpan timeLeft = dateSyndicated - DateTime.Now;
				
				&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (timeLeft.Days &amp;gt; 7)
					formattedSyndication = timeLeft.Days / 7 + "&lt;span style="color: #8b0000"&gt; weeks &lt;/span&gt;" + timeLeft.Days % 7 + "&lt;span style="color: #8b0000"&gt; days&lt;/span&gt;";
				&lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (timeLeft.Days &amp;gt; 0)
					formattedSyndication = timeLeft.Days + "&lt;span style="color: #8b0000"&gt; days&lt;/span&gt;";
				&lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (timeLeft.Hours &amp;gt; 0)
					formattedSyndication = timeLeft.Hours + "&lt;span style="color: #8b0000"&gt; hours&lt;/span&gt;";
				&lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (timeLeft.Minutes &amp;gt; 0)
					formattedSyndication = timeLeft.Minutes + "&lt;span style="color: #8b0000"&gt; minutes&lt;/span&gt;";
				&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;
					formattedSyndication = "&lt;span style="color: #8b0000"&gt;In a moment&lt;/span&gt;";
				
				%&amp;gt;
				&amp;lt;li&amp;gt;&amp;lt;%= formattedSyndication %&amp;gt; &amp;lt;br /&amp;gt; &amp;lt;%= Server.HtmlEncode(title) %&amp;gt;&amp;lt;/li&amp;gt;
				&amp;lt;%
			}			
		}
	}
}
%&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;And then it was just a matter of changing the template to include the following JavaScript:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;$('#futurePosts').load('http://ayende.com/Blog/FuturePosts.aspx');&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that is it. It works, it is safe, it can’t really break anything, and it will probably survive blog upgrades.&lt;/p&gt;</description><link>http://ayende.com/blog/4078/extending-subtext-to-report-future-posts?key=7476ef1e-b041-4239-b4e2-a1d519cd9bcf</link><guid>http://ayende.com/blog/4078/extending-subtext-to-report-future-posts?key=7476ef1e-b041-4239-b4e2-a1d519cd9bcf</guid><pubDate>Thu, 23 Jul 2009 19:49:38 GMT</pubDate></item><item><title>Blog posts ideas</title><description>&lt;p&gt;Here is something a little different, I am going to open the suggestion box for blogging ideas.&lt;/p&gt;  &lt;p&gt;Just jot them down &lt;a href="http://nhprof.uservoice.com/pages/17880-general/suggestions/263744-new-posts-ideas"&gt;here&lt;/a&gt;, and I’ll try to get to them.&lt;/p&gt;</description><link>http://ayende.com/blog/4073/blog-posts-ideas?key=0dd285f9-e2b8-4b29-8395-20915d32eb6e</link><guid>http://ayende.com/blog/4073/blog-posts-ideas?key=0dd285f9-e2b8-4b29-8395-20915d32eb6e</guid><pubDate>Tue, 21 Jul 2009 15:02:34 GMT</pubDate></item><item><title>Blog Analytics</title><description>&lt;p&gt;This is for the blog, for the last month:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/BlogAnalytics_AFBD/image_2.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="106" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/BlogAnalytics_AFBD/image_thumb.png" width="332" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Some more interesting stats are when you go into the keywords:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/BlogAnalytics_AFBD/image_4.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="261" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/BlogAnalytics_AFBD/image_thumb_1.png" width="129" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And if I try to break it up a bit, it gets even more interesting:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;NHibernate related searches are responsible for ~13% of the traffic on the site&lt;/li&gt;    &lt;li&gt;Rhino Mocks is responsible for just ~1.7%&lt;/li&gt;    &lt;li&gt;Generic Rhino Tools stuff,4.7%&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;But looking at my traffic sources is even more interesting:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/BlogAnalytics_AFBD/image_6.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="251" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/BlogAnalytics_AFBD/image_thumb_2.png" width="541" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I expected Google to be a major contributor to the traffic, but I quite surprised by &lt;a href="http://www.reddit.com/domain/ayende.com"&gt;reddit&lt;/a&gt; being so important there. Mostly because I don’t think that I submitted stories there.&lt;/p&gt;</description><link>http://ayende.com/blog/3998/blog-analytics?key=403dc1e4-2ecc-41ee-bc87-c1a913a6cc2d</link><guid>http://ayende.com/blog/3998/blog-analytics?key=403dc1e4-2ecc-41ee-bc87-c1a913a6cc2d</guid><pubDate>Thu, 07 May 2009 09:29:00 GMT</pubDate></item></channel></rss>