<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MatBurt</title>
	<atom:link href="http://matburt.net/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://matburt.net</link>
	<description>Thoughts on Software, Electronics, and Mathematics</description>
	<lastBuildDate>Fri, 03 Sep 2010 02:40:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Update to Yahoo Fantasy Football stats project</title>
		<link>http://matburt.net/?p=103</link>
		<comments>http://matburt.net/?p=103#comments</comments>
		<pubDate>Fri, 03 Sep 2010 02:36:52 +0000</pubDate>
		<dc:creator>mat</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://matburt.net/?p=103</guid>
		<description><![CDATA[Last year I released a tool that lets you track a Yahoo Fantasy Football league in Python. Recently I finished a complete refactor of it into more of an API, so it can be used directly by other projects or scripts. It also includes an example script that just dumps the information to stdout. Check [...]]]></description>
			<content:encoded><![CDATA[<p>Last year I <a href="http://matburt.net/?p=81">released</a> a tool that lets you track a Yahoo Fantasy Football league in Python.  Recently I finished a complete refactor of it into more of an API, so it can be used directly by other projects or scripts.  It also includes an example script that just dumps the information to stdout.</p>
<p>Check out the updated project page and README:<br />
<a href="http://github.com/matburt/fantasy-tracker">http://github.com/matburt/fantasy-tracker</a></p>
]]></content:encoded>
			<wfw:commentRss>http://matburt.net/?feed=rss2&amp;p=103</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MobileOrg for Android</title>
		<link>http://matburt.net/?p=94</link>
		<comments>http://matburt.net/?p=94#comments</comments>
		<pubDate>Fri, 26 Feb 2010 03:55:02 +0000</pubDate>
		<dc:creator>mat</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://matburt.net/?p=94</guid>
		<description><![CDATA[Lately I&#8217;ve been working on a version of MobileOrg for the Android platform. If you are an iPhone user then check out the main MobileOrg site or the store for it. MobileOrg is a free and open source application for storing, searching, viewing and editing your Org-mode files. If you are an emacs user and [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I&#8217;ve been working on a version of <a href="http://mobileorg.ncogni.to/">MobileOrg</a> for the Android platform.  If you are an iPhone user then check out the main MobileOrg site or the store for it.  MobileOrg is a free and open source application for storing, searching, viewing and editing your <a href="http://http://orgmode.org/">Org-mode</a> files.   If you are an <a href="http://www.gnu.org/software/emacs/">emacs</a> user and you aren&#8217;t using Org-mode then you should definitely check it out.  From the website it is: &#8220;an Emacs Mode for Notes, Project Planning, and Authoring&#8221;.</p>
<p>Org-mode has become an integrated part of my life, I use it mostly for notetaking and task planning so having it on my Droid would be extremely powerful for me.</p>
<p>This early alpha version is slim on features and has a few bugs but it is a great start for putting the contents of your Org files in the palm of your hand.   My goal is to reach feature parity with the iPhone version and extend the application to make use of some things available to Android like Widgets.</p>
<p>You can find release notes and access to the source code and download links on the Wiki page on Github: <a href="http://wiki.github.com/matburt/mobileorg-android/">http://wiki.github.com/matburt/mobileorg-android</a></p>
]]></content:encoded>
			<wfw:commentRss>http://matburt.net/?feed=rss2&amp;p=94</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PyCon 2010</title>
		<link>http://matburt.net/?p=90</link>
		<comments>http://matburt.net/?p=90#comments</comments>
		<pubDate>Tue, 23 Feb 2010 02:14:12 +0000</pubDate>
		<dc:creator>mat</dc:creator>
				<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://matburt.net/?p=90</guid>
		<description><![CDATA[Spent this past weekend at PyCon in Atlanta and had a great time. Most of the talks were pretty good, though there were some duds. You can find videos of the talks online but I thought I would post my notes from a few talks that I went to. These notes are mostly things that [...]]]></description>
			<content:encoded><![CDATA[<p>Spent this past weekend at PyCon in Atlanta and had a great time.</p>
<p>Most of the talks were pretty good, though there were some duds.  You can find videos of the talks online but I thought I would post my notes from a few talks that I went to.   These notes are mostly things that I found interesting or noteworthy and I didn&#8217;t take notes for every talk I went to.  This file is in org-mode plaintext format.</p>
<p><a href="http://matburt.net/files/pycon2010.txt">PyCon 2010 Notes</a></p>
]]></content:encoded>
			<wfw:commentRss>http://matburt.net/?feed=rss2&amp;p=90</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Occam&#8217;s Razor</title>
		<link>http://matburt.net/?p=84</link>
		<comments>http://matburt.net/?p=84#comments</comments>
		<pubDate>Tue, 24 Nov 2009 21:26:01 +0000</pubDate>
		<dc:creator>mat</dc:creator>
				<category><![CDATA[WTF]]></category>

		<guid isPermaLink="false">http://matburt.net/?p=84</guid>
		<description><![CDATA[A couple of days ago I discovered a bug in a popular piece of software that we use at work&#8230; it took a few back and forth conversations with one of the developers on the mailing list but I was able to work past it and find a solution that put my system back on [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of days ago I discovered a bug in a popular piece of software that we use at work&#8230; it took a few back and forth conversations with one of the developers on the mailing list but I was able to work past it and find a solution that put my system back on track.   This little nugget came in today as a follow up to that conversation after another person (not a developer of this product) had asked me if I thought it could be bad memory&#8230; I assured him that we had looked at that as a possibility and ruled it out.   Then there was this:</p>
<blockquote><p>You lost the contents of one file didn&#8217;t you?  Hits on memory from<br />
cosmic rays cause random single bit flips at a small but measurable<br />
rate&#8211;though ECC memory should help.  These could cause something in<br />
Linux&#8217;s page buffer to go awry and hence ending up with an empty file<br />
when unexpected.  The bug rate of normal software means that that<br />
these sorts of errors are almost completely masked, however when code<br />
matures these sorts of errors start to become important.<br />
&#8230;<br />
Higher assurance software tends to include checksums and other simple<br />
invariants that are checked at various places in code to make sure that<br />
errors like this aren&#8217;t propagated too far.</p></blockquote>
<p>That is the most ridiculous thing I have ever read&#8230; never mind that I had already ruled out any hardware problems.  I&#8217;ve been writing code for a long time and in the infrequent times where memory in a production system has gone bad I have never chalked it up to cosmic rays.</p>
<p>Come to think of it&#8230; I think I&#8217;ll open a bug against myself in all of my projects marked <strong>&#8220;Cosmic rays cause unpredictable behavior&#8221;</strong> and any time I come across something that&#8217;s unreproducible I&#8217;ll just mark it as a dupe of that one.</p>
]]></content:encoded>
			<wfw:commentRss>http://matburt.net/?feed=rss2&amp;p=84</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yahoo Fantasy Football Stats via Python</title>
		<link>http://matburt.net/?p=81</link>
		<comments>http://matburt.net/?p=81#comments</comments>
		<pubDate>Sun, 06 Sep 2009 19:21:02 +0000</pubDate>
		<dc:creator>mat</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://matburt.net/?p=81</guid>
		<description><![CDATA[This post is out of date, the program has been updated to work for 2010 see here: http://matburt.net/?p=103 Every year around this time I find myself faced with a problem. I really enjoy football and playing fantasy football but I&#8217;m pretty much locked into Yahoo&#8217;s terrible web interface. Each year I tell myself I&#8217;m going [...]]]></description>
			<content:encoded><![CDATA[<p><em>This post is out of date, the program has been updated to work for 2010 see here: <a href="http://matburt.net/?p=103">http://matburt.net/?p=103</a></em></p>
<p>Every year around this time I find myself faced with a problem.  I really enjoy football and playing fantasy football but I&#8217;m pretty much locked into Yahoo&#8217;s terrible web interface.</p>
<p>Each year I tell myself I&#8217;m going to throw something together so I can access my Yahoo Fantasy leagues in Python and somehow bypass needing a web browser altogether.</p>
<p>Since I&#8217;m managing a team for my employer in a multi-company league I thought it would be nice to be able to generate an RSS feed so that everyone in the company could see how we are doing without needing to access the team or league pages directly.</p>
<p>This small Python utility uses Beautiful Soup, Mechanize and PyRSS2Gen to login to Yahoo and scrape the main league page for the appropriate details.</p>
<p><a href="http://git.matburt.net/cgi-bin/gitweb.cgi?p=fantasy-tracker.git;a=summary">fantasy-tracker project on git.matburt.net</a></p>
<p>Wouldn&#8217;t it be nice if Yahoo actually provided an API so that we didn&#8217;t have to do stupid stuff like this?</p>
<p>It should be easy to take and extend this to do other things and make it more featureful.  Like dbus notifications and whatnot.</p>
]]></content:encoded>
			<wfw:commentRss>http://matburt.net/?feed=rss2&amp;p=81</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>FreeBSD on Asus EeePC 1000HE</title>
		<link>http://matburt.net/?p=77</link>
		<comments>http://matburt.net/?p=77#comments</comments>
		<pubDate>Thu, 14 May 2009 02:39:01 +0000</pubDate>
		<dc:creator>mat</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[eeepc]]></category>

		<guid isPermaLink="false">http://matburt.net/?p=77</guid>
		<description><![CDATA[For my birthday this year I was given a brand new Asus EeePC 1000HE, one of those fancy new netbooks.  It came pre-loaded with Windows XP which didn&#8217;t last too long.  I was aware going into it that OpenBSD wouldn&#8217;t recognize the wireless card so I thought I&#8217;d give FreeBSD a shot. The challenge to [...]]]></description>
			<content:encoded><![CDATA[<p>For my birthday this year I was given a brand new Asus EeePC 1000HE, one of those fancy new netbooks.  It came pre-loaded with Windows XP which didn&#8217;t last too long.  I was aware going into it that OpenBSD wouldn&#8217;t recognize the wireless card so I thought I&#8217;d give FreeBSD a shot.</p>
<p>The challenge to getting FreeBSD on this system is that it doesn&#8217;t have an optical drive and FreeBSD doesn&#8217;t have a really easy way to load the system from a USB disk.  You&#8217;ll need to bootstrap your own following instructions you find at the <a href="http://wiki.freebsd.org/AsusEee">FreeBSD EeePC Wiki</a>.</p>
<p>I installed FreeBSD 7.2 from the bootonly image.  The ethernet device was recognized but not marked &#8216;Up&#8217; for some reason so I had to use the emergency shell to bring it up but after that I was able to perform a network install and then upgrade to CURRENT.</p>
<p>It looks as though the Atheros 9280 is supported pretty well, though you need to follow the man pages for creating the wlan0 device to be able to use it, I&#8217;m also using WPA2 on my home wireless network.  powerd also works, here&#8217;s my rc.conf that, along with wpa_supplicant will bring up the wireless device and enable powerd.</p>
<pre>wlans_ath0="wlan0"
ifconfig_wlan0="WPA DHCP"
powerd_enable="YES"</pre>
<p>and the relevant entries in /boot/loader.conf:</p>
<pre>snd_hda_load="YES"
acpi_asus_load="YES"
acpi_video_load="YES"
hw.acpi.reset_video="1"
hw.acpi.sleep_button_state="S3"
hw.psm.synaptics_support="1"</pre>
<p>There are a few things that I have not tested&#8230; like the camera, and I can confirm that as of right now suspend does not work.   Power usage is fantastic, however.</p>
<p>It did take a little configuring to get Xorg to work but it does nicely, with direct rendering here is my xorg:</p>
<p><a href="http://matburt.net/files/xorg.freebsd.eeepc.conf">xorg.freebsd.eeepc.conf</a></p>
<p>And my dmesg:</p>
<p><a href="http://matburt.net/files/dmesg.eeepc.freebsd">dmesg.eeepc.freebsd</a></p>
]]></content:encoded>
			<wfw:commentRss>http://matburt.net/?feed=rss2&amp;p=77</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Splicing Internet Radio Streams with Python</title>
		<link>http://matburt.net/?p=70</link>
		<comments>http://matburt.net/?p=70#comments</comments>
		<pubDate>Mon, 20 Apr 2009 06:05:10 +0000</pubDate>
		<dc:creator>mat</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://matburt.net/?p=70</guid>
		<description><![CDATA[During the day I like to listen to various audio streams so I find myself switching back and forth between music and news.  Wouldn&#8217;t it be nice if you could play streams for a given amount of time?  I couldn&#8217;t find anything that did it automatically so I wrote this quick Python program to do [...]]]></description>
			<content:encoded><![CDATA[<p>During the day I like to listen to various audio streams so I find myself switching back and forth between music and news.  Wouldn&#8217;t it be nice if you could play streams for a given amount of time?  I couldn&#8217;t find anything that did it automatically so I wrote this quick Python program to do it (requires pymad):</p>
<p><a href="http://git.matburt.net/cgi-bin/gitweb.cgi?p=musplice.git;a=summary">Musplice Project Page</a></p>
<p>You can download the latest version here:</p>
<p><a href="http://git.matburt.net/cgi-bin/gitweb.cgi?p=musplice.git;a=snapshot;h=HEAD;sf=tgz">http://git.matburt.net/cgi-bin/gitweb.cgi?p=musplice.git;a=snapshot;h=HEAD;sf=tgz</a></p>
<p>It&#8217;s pretty simple and straightforward setup script that installs the module, a musplice bin launcher, and a config file in /etc.  The example script plays<a href="http://somafm.com/play/groovesalad"> Groove Salad</a> for an hour and then switches over to <a href="http://www.wunc.org">WUNC</a>, a public radio station in Raleigh, NC for 15 minutes.  You can add as many sections as you want to play different streams at different times.  If there is a stream that is a fixed length and you want to play all of it just set it&#8217;s time to: all</p>
<p>If /dev/dsp is not your sound device then you should set it in the &#8216;device&#8217; section.  My sound device in OpenBSD is /dev/sound.  There is some initial ALSA support that doesn&#8217;t play to well if you set the device to: alsa</p>
<p>There is a simple cli interface, that takes a few commands&#8230; see the README for more details.</p>
<p>It&#8217;s a pretty simple 200 line program that I&#8217;ll probably enhance as I see fit since I tend to use it pretty frequently.</p>
]]></content:encoded>
			<wfw:commentRss>http://matburt.net/?feed=rss2&amp;p=70</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bad Server</title>
		<link>http://matburt.net/?p=68</link>
		<comments>http://matburt.net/?p=68#comments</comments>
		<pubDate>Wed, 18 Mar 2009 16:15:37 +0000</pubDate>
		<dc:creator>mat</dc:creator>
				<category><![CDATA[Site]]></category>
		<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://matburt.net/?p=68</guid>
		<description><![CDATA[So I realized today that my database has been down for two days without me realizing it. It appears that it just shut itself down at some point and never came back. I&#8217;ve decided to give Monit a try for monitoring and notification of bad things like this happening. Do you use something similar with [...]]]></description>
			<content:encoded><![CDATA[<p>So I realized today that my database has been down for two days without me realizing it.   It appears that it just shut itself down at some point and never came back.</p>
<p>I&#8217;ve decided to give Monit a try for monitoring and notification of bad things like this happening.   Do you use something similar with good results?  If so let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://matburt.net/?feed=rss2&amp;p=68</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An interesting problem in Python</title>
		<link>http://matburt.net/?p=59</link>
		<comments>http://matburt.net/?p=59#comments</comments>
		<pubDate>Tue, 10 Feb 2009 13:00:04 +0000</pubDate>
		<dc:creator>mat</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://matburt.net/?p=59</guid>
		<description><![CDATA[I like to tell stories about poorly written code.  As a programmer you come across it all the time, and good programmers work really hard to make sure everything they write is both clean and as free from bugs as you can make it.  There is a reason, though, that we spend so much time [...]]]></description>
			<content:encoded><![CDATA[<p>I like to tell stories about poorly written code.   As a programmer you come across it all the time, and good programmers work really hard to make sure everything they write is both clean and as free from bugs as you can make it.  There is a reason, though, that we spend so much time fixing bugs and that&#8217;s because it can be extremely difficult to write bug free code.  This problem that I encountered recently at work is one of those bugs that just sneaks up on you and punches you in the face&#8230; see if you can find the bug:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> createProc<span style="color: black;">&#40;</span>acmd<span style="color: black;">&#41;</span>:
    dn = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;/dev/null&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">call</span><span style="color: black;">&#40;</span>acmd, stdout=dn, stderr=dn<span style="color: black;">&#41;</span></pre></div></div>

<p>I honestly did not see it at first and debugging it was a real pain, but if you study it and maybe take a quick refresh of the Python documentation you&#8217;ll see it.   In this case the program being spawned was crashing infrequently, and it would only fail if the program it was calling had an error.  Here&#8217;s how this function should have been written:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> createProc<span style="color: black;">&#40;</span>acmd<span style="color: black;">&#41;</span>:
    dn = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;/dev/null&quot;</span>, <span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">call</span><span style="color: black;">&#40;</span>acmd, stdout=dn, stderr=dn<span style="color: black;">&#41;</span></pre></div></div>

<p>By now it should be obvious.  Python&#8217;s default open() mode is &#8220;r&#8221;ead.  This program was normally silent, but whenever it had a problem it would write an error message stderr and then quit.   The first time it tried to write to stderr it would throw an exception within the subprocess context, without being raised into the calling process.  If you tried to just open a file in Python without setting &#8220;w&#8221;rite mode and write to it the interpreter would throw an IOError telling you that the file handle is invalid but because of the call to fork() you would never see that exception in the calling function&#8230; just a return code of 1.</p>
<p>I actually found this problem while trying to track down another issue:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> createProc_bad<span style="color: black;">&#40;</span>acmd<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">call</span><span style="color: black;">&#40;</span>acmd, stdout=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span>,
                                 stderr=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span><span style="color: black;">&#41;</span></pre></div></div>

<p>This also seems rather benign.  Well, as benign as something can be when you are forking another process but in this case the process would hang!   This time the problem was a little easier to track down.   I&#8217;ve done a lot of work on pipes and I know enough about Python&#8217;s implementation to know that it was probably blocking on the pipe because we were never reading from it.  Once that pipe buffer fills up the process will block waiting to write to it and the application wouldn&#8217;t be able to make progress.   Here&#8217;s a good solution if you may need the data that would be written to those pipes and don&#8217;t want to worry about reading from it as the process progresses:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> createProc_better<span style="color: black;">&#40;</span>acmd<span style="color: black;">&#41;</span>:
    proc = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">Popen</span><span style="color: black;">&#40;</span>acmd, stdout=PIPE, stderr=PIPE<span style="color: black;">&#41;</span>
    <span style="color: black;">&#40;</span>sout, serr<span style="color: black;">&#41;</span> = proc.<span style="color: black;">communicate</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    rc = proc.<span style="color: black;">wait</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>rc, <span style="color: black;">&#40;</span>sout, serr<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>One has to be careful with this implementation, though.   Python will store this information in heap and it will quickly blow up the interpreter&#8217;s memory usage.   If you didn&#8217;t care about the output you could just redirect it to /dev/null as shown above.</p>
]]></content:encoded>
			<wfw:commentRss>http://matburt.net/?feed=rss2&amp;p=59</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XMonad: A tiling window manager written in Haskell</title>
		<link>http://matburt.net/?p=36</link>
		<comments>http://matburt.net/?p=36#comments</comments>
		<pubDate>Sun, 08 Feb 2009 07:12:20 +0000</pubDate>
		<dc:creator>mat</dc:creator>
				<category><![CDATA[Haskell]]></category>
		<category><![CDATA[xmonad]]></category>

		<guid isPermaLink="false">http://matburt.net/?p=36</guid>
		<description><![CDATA[For a very long time I have been floating back and forth between a handfull of windows managers trying to find something that I like and doesn&#8217;t get in my way.  The one I have always gravitated to is Window Maker, simply because it is minimal and has a ridiculously small footprint.  I&#8217;ve also used [...]]]></description>
			<content:encoded><![CDATA[<p>For a very long time I have been floating back and forth between a handfull of windows managers trying to find something that I like and doesn&#8217;t get in my way.  The one I have always gravitated to is Window Maker, simply because it is minimal and has a ridiculously small footprint.  I&#8217;ve also used Gnome and KDE from time to time but they just try to do too much and I need something that will support my terminal driven usage habbits.</p>
<p>Since I&#8217;ve been doing a lot of functional programming lately, a lot of which being in Haskell, I thought it was time to re-evaluate my window manager situation.  This is where <a href="http://xmonad.org" target="_blank">xmonad</a> comes in.</p>
<p>To be honest, I&#8217;ve never given much though to tiling window managers and I&#8217;m not sure why.  I&#8217;ve been using xmonad for the last 6 months and it is simply beautiful.  It can be driven entirely from the keyboard with some dead simple keybindings that are customizable.  I found myself changing the meta key used in most keybindings to the silly windows key on the keyboard&#8230; for a long time this key was worthless to me but xmonad likes to use Alt by default for most commands which conflicts with Emacs in some situations.  Configuration can be a little difficult for anyone who is not familiar with Haskell but there are plenty of examples and the code itself doesn&#8217;t require any advanced programming skill.</p>
<p>Another thing that impresses me is how well it handles multiple displays and multiple desktops.  Each screen&#8217;s desktop is capable of displaying any one of my 10 virtual desktops and they can be selected independently.  This may seem very rudimentary but the way that xmonad handles this is very elegant.  Per-desktop layouts are also excellent, and it&#8217;s a quick keystroke to switch between layouts.</p>
<p><a href="http://www.matburt.net/images/desk1.png"><img class="alignleft" title="Desktop1" src="http://www.matburt.net/images/desk1_small.png" alt="" width="200" height="125" /></a><a href="http://www.matburt.net/images/desk2.png"><img class="alignright" title="Desktop2" src="http://www.matburt.net/images/desk2_small.png" alt="" width="200" height="125" /></a></p>
<p>It almost goes without saying that the aim of the project is to provide a crash free experience and I can back this up.  Since I have been using it it has crashed exactly zero times.  It also has a massive <a href="http://http://xmonad.org/xmonad-docs/xmonad-contrib/" target="_blank">extension library</a> that includes dozens of layouts, support for docks, panels, prompts and more.   It even has extensions to use it with Gnome and KDE.</p>
<p>The only problem I could imagine someone having is in writing a configuration file.  Luckily there is an <a href="http://haskell.org/haskellwiki/Xmonad/Config_archive" target="_blank">archive of user submitted configuration files</a> demonstrating pretty much everything that it can possibly do.  As is the case for the Haskell community in general there is also a wonderful user base to support it and any one who wants to use it.</p>
]]></content:encoded>
			<wfw:commentRss>http://matburt.net/?feed=rss2&amp;p=36</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
