<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.pluralsight.com/community/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>CraigBlog</title><link>http://www.pluralsight.com/community/blogs/craig/default.aspx</link><description>Craig Andera&amp;#39;s Weblog</description><dc:language>en</dc:language><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>typing-speed-mode Emacs Minor Mode</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/10/07/typing-speed-mode-emacs-minor-mode.aspx</link><pubDate>Tue, 07 Oct 2008 14:32:15 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:53784</guid><dc:creator>craig-andera</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=53784</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=53784</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/10/07/typing-speed-mode-emacs-minor-mode.aspx#comments</comments><description>&lt;p&gt;I’ve been really into Lisp lately, especially &lt;a href="http://clojure.org"&gt;Clojure&lt;/a&gt;, which looks really interesting. More on that some other time, though. Anyway, I’m always looking for an excuse to write code in Lisp – any Lisp. &lt;/p&gt;  &lt;p&gt;As I was writing some prose in emacs this morning, I got into a real flow. I started to wonder how fast I was typing…and there was my excuse! About an hour later, I had written the code below. It’s an emacs minor mode that displays your typing speed (defined as the number of times self-insert-command has been run in the last five seconds, times twelve) in the mode-line. So you can watch your typing speed go up and down in real time. Note that you can customize a few things about it, like changing the default five-second window.&lt;/p&gt;  &lt;p&gt;My emacs-fu (and my Lisp-fu) is not all that it could be, so the code is likely suboptimal in several ways, but it seems to work, and I always hate it when people say, “I’ll post the code once I get a chance to clean it up.” To hell with that: enjoy my code for the garbage it is :).&amp;#160; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="3"&gt;;;; typing-speed.el --- Minor mode which displays your typing speed &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;;; Copyright (C) 2008 Wangdera Corporation &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;;; Permission is hereby granted, free of charge, to any person        &lt;br /&gt;;; obtaining a copy of this software and associated documentation         &lt;br /&gt;;; files (the &amp;quot;Software&amp;quot;), to deal in the Software without         &lt;br /&gt;;; restriction, including without limitation the rights to use,         &lt;br /&gt;;; copy, modify, merge, publish, distribute, sublicense, and/or sell         &lt;br /&gt;;; copies of the Software, and to permit persons to whom the         &lt;br /&gt;;; Software is furnished to do so, subject to the following         &lt;br /&gt;;; conditions: &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;;; The above copyright notice and this permission notice shall be        &lt;br /&gt;;; included in all copies or substantial portions of the Software. &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;;; THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND,        &lt;br /&gt;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES         &lt;br /&gt;;; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         &lt;br /&gt;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT         &lt;br /&gt;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,         &lt;br /&gt;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING         &lt;br /&gt;;; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR         &lt;br /&gt;;; OTHER DEALINGS IN THE SOFTWARE. &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;;; Author: Craig Andera &amp;lt;candera@wangdera.com&amp;gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;;; Commentary: Invoke this minor mode to have your typing speed        &lt;br /&gt;;; continuously displayed in the mode line, in the format [75 WPM]         &lt;br /&gt;;; To use, just load this file and invoke (typing-speed-mode) or         &lt;br /&gt;;; (turn-on-typing-speed-mode) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;(define-minor-mode typing-speed-mode        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Displays your typing speed in the status bar.&amp;quot;         &lt;br /&gt;&amp;#160; :lighter typing-speed-mode-text         &lt;br /&gt;&amp;#160; :group typing-speed         &lt;br /&gt;&amp;#160; (if typing-speed-mode         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (progn         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (add-hook &amp;#39;post-command-hook &amp;#39;typing-speed-post-command-hook)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (setq typing-speed-event-queue &amp;#39;())         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (setq typing-speed-update-timer (run-with-timer 0 typing-speed-update-interval &amp;#39;typing-speed-update)))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (progn         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (remove-hook &amp;#39;post-command-hook &amp;#39;typing-speed-post-command-hook)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (cancel-timer typing-speed-update-timer)))) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;(defcustom typing-speed-window 5        &lt;br /&gt;&amp;#160; &amp;quot;The window (in seconds) over which typing speed should be evaluated.&amp;quot;         &lt;br /&gt;&amp;#160; :group &amp;#39;typing-speed) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;(defcustom typing-speed-mode-text-format &amp;quot; [%s WPM]&amp;quot;        &lt;br /&gt;&amp;#160; &amp;quot;A format string that controls how the typing speed is displayed in the mode line.         &lt;br /&gt;Must contain exactly one %s delimeter where the typing speed will be inserted.&amp;quot;         &lt;br /&gt;&amp;#160; :group &amp;#39;typing-speed) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;(defcustom typing-speed-update-interval 1        &lt;br /&gt;&amp;#160; &amp;quot;How often the typing speed will update in the mode line, in seconds.         &lt;br /&gt;It will always also update after every command.&amp;quot;         &lt;br /&gt;&amp;#160; :group &amp;#39;typing-speed) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;(defvar typing-speed-mode-text (format typing-speed-mode-text-format 0))        &lt;br /&gt;(defvar typing-speed-event-queue &amp;#39;())         &lt;br /&gt;(defvar typing-speed-update-timer nil) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;(defun typing-speed-post-command-hook ()        &lt;br /&gt;&amp;#160; &amp;quot;When typing-speed-mode is enabled, fires after every command. If the         &lt;br /&gt;command is self-insert-command, log it as a keystroke and update the         &lt;br /&gt;typing speed.&amp;quot;         &lt;br /&gt;&amp;#160; (if (eq this-command &amp;#39;self-insert-command)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (let ((current-time (float-time)))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (push current-time typing-speed-event-queue)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (typing-speed-update)))) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;(defun typing-speed-update ()        &lt;br /&gt;&amp;#160; &amp;quot;Calculate and display the typing speed.&amp;quot;         &lt;br /&gt;&amp;#160; (let ((current-time (float-time)))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (setq typing-speed-event-queue         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (typing-speed-remove-old-events         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (- current-time typing-speed-window)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typing-speed-event-queue))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (typing-speed-message-update))) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;(defun typing-speed-message-update ()        &lt;br /&gt;&amp;#160; &amp;quot;Updates the status bar with the current typing speed&amp;quot;         &lt;br /&gt;&amp;#160; (let* ((chars-per-second (/ (length typing-speed-event-queue) (float typing-speed-window)))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (chars-per-min (* chars-per-second 60))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (words-per-min (/ chars-per-min 5)))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (setq typing-speed-mode-text (format &amp;quot; [%s WPM]&amp;quot; (floor words-per-min)))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (force-mode-line-update))) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;(defun typing-speed-remove-old-events (threshold queue)        &lt;br /&gt;&amp;#160; &amp;quot;Removes events older than than the threshold (in seconds) from the specified queue&amp;quot;         &lt;br /&gt;&amp;#160; (if (or (null queue)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&amp;gt; threshold (car queue)))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; nil         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (cons (car queue)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (typing-speed-remove-old-events threshold (cdr queue))))) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;(defun turn-on-typing-speed ()        &lt;br /&gt;&amp;#160; &amp;quot;Turns on typing-speed-mode&amp;quot;         &lt;br /&gt;&amp;#160; (if (not typing-speed-mode)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (typing-speed-mode))) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="3"&gt;(defun turn-off-typing-speed ()        &lt;br /&gt;&amp;#160; &amp;quot;Turns off typing-speed-mode&amp;quot;         &lt;br /&gt;&amp;#160; (if typing-speed-mode         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (typing-speed-mode)))&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font face="Courier New" size="3"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="3"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="3"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="3"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="3"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="3"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="3"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="3"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="3"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" size="3"&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=53784" width="1" height="1"&gt;</description></item><item><title>You Think You Like Halloween?</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/10/01/you-think-you-like-halloween.aspx</link><pubDate>Wed, 01 Oct 2008 12:41:59 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:53722</guid><dc:creator>craig-andera</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=53722</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=53722</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/10/01/you-think-you-like-halloween.aspx#comments</comments><description>&lt;p&gt;I don’t think you like Halloween like &lt;a href="http://www.socalhalloween.com/Pictures2007.html"&gt;this guy&lt;/a&gt; likes Halloween…&lt;/p&gt;  &lt;p&gt;I’m glad to have &lt;a href="http://www.pluralsight.com/community/blogs/craig/archive/2005/01/14/4958.aspx"&gt;helped&lt;/a&gt; in even a very small way. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=53722" width="1" height="1"&gt;</description></item><item><title>Announcing Sudo for Windows</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/09/09/announcing-sudo-for-windows.aspx</link><pubDate>Tue, 09 Sep 2008 14:55:41 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:52917</guid><dc:creator>craig-andera</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=52917</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=52917</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/09/09/announcing-sudo-for-windows.aspx#comments</comments><description>&lt;p&gt;If you’ve used a Unix much, I’m sure you’re familiar with &lt;a href="http://en.wikipedia.org/wiki/Sudo"&gt;sudo&lt;/a&gt;, a command-line utility that lets you run things as the superuser. Not only it is very handy, but it is the basis for &lt;a href="http://xkcd.com/149/"&gt;one of the better XKCD strips&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Sudo is one of those things I find myself wishing for in Windows, especially given the new(ish) &lt;a href="http://en.wikipedia.org/wiki/User_Account_Control"&gt;UAC&lt;/a&gt; features in Vista/Windows 2008. There are lots of times when I just want to run something as administrator, dammit. Typing “sudo notepad2 C:\somewhere\foo.txt” would fit the bill. &lt;/p&gt;  &lt;p&gt;I tried &lt;a href="http://sourceforge.net/projects/sudowin"&gt;Sudo for Windows&lt;/a&gt;, but it made me type my password. That seemed silly, given that I don’t need to type my password anywhere else to run things elevated. There are probably other implementations of this out there, but it literally took less time to write my own than it would to crawl through all of them looking for the one I like best. All it does is execute whatever arguments get passed to it, but the program itself has the “require administrator” bit in the manifest, so the target program winds up running elevated as well. &lt;/p&gt;  &lt;p&gt;Anyway, it’s in my arsenal. Visit &lt;a href="http://alt.pluralsight.com/wiki/default.aspx/Craig/SuDo.html"&gt;here&lt;/a&gt; to get it in yours, too.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=52917" width="1" height="1"&gt;</description></item><item><title>Announcing InhibitSS</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/08/20/announcing-inhibitss.aspx</link><pubDate>Wed, 20 Aug 2008 15:37:16 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:52630</guid><dc:creator>craig-andera</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=52630</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=52630</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/08/20/announcing-inhibitss.aspx#comments</comments><description>&lt;p&gt;Short story: I wrote a little tray app that will prevent your screensaver from running. Download it &lt;a href="http://alt.pluralsight.com/wiki/default.aspx/Craig/InhibitSS.html"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Long story: I’ve been training for &lt;a href="http://www.marinemarathon.com/"&gt;a marathon&lt;/a&gt; over the last few months, but a couple of weeks ago I hurt my foot and have been unable to run consistently. While I’m recovering (and hoping I’ll be well soon enough for me to be able to race), I’ve got to do something to keep in shape. One of the things I do is to ride my bike on a stationary trainer in front of the computer. While that works well, it’s a pain to unlock the screen if the screensaver kicks in while I’m pedaling, as it sometimes does. So I wrote InhibitSS, which runs in the tray and will prevent the screensaver from running, and therefore the screen from locking. Here’s what it looks like when it starts up: &lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.pluralsight.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/craig/inhibit_2D00_ss_2D00_1.jpg" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Then, if you double-click it, it looks like this: &lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.pluralsight.com/community/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/craig/inhibit_2D00_ss_2D00_3.jpg" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;The red X indicates that the screensaver is inhibited. &lt;/p&gt;  &lt;p&gt;I’m sure there are a dozen apps just like this. But this one has the feature that I had fun writing it. :) &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=52630" width="1" height="1"&gt;</description></item><item><title>C# Mixins</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/07/09/c-mixins.aspx</link><pubDate>Wed, 09 Jul 2008 15:39:57 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:51672</guid><dc:creator>craig-andera</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=51672</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=51672</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/07/09/c-mixins.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;Corrected terminology – it’s “generic functions” not “generic methods”. &lt;/p&gt;  &lt;p&gt;Aside from macros, another nice feature that Lisp supports is &lt;a href="http://en.wikipedia.org/wiki/Mixin"&gt;mixins&lt;/a&gt;. In fact, this is one of the (very, very) few things I miss about C++. Of course, Lisp does it in a much more powerful way using something called generic functions. See &lt;a href="http://gigamonkeys.com/book/object-reorientation-generic-functions.html"&gt;here&lt;/a&gt; and &lt;a href="http://gigamonkeys.com/book/object-reorientation-classes.html"&gt;here&lt;/a&gt; for a great description of generic functions in Common Lisp – it’s one of the cooler parts of Lisp, in my opinion, especially for someone like me who has come from a C++/C#/Java OO background. &lt;/p&gt;  &lt;p&gt;Although not a tool for every occasion, and somewhat against the spirit of &lt;a href="http://www.peterprovost.org/blog/post/Inherit-to-Be-Reused2c-Not-to-Reuse.aspx"&gt;Inherit to Be Reused, Not to Reuse&lt;/a&gt;, mixins are nonetheless handy at times. Since mixins are generally implemented via multiple inheritance, they haven’t really been an option in C#…until extension methods came along. Now you can do something like this: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;using System; &lt;/p&gt;    &lt;p&gt;public interface TellNameMixin      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; string Name { get; }       &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;public static class MixinImplementation      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public static void TellName(this TellNameMixin subject, string prefix)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;My name is: {0}{1}&amp;quot;, prefix, subject.Name);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;} &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;What we’ve done is to define an interface type and a corresponding extension method that adds functionality to that interface. Since any number of interfaces can be implemented on a type, we can apply our mixin to classes that have no other type relationship, or that already have a base class. Like this: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;public class Craig : MarshalByRefObject, TellNameMixin      &lt;br /&gt;{       &lt;br /&gt;&amp;#160; public string Name { get { return &amp;quot;Craig&amp;quot;; } }       &lt;br /&gt;} &lt;/p&gt;    &lt;p&gt;public class Program      &lt;br /&gt;{       &lt;br /&gt;&amp;#160; public static void Main()       &lt;br /&gt;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Craig craig = new Craig();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; craig.TellName(&amp;quot;Mr. &amp;quot;); // Prints “Mr. Craig”      &lt;br /&gt;&amp;#160; }       &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The best part about this is – as with all reuse mechanisms – there’s only one place where I have to change how TellName works. Obviously, if the Craig class was the only class I was extending, I could skip the mixin class and just use extension methods directly. But if I have additional types that I want to add this functionality to, and if those classes have no other type relationship (a situation I found myself in just today) then this might be handy. &lt;/p&gt;  &lt;p&gt;Anyway, it’s not something you’ll use every day, but it’s worth knowing about. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=51672" width="1" height="1"&gt;</description></item><item><title>Lisp, Too, Is Mainstream</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/07/08/lisp-too-is-mainstream.aspx</link><pubDate>Tue, 08 Jul 2008 14:50:31 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:51609</guid><dc:creator>craig-andera</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=51609</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=51609</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/07/08/lisp-too-is-mainstream.aspx#comments</comments><description>&lt;p&gt;You’ve seen me talk here before about the fact that I have been lately fascinated with Lisp. Sadly, I haven’t been able to spend the time I’d like with it, but I continue to read and think about it. And I’d really, really like to put in some serious time writing a real app (better: several) in Lisp. &lt;/p&gt;  &lt;p&gt;So it was with great interest that I read &lt;a href="http://www.lispcast.com/drupal/node/54"&gt;Lisp, too, is mainstream&lt;/a&gt;. I like pretty much everything that &lt;a href="http://www.lispcast.com/drupal/blog/1"&gt;Eric&lt;/a&gt; has written, and &lt;a href="http://www.lispcast.com/drupal/node/3"&gt;his LispCast screencasts&lt;/a&gt; are good, too. This article starts with &lt;a href="http://en.wikipedia.org/wiki/Greenspun%27s_Tenth_Rule"&gt;Greenspun’s Tenth Rule&lt;/a&gt; (“Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp”) and extends it to a rather different conclusion: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;My point is that it may be too late to start with Lisp so you don&amp;#39;t have to reimplement all of its features. Because all of those new languages have already implemented them. At least what most people consider the important ones.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Or put another way: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;I guess my point, through all this meandering, is that other languages did borrow a lot from Lisp. About half of it. And now those features are out there, in the world. And in the meantime, while they were borrowing, they got some new features of their own. Features like giant user bases, gazilions of libraries, corporate support, standards bodies. So Lisp has half of the features of Python. Java and Python are far from my ideal language---but so is Common Lisp. The idea that I would have to implement so much of Lisp on my own is a little overblown these days. And speaking of reimplementation: How much of Python&amp;#39;s standard library does a complex Lisp program reimplement? How much of Python would you have to reimplement before you regret choosing Common Lisp?&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And speaking specifically to macros, which I currently see as the single biggest weakness of C# when compared to Lisp: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Macros let you subsume more code into less code. Macros let you write more functionality with fewer lines. Macros let you abstract away boilerplate into new syntax.&lt;/p&gt;    &lt;p&gt;But the corporate manager will say: if everyone writes their own syntax, my programmers can&amp;#39;t read each other&amp;#39;s code. So instead of having to learn a language once, they will have to learn a new language each time they approach a program for the first time. And the value of macros is lessened.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It’s enough to take the wind out of an aspiring Lisper’s sails. :) However, I haven’t given up yet. I have two questions that I still need to answer for myself before I draw any conclusions of my own. &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Is the value proposition of macros (i.e. custom syntax/DSLs) different for small teams? And particularly for stuff I read and write only for myself? Because I’ve got a lot of code that falls into those categories. &lt;/li&gt;    &lt;li&gt;Is the library situation really so dire? I find that I don’t actually wind up using third-party libraries all that much in C#, so either the BCL is extremely complete or the types of problems I’m solving are just naturally self-sufficient. Or I’m doing something wrong. :) Besides, when I cruise the Lisp sites, I actually see &lt;strong&gt;lots&lt;/strong&gt; of libraries I could use. But maybe there’s some critical functionality that I’d have to write myself that would take a long time.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Of course, the answers to these questions are inherently highly subjective. Like pretty much any question touching on programming tools. If I can find a way to go write a fair amount of Lisp, I’ll get my answers. They will, however, be &lt;em&gt;my&lt;/em&gt; answers. I’ll share them with you if I ever get there, but don’t expect them to help &lt;em&gt;you&lt;/em&gt; much. :) &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=51609" width="1" height="1"&gt;</description></item><item><title>MSDN Low-Bandwidth Rendering Option</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/06/26/51219.aspx</link><pubDate>Thu, 26 Jun 2008 16:17:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:51219</guid><dc:creator>craig-andera</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=51219</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=51219</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/06/26/51219.aspx#comments</comments><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;One of the common complaints with &lt;a href="http://msdn.microsoft.com"&gt;the MSDN website&lt;/a&gt; is the fact that the pages are pretty fat. The team has done a lot to make this better, but there's still some stuff in there that not everyone needs.&lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;If you're interested in an extremely skinny version of the MSDN docs, give the new LOBAND rendering format a try. To use it, stick (loband) - inlcuding the parens - at the end of an MSDN URL, before the .aspx. For example, the documentation for System.Xml.XmlReader is normally at &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx&lt;/a&gt;. But if you surf instead to &lt;a href="http://msdn.microsoft.com/en-us/library/system.xml.xmlreader(loband).aspx"&gt;http://msdn.microsoft.com/en-us/library/system.xml.xmlreader(loband).aspx&lt;/a&gt;, you'll get the new, low-bandwidth rendering of the page. There's a link at the top of the LOBAND rendering that lets you make it permanent via a cookie (you can turn it off later via a similar link). &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;It makes quite a difference. On my machine, I see the regular version at about 98KB, and the LOBAND version at just over 18KB - and the 98KB doesn't count the TOC tree, which doesn't render in the LOBAND version. Not a huge deal for those on high-bandwidth connections in the US, perhaps, but there are lots of people who don't fit that description. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Note that the team already has planned improvements for the next regular update of the site. But don't let that stop you from letting them know if you have any ideas about how to make it better. You can drop a comment here or &lt;a href="http://pluralsight.com/blogs/craig/contact.aspx"&gt;contact me&lt;/a&gt; - I'll make sure it gets sent on. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;And no, I didn't have anything to do with implementing this - I'm just blogging it. :) &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=51219" width="1" height="1"&gt;</description></item><item><title>Hobocopy x64 Build Available</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/06/25/51206.aspx</link><pubDate>Wed, 25 Jun 2008 12:28:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:51206</guid><dc:creator>craig-andera</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=51206</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=51206</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/06/25/51206.aspx#comments</comments><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;I finally got around to hacking together an x64 version of &lt;a href="http://www.pluralsight.com/wiki/default.aspx/Craig/HoboCopy.html"&gt;hobocopy&lt;/a&gt;, my little utility that copies files even if they are locked. Note that you might need to install the 64-bit C runtime (vcredist_x64) in order to get it to work. Both the updated binaries and vcredist_x64 are available at &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=117783&amp;amp;package_id=204974"&gt;the SourceForge download page&lt;/a&gt;. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Enjoy! Of course, if you &lt;strong&gt;really&lt;/strong&gt; like hobocopy, maybe you'd &lt;a href="http://www.pluralsight.com/blogs/craig/archive/2008/05/23/51041.aspx"&gt;consider becoming the maintainer&lt;/a&gt;. &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=51206" width="1" height="1"&gt;</description></item><item><title>Hobocopy Needs a New Daddy (or Mommy)</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/05/23/51041.aspx</link><pubDate>Fri, 23 May 2008 13:44:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:51041</guid><dc:creator>craig-andera</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=51041</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=51041</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/05/23/51041.aspx#comments</comments><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;I enjoy the process of sharing some of my work as open source. One of my more successful efforts in that area has been &lt;a href="http://www.pluralsight.com/wiki/default.aspx/Craig/HoboCopy.html"&gt;Hobocopy&lt;/a&gt;. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Like most (really, all) software, it's not done. There are any number of things I'd like to add to it, and I still get occasional requests from people for enhancements or bugfixes. But, due to one thing and another, I just haven't been able to get around to doing any work on it for months. So I'm asking you, dear &lt;a href="http://www.urbandictionary.com/define.php?term=lazyweb"&gt;LazyWeb&lt;/a&gt;, if you know of anyone who would be interested in adopting this poor, neglected, digital offspring of mine. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;I'm open to whatever arrangement that maintains the MIT nature of the license, so if you'd rather move the code somewhere else or transfer the copyright, that's cool with me. Or we can keep it where it is and I can set you up as a contributor. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Hobocopy is written in C++. Not very good C++, mind you, but C++ skills are still required. Although with sufficient work, we could probably factor out the bit that needs to be in C++ and rewrite everything else in C#. I'm happy to help with design direction via email, I just don't have time to hack. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Anyway, let me know if you're interested. It's a good tool and I'd love to see someone pick it up and move it forward. &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=51041" width="1" height="1"&gt;</description></item><item><title>Speaking at DC ALT.NET Thursday</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/05/19/50982.aspx</link><pubDate>Mon, 19 May 2008 13:37:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50982</guid><dc:creator>craig-andera</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=50982</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=50982</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/05/19/50982.aspx#comments</comments><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Lately I've been enjoying going to the &lt;a href="http://tech.groups.yahoo.com/group/dcaltnet"&gt;DC ALT.NET&lt;/a&gt; meetings. I can't say I've figured out what &lt;a href="http://altdotnet.org"&gt;ALT.NET&lt;/a&gt; is supposed to mean, but the DC version appears to equate to smart people talking about interesting things, so that's good enough for me. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Anyway, I shot off my mouth (big surprise!) about how cool I think Lisp is at the last couple of meetings, so I figured it might not be a bad idea to offer to do a somewhat more structured talk about it some time. I don't really do much public speaking any more, but I happen to have a little presentation ready about what I've learned about (and from) Lisp, so I offered to give it and they accepted. If you'd like to hear it, &lt;a href="http://tech.groups.yahoo.com/group/dcaltnet/message/307"&gt;come on down&lt;/a&gt; on Thursday. &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50982" width="1" height="1"&gt;</description></item><item><title>MSDN Updates</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/04/30/50814.aspx</link><pubDate>Wed, 30 Apr 2008 18:00:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50814</guid><dc:creator>craig-andera</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=50814</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=50814</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/04/30/50814.aspx#comments</comments><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Yesterday was a big day for me with respect to MSDN. There were a pair of "the new replaces the old" moments. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;The first event was the one Larry Jordan amusingly subtitles "&lt;a href="http://blogs.msdn.com/innovation/archive/2008/04/29/msdn-highlander-there-will-be-only-one.aspx"&gt;There will be only one!&lt;/a&gt;" What happened was, the old MSDN finally got turned off - the MTPS-based version of MSDN is now the only version running. &lt;a href="http://msdn2.microsoft.com"&gt;http://msdn2.microsoft.com&lt;/a&gt; now redirects to &lt;a href="http://msdn.microsoft.com"&gt;http://msdn.microsoft.com&lt;/a&gt;. That means no more fun URLs like &lt;a title="https://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/fileassociations/fileassoc.asp" href="https://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/fileassociations/fileassoc.asp"&gt;&lt;font face="Verdana"&gt;https://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/fileassociations/fileassoc.asp&lt;/font&gt;&lt;/a&gt;. Now it's &lt;a title="http://msdn2.microsoft.com/en-us/library/bb776847.aspx" href="http://msdn2.microsoft.com/en-us/library/bb776847.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb776847.aspx&lt;/a&gt;. Ahh - that's better. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Since I helped write the Microsoft/TechNet Publishing System (MTPS), which sits behind the new, one-and-only MSDN website (and the TechNet and Expression websites, for that matter), it was sort of cool to see it "take over". &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;The other thing we did yesterday was to update &lt;a href="http://www.pluralsight.com/blogs/craig/archive/2008/01/23/50030.aspx"&gt;the MTPS REST API&lt;/a&gt;. It's still very much a prototype (i.e. things are broken) but we wanted to push a version out there that has some of our latest thinking in it. Most notably, this release sketches out what we think we want to do for writes. That's right - we intend to support community-authored changes to MSDN (the website supports that now in the form of tags and wiki-like annotations, in case you didn't know). &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Although I should point out that the writes aren't implemented yet in the REST API because we haven't fleshed out the story for authentication.  But you can see the idea. For example, to add a new tag to an item you'll be able to PUT to &lt;a href="http://labs.msdn.microsoft.com/restapi/content/b8a5e1s5/en-us;vs.90/tags/add-tag"&gt;http://labs.msdn.microsoft.com/restapi/content/b8a5e1s5/en-us;vs.90/tags/add-tag&lt;/a&gt;. And to delete a the foo tag added by user candera you'd DELETE &lt;a href="http://labs.msdn.microsoft.com/restapi/content/b8a5e1s5/en-us;vs.90/tags/foo/users/candera"&gt;http://labs.msdn.microsoft.com/restapi/content/b8a5e1s5/en-us;vs.90/tags/foo/users/candera&lt;/a&gt;. For convenience, we're also planning to support POST to those endpoints with a hidden form parameter of _method, which is set to PUT or DELETE as appropriate. It's just too convenient to be able to drive the service from a browser during development not to do that. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Another big change is what lives at &lt;a href="http://labs.msdn.microsoft.com/restapi/content"&gt;~/content&lt;/a&gt;. In this release it's a link to the &lt;a href="http://labs.msdn.microsoft.com/restapi/sites"&gt;~/sites&lt;/a&gt; part of the API. In MTPS parlance, a "site" is the host part of a URL (e.g. the "msdn" in &lt;a href="http://msdn.microsoft.com"&gt;http://msdn.microsoft.com&lt;/a&gt;). Underneath those are "iroots", which is a lot like a vdir (e.g. the "academic" in &lt;a href="http://msdn.microsoft.com/academic"&gt;http://msdn.microsoft.com/academic&lt;/a&gt;). The reason ~/content links to ~/sites is that via ~/sites you can find your way into the TOC tree of any of the content in MTPS…or at least you could if it were hooked up properly everywhere. Still, you can see the idea. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;That said, we've decided that the link to ~/sites is ugly and we hate it. :) So we'll have to figure something else out there. Maybe a set of virtual TOC nodes that unifies all the TOCs - one node to bring them all and in the API bind them. Or something - we're still noodling on that one. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Other changes: we've added ETags and Expires headers to all resources (currently everything is hardcoded to expire 24 hours in the future), fixed some of the encoding problems, added an XHTML DTD where appropriate, and of course there are the obligatory bunch of minor bugfixes. We've also done some slight reorganization of the URLs to fit our evolving understanding of the model, but most things have remained unchanged. I'm curious to hear if anyone has played with the service at all - if you have any questions or feedback, do feel free to &lt;a href="http://pluralsight.com/blogs/craig/contact.aspx"&gt;contact me&lt;/a&gt;. &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50814" width="1" height="1"&gt;</description></item><item><title>Friends of the MSDN Library Facebook Group</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/04/04/50655.aspx</link><pubDate>Fri, 04 Apr 2008 11:19:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50655</guid><dc:creator>craig-andera</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=50655</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=50655</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/04/04/50655.aspx#comments</comments><description>&lt;a href="http://blogs.msdn.com/innovation/default.aspx" xmlns="http://www.w3.org/1999/xhtml"&gt;Larry Jordan&lt;/a&gt; &lt;a href="http://blogs.msdn.com/innovation/archive/2008/04/04/interested-in-helping-us-shape-the-next-version-of-the-msdn-library.aspx" xmlns="http://www.w3.org/1999/xhtml"&gt;has put together a Facebook group&lt;/a&gt; ("&lt;a href="http://www.facebook.com/group.php?gid=16125221070" xmlns="http://www.w3.org/1999/xhtml"&gt;Friends of the MSDN Library&lt;/a&gt;") to aggregate people who have ideas about how MSDN can improve. I have a vested interest in this, as I make part of my living contributing to the code that makes it happen. So join up…think of it as a way to help put &lt;a xmlns="http://www.w3.org/1999/xhtml" href="http://www.flickr.com/photos/wangdera/2371660869/"&gt;my daughters&lt;/a&gt; through college. :)&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50655" width="1" height="1"&gt;</description></item><item><title>Welcome Susan!</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/03/17/50494.aspx</link><pubDate>Mon, 17 Mar 2008 14:25:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50494</guid><dc:creator>craig-andera</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=50494</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=50494</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/03/17/50494.aspx#comments</comments><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://www.flickr.com/photos/wangdera/2341020452/"&gt;&lt;img alt="Susan" src="http://farm4.static.flickr.com/3257/2341020452_b377261fe0.jpg?v=0"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;At a little before 11AM on March 15th, Wangdera Corporation welcomed its newest employee when our daughter Susan was born at our home in Virginia. Susan tipped the scales at a hefty 8 pounds, 14 ounces (4.03kg), and she and her mother are both doing extremely well. Big sister Ellen is very happy and proud as well. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;More pictures available at &lt;a href="http://www.flickr.com/photos/wangdera/"&gt;our Flickr site&lt;/a&gt;. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;In what may be a related event, Ellen has announced that she is changing her name to "Princess Ellen Ladybug". &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50494" width="1" height="1"&gt;</description></item><item><title>Art Geek Zoo</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/03/12/50454.aspx</link><pubDate>Wed, 12 Mar 2008 10:06:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50454</guid><dc:creator>craig-andera</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=50454</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=50454</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/03/12/50454.aspx#comments</comments><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;At our house, the newspaper gets full coverage: I read only the comics and my wife reads everything else. I like comics. So I thought it was pretty cool when I found out my good friend &lt;a href="http://www.stenzinger.com/"&gt;Rob Stenzinger&lt;/a&gt; has started to publish &lt;a href="http://www.artgeekzoo.com/"&gt;Art Geek Zoo&lt;/a&gt;, his latest artistic effort, online. Check it out!&lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://www.artgeekzoo.com/"&gt;&lt;img src="http://www.artgeekzoo.com/comics/2008-03-11-Page_5.png"/&gt;&lt;/a&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50454" width="1" height="1"&gt;</description></item><item><title>My First Trademark Violation</title><link>http://www.pluralsight.com/community/blogs/craig/archive/2008/03/11/50418.aspx</link><pubDate>Tue, 11 Mar 2008 11:21:00 GMT</pubDate><guid isPermaLink="false">d057c89c-07b5-4bfb-b52f-d79d1e3ece89:50418</guid><dc:creator>craig-andera</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/rsscomments.aspx?PostID=50418</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.pluralsight.com/community/blogs/craig/commentapi.aspx?PostID=50418</wfw:comment><comments>http://www.pluralsight.com/community/blogs/craig/archive/2008/03/11/50418.aspx#comments</comments><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;A few weeks ago, I &lt;a href="http://www.pluralsight.com/blogs/craig/archive/2008/02/14/50248.aspx"&gt;posted&lt;/a&gt; a pair of little utilities that I wrote to help me play &lt;a href="http://en.wikipedia.org/wiki/Falcon_4"&gt;Falcon&lt;/a&gt;. They were just one of those spare-time, throwaway things most programmers do from time to time, so I didn't put a ton of thought into them. Well, last week, I got a phone call from a marketing guy at &lt;a href="http://www.sassafras.com/"&gt;Sassafras Software&lt;/a&gt;…it seems I should have put a bit more though into at least the names. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;See, one of the bits I published, I called KeyServer. I called it that because it's a little TCP listener that receives events and sends keystrokes to the active application. Of course, it's also &lt;a href="http://tess2.uspto.gov/bin/showfield?f=doc&amp;amp;state=k7lokf.2.1"&gt;a registered trademark of Sassafras Software&lt;/a&gt;. Oopsie. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;The marketing guy was pretty nice about it. He never said anything about legal action. But here's the thing: US Trademark law says you have to actively defend a trademark, or you lose it. That means that if you &lt;strong&gt;don't&lt;/strong&gt; sue the people who use your trademark, a competitor can come along and point to that behavior as proof that you don't want your trademark and that it should be taken away. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;On the one hand, it was somewhat shortsighted of me to name my software "KeyServer". I mean, that was practically guaranteed to be trademarked. On the other hand - subjectively and emotionally - it's never fun to be threatened with legal action, even when it's done politely and when you know that the person delivering the news has no choice about it. Lesson learned, I guess. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;On the bright side, it was good motivation to add a few features that I've been meaning to get around to. So I'm re-releasing the software under the name "Keylay" (it's a &lt;em&gt;keystroke relayer&lt;/em&gt; - get it?). Here are the new features: &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;ul style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px" type="disc" xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;li&gt;A name that won't get me sued!&lt;/li&gt;
&lt;li&gt;Has a less-boring tray icon that changes colors based on whether or not a profile is loaded, whether or not a client is connected, and animates when keystrokes are being relayed. &lt;/li&gt;
&lt;li&gt;Takes a command-line argument that is the path to a profile to be loaded at startup. &lt;/li&gt;&lt;/ul&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;While I was at it, I also updated F4Panel a bit. In addition to the ICP and the MFDs, I also added an "Aux1" panel that gives access to touchscreen controls of a few miscellaneous things like landing gear, the autopilot, the ECM and RWR, the laser, and the master arm switch. In addition, I made it remember the last address it connected to, since that was driving me nuts. &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;You can download the updated binaries and the source &lt;a href="http://www.pluralsight.com/craig/download/f4panel-keylay-r2.zip"&gt;here&lt;/a&gt;. &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.pluralsight.com/community/aggbug.aspx?PostID=50418" width="1" height="1"&gt;</description></item></channel></rss>