<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-223882500590899233</id><updated>2012-02-16T19:00:11.212-08:00</updated><title type='text'>Full of leaves</title><subtitle type='html'>Thoughts on software, programming, music, and education.  And other stuff.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default?start-index=101&amp;max-results=100'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>114</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-4736475654563099425</id><published>2012-02-02T13:19:00.000-08:00</published><updated>2012-02-02T13:19:59.425-08:00</updated><title type='text'>CloudCoder, a web-based programming exercise system</title><content type='html'>Well, I haven't updated my blog in a really long time, so here goes...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.knox.edu/academics/faculty/spacco-jaime.html"&gt;Jaime Spacco&lt;/a&gt; and I have been working on a web-based programming exercise system called CloudCoder.&amp;nbsp; We've finally reached the point where it's ready for students to use.&amp;nbsp; I wrote up a web page that explains the basic idea (for students in the CS 101 course at York College):&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://faculty.ycp.edu/%7Edhovemey/spring2012/cs101/cloudCoder.html"&gt;http://faculty.ycp.edu/~dhovemey/spring2012/cs101/cloudCoder.html&lt;/a&gt;&lt;/blockquote&gt;I'm planning to use CloudCoder to assign exercises to accompany each reading assignment.&amp;nbsp; The idea is to give students a concrete way to test their own understanding of the material.&amp;nbsp; I'm also hoping that if students try a problem, and have trouble with it, they will use the opportunity to attend office hours or a tutoring session.&amp;nbsp; We'll see how it works out.&lt;br /&gt;&lt;br /&gt;We made CloudCoder available under an open source license (AGPL v3), and the code is on Github:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="https://github.com/daveho/CloudCoder"&gt;https://github.com/daveho/CloudCoder&lt;/a&gt;&lt;/blockquote&gt;There are definitely some rough edges, but it is usable.&amp;nbsp; If you want to know more, you can &lt;a href="mailto:dhovemey@ycp.edu"&gt;drop me a line&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-4736475654563099425?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/4736475654563099425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=4736475654563099425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4736475654563099425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4736475654563099425'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2012/02/cloudcoder-web-based-programming.html' title='CloudCoder, a web-based programming exercise system'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-2007431098334502167</id><published>2011-04-07T05:35:00.000-07:00</published><updated>2011-04-07T05:35:57.145-07:00</updated><title type='text'>Reflections on using Pandora</title><content type='html'>Lately I've decided to force myself to be honest when I rate music (like/dislike) on Pandora.&amp;nbsp; The rubric is "do I enjoy listening to this song enough to want to hear it again?"&lt;br /&gt;&lt;br /&gt;There are a couple interesting phenomena I've noticed.&lt;br /&gt;&lt;br /&gt;First, initial impressions are not always accurate in the long term.&amp;nbsp; I find myself hitting "dislike" for songs that I did initially like several months ago.&amp;nbsp; There are probably some songs I disliked initially that I might like now, but of course I'll never know about those.&lt;br /&gt;&lt;br /&gt;Second, and this is where the honesty comes in, is that I have had to admit to myself that I don't necessarily like music I "should" like.&amp;nbsp; For example, I don't like any Velvet Underground song.&amp;nbsp; There, I said it.&amp;nbsp; They sucked.&amp;nbsp; I also dislike most songs by the Jam, although I do think "Eton Rifles" is a good song.&amp;nbsp; I don't like the Cure or Depeche Mode at all, which is somewhat surprising considering I'm a huge Smiths fan.&amp;nbsp; What is harder is hitting dislike for artists I admire.&amp;nbsp; There are Morrissey songs I don't particularly care for (anything off of Kill Uncle, for example.)&amp;nbsp; I've considered hitting dislike for remixes of New Order songs (although usually I just use the "bored" feature for those.)&amp;nbsp; It pains me to have to hit dislike for any song by the Mekons, but their most recent album (Natural) is, well, I hate to say it, &lt;i&gt;terrible&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-2007431098334502167?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/2007431098334502167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=2007431098334502167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2007431098334502167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2007431098334502167'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2011/04/reflections-on-using-pandora.html' title='Reflections on using Pandora'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-562662753146688542</id><published>2011-03-31T11:11:00.000-07:00</published><updated>2011-03-31T11:27:29.133-07:00</updated><title type='text'>Anti-parallel computing with Java</title><content type='html'>I did a lecture today on fork/join parallelism using the &lt;a href="http://www.jcp.org/en/jsr/detail?id=166"&gt;JSR 166&lt;/a&gt; fork/join framework.&amp;nbsp; As an example, I parallelized merge sort in the obvious way and got some decent performance improvements:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--QdPfOyRPeU/TZTAX8l50GI/AAAAAAAAAGI/bIwJxBg6QJM/s1600/parMergeSort.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://2.bp.blogspot.com/--QdPfOyRPeU/TZTAX8l50GI/AAAAAAAAAGI/bIwJxBg6QJM/s400/parMergeSort.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here's the speedups for increasing numbers of elements for the 2-way and 4-way cases:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-6Hyrqwj38K4/TZTAq4rTL8I/AAAAAAAAAGM/481ENtDWalE/s1600/parMergeSortSpeedup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://2.bp.blogspot.com/-6Hyrqwj38K4/TZTAq4rTL8I/AAAAAAAAAGM/481ENtDWalE/s400/parMergeSortSpeedup.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This was on an Intel Core 2 Quad Q6600.&amp;nbsp; The sequential data is measuring the time to call the built-in &lt;b&gt;Collections.sort()&lt;/b&gt;, which is an optimized quick sort implementation.&lt;br /&gt;&lt;br /&gt;Overall, the implementation took about 25 minutes, much of which was consumed with figuring out that the &lt;b&gt;ForkJoinPool&lt;/b&gt; class's &lt;b&gt;execute()&lt;/b&gt; method doesn't wait for the top-level task to complete.&amp;nbsp; (I should probably go back and read &lt;a href="http://www.awprofessional.com/bookstore/product.asp?isbn=0201310090"&gt;Doug Lea's book&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Not bad for a language whose programming paradigm is &lt;a href="http://existentialtype.wordpress.com/2011/03/15/teaching-fp-to-freshmen/"&gt;anti-parallel by its very nature&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-562662753146688542?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/562662753146688542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=562662753146688542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/562662753146688542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/562662753146688542'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2011/03/anti-parallel-computing-with-java.html' title='Anti-parallel computing with Java'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/--QdPfOyRPeU/TZTAX8l50GI/AAAAAAAAAGI/bIwJxBg6QJM/s72-c/parMergeSort.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-447651374438749312</id><published>2011-03-26T06:03:00.000-07:00</published><updated>2011-03-26T06:03:25.189-07:00</updated><title type='text'>GNOME 3 - lots of gratuitous changes in store!</title><content type='html'>Jon Corbet (the guy behind lwn.net) has written an interesting (and disturbing!) &lt;a href="http://lwn.net/Articles/433409/"&gt;preview of Gnome 3&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Suffice it to say that the Gnome UI folks are radically changing the way pretty much everything works, regardless of how current users feel about the changes, in the name of making the UI more "intuitive" for "novice users".&amp;nbsp; Yes...just like KDE did with KDE 4.&lt;br /&gt;&lt;br /&gt;I have only two comments:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;My 3 year old likes GNOME just the way it is, thank you.&amp;nbsp; I guess he's not a typical novice user.&lt;/li&gt;&lt;li&gt;Thank $DIETY for &lt;a href="http://www.xfce.org/"&gt;XFCE&lt;/a&gt; and &lt;a href="http://www.lxde.org/"&gt;LXDE&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-447651374438749312?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/447651374438749312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=447651374438749312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/447651374438749312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/447651374438749312'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2011/03/gnome-3-lots-of-gratuitous-changes-in.html' title='GNOME 3 - lots of gratuitous changes in store!'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-4330288520479509921</id><published>2011-02-09T13:46:00.000-08:00</published><updated>2011-02-09T13:46:54.505-08:00</updated><title type='text'>Violet UML</title><content type='html'>In &lt;a href="http://faculty.ycp.edu/%7Edhovemey/spring2011/cs320/index.html"&gt;my Software Engineering course&lt;/a&gt;, I have the students do OOA&amp;amp;D projects where some form of software for working with UML diagrams is useful.&lt;br /&gt;&lt;br /&gt;In previous years, I've used &lt;a href="http://argouml.tigris.org/"&gt;ArgoUML&lt;/a&gt;.&amp;nbsp; It's open source, and quite full-featured.&amp;nbsp; It also &lt;a href="http://argouml.tigris.org/issues/show_bug.cgi?id=1834"&gt;does not support undo&lt;/a&gt;.&amp;nbsp; Every year I investigate to see if any progress has been made on this issue, and every year it's "in progress".&amp;nbsp; Students find this limitation extremely frustrating, and I don't blame them.&amp;nbsp; Feh.&lt;br /&gt;&lt;br /&gt;This year I stumbled across &lt;a href="http://www.horstmann.com/violet/"&gt;Violet UML&lt;/a&gt;, which I had somehow missed in my previous searches for open source UML tools.&amp;nbsp; It does not aim to be a full-blown CASE tool --- e.g., no code generation, reverse engineering, etc.&amp;nbsp; This is actually a virtue in my case: it's very simple to use, so the learning curve for students should be minimal.&amp;nbsp; The UI is intuitive.&amp;nbsp; And it has undo.&amp;nbsp; It's a Java app packaged as an executable jar file, so no installation required.&amp;nbsp; Win win win.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-4330288520479509921?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/4330288520479509921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=4330288520479509921' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4330288520479509921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4330288520479509921'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2011/02/violet-uml.html' title='Violet UML'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8105421227677670960</id><published>2011-02-08T06:13:00.000-08:00</published><updated>2011-02-08T06:13:54.199-08:00</updated><title type='text'>Text editors, Geany</title><content type='html'>I'm teaching a &lt;a href="http://faculty.ycp.edu/%7Edhovemey/spring2011/cs365/index.html"&gt;course on parallel and distributed programming&lt;/a&gt; where the programming environment is the head node of a Linux cluster, which we're connecting to using VNC.&amp;nbsp; We're using the classic "text editor and makefile" development environment rather than an IDE, so the choice of text editor has been on my mind lately.&lt;br /&gt;&lt;br /&gt;Years ago, I was an &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; guy, but I abandoned that particular ship when I started to develop wrist problems.&lt;br /&gt;&lt;br /&gt;In grad school &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; was my editor of choice.&amp;nbsp; I gave it a try again, and there are definitely things I like about it.&amp;nbsp; Running an arbitrary filter process on a region of text bounded by a regular expression search is really cool.&amp;nbsp; However, its model for switching between buffers is appallingly primitive.&amp;nbsp; If Vim had a sidebar displaying a list of open files, it would probably be my favorite editor.&amp;nbsp; But it doesn't.&lt;br /&gt;&lt;br /&gt;Oddly enough, my preferred editor in recent years has been &lt;a href="http://projects.gnome.org/gedit/"&gt;Gedit&lt;/a&gt;.&amp;nbsp; It's very basic, but it's clear that its developers actually thought about usability.&amp;nbsp; The gedit-plugins package in Debian/Ubuntu provides some few useful extensions.&amp;nbsp; Plus, its default syntax coloring scheme is the same as Vim's, which to my eyes is simply the correct one.&amp;nbsp; (Comments are blue.&amp;nbsp; That's just the color they are.)&amp;nbsp; Unfortunately, there is no support for word completion.&amp;nbsp; There seem to be a few plugins that have provided support, but there's doesn't seem to be a Debian package for any of them, and I wasn't encouraged by the complicated list of instructions for installing any of them locally.&lt;br /&gt;&lt;br /&gt;After a number of web searches, I stumbled upon &lt;a href="http://www.geany.org/"&gt;Geany&lt;/a&gt;.&amp;nbsp; It's a lightweight programmer's editor with a few IDE-like features.&amp;nbsp; I've been using it for a few days, and it's more or less exactly what I was looking for.&amp;nbsp; It has a side pane and word completion, but the UI is fairly minimal.&amp;nbsp; I haven't really used the IDE features (such as compiling from within the editor), but happily those features aren't imposed on you in any way.&amp;nbsp; Most importantly, there was a Debian package available through APT.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8105421227677670960?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8105421227677670960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8105421227677670960' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8105421227677670960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8105421227677670960'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2011/02/text-editors-geany.html' title='Text editors, Geany'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-2086850635807929684</id><published>2011-02-02T07:15:00.000-08:00</published><updated>2011-02-02T07:15:38.842-08:00</updated><title type='text'>I am a criminal</title><content type='html'>Recently, one of the DVDs that Eli and Gus like to watch became corrupted.&amp;nbsp; I'm not sure exactly what the problem is; there aren't any obvious scratches, and we've cleaned it.&amp;nbsp; The symptom is that during one of the scenes, the video freezes.&lt;br /&gt;&lt;br /&gt;So, I ripped the data off of the disc using &lt;a href="http://www.gnu.org/software/ddrescue/ddrescue.html"&gt;ddrescue&lt;/a&gt;, managing to get all but about 800K of the data.&amp;nbsp; I can play the resulting ISO image using the awesome &lt;a href="http://www.videolan.org/vlc/"&gt;VLC&lt;/a&gt;.&amp;nbsp; There's a brief pause in the video where the missing data occurs, but otherwise it plays perfectly.&lt;br /&gt;&lt;br /&gt;So why am I a criminal?&amp;nbsp; The DVD data is scrambled with &lt;a href="http://en.wikipedia.org/wiki/Content_Scramble_System"&gt;CSS&lt;/a&gt;, which of course requires libdvdcss to unscramble.&amp;nbsp; And since CSS is legally a mechanism to guard against unauthorized copying, unscrambling the content is illegal under the &lt;a href="http://en.wikipedia.org/wiki/Digital_Millennium_Copyright_Act"&gt;DMCA&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-2086850635807929684?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/2086850635807929684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=2086850635807929684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2086850635807929684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2086850635807929684'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2011/02/i-am-criminal.html' title='I am a criminal'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-4359042209487830564</id><published>2010-09-23T05:44:00.000-07:00</published><updated>2010-09-23T05:44:12.320-07:00</updated><title type='text'>If Eclipse views could talk...</title><content type='html'>If the various &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; views in the default Java perspective could talk, what would they say?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Package explorer&lt;/b&gt;: Here are the projects in your workspace! &amp;nbsp;Look, I can actually present them in a sensible way! &amp;nbsp;Not like some IDEs I could mention. &amp;nbsp;Yeah, you can have multiple projects open at the same time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Java editor&lt;/b&gt;: I know what your code means! &amp;nbsp;I will automate boring tasks like adding getters and setters for you. &amp;nbsp;I will let you know when you've made a mistake. &amp;nbsp;You'll probably want to override my ugly default syntax-coloring choices.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JUnit&lt;/b&gt;: What am I doing over here in the left-hand pane? &amp;nbsp;Sure, you'll be able to see whether or not the bar is green, but the stack trace is much too narrow to show you the text of a failed assertion. Hey, why don't you move me down to the bottom pane? &amp;nbsp;Ahhh...that's much better. &amp;nbsp;By the way, if &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;assertTrue&lt;/span&gt; or &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;assertFalse&lt;/span&gt; fails, I'll let you know with the message "Assertion failed: null".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Type hierarchy&lt;/b&gt;: Let me tell you why I'm here. &amp;nbsp;Uh...hold on...I'm pretty sure there's something I can do that's useful...uh...crap, I can't think of why you would actually need to use me. &amp;nbsp;That sucks. Oh well, at least I'm not taking up any of your valuable screen real estate over here as a hidden tab in the left-hand pane.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mylyn&lt;/b&gt;: Hi! &amp;nbsp;I'm Mylyn! &amp;nbsp;Every other view is named in a way that clearly indicates its purpose, but not me! &amp;nbsp;I'm Mylyn! &amp;nbsp;If you were an elite developer, you'd know what I'm for. &amp;nbsp;Apparently you're not an elite developer. &amp;nbsp;I'm Mylyn! &amp;nbsp;I need one-sixth of your screen! I'm Mylyn! &amp;nbsp;Wait, don't close me! &amp;nbsp;I'm My [&lt;i&gt;click&lt;/i&gt;]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Outline&lt;/b&gt;: Hey, here's a concise list of your fields and methods! If your class gets really complicated, this will help you navigate around it. &amp;nbsp;Sure, this right-hand pane that I'm in is taking up about a third of the screen on that netbook you're using, but I'm totally worth it. &amp;nbsp;Wait...if you use proper object-oriented design, the class won't get complicated? &amp;nbsp;I don't believe it. &amp;nbsp;Wait...don't close me! &amp;nbsp;I [&lt;i&gt;click&lt;/i&gt;]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Console&lt;/b&gt;: Here's your standard output. &amp;nbsp;You can type stuff here as standard input, too. &amp;nbsp;However, I adamantly refuse to position the cursor in any way that would indicate where the next character of output (or echoed input) will be generated. &amp;nbsp;Nor will I accept ANSI escape codes. &amp;nbsp;This big red button to kill the process is pretty useful, though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-4359042209487830564?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/4359042209487830564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=4359042209487830564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4359042209487830564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4359042209487830564'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/09/if-eclipse-views-could-talk.html' title='If Eclipse views could talk...'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-5454382190098634446</id><published>2010-08-19T19:04:00.000-07:00</published><updated>2010-08-19T19:24:46.293-07:00</updated><title type='text'>ASUS 1005HA netbook - first impressions</title><content type='html'>My new netbook (Asus 1005HA, Linux version) arrived today.  I bought it to replace my Lenovo X61 tablet, not for any technical reason, but because the X61 won't fit in the trunk bag on my bicycle.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Software: The preinstalled Linux (Xandros?) is crap, so I immediately installed the Ubuntu 10.04 netbook remix.  I have to say that I am &lt;i&gt;extremely&lt;/i&gt; impressed with Ubuntu.  There is a nice application launcher (in place of a traditional desktop.)  The window manager uses the "one maximized application at a time" model, which I initially thought would be annoying, but is actually really nice.  Each running app gets a small icon on the panel, and Alt-Tab switches between apps.  Very good use is made of the limited (1024x600) screen real estate.  I found it easy to add a new application launcher (for Eclipse!), and to add launchers to the "Favorites" category.  Connecting to wireless networks (WPA and WEP) worked flawlessly.  Installing software from the package repositories (openjdk, subversion) worked great.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hardware: Awesome! The screen is bright and sharp.  The keyboard is much better than I expected - I can type at close to full speed.  The track pad works very well, and dragging on the right edge scrolls up and down.  I haven't run any benchmarks, but it seems quite responsive.  I installed Eclipse and did a bit of Java programming, and performance was fine.  (It's some kind of Atom which supports hyperthreading.)  Battery life is predicted (by the Ubuntu battery meter) at about 5.5 hours, which seems reasonable.  I am waiting for a 2GB memory module to arrive, but with the pre-installed 1GB it works just fine.  And the size - it really is significantly smaller and lighter than any traditional notebook, even ultraportables.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Overall: I really like it a lot so far.  I'm looking forward to seeing how well it can handle serious work during the school year.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-5454382190098634446?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/5454382190098634446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=5454382190098634446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5454382190098634446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5454382190098634446'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/08/asus-1005ha-netbook-first-impressions.html' title='ASUS 1005HA netbook - first impressions'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-5156370935631188851</id><published>2010-08-19T18:34:00.000-07:00</published><updated>2010-08-19T18:57:11.619-07:00</updated><title type='text'>What I Did This Summer</title><content type='html'>It's been a busy summer.  Things that I did (in absolutely no order):&lt;div&gt;&lt;ol&gt;&lt;li&gt;Full-time parenting.  This was by far the most interesting and rewarding activity. Eli is now talking up a storm, and Gus is almost walking.  I can now sing the themes to &lt;a href="http://pbskids.org/superwhy/"&gt;Super Why&lt;/a&gt; and &lt;a href="http://pbskids.org/dinosaurtrain/"&gt;Dinosaur Train&lt;/a&gt; from memory.&lt;/li&gt;&lt;li&gt;Went to Charlotte to visit the Bridges clan.  Lots of fun, but US Airways now on enemies list.&lt;/li&gt;&lt;li&gt;Vacationed in Dewey Beach, DE with Bridges, Hovemeyer, and Swope families.  Good times!  However, fantasized about formally suggesting "Drunken Frat Boy, DE" as new name for town.&lt;/li&gt;&lt;li&gt;Continued work done by YCP undergrads (hi Ray and Brandon!) to create an RTOS for AVR microcontrollers.  The kernel is 100% C (no assembly)!  Planning to somehow get a SIGCSE or CCSCE paper out of this.&lt;/li&gt;&lt;li&gt;Successfully programmed a 22V10 GAL, for both combinational and stateful logic.  (I need to break down and actually learn about FPGAs sometime.)&lt;/li&gt;&lt;li&gt;Attended Heisler/Williams wedding reception and Hoyt/Spacco wedding.  Latter involved travel to Chicago.  Reconnected with &lt;a href="http://www.cs.umd.edu/"&gt;UMD&lt;/a&gt; peeps.&lt;/li&gt;&lt;li&gt;Advised one student doing an internship for credit, and another taking a course by tutorial.&lt;/li&gt;&lt;li&gt;Retooling of Programming Language Design course.&lt;/li&gt;&lt;li&gt;ABET stuff (don't ask.)&lt;/li&gt;&lt;li&gt;Read all 3 books by &lt;a href="http://www.stieglarsson.com/"&gt;Stieg Larsson&lt;/a&gt;.  Highly recommended.&lt;/li&gt;&lt;li&gt;Got netbook.  How did I live without one of these?  Lenovo X61 notebook now seems hopelessly large and cumbersome.&lt;/li&gt;&lt;li&gt;Rode bike many times.  Planning to use as main commuting vehicle during school year when weather cooperates.&lt;/li&gt;&lt;li&gt;Reviewed a book.&lt;/li&gt;&lt;li&gt;Attended CCSCE 2010 organizational meeting.&lt;/li&gt;&lt;li&gt;Lunch at &lt;a href="http://victorybeer.com/"&gt;Victory Brewing Company&lt;/a&gt; twice with Kate to celebrate aniversaries.&lt;/li&gt;&lt;/ol&gt;There's probably some other stuff I forgot.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-5156370935631188851?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/5156370935631188851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=5156370935631188851' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5156370935631188851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5156370935631188851'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/08/what-i-did-this-summer.html' title='What I Did This Summer'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-1949333936467898809</id><published>2010-05-27T13:20:00.000-07:00</published><updated>2010-05-27T13:27:23.810-07:00</updated><title type='text'>using git to track marmoset svn repository</title><content type='html'>I'm doing some work on &lt;a href="http://sourceforge.net/projects/marmoset/"&gt;marmoset&lt;/a&gt; this summer.  As an experiment, I'm doing my development in a git repository, using git-svn to track changes in the main svn repository.  My changes are somewhat experimental, so I didn't want to commit to svn HEAD, and svn branches are so 1990s.  We'll see how it goes.  I'm also pushing my changes to a publically-visible git repos:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://faculty.ycp.edu/~dhovemey/marmoset.git"&gt;http://faculty.ycp.edu/~dhovemey/marmoset.git&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-1949333936467898809?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/1949333936467898809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=1949333936467898809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1949333936467898809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1949333936467898809'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/05/using-git-to-track-marmoset-svn.html' title='using git to track marmoset svn repository'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8479198253622888018</id><published>2010-04-29T06:15:00.001-07:00</published><updated>2010-04-29T06:18:37.039-07:00</updated><title type='text'>Greatest Song Ever</title><content type='html'>Here's a screenshot of Pandora playing the greatest song ever:&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0thAcZenYGk/S9mGlHGLPXI/AAAAAAAAAE8/R6I3uxFXejc/s1600/acceptYourself.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 221px;" src="http://3.bp.blogspot.com/_0thAcZenYGk/S9mGlHGLPXI/AAAAAAAAAE8/R6I3uxFXejc/s320/acceptYourself.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5465547594909039986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some of the things I was obsessed with in high school haven't stood the test of time, but The Smiths most definitely have.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8479198253622888018?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8479198253622888018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8479198253622888018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8479198253622888018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8479198253622888018'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/04/greatest-song-ever.html' title='Greatest Song Ever'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_0thAcZenYGk/S9mGlHGLPXI/AAAAAAAAAE8/R6I3uxFXejc/s72-c/acceptYourself.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8072353352829668892</id><published>2010-04-12T11:57:00.000-07:00</published><updated>2010-04-12T12:03:05.226-07:00</updated><title type='text'>gdb debugging using simavr</title><content type='html'>I just got debugging using gdb working with &lt;a href="http://gitorious.org/simavr"&gt;simavr&lt;/a&gt;.  It's as simple as putting&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;avr-&gt;gdb_port = 1234;&lt;br /&gt;avr-&gt;state = cpu_Stopped;&lt;br /&gt;avr_gdb_init(avr);&lt;/pre&gt;&lt;/blockquote&gt;in the code that preceeds the simulation loop.  Then, start avr-gdb (using the name of your firmware ELF file as the executable), and issue the command "target remote localhost:1234".  Presto, you're debugging your firmware.  Sweet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8072353352829668892?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8072353352829668892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8072353352829668892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8072353352829668892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8072353352829668892'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/04/gdb-debugging-using-simavr.html' title='gdb debugging using simavr'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-4840445110363969337</id><published>2010-04-10T07:51:00.001-07:00</published><updated>2010-04-10T07:56:59.870-07:00</updated><title type='text'>simavr</title><content type='html'>One of the headaches of developing code for an embedded system is the difficulty of debugging target code.  I suppose you can use an ICE if you have money and expertise, but a nice simple alternative is a software simulator.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I just discovered &lt;a href="http://gitorious.org/simavr"&gt;simavr&lt;/a&gt;, which is an open-source software simulator for AVR microcontrollers.  It is a library which simulates a variety of AVR cores, and has hooks through which you can emulate hardware (such as devices attached to I/O pins).  The idea is you write a C program which defines your hook functions, and then call into the library to run the actual simulation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was able to get a "blinking LED" program working in a couple hours by adapting the example code.  I used ANSI control sequences to visualize the pins of an output port, but you can use any kind of UI you want.  It looks as though simavr supports debugging of the target firmware using gdb, which is totally awesome.  I will try that next.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-4840445110363969337?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/4840445110363969337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=4840445110363969337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4840445110363969337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4840445110363969337'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/04/simavr.html' title='simavr'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8728515040468881993</id><published>2010-04-10T04:20:00.001-07:00</published><updated>2010-04-10T04:28:44.949-07:00</updated><title type='text'>Fare thee well, Firefox?</title><content type='html'>Is it just me, or has firefox gotten to be intolerably slow to start up?  I've timed it, and 10-15 seconds is not unusual on the computers I use.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm trying out Google Chrome, and I have to say, it seems a lot more responsive.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It doesn't seem all that long ago that I was trying out Phoenix (remember when it was called that?) and it was the best browser out there.  I think Firefox was more or less perfect fairly early in its development.  I can distinctly remember thinking, in the 2.0 days, "Why is development continuing?  It already does everything it needs to do."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I suppose in 10 years I'll be posting about how bloated Chrome has become.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8728515040468881993?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8728515040468881993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8728515040468881993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8728515040468881993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8728515040468881993'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/04/fare-thee-well-firefox.html' title='Fare thee well, Firefox?'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8487552971738870399</id><published>2010-03-24T05:55:00.001-07:00</published><updated>2010-03-24T05:57:39.492-07:00</updated><title type='text'>Makefiles 101</title><content type='html'>Just finished up some lecture notes on building C/C++ programs using a makefile:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://faculty.ycp.edu/%7Edhovemey/spring2010/cs320/lecture/lecture23.html"&gt;http://faculty.ycp.edu/~dhovemey/spring2010/cs320/lecture/lecture23.html&lt;/a&gt;&lt;/blockquote&gt;I think I've covered the essential concepts and techniques, although I should probably include a complete example (program and makefile).  We'll see how it goes in class...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8487552971738870399?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8487552971738870399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8487552971738870399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8487552971738870399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8487552971738870399'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/03/makefiles-101.html' title='Makefiles 101'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8241427423003661292</id><published>2010-02-22T13:42:00.001-08:00</published><updated>2010-02-22T14:00:48.296-08:00</updated><title type='text'>More progress on OO language interpreter</title><content type='html'>Garbage collection is now (I think?) working in &lt;a href="http://code.google.com/p/thud-lang/"&gt;Thud&lt;/a&gt;, my object-oriented scripting language:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="color:blue;"&gt;[dhovemey@nobby]$&lt;/span&gt; cat LongLoop.thud&lt;br /&gt;# With the heap set to 8192 objects,&lt;br /&gt;# this program causes the garbage collector to run.&lt;br /&gt;&lt;br /&gt;import System::IO;&lt;br /&gt;&lt;br /&gt;var n = 0;&lt;br /&gt;while (n &amp;lt; 9000) {&lt;br /&gt; n = n + 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;IO.out.println(n);&lt;br /&gt;&lt;span style="color:blue;"&gt;[dhovemey@nobby]$&lt;/span&gt; thud LongLoop.thud&lt;br /&gt;9000&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;At this point, the compiler and bytecode interpreter are more or less working.  What remains is to add all of the standard library classes needed to make it a useful language: I/O, containers, regular expressions, etc.&lt;br /&gt;&lt;br /&gt;I began this project with the idea that implementing a language like &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; or &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; would be a fairly easy task.  Well, it was harder than I thought it would be, but really not that hard overall.  Right now, there are about 15,000 lines of source, including comments and whitespace.  This is bloated somewhat by the 2,500 or so lines generated by &lt;a href="http://www.gnu.org/software/bison/"&gt;bison&lt;/a&gt; for the parser, and also the fact that I essentially recreated the Java I/O classes (streams, readers/writers, etc.) rather than use &lt;a href="http://en.wikipedia.org/wiki/Iostream"&gt;iostreams&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[Aside: is it just me, or is iostreams ridiculously complicated?]&lt;br /&gt;&lt;br /&gt;Eventually, I'm hoping to use Thud as my main day-to-day scripting language.  In the longer term, it would be an interesting project to replace the bytecode-interpreter-based virtual machine with one based on &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8241427423003661292?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8241427423003661292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8241427423003661292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8241427423003661292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8241427423003661292'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/02/more-progress-on-oo-language.html' title='More progress on OO language interpreter'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-2632707960829514885</id><published>2010-02-03T10:27:00.000-08:00</published><updated>2010-02-03T10:28:32.892-08:00</updated><title type='text'>Last one</title><content type='html'>I could post more of these, but I'll stop with this one.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0thAcZenYGk/S2nAQfnJeHI/AAAAAAAAAE0/nOiTMUgRHTA/s1600-h/evenMoreRandomArt.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 320px;" src="http://2.bp.blogspot.com/_0thAcZenYGk/S2nAQfnJeHI/AAAAAAAAAE0/nOiTMUgRHTA/s320/evenMoreRandomArt.png" alt="" id="BLOGGER_PHOTO_ID_5434085814995351666" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-2632707960829514885?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/2632707960829514885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=2632707960829514885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2632707960829514885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2632707960829514885'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/02/last-one.html' title='Last one'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0thAcZenYGk/S2nAQfnJeHI/AAAAAAAAAE0/nOiTMUgRHTA/s72-c/evenMoreRandomArt.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-1396464469983760110</id><published>2010-02-03T10:22:00.001-08:00</published><updated>2010-02-03T10:23:22.497-08:00</updated><title type='text'>More random art</title><content type='html'>This random art stuff is really just too cool for words:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0thAcZenYGk/S2m_AU8ih4I/AAAAAAAAAEs/obLDWOq0Wbw/s1600-h/moreRandomArt.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 320px;" src="http://3.bp.blogspot.com/_0thAcZenYGk/S2m_AU8ih4I/AAAAAAAAAEs/obLDWOq0Wbw/s320/moreRandomArt.png" alt="" id="BLOGGER_PHOTO_ID_5434084437742749570" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-1396464469983760110?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/1396464469983760110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=1396464469983760110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1396464469983760110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1396464469983760110'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/02/more-random-art.html' title='More random art'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_0thAcZenYGk/S2m_AU8ih4I/AAAAAAAAAEs/obLDWOq0Wbw/s72-c/moreRandomArt.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8061040021567163755</id><published>2010-02-03T07:27:00.000-08:00</published><updated>2010-02-03T07:34:01.673-08:00</updated><title type='text'>Random Art</title><content type='html'>I'm implementing &lt;a href="http://www.cs.hmc.edu/%7Estone/"&gt;Christopher Stone&lt;/a&gt;'s &lt;a href="nifty.stanford.edu/2009/stone-random-art/"&gt;Random Art Nifty Assignment&lt;/a&gt; in preparation for assigning it in a data structures course I'm teaching.  Since the assignment involves the creation of "random" functions of two variables, it's a good opportunity to discuss the idea of using trees to represent expressions.&lt;br /&gt;&lt;br /&gt;Obligatory screenshot of first successful run of the program:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0thAcZenYGk/S2mWg60MZ8I/AAAAAAAAAEk/vJ7X1UW5BHk/s1600-h/randomArt.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 306px; height: 320px;" src="http://3.bp.blogspot.com/_0thAcZenYGk/S2mWg60MZ8I/AAAAAAAAAEk/vJ7X1UW5BHk/s320/randomArt.png" alt="" id="BLOGGER_PHOTO_ID_5434039917687367618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is an extremely cool assignment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8061040021567163755?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8061040021567163755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8061040021567163755' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8061040021567163755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8061040021567163755'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/02/random-art.html' title='Random Art'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_0thAcZenYGk/S2mWg60MZ8I/AAAAAAAAAEk/vJ7X1UW5BHk/s72-c/randomArt.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-1016920271665661133</id><published>2010-01-22T13:19:00.001-08:00</published><updated>2010-01-22T13:46:22.420-08:00</updated><title type='text'>Hello, world</title><content type='html'>I have been working on an interpreter for a simple dynamic OO programming language (vaguely like Java, but dynamically typed like Ruby.)&lt;br /&gt;&lt;br /&gt;Today I got a hello world program to run:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="color:blue;"&gt;[dhovemey@nobby]$&lt;/span&gt; ThudC Hello.thud&lt;br /&gt;&lt;span style="color:blue;"&gt;[dhovemey@nobby]$&lt;/span&gt; ThudDisAsm Main\$.thudc&lt;br /&gt;class Main$ {&lt;br /&gt;method main$() {&lt;br /&gt;   0: push_module_ref 2(System::IO)&lt;br /&gt;   3: load_field 4(out)&lt;br /&gt;   6: push_const 5(Hello, world!)&lt;br /&gt;   9: call 7(println) 2&lt;br /&gt;  13: pop&lt;br /&gt;  14: push_nil&lt;br /&gt;  15: return&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:blue;"&gt;[dhovemey@nobby]$&lt;/span&gt; thud Hello.thud&lt;br /&gt;Hello, world!&lt;br /&gt;&lt;span style="color:blue;"&gt;[dhovemey@nobby]$&lt;/span&gt; echo $?&lt;br /&gt;0&lt;br /&gt;&lt;span style="color:blue;"&gt;[dhovemey@nobby]$&lt;/span&gt; cat Hello.thud&lt;br /&gt;import System::IO;&lt;br /&gt;&lt;br /&gt;IO.out.println("Hello, world!");&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Oh yeah.&lt;br /&gt;&lt;br /&gt;Note that in the example above, the source file "Hello.thud" produces a compiled class called "Main$" because that is a special class generated for "top-level" statements in a source file.  The idea is to make the language useful as a scripting language, where many programs will be a sequence of statements that use the built-in classes.&lt;br /&gt;&lt;br /&gt;The language (and its implementation) is currently called "Thud", which is one of the standard &lt;a href="http://catb.org/jargon/html/M/metasyntactic-variable.html"&gt;metasyntactic variable&lt;/a&gt;s.  It's also the title of one of the recent &lt;a href="http://en.wikipedia.org/wiki/Discworld"&gt;Discworld&lt;/a&gt; novels by Terry Pratchett.&lt;br /&gt;&lt;br /&gt;There is still a lot of work to do before the interpreter is actually useful:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Currently, there is no garbage collection.&lt;/li&gt;&lt;li&gt;The built-in types support very few methods.  For example, the built-in Int32 type does not support any arithmetic methods.&lt;/li&gt;&lt;li&gt;The IO facility is limited to printing to stdout.&lt;/li&gt;&lt;/ul&gt;I started this project quite a while ago because I was frustrated with both Perl and Ruby.  I know Perl quite well, but find it to be exceedingly ugly to write programs in.  I tend to like Ruby in theory, especially because it is a pure OO language (where all values are objects).  However, I find that Ruby suffers from cryptic syntax.  I gave up trying to learn Ruby on rails because I find that significant chunks of rails code---especially the ones that look like anonymous hashes hanging in space---to be deeply impenetrable.&lt;br /&gt;&lt;br /&gt;I freely admit that the world does not need another OO scripting language, but it has been a lot of fun designing and implementing one.&lt;br /&gt;&lt;br /&gt;The Thud virtual is based on a bytecode interpreter.  There are exactly 17 opcodes.  There are no static fields or static methods---instead, the same effect is achieved by having "modules", which are singleton classes.  (For example, System::IO is a module.)&lt;br /&gt;&lt;br /&gt;I will be posting the source code (&lt;a href="http://www.gnu.org/philosophy/free-sw.html"&gt;free software&lt;/a&gt;, of course) in the near future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-1016920271665661133?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/1016920271665661133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=1016920271665661133' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1016920271665661133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1016920271665661133'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2010/01/hello-world.html' title='Hello, world'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7394579242902538105</id><published>2009-11-30T12:57:00.000-08:00</published><updated>2009-11-30T13:00:02.245-08:00</updated><title type='text'>C++ typename keyword</title><content type='html'>I used the "typename" keyword in a C++ program for the first time today.  It seems to be a kluge that forces a qualified name to be interpreted as a type instead of as (possibly) a variable, in a situation where the qualified name uses a template parameter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7394579242902538105?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7394579242902538105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7394579242902538105' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7394579242902538105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7394579242902538105'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/11/c-typename-keyword.html' title='C++ typename keyword'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-4662440252515878259</id><published>2009-11-20T12:32:00.000-08:00</published><updated>2009-11-20T12:33:22.048-08:00</updated><title type='text'>Meagles</title><content type='html'>Meagles. 'To be coming in Society which that I do; and going; albeit,&lt;br /&gt;too!' As he last perfectly there Mr F. to all over head, Dutch chance&lt;br /&gt;them sense after superiod yielding his hand, I won't speak of both the&lt;br /&gt;corner, Mr Dorrit? Yes, yes.' The quest you will ever be the river be&lt;br /&gt;they reminister's honour order the explanation of approach, indeed?' 'To&lt;br /&gt;think, to preparing to have take him,' said to that the sensation of a&lt;br /&gt;dreamed to contemplate, pleasant of an idle have stoppage ceased another&lt;br /&gt;mouths in saying it seem so,' returned across this ruin and Jeremiah.&lt;br /&gt;This, that's all the offenced at their Father's confidence and bad&lt;br /&gt;wearing been a minutes, for they spoke as if he walking about into the&lt;br /&gt;inhaled; the which he is slipped it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-4662440252515878259?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/4662440252515878259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=4662440252515878259' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4662440252515878259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4662440252515878259'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/11/meagles.html' title='Meagles'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-3666327272133711249</id><published>2009-11-09T12:48:00.000-08:00</published><updated>2009-11-09T12:49:20.735-08:00</updated><title type='text'>OK, I am dumb</title><content type='html'>This is the correct JUnit assertion:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;assertEquals("-1/4", oneFourth.subtract(oneHalf).toString());&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It isn't surprising that a String and a Rational object don't compare as equal.  Duh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-3666327272133711249?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/3666327272133711249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=3666327272133711249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3666327272133711249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3666327272133711249'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/11/ok-i-am-dumb.html' title='OK, I am dumb'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-3445145937126919643</id><published>2009-11-09T12:45:00.001-08:00</published><updated>2009-11-09T12:49:41.823-08:00</updated><title type='text'>When is -1/4 not equal to -1/4?</title><content type='html'>Got this today as the first line of an assertion failure trace in&lt;br /&gt;JUnit:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;junit.framework.AssertionFailedError: expected:&lt;-1/4&gt; but was:&lt;-1/4&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This was produced by the following assertion:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;assertEquals("-1/4", oneFourth.subtract(oneHalf));&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The fields oneFourth and oneHalf are instances of a Rational class I'm working on.&lt;br /&gt;&lt;br /&gt;I must be missing something obvious.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-3445145937126919643?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/3445145937126919643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=3445145937126919643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3445145937126919643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3445145937126919643'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/11/when-is-14-not-equal-to-14.html' title='When is -1/4 not equal to -1/4?'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-2693739237086183344</id><published>2009-10-22T03:33:00.000-07:00</published><updated>2009-10-22T03:36:59.271-07:00</updated><title type='text'>Pandora rules!</title><content type='html'>I continue to be amazed by how great &lt;a href="http://www.pandora.com/"&gt;Pandora&lt;/a&gt; is.  (There was an article about Pandora in last weekend's NYT magazine - interesting read.)&lt;br /&gt;&lt;br /&gt;As evidence of its awesomeness:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0thAcZenYGk/SuA1VRZcd4I/AAAAAAAAAEU/S9VQmwZzhok/s1600-h/PandoraRules.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 230px;" src="http://4.bp.blogspot.com/_0thAcZenYGk/SuA1VRZcd4I/AAAAAAAAAEU/S9VQmwZzhok/s320/PandoraRules.png" alt="" id="BLOGGER_PHOTO_ID_5395370993153505154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0thAcZenYGk/SuA1a1oyLHI/AAAAAAAAAEc/tcIoR4ra6_s/s1600-h/PandoraRules2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 230px;" src="http://4.bp.blogspot.com/_0thAcZenYGk/SuA1a1oyLHI/AAAAAAAAAEc/tcIoR4ra6_s/s320/PandoraRules2.png" alt="" id="BLOGGER_PHOTO_ID_5395371088780864626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I've always suspected that there was a lot of great music out there that I didn't know about, and Pandora has confirmed this theory in spades.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-2693739237086183344?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/2693739237086183344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=2693739237086183344' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2693739237086183344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2693739237086183344'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/10/pandora-rules.html' title='Pandora rules!'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_0thAcZenYGk/SuA1VRZcd4I/AAAAAAAAAEU/S9VQmwZzhok/s72-c/PandoraRules.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-2645217091036194543</id><published>2009-10-21T03:37:00.001-07:00</published><updated>2009-10-21T03:39:19.062-07:00</updated><title type='text'>Gus Hamilton Hovemeyer</title><content type='html'>Born Friday, Oct 9th at 11:21 AM, 7 lbs, 15.7 oz.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0thAcZenYGk/St7kq9HgBQI/AAAAAAAAAEM/6tkYXvAvtsk/s1600-h/gus.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_0thAcZenYGk/St7kq9HgBQI/AAAAAAAAAEM/6tkYXvAvtsk/s320/gus.jpg" alt="" id="BLOGGER_PHOTO_ID_5395000830248092930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is why I haven't posted anything recently :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-2645217091036194543?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/2645217091036194543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=2645217091036194543' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2645217091036194543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2645217091036194543'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/10/gus-hamilton-hovemeyer.html' title='Gus Hamilton Hovemeyer'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_0thAcZenYGk/St7kq9HgBQI/AAAAAAAAAEM/6tkYXvAvtsk/s72-c/gus.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-2898478740272887773</id><published>2009-09-28T14:12:00.000-07:00</published><updated>2009-09-28T14:15:22.394-07:00</updated><title type='text'>Eclipse galileo software update is ****ing slow!</title><content type='html'>Why does the latest version of Eclipse (Galileo) take so long to install software updates?&lt;br /&gt;&lt;br /&gt;It seriously takes 5-6 minutes to install a package that has already been downloaded!  There is no disk I/O, and only about 10% CPU utilization!  What the **** is it doing?&lt;br /&gt;&lt;br /&gt;OK, it's not actually 5-6 minutes, but it sure ain't fast.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-2898478740272887773?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/2898478740272887773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=2898478740272887773' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2898478740272887773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2898478740272887773'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/09/eclipse-galileo-software-update-is-ing.html' title='Eclipse galileo software update is ****ing slow!'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8958850041580851692</id><published>2009-09-28T10:52:00.000-07:00</published><updated>2009-09-28T11:02:47.167-07:00</updated><title type='text'>TortoiseSVN weirdness</title><content type='html'>I had tremendous difficulties today trying to connect to a svn+ssh repository on a Solaris server using TortoiseSVN on a Windows client.  I kept getting error messages of the form "network connection closed unexpectedly" with no explanation.  Fortunately, I was able to find a workaround (see below).&lt;br /&gt;&lt;br /&gt;I &lt;span style="font-style: italic;"&gt;think&lt;/span&gt; the problem was bash on the server: every non-interactive ssh login was printing error messages to stderr, and for whatever reason TortoisePlink (the ssh client included with Tortoise) could not deal with these.  I am not absolutely certain that this explanation is correct, but here is my reasoning, based on trying various combinations of svn and ssh clients on Windows:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;cygwin svn / cygwin ssh: worked fine (the error messages were visible, but ignored, and the svn operation worked)&lt;/li&gt;&lt;li&gt;collabnet svn / TortoisePlink: "network connection closed unexpectedly"&lt;/li&gt;&lt;li&gt;collabnet svn / cygwin ssh: worked fine!&lt;/li&gt;&lt;/ol&gt;I worked around the problem by changing my login shell to /bin/tcsh on the Solaris machine: that made the error messages go away, I guess because bash is installed incorrectly on that machine.&lt;br /&gt;&lt;br /&gt;Once I changed my login shell to eliminate the error messages, the latest version of Tortoise (1.6.5) was able to connect to a remote svn+ssh repository.&lt;br /&gt;&lt;br /&gt;Now, if I could somehow get back the hours I spent figuring this out... :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8958850041580851692?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8958850041580851692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8958850041580851692' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8958850041580851692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8958850041580851692'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/09/tortoisesvn-weirdness.html' title='TortoiseSVN weirdness'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-6542788705773126648</id><published>2009-09-16T11:59:00.000-07:00</published><updated>2009-09-16T12:04:32.381-07:00</updated><title type='text'>Dick Morris on YCP</title><content type='html'>There is an interesting post on Dick Morris's blog about &lt;a href="http://www.ycp.edu/"&gt;York College of Pennsylvania&lt;/a&gt;, and how YCP has kept costs down while maintaining educational quality:&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://www.dickmorris.com/blog/why-is-college-so-expensive/"&gt;http://www.dickmorris.com/blog/why-is-college-so-expensive/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think his general point---that most colleges and universities spend huge amounts of $$$ on things that contribute nothing to the education that students receive, and that these costs are ultimately borne by students---is well taken.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-6542788705773126648?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/6542788705773126648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=6542788705773126648' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6542788705773126648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6542788705773126648'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/09/dick-morris-on-ycp.html' title='Dick Morris on YCP'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-6029015097862193928</id><published>2009-09-06T10:44:00.000-07:00</published><updated>2009-09-06T10:47:41.063-07:00</updated><title type='text'>74hc163 symbol/device for Eagle CAD</title><content type='html'>The 74xx-us library for Eagle CAD does not include support for the 74xx163 counter IC.  I made a small library which includes it.  The library is here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://faculty.ycp.edu/%7Edhovemey/DHH-74hc163.lbr"&gt;http://faculty.ycp.edu/~dhovemey/DHH-74hc163.lbr&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Only the DIL16 package (a.k.a. DIP or PDIP) is supported.  I have not tried creating a board using the library, so caveat emptor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-6029015097862193928?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/6029015097862193928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=6029015097862193928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6029015097862193928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6029015097862193928'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/09/74hc163-symboldevice-for-eagle-cad.html' title='74hc163 symbol/device for Eagle CAD'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-5952419251173019475</id><published>2009-08-31T10:13:00.000-07:00</published><updated>2009-08-31T10:19:10.016-07:00</updated><title type='text'>74hc163 problem - solved</title><content type='html'>My colleague Greg figured out why my 74hc163 counter IC wasn't working.  The problem was not the counter - it was the 74hc04 IC I was using as an ersatz logic probe.  With the 150 Ohm resistors I was using, the LEDs were consuming more current than the 74hc04 could supply.&lt;br /&gt;&lt;br /&gt;Greg gave me a ULN2803A peripheral driver IC which is capable of sinking 500 mA per pin, which is more than ample for lighting an LED.  I modified my "logic probe" circuit, and now everything is working nicely.  As a side-benefit, I now have 8 inputs rather than just 6.&lt;br /&gt;&lt;br /&gt;A picture:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0thAcZenYGk/SpwFoDgCojI/AAAAAAAAAEE/NcC1l6H7T44/s1600-h/P5270044.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_0thAcZenYGk/SpwFoDgCojI/AAAAAAAAAEE/NcC1l6H7T44/s320/P5270044.JPG" alt="" id="BLOGGER_PHOTO_ID_5376178240866132530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Now the 74hc163 properly rolls over from 1111 (15) to 0 (0000).  Next experiment - cascading two 74hc163's to make an 8-bit counter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-5952419251173019475?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/5952419251173019475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=5952419251173019475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5952419251173019475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5952419251173019475'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/08/74hc163-problem-solved.html' title='74hc163 problem - solved'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_0thAcZenYGk/SpwFoDgCojI/AAAAAAAAAEE/NcC1l6H7T44/s72-c/P5270044.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7985073909011624029</id><published>2009-08-28T13:40:00.000-07:00</published><updated>2009-08-28T13:43:04.378-07:00</updated><title type='text'>Hmm...now I'm confused</title><content type='html'>I replaced the 74HC163 which was behaving strangely with a 74LS163.  I also changed my "logic probe" circuit to use a 74HCT04 instead of a 74HC04 for the inputs, in order to cope with the LS-TTL output levels.&lt;br /&gt;&lt;br /&gt;Well, strangely enough, the modified circuit &lt;span style="font-style: italic;"&gt;also&lt;/span&gt; jumps from a count of 1111 to a count of 0001.  Obviously, there is something I don't understand about the '163.&lt;br /&gt;&lt;br /&gt;Feh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7985073909011624029?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7985073909011624029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7985073909011624029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7985073909011624029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7985073909011624029'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/08/hmmnow-im-confused.html' title='Hmm...now I&apos;m confused'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-3480075500230296931</id><published>2009-08-28T12:52:00.000-07:00</published><updated>2009-08-28T13:10:57.488-07:00</updated><title type='text'>74hc163 counter has a bug?</title><content type='html'>I have been playing around with some 74hc163 chips that I have.   These are 4-bit synchronous counters with a parallel load capability.   When both counter-enable inputs are logic high, and a positive clock edge arrives, the counter value increases by 1.&lt;br /&gt;&lt;br /&gt;Oddly, the 74hc163 chips that I have seem to have a bug!   When the counter value is at 1111 (i.e., 15, the highest possible count), and a positive clock edge arrives, the count changes to 0001 rather than 0000.   From all of the 74hc163 datasheets I have seen, the count should wrap-around back to 0.&lt;br /&gt;&lt;br /&gt;I'm pretty sure I have wired the circuit correctly.  There are no floating inputs, for example.&lt;br /&gt;&lt;br /&gt;The chips are labeled "SP74HC163N", and the manufacturer seems to be "SPI".&lt;br /&gt;&lt;br /&gt;Here's a picture of the circuit with the 74hc163:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0thAcZenYGk/Spg4AjWs-jI/AAAAAAAAADs/odPXc3_gN4Y/s1600-h/P5240039.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_0thAcZenYGk/Spg4AjWs-jI/AAAAAAAAADs/odPXc3_gN4Y/s320/P5240039.JPG" alt="" id="BLOGGER_PHOTO_ID_5375107737408305714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The following two pictures show LEDs which follow the '163 output.   The 4 LEDs to the left are bits 0 through 3 of the count.   The two LEDs on the right are showing the values at the -LOAD and enable inputs.   (Note that they are both high, meaning that the counter is in counting mode.)&lt;br /&gt;&lt;br /&gt;Here's how things look when the count is at 1111:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0thAcZenYGk/Spg5bsBy5zI/AAAAAAAAAD8/lqIz1mrG0LI/s1600-h/P5240040.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_0thAcZenYGk/Spg5bsBy5zI/AAAAAAAAAD8/lqIz1mrG0LI/s320/P5240040.JPG" alt="" id="BLOGGER_PHOTO_ID_5375109303104628530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And here's how things look after one positive clock edge:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0thAcZenYGk/Spg48bqwdlI/AAAAAAAAAD0/j0BXkk4gg24/s1600-h/P5240043.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_0thAcZenYGk/Spg48bqwdlI/AAAAAAAAAD0/j0BXkk4gg24/s320/P5240043.JPG" alt="" id="BLOGGER_PHOTO_ID_5375108766137087570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;That's clearly not zero!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-3480075500230296931?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/3480075500230296931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=3480075500230296931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3480075500230296931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3480075500230296931'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/08/74hc163-counter-has-bug.html' title='74hc163 counter has a bug?'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_0thAcZenYGk/Spg4AjWs-jI/AAAAAAAAADs/odPXc3_gN4Y/s72-c/P5240039.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8806019261894890875</id><published>2009-08-22T11:08:00.000-07:00</published><updated>2009-08-22T11:14:05.610-07:00</updated><title type='text'>Neat logic synthesis freeware</title><content type='html'>I was trying to minimize a boolean circuit for a project I'm working on, and I found a really nice program called Simple Solver:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://home.roadrunner.com/%7Essolver/index.html"&gt;http://home.roadrunner.com/~ssolver/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You type in a truth table, and it spits out a boolean equation and/or circuit that generates the correct output.  You can constrain the part types, which of course is very useful if you're using discrete parts (e.g., 74HC gates).&lt;br /&gt;&lt;br /&gt;For the problem I gave it, Simple Solver found a solution using 4 NAND gates, which exactly fits in a single 74HC00.  Sweet.&lt;br /&gt;&lt;br /&gt;Simple Solver can also generate circuits using flip-flops based on user-specified timing diagrams, which is a feature I'm planning to investigate at some point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8806019261894890875?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8806019261894890875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8806019261894890875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8806019261894890875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8806019261894890875'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/08/neat-logic-synthesis-freeware.html' title='Neat logic synthesis freeware'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-5775378872132816354</id><published>2009-08-21T13:27:00.001-07:00</published><updated>2009-08-21T13:49:42.860-07:00</updated><title type='text'>Electronics stuff</title><content type='html'>I've been having a lot of fun playing with electronics this summer.  I completed my AVR microcontroller project, which involved designing a custom circuit board and having it manufactured.   More details soon.&lt;br /&gt;&lt;br /&gt;Since I feel like I have a reasonable handle on working with AVRs, I'm currently taking a step back, and learning about low-level digital circuits - gates, flip-flops, etc.&lt;br /&gt;&lt;br /&gt;Several important issues arise when building digital circuits:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You need to have a power-on reset to get all of the stateful circuit elements into a well-defined initial state&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You need a clock source&lt;/li&gt;&lt;li&gt;To understand what is going on in the circuit, you need a way of visualizing the logic levels at important points&lt;/li&gt;&lt;/ol&gt;I solved the first two problems by constructing a small circuit with six pushbuttons, using a switch debouncing circuit I found in the &lt;a href="http://www.lvr.com/microcib.htm"&gt;Microcontroller Idea Book&lt;/a&gt;.  Each button controls a single output pin.  A button press causes the output pin to go low, and a button release causes the output pin to return high.  Since a 74HC14 Schmitt-trigger hex inverter IC is used, there are six buttons/outputs.  A picture:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0thAcZenYGk/So8HcfPWxVI/AAAAAAAAADk/BuYGGr5TGng/s1600-h/P5170032.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_0thAcZenYGk/So8HcfPWxVI/AAAAAAAAADk/BuYGGr5TGng/s320/P5170032.JPG" alt="" id="BLOGGER_PHOTO_ID_5372521066479928658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The thing at the lower-right with the two wires sticking out of it is a single-row header socket, which is very handy for allowing wires to be plugged into a circuit on the fly.  I will spare you a picture of the underside, where you can see how bad I am at soldering things.  In any case, the thing works, and is useful for generating both reset and clock signals.&lt;br /&gt;&lt;br /&gt;I addressed problem number 3 (visualizing logic levels) using a pair of 74HC04 (hex inverter) ICs to control 6 LEDs.  Each input is fed through a pair of inverters, where the output of the second inverter controls the LED.  So, the LED is lit if the input is high, and is dark when the input is low.  Basically, each input is a really simple logic probe.  (I found out by experience that you can't use a 74HC output to both light an LED and also drive an input.)  The only minor hassle is that you have to tie the unused inputs to ground, but that's not a big deal.  A picture:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0thAcZenYGk/So8GH-OLNhI/AAAAAAAAADc/pm9SWXtB5Aw/s1600-h/P5170030.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_0thAcZenYGk/So8GH-OLNhI/AAAAAAAAADc/pm9SWXtB5Aw/s320/P5170030.JPG" alt="" id="BLOGGER_PHOTO_ID_5372519614507595282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here, the LEDs are showing the output of (one half of) a 74HC139 2-to-4 decoder driven by a 74HC74 dual D-type flip-flop used as a 2-bit counter.  When the clock button is pressed, the dark LED (the '139 decoder has active-low outputs) cycles through positions 0 (left) through 3 (third LED from the right).  The last two LEDs are unused.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-5775378872132816354?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/5775378872132816354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=5775378872132816354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5775378872132816354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5775378872132816354'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/08/electronics-stuff.html' title='Electronics stuff'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_0thAcZenYGk/So8HcfPWxVI/AAAAAAAAADk/BuYGGr5TGng/s72-c/P5170032.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7483698239414490636</id><published>2009-07-13T11:00:00.000-07:00</published><updated>2009-07-13T11:06:47.486-07:00</updated><title type='text'>AS1106/AS1107 LED display drivers</title><content type='html'>I've been using the &lt;a href="http://www.maxim-ic.com/quick_view2.cfm/qv_pk/1339"&gt;max7219&lt;/a&gt; to control 7-segment LED displays.  They're nice, and easy to use, but they're expensive (around $10).&lt;br /&gt;&lt;br /&gt;I discovered today that there is a cheap alternative: the &lt;a href="http://www.austriamicrosystems.com/eng/Products/Lighting-Management/LED-Drivers/AS1106"&gt;AS1106&lt;/a&gt; and &lt;a href="http://www.austriamicrosystems.com/eng/Products/Lighting-Management/LED-Drivers/AS1107"&gt;AS1107&lt;/a&gt; from &lt;a href="http://www.austriamicrosystems.com/"&gt;Austria Micro Systems&lt;/a&gt;.  They appear to be functionally identical to the max7219 and max7221, respectively.  And, you can buy them from &lt;a href="http://newark.com"&gt;Newark&lt;/a&gt; for $4 in qty 1.  Sweet.&lt;br /&gt;&lt;br /&gt;I've ordered some samples, so we'll see how they work out...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7483698239414490636?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7483698239414490636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7483698239414490636' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7483698239414490636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7483698239414490636'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/07/as1106as1107-led-display-drivers.html' title='AS1106/AS1107 LED display drivers'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8100956083460617091</id><published>2009-06-26T09:55:00.001-07:00</published><updated>2009-06-26T09:57:53.382-07:00</updated><title type='text'>Super-nifty perl script for cropping pdf files</title><content type='html'>I often need to include a PDF file in a LaTeX document.  This works great if the PDF file has a reasonable bounding box, but most software exports PDFs as full-page.&lt;br /&gt;&lt;br /&gt;I found a really great perl script that will crop a PDF by settings its bounding box to precisely enclose the PDF file's contents:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ctan.org/pkg/pdfcrop"&gt;http://ctan.org/pkg/pdfcrop&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I used it on a couple PDF tables produced by (gag) Microsoft Word 2007, and it worked great.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8100956083460617091?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8100956083460617091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8100956083460617091' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8100956083460617091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8100956083460617091'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/06/super-nifty-perl-script-for-cropping.html' title='Super-nifty perl script for cropping pdf files'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-3548436395510423281</id><published>2009-06-25T11:47:00.000-07:00</published><updated>2009-06-25T11:52:51.824-07:00</updated><title type='text'>Fun with 7-segment LED displays</title><content type='html'>Here's a circuit with an atmega8 hooked up to a max7219 7-segment display driver chip, with six 7-segment LED displays:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0thAcZenYGk/SkPHNCF81zI/AAAAAAAAADM/MBufUwCmoOA/s1600-h/7seg.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_0thAcZenYGk/SkPHNCF81zI/AAAAAAAAADM/MBufUwCmoOA/s320/7seg.jpg" alt="" id="BLOGGER_PHOTO_ID_5351339808960337714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The max7219 is the chip hidden in the rats nest of wires :-)&lt;br /&gt;&lt;br /&gt;There's a ds1305 RTC chip on the breadboard, but it's not connected to anything yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-3548436395510423281?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/3548436395510423281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=3548436395510423281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3548436395510423281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3548436395510423281'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/06/fun-with-7-segment-led-displays.html' title='Fun with 7-segment LED displays'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0thAcZenYGk/SkPHNCF81zI/AAAAAAAAADM/MBufUwCmoOA/s72-c/7seg.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-58467009688777345</id><published>2009-06-25T08:56:00.000-07:00</published><updated>2009-06-25T09:13:22.587-07:00</updated><title type='text'>Cheap USB AVR programmer</title><content type='html'>I have been using a serial-port AVR programmer (the Olimex one you can buy from &lt;a href="http://www.sparkfun.com/"&gt;Sparkfun&lt;/a&gt;) to do AVR development, but my laptop doesn't have a serial port.&lt;br /&gt;&lt;br /&gt;There are a number of USB-based AVR programmers, and they're not particularly expensive (e.g., the Atmel AVR-ISP mkII is $34 from &lt;a href="http://www.digikey.com/"&gt;Digikey&lt;/a&gt;), but being the cheapskate that I am I was looking for something &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; inexpensive.&lt;br /&gt;&lt;br /&gt;I'm happy to report that I've found one that works very well, and is only $10:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://alldav.com/index.php?main_page=product_info&amp;amp;cPath=5&amp;amp;products_id=24"&gt;http://alldav.com/index.php?main_page=product_info&amp;amp;cPath=5&amp;amp;products_id=24&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm using it with Sparkfun's AVR breakout board to bring the programming signals onto a breadboard using a single-row 6-pin cable from &lt;a href="http://digilentinc.com/"&gt;Digilent&lt;/a&gt;.  Here's a picture of the whole setup:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0thAcZenYGk/SkOgfH3J3hI/AAAAAAAAADE/sMC-WujirBs/s1600-h/AVRUSB.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_0thAcZenYGk/SkOgfH3J3hI/AAAAAAAAADE/sMC-WujirBs/s320/AVRUSB.jpg" alt="" id="BLOGGER_PHOTO_ID_5351297238793051666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The programmer is the small green board on the left.  The breakout board is the even smaller red board connected to the programmer at a right angle.&lt;br /&gt;&lt;br /&gt;In the host OS, the programmer appears as a serial port (/dev/ttyUSB0 on my Debian laptop).  The programmer type for avrdude is "stk500v2".&lt;br /&gt;&lt;br /&gt;As an additional bonus, the programmer supplies 5V to your circuit, using the host USB port as the power source.  I don't think it will source a lot of current, but it's certainly fine for a few ICs and LEDs.  The circuit on the breadboard in the picture has an atmega8 and an LED.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-58467009688777345?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/58467009688777345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=58467009688777345' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/58467009688777345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/58467009688777345'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/06/cheap-usb-avr-programmer.html' title='Cheap USB AVR programmer'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_0thAcZenYGk/SkOgfH3J3hI/AAAAAAAAADE/sMC-WujirBs/s72-c/AVRUSB.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-446588593186574499</id><published>2009-05-15T06:56:00.001-07:00</published><updated>2009-05-15T07:08:00.725-07:00</updated><title type='text'>The Xfce challenge</title><content type='html'>Every Linux (and BSD) user who is currently using Gnome or KDE4 should try &lt;a href="http://www.xfce.org/"&gt;Xfce&lt;/a&gt; for a week or two.&lt;br /&gt;&lt;br /&gt;I've been using Xfce for a couple weeks now, and I can't get over how much more pleasant it is.  It's simple.  It's unobtrusive.  It does what you want with a minimum of fuss.  It starts quickly.  It reminds me why I use Linux and not a certain commercial OS from a company in Washington state.&lt;br /&gt;&lt;br /&gt;I'm now running &lt;a href="http://www.xubuntu.org/"&gt;Xubuntu&lt;/a&gt; 9.04 on my desktop machine at work, and I have to say, it's really nice.  I take back some of bad things I said about the beta (which utterly failed to connect to any wireless networks on my laptop).  The nice thing about having a wired network connection is not having to deal with the disgraceful &lt;a href="http://projects.gnome.org/NetworkManager/"&gt;gnome network manager&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One interesting note about Xubuntu 9.04 is that I have configured it to use &lt;a href="http://nouveau.freedesktop.org/wiki/"&gt;nouveau&lt;/a&gt; instead of the proprietary nvidia drivers (because the restricted devices manager could not download the latter.)  I installed nouveau from the package repository, which apparently doesn't give you 3D acceleration, but I don't care about that.&lt;br /&gt;&lt;br /&gt;I had to learn about and futz with xrandr, but eventually I got it completely working with both of my monitors (which are both 1680x1050 widescreens).  Here's my xorg.conf if anyone's interested:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://faculty.ycp.edu/%7Edhovemey/linux/nouveau-dualhead-xorg.conf"&gt;http://faculty.ycp.edu/~dhovemey/linux/nouveau-dualhead-xorg.conf&lt;/a&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-446588593186574499?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/446588593186574499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=446588593186574499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/446588593186574499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/446588593186574499'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/05/xfce-challenge.html' title='The Xfce challenge'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-5350798475283812689</id><published>2009-04-23T12:26:00.001-07:00</published><updated>2009-04-23T12:28:34.628-07:00</updated><title type='text'>More Mandelbrot fun</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0thAcZenYGk/SfDBNI32JzI/AAAAAAAAAC8/AE51WAZCtgg/s1600-h/mandelbrot2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 262px; height: 320px;" src="http://1.bp.blogspot.com/_0thAcZenYGk/SfDBNI32JzI/AAAAAAAAAC8/AE51WAZCtgg/s320/mandelbrot2.png" alt="" id="BLOGGER_PHOTO_ID_5327970790643476274" border="0" /&gt;&lt;/a&gt;I modified the viewer so that the coordinates of the region being displayed are shown.  I also changed the color scheme to show more variation in points close to the set.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-5350798475283812689?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/5350798475283812689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=5350798475283812689' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5350798475283812689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5350798475283812689'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/04/more-mandelbrot-fun.html' title='More Mandelbrot fun'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_0thAcZenYGk/SfDBNI32JzI/AAAAAAAAAC8/AE51WAZCtgg/s72-c/mandelbrot2.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-205370026450025690</id><published>2009-04-22T07:00:00.000-07:00</published><updated>2009-04-22T07:09:40.309-07:00</updated><title type='text'>C#, Mono/Monodevelop, Mandelbrot set</title><content type='html'>I am teaching a section of &lt;a href="http://faculty.ycp.edu/%7Edhovemey/spring2009/cs101/"&gt;CS 101&lt;/a&gt; here at &lt;a href="http://www.ycp.edu/"&gt;YCP&lt;/a&gt; this semester, and we're finishing up the course with a few weeks of C# using Visual Studio.  The &lt;a href="http://faculty.ycp.edu/%7Edhovemey/spring2009/cs101/assign/assign9.html"&gt;current assignment&lt;/a&gt; is to write a program to display the Mandelbrot set, so of course I had to write my own implementation, which I did.  I can definitely recommend it as an enjoyable way to spend an evening&lt;br /&gt;&lt;br /&gt;Being a geek, I decided to use multiple threads to speed up the computation, but VMware player (which I use to run Windows XP within Linux) does not appear to emulate multiple CPUs.  So, I decided to see if I could compile and run the program using &lt;a href="http://monodevelop.com/"&gt;Monodevelop&lt;/a&gt;.  Sure enough, Monodevelop had no trouble importing a Visual Studio project.  I had to fix a couple bugs that hadn't manifested under Windows, but then it worked perfectly.&lt;br /&gt;&lt;br /&gt;Obligatory screenshot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0thAcZenYGk/Se8j8DruY2I/AAAAAAAAAC0/2WJolGxxT-k/s1600-h/MandelBrot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 286px; height: 320px;" src="http://4.bp.blogspot.com/_0thAcZenYGk/Se8j8DruY2I/AAAAAAAAAC0/2WJolGxxT-k/s320/MandelBrot.png" alt="" id="BLOGGER_PHOTO_ID_5327516398890410850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;[Yes, I'm still running KDE on my desktop machine.  It will be replaced with Xfce after the semester ends.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-205370026450025690?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/205370026450025690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=205370026450025690' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/205370026450025690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/205370026450025690'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/04/c-monomonodevelop-mandelbrot-set.html' title='C#, Mono/Monodevelop, Mandelbrot set'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_0thAcZenYGk/Se8j8DruY2I/AAAAAAAAAC0/2WJolGxxT-k/s72-c/MandelBrot.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-4589109261753771663</id><published>2009-04-20T18:24:00.000-07:00</published><updated>2009-04-20T18:26:31.236-07:00</updated><title type='text'>Using ncurses and unicode</title><content type='html'>Here's a useful post explaining how to output unicode characters in an application linked with the ncursesw library:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mail.nl.linux.org/linux-utf8/2004-08/msg00001.html"&gt;http://mail.nl.linux.org/linux-utf8/2004-08/msg00001.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-4589109261753771663?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/4589109261753771663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=4589109261753771663' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4589109261753771663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4589109261753771663'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/04/using-ncurses-and-unicode.html' title='Using ncurses and unicode'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-3395894297792440862</id><published>2009-04-20T07:04:00.000-07:00</published><updated>2009-04-20T07:35:50.924-07:00</updated><title type='text'>Xfce under Debian!</title><content type='html'>After my recent switch from using &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; to &lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt; on my laptop, I decided to try installing &lt;a href="http://www.xfce.org/"&gt;Xfce&lt;/a&gt;.  The standard &lt;a href="http://www.gnome.org/"&gt;Gnome&lt;/a&gt; environment that Debian provides is nice enough, and refreshingly free from the various broken and unintuitive add-ons that Ubuntu adds (e.g., compiz).  However, I've never exactly loved Gnome, and the philosophy of Xfce --- a simple and easy to use desktop environment --- sounded extremely appealing.&lt;br /&gt;&lt;br /&gt;Well, all I can say is that using Xfce was like coming home after years in the wilderness.  It's plain, it's simple, people who like all sorts of desktop effects would probably say it's boring, but my god, things just &lt;span style="font-style: italic;"&gt;work&lt;/span&gt;.  It reminds me, in a good way, of using &lt;a href="http://www.fvwm.org/"&gt;fvwm&lt;/a&gt; back in the late 90s, except that modern conveniences (e.g., &lt;a href="http://wicd.sourceforge.net/"&gt;wicd&lt;/a&gt; to manage network connections, &lt;a href="http://goodies.xfce.org/projects/panel-plugins/xfce4-battery-plugin"&gt;xfce4-battery-plugin&lt;/a&gt; to monitor the battery) are easily available and integrate unobtrusively.&lt;br /&gt;&lt;br /&gt;When I started using Ubuntu, I can remember reading articles that expressed the opinion that Ubuntu was trying to turn Linux into Windows.  I thought that view was alarmist at the time, but given the recent efforts of both the Ubuntu and Kubuntu projects to drastically reduce functionality and usability in the name of "modernizing" the user experience, I'm forced to conclude that the alarmists were right.  There's a quote from Marge Simpson that I think summarizes the situation nicely: in an episode taking place in the near future, she says "&lt;i&gt;Fox turned into a hard-core pornography network so gradually, I didn't even notice&lt;/i&gt;."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-3395894297792440862?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/3395894297792440862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=3395894297792440862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3395894297792440862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3395894297792440862'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/04/xfce-under-debian.html' title='Xfce under Debian!'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7945803317344637354</id><published>2009-04-17T08:58:00.000-07:00</published><updated>2009-04-17T09:08:57.472-07:00</updated><title type='text'>Debian!</title><content type='html'>I got fed up trying to figure out why &lt;a href="http://xubuntu.org/"&gt;Xubuntu&lt;/a&gt; 9.04 beta couldn't connect to the wireless network at work, so I installed &lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt; 5.0.1 (which is the latest stable release).&lt;br /&gt;&lt;br /&gt;The installation went smoothly.  (I had to put the firmware blob for the wireless adapter on a USB drive at one point, but that was no big deal.)  The default desktop environment is a very plain and boring version of Gnome (2.22.3 according to the "About Gnome" menu item.)  I love it!  No fancy effects, no stretchy or wobbly windows, no plasmoids, just plain vanilla buttons, menus, and windows.  Ahhhhh.... :-)&lt;br /&gt;&lt;br /&gt;After a few minutes of fiddling with /etc/apt/sources.list, I was able to install the &lt;a href="http://wicd.sourceforge.net/"&gt;wicd&lt;/a&gt; network connection manager (over ethernet), and a few minutes after that, I was back on the wireless network!&lt;br /&gt;&lt;br /&gt;So, &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;, thanks for the memories, and fare thee well.  I salute your attempt to become both feature- and bug-compatible with Windows.  In the meantime, I'll be getting some work done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7945803317344637354?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7945803317344637354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7945803317344637354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7945803317344637354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7945803317344637354'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/04/debian.html' title='Debian!'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7599603453678797318</id><published>2009-04-17T05:15:00.001-07:00</published><updated>2009-04-17T07:18:33.117-07:00</updated><title type='text'>Ubuntu, the Linux desktop, and the second system effect</title><content type='html'>I'm depressed.&lt;br /&gt;&lt;br /&gt;I've been a Linux user since 1994, and the &lt;a href="http://en.wikipedia.org/wiki/Unix_philosophy"&gt;Unix philosophy&lt;/a&gt; is an essential part of my lifestyle.  The main reason I've used Linux is that it is simply the most productive way for me to get things done.&lt;br /&gt;&lt;br /&gt;Since 2005, I've been an enthusiastic user of &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;.  At the time, and for several years thereafter, it was (IMO) the best Linux distribution, combining the careful design and usability of &lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt; with up-to-date hardware drivers and frequent high-quality releases.&lt;br /&gt;&lt;br /&gt;However, for the past two years, using Ubuntu has been an increasingly frustrating experience.&lt;br /&gt;&lt;br /&gt;The problem began with Ubuntu 7.10, which added &lt;a href="http://www.compiz.org/"&gt;Compiz&lt;/a&gt;.  The precedent that was established by this release was that the addition of useless "eye candy" was considered an adequate justification for major regressions in functionality and usability.&lt;br /&gt;&lt;br /&gt;At this point, I abandoned the default &lt;a href="http://www.gnome.org/"&gt;Gnome&lt;/a&gt;-based Ubuntu in favor of the &lt;a href="http://www.kde.org/"&gt;KDE&lt;/a&gt;-based &lt;a href="http://www.kubuntu.org/"&gt;Kubuntu&lt;/a&gt;.  Version 8.04, based on KDE 3.5, was outstanding.  Yes, there were no fancy desktop effects.  But everything &lt;span style="font-style: italic;"&gt;worked&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Then came Kubuntu version 8.10, with KDE 4.1 as the default desktop environment.  In terms of the sheer number of regressions in functionality and gratuitous interface differences, this release eclipsed even Ubuntu 7.10.  The backport of KDE 4.2 helped somewhat.  But I still spent considerable effort finding work arounds for software that was simply broken.  For example, the very nice kpdf program for viewing PDF files was replaced by something called "Okular", which I suppose works OK unless you want to print, in which case you're pretty much screwed.  Drag and drop between Linux and Windows XP (running in VMware player) stopped working.  The mechanism for configuring panels changed drastically.  I could go on and on.&lt;br /&gt;&lt;br /&gt;I'm now pinning my hopes on &lt;a href="http://xubuntu.org/"&gt;Xubuntu&lt;/a&gt;, the version of Ubuntu based on &lt;a href="http://www.xfce.org/"&gt;Xfce&lt;/a&gt;.  I'm now running the beta version of 9.04 on my laptop, and I'm cautiously optimistic, although I have not had any success connecting to the wireless network I use at work.  (There appears to be a bug in scanning for wireless networks, and the dreadful Gnome network manager appears to be as buggy as it was the last time I looked at it.)  I'm hoping that the release version of 9.04 will prove to be a stable platform.  It's simple and configurable, and seems designed with usability in mind.&lt;br /&gt;&lt;br /&gt;The evolution of Gnome and KDE, and hence Ubuntu, recalls the &lt;a href="http://en.wikipedia.org/wiki/Second_system_effect"&gt;Second System Effect&lt;/a&gt;.  Somehow maintaining a working, stable system is not sufficient, even though that has been the strength of Linux (and Unix in general) for many years.  The developers responsible for creating the Linux desktop experience feel that it is necessary to make lots of crazy, unintuitive changes.  To put it another way, both Gnome and KDE are beginning to feel a lot like a certain desktop OS from a corporation in the northwest US.  And that's not a good thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7599603453678797318?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7599603453678797318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7599603453678797318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7599603453678797318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7599603453678797318'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/04/ubuntu-linux-desktop-and-second-system.html' title='Ubuntu, the Linux desktop, and the second system effect'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-5702140140485252751</id><published>2009-03-30T10:34:00.001-07:00</published><updated>2009-03-30T12:30:39.702-07:00</updated><title type='text'>Using git push</title><content type='html'>I'm starting to use &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; for some actual work, and am making tentative steps towards not totally sucking at it.&lt;br /&gt;&lt;br /&gt;Right now, I'm trying to get a handle on working with remote repositories.  In theory, because git is fully distributed, you don't need a central repository.  However, I want to use remote repositories to (1) ensure my data is backed up (I have access to a Solaris server with a RAID and regular disk backups), and (2) allow easy synchronization of my work between the various machines I use (office PC, laptop, etc.)&lt;br /&gt;&lt;br /&gt;The main idea with git is that repositories and working directories should be inseparable; all work should be versioned.  Being a distributed VCS, git gives you lots of ways to synchronize changes between repositories.  All well and good.&lt;br /&gt;&lt;br /&gt;However, weirdness ensues when you consider what git should do when you &lt;span style="font-weight: bold;"&gt;push&lt;/span&gt; (commit) changes from a local repository to a remote repository.  If you push into a remote repository that has a working directory checked out from the branch that you are pushing into, &lt;a href="http://hans.fugal.net/blog/2008/11/10/git-push-is-worse-than-worthless"&gt;git does weird things&lt;/a&gt;.  I won't even attempt to describe what happens, since I don't understand it.  Suffice it to say that it's not a useful behavior.&lt;br /&gt;&lt;br /&gt;One solution, as helpfully pointed out by the &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/gitcvs-migration.html"&gt;git cvs migration&lt;/a&gt; help file, is to create the remote repository as a "bare" repository, meaning that it does not have an associated working directory.  So, the series of steps is something like:&lt;br /&gt;&lt;pre&gt;server$ cd /some/directory &amp;amp;&amp;amp; git --bare init&lt;br /&gt;&lt;br /&gt;client$ git clone username@server:/some/directory&lt;br /&gt;[ add some files ]&lt;br /&gt;client$ git add &lt;i&gt;files...&lt;/i&gt;&lt;br /&gt;client$ git commit -m"Added some files..."&lt;br /&gt;client$ git push origin&lt;/pre&gt;The "origin" in git push origin evidently refers to the remote repository from which the local repository was cloned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-5702140140485252751?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/5702140140485252751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=5702140140485252751' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5702140140485252751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5702140140485252751'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/03/using-git-push.html' title='Using git push'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-1303997853514703082</id><published>2009-03-29T11:28:00.000-07:00</published><updated>2009-03-29T11:32:58.329-07:00</updated><title type='text'>Good book on git</title><content type='html'>I found a good book on the &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; distributed version control system:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.pragprog.com/titles/tsgit/pragmatic-version-control-using-git"&gt;Pragmatic Version Control Using Git&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the first good introduction to git (and to distributed version control in general) that I've seen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-1303997853514703082?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/1303997853514703082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=1303997853514703082' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1303997853514703082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1303997853514703082'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/03/good-book-on-git.html' title='Good book on git'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8422178013854929304</id><published>2009-03-26T12:22:00.000-07:00</published><updated>2009-03-26T13:40:50.557-07:00</updated><title type='text'>An addictive game</title><content type='html'>Beware: this is a potential time sink.&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://faculty.ycp.edu/%7Edhovemey/MiniGolf.zip"&gt;MiniGolf.zip&lt;/a&gt; [for Windows systems]&lt;/blockquote&gt;See the included README.txt for details.&lt;br /&gt;&lt;br /&gt;Screenshot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://faculty.ycp.edu/%7Edhovemey/spring2009/cs101/assign/images/holeInOne.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 361px; height: 182px;" src="http://faculty.ycp.edu/%7Edhovemey/spring2009/cs101/assign/images/holeInOne.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8422178013854929304?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8422178013854929304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8422178013854929304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8422178013854929304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8422178013854929304'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/03/addictive-game.html' title='An addictive game'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-5388814626753652687</id><published>2009-02-16T05:03:00.000-08:00</published><updated>2009-02-16T05:07:45.105-08:00</updated><title type='text'>Q&amp;A: How to use the command line to create a new top-level Opera window</title><content type='html'>&lt;p&gt;When I click the "quick launch" button (or whatever KDE calls them) to open a web browser, I like to have a new top-level window, not a tab of an existing browser window.&lt;/p&gt;&lt;p&gt;Opera, by default, creates a new tab in an existing window.  So, I hunted for a command line option to force it to create a new window.  Here are the command line options:&lt;/p&gt;&lt;blockquote&gt;&lt;a href="http://www.opera.com/docs/switches/"&gt;http://www.opera.com/docs/switches/&lt;/a&gt;&lt;/blockquote&gt;&lt;p&gt;Sure enough, there's a &lt;code&gt;-newwindow&lt;/code&gt; option to create a new window.  I try it, and what does it do?&lt;/p&gt;&lt;blockquote&gt;It creates a new tab in an existing window.&lt;/blockquote&gt;&lt;p&gt;Thanks, Opera.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-5388814626753652687?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/5388814626753652687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=5388814626753652687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5388814626753652687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5388814626753652687'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/02/q-how-to-use-command-line-to-create-new.html' title='Q&amp;A: How to use the command line to create a new top-level Opera window'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-1183832621847582124</id><published>2009-02-12T04:39:00.001-08:00</published><updated>2009-02-12T04:40:05.534-08:00</updated><title type='text'>Firefox working again</title><content type='html'>A reboot seems to have cleared up yesterday's firefox issue.  Weird.&lt;br /&gt;&lt;br /&gt;I guess I should probably quit out of firefox when a package update is being installed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-1183832621847582124?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/1183832621847582124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=1183832621847582124' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1183832621847582124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1183832621847582124'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/02/firefox-working-again.html' title='Firefox working again'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7728172955316393240</id><published>2009-02-11T07:12:00.000-08:00</published><updated>2009-02-11T07:14:43.788-08:00</updated><title type='text'>Firefox broken by update to Kubuntu 8.04</title><content type='html'>&lt;p&gt;I received an update for firefox today on my main office machine (running Kubuntu 8.04), and firefox is now completely broken.  All it does now is exit immediately with a 0 exit code.&lt;/p&gt;&lt;p&gt;I have temporarily switched to &lt;a href="http://www.opera.com"&gt;Opera&lt;/a&gt;, which seems quite nice.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7728172955316393240?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7728172955316393240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7728172955316393240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7728172955316393240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7728172955316393240'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/02/firefox-broken-by-update-to-kubuntu-804.html' title='Firefox broken by update to Kubuntu 8.04'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7787574276819772583</id><published>2009-01-20T11:06:00.000-08:00</published><updated>2009-01-20T11:08:17.579-08:00</updated><title type='text'>Reset your windows password</title><content type='html'>I forgot my windows password recently.  Fortunately, if you can boot from a CD, the following Linux-based utility will allow you to easily reset passwords:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://home.eunet.no/pnordahl/ntpasswd/"&gt;http://home.eunet.no/pnordahl/ntpasswd/&lt;/a&gt;&lt;/blockquote&gt;W00t.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7787574276819772583?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7787574276819772583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7787574276819772583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7787574276819772583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7787574276819772583'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/01/reset-your-windows-password.html' title='Reset your windows password'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-9093197564796135420</id><published>2009-01-02T17:58:00.000-08:00</published><updated>2009-01-02T18:11:05.424-08:00</updated><title type='text'>More finds from Pandora</title><content type='html'>&lt;a href="http://www.pandora.com/"&gt;Pandora&lt;/a&gt; continues to be an amazing way to discover new music.  Two recent finds worth mentioning:&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://www.the-changes.com/"&gt;The Changes&lt;/a&gt;.  I'm not quite sure how to classify them.  Maybe if you threw Fine Young Cannibals, A-ha, The Smiths, and Wham into a blender, adding a dash of Joe Jackson, you'd end up with something like The Changes.  I received their album &lt;span style="font-style: italic;"&gt;Today Is Tonight&lt;/span&gt; for X-mas, and it's excellent.  Plenty of big obvious hooks, with a lot of substance underneath.  Sort of like the Killers, but better.&lt;br /&gt;&lt;br /&gt;2. &lt;a href="http://www.gbv.com/"&gt;Guided By Voices&lt;/a&gt;.  I received their album &lt;span style="font-style: italic;"&gt;Earthquake Glue&lt;/span&gt; for X-mas, purely so that I would have a copy of the song &lt;span style="font-style: italic;"&gt;The Best of Jill Hives&lt;/span&gt;, which would easily be on my list of the best songs ever.  I'm actually a bit obsessed by this song at the moment---I think it might be perfect.  I'm not quite sure where the rest of the songs on the album fall, but there's certainly some good stuff there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-9093197564796135420?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/9093197564796135420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=9093197564796135420' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/9093197564796135420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/9093197564796135420'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/01/more-finds-from-pandora.html' title='More finds from Pandora'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-5244671239863398898</id><published>2009-01-02T17:44:00.000-08:00</published><updated>2009-01-02T17:58:21.793-08:00</updated><title type='text'>Static fields and methods are unnecessary</title><content type='html'>Happy new Year!  Right now I'm in Hilton Head, South Carolina on the last day of a family vacation.  (Ah, vacation.)&lt;br /&gt;&lt;br /&gt;I've been thinking quite a bit lately about how to design a very simple dynamic object-oriented language along the lines of Ruby.  Every value should be an instance of an object, etc.&lt;br /&gt;&lt;br /&gt;One ugliness that I wanted to avoid was the need for static fields and methods.  However, for things like the standard input and output streams, you don't want to have to create new instances of these objects every time they are needed.&lt;br /&gt;&lt;br /&gt;Today it occurred to me that all you really need is a language mechanism to define "singleton classes".  A singleton class defines a single instance at runtime.  Singleton classes are a convenient place to stash things like standard input and output streams.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;module System::IO {&lt;br /&gt;  field in;&lt;br /&gt;  field out;&lt;br /&gt;  field err;&lt;br /&gt;&lt;br /&gt;  method init() {&lt;br /&gt;      self.in = new System::InputStream(:stdin);&lt;br /&gt;      self.out = new System::OutputStream(:stdout);&lt;br /&gt;      self.err = new System::OutputStream(:stderr);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Here, the keyword "module" means singleton class.&lt;br /&gt;&lt;br /&gt;Now, consider some code where this singleton class (System::IO) is used:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;import System::IO;&lt;br /&gt;&lt;br /&gt;IO.out.print("Hello, world\n");&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;The import directive lets the compiler know that in this translation unit, the identifier "IO" will refer to the instance of the singleton class "System::IO".  As long as some runtime magic can produce a reference to the instance of a singleton class, all field and method accesses are done through ordinary object references.  No static fields or methods needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-5244671239863398898?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/5244671239863398898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=5244671239863398898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5244671239863398898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5244671239863398898'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2009/01/static-fields-and-methods-are.html' title='Static fields and methods are unnecessary'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-2845370354947477827</id><published>2008-10-22T04:12:00.000-07:00</published><updated>2008-10-22T04:15:11.457-07:00</updated><title type='text'>Engineers vs. Computer Scientists</title><content type='html'>I've been thinking lately about how people in other fields, such as engineering, view programming and computing in general.  This morning I think I figured it out:&lt;br /&gt;&lt;blockquote&gt;Engineers write programs to &lt;span style="font-style: italic;"&gt;solve&lt;/span&gt; problems.  Computer scientists write programs to &lt;span style="font-style: italic;"&gt;create&lt;/span&gt; problems.&lt;/blockquote&gt;Neatly summarizes the situation, don't you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-2845370354947477827?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/2845370354947477827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=2845370354947477827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2845370354947477827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2845370354947477827'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/10/engineers-vs-computer-scientists.html' title='Engineers vs. Computer Scientists'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-3536794701073754934</id><published>2008-10-17T06:18:00.001-07:00</published><updated>2008-10-17T06:20:31.078-07:00</updated><title type='text'>Picture of the day</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0thAcZenYGk/SPiQuJw7KtI/AAAAAAAAACY/ChXl8ZVoTF0/s1600-h/robotLawnmower.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_0thAcZenYGk/SPiQuJw7KtI/AAAAAAAAACY/ChXl8ZVoTF0/s320/robotLawnmower.png" alt="" id="BLOGGER_PHOTO_ID_5258111687524559570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is a screenshot of a "Robot Lawnmower Simulation" that I assigned as a project in a CS2 course I'm teaching.&lt;br /&gt;&lt;br /&gt;Here's the link:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://faculty.ycp.edu/%7Edhovemey/fall2008/cs201/assign/assign4.html"&gt;http://faculty.ycp.edu/~dhovemey/fall2008/cs201/assign/assign4.html&lt;/a&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-3536794701073754934?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/3536794701073754934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=3536794701073754934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3536794701073754934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3536794701073754934'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/10/picture-of-day.html' title='Picture of the day'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0thAcZenYGk/SPiQuJw7KtI/AAAAAAAAACY/ChXl8ZVoTF0/s72-c/robotLawnmower.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-5000795505557790108</id><published>2008-10-05T17:16:00.001-07:00</published><updated>2008-10-05T17:37:06.908-07:00</updated><title type='text'>max7219 is working</title><content type='html'>This past week I was able to get the AVR to talk to a &lt;a href="http://www.maxim-ic.com/quick_view2.cfm/qv_pk/1339"&gt;max7219&lt;/a&gt; multiplexed LED driver.  One thing that took a while to figure out is that to bring the max7219 out of shutdown mode, you write a 1 to the shutdown register, not a 0.  Fortunately, putting the chip in test mode (all LEDs lit) works even in shutdown mode, so I was at least able to verify that the chip worked and it was receiving data.  After getting it out of shutdown mode, progress was rapid.  (In the process of debugging, I also discovered that the max7219 works best when its ground pins are connected to ground :-)&lt;br /&gt;&lt;br /&gt;One nice feature of the max7219 is that it supports undecoded output, meaning that you're not limited to decimal, hex, or code-B when using 7-segment displays.  Some weird people out there have come up with &lt;a href="http://www.twyman.org.uk/Fonts/"&gt;7 segment text fonts&lt;/a&gt;, which (surprisingly) aren't totally unreadable.&lt;br /&gt;&lt;br /&gt;Aside from adding some buttons for user input, pretty much all of the technical details of my top-secret AVR project have been ironed out.  (I still have to finish writing the code, but that should be the easy part.)&lt;br /&gt;&lt;br /&gt;One interesting wrinkle is that the max7219 doesn't precisely support &lt;a href="http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus"&gt;SPI&lt;/a&gt;, but a protocol very much like it.  So, I actually have two SPI busses, one for the &lt;a href="http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2686"&gt;ds1305&lt;/a&gt;, and one for the max7219.  (I should have ordered the max7221, which is fully SPI-compatible.)  No big deal, since the atmega48/88/168 chips have a lot of I/O pins.   (I'm currently using the '48, since it's cheapest.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-5000795505557790108?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/5000795505557790108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=5000795505557790108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5000795505557790108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5000795505557790108'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/10/max7219-is-working.html' title='max7219 is working'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-4106522329032352569</id><published>2008-09-25T08:01:00.000-07:00</published><updated>2008-09-25T08:12:09.930-07:00</updated><title type='text'>SPI success!</title><content type='html'>I've had no luck getting the atmega168 to talk to a DS1307 RTC chip over &lt;a href="http://en.wikipedia.org/wiki/I%C2%B2C"&gt;i2c&lt;/a&gt;.  My colleague Greg suggested using an RTC which uses &lt;a href="http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus"&gt;SPI&lt;/a&gt;.  After getting my hands on a couple &lt;a href="http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2686"&gt;DS1305&lt;/a&gt;s, I wired it up, and wrote some code to bit-bang SPI using several pins on port C.  (I didn't use the hardware SPI support because those pins are used for in-system programming.)  I tried it out, and---nothing.  Every register read would return 0, which seemed a bit odd.&lt;br /&gt;&lt;br /&gt;Eventually, I replaced the DS1305 with some LEDs, and wired the atmega168 pin I was using for input from the DS1305 to +5V, and noticed that even though the LEDs were blinking correctly (I slowed the SPI protocol &lt;span style="font-style: italic;"&gt;way&lt;/span&gt; down), I was &lt;span style="font-style: italic;"&gt;still&lt;/span&gt; getting 0 when I did the read.&lt;br /&gt;&lt;br /&gt;Long story short, AVRs have different registers for reading and writing ports.  For example, PORTC means "write to port C", while PINC means "read from port C".  I, of course, was trying to read from the output register.   Fixed the code, and presto, my test program worked.  All it does is repeatedly writes an incrementing counter to one of the DS1305 RAM addresses, and reads it back.&lt;br /&gt;&lt;br /&gt;The obligatory picture:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0thAcZenYGk/SNupnKJIs_I/AAAAAAAAABw/yy8E66D5Abo/s1600-h/spiSuccess.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_0thAcZenYGk/SNupnKJIs_I/AAAAAAAAABw/yy8E66D5Abo/s320/spiSuccess.jpg" alt="" id="BLOGGER_PHOTO_ID_5249976280833111026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The DS1305 is the chip just to the right of the atmega168.&lt;br /&gt;&lt;br /&gt;Next step: use a &lt;a href="http://www.maxim-ic.com/quick_view2.cfm/qv_pk/1339"&gt;MAX7219&lt;/a&gt; to drive the 7-segment displays.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-4106522329032352569?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/4106522329032352569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=4106522329032352569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4106522329032352569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4106522329032352569'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/09/spi-success.html' title='SPI success!'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0thAcZenYGk/SNupnKJIs_I/AAAAAAAAABw/yy8E66D5Abo/s72-c/spiSuccess.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7752461123488291504</id><published>2008-09-25T06:49:00.000-07:00</published><updated>2008-09-25T07:01:46.179-07:00</updated><title type='text'>Thoughts on the bailout of the financial industry</title><content type='html'>Spending $700 billion to bail out the financial industry is about $2300 per US citizen.&lt;br /&gt;&lt;br /&gt;So, the US government wants to spend $2300 of my money (probably more) to clean up the financial mess left by greedy and stupid people.  We're letting the people who knowingly arranged and sold bad mortgages off the hook.  We're also (presumably) letting the people who knowingly walked into mortgages they couldn't afford off the hook.&lt;br /&gt;&lt;br /&gt;I now feel really stupid for working an honest job and living within my means.  Our government seems to be largely in the business of making sure that the unscrupulous prosper.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7752461123488291504?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7752461123488291504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7752461123488291504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7752461123488291504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7752461123488291504'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/09/thoughts-on-bailout-of-financial.html' title='Thoughts on the bailout of the financial industry'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-9182411323878319963</id><published>2008-09-12T13:40:00.000-07:00</published><updated>2008-09-12T13:47:29.573-07:00</updated><title type='text'>ATMega168, i2c/twi</title><content type='html'>I changed by AVR circuit to use an atmega168 rather than the attiny2313.  The primary reason is that I'm trying to use the i2c code from the &lt;a href="http://hubbard.engr.scu.edu/embedded/avr/avrlib/index.html"&gt;Procyon AVRLib&lt;/a&gt; in order to talk to a DS1307 real time clock, and avr-libc doesn't seem to have the required register definitions for the attiny2313.  I don't know why - the attiny2313 is supposed to support hardware TWI (really i2c).&lt;br /&gt;&lt;br /&gt;Here's a snapshot of the new circuit, taken again with the &lt;a href="http://reviews.cnet.com/digital-cameras/logitech-pocket-digital-130/4505-6501_7-30558058.html"&gt;world's worst digital camera&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0thAcZenYGk/SMrUuHb3VtI/AAAAAAAAABo/3Dp4QBLSYo8/s1600-h/Mega168.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_0thAcZenYGk/SMrUuHb3VtI/AAAAAAAAABo/3Dp4QBLSYo8/s320/Mega168.jpg" alt="" id="BLOGGER_PHOTO_ID_5245238604761355986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;My program successfully loads and runs on the atmega168.  Next step: actually try to talk to the DS1307.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-9182411323878319963?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/9182411323878319963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=9182411323878319963' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/9182411323878319963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/9182411323878319963'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/09/atmega168-i2ctwi.html' title='ATMega168, i2c/twi'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_0thAcZenYGk/SMrUuHb3VtI/AAAAAAAAABo/3Dp4QBLSYo8/s72-c/Mega168.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-2632860227668277425</id><published>2008-09-09T09:59:00.000-07:00</published><updated>2008-09-09T10:02:36.141-07:00</updated><title type='text'>Powered by Ubuntu sticker</title><content type='html'>When I got my &lt;a href="http://fullofleaves.blogspot.com/2008/08/thinkpad-x61-tablet.html"&gt;new Thinkpad X61 tablet&lt;/a&gt;, I (naturally) removed the "Designed for Vista" sticker and threw it away.  That got me wondering whether anyone has made a "Designed for Linux" sticker.  And of course, the answer is yes, and they're &lt;span style="font-style: italic;"&gt;free&lt;/span&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://system76.com/article_info.php?articles_id=9"&gt;http://system76.com/article_info.php?articles_id=9&lt;/a&gt;&lt;/blockquote&gt;Double w00t!&lt;br /&gt;&lt;br /&gt;The sticker actually says "Powered by Ubuntu", but that's good enough for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-2632860227668277425?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/2632860227668277425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=2632860227668277425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2632860227668277425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2632860227668277425'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/09/powered-by-ubuntu-sticker.html' title='Powered by Ubuntu sticker'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8877159617057496474</id><published>2008-09-09T06:37:00.001-07:00</published><updated>2008-09-09T06:49:51.414-07:00</updated><title type='text'>Getting Eclipse to work on 64-bit Linux</title><content type='html'>Back at the beginning of the summer, I was experiencing &lt;a href="http://fullofleaves.blogspot.com/2008/06/eclipse-weirdness-netbeans-to-rescue.html"&gt;strange Eclipse crashes&lt;/a&gt; after an upgrade to 64-bit Ubuntu.  My solution at the time was to switch over to &lt;a href="http://www.netbeans.org/"&gt;Netbeans&lt;/a&gt;, which worked out very nicely.&lt;br /&gt;&lt;br /&gt;Since students here at &lt;a href="http://www.ycp.edu/"&gt;YCP&lt;/a&gt; are using Eclipse for Java development, I thought I'd take another stab at getting things working.&lt;br /&gt;&lt;br /&gt;As it turns out, there is an easy solution: use the &lt;a href="http://www-128.ibm.com/developerworks/java/jdk/linux/download.html"&gt;IBM JDK&lt;/a&gt;.  Instructions are in a comment in the following blog post:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://dmartin.org/weblog/eclipse-on-ubuntu-linux-for-amd64"&gt;http://dmartin.org/weblog/eclipse-on-ubuntu-linux-for-amd64&lt;/a&gt;&lt;/blockquote&gt;Basically, you grab the RPM for the IBM JDK, use &lt;a href="http://kitenet.net/programs/alien/"&gt;alien&lt;/a&gt; to install it, then use the &lt;span style="font-weight: bold;"&gt;-vm&lt;/span&gt; Eclipse switch to launch it using the IBM JVM.&lt;br /&gt;&lt;br /&gt;W00t!&lt;br /&gt;&lt;br /&gt;Since the problem seems to be in the Sun JVM, and not Eclipse, I have to wonder why Sun has let this bug linger for such a long time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8877159617057496474?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8877159617057496474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8877159617057496474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8877159617057496474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8877159617057496474'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/09/getting-eclipse-to-work-on-64-bit-linux.html' title='Getting Eclipse to work on 64-bit Linux'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7896305326146490635</id><published>2008-09-05T13:26:00.000-07:00</published><updated>2008-09-05T13:43:33.011-07:00</updated><title type='text'>Improved Blinkenlights</title><content type='html'>My &lt;a href="http://www.avrfreaks.net/"&gt;AVR&lt;/a&gt;-fu is slowly improving.&lt;br /&gt;&lt;br /&gt;I'm now using the &lt;a href="http://www.sparkfun.com/commerce/product_info.php?products_id=14"&gt;AVR-PG1B&lt;/a&gt; programming cable I ordered from &lt;a href="http://www.sparkfun.com/"&gt;SparkFun&lt;/a&gt;, along with a DB9 cable and a &lt;a href="http://www.sparkfun.com/commerce/product_info.php?products_id=8508"&gt;breakout board&lt;/a&gt; that adapts the &lt;a href="http://wiredworld.tripod.com/tronics/atmel_isp.html"&gt;10-pin AVR ISP&lt;/a&gt; header to a single-row 6 pin header, which then plugs into my breadboard with a &lt;a href="http://digilentinc.com/Products/Catalog.cfm?Nav1=Products&amp;amp;Nav2=Cables&amp;amp;Cat=Cable"&gt;cable and gender changer&lt;/a&gt; from Digilent.  Very nice, works like a champ.  (Note: avrdude calls this programmer "ponyser".)&lt;br /&gt;&lt;br /&gt;I constructed a circuit interfacing the &lt;a href="http://www.avrfreaks.net/index.php?module=Freaks%20Devices&amp;amp;func=displayDev&amp;amp;objectid=75"&gt;attiny2313&lt;/a&gt; with an &lt;a href="http://www.maxim-ic.com/quick_view2.cfm/qv_pk/1675"&gt;ICM7212&lt;/a&gt; 7-segment LED driver.  So far, I only have 2 of the 4 supported digits wired, but it works nicely.  Here's a photo (taken again with a very crappy camera) of the whole mess:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0thAcZenYGk/SMGX-6sneLI/AAAAAAAAABg/KcAFdnLnjMI/s1600-h/Improved_Blinkenlights.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_0thAcZenYGk/SMGX-6sneLI/AAAAAAAAABg/KcAFdnLnjMI/s320/Improved_Blinkenlights.jpg" alt="" id="BLOGGER_PHOTO_ID_5242638548400044210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There's still plenty of room on the breadboard for another IC and a few switches, which are needed for my crazy top-secret project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7896305326146490635?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7896305326146490635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7896305326146490635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7896305326146490635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7896305326146490635'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/09/improved-blinkenlights.html' title='Improved Blinkenlights'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0thAcZenYGk/SMGX-6sneLI/AAAAAAAAABg/KcAFdnLnjMI/s72-c/Improved_Blinkenlights.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8726066542069778325</id><published>2008-09-02T14:36:00.000-07:00</published><updated>2008-09-02T14:51:31.834-07:00</updated><title type='text'>Blinkenlights success!</title><content type='html'>I couldn't wait for my AVR programming cable to arrive from &lt;a href="http://www.sparkfun.com/"&gt;Sparkfun&lt;/a&gt;, so I decided to build a parallel cable.&lt;br /&gt;&lt;br /&gt;Long story short: it works.  I used the pinout suggested by &lt;a href="http://www.bsdhome.com/avrdude/"&gt;http://www.bsdhome.com/avrdude/&lt;/a&gt;, which in avrdude is the "bsd" programming device.  Although that site suggested 1K resistors in series with the signals from the parallel port (to protect it from current flow from the AVR circuit), I couldn't get the device to program successfully with them in place.  So, I just used wires :-)&lt;br /&gt;&lt;br /&gt;For the cable, I soldered 5 wires of an 8-wire ribbon cable to the DB25 connector, and crimped a 16-pin socket-style connector onto the other end.  I don't know exactly what those connectors are called, but they're designed to fit into an IC socket.  That makes them nice for breadboards, which can't really accept dual row (IDC) headers directly.&lt;br /&gt;&lt;br /&gt;For the program, I used the code from Elliot Williams's excellent (no, &lt;span style="font-style: italic;"&gt;inspiring&lt;/span&gt;) piece on &lt;a href="http://www.instructables.com/id/Ghetto-Programming:-Getting-started-with-AVR-micro/"&gt;cheap AVR programming&lt;/a&gt;.  I didn't build his development board/programming cradle (did I mention that I hate soldering?), but I used the same circuit.&lt;br /&gt;&lt;br /&gt;Here's an amazingly crappy digital photo of the circuit and the programming cable:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0thAcZenYGk/SL20sN3stHI/AAAAAAAAABY/OnKegWL4RKA/s1600-h/img_0144.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_0thAcZenYGk/SL20sN3stHI/AAAAAAAAABY/OnKegWL4RKA/s320/img_0144.jpg" alt="" id="BLOGGER_PHOTO_ID_5241544213059646578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://faculty.ycp.edu/%7Edbabcock/"&gt;Dave Babcock&lt;/a&gt; and &lt;a href="http://faculty.ycp.edu/%7Eglink/"&gt;Greg Link&lt;/a&gt; helped me put the whole thing together.  It's really nice working with actual engineers :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8726066542069778325?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8726066542069778325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8726066542069778325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8726066542069778325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8726066542069778325'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/09/blinkenlights-success.html' title='Blinkenlights success!'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_0thAcZenYGk/SL20sN3stHI/AAAAAAAAABY/OnKegWL4RKA/s72-c/img_0144.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-1585387607265429094</id><published>2008-08-31T19:06:00.000-07:00</published><updated>2008-08-31T19:19:04.178-07:00</updated><title type='text'>Where to buy LEDs</title><content type='html'>While on the subject of electronics, here are some good places to buy LEDs:&lt;br /&gt;&lt;br /&gt;MPJA (&lt;a href="http://www.mpja.com/"&gt;www.mpja.com&lt;/a&gt;) - you can get 100 LEDs (red, green, or yellow) for $1.95.  But, there is a $15.00 minimum order.  I bought a breadboard from them recently, and the order was filled quickly, so they seem like a pretty reputable establishment.&lt;br /&gt;&lt;br /&gt;Jameco (&lt;a href="http://www.jameco.com/"&gt;www.jameco.com&lt;/a&gt;) - item number 334052 is an orange LED that is $2.20 for 100.  Other colors are more expensive, however.  I've bought stuff from them in the past, and they're reputable, but their website is kind of a pain to use.&lt;br /&gt;&lt;br /&gt;The discrepancies between what different places charge for an LED - a plain vanilla component if there ever was one - really amaze me.  At Sparkfun, you pay $0.35 for a green one and $0.50 for a red or yellow.  That's right, more than 10 times more expensive!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-1585387607265429094?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/1585387607265429094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=1585387607265429094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1585387607265429094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1585387607265429094'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/08/where-to-buy-leds.html' title='Where to buy LEDs'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-3421595510396322644</id><published>2008-08-31T18:39:00.000-07:00</published><updated>2008-08-31T19:05:25.889-07:00</updated><title type='text'>AVR microcontroller stuff</title><content type='html'>I'm pretty close to having the parts I need to start my crazy AVR microcontroller project.  (Note to self: in the future, don't order parts from Thailand if you want them to arrive in a timely fashion :-)  At the moment I'm just waiting for a programming cable, then I'll be off and running.  I was originally going to &lt;a href="http://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/"&gt;build a programming cable&lt;/a&gt;, but after reflecting on my lack of soldering skills, I decided this wasn't a great idea.  The one I ordered (from &lt;a href="http://www.sparkfun.com/"&gt;Sparkfun&lt;/a&gt;, good place to buy AVR stuff, BTW) was the &lt;a href="http://www.sparkfun.com/commerce/product_info.php?products_id=14"&gt;AVR-PG1B&lt;/a&gt;, which connects to a serial port on your PC, and allegedly is supported by &lt;a href="http://savannah.nongnu.org/projects/avrdude/"&gt;avrdude&lt;/a&gt;.  I also ordered a nifty little breakout board which adapts the 10 pin AVR ISP connector (2x5 pins) to a single row of six pins which can be plugged into a breadboard.  I'll need to get some help soldering it, however.&lt;br /&gt;&lt;br /&gt;While waiting for the programmer to arrive, I've been poking around the 'net looking at various AVR tutorials.  The best one I've come across is at &lt;a href="http://www.sparkfun.com/"&gt;Sparkfun&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://www.sparkfun.com/commerce/tutorial_info.php?tutorials_id=57"&gt;Beginning Embedded Electronics&lt;/a&gt;&lt;/blockquote&gt;There's a bunch of stuff at the beginning about building a power supply circuit using a 7805 voltage regulator, but you can save that effort if you have a good switching 5V wall wart power supply. &lt;a href="http://www.digilentinc.com/"&gt; Digilent&lt;/a&gt; has a good one (part number SWPS).  They also have a nice cable for getting the output of the power supply to a pair of leads (part number COAXPOWER).  Beware though: the ends of the leads are tinned with solder, so you don't want to stick them directly into a breadboard, lest bits of solder flake off and cause shorts.   A terminal block solves this problem nicely.&lt;br /&gt;&lt;br /&gt;When I get some &lt;a href="http://catb.org/jargon/html/B/blinkenlights.html"&gt;blinkenlights&lt;/a&gt; working I'll post a picture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-3421595510396322644?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/3421595510396322644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=3421595510396322644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3421595510396322644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3421595510396322644'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/08/avr-microcontroller-stuff.html' title='AVR microcontroller stuff'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-5696528606619804795</id><published>2008-08-22T11:42:00.000-07:00</published><updated>2008-08-22T12:00:09.223-07:00</updated><title type='text'>The rest2web template of awesomeness</title><content type='html'>Now that classes are starting again, it's time to create course web pages.  As I &lt;a href="http://fullofleaves.blogspot.com/2008/08/rest2web.html"&gt;mentioned earlier&lt;/a&gt;, I'm using &lt;a href="http://www.voidspace.org.uk/python/rest2web/"&gt;rest2web&lt;/a&gt; to generate most of the course web pages.&lt;br /&gt;&lt;br /&gt;One really nice feature of rest2web is that the template page (used as a basis for all generated web pages) can contain arbitrary chunks of &lt;a href="http://python.org/"&gt;python&lt;/a&gt; code.  One thing I noticed about my site design was that the sidebar (containing navigation links) was nice for index documents, but distracting for "leaf" documents such as assignment descriptions, lecture notes, etc.&lt;br /&gt;&lt;br /&gt;So, I put in a few lines of code to check the page being generated (available from the pagename variable: see the &lt;a href="http://www.voidspace.org.uk/python/rest2web/templating.html"&gt;rest2web template documentation&lt;/a&gt;) to see if it's an index page, and if so, suppress the sidebar.  I needed to futz a tiny bit with the CSS styles, but overall it was an extremely easy change.&lt;br /&gt;&lt;br /&gt;My &lt;a href="http://faculty.ycp.edu/%7Edhovemey/fall2008/cs200/"&gt;CS 200 page&lt;/a&gt; shows how the generated sites look.  Given how much easier it is to author &lt;a href="http://docutils.sourceforge.net/rst.html"&gt;reStructuredText&lt;/a&gt; documents than HTML, I think I'm getting awfully close to web content nirvana.&lt;br /&gt;&lt;br /&gt;Feel free to use/modify/steal my &lt;a href="http://faculty.ycp.edu/%7Edhovemey/rest2web/template.txt"&gt;rest2web template&lt;/a&gt; and &lt;a href="http://faculty.ycp.edu/%7Edhovemey/rest2web/cs200.css"&gt;CSS stylesheet&lt;/a&gt; files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-5696528606619804795?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/5696528606619804795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=5696528606619804795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5696528606619804795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5696528606619804795'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/08/rest2web-template-of-awesomeness.html' title='The rest2web template of awesomeness'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-3428870370024148423</id><published>2008-08-19T18:54:00.000-07:00</published><updated>2008-08-20T06:03:45.968-07:00</updated><title type='text'>Thinkpad X61 Tablet</title><content type='html'>I'm now using a Lenovo Thinkpad X61 Tablet as my main computer at school.  So far, I like it a lot.  I'm dual booting Windows XP and &lt;a href="http://www.kubuntu.org/"&gt;Kubuntu&lt;/a&gt; 8.04.  I was able to get the tablet functionality working, with automatic screen rotation (nifty!), using information on the following web page:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://www.krizka.net/2008/02/13/thinkpad-x61-tablet-automatic-screen-rotation-under-linux/"&gt;http://www.krizka.net/2008/02/13/thinkpad-x61-tablet-automatic-screen-rotation-under-linux/&lt;/a&gt;&lt;/blockquote&gt;If you look down at the comments section, there's some information on running on Kubuntu (KDE) instead of Ubuntu (Gnome).&lt;br /&gt;&lt;br /&gt;You have to have the "hdaps_ec" module loaded.  I put it in my /etc/modules file.&lt;br /&gt;&lt;br /&gt;You also have to edit /etc/X11/xorg.conf.  Here's a link to the one I'm using (caveat emptor):&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://faculty.ycp.edu/%7Edhovemey/thinkpadX61t/xorg.conf"&gt;http://faculty.ycp.edu/~dhovemey/thinkpadX61t/xorg.conf&lt;/a&gt;&lt;/blockquote&gt;Finally, the "autorotate.py" script has a regular expression bug (fix is in the comments).  Here's the fixed version:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://faculty.ycp.edu/%7Edhovemey/thinkpadX61t/autorotate.py"&gt;http://faculty.ycp.edu/~dhovemey/thinkpadX61t/autorotate.py&lt;/a&gt;&lt;/blockquote&gt;The stylus is not calibrated terribly well, and the Debian/Ubuntu folks somehow &lt;a href="https://bugs.launchpad.net/ubuntu/+source/wacom-tools/+bug/216347"&gt;forgot to include the utility that calibrates it&lt;/a&gt;.  However, it works acceptably.  I used the &lt;a href="http://xournal.sourceforge.net/"&gt;Xournal&lt;/a&gt; program to jot some notes, and while it's not exactly like writing on paper, it's not bad at all.  I may try to use this in class rather than writing on the whiteboard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-3428870370024148423?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/3428870370024148423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=3428870370024148423' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3428870370024148423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3428870370024148423'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/08/thinkpad-x61-tablet.html' title='Thinkpad X61 Tablet'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7569551551140206756</id><published>2008-08-07T20:00:00.000-07:00</published><updated>2008-08-07T20:27:17.549-07:00</updated><title type='text'>gschem vs. kicad</title><content type='html'>I have officially given up trying to use &lt;a href="http://www.geda.seul.org/tools/gschem/index.html"&gt;gschem&lt;/a&gt;.  I can place components (and even create new symbols), but I have had no success connecting pins with wires.  It is possible that I am an idiot, but I don't think I have to go too far out on a limb to claim that gschem isn't the most user-friendly of programs.&lt;br /&gt;&lt;br /&gt;Fortunately, there appears to be a nice alternative called &lt;a href="http://www.lis.inpg.fr/realise_au_lis/kicad/"&gt;kicad&lt;/a&gt;.  The problem of parts I need (e.g., ATtiny2313, ICM7212) not being in the default symbol library is still an issue, although some web searching did eventually turn up symbols for the parts I needed.&lt;br /&gt;&lt;br /&gt;Update: I was able to connect VCC on the ATtiny2313 to +5V!  I'm going to tentatively say that kicad rocks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7569551551140206756?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7569551551140206756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7569551551140206756' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7569551551140206756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7569551551140206756'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/08/gschem-vs-kicad.html' title='gschem vs. kicad'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7195648126591561153</id><published>2008-08-06T13:57:00.000-07:00</published><updated>2008-08-06T14:12:05.972-07:00</updated><title type='text'>rest2web</title><content type='html'>I've written a lot of HTML in the past few years, especially for course web pages.  I've used two basic techniques:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Hand-written HTML using a text editor.  Blech.&lt;/li&gt;&lt;li&gt;Editing HTML documents using &lt;a href="http://www.kompozer.net/"&gt;Kompozer&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;Technique #1 is just too much work.  &lt;a href="http://www.w3.org/Style/CSS/"&gt;CSS&lt;/a&gt; has moved HTML quite a bit further towards true semantic markup, so you don't have to worry too much about presentation any more when creating content.  However,  there's no getting around the fact that HTML (and XML) is just ugly and painful to work with by hand.&lt;br /&gt;&lt;br /&gt;Technique #2 is better than #1, but Kompozer (which was derived from the &lt;a href="http://www.mozilla.org/editor/"&gt;Mozilla editor&lt;/a&gt;) has its own share of quirks.  It's buggy, and it generates ugly HTML (it wants to put &amp;lt;br&amp;gt; tags all over the #^!%#! place).  I've been willing to live with its flaws, and it's saved me a lot of time.  However, it doesn't help in automating the creation of navigational elements (e.g., breadcrumbs, sidebars).&lt;br /&gt;&lt;br /&gt;Enter &lt;a href="http://docutils.sourceforge.net/rst.html"&gt;reStructuredText&lt;/a&gt; and &lt;a href="http://www.voidspace.org.uk/python/rest2web/"&gt;rest2web&lt;/a&gt;.  The former is a wiki-like lightweight markup language: a reST document looks more or less like plain text, but can easily be turned into HTML via a nifty python utility.  The latter is a site-creation tool which uses reST and some additional lightweight metadata to create complete websites from reST files.  It took a couple hours to learn my way around, but I was able to produce a very spiffy-looking site from (essentially) plain text files.  Sweet!&lt;br /&gt;&lt;br /&gt;Now I just need to create some content :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7195648126591561153?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7195648126591561153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7195648126591561153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7195648126591561153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7195648126591561153'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/08/rest2web.html' title='rest2web'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-3449361302720603783</id><published>2008-08-02T11:58:00.000-07:00</published><updated>2008-08-02T12:17:10.219-07:00</updated><title type='text'>djboxsym - a better way to create gschem symbols</title><content type='html'>OK, after my recent frustrations trying to use &lt;a href="http://www.geda.seul.org/docs/current/tutorials/tragesym/tragesym.html"&gt;tragesym&lt;/a&gt; to make a &lt;a href="http://www.geda.seul.org/tools/gschem/index.html"&gt;gschem&lt;/a&gt; symbol for the &lt;a href="http://www.datasheetcatalog.com/datasheets_pdf/I/C/M/7/ICM7212.shtml"&gt;ICM7212&lt;/a&gt;, I tried out &lt;a href="http://www.gedasymbols.org/user/dj_delorie/tools/djboxsym.html"&gt;djboxsym&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To make a long story short, it took about 15 minutes to do what I needed.  Sweet.  I used the &lt;a href="http://vivara.net/cgi-bin/djboxsym.cgi"&gt;web interface&lt;/a&gt;, which is very cool because you can immediately preview your work.&lt;br /&gt;&lt;br /&gt;For posterity, my extremely modest efforts are available:&lt;br /&gt;&lt;br /&gt;    &lt;a href="http://faculty.ycp.edu/%7Edhovemey/micro/icm7212.sym"&gt;icm7212.sym&lt;/a&gt;&lt;br /&gt;    &lt;a href="http://faculty.ycp.edu/%7Edhovemey/micro/icm7212.symdef"&gt;icm7212.symdef&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Caveat emptor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-3449361302720603783?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/3449361302720603783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=3449361302720603783' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3449361302720603783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/3449361302720603783'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/08/djboxsym-better-way-to-create-gschem.html' title='djboxsym - a better way to create gschem symbols'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8662548176206630454</id><published>2008-08-01T11:48:00.000-07:00</published><updated>2008-08-01T12:19:42.728-07:00</updated><title type='text'>The sad and alarming state of circuit design tools in Linux</title><content type='html'>So, for fun I'm playing around with microcontrollers.  I want to enter a schematic for the circuit I'm designing.&lt;br /&gt;&lt;br /&gt;I tried out &lt;a href="http://www.cadsoft.de/"&gt;Eagle CAD&lt;/a&gt;, but there is no symbol for the microcontroller I'm using (the Atmel &lt;a href="http://www.avrfreaks.net/index.php?module=Freaks%20Devices&amp;amp;func=displayDev&amp;amp;objectid=75"&gt;ATtiny2313&lt;/a&gt;).  There are some user-contributed libraries for Atmel parts, but I don't see that part anywhere.  Bleh.&lt;br /&gt;&lt;blockquote&gt;[Aside: the ATtiny2313 is only an insanely popular and widely-used part, which has only been available for 3 years now.  I can totally understand why it's not in any readily-available part library.]&lt;/blockquote&gt;So, I try out &lt;a href="http://www.geda.seul.org/tools/gschem/index.html"&gt;gschem&lt;/a&gt; from the &lt;a href="http://www.geda.seul.org/"&gt;gEDA&lt;/a&gt; package.  Free software is always better, of course.  The ATtiny2313 part isn't in the library, but I find it at &lt;a href="http://www.gedasymbols.org/"&gt;gedasymbols.org&lt;/a&gt;.  Yay.&lt;br /&gt;&lt;br /&gt;Unhappily, I don't see the ICM7212 in either the built-in library, or at gedasymbols.org.&lt;br /&gt;&lt;br /&gt;Blech.  OK, how easy is it to add a new symbol?  It's a plain, boring old 40 pin DIP.  How hard could this be?&lt;br /&gt;&lt;br /&gt;Well, it wasn't as easy as I had hoped.  The state of the art is described in a &lt;a href="http://geda.seul.org/wiki/geda:tragesym_tutorial"&gt;tutorial&lt;/a&gt;.  Here's a brief synopsis:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download a text file and an OpenOffice spreadsheet file.  (The text file is not, as far as I can see, mentioned again in the tutorial.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Edit the spreadsheet to fill in hundreds of mysterious labels.&lt;/li&gt;&lt;li&gt;Enter the function names,pin types, etc. for each pin.&lt;/li&gt;&lt;li&gt;Save the spreadsheet as comma-separated text.&lt;/li&gt;&lt;li&gt;Run the CSV through a python script, which creates a schematic file.&lt;/li&gt;&lt;li&gt;Edit the schematic file using gschem.  (Why?  Wish I knew.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Save it as a symbol file.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Just trying to read the tutorial makes me want to vomit with rage.&lt;br /&gt;&lt;br /&gt;The icing on the cake is this: the spreadsheet has pre-defined spaces for only 16 pins.  I'm trying to create a 40-pin part.  Being a programmer, I'm not going to sit there are fill in cells one at a time (17, 18, 19, etc...).  I'll just define a spreadsheet formula that will generate these pin numbers for me, and copy them into as many cells as needed.  The author of the spreadsheet, helpfully, &lt;span style="font-style: italic;"&gt;disabled support for formulas in the entire spreadsheet&lt;/span&gt;.  I honestly didn't even know this was possible!&lt;br /&gt;&lt;br /&gt;Someone please just shoot me, or at least jab me with something sharp.&lt;br /&gt;&lt;br /&gt;There seems to be a simpler approach, &lt;a href="http://www.gedasymbols.org/user/dj_delorie/tools/djboxsym.html"&gt;djboxsym&lt;/a&gt;, which looks like it dispenses with some of the unnecessary complexity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8662548176206630454?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8662548176206630454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8662548176206630454' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8662548176206630454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8662548176206630454'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/08/sad-and-alarming-state-of-circuit.html' title='The sad and alarming state of circuit design tools in Linux'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-4012529016240641569</id><published>2008-07-28T11:43:00.000-07:00</published><updated>2008-07-28T11:49:14.305-07:00</updated><title type='text'>Obligation analysis data</title><content type='html'>Here are the FindBugs analysis results files for my recent use of obligation analysis to look for unclosed stream bugs in Vuze and jEdit:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://faculty.ycp.edu/%7Edhovemey/findbugs/vuze-obl.fba"&gt;http://faculty.ycp.edu/~dhovemey/findbugs/vuze-obl.fba&lt;/a&gt;&lt;br /&gt;&lt;a href="http://faculty.ycp.edu/%7Edhovemey/findbugs/jedit-obl.fba"&gt;http://faculty.ycp.edu/~dhovemey/findbugs/jedit-obl.fba&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I classified the warnings as NEEDS_ANALYSIS if I considered the code apparently correct, and the warning could be avoided through the use of annotations (@WillClose, @WillCloseWhenClosed, etc.)  These were cases where if a called method (or object) failed to close the stream, then there truly would be a bug.&lt;br /&gt;&lt;br /&gt;I classified warnings as SHOULD_FIX if I considered that it was possible for the code to fail to close a stream.&lt;br /&gt;&lt;br /&gt;I classified the warnings as ANALYSIS_ERROR if the warning was completely erroneous.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-4012529016240641569?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/4012529016240641569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=4012529016240641569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4012529016240641569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4012529016240641569'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/07/obligation-analysis-data.html' title='Obligation analysis data'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-6201091546078796290</id><published>2008-07-25T10:47:00.000-07:00</published><updated>2008-07-25T11:17:13.842-07:00</updated><title type='text'>Obligation analysis: success!</title><content type='html'>The implementation of &lt;a href="http://www.cs.virginia.edu/%7Eweimer/p/p419-weimer.pdf"&gt;obligation analysis&lt;/a&gt; in &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; seems to be in a useful state.&lt;br /&gt;&lt;br /&gt;The analysis found about 8 bugs related to unclosed streams in FindBugs itself.  If you write tools to find bugs, people always ask you if the tool finds bugs in itself.  Well, FindBugs certainly does on a regular basis.&lt;br /&gt;&lt;br /&gt;I analyzed &lt;a href="http://azureus.sourceforge.net/"&gt;Vuze&lt;/a&gt; (formerly Azureus), and the detector reported 35 warnings.  Of those warnings, 17 appear to be legitimate issues, and another 17 are probably benign warnings that could be eliminated through the use of the &lt;a href="http://jcp.org/en/jsr/detail?id=305"&gt;JSR-305&lt;/a&gt; &lt;a href="http://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/WillClose.java"&gt;@WillClose&lt;/a&gt; or &lt;a href="http://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/WillCloseWhenClosed.java"&gt;@WillCloseWhenClosed&lt;/a&gt; annotations.  (These annotations are used to specify methods and objects that assume responsibility for closing a resource.)  1 warning was essentially a duplicate of another (apparently correct) warning.&lt;br /&gt;&lt;br /&gt;Analysis of &lt;a href="http://www.jedit.org/"&gt;jEdit&lt;/a&gt; was not quite as impressive, but still interesting: 4 apparent bugs, 9 warnings about probably-correct code that could be eliminated by annotations, and 3 cases where the analysis was wrong.  (I need to investigate the last category.)&lt;br /&gt;&lt;br /&gt;One type of false positive the paper didn't mention (that I can recall) was when one resource object "wraps" another.  This, of course, is a common design pattern (Adapter) used in the java.io package.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;InputStream in = new FileInputStream(filename);&lt;br /&gt;Reader r = new InputStreamReader(in);&lt;br /&gt;try {&lt;br /&gt; ...&lt;br /&gt;  r.read()&lt;br /&gt; ...&lt;br /&gt;} finally {&lt;br /&gt; r.close();&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;The analysis assumes that the InputStream is the obligation needing to be cleaned up, but the finally block closes the Reader instead.&lt;br /&gt;&lt;br /&gt;The @WillCloseWhenClosed annotation would fix this problem (explicitly specifying the "transfer" of one obligation type to another), but since JSR-305 is not official yet, the standard Java classes don't use this annotation.&lt;br /&gt;&lt;br /&gt;I worked around this issue by having the detector find likely places where an obligation transfer occurs, and then checking to see if the unmet obligation can be explained by an obligation transfer.  This heuristic seems to work fairly well in practice.&lt;br /&gt;&lt;br /&gt;Interestingly, a similar issue occurs when the "wrapped" resource is closed instead of the "wrapper".  Technically, this could be considered a bug (the "wrapper" resource's close() method might have extra work it wants to do), but in many cases this is also a correct approach.  The same heuristic (looking for probable obligation transfers) seems to be effective.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-6201091546078796290?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/6201091546078796290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=6201091546078796290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6201091546078796290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6201091546078796290'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/07/obligation-analysis-success.html' title='Obligation analysis: success!'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-6812360477160945031</id><published>2008-07-17T12:06:00.000-07:00</published><updated>2008-07-17T12:16:58.882-07:00</updated><title type='text'>Don't use the Intel CPU fan</title><content type='html'>I have built two systems using Intel socket 775 CPUs recently.  Last summer, I built one using a Pentium Dual Core E2140 (1.6 GHz), which I use at school.  This summer, I built one using a Pentium Dual Core E2220 (2.4 GHz), which I use at home.&lt;br /&gt;&lt;br /&gt;Putting together the newer one, I managed to break off one of the "legs" of the stock Intel CPU fan.  So, I bought a cheap third-party CPU fan at a local computer store.  The older system I use at school has the stock Intel CPU fan installed.&lt;br /&gt;&lt;br /&gt;Interestingly, my home machine runs &lt;span style="font-style: italic;"&gt;much&lt;/span&gt; cooler than the system at school.  Even under load, neither core gets above 45C, and each core idles around 30C.&lt;br /&gt;&lt;br /&gt;The system at school idles around 45C, and reaches close to 60C under load, even though the CPU is running nearly 1 GHz more slowly than my home machine.  Each machine has a cheapo ATX case with a case fan (in addition to the power supply fan.)&lt;br /&gt;&lt;br /&gt;This strikes me as odd: if you follow Intel's installation instructions exactly, you get pretty inadequate cooling.  I know the customer reviews on &lt;a href="http://www.newegg.com"&gt;newegg&lt;/a&gt; always say that the Intel CPU fans suck.  Well, I guess they do!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-6812360477160945031?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/6812360477160945031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=6812360477160945031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6812360477160945031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6812360477160945031'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/07/dont-use-intel-cpu-fan.html' title='Don&apos;t use the Intel CPU fan'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-6390318788750057179</id><published>2008-07-14T13:38:00.000-07:00</published><updated>2008-07-14T13:50:22.791-07:00</updated><title type='text'>Obligation analysis</title><content type='html'>A common form of runtime error in Java programs is not closing or freeing an acquired resource on all paths out of a method.  This kind of error is especially common with i/o streams, but also affects database resources, &lt;a href="http://jcp.org/en/jsr/detail?id=166"&gt;JSR-166&lt;/a&gt; lock objects, etc.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; has a couple detectors that I wrote quite a while ago for detecting such errors.  The detectors use a rather ad-hoc analysis, and produce a variety of annoying false positives.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.virginia.edu/%7Eweimer/"&gt;Wes Weimer&lt;/a&gt; and George Necula proposed a nice &lt;a href="http://www.cs.virginia.edu/%7Eweimer/p/p419-weimer.pdf"&gt;static analysis to find such errors&lt;/a&gt; at OOPSLA 2004.  I am finally getting around to getting this analysis implemented in FindBugs.  Their analysis tracks &lt;span style="font-style: italic;"&gt;obligations&lt;/span&gt; (open streams, db connections, etc.) on (effectively) all acyclic paths through methods, the basic idea being that every acyclic path ought to discharge all of its obligations.  The analysis does not attempt to track the actual resource values through variables and heap locations.  Instead, it just checks that each resource acquisition reaches an appropriate resource de-allocation.&lt;br /&gt;&lt;br /&gt;I think I have finally gotten to the point where I understand how the analysis works, and the initial implementation in FindBugs seems to be working.  I still need to complete the database of method calls which create or discharge obligations, and also implement several post-processing steps for false positive elimination, but I don't think this will be a huge amount of work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-6390318788750057179?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/6390318788750057179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=6390318788750057179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6390318788750057179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6390318788750057179'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/07/obligation-analysis.html' title='Obligation analysis'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-6876317759548994017</id><published>2008-07-11T13:21:00.000-07:00</published><updated>2008-07-11T13:27:31.023-07:00</updated><title type='text'>Ruby on Rails in Netbeans</title><content type='html'>&lt;a href="http://www.netbeans.org/"&gt;Netbeans&lt;/a&gt; is slowly becoming my favorite IDE.  (Sorry, &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;!)&lt;br /&gt;&lt;br /&gt;Today I started using the &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; support within Netbeans, and it's quite nice.  I'm probably not doing anything terribly sophisticated, but I did manage to create and run migrations, create some controllers and views, and launch the app, all from within Netbeans.  Eclipse probably has support for all this stuff, but due to unexplained Eclipse crashes (on Linux), I can't actually use it.&lt;br /&gt;&lt;br /&gt;I'm using the &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; plugin for Netbeans, which means my rails code is actually running in Java.  Kinda nice - Java is a more ubiquitous runtime environment that Ruby, so I'm thinking this will be helpful when it comes to deployment time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-6876317759548994017?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/6876317759548994017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=6876317759548994017' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6876317759548994017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6876317759548994017'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/07/ruby-on-rails-in-netbeans.html' title='Ruby on Rails in Netbeans'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7598284671451817580</id><published>2008-06-09T12:09:00.000-07:00</published><updated>2008-06-09T12:22:19.170-07:00</updated><title type='text'>Eclipse weirdness, NetBeans to the rescue</title><content type='html'>Last week, I did a hardware upgrade on my home PC.  Originally, I had an EliteGroup 848P-A motherboard with a Pentium 4 2.8GHz (Prescott) with 2 GB of DDR 400 RAM.  The new configuration has a &lt;a href="http://www.gigabyte.com.tw/Products/Motherboard/Products_Spec.aspx?ProductID=2729"&gt;Gigabyte GA-P35-S3G&lt;/a&gt; motherboard with a &lt;a href="http://processorfinder.intel.com/details.aspx?sSpec=SLA8W"&gt;Pentium Dual Core E2220&lt;/a&gt; (2.4GHz) and 4 GB of DDR2 800 RAM.  It was a pretty cheap upgrade, and performance on compute-intensive tasks seems to be about 2x faster.  Kubuntu 8.04 recognized all of the new hardware; no reconfiguration was necessary.&lt;br /&gt;&lt;br /&gt;Weirdly, there is one important application that no longer works following the upgrade: &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;.  I get repeated segfaults in libjvm.so.  As far as I can tell, it's not a hardware problem.  All other applications I have tried have been 100% stable, my CPU temperature has not exceeded 41 C for either core, &lt;a href="http://www.memtest.org/"&gt;memtest86+&lt;/a&gt; did not find any problems with the memory, etc.&lt;br /&gt;&lt;br /&gt;So, I conclude that it's some sort of software problem.  Could it be a weird interaction between SWT and gtk+?  This is where native code really sucks.&lt;br /&gt;&lt;br /&gt;In the meantime, I'm using &lt;a href="http://www.netbeans.org/"&gt;Netbeans&lt;/a&gt; for Java development.  It's gotten quite a bit better since the last time I used it.  It's maybe not quite as polished as Eclipse, but the important features (code completion, cross-referencing, and refactoring) are there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7598284671451817580?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7598284671451817580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7598284671451817580' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7598284671451817580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7598284671451817580'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/06/eclipse-weirdness-netbeans-to-rescue.html' title='Eclipse weirdness, NetBeans to the rescue'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-2182852909568037898</id><published>2008-05-29T13:15:00.000-07:00</published><updated>2008-05-30T08:17:02.706-07:00</updated><title type='text'>Summer!</title><content type='html'>Hooray, it's summer!  (I define summer as the period of time between Spring and Fall semesters, not by the progress of the earth around the sun.)&lt;br /&gt;&lt;br /&gt;I'm setting up my home machine to do some work on &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; over the summer, and since my Ubuntu 6.10 was getting a bit stale, I decided to upgrade.  I happened to have a CD burned with &lt;a href="http://www.kubuntu.org/"&gt;Kubuntu&lt;/a&gt; 8.04, so I backed up my essential files and let the installer rip.  So far, it seems nice.  It took a bit of getting used to &lt;a href="http://www.kde.org/"&gt;KDE&lt;/a&gt; rather than &lt;a href="http://www.gnome.org/"&gt;GNOME&lt;/a&gt;.  Overall, KDE seems less polished than GNOME, but more configurable.  I'm using &lt;a href="http://amarok.kde.org/"&gt;Amarok&lt;/a&gt; to play my music files, and it appears to be significantly better than &lt;a href="http://www.gnome.org/projects/rhythmbox/"&gt;Rhythmbox&lt;/a&gt;.  (See previous post to see my ranting about how much I dislike Rhythmbox.)&lt;br /&gt;&lt;br /&gt;Out of curiosity, I installed the Ubuntu &lt;a href="http://packages.ubuntu.com/hardy/openjdk-6-jdk"&gt;openjdk&lt;/a&gt; package, and tried running &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; on top of it.  So far, it seems to work quite well!  It's exciting to finally have a usable free Java implementation.  Major kudos to &lt;a href="http://www.sun.com/"&gt;Sun&lt;/a&gt; for &lt;a href="http://openjdk.java.net/"&gt;open sourcing the JDK&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There is a weird bug on Ubuntu/Kubuntu 8.04 with Eclipse: &lt;a href="https://bugs.launchpad.net/ubuntu/+source/eclipse/+bug/188380"&gt;here is the bug report&lt;/a&gt;.  The workaround described in the bug report does seem to fix the problem.&lt;br /&gt;&lt;br /&gt;I bought a new monitor, an &lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16824009129"&gt;Acer AL1916&lt;/a&gt;.  Newegg was having a special for $159, with free shipping.  Now (at long last) both of my monitors are the same size and resolution.&lt;br /&gt;&lt;br /&gt;I finally started some work on FindBugs today.  First project: implementing exclusive type qualifiers.  (This is part of implementing support for &lt;a href="http://code.google.com/p/jsr-305/"&gt;JSR 305&lt;/a&gt; type qualifiers in FindBugs.)  &lt;a href="http://www.cs.umd.edu/%7Epugh/"&gt;Bill Pugh&lt;/a&gt; has a &lt;a href="http://www.cs.umd.edu/%7Epugh/JSR-305.pdf"&gt;nice presentation about JSR 305&lt;/a&gt; which explains all of the goodness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-2182852909568037898?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/2182852909568037898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=2182852909568037898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2182852909568037898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2182852909568037898'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/05/summer.html' title='Summer!'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-6847053590307119510</id><published>2008-05-06T05:09:00.000-07:00</published><updated>2008-05-06T05:36:13.707-07:00</updated><title type='text'>Rhythmbox</title><content type='html'>I've been using &lt;a href="http://www.gnome.org/projects/rhythmbox/"&gt;Rhythmbox&lt;/a&gt; for a while to play my music files (which are, of course, in &lt;a href="http://www.vorbis.com/"&gt;Ogg Vorbis&lt;/a&gt; format.)&lt;br /&gt;&lt;br /&gt;I hate to say it, but I have become so frustrated with Rhythmbox that I'm now actively looking for a replacement.  Here are my main gripes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Gripe #1&lt;/span&gt;: When you toggle between the "small display" and the full size display, the window size chosen is &lt;span style="font-weight: bold;"&gt;always wrong&lt;/span&gt;.  What I expect to happen is that whatever window size I configure in the two modes, Rhythmbox will remember my decision.  For f***'s sake, would this be so hard to implement?  Here's what actually happens: when switching from the small display to full display, the full display gets a hard-coded height of about a third of my display height.  Here's a screenshot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0thAcZenYGk/SCBM9SBHfVI/AAAAAAAAABI/c8VS8nO9msM/s1600-h/rhythmbox.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_0thAcZenYGk/SCBM9SBHfVI/AAAAAAAAABI/c8VS8nO9msM/s320/rhythmbox.png" alt="" id="BLOGGER_PHOTO_ID_5197238585677806930" border="0" /&gt;&lt;/a&gt;As you can see, the various lists (artist, album, tracks) are completely squashed.  &lt;span style="font-weight: bold;"&gt;THIS SUCKS!!!!&lt;/span&gt;  (As a bonus bug, you'll notice that in Ubuntu 7.10, gimp is no longer able to capture screen shots that include the window decorations.)&lt;br /&gt;&lt;br /&gt;When switching from the full display back to the small display, sometimes the size is restored correctly, and sometimes the width of the full display is preserved (meaning that you get an extremely wide small display):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0thAcZenYGk/SCBQGyBHfWI/AAAAAAAAABQ/nHpwtPQKN8E/s1600-h/rhythmbox-small.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_0thAcZenYGk/SCBQGyBHfWI/AAAAAAAAABQ/nHpwtPQKN8E/s320/rhythmbox-small.png" alt="" id="BLOGGER_PHOTO_ID_5197242047421447522" border="0" /&gt;&lt;/a&gt;Nice work, rhythmbox!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Gripe #2&lt;/span&gt;: When an album finishes playing and you click "Play" again, it starts playing from the last track, not the first.  Yeah, that's &lt;span style="font-weight: bold;"&gt;just&lt;/span&gt; what I wanted to do.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Gripe #3&lt;/span&gt;: If you click "Previous" too quickly, playing stops altogether, even if you haven't reached the first track yet.&lt;br /&gt;&lt;br /&gt;One of the reasons I have been an enthusiastic user of free software over the past 15 years or so is that it generally places a high value on correctness and utility over bells and whistles.  It concerns me greatly that the free software world is moving towards a Windows model where every application is skinnable, animated out the wazoo, has a feature list the size of a telephone book, and is impossible to use for more than 2 minutes without uncovering a serious bug.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-6847053590307119510?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/6847053590307119510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=6847053590307119510' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6847053590307119510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6847053590307119510'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/05/rhythmbox.html' title='Rhythmbox'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_0thAcZenYGk/SCBM9SBHfVI/AAAAAAAAABI/c8VS8nO9msM/s72-c/rhythmbox.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8551799682807554608</id><published>2008-04-02T04:02:00.001-07:00</published><updated>2008-04-02T04:21:46.945-07:00</updated><title type='text'>Greatest Rock 'n Roll Song Ever?</title><content type='html'>I've had a theory for a while that the best Rock song ever written is "Memphis, Egypt" by the Mekons.  Trying to describe it in words is pointless, so go listen to it if you haven't heard it.  It's on the album &lt;span style="font-style: italic;"&gt;The Mekons Rock 'n Roll&lt;/span&gt;.  I've had the privilege of hearing them play it live, and all I can say is, holy ****.&lt;br /&gt;&lt;br /&gt;There are a few songs that I think are almost as good as "Memphis, Egypt".  "Club Mekon", also by the Mekons, comes close, and actually follows immediately after "Memphis, Egypt" on the same album!  This has to be the greatest two-song sequence ever recorded.&lt;br /&gt;&lt;br /&gt;"The Headmaster Ritual" by The Smiths (on &lt;span style="font-style: italic;"&gt;Meat is Murder&lt;/span&gt;) is possibly a better song than "Memphis, Egypt", but loses some points for the mechanical production that saps much of the energy from the track.  (Aside: the best Smiths album is &lt;span style="font-style: italic;"&gt;Hatful of Hollow&lt;/span&gt; because it is (mostly) a collection of tracks from radio shows, and captures the manic energy of the band much better than any of their studio output.  But you knew that.)&lt;br /&gt;&lt;br /&gt;I recently discovered on &lt;a href="http://www.pandora.com"&gt;Pandora&lt;/a&gt; a song called "I Stare Out..." by The Verlaines which I think could be as good as all of the previously mentioned songs; at the moment, I consider it a major discovery.  (Had you ever heard of The Verlaines?  I hadn't.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8551799682807554608?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8551799682807554608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8551799682807554608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8551799682807554608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8551799682807554608'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/04/greatest-rock-n-roll-song-ever.html' title='Greatest Rock &apos;n Roll Song Ever?'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8967424006685829568</id><published>2008-03-13T08:23:00.000-07:00</published><updated>2008-03-13T08:36:00.831-07:00</updated><title type='text'>Today's riddle: why does CUP emit the generated parser as TWO classes?</title><content type='html'>OK, so when you use &lt;a href="http://www2.cs.tum.edu/projects/cup/"&gt;CUP&lt;/a&gt; to generate a parser, it emits two classes: a parser class, and an action class (which contains the code generated for the semantic actions associated with the productions of your grammar).  These are totally separate classes.&lt;br /&gt;&lt;br /&gt;Today's riddle is this:&lt;br /&gt;&lt;blockquote&gt;Why is the code for the semantic actions generated in a separate class?&lt;/blockquote&gt;Here are some possible answers:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Your guess is as good as mine.&lt;/li&gt;&lt;li&gt;Look in the &lt;a href="http://www2.cs.tum.edu/projects/cup/manual.html"&gt;user manual&lt;/a&gt; to find out --- oh wait, the user manual doesn't explain this.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;To ensure that you must violate encapsulation in order to allow semantic actions to refer to internal parser operations?&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;My complaint is that if you want add additional fields--for example, a &lt;a href="http://en.wikipedia.org/wiki/Symbol_table"&gt;symbol table&lt;/a&gt; object---the semantic actions can't directly refer to it!&lt;br /&gt;&lt;br /&gt;The action code can refer to the parser via a field called &lt;span style="font-weight: bold;"&gt;parser&lt;/span&gt;, but that's only useful for calling public methods on the parser object.  But that means that any internal parser state/operations that the semantic actions want to access must be exposed as public, violating encapsulation.&lt;br /&gt;&lt;br /&gt;Blech.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8967424006685829568?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8967424006685829568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8967424006685829568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8967424006685829568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8967424006685829568'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/03/todays-riddle-why-does-cup-emit.html' title='Today&apos;s riddle: why does CUP emit the generated parser as TWO classes?'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-1230351762607017690</id><published>2008-03-12T09:21:00.001-07:00</published><updated>2008-03-12T09:29:36.231-07:00</updated><title type='text'>GUI Builders for Eclipse</title><content type='html'>The time has come to talk about GUIs in the Software Engineering course I'm teaching currently, which led me to revisit using a GUI builder in Eclipse.  (I will not hand-code a Swing GUI.  I just won't.)&lt;br /&gt;&lt;br /&gt;Previously I've used the &lt;a href="http://www.eclipse.org/vep/WebContent/main.php"&gt;Eclipse Visual Editor&lt;/a&gt; plugin, which, while not perfect, generally gets the job done.  To my dismay, the current release of the VE does not work with the current stable release of Eclipse, and there has not been an official release of the VE since June 2006.  (&lt;span style="font-style: italic;"&gt;So sadly neglected / and often ignored / a far second to Belgium / when going abroad / Finland, Finland, Finland&lt;/span&gt; :-)  I hope this project gets reinvigorated at some point, but I wasn't going to sit on my hands waiting for that to happen.&lt;br /&gt;&lt;br /&gt;A quick google search turned up &lt;a href="http://www.cloudgarden.com/jigloo/"&gt;Jigloo&lt;/a&gt;, an Eclipse-based GUI builder which, while not free software, is gratis for non-commercial use.  From my 10 minutes or so of using it, it appears to be very nice, quite a bit more polished than VE.  We'll see how it goes, but I'm cautiously optimistic it will do what I need it to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-1230351762607017690?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/1230351762607017690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=1230351762607017690' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1230351762607017690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1230351762607017690'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/03/gui-builders-for-eclipse.html' title='GUI Builders for Eclipse'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-2680845968906483170</id><published>2008-02-26T13:43:00.000-08:00</published><updated>2008-02-26T13:52:32.809-08:00</updated><title type='text'>ArgoUML</title><content type='html'>In teaching a course on Software Engineering and Design this semester, I have rediscovered &lt;a href="http://argouml.tigris.org/"&gt;ArgoUML&lt;/a&gt;.  Briefly, it's a UML design tool along the lines of &lt;a href="http://www.ibm.com/software/awdtools/developer/rose/index.html"&gt;Rational Rose&lt;/a&gt; or &lt;a href="http://www.visual-paradigm.com/product/vpuml/"&gt;Visual Paradigm&lt;/a&gt;.  I can briefly summarize its strengths:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It works pretty well, especially for basic uses (creating UML class diagrams)&lt;/li&gt;&lt;li&gt;It's &lt;a href="http://www.gnu.org/philosophy/free-sw.html"&gt;free software&lt;/a&gt; (in the sense of both freedom and money)&lt;/li&gt;&lt;li&gt;It's a pure Java application, and works well on any platform supported by Java&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Given those strengths, its a natural fit for an academic course, and in a more general sense is appealing to anyone trying to rid his or her life of proprietary, closed-source software.&lt;br /&gt;&lt;br /&gt;ArgoUML's main drawback is the lack of an Undo feature, which is certainly a bit disconcerting.  Web search hits of the ArgoUML development lists seem to indicate that this feature is in the works; if it gets done, then I my enthusiasm level would go from "pretty cool" to "KICK ASS".  Even without Undo, it's still a good choice for occasional UML modeling needs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-2680845968906483170?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/2680845968906483170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=2680845968906483170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2680845968906483170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2680845968906483170'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/02/argouml.html' title='ArgoUML'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-6462705780695995720</id><published>2008-02-13T04:09:00.000-08:00</published><updated>2008-02-13T04:11:51.222-08:00</updated><title type='text'>Elias Swope Hovemeyer</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0thAcZenYGk/R7LeaFVlkTI/AAAAAAAAAAs/6n9ouYInOGw/s1600-h/eli.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_0thAcZenYGk/R7LeaFVlkTI/AAAAAAAAAAs/6n9ouYInOGw/s320/eli.jpg" alt="" id="BLOGGER_PHOTO_ID_5166436262238064946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Born Friday, February 8th at 7:32 PM, weighing 6 lbs 12.8 oz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-6462705780695995720?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/6462705780695995720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=6462705780695995720' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6462705780695995720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6462705780695995720'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/02/elias-swope-hovemeyer.html' title='Elias Swope Hovemeyer'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0thAcZenYGk/R7LeaFVlkTI/AAAAAAAAAAs/6n9ouYInOGw/s72-c/eli.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7419549340837002727</id><published>2008-02-05T11:43:00.000-08:00</published><updated>2008-02-05T12:00:14.940-08:00</updated><title type='text'>Java Software is a Good Thing</title><content type='html'>I'm teaching a course on Compiler Design, and I'm going to have students use &lt;a href="http://jflex.de/"&gt;JFlex&lt;/a&gt; and &lt;a href="http://www2.cs.tum.edu/projects/cup/"&gt;CUP&lt;/a&gt; as the scanner and parser generators.&lt;br /&gt;&lt;br /&gt;I always dread asking students to use any software besides Visual Studio or Java/Eclipse, since it means I have to worry about whether or not&lt;br /&gt;&lt;ul&gt;&lt;li&gt;they have it installed&lt;/li&gt;&lt;li&gt;they have it installed correctly&lt;/li&gt;&lt;li&gt;they have the right version&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;I also have to make the build scripts configurable so students can customize them to reflect where they have the tools installed, which of course is another place where things can go wrong.  Plus, I have to ask our IT department to install the software in our lab, etc., etc.&lt;br /&gt;&lt;br /&gt;It occurred to me today that JFlex and CUP are both written in Java, so I could simply include them in the assignment skeleton!  This took me all of about 5 minutes.  Now I have a &lt;a href="http://faculty.ycp.edu/%7Edhovemey/spring2008/cs496/lecture/compilerExample.zip"&gt;compiler assignment skeleton that requires only Java and Eclipse&lt;/a&gt;.  In fact, it has an &lt;a href="http://ant.apache.org"&gt;Ant&lt;/a&gt; script, so you don't even have to use Eclipse.  So far I've only verified that it works on Linux, but I'm pretty confident that it will work on Windows, too.&lt;br /&gt;&lt;br /&gt;JFlex and CUP are both free software, so there are no license issues to worry about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7419549340837002727?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7419549340837002727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7419549340837002727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7419549340837002727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7419549340837002727'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/02/java-software-is-good-thing.html' title='Java Software is a Good Thing'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-1021582249108173605</id><published>2008-02-04T07:20:00.000-08:00</published><updated>2008-02-04T08:13:25.748-08:00</updated><title type='text'>The Vague Syntax of Ruby and Ruby on Rails</title><content type='html'>I like the &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt; programming language a lot, and the &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; web application framework is one of the best ones out there.  One characteristic they share is an emphasis on writing concise code.  Ruby pares down the syntax of writing object-oriented programs to a bare minimum.  Rails emphasizes the use of a small number of conventions and idioms in order to avoid specification of all but the most essential details.&lt;br /&gt;&lt;br /&gt;However, I think that both Ruby and Ruby on Rails take the principle of brevity to an unreasonable extreme.  Here are a few examples.&lt;br /&gt;&lt;br /&gt;First, Ruby (the language) does not require parentheses around conditions or method arguments.  So, you can write&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;foo.bar baz, thud&lt;/pre&gt;&lt;/blockquote&gt;instead of&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;foo.bar( baz, thud )&lt;/pre&gt;&lt;/blockquote&gt;In the second form, isn't it much more obvious that we're calling a method, and that &lt;tt&gt;baz&lt;/tt&gt; and &lt;tt&gt;thud&lt;/tt&gt; are the arguments?&lt;br /&gt;&lt;br /&gt;As an even simpler (and more ambiguous) example, say that you see this code in a Ruby method:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;blat&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;A bare identifier does not really provide any clue that would suggest to the reader how the identifier is being &lt;span style="font-style: italic; font-weight: bold;"&gt;used&lt;/span&gt;.  In this case, it will be interpreted as a method call with no arguments.  Wouldn't it be much more clear like this?&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;blat()&lt;/pre&gt;&lt;/blockquote&gt;I think the general lack of visual cues in Ruby code makes it difficult to read.&lt;br /&gt;&lt;br /&gt;Rails code (at least in the books and on-line tutorials I have read) tends to opt for the same kind of extreme brevity.  For example, consider the following code:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;redirect_to :action =&gt; :login, \&lt;br /&gt;         :destination =&gt; request.request_uri \&lt;br /&gt;         and return false&lt;/pre&gt;&lt;/blockquote&gt;I found this code in &lt;a href="http://confluence.atlassian.com/display/CONFEXT/Confluence4r+Rails+Authentication"&gt;an implementation of user authentication&lt;/a&gt; using something called Confluence4r.  The code specifies what should happen when a privileged action is attempted without the proper credentials being present in the user's session.  It's reasonably clear that a request is being redirected.  However, an options hash is being used to specify the details of the redirection.&lt;br /&gt;&lt;br /&gt;I guess that options hashes are good in the sense that unnecessary information can be omitted.  However, I think options hashes are overused in Rails.  An options hash is basically a "magic bag of goodies" that a method will use to carry out some behavior.  However, the specification of the options hash at the call site does very little to inform the reader &lt;span style="font-weight: bold; font-style: italic;"&gt;how&lt;/span&gt; the contents of the hash will influence the behavior of the called method.  In the case above, it's reasonably clear that &lt;tt&gt;:action =&gt; :login&lt;/tt&gt; will redirect to the &lt;tt&gt;login&lt;/tt&gt; action.  However, what is going on the &lt;tt&gt;:destination&lt;/tt&gt; key?  As far as I can tell, it simply puts &lt;tt&gt;request.request_uri&lt;/tt&gt; in the query parameters of the redirected request, but I fail to see how that behavior is even hinted at in the text of the method call.  Wouldn't something like the following be much clearer?&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;next_request = Request.new()&lt;br /&gt;next_request,set_action( :login )&lt;br /&gt;next_request.add_param( :destination, request.request_uri() )&lt;br /&gt;redirect_to( next_request )&lt;br /&gt;return false&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Sure, we replaced 1 line of code with 5, but the reader would have a much better chance of figuring out what is going on.&lt;br /&gt;&lt;br /&gt;Sacrificing a bit of brevity in order to get self-documenting code seems like a good tradeoff to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-1021582249108173605?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/1021582249108173605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=1021582249108173605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1021582249108173605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1021582249108173605'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/02/vague-syntax-of-ruby-and-ruby-on-rails.html' title='The Vague Syntax of Ruby and Ruby on Rails'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-6276006318292760353</id><published>2008-01-09T08:37:00.000-08:00</published><updated>2008-01-09T08:55:13.199-08:00</updated><title type='text'>Back to work!</title><content type='html'>I'm getting back to work after a very enjoyable holiday break.  I was able to play a significant amount of &lt;a href="http://www.supermariogalaxy.com/"&gt;Super Mario Galaxy&lt;/a&gt; while I was on vacation; it's a very good game, and (IMO) better than Super Mario Sunshine, but still not as good as Super Mario 64.&lt;br /&gt;&lt;br /&gt;I'm teaching a &lt;a href="http://faculty.ycp.edu/%7Edhovemey/spring2008/cs496/"&gt;Compilers course&lt;/a&gt; in the Spring, so I'm beginning to get things ready.  Today I played around with &lt;a href="http://jflex.de/"&gt;JFlex&lt;/a&gt; and &lt;a href="http://www2.cs.tum.edu/projects/cup/"&gt;CUP&lt;/a&gt;, which are Java equivalents to the ubuquitous lex and yacc.  As much as I enjoy the occasional bout of C hacking, Java is a much better teaching language.  I put together &lt;a href="http://faculty.ycp.edu/%7Edhovemey/spring2008/cs496/lecture/compilerExample.zip"&gt;a simple JFlex/CUP example&lt;/a&gt; that demonstrates integrating a JFlex lexer and a CUP parser.  JFlex and CUP are designed to work together, so it wasn't a huge task.&lt;br /&gt;&lt;br /&gt;Next task is to investigate using &lt;a href="http://jasmin.sourceforge.net/"&gt;Jasmin&lt;/a&gt; to compile generated JVM bytecode.&lt;br /&gt;&lt;br /&gt;My colleague &lt;a href="http://faculty.ycp.edu/%7Edbabcock/"&gt;Dave Babcock&lt;/a&gt; and I are working on a paper to submit to &lt;a href="http://www.iticse08.fi.upm.es/"&gt;ITiCSE 2008&lt;/a&gt;.  It will describe a nifty sequence of CS1 programming labs and assignments.  Getting stuff published in CSEd conferences is always a crap shoot, so we'll see what happens.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.xpn.org/"&gt;WXPN&lt;/a&gt; radio started broadcasting in the York/Lancaster area in the Fall, and I've been enjoying it a great deal.  One important musical discovery I made via XPN is &lt;a href="http://www.nekocase.com/"&gt;Neko Case&lt;/a&gt;: her most recent album, &lt;span style="font-style: italic;"&gt;Fox Confessor Brings The Flood&lt;/span&gt;, is one of the most brilliant things I've heard in a long time.&lt;br /&gt;&lt;br /&gt;A &lt;span style="font-weight: bold; font-style: italic;"&gt;major event&lt;/span&gt; is going take place in February...more later!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-6276006318292760353?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/6276006318292760353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=6276006318292760353' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6276006318292760353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6276006318292760353'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2008/01/back-to-work.html' title='Back to work!'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-4501203298071424004</id><published>2007-12-13T11:42:00.000-08:00</published><updated>2007-12-13T12:04:32.040-08:00</updated><title type='text'>New Music</title><content type='html'>I've recently started listening to &lt;a href="http://www.pandora.com"&gt;Pandora&lt;/a&gt;.  It's a web radio station that allows you to enter bands that you like, and then plays music by "similar" artists.  I was a bit dubious at first, but it actually works quite well.  (It does tend to play the same songs again and again, but there's enough new stuff mixed in to keep it interesting.)&lt;br /&gt;&lt;br /&gt;My most interesting discoveries have been the result of hearing bands similar to the &lt;a href="http://www.mekons.de/mekonhom.htm"&gt;Mekons&lt;/a&gt;, although it's kind of a stretch to say that anyone sounds like them.  So far, the major discoveries have been:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.revisionsoftware.com/999/"&gt;&lt;span style="font-weight: bold;"&gt;999&lt;/span&gt;&lt;/a&gt;: British punk band.  Kinda similar to the Clash (definite rockabilly influences).  My favorite song of their's so far is &lt;span style="font-style: italic;"&gt;Emergency&lt;/span&gt;.  Intriguingly, they are still active.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.arfarfrecords.com/arfarf/records/aa39.html"&gt;&lt;span style="font-weight: bold;"&gt;Moving Parts&lt;/span&gt;&lt;/a&gt;: they were a precursor to &lt;a href="http://www.missionofburma.com/"&gt;Mission of Burma&lt;/a&gt;, and included Roger Miller and Clint Conley as members.  A couple songs off their one album (Wrong Conclusion) that I think are particularly good are &lt;span style="font-style: italic;"&gt;Garden of Heat&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Line of Fire&lt;/span&gt; (both Roger Miller compositions).  The album also has a version of the famous MoB song &lt;span style="font-style: italic;"&gt;Max Ernst&lt;/span&gt;.  One thing that stikes me listing to this album is that Roger Miller is an amazing guitar player.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.myspace.com/humantelevision"&gt;&lt;span style="font-weight: bold;"&gt;Human Television&lt;/span&gt;&lt;/a&gt;: I don't know how they came up in reference to the Mekons; they play 2 and a half minute pop songs that owe a lot to The Smiths, R.E.M., and the Cure.  Their song &lt;span style="font-style: italic;"&gt;Saw You Walking By&lt;/span&gt; could practically be a lost single from the La's or even the Byrds.&lt;/li&gt;&lt;/ul&gt;OK, back to work...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-4501203298071424004?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/4501203298071424004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=4501203298071424004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4501203298071424004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/4501203298071424004'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2007/12/new-music.html' title='New Music'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-8232040747135059490</id><published>2007-09-06T05:50:00.001-07:00</published><updated>2007-09-06T06:04:47.872-07:00</updated><title type='text'>Cool Stuff Alert</title><content type='html'>The Fall semester just started, and I've discovered some very cool software that's making my life easier and better.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.umd.edu/%7Ehardisty/research/index.html"&gt;RegeXeX&lt;/a&gt; is an electronic tutor for regular expression problem sets.  The really cool part is that (thanks to the decidability of regular languages) RegeXeX will tell the student if they have a correct regular expression, and if they don't, gives examples of strings it generates that it shouldn't and strings it doesn't generate that it should.  It's described in a &lt;a href="http://doi.acm.org/10.1145/1227504.1227462"&gt;SIGCSE paper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jflap.org/"&gt;JFLAP&lt;/a&gt; is a toolkit for constructing, simulating, and generally working with finite automata.  I've used it to demonstrate NFAs and DFAs.  You edit the FA using a GUI editor, and there are various ways to execute it on input strings.  It can also do cool things such as highlight nondeterministic states.  JFLAP appears to have support for other formal languages/theory of computation constructions, including grammars, pushdown automata, and Turing machines, although I haven't investigated these yet.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kompozer.net/"&gt;KompoZer&lt;/a&gt; is a WYSIWYG HTML editor based on Mozilla (now Seamonkey) Composer.  I've been using Mozilla Composer for quite a while, and although it serves its purpose, it has many annoying quirks, such as generating millions of spurious &amp;lt;br&amp;gt; tags all over the place.  I've only be using KompoZer a short while, but it appears to be much better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-8232040747135059490?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/8232040747135059490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=8232040747135059490' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8232040747135059490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/8232040747135059490'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2007/09/cool-stuff-alert.html' title='Cool Stuff Alert'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7201851374255644798</id><published>2007-08-16T13:12:00.001-07:00</published><updated>2007-08-16T13:23:40.572-07:00</updated><title type='text'>Installing a Visual Studio 2005 Add-in for all users</title><content type='html'>For posterity, here is a nugget of information that required quite a bit of digging to uncover.&lt;br /&gt;&lt;br /&gt;If you want to install a Visual Studio 2005 Add-in for all users, drop the .AddIn and .DLL files (along with any subdirectory containing satellite DLL(s)) in the following directory:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;C:\Documents and Settings\All Users\Application Data\Microsoft\MSEnvShared\AddIns&lt;/code&gt;&lt;/blockquote&gt;If &lt;code&gt;%ALLUSERSPROFILE%&lt;/code&gt; is not &lt;code&gt;C:\Documents and Settings\All Users&lt;/code&gt; on your machine, adjust accordingly.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/19dax6cz%28vs.80%29.aspx"&gt;Microsoft's documentation on installing a Visual Studio 2005 add-in&lt;/a&gt; is fairly confusing, although I do see now that they mention this directory in a comment below the main article.&lt;br /&gt;&lt;br /&gt;This issue came up as part of deploying a Visual Studio Add-in for &lt;a href="http://marmoset.sourceforge.net/"&gt;Marmoset&lt;/a&gt; which a YCP student and I wrote this summer.  Marmoset is a nifty project submission and testing server for programming courses.  I expect the Add-in will be a part of the forthcoming open source release of Marmoset, which should happen sometime this Fall.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7201851374255644798?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7201851374255644798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7201851374255644798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7201851374255644798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7201851374255644798'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2007/08/installing-visual-studio-2005-add-in.html' title='Installing a Visual Studio 2005 Add-in for all users'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7284329070388574532</id><published>2007-07-30T10:16:00.000-07:00</published><updated>2007-07-30T10:48:41.230-07:00</updated><title type='text'>Ubuntu Studio</title><content type='html'>One of my projects for this summer is to get my guitar (1995 Fender Standard Telecaster) and amplifier (1976 Fender Vibrolux Reverb) fixed and to do some home recording.  I did a few recordings about 6 years ago on a Tascam 4 track tape recorder (you can find them on &lt;a href="http://www.cs.umd.edu/%7Edaveho/fun/stuff.html"&gt;my UMD web page&lt;/a&gt; if you're interested, but bear in mind that I suck).  However, audio production on Linux has progressed significantly in recent years---e.g., &lt;a href="http://ardour.org/"&gt;Ardour&lt;/a&gt;---so I figured I'd give it a whirl.&lt;br /&gt;&lt;br /&gt;I despise compiling and configuring software by hand, so I was thrilled to discover the existence of &lt;a href="http://ubuntustudio.org/"&gt;Ubuntu Studio&lt;/a&gt;.  The current release, 7.04, is essentially Feisty Fawn with a low-latency kernel and prebuilt binaries for all of the major audio/video/graphics applications, plus some cool new desktop themes.  Through the magic of apt-get, it was a matter of three shell commands to upgrade my home machine to Ubuntu Studio.  (Plus 400 MB of downloads through my DSL connection, of course.)  The only hitch was breaking X because I didn't get the restricted binary kernel modules for the new kernel (nvidia drivers, alas).  Once that was fixed I was in business.  People talk about whether or not Linux is ready for the desktop.  I think Ubuntu has not only answered this question with a resounding yes, but proven that it is a &lt;em&gt;better&lt;/em&gt; desktop system than Windows many times over.&lt;br /&gt;&lt;br /&gt;I haven't tried out Ardour yet, since I'm still waiting for my guitar and amp to come back from the shop, and also for the soundcard (&lt;a href="http://www.m-audio.com/products/en_us/Delta1010LT-main.html"&gt;M-Audio Delta 1010LT&lt;/a&gt;) I won on ebay to arrive.  Thanks to Ubuntu and Ubuntu Studio, I'll be ready when they all arrive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7284329070388574532?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7284329070388574532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7284329070388574532' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7284329070388574532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7284329070388574532'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2007/07/ubuntu-studio.html' title='Ubuntu Studio'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-1305118696910997932</id><published>2007-07-05T14:32:00.000-07:00</published><updated>2007-07-05T14:40:52.376-07:00</updated><title type='text'>Visual Studio 2005 works in VMWare Player</title><content type='html'>Since I had no luck getting WinXP/Visual Studio working in &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;, I decided to try &lt;a href="http://www.vmware.com/products/player/"&gt;VMWare Player&lt;/a&gt;.  Long story short, it works!  I followed the instructions an a &lt;a href="http://ubuntuforums.org/showthread.php?t=342631"&gt;VMWare Player HOWTO&lt;/a&gt; at ubuntuforums, and a couple hours later I have a full WinXP VM in which Visual Studio is (apparently) running quite happily.  Got &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt; installed as well.  Whee!  Networking works just dandy through the NAT'ed virtual ethernet device.&lt;br /&gt;&lt;br /&gt;My initial impressions is that VMWare Player gets extremely bogged down by disk I/O.  Double clicking a program icon can send it off into space for minutes.  It kinda seems to be a one-time hit, though.  Maybe I just need more RAM.&lt;br /&gt;&lt;br /&gt;Other than the disk I/O problem, responsiveness seems acceptable.&lt;br /&gt;&lt;br /&gt;Now I can engage in some Windows development without leaving the cozy womb of Linuxdom.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-1305118696910997932?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/1305118696910997932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=1305118696910997932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1305118696910997932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/1305118696910997932'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2007/07/visual-studio-2005-works-in-vmware.html' title='Visual Studio 2005 works in VMWare Player'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-2131687890226314394</id><published>2007-07-05T10:13:00.000-07:00</published><updated>2007-07-05T10:19:25.437-07:00</updated><title type='text'>Can't run Visual Studio 2005 within VirtualBox?</title><content type='html'>I tried today to get &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; set up on my Linux (Ubuntu 7.04) box at work.  WinXP installed without a hitch, but it refuses to install Visual Studio 2005, which is the only reason I wanted to run WinXP in the first place!&lt;br /&gt;&lt;br /&gt;Here's a screenshot of the error&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0thAcZenYGk/Ro0nP4OsB-I/AAAAAAAAAAk/10Ga7mPcqlw/s1600-h/VritualBoxVisualStudioBug.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_0thAcZenYGk/Ro0nP4OsB-I/AAAAAAAAAAk/10Ga7mPcqlw/s320/VritualBoxVisualStudioBug.png" alt="" id="BLOGGER_PHOTO_ID_5083762708116670434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Aiiighhh!&lt;br /&gt;&lt;br /&gt;A google search on the text of the error message returned no hits.  The Properties menu says I have 14.6 GB of space left on my (virtual) hard drive, and Linux has plenty of real disk space left, so I don't think that's the problem.&lt;br /&gt;&lt;br /&gt;VirtualBox seems like an excellent product, and responsiveness within the guest OS seems quite snappy, so my current state of affairs is disappointing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-2131687890226314394?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/2131687890226314394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=2131687890226314394' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2131687890226314394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/2131687890226314394'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2007/07/cant-run-visual-studio-2005-within.html' title='Can&apos;t run Visual Studio 2005 within VirtualBox?'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_0thAcZenYGk/Ro0nP4OsB-I/AAAAAAAAAAk/10Ga7mPcqlw/s72-c/VritualBoxVisualStudioBug.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-6386171886819509496</id><published>2007-06-18T18:12:00.000-07:00</published><updated>2007-06-18T18:34:16.117-07:00</updated><title type='text'>Eclipse CDT</title><content type='html'>I've been hearing good things about &lt;a href="http://www.eclipse.org/cdt/"&gt;Eclipse CDT&lt;/a&gt; (the C/C++ development tools for Eclipse), and I finally sat down and tried it out today.  [Back in the day I was a vi/make/bash die hard, but I was won over by the huge (&lt;span style="font-style: italic;"&gt;huge&lt;/span&gt;!) productivity gains I experienced using the Eclipse JDT (Java development tools) when doing Java, and now I really want something similar for C.]&lt;br /&gt;&lt;br /&gt;So far, I'm very impressed.  I was able to get the source code to a new version of &lt;a href="http://geekos.sourceforge.net/"&gt;GeekOS&lt;/a&gt; I'm working in imported and (almost) compiling, without &lt;span style="font-style: italic;"&gt;writing a makefile&lt;/span&gt;.  Based on the project settings, CDT generates makefiles automatically.  The settings seem pretty flexible---for example, I was able to redefine the command for assembly files with very little effort.  (I use gcc to convert assembly files into object files so that they can include C header files.)&lt;br /&gt;&lt;br /&gt;Code completion seems relatively functional; not always totally up to date, but in general pretty good.  I was actually able to do an automatic renaming of a variable, which is something I now take for granted in JDT and pains me greatly to have to do by hand using grep and vi.  Of course, GeekOS is straight C code, so the underlying problem of extracting symbol information from the source code is not as complicated as for C++, but I don't care about C++.&lt;br /&gt;&lt;br /&gt;I still have to customize the linking command and add a post-build step to get the kernel into some bootable form, but that should (in theory) be pretty easy.  Eventually I would like to be able to support other hardware targets out of the same source base, which would require a mechanism in the build system to select a subset of source directories based on the current configuration (target).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-6386171886819509496?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/6386171886819509496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=6386171886819509496' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6386171886819509496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/6386171886819509496'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2007/06/eclipse-cdt.html' title='Eclipse CDT'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-5052681462459375239</id><published>2007-05-26T04:23:00.000-07:00</published><updated>2007-05-26T04:42:13.929-07:00</updated><title type='text'>Summer!</title><content type='html'>Summer's here!  (Or, at least, the academic year is over and the high temperature yesterday was close to 90 degrees F.)&lt;br /&gt;&lt;br /&gt;My earlier post about a frustrating experience installing &lt;a href="http://subclipse.tigris.org/"&gt;Subclipse&lt;/a&gt; was somewhat inaccurate.  As it turns out, when you install subclipse via the update site, you can uncheck the box that installs the &lt;a href="http://www.eclipse.org/mylar/"&gt;Mylar&lt;/a&gt; integration.  The base subclipse feature works just dandy with Eclipse 3.2.2.&lt;br /&gt;&lt;br /&gt;I installed Ubuntu 7.04.  I normally don't upgrade on a whim, but after seeing &lt;a href="http://ubuntuforums.org/showthread.php?p=1773584"&gt;an Ubuntu forums post about a GUI configuration for nvidia twinview&lt;/a&gt; I just had to.  I despise editing xorg.conf, but I love working with dual monitors.  Anyway, I now have both my 19" Acer and 15" Dell LCD panels connected and running quite well.  The basics are&lt;br /&gt;&lt;ol&gt;&lt;li&gt;System-&gt;Administration-&gt;Restricted Devices Manager (enable closed-source nvidia driver)&lt;/li&gt;&lt;li&gt;sudo nvidia-settings (run the GUI config tool)&lt;/li&gt;&lt;li&gt;log out, control-alt-backspace to restart the X server (just to make sure things really work)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;All is not perfect.  New firefox windows do weird things if they are sized too large to display fully on the small monitor.  However, the annoyances are pretty minor.&lt;br /&gt;&lt;br /&gt;Now back to work.  I'm doing some refactoring of &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; in preparation for the upcoming tutorial at &lt;a href="http://ties.ucsd.edu/PLDI/"&gt;PLDI&lt;/a&gt;.  Assuming everything works out, it should become a lot easier to implement new analyses in a FindBugs plugin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-5052681462459375239?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/5052681462459375239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=5052681462459375239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5052681462459375239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5052681462459375239'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2007/05/summer.html' title='Summer!'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-7716723322178259250</id><published>2007-05-14T17:26:00.000-07:00</published><updated>2007-05-14T18:06:56.197-07:00</updated><title type='text'>Subclipse frustrations</title><content type='html'>I use &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; for Java development.  Great IDE, love it, etc.  But, it doesn't do &lt;a href="http://subversion.tigris.org/"&gt;subversion&lt;/a&gt; out of the box.  You need &lt;a href="http://subclipse.tigris.org/"&gt;&lt;span style="text-decoration: underline;"&gt;S&lt;/span&gt;&lt;/a&gt;&lt;a href="http://subclipse.tigris.org/"&gt;ubclipse&lt;/a&gt; for that, and it must be installed separately.&lt;br /&gt;&lt;br /&gt;OK, go to subclipse website.  Find update site.  Go through the whole &lt;span style="font-weight: bold;"&gt;Help-&gt;Software Updates-&gt;Find and Install...&lt;/span&gt; business in Eclipse.  It says that I can't install the latest version of Subclipse because I don't have "Mylar" installed.  Let's think about this for a moment:&lt;br /&gt;&lt;blockquote&gt;Isn't the whole point of f***ing update sites to &lt;span style="font-weight: bold;"&gt;automate&lt;/span&gt; the process of software installation?&lt;/blockquote&gt;So, now I need "Mylar".  Google takes me to the &lt;a href="http://www.eclipse.org/mylar/"&gt;Mylar website&lt;/a&gt;.  My heart sinks:  there's no convenient link labeled "Install Mylar".  I can't even really tell what the hell Mylar &lt;span style="font-weight: bold;"&gt;is&lt;/span&gt;.  I'm sure it's nice and all, but I just want Subclipse to work!&lt;br /&gt;&lt;br /&gt;Eventually I decide to click the "Mylar 2.0M2" link in the "Releases" box.  It's the &lt;span style="font-style: italic;"&gt;only release listed&lt;/span&gt;, so I guess it's the one I should use, right?  I see an update site, so I go back into Eclipse and let it party on both the Subclipse and Mylar update sites.  Now I'm allowed to install both features.  After a few minutes of downloading, installing, and restarting Eclipse, everything is ready.&lt;br /&gt;&lt;br /&gt;Long story short, this version of Mylar doesn't work correctly, at least with my Eclipse (3.2.1) under Linux.  Errors out the wazzoo.  Fortunately, I'm able to disable Mylar and the Subclipse Mylar Integration (thank you, Eclipse, for providing &lt;span style="font-weight: bold;"&gt;Help-&gt;Software Updates-&gt;Manage Configuration&lt;/span&gt;), leaving just good old Subclipse, which now seems to work.&lt;br /&gt;&lt;br /&gt;Hey, Subclipse developers:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I expect your update site to correctly install all of the software I need to run subclipse&lt;/li&gt;&lt;li&gt;I don't want to be forced to install broken experimental software in order to use basic version control&lt;/li&gt;&lt;li&gt;The Mylar integration should be optional&lt;/li&gt;&lt;/ol&gt;Hey, Eclipse developers:&lt;br /&gt;&lt;blockquote&gt;Please, please, integrate subclipse into the mainline so I never have to go through this again.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-7716723322178259250?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/7716723322178259250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=7716723322178259250' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7716723322178259250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/7716723322178259250'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2007/05/subclipse-frustrations.html' title='Subclipse frustrations'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-223882500590899233.post-5124241641305448924</id><published>2007-05-06T06:25:00.000-07:00</published><updated>2007-05-06T06:31:06.710-07:00</updated><title type='text'>New Crowded House album!</title><content type='html'>&lt;a href="http://www.crowdedhouseofficial.com/"&gt;Crowded House&lt;/a&gt; is back and will have a new album out in July.  According to the website, my musical hero &lt;a href="http://jmarr.com/"&gt;Johnny Marr&lt;/a&gt; plays on two tracks.  Crowded House is just about the only band I can think of that got consistently better over time; if the trend continues the new album should be terrific.  Hopefully they'll play in Philly or Baltimore so I can see them live.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/223882500590899233-5124241641305448924?l=fullofleaves.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fullofleaves.blogspot.com/feeds/5124241641305448924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=223882500590899233&amp;postID=5124241641305448924' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5124241641305448924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/223882500590899233/posts/default/5124241641305448924'/><link rel='alternate' type='text/html' href='http://fullofleaves.blogspot.com/2007/05/new-crowded-house-album.html' title='New Crowded House album!'/><author><name>David Hovemeyer</name><uri>http://www.blogger.com/profile/01220018216001152600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://bp2.blogger.com/_0thAcZenYGk/R9gFHxjJbII/AAAAAAAAAA4/5gv0JKPwPLM/S220/smallPhoto2.jpg'/></author><thr:total>0</thr:total></entry></feed>
