<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Tom Moertel's Weblog: Category site news</title>
    <link>http://blog.moertel.com/articles/category/site-news</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Quality rants on programming theory and stuff geeks like</description>
    <item>
      <title>I have written a short novel's worth of content for my blog</title>
      <description>&lt;p&gt;How much content have I written for my blog?  Let&amp;#8217;s find out.&lt;/p&gt;


	&lt;p&gt;My blog runs on &lt;a href="http://typosphere.org/"&gt;Typo&lt;/a&gt;, which is built upon
&lt;a href="http://www.rubyonrails.com/"&gt;Ruby on Rails&lt;/a&gt;.  Let&amp;#8217;s fire up the Rails
console and gather a quick word count:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="global"&gt;$ &lt;/span&gt;&lt;span class="ident"&gt;cd&lt;/span&gt; ~&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;blog&lt;/span&gt;
&lt;span class="global"&gt;$ &lt;/span&gt;&lt;span class="ident"&gt;ruby&lt;/span&gt; &lt;span class="ident"&gt;script&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;console&lt;/span&gt; 
&lt;span class="constant"&gt;Loading&lt;/span&gt; &lt;span class="ident"&gt;development&lt;/span&gt; &lt;span class="ident"&gt;environment&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;
&lt;span class="punct"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;article&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;
&lt;span class="punct"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Article&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:all&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;inject&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;sum&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;sum&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt;
       &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;body&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;extended&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_s&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;split&lt;/span&gt;&lt;span class="punct"&gt;(/&lt;/span&gt;&lt;span class="regex"&gt;&lt;span class="escape"&gt;\s&lt;/span&gt;+&lt;/span&gt;&lt;span class="punct"&gt;/).&lt;/span&gt;&lt;span class="ident"&gt;length&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;66665&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;So I have written about 66 kilo-words, which is entering &lt;a href="http://en.wikipedia.org/wiki/Novel"&gt;novel
territory&lt;/a&gt;.  Paperback-wise,
it&amp;#8217;s about 190 pages.&lt;/p&gt;


	&lt;p&gt;All I need now is a villain and some cool cover art.&lt;/p&gt;


&lt;code&gt;;-)&lt;/code&gt;</description>
      <pubDate>Fri, 30 Mar 2007 00:34:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:7f3fdbe1-3f38-4322-b8d2-0ab67f887114</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2007/03/30/i-have-written-a-short-novels-worth-of-content-for-my-blog</link>
      <category>site news</category>
      <category>rails</category>
      <category>writing</category>
      <category>rails</category>
      <category>writing</category>
      <category>words</category>
      <category>word_count</category>
      <category>blog</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/426</trackback:ping>
    </item>
    <item>
      <title>Minor site churn</title>
      <description>&lt;p&gt;I&amp;#8217;m going through some of my older posts and adding tags to them. I&amp;#8217;m also colorizing source-code snippets when I find them. Both changes will cause articles to be updated, so if you&amp;#8217;re subscribed to one of my feeds, you may be seeing some old content again. Sorry about that.&lt;/p&gt;</description>
      <pubDate>Sat, 04 Nov 2006 14:48:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:7c0df5a6-7326-4b34-8755-c37155b8d691</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2006/11/04/minor-site-churn</link>
      <category>site news</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/209</trackback:ping>
    </item>
    <item>
      <title>Adding reddit and del.icio.us buttons to articles in Typo</title>
      <description>&lt;p&gt;Here&amp;#8217;s quick patch I made to my &lt;a href="http://typosphere.org"&gt;Typo&lt;/a&gt; 4.0
installation to add &lt;a href="http://reddit.com"&gt;Reddit&lt;/a&gt; and
&lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt; buttons to articles.  Now one click
is all it takes to submit an article to either site.  (These buttons
appear on my blog at the end of each article.)&lt;/p&gt;


	&lt;p&gt;If you want to apply the patch, be sure to also place copies of the
button images into &lt;code&gt;public/images&lt;/code&gt;.  You can snag the
images from my site or from the Reddit and del.icio.us sites.&lt;/p&gt;


	&lt;p&gt;Here&amp;#8217;s the patch:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;--- typo.orig/app/helpers/articles_helper.rb    2006-07-24 11:04:27.000000000 -0400
+++ typo/app/helpers/articles_helper.rb    2006-08-09 17:06:51.000000000 -0400
@@ -73,7 +74,26 @@
       code &amp;lt;&amp;lt; tag_links(article)        unless article.tags.empty?
       code &amp;lt;&amp;lt; comments_link(article)    if article.allow_comments?
       code &amp;lt;&amp;lt; trackbacks_link(article)  if article.allow_pings?
-    end.join("&amp;amp;nbsp;&amp;lt;strong&amp;gt;|&amp;lt;/strong&amp;gt;&amp;amp;nbsp;")
+      code &amp;lt;&amp;lt; submit_this_article_links(article)
+    end.join("&amp;amp;nbsp;| ")
+  end
+
+  def submit_this_article_links(article)
+    u_url = u(url_of(article, false))
+    u_title = u(article.title)
+    [  # move me into a database table
+      [ "Submit to Reddit.com",
+        "http://reddit.com/submit?url=&amp;lt;URL&amp;gt;&amp;#38;title=&amp;lt;TITLE&amp;gt;",
+        image_tag("reddit.gif", :size =&amp;gt; "18x18", :border =&amp;gt; 0)
+      ],
+      [ "Save to del.icio.us",
+        "http://del.icio.us/post?v=2&amp;#38;url=&amp;lt;URL&amp;gt;&amp;#38;title=&amp;lt;TITLE&amp;gt;",
+        image_tag("delicious.gif", :size =&amp;gt; "16x16", :border =&amp;gt; 0)
+      ]
+    ].map do |submit_title, submit_url, image_tag|
+      submit_url = submit_url.gsub(/&amp;lt;URL&amp;gt;/, u_url).gsub(/&amp;lt;TITLE&amp;gt;/, u_title)
+      %(&amp;lt;a href="#{h submit_url}" title="#{h submit_title}: &amp;amp;#x201C;#{h article.title}&amp;amp;#x201D;"&amp;gt;#{image_tag}&amp;lt;/a&amp;gt;)
+    end.join("&amp;amp;nbsp;")
   end

   def category_links(article)
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;The code is begging for a little refactoring love, but I&amp;#8217;m off for vacation
in about twenty minutes, so it will have to wait.&lt;/p&gt;</description>
      <pubDate>Wed, 09 Aug 2006 18:25:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:517cb441-e204-4713-94c5-321917af0d73</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2006/08/09/adding-reddit-and-del-icio-us-buttons-to-articles-in-typo</link>
      <category>site news</category>
      <category>typo</category>
      <category>hacks</category>
      <category>typo</category>
      <category>reddit</category>
      <category>delicous</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/152</trackback:ping>
    </item>
    <item>
      <title>Upgrading my blog to run Typo 4.0</title>
      <description>&lt;p&gt;If my blog looks a little weird right now, please bear with me. I am
in the process of upgrading from Typo 2.6.0 to Typo 4.0, and so far
the process has been somewhat painful.&lt;/p&gt;


	&lt;p&gt;The new Typo installer did not have much luck upgrading my blog to the
new version. After fighting and solving a succession of errors and
confidence-sapping problems, I decided to abandon the upgrade
process. Instead, I changed to the course most likely to result in a
stable configuration: to install a new blog and then move my content
over to it.&lt;/p&gt;


	&lt;p&gt;The content-moving process was easier than it might sound. I manually
migrated the old blog database to the new database format; dumped it
to a &lt;span class="caps"&gt;SQL&lt;/span&gt; file; edited the file to remove all but the &lt;span class="caps"&gt;INSERT&lt;/span&gt; statements
for articles, comments, pages, and so on; and then I loaded the
statements into the new database.&lt;/p&gt;


	&lt;p&gt;I did not copy over my configuration and sidebar information, however,
because I figured it would be safer to use the Typo-4.0 defaults,
those being the most tested. I also recreated my user account from
scratch.&lt;/p&gt;


	&lt;p&gt;So far the blog seems to be running stably, enough at least
for me to restore public access again.   But I still have more
restoration ahead.  Next I will work on restoring my espresso theme.&lt;/p&gt;


&lt;div class="update"&gt;
&lt;strong&gt;Update 2006-07-26:&lt;/strong&gt; I have now restored my espresso theme. For a while I was considering using &lt;a href="http://quotedprintable.com/pages/scribbish"&gt;Scribbish&lt;/a&gt;, which is delightfully clean by comparison, but it has not yet been updated to support much of Typo 4.0&amp;#8217;s goodness. Maybe later.
&lt;/div&gt;</description>
      <pubDate>Mon, 24 Jul 2006 13:34:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:3adc6c1c-9bfe-4c2a-b1c3-a346ce975100</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2006/07/24/upgrading-my-blog-run-to-typo-4-0</link>
      <category>site news</category>
      <category>typo</category>
      <category>typo</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/146</trackback:ping>
    </item>
    <item>
      <title>A quick look at my blog's web statistics</title>
      <description>&lt;p&gt;Every so often I check the stats for my blog to see which articles are
popular and learn how people are finding the blog.  I just checked the
stats today, and, if you are curious, here is a summary of what I found.&lt;/p&gt;


	&lt;h3&gt;Most popular articles&lt;/h3&gt;


	&lt;p&gt;As of today, for the month of July 2006, the ten most-visited articles on my blog are as follows:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;(235) &lt;a href="http://blog.moertel.com/articles/2005/05/08/taking-the-unsafe-gets-out-of-rails"&gt;Taking the unsafe GETs out of Rails&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;(229) &lt;a href="http://blog.moertel.com/articles/2005/11/15/verizon-fios-fiber-optic-internet-service-a-first-look"&gt;Verizon FiOS fiber-optic Internet service: a first look&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;(149) &lt;a href="http://blog.moertel.com/articles/2006/01/30/good-stuff-aldo-coffee-company"&gt;Good stuff: Aldo Coffee Company&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;(127) &lt;a href="http://blog.moertel.com/articles/2004/03/13/concurrent-port-scanner-in-haskell"&gt;Concurrent port scanner in Haskell&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;(121) &lt;a href="http://blog.moertel.com/articles/2006/01/17/mining-gold-from-the-internet-movie-database-part-1"&gt;Mining gold from the Internet Movie Database, part 1: decoding user ratings&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;(118) &lt;a href="http://blog.moertel.com/articles/2006/06/23/new-server-arrives-my-adventure-in-dell-customer-support-hell"&gt;New server arrives: my adventure in Dell customer-support Hell&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;(110) &lt;a href="http://blog.moertel.com/articles/2004/08/27/open-source-statistics-r-and-ess"&gt;Open-source statistics: R and &lt;span class="caps"&gt;ESS&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;(103) &lt;a href="http://blog.moertel.com/articles/2005/08/27/power-parsing-with-haskell-and-parsec"&gt;Power parsing with Haskell and Parsec&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;(093) &lt;a href="http://blog.moertel.com/articles/2006/06/27/dell-support-follow-up-survey"&gt;Dell-support follow-up survey&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;(089) &lt;a href="http://blog.moertel.com/articles/2006/05/03/unofficial-answers-to-faqs-about-giant-eagles-fuelperks-gas-discount"&gt;Unofficial answers to FAQs about Giant Eagle&amp;#8217;s &amp;#8216;fuelperks&amp;#8217; gas discount&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;The numbers in parentheses are the articles&amp;#8217; relative-popularity
scores.  Each score tells you how popular an article was when compared
to the blog&amp;#8217;s root page, which has a reference score of 1000.&lt;/p&gt;


	&lt;h3&gt;Most popular search keywords&lt;/h3&gt;


	&lt;p&gt;The ten most popular search keywords that led people to my blog are
as follows:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=rails"&gt;rails&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=fios"&gt;fios&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=verizon"&gt;verizon&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=haskell"&gt;haskell&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=ruby"&gt;ruby&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=link_to"&gt;link_to&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=statistics"&gt;statistics&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=button_to"&gt;button_to&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=source"&gt;source&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=r"&gt;r&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Many of these were combined with other terms as part of a search phrase.
For example, &amp;#8220;rails&amp;#8221; was often used in the following phrases:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=rails+link_to"&gt;rails link_to&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=rails+button_to"&gt;rails button_to&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=rails+button+helper"&gt;rails button helper&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=rails+link_to+html_options"&gt;rails link_to html_options&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=rails+form+confirm"&gt;rails form confirm&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=confirm+form+post+rails"&gt;confirm form post rails&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.google.com/search?hl=en&amp;#38;q=user+agent+in+rails"&gt;user agent in rails&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h3&gt;Spam&lt;/h3&gt;


	&lt;p&gt;Over the last 30 days, there have been on average 244 attempts per day to post
spam to my blog (stdev = 96).&lt;/p&gt;


	&lt;h3&gt;That&amp;#8217;s it&lt;/h3&gt;


	&lt;p&gt;And that&amp;#8217;s the stats!&lt;/p&gt;</description>
      <pubDate>Thu, 20 Jul 2006 10:43:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:7855edfeb5992359901c4e4b873e08e5</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2006/07/20/a-quick-look-at-my-blogs-web-statistics</link>
      <category>site news</category>
      <category>statistics</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/78</trackback:ping>
    </item>
    <item>
      <title>Claiming my blog on Bloglines</title>
      <description>&lt;p&gt;&lt;a href="http://www.bloglines.com/"&gt;Bloglines&lt;/a&gt; now offers a way to &lt;a href="http://www.bloglines.com/about/news#108"&gt;claim your blogs&lt;/a&gt;.  Ordinarily, I never bother to do stuff like this. But Bloglines has at least three versions of my blog in their catalog.  I would like to consolidate these into a single entry, something Bloglines claims I can do if I register my blog.&lt;/p&gt;


	&lt;p&gt;The registration process is somewhat annoying, but I can see why it is necessary. In short, I must add a Bloglines-given identifier to my blog&amp;#8217;s &lt;span class="caps"&gt;HTML&lt;/span&gt; template.  Then I must add another Bloglines-given identifier to a blog post.  These allow Bloglines to verify that the blog&amp;#8217;s website and feed are both under my control.&lt;/p&gt;

	&lt;p&gt;I&amp;#8217;ll let you know how it goes.&lt;/p&gt;

&lt;div class="update"&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I was able to claim my blog but not its outdated entries in Bloglines's catalog.  Neither Bloglines's instructions nor error reporting is specific enough for me to figure out what is wrong. I'm giving up for now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 2 (2006-07-15):&lt;/strong&gt; I was able to claim one of the outdated entries that had caused Bloglines to choke before. The other entries, however, are still problematic.  Bloglines does have more-descriptive error reporting now, but those reports do not inspire confidence:&lt;/p&gt;

&lt;blockquote&gt;&lt;div&gt;&lt;em&gt;Verification Failed:&lt;br /&gt;

An Unidentified Error occured &lt;/em&gt;[sic]&lt;em&gt; while talking to (null) or http://blog.moertel.com/xml/rss/feed.xml?snip=start.&lt;/em&gt;
&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;Capitalizing &amp;#8220;Unidentified Error&amp;#8221; is a nice touch: it makes the error seem both mysterious &lt;em&gt;and&lt;/em&gt; important.
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 3 (2006-07-20):&lt;/strong&gt; All of my feeds on Bloglines are now consolidated under a single entry. What's the secret? Ruthless URL canonicalization. I perused my logs and found all of the various URLs that Bloglines was using to access my feed. Then I configured my front-end proxy server to redirect (401 permanent) all of them to my preferred feed URL.  After a week or so, Bloglines's software took the hint and consolidated the entries.&lt;/p&gt;

&lt;/div&gt;


&lt;!-- ckey="7C2EDA33" --&gt;
&lt;!-- ckey="56A922DE" --&gt;
&lt;!-- ckey="7F3E6657" --&gt;
&lt;!-- ckey="0C22B934" --&gt;

</description>
      <pubDate>Wed, 05 Jul 2006 10:44:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:df654e6c9dd9bf84b43ce62c8349ff91</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2006/07/05/claiming-my-blog</link>
      <category>site news</category>
      <category>bloglines</category>
      <category>identity</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/74</trackback:ping>
    </item>
    <item>
      <title>Unexpected downtime</title>
      <description>&lt;p&gt;My &lt;a href="http://blog.moertel.com/"&gt;blog&lt;/a&gt; and the &lt;a href="http://community.moertel.com/"&gt;Community Projects site&lt;/a&gt; were down for about twelve hours yesterday. Both were hosted on one of my few non-RAID servers.  As happens to servers from time to time, the poor beast suffered a hard-drive failure.&lt;/p&gt;


	&lt;p&gt;After a bit of diagnosing, I decided to decommission the server rather than repair it. Keeping a non-RAID system going isn&amp;#8217;t worth the effort these days.  Hard drives fail too often, and restoring from backup is too time consuming.&lt;/p&gt;


	&lt;p&gt;Most of downed server&amp;#8217;s duties are now handled by one of its beefier, &lt;span class="caps"&gt;RAID&lt;/span&gt;-served brethren.  I have opted not to move some of the low-priority services (e.g., the &lt;a href="http://community.moertel.com/ss/space/LectroTest"&gt;LectroTest&lt;/a&gt; mailing list) over just now.  A new server should be arriving in a few days, and it will make a more logical home for these jobs.&lt;/p&gt;</description>
      <pubDate>Sat, 17 Jun 2006 18:49:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:c39b7b34e3023913c6cb3c4dc9d82ad6</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2006/06/17/unexpected-downtime</link>
      <category>site news</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/69</trackback:ping>
    </item>
    <item>
      <title>A simple Apache recipe for migrating blog articles to a new host</title>
      <description>&lt;p&gt;In &lt;a href="http://blog.moertel.com/articles/2006/01/21/everything-old-is-new-again-moving-content-over-from-my-old-blog"&gt;Everything old is new
again&lt;/a&gt;,
I wrote that I was moving articles from my old blog over to my new
Typo-powered blog (here).  Now that the process is underway, I need to
make sure that people looking for my old articles can find them at
their new home.  To solve this problem, I am using a simple Apache httpd
recipe to redirect requests for the old articles to the corresponding
updated articles on my new blog.  In case you need to do something
similar some day, here is the recipe.&lt;/p&gt;


	&lt;h3&gt;First, set up a mapping file&lt;/h3&gt;


	&lt;p&gt;Create a two-column mapping file that you can use to map each
article&amp;#8217;s old location to its corresponding new location.  If there
are any parts of the locations that never change, you can factor them
out to reduce clutter.&lt;/p&gt;


	&lt;p&gt;For example, the article &amp;#8220;My New Radio &lt;span class="caps"&gt;VCR&lt;/span&gt;&amp;#8221; has the following old and
new locations (the constant parts are emphasized):&lt;/p&gt;


	&lt;table style="background: #eee; margin-bottom: 2ex;"&gt;
		&lt;tr&gt;
			&lt;td&gt; Old &lt;/td&gt;
			&lt;td&gt; = &lt;strong&gt;http://community.moertel.com/ss/space&lt;/strong&gt;/2004-02-20  &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; New &lt;/td&gt;
			&lt;td&gt; = &lt;strong&gt;http://blog.moertel.com/&lt;/strong&gt;articles/2004/02/20/my-new-radio-vcr &lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;




	&lt;p&gt;Its entry in my mapping file looks like this:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;# File: /path/to/conf/old-blog-to-new.txt
# Map articles from old blog to new blog.
#
# OLD LOCATION    NEW LOCATION
# .../ss/space/X  http://blog.moertel.com/Y

...               ...
2004-02-20        articles/2004/02/20/my-new-radio-vcr
...               ...
&lt;/code&gt;&lt;/pre&gt;

	&lt;h3&gt;Second, configure Apache to use the mapping file&lt;/h3&gt;


	&lt;p&gt;Edit the Apache configuration that controls the old locations.
Add a set of 
&lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html"&gt;mod_rewrite&lt;/a&gt; rules to
match requests for the old locations and redirect them to the
corresponding new locations, using the mapping file as a reference.  For example,
here is my configuration:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;# in Apache's configuration for community.moertel.com

RewriteEngine on
RewriteMap blogmap txt:/path/to/conf/old-blog-to-new.txt
RewriteCond ${blogmap:$1|NOT-FOUND} !=NOT-FOUND
RewriteRule ^/ss/space/(.+) http://blog.moertel.com/${blogmap:$1} [R=301,L]
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;The first line makes sure that mod_rewrite is active.&lt;/p&gt;


	&lt;p&gt;The second line tells Apache to load the mapping file.  Apache will
cache the mapping file&amp;#8217;s contents for speed, but it is smart enough to
reload the file when modified.  That means you can add new entries to
the mapping file at any time, and Apache will act on them immediately,
no restart or reload required.  Every time I moved an article over to
the new blog, for example, I just edited the mapping file, and the new
location &amp;#8220;went live,&amp;#8221; replacing the old.&lt;/p&gt;


	&lt;p&gt;The third line says that the recipe is conditional upon
there being a matching entry in the mapping file.  If no entry
exists, the recipe will not apply, and the request will be handled
as usual.&lt;/p&gt;


&lt;p&gt;The final line defines the rewrite rule.  In this example, it tries
to match requests that start with &amp;#8221;/ss/space/&lt;em&gt;X_&amp;#8221;, where _X&lt;/em&gt; is any
suffix. (The prefix &amp;#8220;http://community.moertel.com&amp;#8221; is implied because
this configuration is for the community.moertel.com site.) If the
request matches, &lt;em&gt;X&lt;/em&gt; is stored in the &lt;code&gt;$1&lt;/code&gt; variable.
Then &amp;#8211; and this is one of those things that makes mod_rewrite seem
tricky &amp;#8211; the condition defined in the &lt;em&gt;previous&lt;/em&gt; line is tested using the current
value of &lt;code&gt;$1&lt;/code&gt;.  If the condition is satisfied, the request
is redirected to http://blog.moertel.com/&lt;em&gt;Y_, where _Y&lt;/em&gt; is the
corresponding location for &lt;em&gt;X&lt;/em&gt;, according to the mapping file.&lt;/p&gt;

	&lt;p&gt;The &lt;code&gt;[R=301,L]&lt;/code&gt; part of the rewrite rule is important.  It
specifies that redirects should be of the 301-Permanent variety.  This
advertises to the world that the new locations are intended to
&lt;em&gt;replace&lt;/em&gt; the old locations.  Using permanent redirects also ensures
that any &lt;a href="http://en.wikipedia.org/wiki/Google_juice"&gt;Google juice&lt;/a&gt; that
may have accumulated for my articles follows them to their new
home.&lt;/p&gt;


	&lt;h3&gt; Third, activate the new configuration&lt;/h3&gt;


	&lt;p&gt;This part is easy:  restart Apache to make sure it turns on the
rewrite engine and activates the new configuration directives.&lt;/p&gt;


	&lt;h3&gt; Finally, test it out&lt;/h3&gt;


	&lt;p&gt;To see if everything is working properly, visit an article&amp;#8217;s
old location to see if you are redirected to the corresponding
new location.  For example:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://community.moertel.com/ss/space/2004-02-20"&gt;http://community.moertel.com/ss/space/2004-02-20&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;If you click on this link, you should be redirected to blog.moertel.com.&lt;/p&gt;


	&lt;p&gt;And that&amp;#8217;s the recipe.&lt;/p&gt;</description>
      <pubDate>Mon, 06 Feb 2006 17:52:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:e15c26dc481101280414328cf179e6b0</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2006/02/06/a-simple-apache-recipe-for-migrating-blog-articles-to-a-new-host</link>
      <category>site news</category>
      <category>web development</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/51</trackback:ping>
    </item>
    <item>
      <title>Everything old is new again: moving content over from my old blog.</title>
      <description>&lt;p&gt;As you may know, a few months ago I moved my blog from its old system, powered by &lt;a href="http://snipsnap.org/"&gt;SnipSnap&lt;/a&gt; over to a new system, powered by the delightful and easier-to-hack-on &lt;a href="http://typo.leetsoft.com/"&gt;Typo&lt;/a&gt;.  Now that everything has been running comfortably for a few months, I am going to move some of my old blog&amp;#8217;s content over to Typo.&lt;/p&gt;


	&lt;p&gt;At first I planned on writing a program to handle the move for me.  It would pull from SnipSnap&amp;#8217;s database, convert the markup of the articles, and drop the results into Typo&amp;#8217;s database.  After reviewing my old content, however, I have changed my plans.&lt;/p&gt;


	&lt;p&gt;My new plan is to cherry-pick the most interesting stuff and move it over.  Some of the old stuff is too out of date or too tied to SnipSnap&amp;#8217;s integrated wiki to be sensibly extracted and integrated into the new blog.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m starting the move today.  If you see a &amp;#8220;new&amp;#8221; article that has an old date, you&amp;#8217;ll know why.&lt;/p&gt;


	&lt;p&gt;Cheers,&lt;br&gt;
Tom&lt;/p&gt;</description>
      <pubDate>Sat, 21 Jan 2006 16:04:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:4bf931661f682d18171d39de1333f06c</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2006/01/21/everything-old-is-new-again-moving-content-over-from-my-old-blog</link>
      <category>site news</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/25</trackback:ping>
    </item>
    <item>
      <title>Top-ten weblog usability mistakes: My blog's scorecard</title>
      <description>&lt;p&gt;Jakob Nielsen&amp;#8217;s Alertbox for 17 October 2005
is &lt;a href="http://www.useit.com/alertbox/weblogs.html"&gt;Weblog Usability: The Top Ten Design Mistakes&lt;/a&gt;.  In other words, it&amp;#8217;s a top-ten list of things &lt;em&gt;not&lt;/em&gt; to do on your blog if you care about usability.&lt;/p&gt;


	&lt;p&gt;Since I care about usability, I decided to test my own weblog against
Jakob&amp;#8217;s top-ten list.  How did I fare?&lt;/p&gt;


	&lt;p&gt;Let&amp;#8217;s see:&lt;/p&gt;


&lt;div style="text-align: center; width:100%"&gt;Top Ten Weblog Usability Mistakes&lt;/div&gt;

&lt;ol&gt;

&lt;li&gt;&lt;strong&gt;No author biography: &lt;em&gt;Fail&lt;/em&gt;.&lt;/strong&gt; Oops, got me there.  While I have a &lt;a href="http://community.moertel.com/ss/space/tmoertel"&gt;bio on
the Community Projects site&lt;/a&gt;,
I don&amp;#8217;t even link to it from my blog.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;No author photo: &lt;em&gt;Fail&lt;/em&gt;.&lt;/strong&gt; Oops, again.  I don&amp;#8217;t have a photo of myself on
the blog, nor on any other site (that I know of).&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Nondescript posting titles: &lt;em&gt;Pass&lt;/em&gt;.&lt;/strong&gt; I generally give my posts
informative titles such as
&lt;a href="http://community.moertel.com/ss/space/start/2005-08-22/1#How_to_change_symlinks_atomically"&gt;How to change symlinks atomically&lt;/a&gt;
and
&lt;a href="http://community.moertel.com/ss/space/start/2005-08-10/1#Simple_data_formats_are_not_going_away"&gt;Simple data formats are not going away&lt;/a&gt;.
Only rarely do I use cutesy
titles such as
&lt;a href="http://community.moertel.com/ss/space/start/2005-08-24/1#On_the_effortless_cultivation_of_humility"&gt;On the effortless cultivation of humility&lt;/a&gt;, where readers are forced
to guess what the post is about.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Links don&amp;#8217;t say where they go: &lt;em&gt;Pass&lt;/em&gt;.&lt;/strong&gt; As a reader, I find &amp;#8220;click
&lt;em&gt;here&lt;/em&gt;&amp;#8221; links to be annoying, and so I avoid the practice in my writing.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Classic hits are buried: &lt;em&gt;Pass&lt;/em&gt;.&lt;/strong&gt; I link to popular topics in the
&lt;em&gt;Popular Topics&lt;/em&gt; sidebar.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;The calendar is the only navigation: &lt;em&gt;Pass&lt;/em&gt;.&lt;/strong&gt;  My posts are organized by topic as well as by date.  Further, the ever-present live search makes finding posts by content easy.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Irregular publishing frequency: &lt;em&gt;Fail&lt;/em&gt;.&lt;/strong&gt;  I don&amp;#8217;t have a regular posting schedule.  When work gets heavy, for example, I rarely post.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Mixing topics: &lt;em&gt;Semi-Pass&lt;/em&gt;.&lt;/strong&gt;  I do mix up topics somewhat, but almost all of my topics fall into the category of &amp;#8220;stuff programming geeks like&amp;#8221; and in that regard are fairly consistent.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Forgetting that you write for your future boss: &lt;em&gt;Pass&lt;/em&gt;.&lt;/strong&gt; I don&amp;#8217;t think there is anything on my blog that a future employer would find troubling or even unprofessional.  (Since I am a consultant, I have lots of &amp;#8220;employers,&amp;#8221; and so far none of them seem to mind what I post.  Some &amp;#8211; the crazy ones &amp;#8211; even enjoy my blog.)&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Having a domain name owned by a weblog service: &lt;em&gt;Pass&lt;/em&gt;.&lt;/strong&gt;  Since 1996 I have been keeping it real on &lt;em&gt;moertel.com.&lt;/em&gt;  My blog&amp;#8217;s home is &lt;a href="http://blog.moertel.com"&gt;blog.moertel.com&lt;/a&gt;, which seems like the natural place for it.&lt;/li&gt;

&lt;/ol&gt;

	&lt;p&gt;In sum, I made three of Jakob&amp;#8217;s top-ten weblog usability mistakes:&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;I don&amp;#8217;t have an author bio.&lt;/li&gt;
		&lt;li&gt;I don&amp;#8217;t have an author photo.&lt;/li&gt;
		&lt;li&gt;I don&amp;#8217;t post regularly.&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;The first two are easy to fix, and I&amp;#8217;ll fix them right away.  The
third &amp;#8211; posting regularly &amp;#8211; is more difficult, owing to the
ever-varying demands of my work load, but I&amp;#8217;ll make an effort to pick
up the pace.  Hopefully, my blog will 100 percent &amp;#8220;Jakob compliant&amp;#8221; 
in the next day or so.&lt;/p&gt;


	&lt;p&gt;Do you have a weblog?  If so, how many weblog usability mistakes do
you make?  Grab &lt;a href="http://www.useit.com/alertbox/weblogs.html"&gt;Jakob&amp;#8217;s top-ten list&lt;/a&gt; and find out.&lt;/p&gt;</description>
      <pubDate>Wed, 26 Oct 2005 16:51:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:d52e7d0d9b16b1546b5b3ada4d0fdf29</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2005/10/26/top-ten-weblog-usability-mistakes-my-blogs-scorecard</link>
      <category>site news</category>
      <category>web development</category>
      <category>usability</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/9</trackback:ping>
    </item>
  </channel>
</rss>
