<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Planet PLUG</title>
	<link>http://planet.phillylinux.org/</link>
	<language>en</language>
	<description>Planet PLUG - http://planet.phillylinux.org/</description>

<item>
	<title>Tharun Kumar Allu: Set Up an Email Gateway with CentOS Linux�5.4 � Aaron Walrath – Another IT Guy's Meanderings</title>
	<guid>tag:blogger.com,1999:blog-96283653617011583.post-1262353977799598007</guid>
	<link>http://redhatlinuxworld.blogspot.com/2010/07/set-up-email-gateway-with-centos.html</link>
	<description>A very useful mail gateway setup on Linux to be an edge server for MS Exchange.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://aaronwalrath.wordpress.com/2010/04/15/set-up-an-email-gateway-with-centos-linux-5-4/&quot;&gt;Set Up an Email Gateway with CentOS Linux�5.4 � Aaron Walrath – Another IT Guy's Meanderings&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/96283653617011583-1262353977799598007?l=redhatlinuxworld.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 28 Jul 2010 16:35:19 +0000</pubDate>
	<author>noreply@blogger.com (Tharun)</author>
</item>
<item>
	<title>Kyle Winfree: 18 miles on 1 watt</title>
	<guid>http://www.classicmagicstudios.com/wordpress/?p=49</guid>
	<link>http://www.classicmagicstudios.com/wordpress/?p=49</link>
	<description>&lt;p&gt;I finished a quarter wave dipole antenna yesterday, and had a chance to try it out tonight.  I wasn&amp;#8217;t able to get a signal report (I tested at 1am), but I definitely was able to get into several Philadelphia 440Mhz repeaters.  This is neat to me because the antenna is so simple, yet already is showing better performance than a commercial mag mount antenna I have.&lt;/p&gt;
&lt;p&gt;I made the antenna such that it can easily be taken apart.  This way, it can be moved without the high probability that it would be damaged.  Please see the pictures.&lt;/p&gt;

&lt;a href=&quot;http://www.classicmagicstudios.com/wordpress/?attachment_id=51&quot; title=&quot;100_9499_edit&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.classicmagicstudios.com/wordpress/wp-content/uploads/2010/07/100_9499_edit-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;The VX-2R (1 watt on 440Mhz) handy talkie and my disassemblable quarter wave dipole.&quot; title=&quot;100_9499_edit&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.classicmagicstudios.com/wordpress/?attachment_id=52&quot; title=&quot;100_9500_edit&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.classicmagicstudios.com/wordpress/wp-content/uploads/2010/07/100_9500_edit-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;Removable ground elements.&quot; title=&quot;100_9500_edit&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.classicmagicstudios.com/wordpress/?attachment_id=50&quot; title=&quot;18 miles to Phila&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.classicmagicstudios.com/wordpress/wp-content/uploads/2010/07/18-miles-to-Phila-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;18 Miles to Phila from Paoli&quot; title=&quot;18 miles to Phila&quot; /&gt;&lt;/a&gt;</description>
	<pubDate>Wed, 28 Jul 2010 05:30:10 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Anyone want to do a couple early morning pre-guadec rides?</title>
	<guid>http://www.lamalex.net/?p=126</guid>
	<link>http://www.lamalex.net/2010/07/anyone-want-to-do-a-couple-early-morning-pre-guadec-rides/</link>
	<description>&lt;p&gt;I know there are some other cyclists in the GNOME community who are probably bummed that they&amp;#8217;re spending a week away from their bikes, so if anyone else is feeling withdraw symptoms from not riding I am planning to find a bike shop in Den Haag where I can rent a road bike and do some early morning rides before guadec starts. If you&amp;#8217;re interested in some early morning pain and suffering grab me at guadec and let&amp;#8217;s figure out a route.&lt;/p&gt;
&lt;div class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://demoncats.phanfare.com/4754251_5279536#imageID=105383772&quot;&gt;&lt;img src=&quot;http://cdn-2-service.phanfare.com/images/5396178_4754251_105383772_WebSmall_3/Image-5396178-105383772-2-WebSmall_0_c851206470ca48736d859eccb6c423ae_1&quot; alt=&quot;&quot; width=&quot;531&quot; height=&quot;575&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;(C) 2010 Demoncats photography&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 25 Jul 2010 09:18:51 +0000</pubDate>
</item>
<item>
	<title>Kyle Winfree: Arduino SDWrite</title>
	<guid>http://www.classicmagicstudios.com/wordpress/?p=47</guid>
	<link>http://www.classicmagicstudios.com/wordpress/?p=47</link>
	<description>&lt;p&gt;Alright, so it&amp;#8217;s been done for 9 days now, and I&amp;#8217;m just now getting around to making a blog post about it, but I have a working SD card writer.  Basically, I took an existing example (that came from Ryan Owens (Spark Fun) using a library written by Roland Riegel) and modified it to be a log file generator.  It works on the MicroSD Shield, &lt;a title=&quot;http://www.sparkfun.com/commerce/product_info.php?products_id=9802&quot; href=&quot;http://www.sparkfun.com/commerce/product_info.php?products_id=9802&quot; target=&quot;_blank&quot;&gt;http://www.sparkfun.com/commerce/product_info.php?products_id=9802&lt;/a&gt;.  I hope to roll this into a library set of it&amp;#8217;s own soon, so my program will reflect &amp;#8220;initialize_log&amp;#8221; and &amp;#8220;write_to_log&amp;#8221; functionality.  Fun fun!&lt;/p&gt;</description>
	<pubDate>Tue, 20 Jul 2010 21:02:51 +0000</pubDate>
</item>
<item>
	<title>Richard Freeman: rich0</title>
	<guid>http://rich0gentoo.wordpress.com/?p=49</guid>
	<link>http://rich0gentoo.wordpress.com/2010/07/18/ec2-custom-kernels/</link>
	<description>&lt;p&gt;One minor issue with EC2 is that they supply the kernel, and that already caused difficulties with my first &lt;a href=&quot;http://rich0gentoo.wordpress.com/2010/04/02/gentoo-on-ec2-from-scratch/&quot;&gt;EC2 tutorial&lt;/a&gt; &amp;#8211; the image I created doesn&amp;#8217;t let you create a new snapshot from a running image since the EC2 kernel lacks loopback support, and I didn&amp;#8217;t supply a matching kernel module.&lt;/p&gt;
&lt;p&gt;Amazon has a nice &lt;a href=&quot;http://ec2-downloads.s3.amazonaws.com/user_specified_kernels.pdf&quot;&gt;guide&lt;/a&gt; on how to do it &amp;#8211; here is a gentoo-specific one.&lt;br /&gt;
&lt;span id=&quot;more-49&quot;&gt;&lt;/span&gt;&lt;br /&gt;
These instructions start from a working ami image created using my previous instructions.  Go ahead and mount it and chroot into the image.  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install a kernel using emerge xen-sources&lt;/li&gt;
&lt;li&gt;Be sure to enable xen support in the kernel config file.  Here is a working &lt;a href=&quot;http://dev.gentoo.org/~rich0/kconfig-xen.txt&quot;&gt;config&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Build the kernel with make &amp;amp;&amp;amp; make modules_install as usual&lt;/li&gt;
&lt;li&gt;Copy the kernel image to /boot as usual.&lt;/li&gt;
&lt;li&gt;Create /boot/grub/menu.lst, containing:&lt;br /&gt;
&lt;code&gt;default 0&lt;br /&gt;
timeout 3&lt;br /&gt;
title EC2&lt;br /&gt;
        root (hd0)&lt;br /&gt;
        kernel /boot/&lt;em&gt;kernel&lt;/em&gt; root=/dev/sda1&lt;br /&gt;
&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;While optional you might want to clean up the kernel source directory, or even remove it &amp;#8211; you&amp;#8217;re paying by the gb and the sources and object files are large.&lt;/li&gt;
&lt;li&gt;Bundle it up with the instructions in the first guide, but on the ec2-bundle-vol command line add &amp;#8211;kernel followed by a suitable kernel ID from the pdf linked above.  For a 64-bit ami in the US-east region use aki‐427d952b&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;#8217;s it &amp;#8211; upload, register, and boot it up!&lt;/p&gt;
&lt;p&gt;I registered a public ami at ami-bcf11ad5, which you can feel free to take a look at.  xen-sources is running a fairly ancient kernel on stable &amp;#8211; maybe on a later installment I&amp;#8217;ll look to update that.  &lt;/p&gt;
&lt;p&gt;Additional note: I registered a public ami at ami-8f04efe6 which is running 2.6.34 on a 32-bit gentoo install.  It also is running the latest stable udev.&lt;/p&gt;
&lt;p&gt;On both images I have an entry in root&amp;#8217;s ssh authorized_keys so that I can more conveniently access these instances when I&amp;#8217;m using them.  If you use this for anything other than experimentation you should remove this before creating your image.  I&amp;#8217;d host a version with and without this, but that does cost money on S3, so consider yourself warned&amp;#8230;&lt;/p&gt;
&lt;br /&gt;Filed under: &lt;a href=&quot;http://rich0gentoo.wordpress.com/category/gentoo/&quot;&gt;gentoo&lt;/a&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rich0gentoo.wordpress.com/49/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rich0gentoo.wordpress.com/49/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rich0gentoo.wordpress.com/49/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rich0gentoo.wordpress.com/49/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rich0gentoo.wordpress.com/49/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rich0gentoo.wordpress.com/49/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rich0gentoo.wordpress.com/49/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rich0gentoo.wordpress.com/49/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rich0gentoo.wordpress.com/49/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rich0gentoo.wordpress.com/49/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rich0gentoo.wordpress.com&amp;blog=12853060&amp;post=49&amp;subd=rich0gentoo&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Sun, 18 Jul 2010 11:57:21 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Great post about Emacs keyboard macros</title>
	<guid>http://yonkeltron.com/?p=675</guid>
	<link>http://yonkeltron.com/2010/07/16/great-post-about-emacs-keyboard-macros/</link>
	<description>&lt;p&gt;I always find great stuff on the &lt;a href=&quot;http://emacs-fu.blogspot.com&quot;&gt;emacs-fu&lt;/a&gt; blog but today I read a particularly-wonderful post about &lt;a href=&quot;http://emacs-fu.blogspot.com/2010/07/keyboard-macros.html&quot;&gt;Emacs keyboard macros&lt;/a&gt;. Like the author, I&amp;#8217;ve been a long-time Emacs user but never really got into keyboard macros because it&amp;#8217;s been quite easy to produce an &lt;a href=&quot;http://en.wikipedia.org/wiki/Emacs_Lisp&quot;&gt;elisp&lt;/a&gt; one-liner in many cases. That being said, this seems like a great time to learn so I look forward to reading more on the topic of &lt;a href=&quot;http://www.emacswiki.org/emacs/KeyboardMacros&quot;&gt;keyboard macros&lt;/a&gt; as well as learning some &lt;a href=&quot;http://www.emacswiki.org/emacs/KeyboardMacrosTricks&quot;&gt;new tricks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks for a great post!&lt;/p&gt;</description>
	<pubDate>Fri, 16 Jul 2010 18:45:41 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: I need a floor in Amsterdam! Does anyone have a dutch floor??</title>
	<guid>http://www.lamalex.net/?p=117</guid>
	<link>http://www.lamalex.net/2010/07/i-need-a-floor-in-amsterdam-does-anyone-have-a-dutch-floor/</link>
	<description>&lt;p&gt;Dear Dutch foss community,&lt;/p&gt;
&lt;p&gt;A friend and I are attending GUADEC this year, but we have plane tickets to fly into Amsterdam on the 24th of July. The problem? GUADEC isn&amp;#8217;t until the 26th! Neither of us have ever been to Holland, and while 2 days is certainly not enough time to enjoy Amsterdam, we want to try. If anyone has a bed/couch/floor/stable/etc. that the two of us could sleep in/on/under the night of the 24th we&amp;#8217;d be super appreciative, and of course you&amp;#8217;d always have a place to stay wherever it is that I&amp;#8217;m living when you need a place to stay (at the moment Philadelphia- &lt;strong&gt;a really great town if you want to come visit, seriously Philly rules!&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Of course we&amp;#8217;ll take you out, or cook you a nice dinner in return for your hospitality, and promise not to make a mess.&lt;/p&gt;
&lt;p&gt;If you have a floor or whatever that we can sleep on, feel free to either leave a comment or send me an email alex.launi@gmail.com!&lt;/p&gt;</description>
	<pubDate>Tue, 06 Jul 2010 17:52:12 +0000</pubDate>
</item>
<item>
	<title>Kyle Winfree: Arduino on Mandriva</title>
	<guid>http://www.classicmagicstudios.com/wordpress/?p=44</guid>
	<link>http://www.classicmagicstudios.com/wordpress/?p=44</link>
	<description>&lt;p&gt;The first hit I received when I searched for &amp;#8220;Arduino Mandriva&amp;#8221; was &lt;a title=&quot;http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1259672641/2&quot; href=&quot;http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1259672641/2&quot;&gt;http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1259672641/2&lt;/a&gt;.  For some reason, wget failed on me when I followed the listed directions.  Instead, I just downloaded arduino-0018 and avr-* from &lt;a title=&quot;ftp://blogdrake.serveftp.net/mandriva/2010.0/free/i586/&quot; href=&quot;ftp://blogdrake.serveftp.net/mandriva/2010.0/free/i586/&quot;&gt;ftp://blogdrake.serveftp.net/mandriva/2010.0/free/i586/&lt;/a&gt; and avr-libc from &lt;a title=&quot;ftp://blogdrake.serveftp.net/mandriva/2010.0/free/noarch/&quot; href=&quot;ftp://blogdrake.serveftp.net/mandriva/2010.0/free/noarch/&quot;&gt;ftp://blogdrake.serveftp.net/mandriva/2010.0/free/noarch/&lt;/a&gt; to a local directory.  I then added that directory to my list of repositories (custom &amp;#8211; local file).  For some odd reason I need to run it with root permissions to get serial port access, but it works.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll note I tried this because the source from the Arduino website didn&amp;#8217;t work out of the box, dependency issues.&lt;/p&gt;</description>
	<pubDate>Sat, 03 Jul 2010 12:49:10 +0000</pubDate>
</item>
<item>
	<title>Kyle Winfree: 100 downloads in 367 days – it sounds unimpressive, but I’m happy</title>
	<guid>http://www.classicmagicstudios.com/wordpress/?p=42</guid>
	<link>http://www.classicmagicstudios.com/wordpress/?p=42</link>
	<description>&lt;p&gt;&amp;#8220;A high fidelity ungrounded torque feedback device: The iTorqU 2.0&amp;#8243;&lt;br /&gt;
15 full-text downloads between 2010-06-10 and 2010-07-02&lt;br /&gt;
102 full-text downloads since date of posting (2009-06-29)&lt;br /&gt;
Congratulations! This paper has now been downloaded over 100 times!&lt;/p&gt;
&lt;p&gt;To encourage readership, simply refer people to the following web address:&lt;br /&gt;
&lt;a title=&quot;http://repository.upenn.edu/ese_papers/497&quot; href=&quot;http://repository.upenn.edu/ese_papers/497&quot;&gt;http://repository.upenn.edu/ese_papers/497&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 02 Jul 2010 19:47:58 +0000</pubDate>
</item>
<item>
	<title>Kyle Winfree: pgfplots</title>
	<guid>http://www.classicmagicstudios.com/wordpress/?p=39</guid>
	<link>http://www.classicmagicstudios.com/wordpress/?p=39</link>
	<description>&lt;p&gt;A friend of mine presented his research from the past few months at the lab&amp;#8217;s weekly meeting today.  He used Beamer/LaTeX to create his slide show.  I&amp;#8217;m a fan of TeX, so I was impressed.  I was more impressed when I came to learn that he used pgfplots to make his figures, rather than Matlab.  Check out pgfplots at &lt;a title=&quot;http://sourceforge.net/projects/pgfplots&quot; href=&quot;http://sourceforge.net/projects/pgfplots&quot;&gt;http://sourceforge.net/projects/pgfplots&lt;/a&gt;/.  I want to point out that he simply exported his data (from Matlab, but he could have used Octave) to a csv file.  He then made his plots &lt;em&gt;within&lt;/em&gt; LaTeX so that he had ultimate control over the plots, and they really did come out nice.  I thought eps (vector graphic) figures trumped jpgs (read as LaTeX trumps PowerPoint for science slides), but I&amp;#8217;m excited to say that pgfplots trumps eps (which still reads as LaTeX trumps PowerPoint).&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m starting to think that I might need to do a short presentation on LaTeX for my local LUG; they (we) have been &lt;span&gt;desperately&lt;/span&gt; looking for presenters on Linux-ey topics.  Maybe in another two or three months, after I get another paper or two at least submitted to a journal/conference.&lt;/p&gt;</description>
	<pubDate>Fri, 02 Jul 2010 19:40:27 +0000</pubDate>
</item>
<item>
	<title>Kyle Winfree: Arduino and Linux Journal</title>
	<guid>http://www.classicmagicstudios.com/wordpress/?p=36</guid>
	<link>http://www.classicmagicstudios.com/wordpress/?p=36</link>
	<description>&lt;p&gt;I can&amp;#8217;t post a link to the article, since it&amp;#8217;s not yet available at linuxjournal.com, but this month&amp;#8217;s LJ issue just happens to cover the Arduino board!  They cover plotting data using the Arduino debug serial command and kst.  Very cool.&lt;/p&gt;
&lt;p&gt;My mentee has just finished the wiring harness for all of our analog sensors (six in total).  He&amp;#8217;s working on placement of the sensors and plotting some of that data this weekend (though not with kst).  I&amp;#8217;ve started delving into the mp3 shield we got from sparkfun.com, and hope to get that working with the microsd card shield this weekend.  I had to relocate the chip select (CS) pin on the lcd shield we have, as it interfered with the cable select for the mp3 player.  It looks as if the MOSI/MISO pins can all be shared between the shields, so long as the cable select is activated before data is sent to the corresponding shield.  Neat.&lt;/p&gt;</description>
	<pubDate>Fri, 02 Jul 2010 19:28:19 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: newhaven.rb hackfest tomorrow!</title>
	<guid>http://yonkeltron.com/?p=673</guid>
	<link>http://yonkeltron.com/2010/06/30/newhaven-rb-hackfest-tomorrow/</link>
	<description>&lt;p&gt;Tomorrow, in New Haven, CT will be the &amp;#8220;Ruby, White and Blue&amp;#8221; Hackfest run by newhaven.rb. We&amp;#8217;ll be working on a few projects including &lt;a href=&quot;http://github.com/yonkeltron/NHV-Ruby-site&quot;&gt;the group&amp;#8217;s site&lt;/a&gt; and most likely some &lt;a href=&quot;http://github.com/sandal/prawn&quot;&gt;Prawn&lt;/a&gt; and &lt;a href=&quot;http://github.com/yonkeltron/scosugbot&quot;&gt;ScosugBot&lt;/a&gt; stuff. Beginners and people interested in learning are more than welcome and we hope to have some excellent projects for people to get started on.&lt;/p&gt;
&lt;p&gt;Fill out the &lt;a href=&quot;http://is.gd/d9ZiB&quot;&gt;RSVP form&lt;/a&gt; and we&amp;#8217;ll meet at 6pm EST at &lt;a href=&quot;http://www.bluestatecoffee.com/&quot;&gt;Blue State Coffee&lt;/a&gt; on Thursday,  July 1st. Bring a computer and let&amp;#8217;s write some code.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;small&gt;&lt;a href=&quot;http://maps.google.com/maps?f=q&amp;source=embed&amp;hl=en&amp;geocode=&amp;q=Blue+State+Coffee+-+New+Haven,+New+Haven,+CT&amp;sll=41.306075,-72.931894&amp;sspn=0.009333,0.01929&amp;ie=UTF8&amp;hq=Blue+State+Coffee+-&amp;hnear=New+Haven,+Connecticut&amp;t=h&amp;cid=8790853015135628419&amp;ll=41.319076,-72.921238&amp;spn=0.022562,0.036478&amp;z=14&amp;iwloc=A&quot;&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 30 Jun 2010 14:00:54 +0000</pubDate>
</item>
<item>
	<title>Kam Salisbury: Linked In 404</title>
	<guid>http://kamsalisbury.com/index.cgi/2010/06/25#404image</guid>
	<link>http://kamsalisbury.com/index.cgi/2010/06/25#404image</link>
	<description>&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;http://picasaweb.google.com/lh/photo/Z_8Eue4klWkWHCq3wr762g?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh3.ggpht.com/_8yO7fG7SrbE/TCVZWu0HEzI/AAAAAAAAANU/FPhuHcZDy5w/s144/404-linkedin.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;From &lt;a href=&quot;http://picasaweb.google.com/kamreefsalisbury/404?feat=embedwebsite&quot;&gt;404&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
I configured my Dreamhost.com custom 404 message to display an image versus an HTML document (I know, it borders on Internet politeness) so I found it funny when that image displayed in a recent post at LinkedIn. The context of the status post and the image matched up in a piculiar way.
(You can click the image to see more 404s from the web and real world).
If you know what an &lt;pre&gt;.htaccess&lt;/pre&gt; file is then your welcome to use mine, grab it via &lt;a href=&quot;http://kamsalisbury.com/code/htaccess.txt&quot;&gt;this link&lt;/a&gt;...</description>
	<pubDate>Sat, 26 Jun 2010 01:45:06 +0000</pubDate>
</item>
<item>
	<title>Kam Salisbury: Rate My Network Diagram</title>
	<guid>http://kamsalisbury.com/index.cgi/2010/06/24#rmnd1</guid>
	<link>http://kamsalisbury.com/index.cgi/2010/06/24#rmnd1</link>
	<description>&lt;a href=&quot;http://www.ratemynetworkdiagram.com/?i=798&quot;&gt;&lt;img src=&quot;http://kamsalisbury.com/img/sohonet.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
Reviewed over 2900 times, I remember scribbling this network diagram on an old Windows Pocket PC.
Click the image or 
&lt;a href=&quot;http://www.ratemynetworkdiagram.com/?i=798&quot;&gt;
this text 
&lt;/a&gt;
to review or upload &lt;i&gt;your&lt;/i&gt; network diagram...</description>
	<pubDate>Thu, 24 Jun 2010 14:00:10 +0000</pubDate>
</item>
<item>
	<title>Kyle Winfree: Gramian take three!</title>
	<guid>http://www.classicmagicstudios.com/wordpress/?p=35</guid>
	<link>http://www.classicmagicstudios.com/wordpress/?p=35</link>
	<description>&lt;p&gt;I really lucked out.  The octave-forge developer who has responded to my submission of gramian.m has been really helpful in identifying things I should do to improve the usefulness and robustness of my function.  He has given examples of what should be done in some cases, and simply stated what should be done in others.  The ball is back in my court now, as several additional changes are requested.  This is great though; by the time I submit fftplot.m for review, I should have a very good idea of how to write high standards octave/matlab functions.&lt;/p&gt;</description>
	<pubDate>Thu, 24 Jun 2010 10:18:20 +0000</pubDate>
</item>
<item>
	<title>JonathanD: fosscon... 2011?</title>
	<guid>http://sogeekithurts.com/17 at http://sogeekithurts.com</guid>
	<link>http://sogeekithurts.com/?q=node/17</link>
	<description>&lt;p&gt;Fosscon ended just over 12 hours ago.  I think I probably listened to the first or last 15-20 minutes of at least 10 different talks or workshops...  and I loved it.  It's 6am the following morning and I'm absolutely exhausted, but I'm also excited about what the future holds.&lt;/p&gt;
&lt;p&gt;So, the good, the bad... We didn't get the turnout we'd hoped for, but at the end of the day I think everyone enjoyed themselves.  The talks (or at least the parts I actually got to hear) were very good, and more importantly a lot of people from all over talked outside them about ways they could help each others... help their community.  I think it says something of our speakers that after hearing just a tidbit here and there, I still felt fulfilled in every instance.&lt;/p&gt;
&lt;p&gt;To me, that's probably one of the best things that comes out of this.  These disparate groups and people from all over have made the connections that will tie them together in the future.  They've learned of new resources, and also who might need the resources they can provide, and as a result the community grows stronger.&lt;/p&gt;
&lt;p&gt;It's these connections that move us forward. In the foss world, one person can certainly make a difference, but a handful of people who share what they have and use it to do something new and amazing, they can change the whole world.&lt;/p&gt;
&lt;p&gt;There was a lot of talk at fosscon about next year.  There will be a next year.  Too much good happened for there not to be, and these people, all those who attended, those who sponsored (linode, the Peer Directed Project Center, and of course our attendees themselves!), those who volunteered... they are fosscon's community, and it's going to happen again.&lt;/p&gt;
&lt;p&gt;See you in 2011&lt;/p&gt;</description>
	<pubDate>Sun, 20 Jun 2010 10:21:43 +0000</pubDate>
</item>
<item>
	<title>Kyle Winfree: Arduino</title>
	<guid>http://www.classicmagicstudios.com/wordpress/?p=32</guid>
	<link>http://www.classicmagicstudios.com/wordpress/?p=32</link>
	<description>&lt;p&gt;I sent out an email to the Philadelphia Linux Users Group that I am part of, asking for advice related to microprocessors that would be easy to use and yet highly functional.  To be honest, I didn&amp;#8217;t think I would get much response, though I can&amp;#8217;t say why I thought that.   Really I should have expected otherwise, as that is exactly what happened.&lt;/p&gt;
&lt;p&gt;I received several emails with really good information, and even one email asking what I had decided on using for my mystery project.  I also asked a friend of mine from U of Penn, since we had talked about a microprocessor project using the Atmel AVR when I was there.   He had more advice to offer than I expected too!  I would like to publicly thank all those who helped provide the input that guided me to choosing a platform.&lt;/p&gt;
&lt;p&gt;So what did I choose you might ask?  Let me start by describing my project.  This is a university funded project that will be conducted by a new student to our lab.  ( I am his mentor for the summer.)  We&amp;#8217;re developing a medical device that can deterministically provide analog output to an actuator based on analog input.  It was my friend from Penn who helped me to realize that this analog output, which is expected to be a combination of sine waves, is really just audio output.  There just so happens to be a &amp;#8220;shield&amp;#8221; for the Arduino board that is an mp3 player (also plays ogg among others).&lt;/p&gt;
&lt;p&gt;I know, I&amp;#8217;m not being really descriptive here, but everything will be revealed in due time.  We&amp;#8217;ll be working with a physical therapist to test our device, after which we expect to publish a paper on the project in an academic journal/proceedings.  I will of course post that paper here when it is time.  Until then, please stay posted to hear about the progress of our project.  Who knows, maybe in the next week we&amp;#8217;ll have a &amp;#8220;hello world&amp;#8221; demo that shows the key features we want to develop in this little device.&lt;/p&gt;</description>
	<pubDate>Fri, 18 Jun 2010 10:34:08 +0000</pubDate>
</item>
<item>
	<title>Kam Salisbury: Linux UFS</title>
	<guid>http://kamsalisbury.com/index.cgi/2010/06/17#linux_ufs</guid>
	<link>http://kamsalisbury.com/index.cgi/2010/06/17#linux_ufs</link>
	<description>You can mount almost any file system from the Linux command line (bash prompt).
Lets say you used to use the excellent Network Attached Storage solution, FreeNAS, which is based on FreeBSD. But now you are using Linux - how do you mount that FreeBSD partition (called slices in the BSD world) so you can copy the data over (because the Linux module for BSD type file systems is usually for Read Only use)?
&lt;br /&gt;
Assuming you already have made a directory to mount the BSD type file system to and the BSD file system is on /dev/sda... &lt;pre&gt;sudo mount -t ufs -o ro,ufstype=ufs2 /dev/sda1 /mnt/bsd&lt;/pre&gt; 
If you make a syntax mistake typing in the command, be sure to read the command's error message carefully. Usually, the mount command itself will provide feedback similar to &quot;...type dmesg for more information.&quot; Even more command usage information is available on most Linux systems from the command line via a command such as... man mount 
&lt;br /&gt;Take your time, read though the command usage documentation and remember to copy - not move data, so you can always try a different strategy if the operation does not work out the way you had intended.</description>
	<pubDate>Thu, 17 Jun 2010 23:00:08 +0000</pubDate>
</item>
<item>
	<title>Kam Salisbury: More website changes (sorry)</title>
	<guid>http://kamsalisbury.com/index.cgi/2010/06/13#more_changes</guid>
	<link>http://kamsalisbury.com/index.cgi/2010/06/13#more_changes</link>
	<description>&lt;div&gt;&lt;a href=&quot;http://lh5.ggpht.com/_0y6vkr85IIM/SzXONSr-wZI/AAAAAAAACiM/XhYQywWbaDI/s1600/1128090136.jpg&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://lh5.ggpht.com/_0y6vkr85IIM/SzXONSr-wZI/AAAAAAAACiM/XhYQywWbaDI/s200/1128090136.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
My web host (&lt;a href=&quot;http://www.dreamhost.com/r.cgi?2974&quot; target=&quot;_blank&quot;&gt;Dreamhost.com&lt;/a&gt;) is performing some late spring cleaning and moving my website(s) to another server(s). It is a good time for me to update many literal paths with DNS names and many other things... so... during the next week or so some (hopefully not all) of my web site images, links, content, etc may be broken. No worries OK? I will get it all&amp;nbsp;straightened&amp;nbsp;out.</description>
	<pubDate>Thu, 17 Jun 2010 23:00:08 +0000</pubDate>
</item>
<item>
	<title>Kam Salisbury: Add the Virtualbox Yum Repo</title>
	<guid>http://kamsalisbury.com/index.cgi/2010/06/09#add_virtualbox_repo</guid>
	<link>http://kamsalisbury.com/index.cgi/2010/06/09#add_virtualbox_repo</link>
	<description>&lt;div&gt;
&lt;a href=&quot;http://www.kamsalisbury.com/_/rsrc/1275594041323/blog/Fedora13/f13release.png&quot;&gt;
&lt;img border=&quot;0&quot; src=&quot;http://fedoraproject.org/static/images/banners/f13release.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;Many Open Source applications are adding yum repositories in addition to providing rpm downloads. Starting with revision 3.x.x, Virtualbox now has a repo file provided for easy download. Look at &lt;a href=&quot;http://www.virtualbox.org/wiki/Linux_Downloads&quot;&gt;http://www.virtualbox.org/wiki/Linux_Downloads&lt;/a&gt;&amp;nbsp;towards the bottom of the page.&lt;/div&gt;</description>
	<pubDate>Thu, 17 Jun 2010 23:00:08 +0000</pubDate>
</item>
<item>
	<title>Kam Salisbury: Linux UFS</title>
	<guid>http://www.kamsalisbury.com/index.cgi/2010/06/17#linux_ufs</guid>
	<link>http://www.kamsalisbury.com/index.cgi/2010/06/17#linux_ufs</link>
	<description>You can mount almost any file system from the Linux command line (bash prompt).
Lets say you used to use the excellent Network Attached Storage solution, FreeNAS, which is based on FreeBSD. But now you are using Linux - how do you mount that FreeBSD partition (called slices in the BSD world) so you can copy the data over (because the Linux module for BSD type file systems is usually for Read Only use)?
&lt;br /&gt;
Assuming you already have made a directory to mount the BSD type file system to and the BSD file system is on /dev/sda... &lt;pre&gt;sudo mount -t ufs -o ro,ufstype=ufs2 /dev/sda1 /mnt/bsd&lt;/pre&gt; 
If you make a syntax mistake typing in the command, be sure to read the command's error message carefully. Usually, the mount command itself will provide feedback similar to &quot;...type dmesg for more information.&quot; Even more command usage information is available on most Linux systems from the command line via a command such as... man mount 
&lt;br /&gt;Take your time, read though the command usage documentation and remember to copy - not move data, so you can always try a different strategy if the operation does not work out the way you had intended.</description>
	<pubDate>Thu, 17 Jun 2010 16:00:15 +0000</pubDate>
</item>
<item>
	<title>Kam Salisbury: More website changes (sorry)</title>
	<guid>http://www.kamsalisbury.com/index.cgi/2010/06/13#more_changes</guid>
	<link>http://www.kamsalisbury.com/index.cgi/2010/06/13#more_changes</link>
	<description>&lt;div&gt;&lt;a href=&quot;http://lh5.ggpht.com/_0y6vkr85IIM/SzXONSr-wZI/AAAAAAAACiM/XhYQywWbaDI/s1600/1128090136.jpg&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://lh5.ggpht.com/_0y6vkr85IIM/SzXONSr-wZI/AAAAAAAACiM/XhYQywWbaDI/s200/1128090136.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
My web host (&lt;a href=&quot;http://www.dreamhost.com/r.cgi?2974&quot; target=&quot;_blank&quot;&gt;Dreamhost.com&lt;/a&gt;) is performing some late spring cleaning and moving my website(s) to another server(s). It is a good time for me to update many literal paths with DNS names and many other things... so... during the next week or so some (hopefully not all) of my web site images, links, content, etc may be broken. No worries OK? I will get it all&amp;nbsp;straightened&amp;nbsp;out.</description>
	<pubDate>Thu, 17 Jun 2010 16:00:15 +0000</pubDate>
</item>
<item>
	<title>JonathanD: Heading North to fosscon.</title>
	<guid>http://sogeekithurts.com/16 at http://sogeekithurts.com</guid>
	<link>http://sogeekithurts.com/?q=node/16</link>
	<description>&lt;p&gt;Tomorrow afternoon we'll begin our drive (about 5 hours) up to fosscon along with a few others from Philadelphia.  Last time we made such a trip was SELF last year (we went to CPOSC too, but we took the train) and it was quite a bit of fun.&lt;/p&gt;
&lt;p&gt;I believe we still have room for one on our return trip only, so if you find a way to get there but not home let me know!&lt;/p&gt;
&lt;p&gt;The conference is being opened by members of &lt;a href=&quot;http://basekamp.com&quot;&gt;BaseKamp&lt;/a&gt;, located in Philadelphia.  BaseKamp presents a completely different view of open source culture, going beyond free software and into free arts and culture.  Just the other night they did a great session on free art session.&lt;/p&gt;
&lt;p&gt;I'm personally looking forward to the POSSE panel, where a group of educators who have just completed a week long POSSE course (&lt;a href=&quot;http://teachingopensource.org/index.php/POSSE_RIT&quot;&gt;http://teachingopensource.org/index.php/POSSE_RIT&lt;/a&gt;) on how to use open source in their classrooms will share with everyone what they learned.&lt;/p&gt;
&lt;p&gt;I'm also looking forward to meeting Bryan Østergaard (&lt;a href=&quot;http://kloeri.livejournal.com/&quot;&gt;http://kloeri.livejournal.com/&lt;/a&gt;), coming all the way from Denmark to talk about how to build a developer community around a project.  All in all it should be great.&lt;/p&gt;
&lt;p&gt;If you aren't already coming, take a look at &lt;a href=&quot;http://fosscon.org/&quot;&gt;http://fosscon.org/&lt;/a&gt; to see whats what, and maybe to come along.&lt;/p&gt;</description>
	<pubDate>Thu, 17 Jun 2010 12:10:31 +0000</pubDate>
</item>
<item>
	<title>mjd: A short bibliography of probability monads</title>
	<guid>tag:blog.plover.com,2010:/prog/haskell/probmonad-refs</guid>
	<link>http://blog.plover.com/prog/haskell/probmonad-refs.html</link>
	<description>Several people helpfully wrote to me to provide references to earlier
work on &lt;a href=&quot;http://blog.plover.com/prog/haskell/probmonad.html&quot;&gt;probability
distribution monads&lt;/a&gt;. Here is a summary:&lt;p&gt;

&lt;ul&gt;

&lt;li&gt;Material related to Martin Erwig and Steve Kollmansberger's
&lt;tt&gt;probability&lt;/tt&gt; library:&lt;p&gt;

  &lt;ul&gt;
  &lt;li&gt; &lt;a href=&quot;http://web.engr.oregonstate.edu/~erwig/papers/PFP_JFP06.pdf&quot;&gt;&lt;cite&gt;Probabilistic
Functional Programming in Haskell&lt;/cite&gt;&lt;/a&gt;, their 2006 paper

  &lt;li&gt; &lt;a href=&quot;http://hackage.haskell.org/package/probability&quot;&gt;the
package, described in the paper&lt;/a&gt;, and specifically &lt;a href=&quot;http://hackage.haskell.org/packages/archive/probability/0.2.2/doc/html/Numeric-Probability-Distribution.html&quot;&gt;its
probability distribution monad&lt;/a&gt;

  &lt;li&gt; &lt;a href=&quot;http://slawekk.wordpress.com/2009/05/31/probability-monad/&quot;&gt;Some
commentary on this library&lt;/a&gt;, by someone who doesn't put their name
on their blog.&lt;p&gt;

&lt;/p&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;li&gt;Some stuff from Dan Piponi's blog:&lt;p&gt;

  &lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.sigfpe.com/2007/02/monads-for-vector-spaces-probability.html&quot;&gt;&quot;Monads,
  Vector Spaces and Quantum Mechanics, part I&quot;&lt;/a&gt;
  &lt;li&gt;and &lt;a href=&quot;http://blog.sigfpe.com/2007/03/monads-vector-spaces-and-quantum.html&quot;&gt;part
  II&lt;/a&gt;&lt;p&gt;
  &lt;/p&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;li&gt;&lt;a href=&quot;http://www.randomhacks.net/articles/2007/02/22/bayes-rule-and-drug-tests&quot;&gt;Eric
Kidd's blog&lt;/a&gt;:  &quot;What would a programming language look like if Bayes&amp;rsquo; rule were as simple as an if statement?&quot;

&lt;/li&gt;&lt;/p&gt;&lt;/li&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;

My thanks to Stephen Tetley, Gaal Yahas, and Luke Palmer for these.&lt;p&gt;

I did not imagine that my idea was a new one.  I arrived at it by
thinking about &lt;tt&gt;List&lt;/tt&gt; as a representation of non-deterministic
computation.  But if you think of it that way, the natural
interpretation is that every list element represents an equally likely
outcome, and so annotating the list elements with probabilities is the
obvious next step.  So the existence of the Erwig library was not a big
surprise.  &lt;p&gt;

A little more surprising though, were the references in the Erwig
paper.  Specifically, the idea dates back to at least 1981; Erwig
cites a paper that describes the probability monad in a
pure-mathematics context.&lt;p&gt;


Nobody responded to my taunting complaint about Haskell's failure to
provide support a good monad of sets.  It may be that this is because
they all agree with me.  (For example, the documentation of the Erwig
package says &quot;Unfortunately we cannot use a more efficient data
structure because the key type must be of class &lt;tt&gt;Ord&lt;/tt&gt;, but the
&lt;tt&gt;Monad&lt;/tt&gt; class does not allow constraints for result types.&quot;)
But a number of years ago I said that the C++ macro processor blows
goat dick.  I would not have put it so strongly had I not na&amp;iuml;vely
believed that this was a universally-held opinion.  But no, plenty of
hapless C++ programmers wrote me indignant messages defending their
macro system.  So my being right is no guarantee that language
partisans will not dispute with me, and the Haskell community's
failure to do so in this case reflects well on them, I think.&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 15 Jun 2010 15:50:00 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: GUADEC, an interview in 5 moments</title>
	<guid>http://www.lamalex.net/?p=103</guid>
	<link>http://www.lamalex.net/2010/06/guadec-an-interview-in-5-moments/</link>
	<description>&lt;p&gt;Feeling the crushing need to fit in, here are the answers to &lt;a href=&quot;http://guadec.org/index.php/guadec/index/announcement/view/10&quot;&gt;five questions from guadec.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who are you and what do you do?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I am Alex Launi, I&amp;#8217;m 22, live in South Philadelphia, PA, USA, 5&amp;#8217;8&amp;#8243; (172cm) tall, and weigh 157lbs (71.2kg). I&amp;#8217;m about to graduate from Temple University with a bachelors of science in computer science. I work on Banshee, Do, and some other random projects here and there. I&amp;#8217;m a hardcore cyclist, and I&amp;#8217;ll probably be spiraling into a deep depression during guadec from separation anxiety with my bike. I love modern literature, my favorite writer is either Cormac McCarthy, James Joyce, or Thomas Pynchon depending on where and when you ask me. I like philosophy, detest the &amp;#8220;Linux is about choice&amp;#8221; mantra, and have never successfully done a magic trick.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How did you get into GNOME?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve never been inside of a gnome, I don&amp;#8217;t think I ever will. I&amp;#8217;ve never had a first hand gnome encounter but my impression is that they&amp;#8217;re very short. I don&amp;#8217;t think I could ever fit inside of one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why are you coming to GUADEC?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To show off my sweet summer of code work, meet people I know from the internet, meet new people who are involved with gnome, network to try and find an awesome job, travel, drink fancy beer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In 1 sentence, describe what your most favorite recent GNOME project has been. (Doesn&amp;#8217;t have to be yours!)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I think Telepathy is the coolest thing there is, I want to see it used everywhere, for everything (do you see this Collabora? you can hire me if you want).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will this be your fist time visiting the Netherlands?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been to never-never land, but never the Netherlands. Unless maybe never-never land was renamed to the Netherlands in post-war partitioning.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone&quot; src=&quot;http://2010.guadec.org/img/guadec-oranje.png&quot; alt=&quot;&quot; width=&quot;134&quot; height=&quot;46&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone&quot; src=&quot;http://live.gnome.org/Travel/Policy?action=AttachFile&amp;do=get&amp;target=sponsored-badge-shadow.png&quot; alt=&quot;&quot; width=&quot;230&quot; height=&quot;230&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 11 Jun 2010 16:42:12 +0000</pubDate>
</item>
<item>
	<title>Kyle Winfree: Response from Octave-Forge</title>
	<guid>http://www.classicmagicstudios.com/wordpress/?p=31</guid>
	<link>http://www.classicmagicstudios.com/wordpress/?p=31</link>
	<description>&lt;p&gt;I&amp;#8217;ve been meaning to make this post for a few days now, which speaks of how busy I am with qualifying exams and my university research project.  I received an email from one of the octave-forge developers.  He has asked that I make several changes (all good things I hadn&amp;#8217;t thought of with my limited programming experience), and then resubmit.  I plan to make an hour or two next week to do just that.&lt;/p&gt;</description>
	<pubDate>Thu, 10 Jun 2010 11:44:11 +0000</pubDate>
</item>
<item>
	<title>Kyle Winfree: Blogger Relocation Program</title>
	<guid>http://www.classicmagicstudios.com/wordpress/?p=26</guid>
	<link>http://www.classicmagicstudios.com/wordpress/?p=26</link>
	<description>&lt;p&gt;It&amp;#8217;s simple really.  I figured that I might as well just host my own blog.  So thank you to wordpress.com, but I&amp;#8217;ll be using your software on my own hardware now.&lt;/p&gt;</description>
	<pubDate>Thu, 27 May 2010 14:50:47 +0000</pubDate>
</item>
<item>
	<title>Richard Freeman: rich0</title>
	<guid>http://rich0gentoo.wordpress.com/?p=44</guid>
	<link>http://rich0gentoo.wordpress.com/2010/05/26/a-google-rant/</link>
	<description>&lt;p&gt;I love what Google has been doing, and they&amp;#8217;ve made huge contributions to FOSS.  However, I have to join the chorus of those who are concerned with their lack of distro-friendliness.  &lt;/p&gt;
&lt;p&gt;The start of my saga was Gentoo &lt;a href=&quot;http://bugs.gentoo.org/show_bug.cgi?id=320407&quot;&gt;bug 320407&lt;/a&gt;.  Apparently Google re-bundled swt in their android SDK, and the version they re-bundled breaks sometimes.&lt;/p&gt;
&lt;p&gt;So, the solution is to not install swt, and patch their android script so that it uses the system library.  I still have to figure out which version of swt they re-bundled so that I can try to match it.  Maybe that won&amp;#8217;t be much work.&lt;/p&gt;
&lt;p&gt;Then I need to look at all those other libraries and see which of those can go.  I&amp;#8217;ll need to patch in their paths, and I&amp;#8217;ll need to figure out which upstream versions they re-bundled so that I can set the correct dependencies.  Maybe each of those won&amp;#8217;t be much work.  Maybe some poor user will get burned when it turns out that they modified one of them and I miss it in testing.&lt;/p&gt;
&lt;p&gt;Oh, and every time they do a new release they&amp;#8217;re not going to tell me if they upgraded one of those bundled libs to a newer API/etc, so maybe if I&amp;#8217;m lucky I&amp;#8217;ll spot problems during testing and not burn users.  Maybe that isn&amp;#8217;t too much work either.&lt;/p&gt;
&lt;p&gt;Maybe each of these things won&amp;#8217;t be much work, but this is already sounding like a royal pain to me.  It is also a recipe for end-user problems.&lt;/p&gt;
&lt;p&gt;Let me pick my next favorite Google package &amp;#8211; chromium.  I have a chromium upgrade pending that I&amp;#8217;ve been postponing.  Building and installing chromium takes hours on my system (an old Athlon 64 3200+).  Actually, building chromium probably isn&amp;#8217;t the  problem &amp;#8211; it is building the other half-gigabyte of re-bundled dependencies that get rebuilt every time I upgrade chromium, even though I already have most of them on my system (and if I didn&amp;#8217;t the package manager would take care of that for me &amp;#8211; ONCE).&lt;/p&gt;
&lt;p&gt;My hat is off to the chromium maintainers because they&amp;#8217;ve done a good job managing it, and I understand that they&amp;#8217;re trying to strip out the embedded libs.  However, the project facing them makes my android headaches seem like a trifle.  &lt;/p&gt;
&lt;p&gt;Google &amp;#8211; just use and list dependencies!  If you want to have an alternate all-in-one package for those without package managers, feel free &amp;#8211; other projects do it.  However, if Mozilla can play nice with distros, you can do it too.&lt;/p&gt;
&lt;p&gt;All that said, I have no objections to embedding contributed libraries in the sdk itself &amp;#8211; the part used to build and test android apps.  In this case app developers need to build and test their apps against the libraries that will be on target devices and not their development workstation.  Since no code will run natively (except perhaps on an emulator) there aren&amp;#8217;t really the usual compatibility and security issues associated with this.&lt;/p&gt;
&lt;br /&gt;Filed under: &lt;a href=&quot;http://rich0gentoo.wordpress.com/category/gentoo/&quot;&gt;gentoo&lt;/a&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rich0gentoo.wordpress.com/44/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rich0gentoo.wordpress.com/44/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rich0gentoo.wordpress.com/44/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rich0gentoo.wordpress.com/44/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rich0gentoo.wordpress.com/44/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rich0gentoo.wordpress.com/44/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rich0gentoo.wordpress.com/44/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rich0gentoo.wordpress.com/44/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rich0gentoo.wordpress.com/44/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rich0gentoo.wordpress.com/44/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rich0gentoo.wordpress.com&amp;blog=12853060&amp;post=44&amp;subd=rich0gentoo&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Wed, 26 May 2010 13:53:06 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: This SOC project is dedicated to Morrissey</title>
	<guid>http://www.lamalex.net/?p=97</guid>
	<link>http://www.lamalex.net/2010/05/this-soc-project-is-dedicated-to-morrissey/</link>
	<description>&lt;p&gt;Today is the summer of code start day, and like every other excited summer of code student, I got drunk instead of working! I &lt;strong&gt;had&lt;/strong&gt; a 6 pack of Magic hat, and now I &lt;strong&gt;have&lt;/strong&gt; a mockup of what the now playing source will look like af the end of my project. The biggest difference between the final product and this, is that the final product will actually work.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.lamalex.net/wp-content/uploads/2010/05/banshee-np.png&quot;&gt;&lt;img class=&quot;aligncenter size-large wp-image-98&quot; title=&quot;banshee-np&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/05/banshee-np-1024x640.png&quot; alt=&quot;&quot; width=&quot;717&quot; height=&quot;448&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Notice the buttons in the top right? Clicking will change the now playing source contents to last.fm, wikipedia, or back to your regularly scheduled programming. Pretty nifty right? If you&amp;#8217;re interested, you can follow my work in written form &lt;a href=&quot;http://live.gnome.org/SummerOfCode2010/AlexLauni_Banshee&quot;&gt;here&lt;/a&gt;, or &lt;strong&gt;here &lt;/strong&gt;(literally here, because I&amp;#8217;ll be blogging about it), or in code form over &lt;a href=&quot;http://git.gnome.org/browse/banshee/log/?h=better-now-playing&quot;&gt;here&lt;/a&gt;. You can actually already check out what I have so far, which is what you see above. It&amp;#8217;s not that cool yet so I wouldn&amp;#8217;t bother, &lt;em&gt;but it&amp;#8217;s going to get cool- so I would bother.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s all for today! And happy (belated) birthday Morrissey, you&amp;#8217;re a cool 51 this year.&lt;/p&gt;</description>
	<pubDate>Tue, 25 May 2010 00:33:45 +0000</pubDate>
</item>
<item>
	<title>Kyle Winfree: FFT Plot</title>
	<guid>https://kwinfree.wordpress.com/2010/05/21/fft-plot/</guid>
	<link>http://www.classicmagicstudios.com/wordpress/?p=24</link>
	<description>&lt;p&gt;I think I have another idea; one for a function near and dear to my heart, fft analysis of audio.&lt;/p&gt;</description>
	<pubDate>Sat, 22 May 2010 01:15:29 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Im going to GUADEC</title>
	<guid>http://www.lamalex.net/?p=94</guid>
	<link>http://www.lamalex.net/2010/05/im-going-to-guadec/</link>
	<description>&lt;p&gt;Thanks to the folks on the GNOME travel committee I can now say&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter&quot; src=&quot;http://www.guadec.org/img/guadec-oranje.png&quot; alt=&quot;&quot; width=&quot;134&quot; height=&quot;46&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone&quot; src=&quot;http://tecnocode.co.uk/wp-content/uploads/2009/07/sponsored-badge-simple.png&quot; alt=&quot;&quot; width=&quot;213&quot; height=&quot;213&quot; /&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;Thanks!! I can&amp;#8217;t wait!&lt;/p&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 21 May 2010 19:35:15 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Creating a Ruby DSL</title>
	<guid>http://yonkeltron.com/?p=653</guid>
	<link>http://yonkeltron.com/2010/05/13/creating-a-ruby-dsl/</link>
	<description>&lt;p&gt;Tons of people in the Ruby community go on and on about &lt;a href=&quot;http://en.wikipedia.org/wiki/Domain_Specific_Language&quot;&gt;domain-specific languages (abbreviated DSL)&lt;/a&gt; and how wonderful they are. In most cases, I agree with them. I began to wonder how I could go about leveraging Ruby&amp;#8217;s awesomely-flexible syntax to create my own DSL. To illustrate my quest, I have written this article. It assumes you know Ruby. The example details are completely fictitious and just contrived enough to be interesting. I promise, the code will be the main focus and I will link/point to other resources which might be helpful to budding DSL designers like myself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Dream Castle Architectural Firm (D-CAF, among friends) wants a tool which it can use for very high-level prototyping of custom homes. They need it to be understandable by both computers and humans. It only needs to keep track of the following things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Houses &amp;#8211; Each house has a name&lt;/li&gt;
&lt;li&gt;Floors &amp;#8211; Each house has multiple floors. Each floor has a number&lt;/li&gt;
&lt;li&gt;Rooms &amp;#8211; Each floor has multiple rooms and each room has a type&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The only other requirement is that the DSL be translatable to plain English so that they can show it to customers. No problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The DSL for the high-level specification of custom houses will look like the following:&lt;/p&gt;
&lt;pre&gt;CustomHouse.build :home do
  floor(1) {
    room :den
    room :kitchen
  }

  floor(2) {
    room :bedroom
    room :bathroom
  }
end&lt;/pre&gt;
&lt;p&gt;That&amp;#8217;s it. You specify that a house should be built, that it has a name, some floors and each floor has some rooms. Simple, easy and 100% pure Ruby.  Notice the cunning usage of both do/end and bracket notation for defining blocks. The outer block passed to &lt;code&gt;CustomHouse#build&lt;/code&gt; uses do/end syntax while the blocks passed to &lt;code&gt;House#floor&lt;/code&gt; use the bracket syntax. These could easily be reversed (or combined or whatever) but it makes it look pretty and helps to visually differentiate things so that you (the developer) and the user (the architect) can things more clearly. Plus, when you print the output (calling &lt;code&gt;to_s&lt;/code&gt; on the instance of &lt;code&gt;House&lt;/code&gt; which gets returned), you get the following wonderful text:&lt;/p&gt;
&lt;pre&gt;House named home has 2 floors.
Floor 1 has 2 rooms (den, kitchen)
Floor 2 has 2 rooms (bedroom, bathroom)&lt;/pre&gt;
&lt;p&gt;It&amp;#8217;s a small house, don&amp;#8217;t be a wiseacre. So, how can such a DSL be built?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s write the implementation for this together.  First, we&amp;#8217;re going to start of with a module named &lt;code&gt;CustomHouse&lt;/code&gt;.  In Ruby, modules are just classes so we&amp;#8217;ll define a class method called &lt;code&gt;build&lt;/code&gt; which will behave like a factory method.&lt;/p&gt;
&lt;pre&gt;module CustomHouse
  def self.build(name, &amp;amp;block)
    house = House.new(name)
    house.instance_eval(&amp;amp;block)
    return house
  end
end&lt;/pre&gt;
&lt;p&gt;As you can see, the method takes two params, a name and a block. The first thing that it does is create an instance of the House class (which we have not yet defined) passing in the name parameter. Second it calls &lt;a href=&quot;http://ruby-doc.org/core-1.8.7/classes/Object.html#M000607&quot;&gt;instance_eval&lt;/a&gt; on the house passing in the block. This ventures into the territory of &lt;a href=&quot;http://en.wikipedia.org/wiki/Metaprogramming&quot;&gt;metaprogramming&lt;/a&gt; which is great fun but beyond the scope of this document, though I am sure others have used it for DSL construction (coincidentally, if you are interested in Ruby metaprogramming, buy &lt;a href=&quot;http://amzn.com/1934356476&quot;&gt;this book&lt;/a&gt;). Suffice it to say that it executes the supplied block in the context of the House instance. Finally, the &lt;code&gt;CustomHouse#build&lt;/code&gt; method returns the instance of &lt;code&gt;House&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;(There are those who believe that *any* type of eval is fundamentally evil. I have been taught this many times and I try to avoid using eval on an actualy string whenever possible. Still, someone with a better understanding of Ruby internals might be able to better explain if this in any better.)&lt;/p&gt;
&lt;p&gt;Next, let&amp;#8217;s define what the code for the &lt;code&gt;House&lt;/code&gt; class looks like. As a note, it will be defined in the &lt;code&gt;CustomHouse&lt;/code&gt; module, technically making the fully-namespaced name of the class &lt;code&gt;CustomHouse::House&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;class House
  attr_accessor :name, :floors

  def initialize(name = '')
    @name = name.to_s
    @floors = []
  end

  def floor(number, &amp;amp;block)
    fl = Floor.new(number)
    fl.instance_eval(&amp;amp;block)
    @floors &amp;lt; &amp;lt; fl
  end

  def to_s
    str = &quot;House named #{@name} has #{@floors.length} floors.\n&quot;
    @floors.each do |f|
      str &amp;lt;&amp;lt; f.to_s
    end
    str
  end
end&lt;/pre&gt;
&lt;p&gt;The above code should appear relatively simple. The House class has only a few methods. First, it has a constructor function which takes a name and a block, setting the name as an instance variable and another instance variable, &lt;code&gt;@floors&lt;/code&gt;, which is just an empty array. Next, it has a method called &lt;code&gt;floor&lt;/code&gt; which takes a number and a block. The guts of this method should look familiar to you because it mimics almost exactly the &lt;code&gt;build&lt;/code&gt; factory method defined on &lt;code&gt;CustomHouse&lt;/code&gt;. Finally, it has a &lt;code&gt;to_s&lt;/code&gt; method because of the requirement that the DSL be translatable to plain English for clients to check out.&lt;/p&gt;
&lt;p&gt;If we can just dwell for a moment on the &lt;code&gt;floor&lt;/code&gt; method, notice that, it too, takes a block and uses &lt;code&gt;instance_eval&lt;/code&gt;. It then adds the newly-constructed instance of &lt;code&gt;Floor&lt;/code&gt; to the array in &lt;code&gt;@floor&lt;/code&gt;. Let&amp;#8217;s look at the &lt;code&gt;Floor&lt;/code&gt; class now.&lt;/p&gt;
&lt;pre&gt;class Floor
  attr_accessor :number, :rooms

  def initialize(number = 0)
    @number = number
    @rooms = []
  end

  def room(type)
    @rooms &amp;lt; &amp;lt; Room.new(type)
  end

  def to_s
    str = &quot;Floor #{@number} has #{@rooms.length} rooms (&quot;
    @rooms.each do |r|
      str += &quot;#{r.type}, &quot;
    end
    str.chop!.chop!
    str += &quot;)\n&quot;
    str
  end
end&lt;/pre&gt;
&lt;p&gt;There shouldn&amp;#8217;t be anything confusing about the above code as it doesn&amp;#8217;t use any sort of block eval. In fact, the only thing left to look at is the class for &lt;code&gt;Room&lt;/code&gt; which is even less impressive.&lt;/p&gt;
&lt;pre&gt;class Room
  attr_reader :type

  def initialize(type)
    @type = type
  end
end&lt;/pre&gt;
&lt;p&gt;That&amp;#8217;s it. Seriously, that&amp;#8217;s the entire implementation of the DSL. You pass a block to &lt;code&gt;CustomHouse#build&lt;/code&gt; which gets executed in the context of a new instance of &lt;code&gt;House&lt;/code&gt;. The block calls the &lt;code&gt;House#floor&lt;/code&gt; method with a block which in turn gets executed in the context of a new instance of &lt;code&gt;Floor&lt;/code&gt;. The Floor#room method adds new &lt;code&gt;Room&lt;/code&gt; instances to the class and that&amp;#8217;s basically it.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s all the code together with the example:&lt;/p&gt;
&lt;pre&gt;module CustomHouse

  def self.build(name, &amp;amp;block)
    house = House.new(name)
    house.instance_eval(&amp;amp;block)
    return house
  end

  class House
    attr_accessor :name, :floors

    def initialize(name = '')
      @name = name.to_s
      @floors = []
    end

    def floor(number, &amp;amp;block)
      fl = Floor.new(number)
      fl.instance_eval(&amp;amp;block)
      @floors &amp;lt;&amp;lt; fl
    end

    def to_s
      str = &quot;House named #{@name} has #{@floors.length} floors.\n&quot;
      @floors.each do |f|
        str &amp;lt;&amp;lt; f.to_s
      end
      str
    end
  end

  class Floor
    attr_accessor :number, :rooms

    def initialize(number = 0)
      @number = number
      @rooms = []
    end

    def room(type)
      @rooms &amp;lt;&amp;lt; Room.new(type)
    end

    def to_s
      str = &quot;Floor #{@number} has #{@rooms.length} rooms (&quot;
      @rooms.each do |r|
        str += &quot;#{r.type}, &quot;
      end
      str.chop!.chop!
      str += &quot;)\n&quot;
      str
    end
  end

  class Room
    attr_reader :type

    def initialize(type)
      @type = type
    end
  end
end

h = CustomHouse.build :home do
  floor(1) {
    room :den
    room :kitchen
  }

  floor(2) {
    room :bedroom
    room :bathroom
  }
end

puts h&lt;/pre&gt;
&lt;p&gt;Try running it and see what happens! Then try writing other definitions for custom houses and experience the theoretical joy of the hypothetical architectural firm.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DSL construction techniques&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For clarification and context, I&amp;#8217;d like to share some other, smaller examples which build on this technique and demonstrate one more.&lt;/p&gt;
&lt;p&gt;Behold, a DSL for feeding Pandas:&lt;/p&gt;
&lt;pre&gt;Panda.feed {
  nom :bamboo
  nom :chocolate
}&lt;/pre&gt;
&lt;p&gt;The implementation of this is both simple and straightforward.&lt;/p&gt;
&lt;pre&gt;class Panda
  def self.feed(&amp;amp;block)
    panda = Panda.new
    panda.instance_eval(&amp;amp;block)
  end

  def nom(food)
    #whatever
  end
end&lt;/pre&gt;
&lt;p&gt;Since the block is evaluated in the context of the new &lt;code&gt;Panda&lt;/code&gt; instance, it has access to the &lt;code&gt;Panda#nom&lt;/code&gt; method. For people deathly afraid of eval, there is this alternative syntax:&lt;/p&gt;
&lt;pre&gt;Panda.feed do |p|
  p.nom :bamboo
  p.nom :chocolate
end&lt;/pre&gt;
&lt;p&gt;Which is implemented with &lt;code&gt;yield&lt;/code&gt; instead of &lt;code&gt;instance_eval&lt;/code&gt; like so:&lt;/p&gt;
&lt;pre&gt;class Panda
  def self.feed
    yield Panda.new
  end

  def nom(food)
    # whatever
  end
end&lt;/pre&gt;
&lt;p&gt;For a wonderful and inspiring treatment of Ruby DSLs and associated patterns, see the &lt;a href=&quot;http://mwrc2009.confreaks.com/13-mar-2009-18-10-jive-talkin-dsl-design-and-construction-jeremy-mcanally.html&quot;&gt;most-excellent talk on the matter given by Jeremy McAnally at the 2009 Mid West Ruby Conference&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DSLs are a fantastic tool which can help to simplify complicated and repetitive tasks. Ruby is very good for creating DSLs but it is not the only good tool out there. I advise you look into the creation of DSLs with Scala and, the best DSL-creation tool there ever was, Lisp Macros.&lt;/p&gt;
&lt;p&gt;I am interested in improving this tutorial for the benefit of those programmers who wish to learn about DSL construction but don&amp;#8217;t know where to start.&lt;/p&gt;</description>
	<pubDate>Fri, 14 May 2010 13:27:09 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: GSOC Weekly Report Week 1</title>
	<guid>http://www.lamalex.net/?p=91</guid>
	<link>http://www.lamalex.net/2010/05/gsoc-weekly-report-week-1/</link>
	<description>&lt;p&gt;No news! Exams at my school aren&amp;#8217;t over yet, so I&amp;#8217;m still studying and wrapping up loose ends. It turns out I&amp;#8217;ll be graduating in August instead of in January like I expected, but I&amp;#8217;ll also be taking one class over the summer to finish up my degree. What class am I taking? I&amp;#8217;m taking a class about the geology of disaster movies. Sounds awesome, right?&lt;/p&gt;
&lt;p&gt;Tomorrow is the last day of exams so 5/13 is GSOC GO DAY. Sweet! We&amp;#8217;re in the community bonding period now, and lucky me- I&amp;#8217;m already pretty familiar with the Banshee community. Can&amp;#8217;t wait to get started and be finished with finals.&lt;/p&gt;</description>
	<pubDate>Wed, 12 May 2010 16:46:28 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Continuity Control presents at Finovate</title>
	<guid>http://yonkeltron.com/?p=649</guid>
	<link>http://yonkeltron.com/2010/05/11/continuity-control-presents-at-finovate/</link>
	<description>&lt;p&gt;Pleased to say that &lt;a href=&quot;http://continuity.net&quot;&gt;Continuity Control&lt;/a&gt; has gotten some rather positive feedback while presenting at this year&amp;#8217;s &lt;a href=&quot;http://finovate.com/&quot;&gt;Finovate&lt;/a&gt;! While not the only feedback, some of my favorites here:&lt;/p&gt;
&lt;p&gt;Tweets: &lt;a href=&quot;http://twitter.com/bvinteractive/status/13809793918&quot;&gt;one&lt;/a&gt; &amp;#8211; &lt;a href=&quot;http://twitter.com/netbanker/status/13809781985&quot;&gt;two&lt;/a&gt; &amp;#8211; &lt;a href=&quot;http://twitter.com/rclow/status/13809897357&quot;&gt;three&lt;/a&gt; &amp;#8211; &lt;a href=&quot;http://twitter.com/scotthuber/status/13809729425&quot;&gt;four&lt;/a&gt; &amp;#8211; &lt;a href=&quot;http://twitter.com/consected/status/13809841671&quot;&gt;five&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Photos: &lt;a href=&quot;http://www.flickr.com/photos/37841506@N02/4599133645/&quot;&gt;one&lt;/a&gt; &amp;#8211; &lt;a href=&quot;http://www.flickr.com/photos/37841506@N02/4599140061/&quot;&gt;two&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Truly proud of be part of the team.&lt;/p&gt;</description>
	<pubDate>Tue, 11 May 2010 21:46:52 +0000</pubDate>
</item>
<item>
	<title>Tharun Kumar Allu: Heartbeat on CentOS</title>
	<guid>tag:blogger.com,1999:blog-96283653617011583.post-2484716981673951755</guid>
	<link>http://redhatlinuxworld.blogspot.com/2010/05/heartbeat-on-centos.html</link>
	<description>When you try to install heartbeat using yum when the dependencies are not installed you get the following error.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;yum -y install heartbeat&lt;br /&gt;&lt;br /&gt;useradd: user hacluster exists&lt;br /&gt;error: %pre(heartbeat-2.1.3-3.el5.centos.x86_64) scriptlet failed, exit status 9&lt;br /&gt;error:   install: %pre scriptlet failed (2), skipping heartbeat-2.1.3-3.el5.centos&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Due to this error heartbeat is not installed.&lt;br /&gt;&lt;br /&gt;A simple fix is install heartbeat again using yum and that should solve the problem until someone upstream fixes the installer.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/96283653617011583-2484716981673951755?l=redhatlinuxworld.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 05 May 2010 11:33:50 +0000</pubDate>
	<author>noreply@blogger.com (Tharun)</author>
</item>
<item>
	<title>Alex Launi: Im a Google Summer of Code Student!</title>
	<guid>http://www.lamalex.net/?p=89</guid>
	<link>http://www.lamalex.net/2010/04/im-a-google-summer-of-code-student/</link>
	<description>&lt;p&gt;Today Google made the announcement of &lt;a href=&quot;http://socghop.appspot.com/gsoc/program/list_projects/google/gsoc2010&quot;&gt;accepted summer of code proposals&lt;/a&gt;! I&amp;#8217;m one of them! Looks like I&amp;#8217;ll be spending my summer hacking on Banshee instead of driving a forklift, serving coffee, washing dishes, or any of the other jobs I&amp;#8217;ve been seeing on craigslist. What will I be doing? Here&amp;#8217;s a copy of the proposal I submitted.&lt;/p&gt;
&lt;p&gt;The Now Playing source is an underutilized component of the Banshee user interface. The goal of this proposal is to extend that interface to be a source for extended information about the currently playing media. After the completion of this project, the Now Playing source will replace (or augment) the current behavior of the Context Pane, but also be extended to account for other types of media such as podcasts, videos, audio books, and internet radio.&lt;/p&gt;
&lt;p&gt;The current implementation of the context pane is cool, but its location is awkward. It&amp;#8217;s in the library, but displays information related to the currently playing media, and is only be relevant for music, not video or podcasts so when you&amp;#8217;re listening to a podcast it just says &amp;#8220;waiting for playback to begin&amp;#8230;&amp;#8221; Wait what? Playback has begun!&lt;/p&gt;
&lt;p&gt;The now playing source as is, is kind of a waste of some really great space. The album art display is beautiful looking, but it&amp;#8217;s static. If you&amp;#8217;re listening to an album there&amp;#8217;s no information there that isn&amp;#8217;t available elsewhere more conveniently. The text displayed is the same. This area is &lt;strong&gt;perfect&lt;/strong&gt; for displaying extra information about the currently playing song such as lyrics, last.fm similar artist information, or information from wikipedia, as well as OpenVZ visualizations, all of which should be toggleable.&lt;/p&gt;
&lt;p&gt;My project will be to add API to the context sources so that they can be viewed for any media type to which they are relevant, add API to the now playing source to allow context sources to display their content there, create a widget to allow changing what context source is being viewed, and tie it all together into an extremely compelling, and immersive user experience.&lt;/p&gt;
&lt;p&gt;Special thanks to Gnome, Google, Banshee, and alexk! I&amp;#8217;m really excited, this is going to be a great summer. Stay tuned for updates!&lt;/p&gt;</description>
	<pubDate>Mon, 26 Apr 2010 21:21:51 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Debian package state backup and restore</title>
	<guid>http://yonkeltron.com/?p=635</guid>
	<link>http://yonkeltron.com/2010/04/19/debian-package-state-backup-and-restore/</link>
	<description>&lt;p&gt;While getting into &lt;a href=&quot;http://github.com/carlhuda/bundler&quot;&gt;bundler&lt;/a&gt; (which is great, btw), I recalled how often I have longed for a way to do something similar in Debian. What I&amp;#8217;d really like to be able to do is something like &lt;code&gt;aptitude backup&lt;/code&gt; and get some sort of backup file which contained all of the packages I had asked to be installed so that I could install a new base system and then do an &lt;code&gt;aptitude restore&lt;/code&gt; and have those packages be installed. Obviously, this would pull in the required dependencies which is what we wanted anyway. I&amp;#8217;ve seen only a few attempts at this and most are pretty hairy. Is there a good way to do this currently? Are there plans for this in the future? Is this an irrational desire?&lt;/p&gt;</description>
	<pubDate>Mon, 19 Apr 2010 16:24:32 +0000</pubDate>
</item>
<item>
	<title>Tharun Kumar Allu: EPEL - FedoraProject</title>
	<guid>tag:blogger.com,1999:blog-96283653617011583.post-713615621308837814</guid>
	<link>http://redhatlinuxworld.blogspot.com/2010/04/epel-fedoraproject.html</link>
	<description>&lt;a href=&quot;http://fedoraproject.org/wiki/EPEL&quot;&gt;EPEL - FedoraProject&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Very Good resource for yum based installation of packages not available from the Main repository.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/96283653617011583-713615621308837814?l=redhatlinuxworld.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 16 Apr 2010 11:05:43 +0000</pubDate>
	<author>noreply@blogger.com (Tharun)</author>
</item>
<item>
	<title>yonkeltron: Building shared libraries</title>
	<guid>http://yonkeltron.com/?p=631</guid>
	<link>http://yonkeltron.com/2010/04/08/building-shared-libraries/</link>
	<description>&lt;p&gt;Being a Debian user, I don&amp;#8217;t make a habit of compiling things by hand and on those occasions when I do need to do so, I usually use apt-build (good article, though a bit old &lt;a href=&quot;http://polishlinux.org/linux/debian/apt-build-optimize-debian/ &quot;&gt;here&lt;/a&gt;). However, today I had to get a particularly odd shared library with a very specific version to match a production environment we have at work. So, I downloaded the tarball, which was quite large, and then compiled it. Which took four and a half minutes on my dual-core (1.83GHz) ThinkPad running &lt;code&gt;make -j 4&lt;/code&gt; which isn&amp;#8217;t all that slow, really.&lt;/p&gt;
&lt;p&gt;Once it was completed, I looked around (grepped around) for the output file and was dismayed to discover that there weren&amp;#8217;t any. After tinkering around for about an hour, I finally figured out that you can request shared libraries be built by providing an option to the configure script:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;./configure --enable-shared&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Shortly thereafter, I got the shared library version I needed and was on the road again. Just a useful tip which I hope can be of help to someone.&lt;/p&gt;</description>
	<pubDate>Fri, 09 Apr 2010 14:43:22 +0000</pubDate>
</item>
<item>
	<title>Richard Freeman: rich0</title>
	<guid>http://rich0gentoo.wordpress.com/?p=21</guid>
	<link>http://rich0gentoo.wordpress.com/2010/04/02/gentoo-on-ec2-from-scratch/</link>
	<description>&lt;p&gt;I&amp;#8217;ve been beginning to tinker with Amazon EC2 and I figured that many might benefit from a Gentoo-from-scratch recipe.  There aren&amp;#8217;t too many gotchas.  Credit is due to &lt;a href=&quot;http://www.philchen.com/2009/02/14/how-to-create-an-amazon-elastic-compute-cloud-ec2-machine-image-ami&quot;&gt;this blog&lt;/a&gt; for providing a good non-Gentoo-specific overview.&lt;/p&gt;
&lt;p&gt;Before trying any of this, you need to be at least a little familiar with EC2.  They have a great getting started walkthrough &lt;a href=&quot;http://docs.amazonwebservices.com/AmazonEC2/gsg/2006-06-26/&quot;&gt;here&lt;/a&gt;.  Once you know how to start instances and connect to them you&amp;#8217;re halfway there.  You&amp;#8217;ll also need to set up an S3 account and have an access key and secret key to store your images.  On your gentoo box install ec2-ami-tools and ec2-api tools.&lt;/p&gt;
&lt;p&gt;The biggest issue we&amp;#8217;re going to have to deal with is that you can&amp;#8217;t supply your own kernel.  The two issues this creates are udev compatibility and kernel modules.  The former is dealt with by setting package.mask, and the latter by hunting down module tarballs online.  The modules are fairly optional unless you want to bundle a running image (this requires loop support, which isn&amp;#8217;t built in the EC2 kernel).  &lt;/p&gt;
&lt;p&gt;You might be tempted to start from an existing EC2 AMI.  If you find a good one, that isn&amp;#8217;t a bad idea, but most of them are VERY out of date.  Updating a gentoo install with a pre-EAPI portage and glibc/gcc versions that aren&amp;#8217;t even in the tree any longer will be painful.  Creating one from scratch isn&amp;#8217;t actually that hard.&lt;/p&gt;
&lt;p&gt;So, without further ado, here is the recipe (the steps generally follow the &lt;a href=&quot;http://www.gentoo.org/doc/en/handbook/&quot;&gt;Gentoo handbook&lt;/a&gt;, so be sure to follow along in that):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Get yourself a stage3 and portage snapshot per the handbook.  x86 or amd64 is fine, but be sure to check the Amazon EC2 product page to see which of their offerings are 32/64-bit.  This guide is written for 64-bit.&lt;/li&gt;
&lt;li&gt;Create yourself a disk image with &lt;code&gt;dd if=/dev/zero of=image.fs bs=1M count=5000&lt;/code&gt; &amp;#8211; feel free to tailor the size to your needs but mind the EC2 root filesystem limitations unless you want to run it on elastic storage.  The uploaded image will be compressed so you won&amp;#8217;t be paying for any unused space in your image.&lt;/li&gt;
&lt;li&gt;Point a loopback at your image, format it with a supported filesystem of your choice, and mount it.&lt;/li&gt;
&lt;li&gt;Extract the stage3 into your mount.  Extract your portage snapshot as well.&lt;/li&gt;
&lt;li&gt;Tailor your make.conf as desired &amp;#8211; set mirrors/etc.  Copy your resolv.conf so that you can chroot.&lt;/li&gt;
&lt;li&gt;Mount /proc and /dev per the handbook.  If you&amp;#8217;re going to install screen bind mount /dev/pts as well.&lt;/li&gt;
&lt;li&gt;Chroot into your new environment.  Env-update and source /etc/profile.  Do an emerge &amp;#8211;sync.&lt;/li&gt;
&lt;li&gt;Select a profile.  Honestly, for most EC2 applications you&amp;#8217;re going to want the default 10.0 profile, but it is up to you.&lt;/li&gt;
&lt;li&gt;Edit your locales and run locale-gen &amp;#8211; sooner or later you&amp;#8217;re going to have to update glibc so no sense taking all day to do it.&lt;/li&gt;
&lt;li&gt;Set your timezone &amp;#8211; I believe EC2 uses GMT but let me know if I&amp;#8217;m wrong on that.&lt;/li&gt;
&lt;li&gt;Set up your fstab (this is for 64-bit &amp;#8211; see the EC2 docs for more details):&lt;br /&gt;
&lt;code&gt;/dev/sda1               /                       ext3    defaults 1 1&lt;br /&gt;
/dev/sdb               /mnt                     ext3    defaults 0 0&lt;br /&gt;
none                    /dev/pts                devpts  gid=5,mode=620 0 0&lt;br /&gt;
none                    /dev/shm                tmpfs   defaults 0 0&lt;br /&gt;
none                    /proc                   proc    defaults 0 0&lt;br /&gt;
none                    /sys                    sysfs   defaults 0 0&lt;br /&gt;
&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Set net.eth0 to start in the default runlevel&lt;/li&gt;
&lt;li&gt;Set a root password.  Create and properly set permissions on /root/.ssh/authorized_keys and put anything appropriate in there.&lt;/li&gt;
&lt;li&gt;Emerge and set to run syslog-ng.&lt;/li&gt;
&lt;li&gt;If you need cron install the cron daemon of your choice.  Keep in mind that EC2 instances are volatile so cron is probably less useful than it normally would be.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;&amp;gt;=sys-fs/udev-125&lt;/code&gt; to your package.mask file.&lt;/li&gt;
&lt;li&gt;Populate your world file.  A dhcp client like dhcpcd is essential, everything else here is optional:&lt;br /&gt;
&lt;code&gt;app-admin/ec2-ami-tools&lt;br /&gt;
app-admin/ec2-api-tools&lt;br /&gt;
app-admin/syslog-ng&lt;br /&gt;
app-editors/vim&lt;br /&gt;
app-misc/screen&lt;br /&gt;
app-portage/cfg-update&lt;br /&gt;
net-misc/dhcpcd&lt;br /&gt;
sys-process/atop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Do an emerge -au world to install your software, it will downgrade udev and this is a good thing.&lt;/li&gt;
&lt;li&gt;Update all your .config files&lt;/li&gt;
&lt;li&gt;Remove any unnecessary tarballs, configure user accounts if needed, and do any application setup based upon the purpose of your system.&lt;/li&gt;
&lt;li&gt;Add the following to your local.start (credits to whoever created the ami I ripped this out of &amp;#8211; I&amp;#8217;ll be happy to post them if you identify yourself &amp;#8211; as far as I can tell ami owners can&amp;#8217;t be identified):&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
[ ! -e /root ] &amp;amp;&amp;amp; cp -r /etc/skel /root&lt;br /&gt;
if [ ! -d /root/.ssh ] ; then&lt;br /&gt;
        mkdir -p /root/.ssh&lt;br /&gt;
        chmod 700 /root/.ssh&lt;br /&gt;
fi&lt;br /&gt;
curl http://169.254.169.254/2008-02-01//meta-data/public-keys/0/openssh-key &amp;gt; /tmp/my-key&lt;br /&gt;
if [ $? -eq 0 ] ; then&lt;br /&gt;
        cat /tmp/my-key &amp;gt;&amp;gt; /root/.ssh/authorized_keys&lt;br /&gt;
        chmod 600 /root/.ssh/authorized_keys&lt;br /&gt;
        rm /tmp/my-key&lt;br /&gt;
fi&lt;br /&gt;
killall nash-hotplug&lt;br /&gt;
&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Configure sshd to run at startup, and edit your sshd config to allow root to login.&lt;/li&gt;
&lt;li&gt;Exit your chroot, umount anything mounted inside of it.&lt;/li&gt;
&lt;li&gt;Clean up tmp, var/tmp, and usr/portage/distfiles, and any other messes you have made.  I suspect that to compress the image fully you probably need to zero the free space (&lt;code&gt;dd if=/dev/zero of=file-inside-filesystem BS=1M count=5000 ; rm file-inside-filesystem&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Umount your image and delete any loops you created.  Congratulations, you now have a raw image file suitable for EC2.  Now we just need to bundle, upload, and register it.&lt;/li&gt;
&lt;li&gt;Bundle your image with:&lt;br /&gt;
&lt;code&gt;mkdir out&lt;br /&gt;
ec2-bundle-image --image path-to-image --prefix give-it-a-name --cert path-to-cert-file --privatekey path-to-pk-file --user youramazonaccountnumber --destination out/ --arch x86_64&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Upload your image with:&lt;br /&gt;
&lt;code&gt;ec2-upload-bundle --manifest out/prefix.manifest.xml --bucket S3-bucket-name --access-key S3accesskeyhere --secret-key S3secretkeyhere&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Register your image with:&lt;br /&gt;
&lt;code&gt;ec2-register S3-bucket-name/prefix.manifest.xml&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Congratulations, you now have what should be a working ami.  If you ever need to update it you can just chroot into your image, adjust it, and then re-bundle, upload, and register.  If you need to delete an ami there is a command that will do it, but I usually just use s3cmd.&lt;/p&gt;
&lt;p&gt;You might want to see my updated &lt;a href=&quot;http://rich0gentoo.wordpress.com/2010/07/18/ec2-custom-kernels/&quot;&gt;guide&lt;/a&gt; on building with a custom kernel.&lt;/p&gt;
&lt;br /&gt;Filed under: &lt;a href=&quot;http://rich0gentoo.wordpress.com/category/gentoo/&quot;&gt;gentoo&lt;/a&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rich0gentoo.wordpress.com/21/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rich0gentoo.wordpress.com/21/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rich0gentoo.wordpress.com/21/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rich0gentoo.wordpress.com/21/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rich0gentoo.wordpress.com/21/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rich0gentoo.wordpress.com/21/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rich0gentoo.wordpress.com/21/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rich0gentoo.wordpress.com/21/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rich0gentoo.wordpress.com/21/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rich0gentoo.wordpress.com/21/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rich0gentoo.wordpress.com&amp;blog=12853060&amp;post=21&amp;subd=rich0gentoo&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Fri, 02 Apr 2010 14:41:57 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Wait, am I nuts? Does anyone else miss the Karmic messaging menu icon?</title>
	<guid>http://www.lamalex.net/?p=78</guid>
	<link>http://www.lamalex.net/2010/04/wait-am-i-nuts-does-anyone-else-miss-the-karmic-messaging-menu-icon/</link>
	<description>&lt;p&gt;Am I the only one who thinks that the icon for the messaging menu in its default no messages waiting state was infinitely better looking in Karmic?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/panel1.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-80&quot; title=&quot;panel&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/panel1.png&quot; alt=&quot;&quot; width=&quot;457&quot; height=&quot;60&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Is it just me or does that icon &lt;strong&gt;not match the others at all.&lt;/strong&gt; The colors are off, the weight is different, it even looks like it&amp;#8217;s a different size. Now the old default, no-messages icon was so much closer to perfect-&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/desktopvp-panel.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-81&quot; title=&quot;desktopvp-panel&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/desktopvp-panel.png&quot; alt=&quot;&quot; width=&quot;458&quot; height=&quot;41&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;See how the icon is the same fill color as the panel? If it had the same color, but bold lines as the others with this fill style- it would look incredible!&lt;/p&gt;
&lt;p&gt;That said, everything else in Lucid rules! Best release ever, I know we say that every time, but it&amp;#8217;s always true!&lt;/p&gt;</description>
	<pubDate>Fri, 02 Apr 2010 01:56:33 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: HELP! Does anyone know how to export properties with python-dbus??</title>
	<guid>http://www.lamalex.net/?p=72</guid>
	<link>http://www.lamalex.net/2010/03/help-does-anyone-know-how-to-export-properties-with-python-dbus/</link>
	<description>&lt;div class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/helga/3952984450/&quot;&gt;&lt;img title=&quot;CONFUSED&quot; src=&quot;http://farm3.static.flickr.com/2449/3952984450_953c33c096.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;500&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;268/365 - Default State (C) Helga Weber 2009&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;I need help! I need to know if it&amp;#8217;s possible to export properties over dbus with python-dbus, and how to do so! I&amp;#8217;ve been Googling for &lt;strong&gt;hours&lt;/strong&gt;, emailed dbus-list (which by the way admins LET MY EMAIL THROUGH THE QUEUE!), read the python-dbus tutorial, tried to find applications that do this, asked on irc and have found &lt;strong&gt;nothing&lt;/strong&gt;. There has to be someone out there who knows a) whether or not this is possible and if a: then how to do it! So please, if you&amp;#8217;re a python-dbus guru, a neophyte who just happens to know this, or some sort of crystal eating psychic who can tap into a collective consciousness and find this information out, PLEASE leave a comment, email me, find me on irc (lamalex on gimpnet and freenode), come to my house (in south philly- i&amp;#8217;ll feed you), call my cellphone, or transmit the information to me telepathically.&lt;/p&gt;
&lt;p&gt;Thank you to the prophet who can uncover this age old mystery.&lt;/p&gt;</description>
	<pubDate>Tue, 30 Mar 2010 20:36:09 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Bringing Banshees hardware into 2003!</title>
	<guid>http://www.lamalex.net/?p=57</guid>
	<link>http://www.lamalex.net/2010/03/bringing-banshees-hardware-into-2003/</link>
	<description>&lt;p&gt;Just wanted to show off this money shot of Banshee loading an Audio CD sans HAL, doing it raw with gio/udev. I don&amp;#8217;t have audio players working yet, but I&amp;#8217;m fairly confident that it&amp;#8217;s just a matter of getting a firmer grasp on some of the more subtle aspects of Banshee&amp;#8217;s hardware class hierarchy. If anyone wants to help, the code lives in git at &lt;a href=&quot;http://gitorious.org/~lamalex/banshee/lamalex-udev&quot;&gt;http://gitorious.org/~lamalex/banshee/lamalex-udev&lt;/a&gt; in master. I&amp;#8217;m a little bit concerned that iPod support will take even longer due to one of the libraries Banshee uses for iPod support, podsleuth, being very HAL dependent. My plan is to at least get everything else working before I attempt open up that can of worms. Less talk, more rock! Pics or gtfo.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/no-hal2.png&quot;&gt;&lt;img class=&quot;aligncenter size-large wp-image-68&quot; title=&quot;no-hal&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/no-hal2-1024x640.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 27 Mar 2010 06:02:54 +0000</pubDate>
</item>
<item>
	<title>mjd: A monad for probability and provenance</title>
	<guid>tag:blog.plover.com,2009:/prog/haskell/probmonad</guid>
	<link>http://blog.plover.com/prog/haskell/probmonad.html</link>
	<description>I don't quite remember how I arrived at this, but it occurred to me
last week that probability distributions form a monad.  This is the
first time I've invented a new monad that I hadn't seen before; then I
implemented it and it behaved pretty much the way I thought it would.
So I feel like I've finally arrived, monadwise.&lt;p&gt;

Suppose a monad value represents all the possible outcomes of an
event, each with a probability of occurrence.  For concreteness, let's
suppose all our probability distributions are discrete.  Then we might
have:

&lt;pre&gt;
	data ProbDist p a = ProbDist [(a,p)] deriving (Eq, Show)
	unpd (ProbDist ps) = ps
&lt;/pre&gt;

Each &lt;var&gt;a&lt;/var&gt; is an outcome, and each &lt;var&gt;p&lt;/var&gt; is the
probability of that outcome occurring.  For example, biased and
unbiased coins:&lt;p&gt;

&lt;pre&gt;
    unbiasedCoin = ProbDist [ (&quot;heads&quot;, 0.5),
                              (&quot;tails&quot;, 0.5) ];

    biasedCoin   = ProbDist [ (&quot;heads&quot;, 0.6),
                              (&quot;tails&quot;, 0.4) ];
&lt;/pre&gt;&lt;p&gt;

Or a couple of simple functions for making dice:&lt;p&gt;

&lt;pre&gt;
    import Data.Ratio

    d sides = ProbDist [(i, 1 % sides) | i - [1 .. sides]]
    die = d 6
&lt;/pre&gt;&lt;p&gt;

&lt;p&gt;&lt;tt&gt;d &lt;i&gt;n&lt;/i&gt;&lt;/tt&gt; is an &lt;i&gt;n&lt;/i&gt;-sided die.&lt;p&gt;

The &lt;tt&gt;Functor&lt;/tt&gt; instance is straightforward:&lt;p&gt;

&lt;pre&gt;
    instance Functor (ProbDist p) where
      fmap f (ProbDist pas) = ProbDist $ map (\(a,p) -&amp;gt; (f a, p)) pas
&lt;/pre&gt;



The &lt;tt&gt;Monad&lt;/tt&gt; instance requires &lt;tt&gt;return&lt;/tt&gt; and
&lt;tt&gt;&amp;gt;&amp;gt;=&lt;/tt&gt;.  The &lt;tt&gt;return&lt;/tt&gt; function merely takes an event and
turns it into a distribution where that event occurs with probability
1.  I find &lt;tt&gt;join&lt;/tt&gt; easier to think about than &lt;tt&gt;&amp;gt;&amp;gt;=&lt;/tt&gt;.
The &lt;tt&gt;join&lt;/tt&gt; function takes a nested distribution, where each
outcome of the outer distribution specifies an inner distribution for
the actual events, and collapses it into a regular, overall
distribution.  For example, suppose you put a biased coin and an
unbiased coin in a bag, then pull one out and flip it:&lt;p&gt;

&lt;pre&gt;
	  bag :: ProbDist Double (ProbDist Double String)
	  bag = ProbDist [ (biasedCoin, 0.5),
                           (unbiasedCoin, 0.5) ]
&lt;/pre&gt;

The &lt;tt&gt;join&lt;/tt&gt; operator collapses this into a single &lt;tt&gt;ProbDist
Double String&lt;/tt&gt;:&lt;p&gt;

&lt;pre&gt;
	ProbDist [(&quot;heads&quot;,0.3),
                  (&quot;tails&quot;,0.2),
                  (&quot;heads&quot;,0.25),
                  (&quot;tails&quot;,0.25)]
&lt;/pre&gt;

It would be nice if &lt;tt&gt;join&lt;/tt&gt; could combine the duplicate
&lt;tt&gt;heads&lt;/tt&gt; into a single &lt;tt&gt;(&quot;heads&quot;, 0.55)&lt;/tt&gt; entry.  But that
would force an &lt;tt&gt;Eq a&lt;/tt&gt; constraint on the event type, which isn't
allowed, because &lt;tt&gt;(&amp;gt;&amp;gt;=)&lt;/tt&gt; must work for all data types, not
just for instances of &lt;tt&gt;Eq&lt;/tt&gt;.  This is a problem with Haskell,
not with the monad itself.  It's the same problem that prevents one
from making a good set monad in Haskell, even though categorially sets
are a perfectly good monad.  (The &lt;tt&gt;return&lt;/tt&gt; function constructs
singletons, and the &lt;tt&gt;join&lt;/tt&gt; function is simply set union.)
Maybe in the next language.&lt;p&gt;

Perhaps someone else will find the &lt;tt&gt;&amp;gt;&amp;gt;=&lt;/tt&gt; operator easier to
understand than &lt;tt&gt;join&lt;/tt&gt;?  I don't know.  Anyway, it's simple
enough to derive once you understand &lt;tt&gt;join&lt;/tt&gt;; here's the
code:&lt;p&gt;





&lt;pre&gt;
	instance (Num p) &lt;tt&gt;=&amp;gt;&lt;/tt&gt; Monad (ProbDist p) where
	  return a = ProbDist [(a, 1)]
	  (ProbDist pas) &amp;gt;&amp;gt;= f = ProbDist $ do
				   (a, p) &amp;lt;- pas
				   let (ProbDist pbs) = f a
				   (b, q) &amp;lt;- pbs
				   return (b, p*q)
&lt;/pre&gt;

So now we can do some straightforward experiments:&lt;p&gt;

&lt;pre&gt;
	liftM2 (+) (d 6) (d 6)

	ProbDist [(2,1 % 36),(3,1 % 36),(4,1 % 36),(5,1 % 36),(6,1 %
	36),(7,1 % 36),(3,1 % 36),(4,1 % 36),(5,1 % 36),(6,1 %
	36),(7,1 % 36),(8,1 % 36),(4,1 % 36),(5,1 % 36),(6,1 %
	36),(7,1 % 36),(8,1 % 36),(9,1 % 36),(5,1 % 36),(6,1 %
	36),(7,1 % 36),(8,1 % 36),(9,1 % 36),(10,1 % 36),(6,1 %
	36),(7,1 % 36),(8,1 % 36),(9,1 % 36),(10,1 % 36),(11,1 %
	36),(7,1 % 36),(8,1 % 36),(9,1 % 36),(10,1 % 36),(11,1 %
	36),(12,1 % 36)]
&lt;/pre&gt;

This is nasty-looking; we really need to merge the multiple listings
of the same event.  Here is a function to do that:&lt;p&gt;

&lt;pre&gt;
        agglomerate :: (Num p, Eq b) &lt;tt&gt;=&amp;gt;&lt;/tt&gt; (a -&amp;gt; b) -&amp;gt; ProbDist p a -&amp;gt; ProbDist p b
        agglomerate f pd = ProbDist $ foldr insert [] (unpd (fmap f pd)) where
          insert (k, p) [] = [(k, p)]
          insert (k, p) ((k', p'):kps) | k == k' = (k, p+p'):kps
                                       | otherwise = (k', p'):(insert (k,p) kps)


        agg :: (Num p, Eq a) &lt;tt&gt;=&amp;gt;&lt;/tt&gt; ProbDist p a -&amp;gt; ProbDist p a
        agg = agglomerate id
&lt;/pre&gt;

Then &lt;tt&gt;agg $ liftM2 (+) (d 6) (d 6)&lt;/tt&gt; produces:&lt;p&gt;

&lt;pre&gt;
        ProbDist [(12,1 % 36),(11,1 % 18),(10,1 % 12),(9,1 % 9),
                  (8,5 % 36),(7,1 % 6),(6,5 % 36),(5,1 % 9),
                  (4,1 % 12),(3,1 % 18),(2,1 % 36)]
&lt;/pre&gt;

Hey, that's correct.&lt;p&gt;

There must be a shorter way to write &lt;tt&gt;insert&lt;/tt&gt;.  It really
bothers me, because it looks look it should be possible to do it as a
fold.  But I couldn't make it look any better.&lt;p&gt;

You are not limited to calculating probabilities.  The monad actually
will count things.  For example, let us throw three dice and count how
many ways there are to throw various numbers of sixes:&lt;p&gt;

&lt;pre&gt;
        eq6 n = if n == 6 then 1 else 0
        agg $ liftM3 (\a b c -&amp;gt; eq6 a + eq6 b + eq6 c) die die die

      ProbDist [(3,1),(2,15),(1,75),(0,125)]
&lt;/pre&gt;

There is one way to throw three sixes, 15 ways to throw two sixes, 75
ways to throw one six, and 125 ways to throw no sixes.  So
&lt;tt&gt;ProbDist&lt;/tt&gt; is a misnomer.  &lt;p&gt;

It's easy to
convert counts to probabilities:&lt;p&gt;

&lt;pre&gt;
	probMap :: (p -&amp;gt; q) -&amp;gt; ProbDist p a -&amp;gt; ProbDist q a
	probMap f (ProbDist pds) = ProbDist $ (map (\(a,p) -&amp;gt; (a, f p))) pds

	normalize :: (Fractional p) &lt;tt&gt;=&amp;gt;&lt;/tt&gt; ProbDist p a -&amp;gt; ProbDist p a
	normalize pd@(ProbDist pas) = probMap (/ total) pd where
	    total = sum . (map snd) $ pas

        normalize $ agg $ probMap toRational $ 
               liftM3 (\a b c -&amp;gt; eq6 a + eq6 b + eq6 c) die die die

      ProbDist [(3,1 % 216),(2,5 % 72),(1,25 % 72),(0,125 % 216)]
&lt;/pre&gt;

I think this is the first time I've gotten to write &lt;tt&gt;die die
die&lt;/tt&gt; in a computer program.&lt;p&gt;

The &lt;tt&gt;do&lt;/tt&gt; notation is very nice.  Here we calculate the
distribution where we roll four dice and discard the smallest:&lt;p&gt;

&lt;pre&gt;
        stat = do
                 a &amp;lt;- d 6
                 b &amp;lt;- d 6
                 c &amp;lt;- d 6
                 d &amp;lt;- d 6
                 return (a+b+c+d - minimum [a,b,c,d])

        probMap fromRational $ agg stat

	ProbDist [(18,1.6203703703703703e-2),
                  (17,4.1666666666666664e-2), (16,7.253086419753087e-2),
                  (15,0.10108024691358025),   (14,0.12345679012345678),
                  (13,0.13271604938271606),   (12,0.12885802469135801),
                  (11,0.11419753086419752),   (10,9.41358024691358e-2),
                   (9,7.021604938271606e-2),   (8,4.7839506172839504e-2),
                   (7,2.9320987654320986e-2),  (6,1.6203703703703703e-2),
                   (5,7.716049382716049e-3),   (4,3.0864197530864196e-3),
                   (3,7.716049382716049e-4)]

&lt;/pre&gt;

One thing I was hoping to get didn't work out.  I had this idea that
I'd be able to calculate the outcome of a game of craps like this:&lt;p&gt;

&lt;pre&gt;
	dice = liftM2 (+) (d 6) (d 6)

	point n = do
	  roll &amp;lt;- dice
	  case roll of 7 -&amp;gt; return &quot;lose&quot;
                       _ | roll == n  = &quot;win&quot;
                       _ | otherwise  = point n

        craps = do
          roll &amp;lt;- dice
          case roll of 2 -&amp;gt; return &quot;lose&quot;
                       3 -&amp;gt; return &quot;lose&quot;
                       4 -&amp;gt; point 4
                       5 -&amp;gt; point 5
                       6 -&amp;gt; point 6
                       7 -&amp;gt; return &quot;win&quot;
                       8 -&amp;gt; point 8
                       9 -&amp;gt; point 9
                       10 -&amp;gt; point 10
                       11 -&amp;gt; return &quot;win&quot;
                       12 -&amp;gt; return &quot;lose&quot;
&lt;/pre&gt;

	      
This doesn't work at all; &lt;tt&gt;point&lt;/tt&gt; is an infinite loop because
the first value of &lt;tt&gt;dice&lt;/tt&gt;, namely 2, causes a recursive call.
I might be able to do something about this, but I'll have to think
about it more.&lt;p&gt;

It also occurred to me that the use of &lt;tt&gt;*&lt;/tt&gt; in the definition of
&lt;tt&gt;&amp;gt;&amp;gt;=&lt;/tt&gt; / &lt;tt&gt;join&lt;/tt&gt; could be generalized.  A couple of years
back I mentioned &lt;a href=&quot;http://db.cis.upenn.edu/DL/07/pods07.pdf&quot;&gt;a
paper of Green, Karvounarakis, and Tannen&lt;/a&gt; that discusses
&quot;provenance semirings&quot;.  The idea is that each item in a database is
annotated with some &quot;provenance&quot; information about why it is there,
and you want to calculate the provenance for items in tables that are
computed from table joins.  &lt;a href=&quot;http://blog.plover.com/math/catalan-squared.html&quot;&gt;My earlier
explanation is here&lt;/a&gt;.&lt;p&gt;

One special case of provenance information is that the provenances are
probabilities that the database information is correct, and then the
probabilities are calculated correctly for the joins, by
multiplication and addition of probabilities.  But in the general case
the provenances are opaque symbols, and the multiplication and
addition construct regular expressions over these symbols.  One could
generalize &lt;tt&gt;ProbDist&lt;/tt&gt; similarly, and the &lt;tt&gt;ProbDist&lt;/tt&gt;
monad (even more of a misnomer this time) would calculate the
provenance automatically.  It occurs to me now that there's probably a
natural way to view a database table join as a sort of Kleisli
composition, but this article has gone on too long already.&lt;p&gt;

Happy new year, everyone.&lt;p&gt;

[ Addendum 20100103: unsurprisingly, this is not a new idea.  Several
readers wrote in with &lt;a href=&quot;http://blog.plover.com/prog/haskell/probmonad-refs.html&quot;&gt;references to
previous discussion of this monad, and related monads&lt;/a&gt;.  It turns
out that the idea goes back at least to 1981.&amp;nbsp;]&lt;p&gt; 

&lt;hr /&gt;

My thanks to Graham Hunter for his donation.&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;</description>
	<pubDate>Fri, 26 Mar 2010 14:41:00 +0000</pubDate>
</item>
<item>
	<title>mjd: Monads are like burritos</title>
	<guid>tag:blog.plover.com,2009:/prog/burritos</guid>
	<link>http://blog.plover.com/prog/burritos.html</link>
	<description>A few months ago &lt;a href=&quot;http://byorgey.wordpress.com/2009/01/12/abstraction-intuition-and-the-monad-tutorial-fallacy/&quot;&gt;Brent
Yorgey complained about a certain class of tutorials&lt;/a&gt; which present
monads by explaining how monads are like burritos.&lt;p&gt;

At first I thought the choice of burritos was only a facetious
reference to the peculiar and sometimes strained analogies these
tutorials make.  But then I realized that monads &lt;i&gt;are&lt;/i&gt; like
burritos.&lt;p&gt;

I will explain.&lt;p&gt;

A monad is a special kind of a functor.  A functor &lt;i&gt;F&lt;/i&gt; takes each
type &lt;i&gt;T&lt;/i&gt; and maps it to a new type &lt;i&gt;FT&lt;/i&gt;.  A burrito is like
a functor: it takes a type, like meat or beans, and turns it into a
new type, like beef burrito or bean burrito.&lt;p&gt;

A functor must also be equipped with a &lt;tt&gt;map&lt;/tt&gt; function that
lifts functions over the original type into functions over the new
type.  For example, you can add chopped jalape&amp;ntilde;os or shredded
cheese to any type, like meat or beans; the lifted version of this
function adds chopped jalape&amp;ntilde;os or shredded cheese to the
corresponding burrito.&lt;p&gt;

A monad must also possess a &lt;tt&gt;unit&lt;/tt&gt; function that takes a regular
value, such as a particular batch of meat, and turns it into a
burrito.  The &lt;tt&gt;unit&lt;/tt&gt; function for burritos is obviously a tortilla.&lt;p&gt;  

Finally, a monad must possess a &lt;tt&gt;join&lt;/tt&gt; function that takes a
ridiculous burrito of burritos and turns them into a regular burrito.
Here the obvious join function is to remove the outer tortilla, then
unwrap the inner burritos and transfer their fillings into the outer
tortilla, and throw away the inner wrappings.&lt;p&gt;

The &lt;tt&gt;map&lt;/tt&gt;, &lt;tt&gt;join&lt;/tt&gt;, and &lt;tt&gt;unit&lt;/tt&gt; functions must
satisfy certain laws.  For example, if &lt;i&gt;B&lt;/i&gt; is already a burrito,
and not merely a filling for a burrito, then
&lt;tt&gt;join&lt;/tt&gt;(&lt;tt&gt;unit&lt;/tt&gt;(&lt;i&gt;B&lt;/i&gt;)) must be the same as &lt;i&gt;B&lt;/i&gt;.
This means says that if you have a burrito, and you wrap it in a
second tortilla, and then unwrap the contents into the outer tortilla,
the result is the same as what you started with. &lt;p&gt;

This is true because
tortillas are indistinguishable. &lt;p&gt;

I know you are going to point out that some tortillas have the face of
Jesus.  But those have been toasted, and so are unsuitable for
burrito-making, and do not concern us here.&lt;p&gt;

So monads are indeed like burritos.&lt;p&gt;

I asked Brent if this was actually what he had in mind when he first
suggested the idea of tutorials explaining monads in terms of
burritos, and if everyone else had understood this right away.&lt;p&gt;

But he said no, I was the lone genius.&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;</description>
	<pubDate>Fri, 26 Mar 2010 14:41:00 +0000</pubDate>
</item>
<item>
	<title>mjd: Another short explanation of Gödel's theorem</title>
	<guid>tag:blog.plover.com,2009:/math/Gdl</guid>
	<link>http://blog.plover.com/math/Gdl.html</link>
	<description>In &lt;a href=&quot;http://blog.plover.com/math/Gdl-Smullyan.html&quot;&gt;yesterday's article&lt;/a&gt;, I
said:&lt;p&gt;



&lt;blockquote&gt;
A while back I started writing up an article titled &quot;World's shortest
explanation of G&amp;ouml;del's theorem&quot;.  But I didn't finish it...
&lt;/blockquote&gt;&lt;p&gt;  &lt;!-- I started it on 2008-01-09 --&gt;

I went and had a look to see what was wrong with it, and to my
surprise, there seemed to be hardly anything wrong with it.  Perhaps I
just forgot to post it.  So if you disliked yesterday's brief
explanation of G&amp;ouml;del's theorem&amp;mdash;and many people did&amp;mdash;you'll probably
dislike this one even more.  Enjoy!&lt;p&gt;

&lt;hr /&gt;

A reader wrote to question my characterization of G&amp;ouml;del's theorem in &lt;a href=&quot;http://blog.plover.com/math/major-screwups.html&quot;&gt;the
previous article&lt;/a&gt;.   But I think I characterized it correctly; I
said:&lt;p&gt;

&lt;blockquote&gt;
The only systems of mathematical axioms strong enough to prove all
true statements of arithmetic, are those that are so strong that they
also prove all the false statements of arithmetic.
&lt;/blockquote&gt;

I'm going to explain how this works.&lt;p&gt;

You start by choosing some system of mathematics that has some
machinery in it for making statements about things like numbers and for
constructing proofs of theorems like 1+1=2.  Many such systems exist.
Let's call the one we have chosen 
&lt;i&gt;M&lt;/i&gt;, for &quot;mathematics&quot;.  &lt;p&gt;

G&amp;ouml;del shows that if  &lt;i&gt;M&lt;/i&gt; has enough mathematical machinery in it to
actually  do arithmetic, then it is possible to produce a statement
&lt;i&gt;S&lt;/i&gt; whose meaning is essentially &quot;Statement &lt;i&gt;S&lt;/i&gt; cannot be
proved in system &lt;i&gt;M&lt;/i&gt;.&quot;&lt;p&gt;

It is not at all obvious that this is possible, or how it can be done,
and I am not going to get into the details here.  G&amp;ouml;del's contribution
was seeing that it &lt;i&gt;was&lt;/i&gt; possible to do this.&lt;p&gt;

So here's &lt;i&gt;S&lt;/i&gt; again:&lt;p&gt;

&lt;blockquote&gt;
&lt;i&gt;S&lt;/i&gt;: Statement &lt;i&gt;S&lt;/i&gt; cannot be
proved in system &lt;i&gt;M&lt;/i&gt;.
&lt;/blockquote&gt;&lt;p&gt;

Now there are two possibilities.  Either &lt;i&gt;S&lt;/i&gt; is in fact provable
in system &lt;i&gt;M&lt;/i&gt;, or it is not.  One of these must hold.&lt;p&gt;

If &lt;i&gt;S&lt;/i&gt; is provable in system &lt;i&gt;M&lt;/i&gt;, then it is false, and so
it is a false statement that can be proved in system &lt;i&gt;M&lt;/i&gt;.
&lt;i&gt;M&lt;/i&gt; therefore proves some false statements of arithmetic.&lt;p&gt;

If &lt;i&gt;S&lt;/i&gt; is not provable in system &lt;i&gt;M&lt;/i&gt;, then it is true, and
so it is a true statement that cannot be proved in system &lt;i&gt;M&lt;/i&gt;.  
&lt;i&gt;M&lt;/i&gt; therefore fails to prove some true statements of
arithmetic.&lt;p&gt;

So something goes wrong with &lt;i&gt;M&lt;/i&gt;: either it fails to prove some
true statements, or else it succeeds in proving some false
statements.  &lt;p&gt;

List of topics I deliberately omitted from this article, that
mathematicians should not write to me about with corrections:
Presburger arithmetic.  Dialetheism.  Inexhaustibility.
&amp;omega;-incompleteness.  Non-RE sets
of axioms.&lt;p&gt;

&lt;hr /&gt;

&lt;div class=&quot;bookbox&quot;&gt;&lt;table align=&quot;right&quot; width=&quot;14%&quot; border=&quot;1&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;
&lt;font size=&quot;-1&quot;&gt;Order&lt;/font&gt;&lt;br /&gt;
&lt;cite&gt;&lt;font size=&quot;-1&quot;&gt;Godel's Theorem: An Incomplete Guide to Its Use and Abuse&lt;/font&gt;&lt;/cite&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/9781568812388&quot;&gt;&lt;img src=&quot;http://pic.blog.plover.com/covers/FranzenGodel.jpg&quot; border=&quot;0&quot; align=&quot;center&quot; alt=&quot;Godel's Theorem: An Incomplete Guide to Its Use and Abuse&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/9781568812388&quot;&gt;&lt;font size=&quot;-1&quot;&gt;with kickback&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/biblio/9781568812388&quot;&gt;&lt;font size=&quot;-1&quot;&gt;no kickback&lt;/font&gt;&lt;/a&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class=&quot;bookbox&quot;&gt;&lt;table align=&quot;right&quot; width=&quot;14%&quot; border=&quot;1&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;
&lt;font size=&quot;-1&quot;&gt;Order&lt;/font&gt;&lt;br /&gt;
&lt;cite&gt;&lt;font size=&quot;-1&quot;&gt;Inexhaustibility: A Non-Exhaustive Treatment&lt;/font&gt;&lt;/cite&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/9781568811756&quot;&gt;&lt;img src=&quot;http://www.powells.com/cgi-bin/imageDB.cgi?isbn=9781568811756&quot; border=&quot;0&quot; align=&quot;center&quot; alt=&quot;Inexhaustibility: A Non-Exhaustive Treatment&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/9781568811756&quot;&gt;&lt;font size=&quot;-1&quot;&gt;with kickback&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/biblio/9781568811756&quot;&gt;&lt;font size=&quot;-1&quot;&gt;no kickback&lt;/font&gt;&lt;/a&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

Well, I see now that left out the step where I go from &quot;&lt;i&gt;M&lt;/i&gt;
proves a false statement&quot; to &quot;&lt;i&gt;M&lt;/i&gt; proves all false statements&quot;.
Oh well, another topic for another post.  &lt;p&gt;

If you liked this post, you may
enjoy Torkel Franz&amp;eacute;n's books &lt;cite&gt;Godel's Theorem: An Incomplete
Guide to Its Use and Abuse&lt;/cite&gt; and &lt;cite&gt;Inexhaustibility: A
Non-Exhaustive Treatment&lt;/cite&gt;.  If you disliked this post, you are
even more likely to enjoy them.&lt;p&gt;

&lt;br clear=&quot;all&quot; /&gt;
&lt;hr /&gt;

Many thanks to Robert Bond for his contribution.&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;</description>
	<pubDate>Fri, 26 Mar 2010 14:41:00 +0000</pubDate>
</item>
<item>
	<title>mjd: World's shortest explanation of Gödel's theorem</title>
	<guid>tag:blog.plover.com,2009:/math/Gdl-Smullyan</guid>
	<link>http://blog.plover.com/math/Gdl-Smullyan.html</link>
	<description>A while back I started writing up an article titled &quot;World's shortest
explanation of G&amp;ouml;del's theorem&quot;.  But I didn't finish it, and
later I encountered Raymond Smullyan's version, which is much shorter
anyway.  So here, shamelessly stolen from Smullyan, is the World's
shortest explanation of G&amp;ouml;del's theorem.&lt;p&gt;

We have some sort of machine that prints out statements in some sort
of language.  It needn't be a statement-printing machine exactly; it
could be some sort of technique for taking statements and deciding if
they are true.  But let's think of it as a machine that prints out
statements.  &lt;p&gt;

In particular, some of the statements that the machine might (or might
not) print look like these:&lt;p&gt;

&lt;table align=&quot;center&quot;&gt;
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;tt&gt;P*&lt;/tt&gt;&lt;i&gt;x&lt;/i&gt;
    &lt;td&gt;(which means that 
    &lt;td&gt;the machine will print &lt;i&gt;x&lt;/i&gt;)
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;tt&gt;NP*&lt;/tt&gt;&lt;i&gt;x&lt;/i&gt;
    &lt;td&gt;(which means that 
    &lt;td&gt;the machine will never print &lt;i&gt;x&lt;/i&gt;)
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;tt&gt;PR*&lt;/tt&gt;&lt;i&gt;x&lt;/i&gt;
    &lt;td&gt;(which means that 
    &lt;td&gt;the machine will print &lt;i&gt;xx&lt;/i&gt;)
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&lt;tt&gt;NPR*&lt;/tt&gt;&lt;i&gt;x&lt;/i&gt;
    &lt;td&gt;(which means that 
    &lt;td&gt;the machine will never print &lt;i&gt;xx&lt;/i&gt;)
&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;

For example, &lt;tt&gt;NPR*FOO&lt;/tt&gt; means that the machine will never print
&lt;tt&gt;FOOFOO&lt;/tt&gt;.  &lt;tt&gt;NP*FOOFOO&lt;/tt&gt; means the same thing.  So far, so
good.&lt;p&gt;

Now, let's consider the statement &lt;tt&gt;NPR*NPR*&lt;/tt&gt;.  This statement
asserts that the machine will never print &lt;tt&gt;NPR*NPR*&lt;/tt&gt;.&lt;p&gt;

Either the machine prints &lt;tt&gt;NPR*NPR*&lt;/tt&gt;, or it never prints
&lt;tt&gt;NPR*NPR*&lt;/tt&gt;.&lt;p&gt;

If the machine prints &lt;tt&gt;NPR*NPR*&lt;/tt&gt;, it has printed a false
statement.   But if the machine never prints &lt;tt&gt;NPR*NPR*&lt;/tt&gt;, then
&lt;tt&gt;NPR*NPR*&lt;/tt&gt; is a true statement that the machine never
prints.&lt;p&gt;

So either the machine sometimes prints false statements, or there are
true statements that it never prints.&lt;p&gt;

So any machine that prints only true statements must fail to print
some true statements.&lt;p&gt;

Or conversely, any machine that prints every possible true statement
must print some false statements too.&lt;p&gt;

&lt;hr /&gt;

&lt;div class=&quot;bookbox&quot;&gt;&lt;table align=&quot;right&quot; width=&quot;14%&quot; border=&quot;1&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;
&lt;font size=&quot;-1&quot;&gt;Order&lt;/font&gt;&lt;br /&gt;
&lt;cite&gt;&lt;font size=&quot;-1&quot;&gt;5000 B.C. and Other Philosophical Fantasies&lt;/font&gt;&lt;/cite&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/9780312295170&quot;&gt;&lt;img src=&quot;http://pic.blog.plover.com/covers/5000BC.jpg&quot; border=&quot;0&quot; align=&quot;center&quot; alt=&quot;5000 B.C. and Other Philosophical Fantasies&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/9780312295170&quot;&gt;&lt;font size=&quot;-1&quot;&gt;with kickback&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/biblio/9780312295170&quot;&gt;&lt;font size=&quot;-1&quot;&gt;no kickback&lt;/font&gt;&lt;/a&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

The proof of G&amp;ouml;del's theorem shows that there are statements of
pure arithmetic that essentially express &lt;tt&gt;NPR*NPR*&lt;/tt&gt;; the trick
is to find some way to express &lt;tt&gt;NPR*NPR*&lt;/tt&gt; as a statement about
arithmetic, and most of the technical details (and cleverness!) of
G&amp;ouml;del's theorem are concerned with this trick.  But once the
trick is done, the argument can be applied to any machine or other
method for producing statements about arithmetic.&lt;p&gt;

The conclusion then translates directly: any machine or method that
produces statements about arithmetic either sometimes produces false
statements, or else there are true statements about arithmetic that it
never produces.  Because if it produces something like
&lt;tt&gt;NPR*NPR*&lt;/tt&gt; then it is wrong, but if it fails to produce
&lt;tt&gt;NPR*NPR*&lt;/tt&gt;, then that is a true statement that it has failed to
produce.&lt;p&gt;

So any machine or other method that produces only true statements
about arithmetic must fail to produce some true statements.&lt;p&gt;

Hope this helps!&lt;p&gt;

(This explanation appears in Smullyan's books &lt;cite&gt;5000 BC and Other
Philosophical Fantasies&lt;/cite&gt;, chapter 3, section 65 (which is where
I saw it) and also in &lt;cite&gt;The Mystery of Scheherezade&lt;/cite&gt;.)&lt;p&gt;

&lt;br clear=&quot;all&quot; /&gt;
&lt;hr /&gt;

I gratefully acknowledge Charles Colht for his generous donation to
this blog.&lt;p&gt;

&lt;hr /&gt;

[&amp;nbsp;Addendum 20091214: &lt;a href=&quot;http://blog.plover.com/math/Gdl.html&quot;&gt;Another article
on the same topic&lt;/a&gt;.&amp;nbsp;]&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;</description>
	<pubDate>Fri, 26 Mar 2010 14:41:00 +0000</pubDate>
</item>
<item>
	<title>mjd: On failing open</title>
	<guid>tag:blog.plover.com,2009:/tech/fail-open</guid>
	<link>http://blog.plover.com/tech/fail-open.html</link>
	<description>An axiom of security analysis is that nearly all security mechanisms
must fail closed.  What this means is that if there is an uncertainty
about whether to grant or to deny access, the right choice is nearly
always to deny access.&lt;p&gt;

For example, consider a login component that accepts a username and a
password and then queries a remote authentication server to find out
if the password is correct.  If the connection to the authentication
server fails, or if the authentication server is down, the login
component must decide whether to grant or deny access, in the absence
of correct information from the server.  The correct design is almost
certainly to &quot;fail closed&quot;, and to deny access.  &lt;p&gt;

I used to teach security classes, and I would point out that programs
sometimes have bugs, and do the wrong thing.  If your program has
failed closed, and if this is a bug, then you have an irate user.  The
user might call you up and chew you out, or might chew you out to your
boss, and they might even miss a crucial deadline because your
software denied them access when it should have granted access.  But
these are relatively small problems.  If your program has failed open,
and if this is a bug, then the user might abscond with the entire
payroll and flee to Brazil.&lt;p&gt;

(I was once teaching one of these classes in Lisbon, and I reached the
&quot;flee to Brazil&quot; example without having realized ahead of time that
this had greater potential to offend the Portuguese than many other
people.  So I apologized.  But my hosts very kindly told me
that they would have put it the same way, and that in fact the Mayor
of Lisbon had done precisely what I described a few years before.  The
moral of the story is to read over the slides ahead of time before
giving the talk.)&lt;p&gt;

But I digress.  One can find many examples in the history of security
that failed the wrong way.&lt;p&gt;

However, the issue is on my mind because I was at a job interview a
few weeks ago with giant media corporation XYZ.  At the interview, we
spent about an hour talking about an architectural problem they were
trying to solve.  XYZ operates a web site where people can watch
movies and TV programs online.  Thy would like to extend the service
so that people who subscribe to premium cable services, such as HBO,
can authenticate themselves to the web site and watch HBO programs
there; HBO non-subscribers should get only free TV content.  The
problem in this case was that the authentication data was held on an
underpowered legacy system that could serve only a small fraction of
the requests that came in.&lt;p&gt;

The solution was to cache the authentication data on a better system,
and gather and merge change information from the slow legacy system as
possible.  &lt;p&gt;

I observed during the discussion that this was a striking example of
the rare situation in which one wants the authentication system to
fail open instead of closed.  For suppose one grants access that
should not be granted. Then someone on the Internet gets to watch a
movie or an episode of &lt;cite&gt;The Sopranos&lt;/cite&gt; for free, which is
not worth getting excited about and which happens a zillion times a
day anyhow.&lt;p&gt;

But suppose the software denies access that should have been granted.
Then there is a legitimate paying customer who has paid to watch
&lt;cite&gt;The Sopranos&lt;/cite&gt;, and we told them no.  Now they are a
legitimately irate customer, which is bad, and they may call the
support desk, costing XYZ Corp a significant amount of money, which is
also bad.  So all other things being equal, one should err on the side
of lenity: when in doubt, grant access.&lt;p&gt;

&lt;hr /&gt;

I would like to thank Andrew Lenards for his gift.&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;</description>
	<pubDate>Fri, 26 Mar 2010 14:41:00 +0000</pubDate>
</item>
<item>
	<title>mjd: You think you're All That, but you're not!</title>
	<guid>tag:blog.plover.com,2009:/book/and-all-that</guid>
	<link>http://blog.plover.com/book/and-all-that.html</link>
	<description>I have long been interested in term rewriting systems, and one of my
long-term goals is to implement the Knuth-Bendix completion algorithm,
described by Knuth and Bendix in their famous paper &quot;Word Problems in
Universal Algebras&quot;.  This paper grabbed my attention around 1988; I
found it in an anthology edited by John Leech (of Leech lattice fame)
that I was probably looking into because it also contained an
enumeration by J.H.&amp;nbsp;Conway of all knots with at most eleven
crossings.  I found the Knuth-Bendix paper very hard to read, but the
examples at the end were extremely compelling.  I still find the paper
very hard to read, but fortunately better explanations are now
available.  (&lt;a href=&quot;http://comjnl.oxfordjournals.org/cgi/reprint/34/1/2.pdf&quot;&gt;For
example, this one by A.J.J.&amp;nbsp;Dick&lt;/a&gt;.)  One of the also-ran
topics for &lt;cite&gt;Higher-Order Perl&lt;/cite&gt; was a structured drawing
system based on Wm&amp;nbsp;Leler's &quot;Bertrand&quot; term-rewriting system.&lt;p&gt;

So I was delighted to discover that there was a new book out called
&lt;cite&gt;Term Rewriting and All That&lt;/cite&gt;.  The &quot;...and All That&quot; suffix
is a reference to the tongue-in-cheek classic of British history,
&lt;cite&gt;1066 and All That&lt;/cite&gt;, and promised a casual, accessible,
and possibly humorous treatment.&lt;p&gt;

Unfortunately the promise was not kept.  The book is very good, but it
is not casual or humorous.  Nor is it especially accessible.  It is a
solid slab of term rewriting, one of those books that make me think &quot;I
would not want to drop it on my foot.&quot;  That is not a bad thing; the
Barendregt book is superb, an enormous superb slab of lambda calculus that
you would not want to drop on your foot.  But it is not titled &quot;Lambda
Calculus and All That&quot;.&lt;p&gt;

So why the title?  I don't know.  The authors are Germans, so perhaps
they don't understand the joke?&lt;p&gt;

[ Addendum: There's exactly one review of this book on Amazon, and it
says the same thing I do.  It begins: &quot;My main criticism of this book
is its title.&quot;&amp;nbsp;]&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 26 Mar 2010 14:41:00 +0000</pubDate>
</item>
<item>
	<title>mjd: Dijkstra was not insane</title>
	<guid>tag:blog.plover.com,2009:/prog/Hoare-logic</guid>
	<link>http://blog.plover.com/prog/Hoare-logic.html</link>
	<description>Recently, a reader on the &lt;a href=&quot;mailto:hop-discuss-subscribe@plover.com&quot;&gt;Higher-Order Perl
discussion mailing list&lt;/a&gt; made a remark about Edsger Dijkstra and
his well-known opposition to the &lt;tt&gt;break&lt;/tt&gt; construction (in Perl,
&lt;tt&gt;last&lt;/tt&gt;) that escapes prematurely from a loop.  People often use
this as an example to show that Dijkstra was excessively doctrinaire,
and out of touch with the reality of programming&lt;a href=&quot;http://blog.plover.com#fn1&quot;&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/a&gt;, but usually it's
because they don't know what his argument was.&lt;p&gt;

I wrote a response, explaining where Dijkstra was coming from, and I
am very happy with how it came out, so I'm reposting it here.&lt;p&gt;

The list subscriber said, in part:&lt;p&gt;

&lt;blockquote&gt;
On a side note, I never read anything by Dijkstra that wasn't noticeably
out of touch with the reality of programming, which qualifies them as
screeds to me.&lt;p&gt;

And I say that as a former Pascal programmer, and as one who has read,
and bought into, things like Kernighan's &quot;Why Pascal is Not My Favorite
Programming Language&quot; and the valid rants about how some form of
breaking out of a loop without having to proceed to the end is very
useful, without destroying structure (except by Dijkstra's definition of
structure)...&lt;p&gt;
&lt;/p&gt;&lt;/p&gt;&lt;/blockquote&gt;


A lot of people bring up the premature-loop-exit prohibition without
understanding why Dijkstra suggested it; it wasn't just that he was a
tightassed Dutchman. &lt;p&gt;

Dijkstra's idea was this: suppose you want to prove, mathematically,
that your program does what it is supposed to do.  Please, everyone,
suspend your judgment of this issue for a few paragraphs, and bear
with me.  Let's really suppose that we want to do this.&lt;p&gt;

Dijkstra's idea is that the program is essentially a concatenation of
blocks, each of which is trying to accomplish something or other, and
each of which does not make sense to run unless some part of the
program state is set up for it ahead of time.  For example, the
program might be to print a sorted list of links from a web page.
Then the obvious blocks are:&lt;p&gt;

&lt;dl&gt;
&lt;dt&gt;        &lt;b&gt;A&lt;/b&gt;&lt;dd&gt; get the web page and store it in a variable&lt;p&gt;

&lt;dt&gt;        &lt;b&gt;B&lt;/b&gt;&lt;dd&gt; extract the links from the text in the variable into an array&lt;p&gt;

&lt;dt&gt;        &lt;b&gt;C&lt;/b&gt;&lt;dd&gt; sort the array&lt;p&gt;

&lt;dt&gt;        &lt;b&gt;D&lt;/b&gt;&lt;dd&gt; print out the array contents&lt;p&gt;
&lt;/p&gt;&lt;/dd&gt;&lt;/dt&gt;&lt;/p&gt;&lt;/dd&gt;&lt;/dt&gt;&lt;/p&gt;&lt;/dd&gt;&lt;/dt&gt;&lt;/p&gt;&lt;/dd&gt;&lt;/dt&gt;&lt;/dl&gt;

Section &lt;b&gt;C&lt;/b&gt; is trying to sort the array; if it is correct then the array
will be sorted by the time step &lt;b&gt;D&lt;/b&gt; commences.  But it doesn't make
sense to commence step &lt;b&gt;C&lt;/b&gt; unless the array is populated.  Garbage in,
garbage out, as they used to say when I was in elementary school.  &lt;p&gt;



We say that the &quot;precondition&quot; for &lt;b&gt;C&lt;/b&gt; is that the array be populated
with URLs, and the &quot;postcondition&quot; is that the array be in sorted
order.  What you would want to prove about &lt;b&gt;C&lt;/b&gt; is that if the
precondition holds&amp;mdash;that is, if the array is properly populated
before &lt;b&gt;C&lt;/b&gt; begins&amp;mdash;then the postcondition will hold too&amp;mdash;that is, the
array will be in sorted order when &lt;b&gt;C&lt;/b&gt; completes.&lt;p&gt;

It occurs to me that calling this a &quot;proof&quot; is probably biasing
everyone's thinking.  Let's forget about mathematical proofs and just
think about ordinary programmers trying to understand if the program
is correct.  If the intern in the next cubicle handed you his code for
this program, and you were looking it over, you would probably think
in very much this way: you would identify block &lt;b&gt;C&lt;/b&gt; (maybe it's a
subroutine, or maybe not) and then you would try to understand if &lt;b&gt;C&lt;/b&gt;,
given an array of URLs, would produce a properly sorted array by the
time it was done.&lt;p&gt;

&lt;b&gt;C&lt;/b&gt; itself might depend on some sub-blocks or subroutines that performed
sub-parts of the task; you could try to understand them similarly.&lt;p&gt;

Having proved (or convinced yourself) that &lt;b&gt;C&lt;/b&gt; will produce the
postcondition &quot;array contains sorted list of URLs&quot;, you are in an
excellent position to prove (or convince yourself) that block &lt;b&gt;D&lt;/b&gt; prints
out a sorted array of URLs, which is what you want.  Without that
belief about &lt;b&gt;C&lt;/b&gt;, you are building on sand; you have almost nothing to
go on, and you can conclude hardly anything useful about the behavior
of &lt;b&gt;D&lt;/b&gt;.&lt;p&gt;

Now consider a more complex block, one of the form:&lt;p&gt;

&lt;pre&gt;
        if (q) { E; }
        else { F; }
&lt;/pre&gt;

Suppose you believe that code &lt;b&gt;E&lt;/b&gt;, given precondition &lt;i&gt;x&lt;/i&gt;, is
guaranteed to produce postcondition &lt;i&gt;y&lt;/i&gt;.  And suppose you believe
the same thing about &lt;b&gt;F&lt;/b&gt;.  Then you can conclude the same thing about
the entire if-else block: if &lt;i&gt;x&lt;/i&gt; was true before it began
executing, then &lt;i&gt;y&lt;/i&gt; will be true when it is done.&lt;a href=&quot;http://blog.plover.com#fn2&quot;&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/a&gt; So you can build up proofs (or beliefs)
about small bits of code into proofs (or beliefs) about larger ones.&lt;p&gt;

We can understand &lt;tt&gt;while&lt;/tt&gt; loops similarly.  Suppose we know that
condition &lt;i&gt;p&lt;/i&gt; is true prior to the commencement of some loop, and that
if &lt;i&gt;p&lt;/i&gt; is true before &lt;b&gt;G&lt;/b&gt; executes, then &lt;i&gt;p&lt;/i&gt; will also be true when &lt;b&gt;G&lt;/b&gt;
finishes.  Then what can we say about this loop?&lt;p&gt;

&lt;pre&gt;
        while (q) { G; }
&lt;/pre&gt;

We can conclude that if &lt;i&gt;p&lt;/i&gt; was true before the loop began, then &lt;i&gt;p&lt;/i&gt; will
still be true, and &lt;i&gt;q&lt;/i&gt; will be false, when the loop ends.&lt;p&gt;

&lt;font color=&quot;red&quot;&gt;&lt;b&gt;BUT BUT BUT BUT&lt;/b&gt;&lt;/font&gt; if your language has
&lt;tt&gt;break&lt;/tt&gt;, then that guarantee goes out the window and you can
conclude nothing.  Or at the very least your conclusions will become
much more difficult.  You can no longer treat &lt;b&gt;G&lt;/b&gt; atomically; you have
to understand its contents in detail.&lt;p&gt;

So this is where Dijkstra is coming from: features like &lt;tt&gt;break&lt;/tt&gt;&lt;a href=&quot;http://blog.plover.com#fn3&quot;&gt;&lt;sup&gt;[3]&lt;/sup&gt;&lt;/a&gt;
tend to sabotage the benefits of structured programming, and prevent
the programmer from understanding the program as a composition of
independent units.  The other subscriber made a seemingly disparaging
reference to &quot;Dijkstra's idea of structure&quot;, but I hope it is clear
that it was not an arbitrary idea.  Dijkstra's idea of structure is
what will allow you to understand a large program as a collection of
modules.&lt;p&gt;

Regardless of your opinion about formal verification methods, or
correctness proofs, or the practicality of omitting &lt;tt&gt;break&lt;/tt&gt;
from your language, it should at least be clear that Dijkstra was not
being doctrinaire just for the sake of doctrine.&lt;p&gt;

&lt;hr /&gt;

&lt;h3&gt;Some additional notes&lt;/h3&gt;

Here are some interesting peripheral points that I left out of my
main discussion because I wanted to stick to the main point, which
was: &quot;Dijkstra was not insane&quot;.&lt;p&gt;

&lt;ol&gt;




&lt;li&gt;&lt;a name=&quot;fn1&quot;&gt;&lt;/a&gt;I said in an earlier post that &quot;I often find
Dijkstra's innumerable screeds very tiresome in their unkind,
unforgiving, and unrealistic attitudes toward programmers.&quot;  But
despite this, I believe he was a brilliant thinker, and almost every
time he opened his mouth it was to make a carefully-considered
argument.  You may not like him, and you may not agree with him, but
you'll be better off listening to him.&lt;p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.cs.utexas.edu/~EWD/&quot;&gt;An archive of Dijkstra's
miscellaneous notes and essays&lt;/a&gt; (a pre-blogging blog, if you like)
is maintained at the University of Texas.  I recommend it.

&lt;li&gt;&lt;a name=&quot;fn2&quot;&gt;&lt;/a&gt;I said:&lt;p&gt;

&lt;blockquote&gt;
&lt;pre&gt;
                if (q) { E; }
                else { F; }
&lt;/pre&gt;

        Suppose you believe that code &lt;b&gt;E&lt;/b&gt;, given precondition &lt;i&gt;x&lt;/i&gt;,
        is guaranteed to produce postcondition &lt;i&gt;y&lt;/i&gt;.  And suppose you
        believe the same thing about &lt;b&gt;F&lt;/b&gt;.  Then you can conclude the
        same thing about the entire if-else block. &lt;p&gt;
&lt;/p&gt;&lt;/blockquote&gt;

   Actually, your job is slightly easier.  Let's write this:&lt;p&gt;

&lt;blockquote&gt;
        [&lt;i&gt;x&lt;/i&gt;] E [&lt;i&gt;y&lt;/i&gt;]
&lt;/blockquote&gt;

   to mean that code &lt;b&gt;E&lt;/b&gt;, given precondition &lt;i&gt;x&lt;/i&gt;, produces postcondition
   &lt;i&gt;y&lt;/i&gt;.  That is, if we know that &lt;i&gt;x&lt;/i&gt; is true when &lt;b&gt;E&lt;/b&gt; begins execution,
   then we know that &lt;i&gt;y&lt;/i&gt; is true when &lt;b&gt;E&lt;/b&gt; finishes.  Then my quoted
   paragraph above says that from these:&lt;p&gt;

&lt;blockquote&gt;
        [&lt;i&gt;x&lt;/i&gt;] E [&lt;i&gt;y&lt;/i&gt;]&lt;br /&gt;
        [&lt;i&gt;x&lt;/i&gt;] F [&lt;i&gt;y&lt;/i&gt;]
&lt;/blockquote&gt;

   we can conclude this:&lt;p&gt;

&lt;blockquote&gt;
        [&lt;i&gt;x&lt;/i&gt;]    if (&lt;i&gt;q&lt;/i&gt;) {E} else {F}    [&lt;i&gt;y&lt;/i&gt;]
&lt;/blockquote&gt;

   But actually we can make a somewhat stronger statement.  We can
   make the same conclusion from weaker assumptions.  If we believe these:

&lt;blockquote&gt;
                [&lt;i&gt;x&lt;/i&gt; and &lt;i&gt;q&lt;/i&gt;] E [&lt;i&gt;y&lt;/i&gt;]&lt;br /&gt;
                [&lt;i&gt;x&lt;/i&gt; and not &lt;i&gt;q&lt;/i&gt;] F [&lt;i&gt;y&lt;/i&gt;]
&lt;/blockquote&gt;

        then we can conclude this:&lt;p&gt;

&lt;blockquote&gt;
                [&lt;i&gt;x&lt;/i&gt;]    if (&lt;i&gt;q&lt;/i&gt;) {E} else {F}    [&lt;i&gt;y&lt;/i&gt;]
&lt;/blockquote&gt;
        
   In fact this precisely expresses the complete semantics of the
   if-else construction.  Why do we use if-else blocks anyway?  This
   is the reason: we want to be able to write code to guarantee
   something like this: &lt;p&gt;

&lt;blockquote&gt;
        [&lt;i&gt;x&lt;/i&gt;] BLAH [&lt;i&gt;y&lt;/i&gt;]
&lt;/blockquote&gt;

   but we only know how to guarantee

&lt;blockquote&gt;
        [&lt;i&gt;x&lt;/i&gt; and &lt;i&gt;q&lt;/i&gt;] FOO [&lt;i&gt;y&lt;/i&gt;]
&lt;/blockquote&gt;

   and

&lt;blockquote&gt;
        [&lt;i&gt;x&lt;/i&gt; and not &lt;i&gt;q&lt;/i&gt;] BAR [&lt;i&gt;y&lt;/i&gt;]
&lt;/blockquote&gt;

   for some &lt;i&gt;q&lt;/i&gt;.  So we write two blocks of code, each of which
   accomplishes &lt;i&gt;y&lt;/i&gt; under some circumstances, and use if-else to make
   sure that the right one is selected under the right circumstances.&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;/li&gt;

&lt;li&gt;&lt;a name=&quot;fn3&quot;&gt;&lt;/a&gt;Similar to &lt;tt&gt;break&lt;/tt&gt; (but worse), in the presence of &lt;tt&gt;goto&lt;/tt&gt; you are
   on very shaky ground in trying to conclude anything about whether
   the program is correct.  Suppose you know that &lt;b&gt;C&lt;/b&gt; is correct if its
   precondition (an array of URLs) is satisfied.  And you know that &lt;b&gt;B&lt;/b&gt;
   will set up that precondition (that is, the array) if &lt;i&gt;its&lt;/i&gt;
   precondition is satisfied, so it seems like you are all right.  But
   no, because block &lt;b&gt;W&lt;/b&gt; somewhere else might have &lt;tt&gt;goto C;&lt;/tt&gt; and
   transfer control to &lt;b&gt;C&lt;/b&gt; &lt;i&gt;without&lt;/i&gt; setting up the precondition, and
   then &lt;b&gt;C&lt;/b&gt; could cause winged demons to fly out of your nose.&lt;/li&gt;&lt;p&gt;

&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;

&lt;h3&gt;Further reading&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
   For a quick overview, see &lt;a href=&quot;http://en.wikipedia.org/wiki/Hoare_logic&quot;&gt;the Wikipedia article
 on Hoare logic&lt;/a&gt;.  Hoare logic is the
 [&lt;i&gt;x&lt;/i&gt;]&amp;nbsp;E&amp;nbsp;[&lt;i&gt;y&lt;/i&gt;] notation I used above, and a set of
 rules saying how to reason with claims of that form.  For example,
 one rule of Hoare logic defines the meaning of the null statement: if &lt;tt&gt;;&lt;/tt&gt; is the null
 statement, then [&lt;i&gt;p&lt;/i&gt;] ; [&lt;i&gt;p&lt;/i&gt;] for all conditions
 &lt;i&gt;p&lt;/i&gt;.&lt;p&gt;

   Hoare logic was invented by Tony Hoare, who also invented the
 Quicksort algorithm.&lt;p&gt;

&lt;div class=&quot;bookbox&quot;&gt;&lt;table align=&quot;right&quot; width=&quot;14%&quot; border=&quot;1&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;
&lt;font size=&quot;-1&quot;&gt;Order&lt;/font&gt;&lt;br /&gt;
&lt;cite&gt;&lt;font size=&quot;-1&quot;&gt;A Discipline of Programming&lt;/font&gt;&lt;/cite&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/9780132158718&quot;&gt;&lt;img src=&quot;http://www.powells.com/cgi-bin/imageDB.cgi?isbn=9780132158718&quot; border=&quot;0&quot; align=&quot;center&quot; alt=&quot;A Discipline of Programming&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/9780132158718&quot;&gt;&lt;font size=&quot;-1&quot;&gt;with kickback&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/biblio/9780132158718&quot;&gt;&lt;font size=&quot;-1&quot;&gt;no kickback&lt;/font&gt;&lt;/a&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;li&gt;
   For further details, see Dijkstra's book &quot;A Discipline of
   Programming&quot;.  Dijkstra introduces a function called &lt;i&gt;wp&lt;/i&gt; for
   &quot;weakest precondition&quot;.
   Given a piece of code &lt;i&gt;C&lt;/i&gt; and a desired postcondition
   &lt;i&gt;q&lt;/i&gt;, &lt;i&gt;wp&lt;/i&gt;(&lt;i&gt;C&lt;/i&gt;, &lt;i&gt;q&lt;/i&gt;) is the weakest precondition
   that is sufficient for code &lt;i&gt;C&lt;/i&gt; to accomplish &lt;i&gt;q&lt;/i&gt;.  That
   is, it's the minimum prerequisite for &lt;i&gt;C&lt;/i&gt; to accomplish
   &lt;i&gt;q&lt;/i&gt;.  Most of the book is about how to figure out what these
   weakest preconditions are, and, once you know them, how they can
   guide you to through the implementation of your program.&lt;p&gt;

I have an idea that the Dijkstra book might be easier to follow after
   having read this introduction than without it.&lt;p&gt;

&lt;li&gt;No discussion of structured programming and &lt;tt&gt;goto&lt;/tt&gt; is
complete without a mention of Donald Knuth's wonderful paper
&lt;cite&gt;Stuctured Programming with &lt;tt&gt;go to&lt;/tt&gt; Statements&lt;/cite&gt;.
This is my single all-time favorite computer science paper.  &lt;a href=&quot;http://pic.plover.com/knuth-GOTO.pdf&quot;&gt;Download it here&lt;/a&gt;.&lt;p&gt;

&lt;br clear=&quot;right&quot; /&gt;&lt;div class=&quot;bookbox&quot;&gt;&lt;table align=&quot;right&quot; width=&quot;14%&quot; border=&quot;1&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;
&lt;font size=&quot;-1&quot;&gt;Order&lt;/font&gt;&lt;br /&gt;
&lt;cite&gt;&lt;font size=&quot;-1&quot;&gt;Software Tools in Pascal&lt;/font&gt;&lt;/cite&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/9780201103427&quot;&gt;&lt;img src=&quot;http://www.powells.com/cgi-bin/imageDB.cgi?isbn=9780201103427&quot; border=&quot;0&quot; align=&quot;center&quot; alt=&quot;Software Tools in Pascal&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/9780201103427&quot;&gt;&lt;font size=&quot;-1&quot;&gt;with kickback&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/biblio/9780201103427&quot;&gt;&lt;font size=&quot;-1&quot;&gt;no kickback&lt;/font&gt;&lt;/a&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;li&gt;&lt;cite&gt;Software Tools in Pascal&lt;/cite&gt; is a book by Kernighan and
Plauger that tries to translate the tool suite of their earlier
&lt;cite&gt;Software Tools&lt;/cite&gt; book into Pascal.  They were repeatedly
screwed by deficiencies in the Pascal language, and this was the
inspiration for Kernighan's famous &quot;&lt;a href=&quot;http://www.lysator.liu.se/c/bwk-on-pascal.html&quot;&gt;Why Pascal is not my Favorite
Programming Language&lt;/a&gt;&quot; paper.  In effect, &lt;cite&gt;Software Tools in
Pascal&lt;/cite&gt; is a book-length case study of the deficiencies of
Pascal for practical programming tasks.&lt;p&gt;

&lt;/p&gt;&lt;/li&gt;&lt;/p&gt;&lt;/li&gt;&lt;/p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&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;</description>
	<pubDate>Fri, 26 Mar 2010 14:41:00 +0000</pubDate>
</item>
<item>
	<title>mjd: Gray code at the pediatrician's office</title>
	<guid>tag:blog.plover.com,2009:/math/gray-codes</guid>
	<link>http://blog.plover.com/math/gray-codes.html</link>
	<description>&lt;img src=&quot;http://pic.blog.plover.com/math/gray-codes/bin.png&quot; /&gt;
&lt;img src=&quot;http://pic.blog.plover.com/math/gray-codes/gray.png&quot; /&gt;

Last week we took Iris to the pediatrician for a checkup, during which
they weighed, measured, and inoculated her.  The measuring device,
which I later learned is called a stadiometer, had a bracket on a slider that went up and down on a
post.  Iris stood against the post and the nurse adjusted the bracket
to exactly the top of her head.  Then she read off Iris's height from
an attached display.&lt;p&gt;

How did the bracket know exactly what height to report?  This was done
in a way I hadn't seen before.  It had a
photosensor looking at the post, which was printed with this
pattern:&lt;p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;a href=&quot;http://pic.blog.plover.com/math/gray-codes/index200.html&quot;&gt;&lt;img src=&quot;http://pic.blog.plover.com/math/gray-codes/17895976833.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

(Click to view the other pictures I took of the post.)&lt;p&gt;

The pattern is binary numerals.   Each numeral is a certain fraction of
a centimeter high, say 1/4 centimeter.  If the sensor reads the number
433, that means that the bracket is 433/4 = 108.25 cm off the ground,
and so that Iris is 108.25 cm tall.&lt;p&gt;

The patterned strip in the left margin of this article is a
straightforward translation of binary numerals to black and white
boxes, with black representing 1 and white representing 0:&lt;p&gt;

&lt;blockquote&gt;
	0000000000&lt;br /&gt;
	0000000001&lt;br /&gt;
	0000000010&lt;br /&gt;
	0000000011&lt;br /&gt;
	0000000100&lt;br /&gt;
	0000000101&lt;br /&gt;
	0000000101&lt;br /&gt;
	...&lt;br /&gt;
	1111101000&lt;br /&gt;
	1111101001&lt;br /&gt;
	...&lt;br /&gt;
	1111111111&lt;br /&gt;
&lt;/blockquote&gt;

If you are paying attention, you will notice that although the strip
at left is similar to the pattern in the doctor's office, it is not
the same.  That is because the numbers on the post are Gray-coded.&lt;p&gt;

Gray codes solve the following problem with raw binary numbers.
Suppose Iris is close to 104 = 416/4 cm tall, so that the photosensor is in
the following region of the post:&lt;p&gt;

&lt;blockquote&gt;
	...&lt;br /&gt;
	0110100001  (417)&lt;br /&gt;
	0110100000  (416)&lt;br /&gt;
	0110011111  (415)&lt;br /&gt;
	0110011110  (414)&lt;br /&gt;
	...&lt;br /&gt;
&lt;/blockquote&gt;

But suppose that the sensor (or the post) is slightly mis-aligned, so
that instead of properly reading the (416) row, it reads the first
half of the (416) row and last half of the (415) row.  That makes
0110111111, which is 447 = 111.75 cm, an error of almost 7.5%.
(That's three inches, for my American and Burmese readers.)  Or the
error could go the other way: if the sensor reads the first half of
the (415) and the second half of the (416) row, it will see 0110000000
= 384 = 96 cm.&lt;p&gt;

Gray code is a method for encoding numbers in binary so that each
numeral differs from the adjacent ones in only one position:&lt;p&gt;

&lt;blockquote&gt;
	0000000000&lt;br /&gt;
	000000000&lt;b&gt;1&lt;/b&gt;&lt;br /&gt;
	00000000&lt;b&gt;1&lt;/b&gt;1&lt;br /&gt;
	000000001&lt;b&gt;0&lt;/b&gt;&lt;br /&gt;
	0000000&lt;b&gt;1&lt;/b&gt;10&lt;br /&gt;
	000000011&lt;b&gt;1&lt;/b&gt;&lt;br /&gt;
	00000001&lt;b&gt;0&lt;/b&gt;1&lt;br /&gt;
	000000010&lt;b&gt;0&lt;/b&gt;&lt;br /&gt;
	000000&lt;b&gt;1&lt;/b&gt;100&lt;br /&gt;
	...&lt;br /&gt;
	100001&lt;b&gt;1&lt;/b&gt;100&lt;br /&gt;
	100001110&lt;b&gt;1&lt;/b&gt;&lt;br /&gt;
	...&lt;br /&gt;
	100000000&lt;b&gt;0&lt;/b&gt;&lt;br /&gt;
&lt;/blockquote&gt;

This is the pattern from the post, which you can also see at the right
of this article.&lt;p&gt;

Now suppose that the mis-aligned sensor reads part of the (416) line and
part of the (417) line.  With ordinary binary coding, this could
result in an error of up to 7.75 cm.  (And worse errors for children
of other heights.)  But with Gray coding no error results from the
misreading:  &lt;p&gt;

&lt;blockquote&gt;
	...&lt;br /&gt;
0101110000  (417)&lt;br /&gt;
0101010000  (416)&lt;br /&gt;
0101010001  (415)&lt;br /&gt;
0101010011  (414)&lt;br /&gt;
	...&lt;br /&gt;
&lt;/blockquote&gt;

No matter what parts of 0101110000 and 0101110001 are stitched
together, the result is always either 416 or 417.  &lt;p&gt;





Converting from Gray code to standard binary is easy: take the binary
expansion, and invert every bit that is immediately to the right of a
1 bit.  For example, in 1&lt;font color=&quot;red&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;0&lt;/font&gt;1&lt;font color=&quot;red&quot;&gt;0&lt;/font&gt;00, each red bit is to the right of a
1, and so is inverted to obtain the Gray code 1&lt;font color=&quot;red&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;1&lt;/font&gt;1&lt;font color=&quot;red&quot;&gt;1&lt;/font&gt;00.  &lt;p&gt;

Converting back is also easy: 
of the Gray code.  Replace every sequence of the form 1000...01
with 1111...10; also replace 1000... with 1111... if it appears at the
end of the code. For
example, Gray code &lt;font color=&quot;red&quot;&gt;100001&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;11&lt;/font&gt;00 contains two such sequences, &lt;font color=&quot;red&quot;&gt;100001&lt;/font&gt; and &lt;font color=&quot;blue&quot;&gt;11&lt;/font&gt;, which are
replaced with &lt;font color=&quot;red&quot;&gt;111110&lt;/font&gt; and &lt;font color=&quot;blue&quot;&gt;10&lt;/font&gt;, to give &lt;font color=&quot;red&quot;&gt;111110&lt;/font&gt;&lt;font color=&quot;blue&quot;&gt;10&lt;/font&gt;00.  &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;</description>
	<pubDate>Fri, 26 Mar 2010 14:41:00 +0000</pubDate>
</item>
<item>
	<title>mjd: Haskell logo fail</title>
	<guid>tag:blog.plover.com,2009:/prog/haskell/logo</guid>
	<link>http://blog.plover.com/prog/haskell/logo.html</link>
	<description>The Haskell folks have chosen a new logo.&lt;p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://pic.blog.plover.com/prog/haskell/logo/haskell.png&quot; /&gt;&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://pic.blog.plover.com/prog/haskell/logo/amtrak.jpg&quot; /&gt;&lt;/p&gt;

Ouch.&lt;p&gt;&lt;/p&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 26 Mar 2010 14:41:00 +0000</pubDate>
</item>
<item>
	<title>mjd: A child is bitten by a dog every 0.07 seconds...</title>
	<guid>tag:blog.plover.com,2009:/math/dog-bites</guid>
	<link>http://blog.plover.com/math/dog-bites.html</link>
	<description>&lt;a href=&quot;http://www.fedsmith.com/article/1995/&quot;&gt;I read in the
newspaper today&lt;/a&gt; that letter carriers were bitten by dogs 3,000
times last year.  (Curiously, this is not a round number; &lt;a href=&quot;http://www.usps.com/cpim/ftp/bulletin/2009/pb22258/html/dogbite_003.html&quot;&gt;it
is exact&lt;/a&gt;.)  The article then continued: &quot;children ... are 900
times more likely to be bitten than letter carriers.&quot; &lt;p&gt;

This is obviously nonsense, because suppose the post office employs
half a million letter carriers.  (The actual number is actually about
half that, but we are doing a back-of-the-envelope estimate of
plausibility.)  Then the bite rate is six bites per thousand letter
carriers per year, and if children are 900 times more likely to be
bitten, they are getting bitten at a rate of 5,400 bites per thousand
children per year, or 5.4 bites per child.  Insert your own joke here,
or use the prefabricated joke framework in the title of this
article. &lt;p&gt;

I wrote to the reporter, who attributed the claim to the &lt;cite&gt;&lt;a href=&quot;http://www.usps.com/cpim/ftp/bulletin/2009/pb22258/html/dogbite_004.html&quot;&gt;Postal
Bulletin 22258&lt;/a&gt;&lt;/cite&gt; of 7 May 2009.  It does indeed appear there.
&lt;!-- It also appears, identically, in PB 22179 of 27 April, 2006
(http://www.usps.com/cpim/ftp/bulletin/2006/html/pb22179/pb6ktxt.html)
--&gt; I am trying to track down the ultimate source, but I suspect I
will not get any farther.  I have discovered that the &quot;900 times&quot;
figure appears in the Post Office's annual announcements of Dog Bite
Prevention Month &lt;a href=&quot;http://www.usps.gov/communications/news/stamps/2004/sr04_032.htm&quot;&gt;as
far back as 2004&lt;/a&gt;, but &lt;a href=&quot;http://www.usps.com/news/2002/press/pr02_039.htm&quot;&gt;not as far
back as 2002&lt;/a&gt;.  &lt;p&gt;

Meantime, what are the correct numbers?&lt;p&gt;

The Centers for Disease Control and Prevention have &lt;a href=&quot;http://webappa.cdc.gov/sasweb/ncipc/nfirates2001.html&quot;&gt;a superb
on-line database of injury data&lt;/a&gt;.  It immediately delivers the
correct numbers for dog bite rate among children:&lt;p&gt;

&lt;table align=&quot;center&quot; cellspacing=&quot;0&quot;&gt;
&lt;tr&gt;&lt;th&gt;Age&lt;th&gt;Number of&lt;br /&gt;injuries&lt;th&gt;Population&lt;th&gt;Rate per&lt;br /&gt;100,000
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;0  &lt;td align=&quot;right&quot;&gt;2,302    &lt;td align=&quot;right&quot;&gt;4,257,020  &lt;td align=&quot;right&quot;&gt;54.08
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;1 &lt;td align=&quot;right&quot;&gt;7,100    &lt;td align=&quot;right&quot;&gt;4,182,171 &lt;td align=&quot;right&quot;&gt;169.77
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;2 &lt;td align=&quot;right&quot;&gt;10,049   &lt;td align=&quot;right&quot;&gt;4,110,458 &lt;td align=&quot;right&quot;&gt;244.47
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;3 &lt;td align=&quot;right&quot;&gt;10,355   &lt;td align=&quot;right&quot;&gt;4,111,354 &lt;td align=&quot;right&quot;&gt;251.86
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;4 &lt;td align=&quot;right&quot;&gt;9,920    &lt;td align=&quot;right&quot;&gt;4,063,122 &lt;td align=&quot;right&quot;&gt;244.15
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;5 &lt;td align=&quot;right&quot;&gt;7,915    &lt;td align=&quot;right&quot;&gt;4,031,709 &lt;td align=&quot;right&quot;&gt;196.32
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;6 &lt;td align=&quot;right&quot;&gt;8,829    &lt;td align=&quot;right&quot;&gt;4,089,126 &lt;td align=&quot;right&quot;&gt;215.91
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;7 &lt;td align=&quot;right&quot;&gt;6,404    &lt;td align=&quot;right&quot;&gt;3,935,663 &lt;td align=&quot;right&quot;&gt;162.72
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;8 &lt;td align=&quot;right&quot;&gt;8,464   &lt;td align=&quot;right&quot;&gt;3,891,755        &lt;td align=&quot;right&quot;&gt;217.48
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;9  &lt;td align=&quot;right&quot;&gt;8,090   &lt;td align=&quot;right&quot;&gt;3,901,375        &lt;td align=&quot;right&quot;&gt;207.36
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;10  &lt;td align=&quot;right&quot;&gt;7,388   &lt;td align=&quot;right&quot;&gt;3,927,298        &lt;td align=&quot;right&quot;&gt;188.11
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;11  &lt;td align=&quot;right&quot;&gt;6,501   &lt;td align=&quot;right&quot;&gt;4,010,171        &lt;td align=&quot;right&quot;&gt;162.11
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;12  &lt;td align=&quot;right&quot;&gt;7,640   &lt;td align=&quot;right&quot;&gt;4,074,587        &lt;td align=&quot;right&quot;&gt;187.49
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;13  &lt;td align=&quot;right&quot;&gt;5,876   &lt;td align=&quot;right&quot;&gt;4,108,962        &lt;td align=&quot;right&quot;&gt;142.99
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;14  &lt;td align=&quot;right&quot;&gt;4,720   &lt;td align=&quot;right&quot;&gt;4,193,291        &lt;td align=&quot;right&quot;&gt;112.56
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;15  &lt;td align=&quot;right&quot;&gt;5,477   &lt;td align=&quot;right&quot;&gt;4,264,883        &lt;td align=&quot;right&quot;&gt;128.42
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;16  &lt;td align=&quot;right&quot;&gt;4,379   &lt;td align=&quot;right&quot;&gt;4,334,265        &lt;td align=&quot;right&quot;&gt;101.03
&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;17  &lt;td align=&quot;right&quot;&gt;4,459   &lt;td align=&quot;right&quot;&gt;4,414,523        &lt;td align=&quot;right&quot;&gt;101.01
&lt;tr&gt;&lt;td&gt;&lt;i&gt;Total&lt;/i&gt;  &lt;td align=&quot;right&quot;&gt;133,560   &lt;td align=&quot;right&quot;&gt;82,361,752        &lt;td align=&quot;right&quot;&gt;162.16
&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/th&gt;&lt;/th&gt;&lt;/th&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;

According to the &lt;a href=&quot;http://www.usps.com/financials/anrpt08/pg64.htm&quot;&gt;USPS 2008
Annual Report&lt;/a&gt;, in 2008 the USPS employed 211,661 city delivery
carriers and 68,900 full-time rural delivery carriers, a total of
280,561.  Since these 280,561 carriers received 3,000 dog bites, the
rate per 100,000 carriers per year is 1069.29 bites.&lt;p&gt;

So the correct statistic is not that children are 900 times more
likely than carriers to be bitten, but rather that carriers are 6.6
times as likely as children to be bitten, 5.6 times if you 
consider only children under 13.  Incidentally, your toddler's chance
of being bitten in the course of a year is only about a quarter of a
percent, ceteris paribus.&lt;p&gt;

Where did 900 come from?  I have no idea.  &lt;p&gt; There are 293 times as
many children as there are letter carriers, and they received a total
of 44.5 times as many bites.  The &quot;900&quot; figure is &lt;a href=&quot;http://www.google.com/search?q=%22900+times+more+likely+to+be+bitten%22&quot;&gt;all
over the Internet&lt;/a&gt;, despite being utterly wrong.  Even with extensive
searching, I was not able to find this factoid in the brochures or
reports of any other reputable organization, including the American Veterinary
Medical Association, the American Academy of Pediatrics, the Centers
for Disease Control and Prevention, or the Humane Society of the
Uniited States.  It appears to be the invention of the USPS.&lt;p&gt;

Also in the same newspaper, the new Indian restaurant on Baltimore
avenue was advertising that they &quot;specialize in vegetarian and
non-vegetarian food&quot;.  It's just a cornucopia of stupidity today,
isn't it?  &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;</description>
	<pubDate>Fri, 26 Mar 2010 14:41:00 +0000</pubDate>
</item>
<item>
	<title>mjd: Periodicity</title>
	<guid>tag:blog.plover.com,2009:/misc/sunspots</guid>
	<link>http://blog.plover.com/misc/sunspots.html</link>
	<description>&lt;table align=&quot;center&quot;&gt;
&lt;tr&gt;&lt;td&gt;The number of crank dissertations
&lt;tr&gt;&lt;td&gt;&amp;emsp;dealing with the effects of sunspots
&lt;tr&gt;&lt;td&gt;on political and economic events
&lt;tr&gt;&lt;td&gt;&amp;emsp;peaks every eleven years. 
&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
	<pubDate>Fri, 26 Mar 2010 14:41:00 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: HTML5 has custom data attributes</title>
	<guid>http://yonkeltron.com/?p=627</guid>
	<link>http://yonkeltron.com/2010/03/25/html5-has-custom-data-attributes/</link>
	<description>&lt;p&gt;So, I know that the &lt;a href=&quot;http://microformats.org/&quot;&gt;Microformats&lt;/a&gt; project has has varying degrees of success in their endeavor to embed data in HTML such that it does not violate web standards.  As &lt;a href=&quot;http://ejohn.org/blog/html-5-data-attributes/&quot;&gt;John Resig pointed out&lt;/a&gt;, others have used things like XML namespacing in XHTML to achieve similar goals. The most notable usages of this technique are most likely to be found in the &lt;a href=&quot;http://www.w3.org/TR/xhtml-rdfa-scenarios/&quot;&gt;applications&lt;/a&gt; of &lt;a href=&quot;http://en.wikipedia.org/wiki/RDFa&quot;&gt;RDFa&lt;/a&gt;. However, when looking at the new &lt;a href=&quot;http://blog.solnic.eu/2009/09/08/unobtrusive-javascript-helpers-in-rails-3&quot;&gt;unobtrusive JavaScript helpers&lt;/a&gt; in the forthcoming Rails 3, I was tipped off to the huge scope of the new data- attributes in &lt;a href=&quot;http://html5.org/&quot;&gt;HTML5&lt;/a&gt;. The custom data- attributes excite me.&lt;/p&gt;
&lt;p&gt;In HTML5, including any arbitrary attribute may be included in any element provided that it is prefixed with data- and doesn&amp;#8217;t interfere with the rest of the standard. Anything. So I can do the following and have it be perfectly valid:&lt;/p&gt;
&lt;pre&gt;&amp;lt;div data-panda=&quot;bamboo&quot;&amp;gt; Whatever &amp;lt;div&amp;gt;&lt;/pre&gt;
&lt;p&gt;How awesome is that?&lt;/p&gt;</description>
	<pubDate>Thu, 25 Mar 2010 15:16:35 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Rails + Merb = Rails 3</title>
	<guid>http://yonkeltron.com/?p=622</guid>
	<link>http://yonkeltron.com/2010/03/17/rails-merb-rails-3/</link>
	<description>&lt;p&gt;I&amp;#8217;m rather excited about this. Saw this talk &lt;a href=&quot;http://www.infoq.com/presentations/katz-rails3&quot;&gt;right here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oh, and then there&amp;#8217;s &lt;a href=&quot;http://blog.rubybestpractices.com/posts/gregory/022-rbp-now-open.html&quot;&gt;this&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Wed, 17 Mar 2010 16:39:49 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: gudev-sharp is born!</title>
	<guid>http://www.lamalex.net/?p=49</guid>
	<link>http://www.lamalex.net/2010/03/gudev-sharp-is-born/</link>
	<description>&lt;p&gt;In some of my spare time I&amp;#8217;m working on &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=612616&quot;&gt;modernizing Banshee&amp;#8217;s hardware support&lt;/a&gt; (all the while lamenting the death of HAL). With HAL we had a nice (although monolithic) toolkit-agnostic hardware layer that was used through dbus. HAL was deprecated in favor of using udev, which is the the Kernel&amp;#8217;s hardware event system. I&amp;#8217;m sure udev is much nicer from an engineering point of view, but it&amp;#8217;s certainly not as nice for application developers as a big old dbus-interface where any information about hardware could be retrieved was. Regardless of how I feel about HAL, HAL is still gone, so Banshee still needs updated to udev. Since udev is so new, no one had made C# bindings for libgudev yet, so I decided to take a stab at using GAPI to generate C# bindings. After hours of talking to myself in irc, trying to trick RAOF into doing my work for me, &lt;a href=&quot;https://launchpad.net/gudev-sharp&quot;&gt;gudev-sharp is born&lt;/a&gt;! It just successfully ran the (incredibly simple) &lt;a href=&quot;http://bazaar.launchpad.net/~alexlauni/gudev-sharp/trunk/annotate/head:/samples/TestGUDev.cs&quot;&gt;test code&lt;/a&gt; I wrote just to make sure it wouldn&amp;#8217;t segfault. If you&amp;#8217;re interested in modern hardware support via C#, help write unit tests!&lt;/p&gt;
&lt;p&gt;I know some people are going to say &amp;#8220;bzr? launchpad? And you want this adopted?&amp;#8221;. It can move whenever it needs to, LP and bzr are my tools of choice, but if upstream Mono wants to move this into svn, I&amp;#8217;d be happy to see it go.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/simpsons-segfault.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-51&quot; title=&quot;simpsons-segfault&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/simpsons-segfault.png&quot; alt=&quot;&quot; width=&quot;512&quot; height=&quot;410&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 15 Mar 2010 04:57:22 +0000</pubDate>
</item>
<item>
	<title>mikegrb: Task Management with Hiveminder and Perl</title>
	<guid>http://michael.thegrebs.com/?p=247</guid>
	<link>http://michael.thegrebs.com/2010/03/13/task-management-with-hiveminder-and-perl/</link>
	<description>&lt;p&gt;This is how I manage my tasks with &lt;a href=&quot;http://hiveminder.com/&quot;&gt;Hiveminder&lt;/a&gt; on a weekly basis and the Perl script that helps me do it.  I don&amp;#8217;t really expect the Perl script to be useful to anyone as-is but portions of it may be useful to others, as well as the general work flow, so I&amp;#8217;ve decided to share them.&lt;/p&gt;
&lt;p&gt;At &lt;a href=&quot;http://www.linode.com/&quot;&gt;Linode&lt;/a&gt; we have a wiki page where we list 5 or more tasks we wish to accomplish during the week.  There is a heading for each employee and below the heading we place our tasks.   Throughout the week we can add additional tasks or mark existing ones as done.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve used &lt;a href=&quot;http://hiveminder.com/&quot;&gt;Hiveminder&lt;/a&gt; for some time.  When we started the weekly task lists at &lt;a href=&quot;http://www.linode.com/&quot;&gt;Linode&lt;/a&gt; I found that taking a few minutes to figure out which tasks I wish to complete in the coming week works quite well for me.  I started marking these tasks with the &amp;#8216;week&amp;#8217; tag in &lt;a href=&quot;http://hiveminder.com/&quot;&gt;Hiveminder&lt;/a&gt;.  I quickly ended up writing a perl script, &lt;a href=&quot;http://thegrebs.com/~michael/tasks/week.txt&quot;&gt;week.pl&lt;/a&gt;, to help me manage hem.&lt;/p&gt;
&lt;h3&gt;My Weekly Workflow&lt;/h3&gt;
&lt;p&gt;First thing Monday morning I run:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container text vibrant&quot;&gt;&lt;div class=&quot;text codecolorer&quot;&gt;$ week.pl report&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This prints a report with two sections.  The first section lists tasks that currently have the &amp;#8216;week&amp;#8217; tag with a line through the task ID if it is completed.  This gives me a nice summary of what I planned on accomplishing the previous week and how I did.  The second section lists all of my tasks currently visible in &lt;a href=&quot;http://hiveminder.com/&quot;&gt;Hiveminder&lt;/a&gt;.  I hide tasks that I know I&amp;#8217;m not going to work on in the next few weeks so this list is usually no more than 20 or 30 items.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://thegrebs.com/~michael/tasks/report.png&quot; height=&quot;260&quot; width=&quot;334&quot; alt=&quot;Sample report Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I take this report into the Monday morning meeting with me.  During the meeting, I&amp;#8217;ll glance over this list and select items for the upcoming week.  I also use this page to take notes on during the meeting, writing down any new tasks that come up in the meeting.&lt;/p&gt;
&lt;p&gt;After the meeting, I add any new tasks generated in the meeting that I won&amp;#8217;t be working on this week to &lt;a href=&quot;http://hiveminder.com/&quot;&gt;Hiveminder&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container text vibrant&quot;&gt;&lt;div class=&quot;text codecolorer&quot;&gt;$ todo.pl braindump&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;tt&gt;todo.pl&lt;/tt&gt; comes from &lt;a href=&quot;http://search.cpan.org/~alexmv/App-Todo-0.97/bin/todo.pl&quot;&gt;App::Todo&lt;/a&gt;, a command line &lt;a href=&quot;http://hiveminder.com/&quot;&gt;Hiveminder&lt;/a&gt; interface.  The braindump command launches $EDITOR where I add new tasks, one per line.  The &lt;a href=&quot;http://hiveminder.com/help/reference/tasklists/braindump.html&quot;&gt;braindump syntax&lt;/a&gt; allows for specifying tags, setting priorities, and other things as well.&lt;/p&gt;
&lt;p&gt;Next, I prepare the task list for the upcoming week:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container text vibrant&quot;&gt;&lt;div class=&quot;text codecolorer&quot;&gt;$ week.pl edit&lt;br /&gt;
Carry over the following tasks?&lt;br /&gt;
bring about world peace (y or n) [default y] y&lt;br /&gt;
write some awesome pre&lt;br /&gt;
do some other cool stuff&lt;br /&gt;
create practical cold fusion (y or n) [default y] n&lt;br /&gt;
return library book&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;tt&gt;edit&lt;/tt&gt; command iterates over each task tagged with &amp;#8216;week&amp;#8217; if  the task is not marked completed. It prompts whether or not I wish to carry the task over to this week (leave the tag). Any tasks marked completed have the tag removed automatically.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container text vibrant&quot;&gt;&lt;div class=&quot;text codecolorer&quot;&gt;$ week.pl add&lt;br /&gt;
Created:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #YRVK write an awesome report for Tom [week dev]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #YRVL test some new stuff for deployment [week admin]&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;tt&gt;add&lt;/tt&gt; command works the same as todo.pl&amp;#8217;s braindump command except the &amp;#8216;week&amp;#8217; tag is automatically applied to the newly created tasks.  The full braindump syntax is available for specifying other properties of the tasks.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container text vibrant&quot;&gt;&lt;div class=&quot;text codecolorer&quot;&gt;$ week.pl update https://path.to.trac/wiki/Tasks/2010-03-15&lt;br /&gt;
Sup dawg, I heard you like tasks so I did ur shit for you&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;tt&gt;update&lt;/tt&gt; command grabs my tasks tagged with &amp;#8216;week&amp;#8217; and formats them one per line started with &amp;#8216; * &amp;#8216;, a wiki bullet list.  It grabs the current wiki page, finds my heading, substitutes the formatted task list under the heading, and submits the change.  It also stores the path given in the YAML config file.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container text vibrant&quot;&gt;&lt;div class=&quot;text codecolorer&quot;&gt;$week.pl go&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This opens the stored URL for this week&amp;#8217;s tasks wiki page in my default browser, allowing me to confirm week.pl did what it&amp;#8217;s supposed to.&lt;/p&gt;
&lt;p&gt;Later in the week once I&amp;#8217;ve done something:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container text vibrant&quot;&gt;&lt;div class=&quot;text codecolorer&quot;&gt;$ week.pl done tom&lt;br /&gt;
#YH7T bring about world peace [dev week]&lt;br /&gt;
#YRVL test some new stuff for deployment [week admin]&lt;br /&gt;
[DONE] #YRVK write an awesome report for Tom [week dev]&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This retrieves the task(s) tagged &amp;#8216;week&amp;#8217; that are not marked completed containing the given string.  If there was only one match, the script marks it as done and then outputs the current state of tasks tagged &amp;#8216;week&amp;#8217;.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container text vibrant&quot;&gt;&lt;div class=&quot;text codecolorer&quot;&gt;$ week.pl update&lt;br /&gt;
Sup dawg, I heard you like tasks so I did ur shit for you&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Same as &lt;tt&gt;update&lt;/tt&gt; before, except when no URL is given, the URL is read from the configuration file.  This way I only need to worry about the URL once per week, the first time I update for the week.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;So there you have it.  If you are also using &lt;a href=&quot;http://hiveminder.com/&quot;&gt;Hiveminder&lt;/a&gt;, maybe aspects of my work flow will make sense for you and pieces of the Perl script may be useful.  If you aren&amp;#8217;t using &lt;a href=&quot;http://hiveminder.com/&quot;&gt;Hiveminder&lt;/a&gt;, maybe you will be inspired to check it out.  I use michael@thegrebs.com on &lt;a href=&quot;http://hiveminder.com/&quot;&gt;Hiveminder&lt;/a&gt; in case you feel the need to assign me a task or wish to gift me another year of Hiveminder Pro ;)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://thegrebs.com/~michael/tasks/week.txt&quot;&gt;week.pl&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 13 Mar 2010 23:08:25 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Enthusiasts talk shop casually</title>
	<guid>http://yonkeltron.com/?p=620</guid>
	<link>http://yonkeltron.com/2010/03/08/enthusiasts-talk-shop-casually/</link>
	<description>&lt;p&gt;I spent some time with a few colleagues yesterday and came to the conclusion that true enthusiasts gravitate toward talking shop with one another. This is true even of casual situations. I&amp;#8217;ve had plenty of &amp;#8220;getting to know you&amp;#8221; and &amp;#8220;let&amp;#8217;s just hang&amp;#8221; social situations with other geeks where we might start out talking about any old thing but end up having an enthusiastic exchange about computers. I don&amp;#8217;t view this is as negative. On the other hand,  plenty of mailing lists and other communication media devoted to discussions of specific topics end up going &amp;#8220;off-topic&amp;#8221; as people socialize more generally. Fine, so it goes both ways.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s good to love what you love and even better to share it.&lt;/p&gt;</description>
	<pubDate>Mon, 08 Mar 2010 18:22:15 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Docky has been removed from Do!</title>
	<guid>http://www.lamalex.net/?p=37</guid>
	<link>http://www.lamalex.net/2010/03/docky-has-been-removed-from-do/</link>
	<description>&lt;p&gt;Tonight I finally pushed the revisions to bzr that removed Docky from the Do source tree. For a while now Docky has been being developed as a stand alone application separate from Do. The two projects were limiting one another, so a decision was made to split them out. In the future there will be some of docky &amp;lt;&amp;#8211;&amp;gt; do integration, but for now Docky is going to be the most kick ass Dock you&amp;#8217;ve ever seen, and Do is going to be the most kickass launcher/everything-else-do-does you&amp;#8217;ve ever seen.&lt;/p&gt;
&lt;p&gt;In Ubuntu Lucid you can install Docky from the software center, otherwise the source is available at &lt;a href=&quot;http://launchpad.net/docky&quot;&gt;http://launchpad.net/docky&lt;/a&gt;. Today is the start of a new day in Do, development is going to start rolling again, and there should be a new kick ass release in the coming months. We&amp;#8217;ve let things slide, but we&amp;#8217;re kicking it back into gear.&lt;/p&gt;</description>
	<pubDate>Mon, 08 Mar 2010 03:00:10 +0000</pubDate>
</item>

</channel>
</rss>
