<?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>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: March record scores!</title>
	<guid>http://www.lamalex.net/?p=39</guid>
	<link>http://www.lamalex.net/2010/03/march-record-scores/</link>
	<description>&lt;p&gt;It&amp;#8217;s the 14th already, and I actually blew through my record budget within the first week. I would have made this post earlier but&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I was a little embarrassed I blew through my record budget within the first week&lt;/li&gt;
&lt;li&gt;I was waiting for a record to come in from the Czech Republic&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So here they are, in all of their beautiful waxy glory.&lt;/p&gt;

&lt;a href=&quot;http://www.lamalex.net/2010/03/march-record-scores/img_2838/&quot; title=&quot;Elemental - Lucifer&amp;#039;s Children&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/IMG_2838-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;Elemental - Lucifer&amp;#039;s Children&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.lamalex.net/2010/03/march-record-scores/img_2836/&quot; title=&quot;Anima Morte/Hooded Menace split&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/IMG_2836-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;Anima Morte/Hooded Menace split&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.lamalex.net/2010/03/march-record-scores/img_2834/&quot; title=&quot;Leather - Anchorite&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/IMG_2834-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;Leather - Anchorite&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.lamalex.net/2010/03/march-record-scores/img_2833/&quot; title=&quot;Killing Joke&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/IMG_2833-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;Killing Joke&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.lamalex.net/2010/03/march-record-scores/img_2832/&quot; title=&quot;Sisters of Mercy - Floodlands&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/IMG_2832-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;Sisters of Mercy - Floodlands&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.lamalex.net/2010/03/march-record-scores/img_2830/&quot; title=&quot;Bauhaus - Press Eject and Give Me the Tape&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/03/IMG_2830-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;Bauhaus - Press Eject and Give Me the Tape&quot; /&gt;&lt;/a&gt;

&lt;ol&gt;
&lt;li&gt;Eternal &amp;#8211; Lucifer&amp;#8217;s Children: Electric Wizard side project band!! X/500!&lt;/li&gt;
&lt;li&gt;Anima Morte/Hooden Menace split picture disc! X/500&lt;/li&gt;
&lt;li&gt;Leather &amp;#8211; Ancorite. I don&amp;#8217;t know how many of these there are, but I got a test press!&lt;/li&gt;
&lt;li&gt;Killing Joke s/t&lt;/li&gt;
&lt;li&gt;Sisters of Mercy &amp;#8211; Floodland&lt;/li&gt;
&lt;li&gt;Bauhaus &amp;#8211; Press Eject and ﻿Give Me the Tape&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Not bad for $50 right? The Eternal record is killer, I saw the artwork in the record store and it struck me as Electric Wizard like, so I picked it up, brought it home, and found out a) it&amp;#8217;s rare b) it&amp;#8217;s pre-electric wizard c) IT&amp;#8217;S HEAVY&lt;/p&gt;</description>
	<pubDate>Mon, 15 Mar 2010 15:42:39 +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>
<item>
	<title>Alex Launi: Anything but the buttons, or how I learned to stop clicking and love Do</title>
	<guid>http://www.lamalex.net/?p=25</guid>
	<link>http://www.lamalex.net/2010/03/anything-but-the-buttons/</link>
	<description>&lt;p&gt;I know this is &lt;a href=&quot;http://leftyfb.com/2010/03/05/anything-but-the-buttons-redux/&quot;&gt;a&lt;/a&gt; &lt;a href=&quot;http://blog.daviey.com/blogroll/anything-but-the-buttons.html&quot;&gt;controversial&lt;/a&gt; &lt;a href=&quot;http://www.jonobacon.org/2010/03/03/refreshing-the-ubuntu-brand/#comments&quot;&gt;opinion&lt;/a&gt;, but I want to be one of the few to publicly announce that they love the window controls on the left side of the window. They&amp;#8217;re so slick looking! It takes about 10 minutes to adjust to the change, but the beauty is worth it. A very small price to pay for a major improvement of the look and feel of the desktop.&lt;/p&gt;
&lt;p&gt;Now, for those who don&amp;#8217;t &lt;em&gt;want&lt;/em&gt; to adjust (which is fine, really!) I have a prescription for what ails you. Yes, this is a shameless plug, no this is not snake oil. This is real jawn which will make your left-side-window-controlled hell-of-a-life into the garden of eden you never dreamed it could be. 40 virgins? No.. Jimmy Hendrix and Neil Peart (yeah, I know he&amp;#8217;s not dead, just bear with me) jam sessions? No&amp;#8230; This isn&amp;#8217;t religion, magic, mysticism, mass hysteria, or Minnesota swap gas. This the &lt;a href=&quot;http://do.davebsd.com&quot;&gt;Do&lt;/a&gt; window manager plugin.﻿&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
No video support? Try youtube.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=avfXBG-XPms&quot;&gt;And here&amp;#8217;s a youtube version, if you&amp;#8217;re not down with HTML5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can install it from &lt;a href=&quot;apt://gnome-do&quot;&gt;apt://gnome-do&lt;/a&gt; and &lt;a href=&quot;apt://﻿gnome-do-plugins&quot;&gt;apt://﻿gnome-do-plugins&lt;/a&gt;. Thw window manager plugin is enabled by default in Lucid (and maybe Karmic?)!&lt;/p&gt;</description>
	<pubDate>Sun, 07 Mar 2010 20:00:34 +0000</pubDate>
</item>
<item>
	<title>Paul Snyder: An Emacs Bisection</title>
	<guid>http://www.pataprogramming.com/?p=124</guid>
	<link>http://www.pataprogramming.com/2010/03/an-emacs-bisection/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/knowprose/101872870/&quot;&gt;&lt;img class=&quot;size-full wp-image-126 alignright&quot; title=&quot;practical debugging&quot; src=&quot;http://www.pataprogramming.com/wp-content/cricket.jpg&quot; alt=&quot;cricket on a screen&quot; width=&quot;240&quot; height=&quot;180&quot; /&gt;&lt;/a&gt;A problem has been following me around for a couple of years.  Emacs, in which I have been spending more than a small portion of my time, has had a problem that would manifest in any non-X mode.  It persisted across multiple terminals: putty on Windows back to a Linux box, &lt;code&gt;emacs -nw&lt;/code&gt; in a GNOME Terminal , even a bog-standard Linux console.  Specifically, hitting &amp;#8216;Page Up&amp;#8217; and would result in the string &amp;#8216;&lt;code&gt;5~&lt;/code&gt;&amp;#8216; being printed and &amp;#8216;Page Down&amp;#8217; would result in &lt;code&gt;'6~&lt;/code&gt;&amp;#8216;.  Not deadly, but just enough to throw me off my stride when moving around files.  I&amp;#8217;d never gotten around to sorting in out, since it worked just fine when running as an X server.&lt;/p&gt;
&lt;p&gt;This came up after the PLUG meeting last night, over pizza and beer at the Best House last night.  As Walt pointed out, there was almost certainly a very good reason for this, and it would be living somewhere in the years of messy accretions that comprise my &lt;code&gt;.emacs&lt;/code&gt; file and its satellites.&lt;/p&gt;
&lt;p&gt;I knew this was probably the case.  Like most &lt;code&gt;.emacs&lt;/code&gt; files, mine was not planned.  It grew from bits and useful snippets, mode hooks, random configurations, pieces that crept in as distribution cruft, and pastings of now-unknown provenance.  The whole morass needs a good mucking out, but that&amp;#8217;s not on the to-do list.  Perhaps, though, I could finally get the nagging problem resolved.&lt;/p&gt;
&lt;p&gt;The first test was an obvious one: remove all the startup files and see if the problem went away.&lt;/p&gt;
&lt;p&gt;Now, at some point I acquired a set of XEmacs startup files.  The reason for this is hazy&amp;#8230;I haven&amp;#8217;t used XEmacs in years.  Nonetheless, there it is: an &lt;code&gt;.xemacs&lt;/code&gt; folder with an &lt;code&gt;init.el&lt;/code&gt; and &lt;code&gt;custom.el&lt;/code&gt;.  At some point, something broke when I tried to take my &lt;code&gt;.emacs&lt;/code&gt; file and &lt;code&gt;.emacs.d&lt;/code&gt; folder without bringing &lt;code&gt;.xemac&lt;/code&gt;s along for the ride, so the path of least resistance was to let it follow me from machine to machine ever since.&lt;/p&gt;
&lt;p&gt;After renaming all the startup files, the problem was indeed gone and I could happily page up and down.  From there on, the process is a mechanical one: add files back in until it fails, then comment everything out in the file and add chunks back in until the problem returns.  Once it does, you can be pretty sure you&amp;#8217;ve isolated the problem.&lt;/p&gt;
&lt;p&gt;Indeed, the problem was lurking in &lt;code&gt;.xemacs/init.el&lt;/code&gt;, in the following pair of lines:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(global-set-key &quot;\e[&quot; 'enlarge-window)&lt;br /&gt;
(global-set-key &quot;\e]&quot; 'shrink-window)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It seems to me like a slightly odd manifestion, but there you have it.  With those lines removed, my Emacs bliss is unimpeded.&lt;/p&gt;
&lt;p&gt;I really ought to get around to getting rid of that XEmacs cruft.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(CC-licensed image of a cricket from&lt;a href=&quot;http://www.flickr.com/photos/knowprose/101872870/&quot;&gt; TaranRampersad&lt;/a&gt;&amp;#8217;s flickr photostream.)&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 05 Mar 2010 02:52:48 +0000</pubDate>
</item>
<item>
	<title>Paul Snyder: Extract n largest values from a Python dict</title>
	<guid>http://www.pataprogramming.com/?p=54</guid>
	<link>http://www.pataprogramming.com/2010/03/python-dict-n-largest/</link>
	<description>&lt;p&gt;Having stashed a bunch of data in a python &lt;code&gt;dict&lt;/code&gt;, one often needs a quick way to extract the &lt;em&gt;n&lt;/em&gt; largest.  Inconveniently for the particular problem I was working on, the key value for the &lt;code&gt;dict&lt;/code&gt; was an object and the associated value was a floating-point weight.  A quick-and-dirty method is to use insert all the &lt;code&gt;dict&lt;/code&gt;-keys into a heap, using the &lt;code&gt;dict&lt;/code&gt;-value as the heap-key  Fortuitously, Python has both a heap module and convenient functions for using it in exactly this way.&lt;/p&gt;
&lt;pre&gt;import heapq

def dict_nlargest(d,n):
    return heapq.nlargest(n ,d, key = lambda k: d[k])

d = { 'a':10.0, 'b':2.0, 'c':5.0, 'd':3.0, 'e':15.0 }
print dict_nlargest(d,3)
&lt;/pre&gt;
&lt;p&gt;Which neatly prints a list of the keys associated with the three largest values:&lt;/p&gt;
&lt;pre&gt;['e', 'a', 'c']
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;heapq.nlargest()&lt;/code&gt; function can also use arbitrary object attributes as keys, as well, by supplying a one-argument function to the named parameter &lt;code&gt;key&lt;/code&gt;.  (This is the role of the &lt;code&gt;lambda&lt;/code&gt; in the examples above and below.)&lt;/p&gt;
&lt;pre&gt;import heapq
class Toy:
    def __init__Toy(self, s, i, f):
        self.s = s
        self.i = i
        self.f = f

l = [ Toy('a', 10, 4.4), Toy('b', 4, 12.0),
      Toy('c', 2, 20.0), Toy('d', 1, 5.0) ]

# largest by the 'f' attribute
print heapq.nlargest(2, l, key = lambda o: o.f)

# largest by the 'i' attribute
print heapq.nlargest(2, l, key = lambda o: o.i)
&lt;/pre&gt;
&lt;p&gt;This is fine for a one-off, but you&amp;#8217;ll likely want to maintain this information in a data structure if this you&amp;#8217;ll be performing this operation multiple times on a large collection.&lt;/p&gt;</description>
	<pubDate>Thu, 04 Mar 2010 05:49:17 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Neato article about NoSQL on Ars Technica</title>
	<guid>http://yonkeltron.com/?p=618</guid>
	<link>http://yonkeltron.com/2010/02/24/neato-article-about-nosql-on-ars-technica/</link>
	<description>&lt;p&gt;I am very excited by some of the NoSQL stuff out there and enjoyed &lt;a href=&quot;http://arstechnica.com/business/data-centers/2010/02/-since-the-rise-of.ars/&quot;&gt;a recent Ars Technica article&lt;/a&gt;. The first page is some neat background and&lt;a href=&quot;http://arstechnica.com/business/data-centers/2010/02/-since-the-rise-of.ars/2&quot;&gt; the second page has a good overview &lt;/a&gt;of some NoSQL options out there.&lt;/p&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;http://arstechnica.com/business/data-centers/2010/02/-since-the-rise-of.ars/&lt;/div&gt;</description>
	<pubDate>Wed, 24 Feb 2010 15:46:28 +0000</pubDate>
</item>
<item>
	<title>JonathanD: Lower Merion laptop spying</title>
	<guid>http://sogeekithurts.com/15 at http://sogeekithurts.com</guid>
	<link>http://sogeekithurts.com/?q=node/15</link>
	<description>&lt;p&gt;I'm sure most of you have heard about the rather big story of Lower Merion School District allegedly spying on students using laptops in their school issued machines.  As more news comes out about this, I'm personally getting more and more disturbed by it.&lt;/p&gt;
&lt;p&gt;I think my views are somewhat unpopular, but I have a real problem with the basic premise that high school students (or any students) are untrustworthy and need anything approaching the sort of monitoring that went on.  Even if we assume for a moment that they only ever used it as claimed, to recover stolen laptops, it seems to me even this was aimed at keeping students honest by not allowing them to steal these machines and sell them.  While I don't question that such a thing may happen, I believe that protecting against it in this manner is not ideal, at best.&lt;/p&gt;
&lt;p&gt;The issue isn't just a few laptops, and even if we find this school district was in fact using this software to spy on other occasions, I think it goes much further than just this story.  In the grand scheme, this isn't even important.  What IS important is the slow erosion of rights of our students.  Students today are told they essentially have no rights beyond the right to an education.  This incident is just an implementation of this policy, of showing these kids that they really don't have any rights, in or out of school.  Month after month, new stories surface of how students are being punished or at least spoken to for things they are doing outside of school, for posts they are posting on line, for pictures they are taking and sending to friends.  Why is this tolerated still?&lt;/p&gt;
&lt;p&gt;Our rights are not something to just let slip away, and teaching our youth that they are mutable and unimportant is no way to raise the next generation in this nation.  This is a deep issue with national, and even worldwide implications, not just a few pictures from a students laptop.  Amidst all the chaos around this issue, lets not forget the big picture.&lt;/p&gt;
&lt;p&gt;These kids are tomorrows adults.  Start treating them like it.&lt;/p&gt;</description>
	<pubDate>Tue, 23 Feb 2010 15:53:05 +0000</pubDate>
</item>
<item>
	<title>JonathanD: fosscon continues, building a workshop, and more.</title>
	<guid>http://sogeekithurts.com/14 at http://sogeekithurts.com</guid>
	<link>http://sogeekithurts.com/?q=node/14</link>
	<description>&lt;p&gt;We're continuing to finalize details on fosscon, with registration now open and sponsorship opportunities posted.  I'm terrifically excited about the prospect of this event and can't wait to see it realized.&lt;/p&gt;
&lt;p&gt;We've also just moved, which is adding to the chaos... of course, by just moved, I mean we moved nearly a month ago, and we're still settling in, but the best part of this for me is clearly setting up my new basement workshop.  There is TONS more space in this new house, and this means I have plenty of space to setup my equipment and have a little fun... finally.  The only bad news is it looks like my o-scope gave up the ghost shortly after the move.&lt;/p&gt;
&lt;p&gt;All in all, love the new place, hated the move, and hopefully we can stick here a decade at least.&lt;/p&gt;</description>
	<pubDate>Tue, 23 Feb 2010 14:22:38 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Making my bed</title>
	<guid>http://www.lamalex.net/?p=23</guid>
	<link>http://www.lamalex.net/2010/02/making-my-bed/</link>
	<description>&lt;p&gt;I&amp;#8217;ve made a resolution to make my bed every day. This post is for public accountability of this resolution. I know that most people reading this will never be near my bed, but if we&amp;#8217;re chatting at some point please ask me how it&amp;#8217;s going and give me a hard time if I say I&amp;#8217;ve been slacking.&lt;/p&gt;
&lt;div class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://farm3.static.flickr.com/2530/4154253136_f54a1ed66e_d.jpg&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2530/4154253136_f54a1ed66e_d.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;375&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Photo (c) 2009 jek in the box&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;No that&amp;#8217;s not my bed.&lt;/p&gt;</description>
	<pubDate>Sat, 20 Feb 2010 19:13:21 +0000</pubDate>
</item>
<item>
	<title>Paul Snyder: Eliminating a nasty, loud ‘crack’ before playback in Ubuntu Karmic</title>
	<guid>http://www.pataprogramming.com/?p=79</guid>
	<link>http://www.pataprogramming.com/2010/02/karmic-nasty-loud-crack/</link>
	<description>&lt;p&gt;Ever since installing Karmic on my main box, audio has been an intermittent annoyance.  While I like the idea behind pulseaudio, its presence in Karmic has certainly has contributed to a few headaches (made painfully worse when I imprudently tried exploring the network multicast features).  I&amp;#8217;ve had most of the bugs worked out for a while, except for one: before a sound is played back, a loud, unpleasant, sharp &lt;strong&gt;crack&lt;/strong&gt; is emitted by the speakers.  After that, sound playback proceeds normally&amp;#8230;music, further OS alert beeps, no problem.  However, after a period of idleness without any sound activity (ten seconds, in fact), the next speaker access will result in the same loud report.  Even though annoying, this problem has not been critical.&lt;/p&gt;
&lt;p&gt;The box is custom-built system based around an Asus P6T motherboard, which has has an onboard RealTek ALC1200 for sound.  This shows up in Linux as&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;00:1b.0 Audio device: Intel Corporation 82801JI (ICH10 Family)
HD Audio Controller&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;and thus uses the &lt;em&gt;snd_hda_intel&lt;/em&gt; kernel module (Intel High-Definition Audio).&lt;/p&gt;
&lt;p&gt;Having just had occasion to look into my &lt;em&gt;/etc/modprobe.d/alsa-base.conf&lt;/em&gt;, I found this exceedingly suspicious pair of lines:&lt;/p&gt;
&lt;p&gt;
&lt;pre&gt;# Power down HDA controllers after 10 idle seconds
options snd-hda-intel power_save=10 power_save_controller=N&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;The 10-second time-out surely could not be a coincidence.&lt;/p&gt;
&lt;p&gt;Sure enough, commenting it out has removed this lingering audio annoyance (which turns out to be completely unrelated to pulse).  It appears this issue is already known: &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/linux/+bug/417302&quot;&gt;https://bugs.launchpad.net/ubuntu/+source/linux/+bug/417302&lt;/a&gt;.  As one commenter observed: &amp;#8220;I was also affected by this. I think this is a bug &amp;#8211; speakers should not produce unpleasant sounds for [no] apparent reason.&amp;#8221;  This is a sentiment with which I can only agree.&lt;/p&gt;</description>
	<pubDate>Fri, 19 Feb 2010 23:00:59 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Jan-Feb 2010 Record scores</title>
	<guid>http://www.lamalex.net/?p=6</guid>
	<link>http://www.lamalex.net/2010/02/jan-feb-2010-record-scores/</link>
	<description>&lt;p&gt;I&amp;#8217;ve been spending too much money on records recently so I&amp;#8217;ve decided to give myself a soft-limit of $50/month to spend on records. At the end of each month I&amp;#8217;ll do a post of what I got with my $50 that month. I say soft limit because if I come across a copy of SUNN White 1 for less than $100, I might buy it despite my $50 limit. I&amp;#8217;ve already gone over that limit for February, so I won&amp;#8217;t be buying any new records this month except for $1 porch sale/thrift store records.&lt;/p&gt;
&lt;p&gt;2010 has been a good year for record hunting. Here are my 2010 record scores for January and February.&lt;/p&gt;

&lt;a href=&quot;http://www.lamalex.net/2010/02/jan-feb-2010-record-scores/img_2829-2/&quot; title=&quot;Feu Therese&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/02/IMG_28291-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;Feu Therese&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.lamalex.net/2010/02/jan-feb-2010-record-scores/img_2828/&quot; title=&quot;Pat Benatar&amp;#039;s Best shots&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/02/IMG_2828-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;Pat Benatar&amp;#039;s Best shots&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.lamalex.net/2010/02/jan-feb-2010-record-scores/img_2827/&quot; title=&quot;Facedowninshit NPON&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/02/IMG_2827-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;Facedowninshit NPON&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.lamalex.net/2010/02/jan-feb-2010-record-scores/img_2826/&quot; title=&quot;Godspeed You Black Emperor&amp;#039;s Raise Your Skinny Fists Like Antennas to Heaven&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/02/IMG_2826-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;Godspeed You Black Emperor&amp;#039;s Raise Your Skinny Fists Like Antennas to Heaven&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.lamalex.net/2010/02/jan-feb-2010-record-scores/img_2824-2/&quot; title=&quot;EARTH&amp;#039;s Earth 2 special low frequency version&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/02/IMG_28241-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;EARTH&amp;#039;s Earth 2 special low frequency version&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.lamalex.net/2010/02/jan-feb-2010-record-scores/img_2825/&quot; title=&quot;SUNN O)))&amp;#039;s Monoliths &amp;amp; Dimensions&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2010/02/IMG_2825-150x150.jpg&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;SUNN O)))&amp;#039;s Monoliths &amp;amp; Dimensions&quot; /&gt;&lt;/a&gt;

&lt;p&gt;The Facedowninshit record is on yellow, too. Unfortunately, my record player broke the other night! I guess I&amp;#8217;ll be scouring craigslist this weekend trying to find a new turntable.&lt;/p&gt;</description>
	<pubDate>Fri, 19 Feb 2010 20:56:45 +0000</pubDate>
</item>
<item>
	<title>JonathanD: We're having a fosscon!</title>
	<guid>http://sogeekithurts.com/13 at http://sogeekithurts.com</guid>
	<link>http://sogeekithurts.com/?q=node/13</link>
	<description>&lt;p&gt;This June, in Rochester.  Fosscon is a free and open source software conference, assembled by the foss community and for the foss community.  You can be a part of fosscon.  All of us involved are very excited as this great project moves forward! Take a look at &lt;a href=&quot;http://fosscon.org&quot;&gt;http://fosscon.org&lt;/a&gt;, registration will open soon. Besides checking out the website feel free to drop in #fosscon on chat.freenode.net to talk to others involved in fosscon.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sogeekithurts.com/?q=node/13&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 18 Feb 2010 12:40:14 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: The zen of backup theory</title>
	<guid>http://yonkeltron.com/?p=607</guid>
	<link>http://yonkeltron.com/2010/02/11/the-zen-of-backup-theory/</link>
	<description>&lt;p&gt;When stuck inside due to all the snow, there is no better time to consider the topic of backup. Seriously, backup is important and the issue is fascinating.  The area of backup brings together so many topics in computing. Think about it! To do backup successfully, you must deal with data transfer, data integrity validation, networks, distributed systems, compression and, if you&amp;#8217;re doing it right, cryptography. It is not just computer science however, but also workflow management and that somewhat-nebulous-yet-often-referred-to thing of systems thinking.&lt;/p&gt;
&lt;p&gt;I got to thinking about the topic of backups and was curious as to the state of research as well as backup tools. A great intro to so-called &amp;#8220;backup theory&amp;#8221; is available on the &lt;a href=&quot;http://en.wikipedia.org/wiki/Backup&quot;&gt;&amp;#8216;Backup&amp;#8217; Wikipedia article&lt;/a&gt; and &lt;a href=&quot;http://www.educ.umu.se/~cobian/backuptheory.htm&quot;&gt;others have written&lt;/a&gt; on the subject &lt;a href=&quot;http://www.google.com/search?q=backup%20theory&quot;&gt;(Google will verify&lt;/a&gt; that this is true). As it turns out, advances in storage have recently offered many new opportunities for improving the way that a given backup process might work.&lt;/p&gt;
&lt;p&gt;Several distributed fault-tolerant filesystems are coming along quite nicely. Though the &lt;a href=&quot;http://labs.google.com/papers/gfs.html&quot;&gt;Google File System&lt;/a&gt; and the equivalent &lt;a href=&quot;http://hadoop.apache.org/hdfs/&quot;&gt;HDFS&lt;/a&gt; project which is part of &lt;a href=&quot;http://hadoop.apache.org/&quot;&gt;Apache&amp;#8217;s Hadoop&lt;/a&gt; have gotten much attention, there are other options. &lt;a href=&quot;http://www.gluster.org/&quot;&gt;GlusterFS&lt;/a&gt; (follow &lt;a href=&quot;http://twitter.com/gluster&quot;&gt;GlusterFS on Twitter&lt;/a&gt;, perhaps?) and &lt;a href=&quot;http://ceph.newdream.net/&quot;&gt;Ceph&lt;/a&gt; are two excellent examples of Free/Open Source Software projects which offer the compelling combo of fault tolerance and distributed storage. They each employ replication and have similar architectures insofar as they abstract individual machines into &amp;#8220;chunks&amp;#8221; or &amp;#8220;blocks&amp;#8221; and manage replication automatically. One interesting difference is that while GlusterFS exports filesystems &amp;#8220;as-is&amp;#8221; (see the docs for an explanation), Ceph exports entire block devices.&lt;/p&gt;
&lt;p&gt;So then what about the theory and goals of backup? In my opinion, backing up is not enough. Having a backup plan and executing it perfectly doesn&amp;#8217;t mean a thing if the data can&amp;#8217;t be recovered.  (In fact this issue relates strongly to a larger discussion of reliability. Rather than focusing exclusively on total time spent in a failure state, individuals concerned with reliability would also do well to consider how fast a system can recover from those failures. If a system can be up and running again after only 5 minutes, then that system can go down 12 times before reaching an hour of downtime. If another system takes 20 minutes to rebound from a failure, then that system can only go down 3 times!) I haven&amp;#8217;t yet gotten to thinking about the problem of restoration following failure for anything other than plain old files. For example, I backup my personal data to servers in Philadelphia and California in addition to an external hard drive in my apartment. I make careful use of  old stand-byes like &lt;a href=&quot;http://en.wikipedia.org/wiki/Tar_%28file_format%29&quot;&gt;tar&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Gzip&quot;&gt;gzip&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Rsync&quot;&gt;rsync&lt;/a&gt; along with a checksum utility like &lt;a href=&quot;http://en.wikipedia.org/wiki/Md5sum&quot;&gt;md5sum&lt;/a&gt; or, more recently, something in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Sha1sum&quot;&gt;SHA&lt;/a&gt; family. Plus I use the &lt;a href=&quot;http://git-scm.com/&quot;&gt;git&lt;/a&gt; revision control system for code and &lt;a href=&quot;http://joey.kitenet.net/code/etckeeper/&quot;&gt;etckeeper&lt;/a&gt; for config. By backing up all of my configuration data in addition to my personal files, I make it so that I can easily return a given system to a usable state, if not restoring it perfectly. I have successfully restored systems by doing little more than a reverse rsync.&lt;/p&gt;
&lt;p&gt;To be fair, I just spoke about about the few systems under my personal control which constitute a small and limited case. I back up to different locations which is good practice but my local copy is certainly not sufficient for anything industrial. If the disk breaks, I&amp;#8217;m out of luck. Considering a larger-scale system is when GlusterFS, Ceph and others would come in handy. Obviously there are a &lt;a href=&quot;http://amzn.com/0596102461&quot;&gt;great&lt;/a&gt; &lt;a href=&quot;http://amzn.com/0596001533&quot;&gt;many&lt;/a&gt; &lt;a href=&quot;http://amzn.com/0471227145&quot;&gt;books&lt;/a&gt; &lt;a href=&quot;http://amzn.com/1420076396&quot;&gt;written&lt;/a&gt; about &lt;a href=&quot;http://amzn.com/1430226625&quot;&gt;this topic&lt;/a&gt; but, for the purposes of discussion, if I were to build a platform for the reliable storage of huge amounts of data, my project would look something like this&amp;#8230;&lt;/p&gt;
&lt;p&gt;First, I would round up spare computers with room for extra disks. They machines would not need to be particularly fast or possess large amounts of memory. I&amp;#8217;m not sure of the exact hardware requirements for either GlusterFS (&lt;a href=&quot;http://gluster.com/community/documentation/index.php/Storage_Server_Installation_and_Configuration#Hardware_Requirements&quot;&gt;vague wiki entry&lt;/a&gt;) or Ceph but it&amp;#8217;s hard to imagine that they&amp;#8217;d require huge amounts of anything but disk space. Anyway, if my organization had old desktops or something which were being replaced then they might be perfect candidates.&lt;/p&gt;
&lt;p&gt;Second comes storage. It seems that at the time of this writing, one can purchase a 1TB hard disk for around US$85. Let us assume that 20 desktop machines could be procured and each had two spare disk slots. For around US$3500 (figuring 2 US$85 disks per machine and a little more for tax+shipping, etc.) one could buy 20TB of storage. Now, it&amp;#8217;s not quite that simple as the fault-tolerance scheme in both GlusterFS and Ceph relies on replication. Assuming the accepted replication factor of 3 (a norm adhered to by the Google File System), that would reduce the 20TB storage block by a third  leaving around 6 and two thirds terabytes of fault-tolerant storage. Filesystems of this type usually require cluster control processes which (ideally, I think) reside on dedicated machines so an extra machine or two would also be required. I got a good explanation of how metadata servers work in GFS/HDFS by reading the &lt;a href=&quot;http://hadoop.apache.org/common/docs/current/hdfs_design.html&quot;&gt;HDFS design document&lt;/a&gt;, actually. Metadata servers and other control processes serve similar functions. Ceph documents are very explicit about not having a single point of failure whereas GlusterFS is not quite so adamant. I need some help figuring out if GlusterFS is as fault-tolerant in that respect.&lt;/p&gt;
&lt;p&gt;For under US$4000, one could theoretically build over 6TB of fault-tolerant distributed storage (provided that spare machines are plentiful, something which shouldn&amp;#8217;t be a problem for organizations with a semi-regular hardware replacement cycle). Now, as for the usage of that storage system for backup, it&amp;#8217;s a different piece of the discussion. I&amp;#8217;ve seen quite a few setups where a single-but-very-large server provides networked storage to a large number of users via something like samba or NFS. In this case, the big server is usually blessed with some complicated RAID arrangement which people put entirely too much faith in. No one ever listens that RAID is not a backup strategy. Personally, I don&amp;#8217;t believe in hardware reliability because it seems silly to spend money trying to prevent hardware from failing when you know it&amp;#8217;s going to break (eventually) anyway. I&amp;#8217;m not saying that RAID isn&amp;#8217;t useful because it *is* useful and has a place. What I am saying is that it&amp;#8217;s not backup. So if an organization has a big network storage server then where does that get backed up to? It&amp;#8217;s hard to backup 6 TB off site but it can (certainly) be done. However, if an organization is lucky enough to have multiple buildings then a distributed storage cluster like I described earlier would be an excellent addition to the overall backup infrastructure. Putting a few machines in different buildings and using it as a place to shadow the main file server and whatever else needs to be backed up would grant an added measure of security.&lt;/p&gt;
&lt;p&gt;Snow days are a good time for thinking and my backup jobs went smoothly. However, I feel as if I have begun a track of study which might yield some good results. Granted, it&amp;#8217;s not just about the technology (&lt;a href=&quot;http://arxiv.org/abs/cs/0412074&quot;&gt;humans screw things up&lt;/a&gt;) but the ability to build reliable and fault-tolerant storage systems for massive amounts of data using only commodity hardware is a huge boon to users everywhere. This concludes my backup rant.&lt;/p&gt;</description>
	<pubDate>Thu, 11 Feb 2010 17:33:42 +0000</pubDate>
</item>
<item>
	<title>Paul Snyder: Moonlight just works</title>
	<guid>http://www.pataprogramming.com/?p=68</guid>
	<link>http://www.pataprogramming.com/2010/01/moonlight-just-works/</link>
	<description>&lt;p&gt;On the way into Philadelphia today, my train was delayed.  While the rain seemed rather pleasant as I walked to the station, the winds had been strong enough to disrupt service.  An earlier train had been disabled on the line, blocking the tracks.  In all, it made for a thoroughly tedious experience, and not one to encourage me in my attempts to use public transit nor bolster my (non-existent) love for &lt;a href=&quot;http://septa.org/&quot;&gt;SEPTA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Eventually, a &amp;#8220;rescue train&amp;#8221; came along to extract we poor passengers from our misery.  The extraction was not timely, and rather than arriving forty-five minutes early for the lecture on a &lt;a href=&quot;https://www.cs.drexel.edu/node/14832&quot;&gt;multi-robot planning&lt;/a&gt;, I arrived forty-five minutes late: just in time to miss the end.&lt;/p&gt;
&lt;p&gt;You can imagine I was quite pleased, then, when a friend told me the video would be available online.  Unfortunately, the &lt;a href=&quot;http://media.irt.drexel.edu/mediasite/Viewer/?peid=cde32cdf0959451b9aeecd15216ac6b2&quot;&gt;link he sent me&lt;/a&gt; was for a lecture earlier in the month.  Even more distressingly, the recording was only provided via Microsoft Silverlight.  I simply do not understand why a computer science department that runs mostly on Linux keeps returning to suckle at a Windows-only, proprietary teat.  Disgruntled, I made a note to check out &lt;a href=&quot;http://www.mono-project.com/Moonlight&quot;&gt;Moonlight&lt;/a&gt; at some point.&lt;/p&gt;
&lt;p&gt;Somewhat later, I ran an &lt;code&gt;apt-cache search moonlight&lt;/code&gt; on my main research box (currently on Karmic), and sure enough, &lt;code&gt;moonlight-plugin-mozilla&lt;/code&gt; looked plenty promising.  A simple &lt;code&gt;sudo aptitude install moonlight-plugin-mozilla&lt;/code&gt;, and it was on its way.&lt;/p&gt;
&lt;p&gt;I returned to writing email.  A few minutes later, I heard the sound of talking: a video was playing somewhere.  Irritated, I tried to figure out if a video one of my open tabs had launched itself.  I was somewhat gobsmacked when I found it was the lecture mentioned above: unless I somehow managed to restart Firefox in a memoryless stupor, it seems that the Moonlight plugin insinuated itself into a running Firefox 3.5.7 instance, loaded the player, and kicked off the playback without any intervention.  Impressively smooth and simple.&lt;/p&gt;
&lt;p&gt;This may partially make up for my annoyance with Karmic&amp;#8217;s compiz, which has an annoying habit of dying out from under X every day or two.&lt;/p&gt;</description>
	<pubDate>Tue, 26 Jan 2010 03:39:43 +0000</pubDate>
</item>
<item>
	<title>AndyML: 24 hours with the Google Nexus One</title>
	<guid>http://www.stuffjoeknows.net/?p=155</guid>
	<link>http://www.stuffjoeknows.net/?p=155</link>
	<description>Day 1 down, we will see how the weekend goes.  So far I am very happy with the size/shape, performance, and software, I just hope something can be done about the battery life.</description>
	<pubDate>Sat, 09 Jan 2010 02:20:08 +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, 08 Jan 2010 02:48:00 +0000</pubDate>
</item>
<item>
	<title>AndyML: How to: Mount an ISO image under Linux</title>
	<guid>http://www.stuffjoeknows.net/?p=153</guid>
	<link>http://www.stuffjoeknows.net/?p=153</link>
	<description>I had an iso I needed to get files off real quick &amp;#8211; not worth burning the CD. I used this method to mount it in linux.
http://www.cyberciti.biz/tips/how-to-mount-iso-image-under-linux.html</description>
	<pubDate>Thu, 07 Jan 2010 17:04:57 +0000</pubDate>
</item>
<item>
	<title>AndyML: How can I disable the User Account Control (UAC) feature on my Windows Vista computer?</title>
	<guid>http://www.stuffjoeknows.net/?p=152</guid>
	<link>http://www.stuffjoeknows.net/?p=152</link>
	<description>Came across this great how-to on disabling that annoying Administrative Rights popup in Vista (called uac). Thanks!
http://www.petri.co.il/disable_uac_in_windows_vista.htm</description>
	<pubDate>Thu, 07 Jan 2010 16:59:59 +0000</pubDate>
</item>
<item>
	<title>AndyML: Hack your old wireless router into switch-only mode.</title>
	<guid>http://www.stuffjoeknows.net/?p=149</guid>
	<link>http://www.stuffjoeknows.net/?p=149</link>
	<description>I got an e-mail from a friend last night.
Hey Andy,
I wonder if I can bother you for some network troubleshooting?
Now, I have my FIOS wireless router set up to talk to a linksys wireless game adapter wired to my xbox.  works well (most of the time).
I am getting a tv and blu-ray player that also [...]</description>
	<pubDate>Thu, 07 Jan 2010 16:53:29 +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 Like 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>Mon, 04 Jan 2010 15:03:00 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Cool Free/Open Source Software from Google</title>
	<guid>http://yonkeltron.com/?p=602</guid>
	<link>http://yonkeltron.com/2009/12/28/cool-freeopen-source-software-from-google/</link>
	<description>&lt;p&gt;As has been spoken about endlessly (&lt;a href=&quot;http://ostatic.com/blog/the-quieter-side-of-open-source-at-google&quot;&gt;OStatic&lt;/a&gt;, &lt;a href=&quot;http://www.osnews.com/story/22663/35_Google_Open_Source_Projects_That_You_Probably_Don_t_Know&quot;&gt;OSnews&lt;/a&gt;), there is a great blog post from 0&amp;#215;1fff with many (started at 35, is now many more) &lt;a href=&quot;http://blog.0x1fff.com/2009/12/35-google-open-source-projects-that-you.html&quot;&gt;open source projects from Google&lt;/a&gt;. In fact and indeed, there is some cool stuff on there. I knew about &lt;a href=&quot;http://code.google.com/p/google-caja/&quot;&gt;Caja&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/protobuf/&quot;&gt;Protocol Buffers&lt;/a&gt; (wish there was a JS port of protocol buffers) but did not know about &lt;a href=&quot;http://code.google.com/p/crush-tools/&quot;&gt;CRUSH&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/skia/&quot;&gt;skia&lt;/a&gt;. Honestly, there are plenty of cool projects out there and my already-positive opinion of Google is only bolstered by the fact that they give back so willingly. Gotta love it.&lt;/p&gt;</description>
	<pubDate>Mon, 28 Dec 2009 21:59:10 +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>Wed, 16 Dec 2009 17:03:00 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: ES5 is finally here, JavaScript geeks rejoice!</title>
	<guid>http://yonkeltron.com/?p=599</guid>
	<link>http://yonkeltron.com/2009/12/15/es5-is-finally-here-javascript-geeks-rejoice/</link>
	<description>&lt;p&gt;So, earlier this week, it was announced that &lt;a href=&quot;http://en.wikipedia.org/wiki/ECMAScript#ECMAScript.2C_5th_Edition&quot;&gt;ECMAScript 5&lt;/a&gt; has finally been released. This is a good thing and I caught the highlights on &lt;a href=&quot;http://www.infoq.com/news/2009/12/ecmascript5&quot;&gt;InfoQ&lt;/a&gt;. The full draft is a &lt;a href=&quot;http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf&quot;&gt;252 page PDF  beast of a document&lt;/a&gt; which covers basically about everything there is to cover. The things which strike me as interesting are the improved Array functions (like map, filter and reduce), some (finally) ways to harden Objects (in the form of freeze and seal) and &lt;a href=&quot;http://json.org&quot;&gt;JSON&lt;/a&gt; in the language. The other big deal which has me excited is the availability of a strict mode which has been spoken about by &lt;a href=&quot;http://www.youtube.com/watch?v=hQVTIJBZook&quot;&gt;Douglas Crockford in his Google Tech Talk&lt;/a&gt; as well in his book &lt;a href=&quot;http://amzn.com/0596517742&quot;&gt;JavaScript: The Good Parts&lt;/a&gt;, which you should buy. Honestly, it makes you appreciate JavaScript so very, very much as D-Crock highlights the best and worst features of JavaScript.&lt;/p&gt;
&lt;p&gt;In reality, this has been a big month for JavaScript with Google open sourcing its internal JS toolkit, &lt;a href=&quot;http://code.google.com/closure/&quot;&gt;Closure&lt;/a&gt; along with much attention being paid to to projects like &lt;a href=&quot;http://nodejs.org/&quot;&gt;NodeJS&lt;/a&gt; (for network stuff) and &lt;a href=&quot;http://commonjs.org/&quot;&gt;CommonJS&lt;/a&gt; (for everything else).&lt;/p&gt;</description>
	<pubDate>Wed, 16 Dec 2009 01:03:56 +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>Tue, 15 Dec 2009 06:26: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>Tue, 15 Dec 2009 02:58: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>Mon, 14 Dec 2009 19:30: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>Sat, 12 Dec 2009 06:11: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>Sat, 12 Dec 2009 05:53:00 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Messing with OpenStreetMap</title>
	<guid>http://yonkeltron.com/?p=595</guid>
	<link>http://yonkeltron.com/2009/11/25/messing-with-openstreetmap/</link>
	<description>&lt;p&gt;Some people might not see the reason for a project like OpenStreetMap when there are plenty of good mapping products and services laying around. I am not one of them. Whenever I use a GPS, I think quite a bit about it&amp;#8217;s inner workings. How does it figure out which route is best? How does it calculate things on the fly? All of these questions usually lead me to think, at one point or another, that it depends very much on the data. While most mapping services and individual GPS devices use various algorithms for calculating routes, etc. (prob based on some weighted graph or something), they also rely on different sets of map data. A GPS can only tell you where on the planet you are, not what road you are on. For that, it needs map data. The only issue is that all of the map data used by popular services is proprietary!&lt;/p&gt;
&lt;p&gt;Enter, &lt;a href=&quot;http://www.openstreetmap.org/&quot;&gt;OpenStreetMap&lt;/a&gt;. Seeded with the geographical data made publicly available by various governments and public universities, OpenStreetMap provides Free (as in freedom, licensed under &lt;a href=&quot;http://creativecommons.org/licenses/by-sa/2.0/&quot;&gt;CC-BY-SA&lt;/a&gt;) map data to anyone who wants it. The data is usually in pretty good shape because the initial measurements are in good shape. However, things aren&amp;#8217;t perfect. Lucky for the web, OpenStreetMap.org allows users to help improve the data in a number of ways.&lt;/p&gt;
&lt;p&gt;First, users can upload GPS traces to help improve the quality of unmapped regions such as seriously-rural areas along with bike and hiking trails. Second, users are able to tweak the mapping data to correct errors. There are a number of ways to do this but OpenStreetMap.org has an online editor which lets you overlay OSM data onto sattelite imagery so you can move those roads, landmarks and the like into the right location. In about an hour, I had cleaned up much of my hometown and began to add local landmarks, parks and buildings. It&amp;#8217;s quite easy.&lt;/p&gt;
&lt;p&gt;The project itself seems off to a great start and the &lt;a href=&quot;http://blogs.openstreetmap.org/&quot;&gt;planet&lt;/a&gt; shows a fair bit of activity. In particular, I like the idea of mapping parties where people get together and work on a given area. This seems like a great way to give back to the community and I plan to float the idea at the next &lt;a href=&quot;http://scosug.org/&quot;&gt;SCOSUG&lt;/a&gt; meeting.&lt;/p&gt;</description>
	<pubDate>Thu, 26 Nov 2009 03:31:34 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Data visualization on a web page</title>
	<guid>http://yonkeltron.com/?p=588</guid>
	<link>http://yonkeltron.com/2009/11/01/data-visualization-on-a-web-page/</link>
	<description>&lt;p&gt;Quickie: Two of my favorite ways to get data visualized on a web page are the &lt;a href=&quot;http://code.google.com/apis/chart/&quot;&gt;Google Chart API&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/flot/&quot;&gt;flot&lt;/a&gt;, the amazing canvas-based plotting library built on top of &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Google Chart API provides a rediculously clever way to get high-quality information graphics which are generated on the back of the clearly-amazing Google infrastructure. You just use the URL layout provided and it sort of just works. All types of charts can be created. It&amp;#8217;s very nice if you&amp;#8217;re willing to take the time to piece together the URLs in the proper format. There &lt;a href=&quot;http://keith-wood.name/gChartRef.html&quot;&gt;are&lt;/a&gt; some &lt;a href=&quot;http://www.maxb.net/scripts/jgcharts/include/demo/#1&quot;&gt;abstractions&lt;/a&gt;, though.&lt;/p&gt;
&lt;p&gt;Then there&amp;#8217;s &lt;a href=&quot;http://code.google.com/p/flot/&quot;&gt;flot&lt;/a&gt; (which I&amp;#8217;m told is Swedish for &amp;#8220;pretty&amp;#8221;). Flot is a library written in JavaScript on top of jQuery which produces very nice charts inside a canvas element. The &lt;a href=&quot;http://people.iola.dk/olau/flot/examples/&quot;&gt;demos are quite gorgeous&lt;/a&gt; and it&amp;#8217;s operation seems straightforward enough. As a side note, &lt;a href=&quot;http://liftweb.net/&quot;&gt;Lift&lt;/a&gt; has a &lt;a href=&quot;http://scala-tools.org/scaladocs/liftweb/1.0/net/liftweb/widgets/flot/Flot$object.html&quot;&gt;built-in flot widget&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Sun, 01 Nov 2009 21:06:07 +0000</pubDate>
</item>
<item>
	<title>JonathanD: CPOSC</title>
	<guid>http://sogeekithurts.com/12 at http://sogeekithurts.com</guid>
	<link>http://sogeekithurts.com/?q=node/12</link>
	<description>&lt;p&gt;Tomorrow I'll be heading to CPOSC, and speaking there too, it seems.  It's been quite a while since I've spoken in front of a group larger than perhaps a dozen, so here's to not fainting.&lt;/p&gt;
&lt;p&gt;The event looks like lots of fun, and I'll know at least a few people there (lyz and waltman) so well, away we go.  Heading to the train.&lt;/p&gt;</description>
	<pubDate>Fri, 16 Oct 2009 21:04:13 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Good talk about DSL construction in JS</title>
	<guid>http://yonkeltron.com/?p=582</guid>
	<link>http://yonkeltron.com/2009/10/11/good-talk-about-dsl-construction-in-js/</link>
	<description>&lt;p&gt;Neat talk, should remind everyone about the joys of doing cool stuff in the browser. Plus, it made me think about DSLs in general which is good because of all the Scala goodness I&amp;#8217;ve been messing around with recently. The &lt;a href=&quot;http://www.infoq.com/presentations/dsls-in-javascript&quot;&gt;talk is on InfoQ.&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 12 Oct 2009 01:25:36 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Thoughts on different types of data</title>
	<guid>http://yonkeltron.com/?p=580</guid>
	<link>http://yonkeltron.com/2009/10/05/thoughts-on-different-types-of-data/</link>
	<description>&lt;p&gt;At work, my title is the Data Warehouse Manager. Mostly, I work with numbers. Lots of test scores, checklist data, compositve variables and the like. Numbers are cool and they can often yield plenty of insight. However, numbers are not the only story that can be told! So much of business intelligence right now focuses on &lt;a href=&quot;http://en.wikipedia.org/wiki/Natural_language_processing&quot;&gt;natural-language processing&lt;/a&gt; (NLP). I once heard someone say that getting to 80% in NLP was almost comically easy but getting to 90% has proven to be amazingly difficult! Obviously, I&amp;#8217;m not content to wait around until the &lt;a href=&quot;http://en.wikipedia.org/wiki/Technological_singularity&quot;&gt;singularity&lt;/a&gt; (though I do believe it is near) to be able to utilize textual data for informing educational decisions. So then where is the merit in utilizing textual data if we can be only 90% sure of something? Numeric metrics like test scores are perfectly clear and definite, right?&lt;/p&gt;
&lt;p&gt;Wrong! Any good educator knows that test scores (especially from a single test) are not the only way to gain additional insight. While the strengths and weaknesses of the standardized-testing model are a different discussion entirely, suffice it to say that the community needs to remember that, when it comes to education, all numbers are fuzzy. The learning process is not discrete, definite or clean-cut so why should we expect a signle number to show singular accuracy with any great fidelity? In fact, we cannot and it is for this reason that an automatic evaluation of textual data might help educators make better decisions. Perhaps an example is in order.&lt;/p&gt;
&lt;p&gt;Let us say that every so often in a math class, teachers write a brief one-paragraph essay about each student summing up their competency and general performance. Then let us also say that students are able to write a sefl-evaluation each time their teacher writes something. So after, a period of time, each student has a bit of text in addition to their test scores and general grades. I propose using some sort of automated classification mechanism to evaluate the textual data and produce best guesses as to the nature of the content. Afterall, if there are 25 students in a class and there are 10 classes taught each day, then that&amp;#8217;s a lot of evaluation data to be read! So what about using something like a &lt;a href=&quot;http://en.wikipedia.org/wiki/Naive_Bayes_classifier&quot;&gt;naive bayesian classifier&lt;/a&gt; to sort through things?&lt;/p&gt;
&lt;p&gt;But wait, doesn&amp;#8217;t this just give us another mechanism to boil down the real-world intuition of the educational system? Well, no. If we let go of the idea that these numbers are perfectly discrete (which we &lt;em&gt;know&lt;/em&gt; they aren&amp;#8217;t), then we can use them to inform our descisions rather than letting the data decide for us. Probabilities are ok so long as we use them correctly. Few people would wear shorts in the winter just because the weatherman said there&amp;#8217;s a chance of sun. So how might such a system be used?&lt;/p&gt;
&lt;p&gt;Well, the point of a naive classifier is that it needs to be trained. First, teachers would need to assmble a training data set of some sort. In younger grades, this might be quite easy because students have a more limited vocabulary and might not construct sentences with as much nuance as they learn to do in later grades. As for teacher evaluations, there is a somewhat-finite set of words in the vocabulary of an educator to usefully describe educational progress. Relying on the consistency of such a set nomeclature might very well yield consistent results. Though, all of this would need to be tested anyway, right? This is just a thought experiment&amp;#8230;&lt;/p&gt;
&lt;p&gt;So the system would be able to chew through these evaluations and produce a guess about whether they reflect positively on student learning or not. Perhaps they could even be used to demonstrate growth. Getting this right would take work but it might lead to a useful way to model evaluative-data. Obviously, relying too much on this might very well to a negation in the positive nature of narrative evaluations but it&amp;#8217;s worth a try!&lt;/p&gt;</description>
	<pubDate>Mon, 05 Oct 2009 18:41:32 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Tictactoe 0.3.2! How did I get to 0.3?</title>
	<guid>http://www.lamalex.net/?p=325</guid>
	<link>http://www.lamalex.net/2009/09/tictactoe-0-3-2-how-did-i-get-to-0-3/</link>
	<description>&lt;p&gt;I really have no Idea how I got to 0.3, I think I chose it arbitrarily to start with. Anyway, New release! This release closes all but one of the open bugs in launchpad. The last open bug is to move the code to use the telepathy mission control 5 api, but the python bindings haven&amp;#8217;t been updated to make this easy yet so it will have to wait. What does this release bring?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Now we&amp;#8217;re netbook friendly! I had initially locked the size at 600&amp;#215;600, which didn&amp;#8217;t fit on netbooks with the window border, but now we resize properly, and should automatically fit onto your screen. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Instead of a Square we draw a real X! In light of this change, the winner screen now says &amp;#8220;Cross wins&amp;#8221; instead of square wins, so translators, &lt;a title=&quot;parlez francais?&quot; href=&quot;https://translations.launchpad.net/tictactoe&quot;&gt;please update your translations&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;I also changed the color of the game type descriptions to make it easier to read. It should be a darker shade of gray now.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;#8217;s all! I know it&amp;#8217;s not much, but it&amp;#8217;s a simple game and the resize thing was the only serious issue with 0.3.1. I&amp;#8217;ve got 0.3.2 proposed for uploading into Debian, and although it&amp;#8217;s too late for Karmic, I&amp;#8217;ve got packages building in my &lt;a href=&quot;https://launchpad.net/~alexlauni/+archive/ppa/&quot;&gt;ppa&lt;/a&gt;, and Lucid will get tictactoe-ng synced from Debian when the time comes.&lt;/p&gt;
&lt;p&gt;So here&amp;#8217;s a screenshot of a tiny game of tictactoe!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.lamalex.net/wp-content/uploads/2009/09/screenshot_012.png&quot;&gt;&lt;img class=&quot;aligncenter size-medium wp-image-326&quot; title=&quot;screenshot_012&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2009/09/screenshot_012-288x300.png&quot; alt=&quot;screenshot_012&quot; width=&quot;288&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 30 Sep 2009 04:39:30 +0000</pubDate>
</item>
<item>
	<title>AndyML: how to REALLY speed up FreePBX</title>
	<guid>http://www.stuffjoeknows.net/?p=147</guid>
	<link>http://www.stuffjoeknows.net/?p=147</link>
	<description>This is a real winner. Philippe from FreePBX mentioned this in our Open Telephony Training Seminar last year in regards to embedded systems but I&amp;#8217;ve seen excellent performance enhancements on all the systems I&amp;#8217;ve installed it in.
yum install php-eaccelerator
That&amp;#8217;s it! You can do a before and after comparison by setting &amp;#8220;DEVEL=yes&amp;#8221; in your /etc/amportal.conf and [...]</description>
	<pubDate>Tue, 15 Sep 2009 16:31:14 +0000</pubDate>
</item>
<item>
	<title>AndyML: HowTo: Avoid ‘losing’ shared folders on iSCSI targets on reboot.</title>
	<guid>http://www.stuffjoeknows.net/?p=143</guid>
	<link>http://www.stuffjoeknows.net/?p=143</link>
	<description>We have a Windows 2003 fileserver that uses storage on an iSCSI array that seemed to &amp;#8220;lose&amp;#8221; it&amp;#8217;s shares every time it rebooted.  I suspected it was trying to initialize teh shares before the iSCSI target was connected and not finding them, so went looking for a way to force Windows to wait for the [...]</description>
	<pubDate>Tue, 15 Sep 2009 16:17:38 +0000</pubDate>
</item>
<item>
	<title>AndyML: Making Linux hosts play nice with Windows DHCP/DNS</title>
	<guid>http://www.stuffjoeknows.net/?p=139</guid>
	<link>http://www.stuffjoeknows.net/?p=139</link>
	<description>Sure is nice how windows hosts automatically update their DNS records in your AD integrated DNS servers, huh?
Sure would be nice if your Linux hosts did the same thing, huh?
This is actually easier than it sounds. First make sure your (Microsoft) DHCP server is configured to &amp;#8220;Dynamically update DNS for hosts that do not request [...]</description>
	<pubDate>Thu, 10 Sep 2009 15:40:43 +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>Thu, 10 Sep 2009 03:25:00 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Podcasts I now listen to</title>
	<guid>http://yonkeltron.com/?p=575</guid>
	<link>http://yonkeltron.com/2009/09/06/podcasts-i-now-listen-to/</link>
	<description>&lt;p&gt;I commute to work. Unfortunately, there is no way to carpool so I end up driving about 80 miles a day alone. Still, I drive a very fuel-efficient &lt;a href=&quot;http://en.wikipedia.org/wiki/Honda_Fit&quot;&gt;Honda Fit&lt;/a&gt; and try not to feel too guilty about the fuel consumption considering that I use very little. So, with all that time spent on the &lt;a href=&quot;http://en.wikipedia.org/wiki/Merritt_Parkway&quot;&gt;Merritt&lt;/a&gt;, what should I be listening to in the car? Well, I now have a few podcasts that I listen to.&lt;/p&gt;
&lt;p&gt;First and foremost, I enjoy the&lt;a href=&quot;http://www.kernelpodcast.org/&quot;&gt; LKML Summary podcast&lt;/a&gt; put out by &lt;a href=&quot;http://jonmasters.org/&quot;&gt;Jon Masters&lt;/a&gt;. He does an exceptional job of summarizing things and his side commentary is usually rather hilarious, actually.  I do wish he&amp;#8217;d provide a touch more background on certain things as it can be hard to jump right into the high-level technical discussion on the mailing list. Masters&amp;#8217; radio-compatible voice is a pleasure to listen to in the car, even if each episode is only just under nine minutes long.&lt;/p&gt;
&lt;p&gt;Next, I have &lt;a href=&quot;http://www.se-radio.net/&quot;&gt;Software Engineering Radio&lt;/a&gt;, which has some really neat discussions. The latest one is on APIs and then I&amp;#8217;m going to listen to &lt;a href=&quot;http://www.se-radio.net/podcast/2007-07/episode-62-martin-odersky-scala&quot;&gt;the one where they interview Odersky&lt;/a&gt;. The commentary on topics is quite lucid and I greatly appreciate the candor of guests when discussing specific issues. After all is said and done, the software community at large can be a political group (myself included) so it&amp;#8217;s nice to have some really great technical discussions as well.&lt;/p&gt;
&lt;p&gt;So far, that&amp;#8217;s it. I want to also sample the &lt;a href=&quot;http://www.osnews.com/&quot;&gt;OSNews&lt;/a&gt; podcast but haven&amp;#8217;t gotten around to it yet. So with about 2 hours in the car every day, anyone know of anything else I should be listening to now that &lt;a href=&quot;http://www.lugradio.org/&quot;&gt;LugRadio&lt;/a&gt; is over? I&amp;#8217;d be interested in some podcasts on the topics of emacs, Debian or Scala stuff.&lt;/p&gt;</description>
	<pubDate>Mon, 07 Sep 2009 00:47:44 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Dont tie your tubes, telepathy can use them for mega fun</title>
	<guid>http://www.lamalex.net/?p=317</guid>
	<link>http://www.lamalex.net/2009/08/dont-tie-your-tubes-telepathy-can-use-them-for-mega-fun/</link>
	<description>&lt;p&gt;This weekend I was supposed to go to Richmond, VA for Best friends day 2009 with a couple of my buddies. I got sick and having just gotten pneumonia not long ago I didn&amp;#8217;t want to chance camping in a hurricane while already sick; so I lamed out and stayed in bed all weekend drinking tea, eating soup, and trying to get better. I&amp;#8217;m happy to say I&amp;#8217;m back on my bike, and feeling pretty good, but while I was sick (plus another day or two) I decided that it&amp;#8217;s too hard to play games online with your friends. My girlfriend and I were trying to play online scrabble one night since we were both at home sick, and after 30 minutes of fail just called it quits and went to bed.&lt;/p&gt;
&lt;p&gt;Normal people would just say &amp;#8216;oh well&amp;#8217; at this and let it be- but I thought wtf, I&amp;#8217;m a foss developer, I&amp;#8217;m just gonna write my own. Well I didn&amp;#8217;t write scabble (yet&amp;#8230;) but I did manage to hack up a pretty good tic tac toe game using cairo, and telepathy tubes for two player action. Expect more multi-player games from me when I get sick, telepathy tubes are so great, and pretty simple to use. I used the telepathy-python bindings and hacked this together in just a couple of days (really, I do mean hacked. The code is quite ugly but seems to work well). All of the basic functionality was there the first day, but then I wanted to make it a little bit nicer and package it and everything so it took a bit longer. Anyway, now to the cool part, screenshots!&lt;/p&gt;
&lt;div id=&quot;attachment_318&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://www.lamalex.net/wp-content/uploads/2009/08/screenshot_008.png&quot;&gt;&lt;img class=&quot;size-medium wp-image-318&quot; title=&quot;welcome&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2009/08/screenshot_008-287x300.png&quot; alt=&quot;welcome&quot; width=&quot;287&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Play the computer, or against friends.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;
&lt;div id=&quot;attachment_319&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://www.lamalex.net/wp-content/uploads/2009/08/screenshot_010.png&quot;&gt;&lt;img class=&quot;size-medium wp-image-319 &quot; title=&quot;pick a friend&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2009/08/screenshot_010-287x300.png&quot; alt=&quot;Who would you like to play with?&quot; width=&quot;287&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Who would you like to play with?&lt;/p&gt;&lt;/div&gt;
&lt;div id=&quot;attachment_320&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://www.lamalex.net/wp-content/uploads/2009/08/screenshot_011.png&quot;&gt;&lt;img class=&quot;size-medium wp-image-320 &quot; title=&quot;screenshot_011&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2009/08/screenshot_011-287x300.png&quot; alt=&quot;I win&quot; width=&quot;287&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;I win&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;source can be found at &lt;a href=&quot;https://launchpad.net/tictactoe&quot;&gt;lp:tictactoe&lt;/a&gt;, and jaunty/karmic packages are in my ppa &lt;a href=&quot;https://launchpad.net/~alexlauni/+archive/ppa&quot;&gt;https://launchpad.net/~alexlauni/+archive/ppa&lt;/a&gt;. I&amp;#8217;m still not sure if I&amp;#8217;m going to do intrepid, I think the other deps are too old. Feel free to file bugs, make patches, etc. I plan on maintaining it for what it&amp;#8217;s worth.&lt;/p&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 27 Aug 2009 01:44:31 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: tangerine 0.3.2.2! The one that probably works!</title>
	<guid>http://www.lamalex.net/?p=313</guid>
	<link>http://www.lamalex.net/2009/08/tangerine-0-3-2-2-the-one-that-probably-works/</link>
	<description>&lt;div class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/justaslice/&quot;&gt;&lt;img title=&quot;Seriously, this guy had no arms and rode a freewheel mountain bike.&quot; src=&quot;http://farm4.static.flickr.com/3379/3514257917_df25029939_m.jpg&quot; alt=&quot;Photo by Just A Slice (CC-BY-NC-ND)&quot; width=&quot;171&quot; height=&quot;240&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Photo by Just A Slice (CC-BY-NC-ND)&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Inspired by an armless, homeless, West Philadelphia man who rides his mountain bike down south 48th street periodically, I give you Tangerine 0.3.2.2!! 0.3.2.2 is entirely a bug fix release, with 8 kind of serious build bugs fixed. At this point everything should work out ok, all of the optional deps are actually optional, and no symlinking the banshee indexer library should be needed! I&amp;#8217;ve learned quite a big about autotools with these past couple releases, so future releases (0.4) should have fewer point releases due to dumb build issues. Check it out on launchpad! &lt;a href=&quot;https://launchpad.net/tangerine/0.3/0.3.2.2&quot;&gt;https://launchpad.net/tangerine/0.3/0.3.2.2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now onto 0.4! 0.4 is looking to get the plugins ported to Mono.Addins, a smarter, more robust logging system, become fully translatable, and will get a total change of infrastructure to a service based model similar to Banshee or GNOME Do.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s likely that 0.4 will no longer be cross platform as I don&amp;#8217;t have windows or a mac, but the point of the service based architecture is to make it so that being cross platform will be more maintainable, and not a series of preprocessor #if directives. If you&amp;#8217;d like to help out, PLEASE come hang out in #tangerine on GIMPnet, branch tangerine from launchpad (lp:tangerine), file bugs, register blueprints, etc., etc.&lt;/p&gt;
&lt;p&gt;Keep sharing!&lt;/p&gt;</description>
	<pubDate>Sun, 16 Aug 2009 15:57:16 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Whoops. Heres Tangerine 0.3.2.1! Now with a screenshot!</title>
	<guid>http://www.lamalex.net/?p=308</guid>
	<link>http://www.lamalex.net/2009/08/whoops-heres-tangerine-0-3-2-1-now-with-a-screenshot/</link>
	<description>&lt;p&gt;About 24 hours ago I released 0.3.1. I quickly realized I had forgotten something very important. I didn&amp;#8217;t set up the GUI to build. This is now fixed and I&amp;#8217;ve released 0.3.2.1! You can join the party at &lt;a href=&quot;https://launchpad.net/tangerine/0.3/0.3.2&quot;&gt;https://launchpad.net/tangerine/0.3/0.3.2.1&lt;/a&gt;. I don&amp;#8217;t really recommend using 0.3.1, although there are no code changes, one has a config gui and the other you have to write the config file yourself. If you&amp;#8217;re wondering why this is 0.3.2.1 and not just 0.3.2, well I did a 0.3.2, but then realized I had also forgotten to include a sample conf. So 0.3.2.1 has the gui and a sample conf for you. Also now the exec paths are correct on 64 bit thanks to my first patch from Paul Lange. Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-309&quot; title=&quot;tangerine-props&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2009/08/tangerine-props.png&quot; alt=&quot;tangerine-props&quot; width=&quot;306&quot; height=&quot;326&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 10 Aug 2009 04:45:41 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: I know you feel lied to from those other resurrections, but I swear this one is real. Announcing Tangerine 0.3.1</title>
	<guid>http://www.lamalex.net/?p=301</guid>
	<link>http://www.lamalex.net/2009/08/i-know-you-feel-lied-to-from-those-other-resurrections-but-i-swear-this-one-is-real-announcing-tangerine-0-3-1/</link>
	<description>&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-303&quot; title=&quot;tangerine-192&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2009/08/tangerine-192.png&quot; alt=&quot;tangerine-192&quot; width=&quot;192&quot; height=&quot;192&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Sharing is fun. When you&amp;#8217;re really little you want everything for yourself, but quickly you learn that playing is more fun when you share what you&amp;#8217;ve got. Now we&amp;#8217;re all grown up, we know that sharing is caring, but still we keep our media collections under lock and key. Let it out!&lt;/p&gt;
&lt;p&gt;Tangerine is a sharing program for your music. Tangerine allows you to share your media with people nearby over the DAAP protocol. Tangerine hooks into your media player, or watches your file system to share your collection, with the tags and info you&amp;#8217;ve given it. Your media- shared.&lt;/p&gt;
&lt;p&gt;Tangerine isn&amp;#8217;t new; Tangerine has been around for a little bit but unfortunately its development has stagnated. I love sharing, and I wanted to be able to share media from Banshee, so I talked to Snorp, and picked up development. Tangerine 0.3.1&amp;#8217;s only major &amp;#8220;feature&amp;#8221; is a ramped up Banshee plugin that will share your Banshee media collection, but if you ask me, the face that I&amp;#8217;ve moved development to Launchpad hosted bzr (lp:tangerine), bug tracker, and projectmanagement is a feature in and of itself. You can find all of the fun new project stuff at &lt;a href=&quot;https://launchpad.net/tangerine&quot;&gt;https://launchpad.net/tangerine&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But now the exciting part! We&amp;#8217;ve got a new release!! Tangerine 0.3.1!! &lt;a href=&quot;https://launchpad.net/tangerine/0.3/0.3.1&quot;&gt;https://launchpad.net/tangerine/0.3/0.3.1&lt;/a&gt;. The release tarball is linked from there, as is the md5sum. I haven&amp;#8217;t built packages yet, but they will be available from the &lt;a href=&quot;https://launchpad.net/~tangerine-developers/+archive/ppa&quot;&gt;tangerine-developers ppa&lt;/a&gt; in a couple of days.&lt;/p&gt;
&lt;p&gt;0.3.1 isn&amp;#8217;t a big release, but we&amp;#8217;ve got big plans. If you&amp;#8217;re interested take a look at the planned releases, and help us hack up those features, plus that one you think would make Tangerine a killer. We want to hear from you about bugs, wanted features, how much you love it, anything. We&amp;#8217;re on GIMPnet #tangerine, or our mailing list tangerine-users@lists.launchpad.net. Come chat, and share.&lt;/p&gt;</description>
	<pubDate>Sat, 08 Aug 2009 18:06:30 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Getting somewhere with Scala</title>
	<guid>http://yonkeltron.com/?p=569</guid>
	<link>http://yonkeltron.com/2009/07/31/getting-somewhere-with-scala/</link>
	<description>&lt;p&gt;Ok, so when beginning with Scala, it was hard to figure certain things out. For example, what&amp;#8217;s the best way to document my code? How should I go about testing my new programs? Which race in StarCraft best represents the ideals of Scala? Well, to prevent other people from getting stuck on these, I am writing this post to help out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Writing code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;How best to write code? Are there IDEs which support or maybe even encourage Scala? Yes! Yes, there are!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.scala-lang.org/node/91&quot;&gt;IDE plugins (Eclipe, NetBeans, IntelliJ)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.scala-lang.org/node/354&quot;&gt;Emacs&lt;/a&gt; &amp;#8211; and a post on how to &lt;a href=&quot;http://scala.sygneca.com//tools/emacs&quot;&gt;put many Scala pieces together with Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Project management&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;How best to keep track of Scala projects? Well, everyone&amp;#8217;s got their favorite way to build stuff (Make and cousins) and those will most likely work fine. However, if you want something a little more specialized there are several tools which can help.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/simple-build-tool/&quot;&gt;Simple Build Tool (sbt)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.scala-lang.org/node/345&quot;&gt;Apache Maven&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There is no one way to test Scala, and this is true of most langauges. However, Scala does include a test framework called SUnit. That being said, it&amp;#8217;s slated for deprecation as soon as it can be replaced and removed. Also, the current thinking out there seems to be that SUnit sucks. So, you know what, kids? We aren&amp;#8217;t going to let that bother us because there are many great frameworks out there which may be used to effectively test Scala. Since Scala compiles to Java bytecode, there shouldn&amp;#8217;t be trouble testing Scala from Java or Java from Scala.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.artima.com/scalatest/&quot;&gt;ScalaTest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/specs/&quot;&gt;Specs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/scalacheck/&quot;&gt;ScalaCheck&lt;/a&gt; (pseudo-clone of &lt;a href=&quot;http://www.cs.chalmers.se/~rjmh/QuickCheck/&quot;&gt;Haskell&amp;#8217;s QuickCheck&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://junit.org&quot;&gt;JUnit&lt;/a&gt; &amp;#8211; Oldie-but-goodie still works well from Java or from Scala (&lt;a href=&quot;http://junit.org/apidocs/org/junit/Assert.html&quot;&gt;helpful list of assertions&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Who doesn&amp;#8217;t love documentation? I know that I sure do! To help satisfy my deep-seated urge to author code-centric exposition, there is scaladoc. Ever hear of javadoc? Yeah, it&amp;#8217;s like that. &lt;a href=&quot;http://java.sun.com/j2se/javadoc/writingdoccomments/&quot;&gt;Read about javadoc here&lt;/a&gt; and then check out the &lt;a href=&quot;http://www.scala-lang.org/docu/files/tools/scaladoc.html&quot;&gt;scaladoc manpage&lt;/a&gt;. If, for some reason you don&amp;#8217;t like scaladoc&amp;#8217;s output, you&amp;#8217;re in luck because there is an &lt;a href=&quot;http://code.google.com/p/vscaladoc/&quot;&gt;alternative generator called vscaladoc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This list is most likely incomplete and certainly not exhaustive. If someone would like me to add something, please provide the link and info in the comments.&lt;/p&gt;</description>
	<pubDate>Fri, 31 Jul 2009 21:47:44 +0000</pubDate>
</item>
<item>
	<title>JonathanD: Mailing List Spammers</title>
	<guid>http://sogeekithurts.com/11 at http://sogeekithurts.com</guid>
	<link>http://sogeekithurts.com/?q=node/11</link>
	<description>&lt;p&gt;Yesterday I received some spam.  Just another day on the internet, right?  Well, this spam was special.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sogeekithurts.com/?q=node/11&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 29 Jul 2009 10:59:32 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Talks I am willing to give</title>
	<guid>http://yonkeltron.com/?p=560</guid>
	<link>http://yonkeltron.com/2009/07/20/talks-i-am-willing-to-give/</link>
	<description>&lt;p&gt;The following are possible talks I am willing to give at a future &lt;a href=&quot;http://scosug.org&quot;&gt;SCOSUG&lt;/a&gt; meeting.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Emacs concurrency (or lack thereof)&lt;/li&gt;
&lt;li&gt;XSLT for fun and profit&lt;/li&gt;
&lt;li&gt;Programming with distributed objects in Ruby&lt;/li&gt;
&lt;li&gt;Unit testing JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is all.&lt;/p&gt;</description>
	<pubDate>Mon, 20 Jul 2009 13:29:22 +0000</pubDate>
</item>
<item>
	<title>AndyML: Auto-Provisioning Linksys SPA phones for Asterisk</title>
	<guid>http://www.stuffjoeknows.net/?p=119</guid>
	<link>http://www.stuffjoeknows.net/?p=119</link>
	<description>Information on the web regarding automatic provisioning of these phones is limited at best, and the SPA Configuration Profile Compiler is no longer available for free, so I am sharing my experience provisioning a few of these phones in our office.
I have two Linksys IP Phones, model SPA962.  we are using AsteriskNOW 1.5.  I will [...]</description>
	<pubDate>Thu, 16 Jul 2009 12:15:52 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: The trouble with USE</title>
	<guid>http://yonkeltron.com/?p=553</guid>
	<link>http://yonkeltron.com/2009/07/15/the-trouble-with-use/</link>
	<description>&lt;p&gt;Today, I was caught a little off-guard by a question regarding the USE directive in SQL. While, it stumped me, it did give me pause to think. First and foremost, it occurred to me that part of the reason that I was caught off-guard was because, in the past, I&amp;#8217;ve been advised to stay away from USE or similar directives in any language for a variety of reasons. For example, in languages like Ada, a use directive is a perfect way to completely clobber a namespace. Regarding the usage of JavaScript&amp;#8217;s equivalent &lt;code&gt;with&lt;/code&gt; operator, guru &lt;a href=&quot;http://www.youtube.com/watch?v=hQVTIJBZook&quot;&gt;Douglas Crockford has dire warnings&lt;/a&gt; about actually writing programs which use it. Note, that the &lt;code&gt;using&lt;/code&gt; directive from C#, is equivalent to an &lt;code&gt;import&lt;/code&gt; in other languages (Python, Java) or even a &lt;code&gt;require&lt;/code&gt; (Lisp, Ruby).&lt;/p&gt;
&lt;p&gt;The perils of clobbering namespaces for the sake of convenience in any language are well know. Now, in some languages, a &lt;code&gt;use&lt;/code&gt; directive is not always the culprit when namespaces get clobbered. Languages which also have an &lt;code&gt;as&lt;/code&gt; clause can be dangerous as well because they obscure the true origin or name of a given object. &lt;/p&gt;
&lt;p&gt;Part of the reason is that using USE or one of it&amp;#8217;s friends is dangerous due to the fact that programmers risk forgetting that they used it. This kind of error is not restricted to the USE statement, however. For example, in Lisp, global variables are typically enclosed in asterisks by convention. So what, right? Well, early on in Practical Common Lisp, Peter Seibel points out that redirecting something like *standard-output* to point to another source, it would be all too easy to forget to put it back! Just like it&amp;#8217;s easy to screw up redirection by forgetting to put it back, USE in most languages makes it quite easy to make trivial mistakes. &lt;/p&gt;
&lt;p&gt;Now, I am not suggesting that these examples are directly equivalent. I am, however, making the point that, in this day and age, we are well aware of how easy it is to make careless mistakes and USE directives only make it easier. Say we have an example instance of an SQL server and there are a couple of databases in there. We want to work with two of them (called &lt;code&gt;panda&lt;/code&gt; and &lt;code&gt;bamboo&lt;/code&gt;) each but we&amp;#8217;ve got quite a lot to do with one. For an example such as this, &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/use.html&quot;&gt;databases like MySQL, provide USE&lt;/a&gt; only to be compatible with &lt;a href=&quot;http://en.wikipedia.org/wiki/Sybase#Products&quot;&gt;Sybase&lt;/a&gt; and even then only as a utility function.&lt;/p&gt;
&lt;p&gt;In any case, we&amp;#8217;re going back to the example. We&amp;#8217;re at the prompt and we&amp;#8217;re going to work with with our first database, panda. So to save ourselves trouble, we go forth with a &lt;code&gt;USE panda;&lt;/code&gt; and then go about our business. Then, we&amp;#8217;re ready to go ahead and delete a whole bunch of records from bamboo so we run our &lt;code&gt;DELETE * FROM trees;&lt;/code&gt; and all should be well, right? WRONG! We forgot to switch to the right database by using &lt;code&gt;USE bamboo;&lt;/code&gt; so now we&amp;#8217;re in trouble. While this is a simplistic example, the world would be hard-pressed to find a competent programmer who&amp;#8217;s never been tripped up by the most simple of errors.&lt;/p&gt;
&lt;p&gt;It is for this reason that I am wary of USE and it&amp;#8217;s friends. Unless there is a very good reason to USE USE, I suggest that programmers be very careful AS well AS when we USE AS. Together, they can be a tricky combo.&lt;/p&gt;</description>
	<pubDate>Wed, 15 Jul 2009 18:26:43 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Pete, Pete, meet math rock</title>
	<guid>http://www.lamalex.net/?p=289</guid>
	<link>http://www.lamalex.net/2009/07/pete-pete-meet-math-rock/</link>
	<description>&lt;p&gt;Just found this awesome video on Tera Melos&amp;#8217; myspace &amp;#8211; Tera Melos doing a Polaris cover! This is epic to say the least.&lt;br /&gt;
&lt;br /&gt;
and of course for the places where the flash embed doesn&amp;#8217;t work, here&amp;#8217;s a link &lt;a href=&quot;http://www.youtube.com/watch?v=oMt8HtDG8No&amp;amp;feature=player_embedded&quot;&gt;http://www.youtube.com/watch?v=oMt8HtDG8No&amp;amp;feature=player_embedded&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 12 Jul 2009 17:26:04 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: memeing it up</title>
	<guid>http://www.lamalex.net/?p=283</guid>
	<link>http://www.lamalex.net/2009/07/memeing-it-up/</link>
	<description>&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-286&quot; title=&quot;fist&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2009/07/fist.jpg&quot; alt=&quot;fist&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I wasn&amp;#8217;t at GCDS, so I didn&amp;#8217;t see Stallman&amp;#8217;s speech, and while I&amp;#8217;ve heard differing reports of its severity, I&amp;#8217;m not commenting on Stallman&amp;#8217;s speech. This is bigger than one irrelevant pseudo-celebrity&amp;#8217;s ignorant comments.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;I want the [...] open source [...] communities [I participate in] to be a dignified, respectful, inclusive, and welcoming place. … We’ve all been witnesses to off-color jokes, misogynistic back channel chatter, questionable imagery and unnecessary, trolling comments. I pledge to do better to stand up and call this behavior out when I see it in conferences, online and other public settings. I don’t expect it to go away but I’m not going to tacitly condone it any longer.&lt;/p&gt;&lt;/blockquote&gt;</description>
	<pubDate>Sat, 11 Jul 2009 22:32:39 +0000</pubDate>
</item>
<item>
	<title>Alex Launi</title>
	<guid>http://www.lamalex.net/?p=278</guid>
	<link>http://www.lamalex.net/2009/07/278/</link>
	<description>&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-277&quot; title=&quot;on-the-topic-of-mono&quot; src=&quot;http://www.lamalex.net/wp-content/uploads/2009/07/on-the-topic-of-mono.png&quot; alt=&quot;on-the-topic-of-mono&quot; width=&quot;600&quot; height=&quot;144&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 11 Jul 2009 17:23:28 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Does your philosophy influence the way you code: A worthless braindump</title>
	<guid>http://www.lamalex.net/?p=273</guid>
	<link>http://www.lamalex.net/2009/07/does-your-philosophy-influence-the-way-you-code-a-worthless-braindump/</link>
	<description>&lt;p&gt;Tonight while goofing off I had an interesting thought about why some of us prefer one type of programming language, and some of us like another, and why some people are fence walkers and do it all. I propose the following-&lt;/p&gt;
&lt;p&gt;People like me, people who like rigid, well defined, scientific philosophy, a la Immanuel Kant, prefer the strict typing, cold hard symmetry and stability of blocks wrapped in braces, don&amp;#8217;t like lots of what seems like magic prefer languages like C, C#, and, Java. Consider this block of code, does it make you warm?&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
public class Bruced&lt;br /&gt;
{&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
public override void ToString ()&lt;br /&gt;
{&lt;br /&gt;
throw new NotImplementedException (&quot;\nyo dawg, we heard you like exceptions\n&quot;&lt;br /&gt;
+ &quot;so we put exceptions in your exceptions\n&quot;&lt;br /&gt;
+ &quot;so you can try while you catch!\n&quot;);&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Mmm.. Just like mom used to make. With the big chunks of chocolate and everything.&lt;/p&gt;
&lt;p&gt;Now what about the other type of people? They like questions as answers to questions. They&amp;#8217;re busy talking about why there&amp;#8217;s nothing to talk about and how we&amp;#8217;re not really alive we&amp;#8217;re just figments and points in an N-dimensional universe where N is some complex system.&lt;br /&gt;
&lt;code&gt; def show_path(anode)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;#shows the path back from node &amp;#8216;anode&amp;#8217; by following the parent pointer&lt;/p&gt;
&lt;p&gt;curr=anode&lt;/p&gt;
&lt;p&gt;pathmap=@costmap.clone&lt;/p&gt;
&lt;p&gt;while curr.parent do&lt;/p&gt;
&lt;p&gt;pathmap[curr.y][curr.x]=&amp;#8217;*&amp;#8217;&lt;/p&gt;
&lt;p&gt;curr=curr.parent&lt;/p&gt;
&lt;p&gt;end&lt;/p&gt;
&lt;p&gt;pathmap[curr.y][curr.x]=&amp;#8217;*&amp;#8217;&lt;/p&gt;
&lt;p&gt;pathstr=&amp;#8221;\n&amp;#8221;&lt;/p&gt;
&lt;p&gt;pathmap.each_index do |row|&lt;/p&gt;
&lt;p&gt;pathmap[row].each_index do |col|&lt;/p&gt;
&lt;p&gt;pathstr&amp;lt;&amp;lt;&amp;#8221;|#{pathmap[row][col]}&amp;#8221;&lt;/p&gt;
&lt;p&gt;end&lt;/p&gt;
&lt;p&gt;pathstr&amp;lt;&amp;lt;&amp;#8221;|\n&amp;#8221;&lt;/p&gt;
&lt;p&gt;end&lt;/p&gt;
&lt;p&gt;pathstr&lt;/p&gt;
&lt;p&gt;end&lt;br /&gt;
WHAT???? I know less now than when I started. Yet some people zen out on this jawn. Just something meaningless to think about.&lt;/p&gt;</description>
	<pubDate>Fri, 10 Jul 2009 22:19:30 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Can I get a little MapReduce from my Debian people?</title>
	<guid>http://yonkeltron.com/?p=549</guid>
	<link>http://yonkeltron.com/2009/07/05/can-i-get-a-little-mapreduce-from-my-debian-people/</link>
	<description>&lt;p&gt;Debian is a world-class Linux distribution. It is used on it&amp;#8217;s own for so many applications (desktop, laptop, workstation, handeld, server, etc.) as well as the foundation for so many wonderful projects ((U|K|X)buntu, Maemo, etc.). Personally, I run Debian on my laptop as well as my servers.  In fact, when I went to see about setting up a little ad-hoc cluster, I was rather disappointed. Though there are a few &lt;a href=&quot;http://packages.debian.org/search?keywords=redhat-cluster-suite&quot;&gt;clustering tools available&lt;/a&gt;, as well as several distributed filesystems (&lt;a href=&quot;http://packages.debian.org/search?keywords=gfs2&quot;&gt;GFS&lt;/a&gt;, &lt;a href=&quot;http://packages.debian.org/search?keywords=gluster&quot;&gt;GlusterFS&lt;/a&gt;, &lt;a href=&quot;http://packages.debian.org/search?keywords=ocfs2&quot;&gt;OCFS2&lt;/a&gt;, and &lt;a href=&quot;http://packages.debian.org/search?keywords=lustre&quot;&gt;Lustre&lt;/a&gt;), shockingly, I could not find any implementation of MapReduce available in the Debian repositories.&lt;/p&gt;
&lt;p&gt;For those who might not know, MapReduce is a novel data-processing system developed by Google for internal usage and described in their publication entitled &lt;a href=&quot;http://labs.google.com/papers/mapreduce.html&quot;&gt;&lt;em&gt;MapReduce: Simplified Data Processing on Large Clusters&lt;/em&gt;&lt;/a&gt;. For the enlightened out there, it should be clear that the name and mechanism are derived from Lisp&amp;#8217;s &lt;code&gt;map&lt;/code&gt; and &lt;code&gt;reduce&lt;/code&gt; functions. In any case, though Google&amp;#8217;s implementation is proprietary, there have been several implementations based on their paper both written in and geared toward a variety of programming languages. Unfortunately, none of these are available in the Debian repositories. In all fairness, Debian does include &lt;a href=&quot;http://couchdb.apache.org/&quot;&gt;CouchDB&lt;/a&gt; which uses map and reduce functions for generating views. However, it&amp;#8217;s not a solution aimed at sorting and processing huge amounts of data, though it is an interesting and capable piece of software.&lt;/p&gt;
&lt;p&gt;So, to try and get things moving, I have filed three Debian RFPs (Request For Package) for a few seperate MapReduce implementations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=535861&quot;&gt;Hadoop&lt;/a&gt; &amp;#8211; Probably the most well-known of the Free/Open Source implementations. Includes a distributed filesystem (HDFS), scaleable distributed database (HBase) and tools to get you going from start to finish. Hadoop is written in Java though it can interoperate with other languages (&lt;a href=&quot;http://scala-blogs.org/2008/09/scalable-language-and-scalable.html&quot;&gt;Scala&lt;/a&gt;, too). It&amp;#8217;s a top-level project of the &lt;a href=&quot;http://www.apache.org/&quot;&gt;Apache Software Foundation&lt;/a&gt; and licensed under the &lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0.html&quot;&gt;Apache License 2.0&lt;/a&gt; &amp;#8211; &lt;a href=&quot;http://hadoop.apache.org/&quot;&gt;http://hadoop.apache.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=535898&quot;&gt;Skynet&lt;/a&gt; &amp;#8211; A MapReduce implementation written in Ruby. It&amp;#8217;s designed to be fault-tolerant and distrubuted, just like the big boys. Originally written for use at &lt;a href=&quot;http://www.geni.com&quot;&gt;Geni.com&lt;/a&gt; and licensed under the &lt;a href=&quot;http://www.opensource.org/licenses/mit-license.php&quot;&gt;MIT License&lt;/a&gt; &amp;#8211; &lt;a href=&quot;http://skynet.rubyforge.org/&quot;&gt;http://skynet.rubyforge.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=535891&quot;&gt;Disco&lt;/a&gt; &amp;#8211; Though the implementation is itself written in Erlang, thus providing excellent distributed fault-tolerance, Disco jobs can be written in Python. It was &lt;a href=&quot;http://research.nokia.com/&quot;&gt;developed as an in-house tool for rapid data analysis at Nokia&lt;/a&gt; and they seem to be quite keen on it. Disco is licensed under a modified BSD License. Page at &lt;a href=&quot;http://discoproject.org/&quot;&gt;http://discoproject.org/&lt;/a&gt; and code at &lt;a href=&quot;http://github.com/tuulos/disco/tree/master&quot;&gt;http://github.com/tuulos/disco/tree/master&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ok, there might be a few objections to my choices. Why did I leave out neat projects like &lt;a href=&quot;http://www.gridgain.com/&quot;&gt;GridGain&lt;/a&gt;, &lt;a href=&quot;http://mfisk.github.com/filemap/&quot;&gt;FileMap&lt;/a&gt; and &lt;a href=&quot;http://blog.last.fm/2009/04/06/mapreduce-bash-script&quot;&gt;BashReduce&lt;/a&gt;? Well, for starters, GridGain is another Java implementation that doesn&amp;#8217;t seem (at least to me) to have the same momentum Hadoop does. FileMap and BashReduce, while novel, useful and fascinating, are not designed for use in networked environments and are therefore unsuitable for cluster situations. So then whey not &lt;a href=&quot;http://mapsharp.codeplex.com/&quot;&gt;MapSharp&lt;/a&gt;? Well, primarily because of all the &lt;a href=&quot;http://www.itwire.com/content/view/25954/1231/&quot;&gt;Debian Mono debates&lt;/a&gt; going on right now (Gnome&amp;#8217;s fail!) . I&amp;#8217;ve done work in C# and it&amp;#8217;s got some neat features but cool stuff doesn&amp;#8217;t and &lt;a href=&quot;http://www.fsf.org/news/dont-depend-on-mono&quot;&gt;will not ensure that users are not liable from patent litigation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also, it seems like those RFPs have some mistakes, so if anyone figures out how to edit them, let me know so I can clean them up.&lt;/p&gt;</description>
	<pubDate>Sun, 05 Jul 2009 20:13:17 +0000</pubDate>
</item>
<item>
	<title>yonkeltron: Languages, platforms, paradigms and speed</title>
	<guid>http://yonkeltron.com/?p=545</guid>
	<link>http://yonkeltron.com/2009/07/02/languages-platforms-paradigms-and-speed/</link>
	<description>&lt;p&gt;Ever since the &lt;a href=&quot;http://www.infoq.com/news/2008/12/ruby-performance-shootout&quot;&gt;latest round&lt;/a&gt; of &lt;a href=&quot;http://www.infoq.com/news/2009/05/performance-191-gc-compiler&quot;&gt;Ruby benchmarks&lt;/a&gt; came out and everyone got all excited, I got to thinking about the overall discussion about languages and the interpreted vs. compiled debate. To be fair, there will always be those who take a specific side for some small-but-important-to-them reason yet this has not stopped so many projects from bridging the gap, albeit with varying degrees of success. In many instances, it comes down to the different approaches taken by various language themselves and the payoffs they offer.&lt;/p&gt;
&lt;p&gt;In my investigation, I came across some very enlightening sources of information on the overall discussion of language speed, code optimization and the tension between different paradigms. Please peruse the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=kKySEUrP7LA&quot;&gt;Compiling and Optimizing Scripting Languages&lt;/a&gt; &amp;#8211; Google Tech Talk by one of the maintainers of &lt;a href=&quot;http://www.phpcompiler.org/&quot;&gt;phc&lt;/a&gt;, the PHP compiler.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=OKFeLZqLxzQ&quot;&gt;Compiling Dynamic Languages&lt;/a&gt; &amp;#8211; Another Google Tech Talk focusing on optimization of Python.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.pphsg.org/cdsmith/types.html&quot;&gt;What To Know Before Debating Type Systems&lt;/a&gt; &amp;#8211; From the neo-classics department, this essay by Chris Smith helped me gain a great deal of perspective with respect to type systems&lt;/li&gt;
&lt;li&gt;LLVM stuff &amp;#8211; &lt;a href=&quot;http://www.youtube.com/watch?v=VeRaLPupGks&quot;&gt;Google Tech Talk about LLVM 2.0&lt;/a&gt;, tons of &lt;a href=&quot;http://llvm.org/pubs/&quot;&gt;LLVM-related&lt;/a&gt; papers and presentations&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://arxiv.org/abs/0902.2137&quot;&gt;A formally verified compiler back-end&lt;/a&gt; &amp;#8211; Paper by Xavier Leroy that was too long for me to finish&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Something missing from this list?&lt;/p&gt;</description>
	<pubDate>Fri, 03 Jul 2009 02:13:15 +0000</pubDate>
</item>
<item>
	<title>JonathanD: Southeast Linuxfest: We're back.</title>
	<guid>http://sogeekithurts.com/10 at http://sogeekithurts.com</guid>
	<link>http://sogeekithurts.com/?q=node/10</link>
	<description>&lt;p&gt;Got back from SELF about 2 weeks ago.  It was by far the best FOSS event I've been to, not that I've been to that many.&lt;br /&gt;
It bugs me that there aren't very many good ones.  Ohio linuxfest is well spoken of, but it's pretty far, not that SELF was any better.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sogeekithurts.com/?q=node/10&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 26 Jun 2009 14:18:55 +0000</pubDate>
</item>
<item>
	<title>Alex Launi: Jolicloud + Do bring the awesome</title>
	<guid>http://www.lamalex.net/?p=264</guid>
	<link>http://www.lamalex.net/2009/06/jolicloud-do-bring-the-awesome/</link>
	<description>&lt;p&gt;I&amp;#8217;ve yet to really blog about what I&amp;#8217;ve been doing this summer, not because it&amp;#8217;s been top secret, mostly because I&amp;#8217;m lazy and have been incredibly busy. I started off at UDS in Barcelona, thanks to Canonical. UDS was a blast, we got a lot done, and I can&amp;#8217;t wait to see how Karmic turns out.&lt;/p&gt;
&lt;p&gt;So what have I been up to since UDS? Well, I got stuck in Barcelona for a few days more than I had expected, which although expensive, was a lot of fun. I met a bunch of cool dudes from Canada (If you read this get in touch! Haven&amp;#8217;t been able to find you guys on facebook!), and some other sweet people. Good stuff. Since then I&amp;#8217;ve been in Paris, where I&amp;#8217;m working for &lt;a href=&quot;http://www.jolicloud.com&quot;&gt;Jolicloud&lt;/a&gt;, where I&amp;#8217;m putting my self-described usability expertise to good use. I&amp;#8217;ve learned a bit of ruby, done some C, some Python, but mostly I&amp;#8217;ve been working on making Do kick absolute ass on JoliCloud. Want to see what I&amp;#8217;ve been up to? Check out this short screencast I made demonstrating the awesome. This stuff is a work in progress, and although I&amp;#8217;m moving quickly some of this is brand new so expect to see some changes before the final release.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Or, if you&amp;#8217;re getting this via a feed reader, here&amp;#8217;s the link to &lt;a href=&quot;http://www.youtube.com/watch?v=jz65iCBjarE&quot;&gt;YouTube&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Wed, 24 Jun 2009 16:36:31 +0000</pubDate>
</item>

</channel>
</rss>
