<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>Darren Patterson - Geek</title>
    <link>http://darren.stanford.edu/serendipity/</link>
    <description>37.536887,-122.519617</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.6 - http://www.s9y.org/</generator>
    <pubDate>Fri, 18 Nov 2011 05:16:13 GMT</pubDate>

    <image>
        <url>http://darren.stanford.edu/serendipity/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Darren Patterson - Geek - 37.536887,-122.519617</title>
        <link>http://darren.stanford.edu/serendipity/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Simple puppet file based &quot;fact&quot; definition and facter plugin</title>
    <link>http://darren.stanford.edu/serendipity/archives/140-Simple-puppet-file-based-fact-definition-and-facter-plugin.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/140-Simple-puppet-file-based-fact-definition-and-facter-plugin.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=140</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=140</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    I ran into a situation with puppet where we needed very simple file based facts.  I googled around and oddly didn&#039;t find anything.  Here is what I came up with that met my needs.  &lt;br /&gt;
&lt;br /&gt;
A file resource ensures /etc/facter/facts exists and purges recursively.  A definition drops a file into that dir so that the name of the fact is the name of the file, and the contents of the fact are the contents of the file.  The puppet masters are configured to deploy plugins - EG: &lt;a href=&quot;http://docs.puppetlabs.com/guides/plugins_in_modules.html&quot; title=&quot;http://docs.puppetlabs.com/guides/plugins_in_modules.html&quot;&gt;http://docs.puppetlabs.com/guides/plugins_in_modules.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
See below for code.&lt;br /&gt;
&lt;br /&gt;
The facts ruby facter plugin (modules/facts/lib/facter/facts.rb):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;path=&quot;/etc/facter/facts&quot;&lt;br /&gt;
if File.directory? &quot;#{path}&quot;&lt;br /&gt;
   Dir.foreach(path) do |entry|&lt;br /&gt;
      entry.chomp&lt;br /&gt;
      if File.file? &quot;#{path}/#{entry}&quot;&lt;br /&gt;
         Facter.add(entry) do&lt;br /&gt;
            setcode do&lt;br /&gt;
               contents = File.read(&quot;#{path}/#{entry}&quot;)&lt;br /&gt;
               contents.chomp&lt;br /&gt;
            end&lt;br /&gt;
         end&lt;br /&gt;
      end&lt;br /&gt;
   end&lt;br /&gt;
end&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
The definition which provides &quot;fact&quot; (fact.pp):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;# Provide arbitrary named facts - cannot match name of facter plugin (from&lt;br /&gt;
# module path)&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# Example&lt;br /&gt;
#&lt;br /&gt;
#       fact { &quot;sysadmin1&quot;: value =&gt; &quot;My Name&quot; }&lt;br /&gt;
#       fact { &quot;sysadmin2&quot;: value =&gt; &quot;Your Name&quot; }&lt;br /&gt;
#       fact { &quot;support&quot;: value =&gt; &quot;Group Name&quot; }&lt;br /&gt;
#       fact { &quot;restricted&quot;: value =&gt; &quot;true&quot; }&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
define fact ($ensure=present,&lt;br /&gt;
                     $value=&#039;NOSRC&#039;) {&lt;br /&gt;
    $factsdir = &quot;/etc/facter/facts&quot;&lt;br /&gt;
    case $ensure {&lt;br /&gt;
        absent: {&lt;br /&gt;
            file { &quot;$factsdir/$name&quot;: ensure =&gt; absent }&lt;br /&gt;
        }&lt;br /&gt;
        present: {&lt;br /&gt;
            case $value {&lt;br /&gt;
                &#039;NOSRC&#039;: {&lt;br /&gt;
                    fail &quot;value required for fact define&quot;&lt;br /&gt;
                }&lt;br /&gt;
                default: {&lt;br /&gt;
                    file { &quot;$factsdir/$name&quot;: &lt;br /&gt;
                        content =&gt; &quot;$value\n&quot;,&lt;br /&gt;
                        require =&gt; File[$factsdir],&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        default: { crit &quot;Invalid ensure value: $ensure.&quot; }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
And finally the file resource that sets up the /etc/facter/facts area:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;    file { &lt;br /&gt;
        &quot;/etc/facter&quot;:&lt;br /&gt;
            ensure  =&gt; directory;&lt;br /&gt;
        &quot;/etc/facter/facts&quot;:&lt;br /&gt;
            ensure  =&gt; directory,&lt;br /&gt;
            require =&gt; File[&quot;/etc/facter&quot;],&lt;br /&gt;
            recurse =&gt; true,&lt;br /&gt;
            force   =&gt; true,&lt;br /&gt;
            purge   =&gt; true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
You can use this easily like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;    fact { &quot;support&quot;: value =&gt; &quot;SHARED&quot; }&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
If you want to see these facts when you manually run facter from the cli, you should set your environment variable for facter lib (syntax for bash): &lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;export FACTERLIB=/var/lib/puppet/lib/facter&lt;/pre&gt;&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Thu, 17 Nov 2011 08:51:01 -0800</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/140-guid.html</guid>
    
</item>
<item>
    <title>Applescript to stop mail.app from checking when screensaver is on</title>
    <link>http://darren.stanford.edu/serendipity/archives/139-Applescript-to-stop-mail.app-from-checking-when-screensaver-is-on.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/139-Applescript-to-stop-mail.app-from-checking-when-screensaver-is-on.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=139</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=139</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    I realized over the last months that when I run Apple&#039;s Mail.app on my desktop and on my laptop both at the same time, IMAP continues to resync or show me incorrect information until I resync it.  Mail checks were taking over 5min sometimes.  This might just be isolated to Zimbra mail, but it was pretty annoying.  To remedy this situation, I wrote the following applescript (saved as an application, run on login).  This has solved my problem nicely.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;br /&gt;
on run&lt;br /&gt;
	idle&lt;br /&gt;
end run&lt;br /&gt;
&lt;br /&gt;
on idle&lt;br /&gt;
	tell application &quot;System Events&quot;&lt;br /&gt;
		if exists (process &quot;ScreenSaverEngine&quot;) then&lt;br /&gt;
			my takeMailOffline()&lt;br /&gt;
		else&lt;br /&gt;
			my takeMailOnline()&lt;br /&gt;
		end if&lt;br /&gt;
	end tell&lt;br /&gt;
	return 150 -- seconds = 2.5 minutes&lt;br /&gt;
end idle&lt;br /&gt;
&lt;br /&gt;
on quit&lt;br /&gt;
	continue quit&lt;br /&gt;
end quit&lt;br /&gt;
&lt;br /&gt;
on takeMailOffline()&lt;br /&gt;
	tell application &quot;Mail&quot;&lt;br /&gt;
		set fetches automatically to false&lt;br /&gt;
	end tell&lt;br /&gt;
end takeMailOffline&lt;br /&gt;
&lt;br /&gt;
on takeMailOnline()&lt;br /&gt;
	tell application &quot;Mail&quot;&lt;br /&gt;
		set fetches automatically to true&lt;br /&gt;
	end tell&lt;br /&gt;
end takeMailOnline&lt;br /&gt;
&lt;/pre&gt;&lt;br /&gt;
  
    </content:encoded>

    <pubDate>Thu, 28 Apr 2011 09:20:50 -0700</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/139-guid.html</guid>
    
</item>
<item>
    <title>How to repair an E1 error a Schwin 418 elliptical</title>
    <link>http://darren.stanford.edu/serendipity/archives/136-How-to-repair-an-E1-error-a-Schwin-418-elliptical.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/136-How-to-repair-an-E1-error-a-Schwin-418-elliptical.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=136</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=136</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    E1 error seems to indicate that the servo which controls the elliptical resistance is stuck. Here is how I fixed this (without using a &quot;crank puller&quot;, which would be quicker by far).&lt;br /&gt;
&lt;br /&gt;
You will need a very short phillips screw driver (snub nose), a long phillips screw driver, an allen key set, and crescent wrench.&lt;br /&gt;
&lt;br /&gt;
- Remove the batteries from the unit.&lt;br /&gt;
- Remove the screws from the plastic housing (with the long phillips screw driver) on the left side. Do not forget the phillips screws at the front - they are smaller screws so don&#039;t mix them with the others. This will allow the plastic housing to flex and move around, but not come entirely off.&lt;br /&gt;
- Using the crescent wrench, remove the nut holding the left pedal to the crank. Carefully note the order of the washers on the crank attachment.&lt;br /&gt;
- Using the allen key, remove the little pedal attachment piece on the left crank arm.&lt;br /&gt;
- Using the short phillips screw driver, carefully reach inside the plastic housing on the top and remove the four screws holding the plastic plate on the outside of the fly wheel/crank. You will need to rotate the crank wheel to reach each of the four screws in turn on the inside of the case.&lt;br /&gt;
- Pull off the plastic cover for the wheel.&lt;br /&gt;
- Reinsert batteries and gently help the revealed cable (bottom) retract the magnet plate. In my case, the servo worked fine again after helping it retract the magnet plate that was somehow stuck/wedged.&lt;br /&gt;
&lt;br /&gt;
If your little servo motor is dead (or the little gears are stripped), you can find a replacement online for about $50 with shipping. &lt;br /&gt;
&lt;br /&gt;
Reverse steps to re-assemble. 
    </content:encoded>

    <pubDate>Thu, 08 Apr 2010 22:18:32 -0700</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/136-guid.html</guid>
    
</item>
<item>
    <title>How to replace a LCD display for a Toshiba A135 laptop</title>
    <link>http://darren.stanford.edu/serendipity/archives/135-How-to-replace-a-LCD-display-for-a-Toshiba-A135-laptop.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/135-How-to-replace-a-LCD-display-for-a-Toshiba-A135-laptop.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=135</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=135</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
        &lt;strong&gt;  First, purchase your replacement LCD display for your exact model of Toshiba A135.  I found mine for about $110 with shipping.&lt;br /&gt;
    &lt;/strong&gt; There are five screws hidden beneath rubber bumpers around the screen.  Carefully use a small flat screwdriver to remove the pencil eraser sized rubber bumpers - one at each corner, with the fifth at the top center.  Make sure you carefully remove the sticky stuff they used to adhere the bumper to the screw as well.  Set these carefully aside.&lt;br /&gt;
    &lt;strong&gt; Remove the five screws and set them aside.&lt;br /&gt;
    &lt;/strong&gt; Gently press down at the inside plastic frame until it pops out slightly.  Gently press towards the center of the screen at the sides of the inside plastic frame until it pops out. &lt;br /&gt;
    &lt;strong&gt; Carefully separate the front and back plastic shell around the screen.  Set the front plastic frame aside.  You may need to loosen some of the white tape used to keep wires attached to the rear plastic shell.  Gently lower the rear plastic shell away from the LCD, but leave as many wires attached as possible.&lt;br /&gt;
    &lt;/strong&gt; On the back of the LCD there is a large cable.  Carefully pull up the tape that holds this cable in place and pull the cable down to remove it.  You will also have another piece of white tape on the back of the LCD to peel back.  The tape is important - don&#039;t tear it or get your fingers in it to remove its stick!&lt;br /&gt;
    &lt;strong&gt; At one end you will see a set of a few wires plugged into a piece still attached to the rear plastic shell.  Unplug this.&lt;br /&gt;
    &lt;/strong&gt; No wires should still be plugged into the LCD anywhere at this point.&lt;br /&gt;
    &lt;strong&gt; Around the LCD there are six small screws.  Remove these and set them aside.  You now have now removed the old LCD.&lt;br /&gt;
    &lt;/strong&gt; Reverse this process to re-assemble. &lt;br /&gt;
    * You may want to use some blue LockTite (which can be found at hardware stores) for the screws as you replace them.  Additionally, you might need a little rubber cement to re-attach the rubber bumpers at the last step.  If you do not re-attach these bumpers, your screen will quickly become scratched by your keyboard touching it when the lid is closed.&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Thu, 08 Apr 2010 22:16:58 -0700</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/135-guid.html</guid>
    
</item>
<item>
    <title>Macbook Pro bluetooth stops showing &quot;Turn Off&quot; option</title>
    <link>http://darren.stanford.edu/serendipity/archives/133-Macbook-Pro-bluetooth-stops-showing-Turn-Off-option.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/133-Macbook-Pro-bluetooth-stops-showing-Turn-Off-option.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=133</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=133</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    So recently my Macbook Pro (Intel) has been having some weird issues.  Several times when I plug it into an external monitor the system hangs with a blue screen - I had to hard-power off.  Then, I noticed that bluetooth was misbehaving - disconnecting, reconnecting, failing to reconnect, etc.  I was resorting to removing and re-adding bluetooth keyboard and mouse to get them to work.  &lt;br /&gt;
&lt;br /&gt;
Finally, the bluetooth menu stopped showing &quot;Turn Off&quot; as an option!  Since I wander around the house with my Macbook, this was really annoying - I was seeing disconnect and reconnect bluetooth notices constantly.  &lt;br /&gt;
&lt;br /&gt;
After Googling around a bit, I found this:  &lt;a href=&quot;http://support.apple.com/kb/HT3964&quot; title=&quot;Reset SMC&quot;&gt;http://support.apple.com/kb/HT3964&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Resetting the SMC has fixed the bluetooth issue - the &quot;Turn Off&quot; (or &quot;Turn On&quot;) has reappeared in the bluetooth menu - and I haven&#039;t had any display issues.  If you have similar symptoms, give it a try. 
    </content:encoded>

    <pubDate>Fri, 19 Mar 2010 20:53:03 -0700</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/133-guid.html</guid>
    
</item>
<item>
    <title>pidgin + openfire + kerberos on RHEL 5</title>
    <link>http://darren.stanford.edu/serendipity/archives/132-pidgin-+-openfire-+-kerberos-on-RHEL-5.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/132-pidgin-+-openfire-+-kerberos-on-RHEL-5.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=132</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=132</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    For those who are struggling to get pidgin on RHEL 5 to work with kerberos auth to openfire IM server...&lt;br /&gt;
&lt;br /&gt;
After some research I discovered that you have to install &lt;b&gt;&lt;i&gt;cyrus-sasl-gssapi&lt;/i&gt;&lt;/b&gt; and have a valid kerberos ticket before it will work.  Pidgin will not require that package on install or upgrade (at this time), so you must install it and restart pidgin to load the library.  
    </content:encoded>

    <pubDate>Wed, 02 Sep 2009 18:33:00 -0700</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/132-guid.html</guid>
    
</item>
<item>
    <title>Filter stderr output in bash</title>
    <link>http://darren.stanford.edu/serendipity/archives/131-Filter-stderr-output-in-bash.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/131-Filter-stderr-output-in-bash.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=131</wfw:comment>

    <slash:comments>9</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=131</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    I was searching around the other day for a way to filter stderr output from a init.d script.  It was throwing useless errors and those were going to root mail since this was all being done via cron job on a few linux boxes. &lt;br /&gt;
&lt;br /&gt;
After poking around a bit on the web, I found this wonderful little snippet for bash:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;cmd 2&gt; &gt;(grep -v &quot;filter Err Txt&quot; &gt;&amp;2)&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
This particular solution only works in bash - it won&#039;t work for bash in sh mode.  Some other shells have other (longer) solutions, but since I deal with bash 95% of the time, this is what I needed.  I actually ignore stdout when I do a service restart, so it looks more like this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;/etc/init.d/something restart 2&gt; &gt;(grep -v &quot;Pointless err&quot; &gt;&amp;2) &gt; /dev/null&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
 It really works great and has reduced my needless cron mail!  
    </content:encoded>

    <pubDate>Fri, 24 Jul 2009 18:10:00 -0700</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/131-guid.html</guid>
    
</item>
<item>
    <title>iBank import from quicken creates categories with the same name as accounts</title>
    <link>http://darren.stanford.edu/serendipity/archives/130-iBank-import-from-quicken-creates-categories-with-the-same-name-as-accounts.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/130-iBank-import-from-quicken-creates-categories-with-the-same-name-as-accounts.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=130</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=130</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    I recently switched from Quicken to iBank.  The change wasn&#039;t without its hiccups though.  When following the instructions from iBank to export and import from Quicken I discovered that the result was duplicate entries for every transfer transaction.  I&#039;m sure this is because iBank is importing the quicken export serially and doesn&#039;t know that the transactions are linked between accounts.  To make things more difficult, some of the transfer entries were linked, probably due to the order in which they appeared in the file was after the creation of the account.&lt;br /&gt;
&lt;br /&gt;
I found that I had to remove the duplicate transactions manually and change the non-duplicate transactions to link to the account, but that didn&#039;t fix the problem entirely.  Turns out that iBank created categories with the same name as the account when it imported the quicken export.  That meant that iBank would not let me change certain transactions to link (make them transfers between accounts).  It would always revert to the category with that name instead of the account. &lt;br /&gt;
&lt;br /&gt;
I ended up with the following solution.  In the category view, rename each of the categories that matched the name of an account.  Quit iBank and re-open it.  Proceed with switching the unique transactions to link using the account, and then deleting the duplicate transactions that remained.  &lt;br /&gt;
&lt;br /&gt;
Fortunately it only took me about 20 minutes to finish cleaning up the transactions (I have data going back to &#039;04).  It wasn&#039;t much fun, but I&#039;m happy to be off of quicken. 
    </content:encoded>

    <pubDate>Tue, 23 Jun 2009 21:00:17 -0700</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/130-guid.html</guid>
    
</item>
<item>
    <title>multi-threaded vmware esx evacuation perl script</title>
    <link>http://darren.stanford.edu/serendipity/archives/120-multi-threaded-vmware-esx-evacuation-perl-script.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/120-multi-threaded-vmware-esx-evacuation-perl-script.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=120</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=120</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    The VMware perl SDK utilities have a script to evacuate an ESX server to another server, but it is painfully slow since it is done serially.  I modified the script to use threads and queue up 6 moves (VMotions) at a time.  The script also has an option to place the ESX server into maintenance mode after it is evacuated.  &lt;br /&gt;
&lt;br /&gt;
Since this script bypasses the DRS evacuation which is done from the GUI when you place a system into maintenance mode, it appears to be quite a bit faster (maybe 50% faster given my initial tests?).  Feel free to post comments with your experience using the script.  Obviously you&#039;ll need a working install of the VMware perl 1.5 perl modules (SDK) to use this script.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=/programming/perl/vmevac.pl&gt;Right -click and select &quot;Save...&quot; to download perl source.&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;&lt;br /&gt;
#!/usr/bin/perl -w&lt;br /&gt;
#&lt;br /&gt;
# This scripts allows users to move all running vm&#039;s from one host to another.&lt;br /&gt;
# Modified by Darren Patterson to be multithreaded and include an option to place the&lt;br /&gt;
# source ESX server into maintenance mode after the evac finishes.&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use threads;&lt;br /&gt;
use threads::shared;&lt;br /&gt;
&lt;br /&gt;
use VMware::VIM25Runtime;&lt;br /&gt;
use VMware::VILib;&lt;br /&gt;
&lt;br /&gt;
# MAX number of concurrently running evac processes.&lt;br /&gt;
my $MAXT = 6;&lt;br /&gt;
&lt;br /&gt;
# seconds to sleep while checking for completed threads.&lt;br /&gt;
my $SLEEPSIZE = 8;&lt;br /&gt;
&lt;br /&gt;
my %opts = (&lt;br /&gt;
   src =&gt; {&lt;br /&gt;
      type =&gt; &quot;=s&quot;,&lt;br /&gt;
      help =&gt; &quot;Host to evacuate&quot;,&lt;br /&gt;
      required =&gt; 1,&lt;br /&gt;
   },&lt;br /&gt;
   dst =&gt; {&lt;br /&gt;
      type =&gt; &quot;=s&quot;,&lt;br /&gt;
      help =&gt; &quot;Destination host for VMs&quot;,&lt;br /&gt;
      required =&gt; 1,&lt;br /&gt;
   },&lt;br /&gt;
   maint =&gt; {&lt;br /&gt;
      type =&gt; &quot;&quot;,&lt;br /&gt;
      help =&gt; &quot;Place the source host that is evacuating into maintenance mode&quot;,&lt;br /&gt;
      required =&gt; 0,&lt;br /&gt;
   },&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
# read/validate options and connect to the server&lt;br /&gt;
Opts::add_options(%opts);&lt;br /&gt;
Opts::parse();&lt;br /&gt;
Opts::validate();&lt;br /&gt;
Util::connect();&lt;br /&gt;
&lt;br /&gt;
# get source host view&lt;br /&gt;
my $src_host_name = Opts::get_option(&#039;src&#039;);&lt;br /&gt;
my $src_host_view = Vim::find_entity_view(view_type =&gt; &#039;HostSystem&#039;,&lt;br /&gt;
                                          filter =&gt; { name =&gt; $src_host_name });&lt;br /&gt;
&lt;br /&gt;
if (!$src_host_view) {&lt;br /&gt;
   die &quot;Source host &#039;$src_host_name&#039; not found\n&quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# get destination host view&lt;br /&gt;
my $dst_host_name = Opts::get_option(&#039;dst&#039;);&lt;br /&gt;
&lt;br /&gt;
# the destination host view must be a shared variable for threads to see&lt;br /&gt;
my $dst_host_view = Vim::find_entity_view(view_type =&gt; &#039;HostSystem&#039;,&lt;br /&gt;
                                          filter =&gt; { name =&gt; $dst_host_name });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if (! $dst_host_view) {&lt;br /&gt;
   die &quot;Destiation host &#039;$dst_host_name&#039; not found\n&quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# get all VM&#039;s under src host&lt;br /&gt;
my $vm_views = Vim::find_entity_views(view_type =&gt; &#039;VirtualMachine&#039;,&lt;br /&gt;
                                      begin_entity =&gt; $src_host_view);&lt;br /&gt;
&lt;br /&gt;
# migrate all vm&#039;s&lt;br /&gt;
#print &quot;Starting threads...\n&quot;;&lt;br /&gt;
my @results : shared;&lt;br /&gt;
my $inc = 0;&lt;br /&gt;
foreach (@$vm_views) {&lt;br /&gt;
   threads-&gt;new(\&amp;evac, $dst_host_view, $_);&lt;br /&gt;
   #print &quot;Started thread: &quot; . $t-&gt;tid . &quot;\n&quot;;&lt;br /&gt;
   $inc++;&lt;br /&gt;
   while (($inc - ($#results+1) &gt;= $MAXT) &amp;&amp;amp; (@$vm_views &gt; $inc)) {&lt;br /&gt;
      #print &quot;wait thread(s) done: &quot;.$inc.&quot; - &quot;.($#results+1).&quot; &gt;= $MAXT\n&quot;;&lt;br /&gt;
      sleep($SLEEPSIZE);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &quot;Waiting for all VMotion threads to finish...\n&quot;;&lt;br /&gt;
sleep ($SLEEPSIZE) while ($#results+1 &lt; @$vm_views);&lt;br /&gt;
&lt;br /&gt;
my $return;&lt;br /&gt;
foreach (@results) {&lt;br /&gt;
    if (/returned 2$/) {&lt;br /&gt;
        $return = 2;&lt;br /&gt;
        print STDERR &quot;An error was returned by a VMotion thread.\n&quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# Note: Specifically don&#039;t join threads to avoid double free segfault.&lt;br /&gt;
# Let perl do the cleanup on exit.&lt;br /&gt;
#&lt;br /&gt;
# Loop through all the threads &lt;br /&gt;
#   foreach my $thr (threads-&gt;list) { &lt;br /&gt;
   # Don&#039;t join the main thread or ourselves &lt;br /&gt;
#   if ($thr-&gt;tid &amp;&amp;amp; !threads::equal($thr, threads-&gt;self)) { &lt;br /&gt;
#      $thr-&gt;join if (defined($thr) &amp;&amp;amp; print &quot;joined thread: &quot;.$thr-&gt;tid.&quot;\n&quot;); &lt;br /&gt;
#   } &lt;br /&gt;
#}&lt;br /&gt;
&lt;br /&gt;
# it may still be possible to enter maintenance mode even though an error&lt;br /&gt;
# may have happened earlier&lt;br /&gt;
if (Opts::get_option(&#039;maint&#039;)) {&lt;br /&gt;
   print &quot;Putting &quot;.$src_host_name.&quot; into maintenance mode...\n&quot;;&lt;br /&gt;
   $return = enter_maintenance($src_host_view);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &quot;done\n&quot;;&lt;br /&gt;
&lt;br /&gt;
# disconnect from the server&lt;br /&gt;
Util::disconnect();                                  &lt;br /&gt;
return $return;&lt;br /&gt;
&lt;br /&gt;
sub enter_maintenance {&lt;br /&gt;
   my $target_host = shift;&lt;br /&gt;
   eval {&lt;br /&gt;
      $target_host-&gt;EnterMaintenanceMode(timeout =&gt; 0);&lt;br /&gt;
      print &quot;\nHost &#039;&quot; . $target_host-&gt;name&lt;br /&gt;
                   . &quot;&#039; entered maintenance mode successfully\n&quot;;&lt;br /&gt;
      return 0;&lt;br /&gt;
   };&lt;br /&gt;
   if ($@) {&lt;br /&gt;
      if (ref($@) eq &#039;SoapFault&#039;) {&lt;br /&gt;
         if (ref($@-&gt;detail) eq &#039;InvalidState&#039;) {&lt;br /&gt;
            print &quot;\nThe enter_maintenancemode operation&quot;.&lt;br /&gt;
            &quot; is not allowed in the current state&quot;;&lt;br /&gt;
         }&lt;br /&gt;
         elsif (ref($@-&gt;detail) eq &#039;Timedout&#039;) {&lt;br /&gt;
            print &quot;\nOperation timed out\n&quot;;&lt;br /&gt;
         }&lt;br /&gt;
         elsif (ref($@-&gt;detail) eq &#039;HostNotConnected&#039;) {&lt;br /&gt;
            print &quot;\nUnable to communicate with the&quot;&lt;br /&gt;
                         . &quot; remote host, since it is disconnected.\n&quot;;&lt;br /&gt;
         }&lt;br /&gt;
         else {&lt;br /&gt;
            print &quot;\nHost cannot be entered into maintenance mode \n&quot; . $@. &quot;&quot;;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         print &quot;\nHost cannot be entered into maintenance mode \n&quot; . $@. &quot;&quot;;&lt;br /&gt;
      }&lt;br /&gt;
      return 2;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub evac {&lt;br /&gt;
   my $dst_host_view = shift;&lt;br /&gt;
   my $vm = shift;&lt;br /&gt;
   eval {&lt;br /&gt;
      print &quot;Starting VMotion for &quot;.$vm-&gt;name.&quot;\n&quot;;&lt;br /&gt;
      $vm-&gt;MigrateVM(host =&gt; $dst_host_view,&lt;br /&gt;
                    priority =&gt; VirtualMachineMovePriority-&gt;new(&#039;defaultPriority&#039;),&lt;br /&gt;
                    state =&gt; VirtualMachinePowerState-&gt;new(&#039;poweredOn&#039;));&lt;br /&gt;
      print &quot;VM &quot; . $vm-&gt;name . &quot; evacuated successfully.\n&quot;;&lt;br /&gt;
      push (@results, (threads-&gt;self)-&gt;tid.&quot; returned 0&quot;);&lt;br /&gt;
      return 0;&lt;br /&gt;
   };&lt;br /&gt;
   if ($@ &amp;&amp;amp; $vm-&gt;runtime-&gt;powerState-&gt;val eq &#039;poweredOn&#039;) {&lt;br /&gt;
      # unexpected error&lt;br /&gt;
      print &quot;Unable to evacuate VM &#039;&quot; . $vm-&gt;name . &quot;&#039;\n&quot;;&lt;br /&gt;
      print &quot;Reason: &quot; . $@ . &quot;\n\n&quot;;&lt;br /&gt;
      push (@results, (threads-&gt;self)-&gt;tid.&quot; returned 2&quot;);&lt;br /&gt;
      return 2;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
##############################################################################&lt;br /&gt;
# Documentation&lt;br /&gt;
##############################################################################&lt;br /&gt;
&lt;br /&gt;
=head1 NAME&lt;br /&gt;
&lt;br /&gt;
vmevac - evacuate an ESX server&#039;s VM guests to another ESX server&lt;br /&gt;
&lt;br /&gt;
=head1 SYNOPSIS&lt;br /&gt;
&lt;br /&gt;
B&lt;vmevac&gt; B&lt;--src&gt; I&lt;ESX-to-evacuate&gt; B&lt;--dst&gt; I&lt;dest-for-vms&gt; [B&lt;--maint&gt;]&lt;br /&gt;
&lt;br /&gt;
=head1 DESCRIPTION&lt;br /&gt;
&lt;br /&gt;
Evacuate an ESX server&#039;s VM guests to another ESX server.&lt;br /&gt;
&lt;br /&gt;
=head1 OPTIONS&lt;br /&gt;
&lt;br /&gt;
=over 4&lt;br /&gt;
&lt;br /&gt;
=item B&lt;-h&gt;, B&lt;--help&gt;&lt;br /&gt;
&lt;br /&gt;
Print out help.&lt;br /&gt;
&lt;br /&gt;
=item B&lt;--dst&gt; I&lt;ESX-server&gt;&lt;br /&gt;
&lt;br /&gt;
The destination ESX server to relocate VM guests to.&lt;br /&gt;
&lt;br /&gt;
=item B&lt;--maint&gt; &lt;br /&gt;
&lt;br /&gt;
Place the source ESX server into maintenance mode after evacuation.&lt;br /&gt;
&lt;br /&gt;
=item B&lt;--src&gt; I&lt;ESX-server&gt;&lt;br /&gt;
&lt;br /&gt;
The souce ESX server to evacuate VM guests from.&lt;br /&gt;
&lt;br /&gt;
=back&lt;br /&gt;
&lt;br /&gt;
=head1 EXAMPLES&lt;br /&gt;
&lt;br /&gt;
vmevac --src hal07.stanford.edu --dst hal08.stanford.edu&lt;br /&gt;
vmevac --src hal07.stanford.edu --dst hal08.stanford.edu --maint&lt;br /&gt;
&lt;/pre&gt; 
    </content:encoded>

    <pubDate>Fri, 25 Jul 2008 14:51:54 -0700</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/120-guid.html</guid>
    
</item>
<item>
    <title>iTerm double click selects a word</title>
    <link>http://darren.stanford.edu/serendipity/archives/118-iTerm-double-click-selects-a-word.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/118-iTerm-double-click-selects-a-word.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=118</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=118</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    Another one of my annoyances with using iTerm has been that it didn&#039;t select entire words sometimes.  I finally found &lt;a href=&quot;http://discussions.apple.com/thread.jspa?threadID=1324643&amp;tstart=148&quot; title=&quot;iTerm select whole word on double click&quot;&gt;this article&lt;/a&gt; on how to make iTerm select words with non-alphanumeric characters.&lt;br /&gt;
&lt;br /&gt;
Now it behaves very similarly to xterm or gnome-terminal in Linux, which makes me quite happy... 
    </content:encoded>

    <pubDate>Thu, 05 Jun 2008 14:15:32 -0700</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/118-guid.html</guid>
    
</item>
<item>
    <title>command line newsgroup access</title>
    <link>http://darren.stanford.edu/serendipity/archives/117-command-line-newsgroup-access.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/117-command-line-newsgroup-access.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=117</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=117</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    Since I&#039;ve been working from my Macbook Pro quite a bit lately, I went in search for a good command line newsgroup reader (I use internal newsgroups for help ticket tracking and other tasks).  My coworker pointed me at &lt;a href=&quot;http://slrn.sourceforge.net/&quot; title=&quot;slrn sourceforge site&quot;&gt;slrn&lt;/a&gt; since I&#039;m VI kind of guy (I tried gnus once, but I hated it).  &lt;br /&gt;
&lt;br /&gt;
After a bit of reading and experimentation, I setup a nice scorefile, .slrnrc and was able to get through my daily newsgroup routine in less time than usual.  Given that it can take me up to three hours to finish, I was stoked!  &lt;br /&gt;
&lt;br /&gt;
For those addicted to the command line and who don&#039;t do emacs, check out slrn.  
    </content:encoded>

    <pubDate>Tue, 03 Jun 2008 13:54:27 -0700</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/117-guid.html</guid>
    
</item>
<item>
    <title>iTerm and the elusive ALT-. (for bash)</title>
    <link>http://darren.stanford.edu/serendipity/archives/116-iTerm-and-the-elusive-ALT-.-for-bash.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/116-iTerm-and-the-elusive-ALT-.-for-bash.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=116</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=116</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    I&#039;ve been using my Macbook Pro a lot lately and I seriously missed having ALT-. in iTerm for scrolling back through my bash last arg history.  I finally was able to make it work, and here&#039;s how:&lt;br /&gt;
&lt;br /&gt;
Go to the Bookmarks menu&lt;br /&gt;
Select &quot;Manage Profiles&quot;&lt;br /&gt;
Expand Keyboard Profiles and select the one you use - probably &quot;xterm (OS X)&quot; &lt;i&gt;(Update: use the &quot;Global&quot; profile on the latest iTerm and Panther)&lt;/i&gt;.&lt;br /&gt;
Click the &quot;+&quot; button to add a new key mapping.&lt;br /&gt;
For &quot;Key&quot; choose &quot;Hex Code&quot; and enter &quot;0x2e&quot;&lt;br /&gt;
Check the &quot;Option&quot; modifier.&lt;br /&gt;
Action should be &quot;send escape sequence&quot; and enter &quot;.&quot; into the box.&lt;br /&gt;
&lt;br /&gt;
You should now be able to press ALT-. and have it send the correct escape sequence through iTerm. 
    </content:encoded>

    <pubDate>Tue, 03 Jun 2008 13:20:59 -0700</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/116-guid.html</guid>
    
</item>
<item>
    <title>UTF-8 in magpierss (get rid of those pesky question marks)</title>
    <link>http://darren.stanford.edu/serendipity/archives/114-UTF-8-in-magpierss-get-rid-of-those-pesky-question-marks.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/114-UTF-8-in-magpierss-get-rid-of-those-pesky-question-marks.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=114</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=114</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    I&#039;ve been working on a Facebook plugin for the &lt;a href=http://regrettablemusic.com alt=&quot;The Regrettable Music Blog&quot;&gt;Regrettable Music Blog&lt;/a&gt; and discovered that &lt;a href=&quot;http://magpierss.sourceforge.net&quot; title=&quot;Magpie RSS&quot;&gt;Magpie RSS&lt;/a&gt; needs a bit of prodding to cooperating with the output from our WordPress feed.  I&#039;ve seen lots of questions asked on forums about &quot;how to fix the question marks that show up&quot; instead of single quotes, hyphens, etc.  I found that setting the encoding worked to fix that issue:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;br /&gt;
define(&#039;MAGPIE_INPUT_ENCODING&#039;, &#039;UTF-8&#039;);&lt;br /&gt;
define(&#039;MAGPIE_OUTPUT_ENCODING&#039;, &#039;UTF-8&#039;);&lt;br /&gt;
&lt;/pre&gt; 
    </content:encoded>

    <pubDate>Mon, 18 Feb 2008 12:25:19 -0800</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/114-guid.html</guid>
    
</item>
<item>
    <title>Panasonic KX-TC1500B not recording messages</title>
    <link>http://darren.stanford.edu/serendipity/archives/112-Panasonic-KX-TC1500B-not-recording-messages.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/112-Panasonic-KX-TC1500B-not-recording-messages.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=112</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=112</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    Our ancient Panasonic 900Mhz phone + answering machine suddenly stopped recording incoming messages.  It would play our recorded message, but then it would play a loud tone for 3 seconds and disconnect (instead of recording).  &lt;br /&gt;
&lt;br /&gt;
After trying a bunch of stuff, I finally got it to work again by unplugging it for 30 seconds, plugging it in, pressing erase twice to erase all messages (even though there were no messages on the machine), then pressing the &quot;answer on&quot; button twice (to turn off answering, then turn it on again). I&#039;m not sure if all the steps were needed, but that&#039;s what made it work for me.  
    </content:encoded>

    <pubDate>Sun, 03 Feb 2008 11:54:48 -0800</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/112-guid.html</guid>
    
</item>
<item>
    <title>Shelfari shelf serendipity plugin</title>
    <link>http://darren.stanford.edu/serendipity/archives/106-Shelfari-shelf-serendipity-plugin.html</link>
            <category>Geek</category>
    
    <comments>http://darren.stanford.edu/serendipity/archives/106-Shelfari-shelf-serendipity-plugin.html#comments</comments>
    <wfw:comment>http://darren.stanford.edu/serendipity/wfwcomment.php?cid=106</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://darren.stanford.edu/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=106</wfw:commentRss>
    

    <author>nospam@example.com (Darren Patterson)</author>
    <content:encoded>
    I had a few moments this morning before &#039;Khi woke up so I wrote up a quick plugin for &lt;a href=&quot;http://s9y.org&quot;&gt;Serendipity&lt;/a&gt; to insert a generated &lt;a href=&quot;http://shelfari.com&quot; title=&quot;Shelfari&quot;&gt;Shelfari&lt;/a&gt; shelf.  &lt;a href=&quot;uploads/serendipity_plugin_shelfari_shelf.tar.gz&quot; title=&quot;Shelfari Shelf Serendipity Plugin&quot;&gt;Click here to download the Shelfari Shelf Serendipity Plugin.&lt;/a&gt; 
    </content:encoded>

    <pubDate>Tue, 25 Dec 2007 10:35:28 -0800</pubDate>
    <guid isPermaLink="false">http://darren.stanford.edu/serendipity/archives/106-guid.html</guid>
    
</item>

</channel>
</rss>
