<?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-3669809752172683097</id><updated>2012-01-16T10:10:49.866-08:00</updated><category term='linux'/><category term='emacs'/><category term='verification'/><category term='olpc'/><category term='revision control'/><category term='mandriva'/><category term='howto'/><category term='lart'/><category term='music'/><category term='games'/><category term='eda'/><category term='django'/><category term='gnome'/><category term='firefox'/><category term='meta'/><category term='linkage'/><category term='hiking'/><category term='dns'/><category term='python'/><category term='family'/><category term='mac'/><category term='portland'/><category term='samba'/><category term='philosopy'/><category term='firmware'/><category term='windows'/><category term='ubuntu'/><category term='maps'/><category term='mercurial'/><category term='hardware'/><category term='backup'/><title type='text'>Cyclopedia Square</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default?start-index=101&amp;max-results=100'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>158</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-5610089624746416208</id><published>2012-01-16T08:49:00.001-08:00</published><updated>2012-01-16T10:10:49.887-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='revision control'/><title type='text'>What Is So Wrong With Mercurial's Named Branches?</title><content type='html'>&lt;p&gt;I just installed the very latest version of mercurial, &lt;a href="http://mercurial.selenic.com/wiki/WhatsNew#Mercurial_2.0.2_.282012-01-01.29"&gt;2.0.2&lt;/a&gt;.  It added a new little feature that warns you when you create a branch.  Huh?  This is what it looks like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ hg branch foo
marked working directory as branch foo
(branches are permanent and global, did you want a bookmark?)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Really?  Have we let the git advocates push us this far?  Do we really need to start discouraging named branches?&lt;/p&gt;

&lt;p&gt;I googled around to see if I could find where the self-hate for mercurial's named branches is coming from and I found things like &lt;a href="http://mercurial.selenic.com/wiki/BranchingExplained"&gt;this&lt;/a&gt;, "it is almost never a good idea to use this facility for short-term branching, since branches created this way are inherently 'eternal'."  (those quotes around eternal are good, actually, but you didn't explain why they should be there), and &lt;a href="http://ghostinthecode.posterous.com/choosing-how-to-branch-in-mercurial"&gt;this&lt;/a&gt;, "you can never really delete branches (since that would mean altering older commits)."  (editing history, oh noes!), and others like this.  And these were all written by apparent mercurial supporters!  I understand when a git developer writes misinformation about mercurial and uses it to try and make git look better (that's only human), but we mercurial users should know not to listen to it!&lt;/p&gt;

&lt;p&gt;Here's what I think is going wrong.  Git users love flexibility.  The love it so much that they even include modifying their local repository history right into their standard workflow.  git rebase is a core command.  From what I can gather, even though mercurial now (as of years ago, actually) has powerful rebase and patch queue extensions, mercurial users still get the heebie-jeebies when they think about modifying repository history.  This is where the git envy comes from.  You see, git useres can alter their branch names, or even delete branch names without using scary rebase.  Fact is, though, git could adopt mercurial-style named branches and git users would rebase them away or rename them with rebase willy-nilly just like they do with everything else that they deem needs editing in their history.  The fact that git users can rename or delete their branches without using rebase is almost completely incidental.  If you allow the use of rebase or patch queues, mercurial named branches are &lt;em&gt;not&lt;/em&gt; any more permanent than any other changeset in the repository history.  Mercurial bookmarks allow mercurial users flexibility around branch names without needing to resort to scary history editing extensions, and that makes us happy, but I don't think that we should talk down mercurial named branches.  There are times when you want the branch name associated with a commit to be just as "permanent" as the commit is.  Let us do that without dumb warnings that make named branches sound like a bad idea.&lt;/p&gt;

&lt;p&gt;The only other argument people may have against mercurial's named branches is the possibility of name collisions.  As if that's something that's really hard to deal with.  Anyone who has written a fair amount of C code (I'm looking at you, git developers) knows how to prefix a name to get poor-man's namespaces.  Alternatively, many projects require an issue tracker number in a feature-branch or bugfix-branch name.  Name collision problem solved.&lt;/p&gt;

&lt;p&gt;In conclusion, mercurial named branches are fine.  Use them more.  Use rebase and/or patch queues[1] to rename or delete the branches when necessary.  If that really bothers you, you have bookmarks now, but don't go all git-apologetic on named branches.  Mercurial is every bit as awesome as git.&lt;/p&gt;

&lt;p&gt;1.  Before you push to a publicly accesible repository, of course.  Ask a git user why that's important.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-5610089624746416208?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/5610089624746416208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=5610089624746416208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5610089624746416208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5610089624746416208'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2012/01/what-is-so-wrong-with-mercurials-named.html' title='What Is So Wrong With Mercurial&apos;s Named Branches?'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8961132772561617293</id><published>2011-12-13T10:12:00.000-08:00</published><updated>2011-12-13T10:20:46.035-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Make Terminal.app Useful for Emacs</title><content type='html'>&lt;p&gt;Running emacs -nw in Terminal.app on my Mac has been pretty frustrating, until today.  To fix the experience, download and install &lt;a href="http://pqrs.org/macosx/keyremap4macbook/"&gt;KeyRemap4MacBook&lt;/a&gt; (I sure hope it's not malware).  Click on "Change Key."  Scroll down until you find "For Applications."  Expand that to "Enable at only Terminal" and select "Change Command_L to Option_l."  Expand "Change Slash(/) Key" and select "Control+Slash(/) to Control+Underscore(_)."  You might also want to select "Switch next and prev tab in terminal with shift and arrows (like Gnome term)."&lt;/p&gt;

&lt;p&gt;All better.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8961132772561617293?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8961132772561617293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8961132772561617293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8961132772561617293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8961132772561617293'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2011/12/make-terminalapp-useful-for-emacs.html' title='Make Terminal.app Useful for Emacs'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6935304314577911025</id><published>2011-06-14T09:44:00.000-07:00</published><updated>2011-08-16T08:43:19.161-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosopy'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>The Dark Cockpit Theory</title><content type='html'>&lt;p&gt;A co-worker who is annoyed with the verbosity of our verilog simulations just asked me if I subscribed to the Dark Cockpit Theory.  I immediately replied, "no."  I've had this argument a number of times with other engineers and I have already decided that more information is better than less.  I had to google "dark cockpit theory" later because I'd never heard of it referred to that.  For me it has always been &lt;a href="http://www.faqs.org/docs/artu/ch01s06.html"&gt;the UNIX "Rule of Silence"&lt;/a&gt;.  Same idea, I think.&lt;/p&gt;

&lt;p&gt;Just to be clear, I do like the Rule of Silence when it's software that I trust isn't going to do weird things or silently hang.  There isn't a lot of code that I trust that much, though, and if it's software I don't trust, I want to know what it's doing, or at least that it's doing &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;As I thought about this more, it's the same with people.  When a person you trust is doing something for you, they can go do it without giving you any intermediate status reports.  That's easier and more efficient for both of you.  When someone you don't trust is working for you, you want to hear from them often, so you know they are staying on task and doing things right.  Right?&lt;/p&gt;

&lt;p&gt;The big argument about overly noisy simulations or software is that you can't find the important messages in all the noise.  I just don't understand this argument when it's coming from fellow software engineers.  Especially UNIX/Linux users.  We read obtuse source code all day long, and we confidently use tools like grep or the search features of vim or emacs to help us.  These same tools can search through program output.  UNIX shells have built-in ways to redirect program output to files if you don't want to watch it all scroll by.  If you really don't like it send it to /dev/null!  Use the tools of the trade.  Usually what people are complaining about is that the message &lt;em&gt;they&lt;/em&gt; want to see isn't the &lt;em&gt;only&lt;/em&gt; one being printed.  Tough!  You are a UNIX user, pipe the output through grep.  Take 20 minutes and write a script to filter the output if you need.  You write code for a living, you know how to do these things.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6935304314577911025?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6935304314577911025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6935304314577911025' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6935304314577911025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6935304314577911025'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2011/06/dark-cockpit-theory.html' title='The Dark Cockpit Theory'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-3171281171822754860</id><published>2011-04-29T12:19:00.001-07:00</published><updated>2011-05-07T08:22:47.643-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revision control'/><title type='text'>Incremental Merge with Mercurial</title><content type='html'>&lt;p&gt;I just learned how to merge incrementally with Mercurial.  I wasn't really even aware of what that means until I learned about it.  Most people use a graphical diff/merge tool with Mercurial such as &lt;a href="http://kdiff3.sourceforge.net/"&gt;kdiff3&lt;/a&gt;, and for a good reason.  Resolving merge conflicts any other way is much more difficult.  Normally when you run &lt;code&gt;hg merge&lt;/code&gt; it merges all the files right then, and pops up your graphical merge tool right when conflicts occur.  You can leave the gui window up and sort of ignore it for a while, but then you wonder what happens if your computer loses power or you need to reboot for some reason.  Will your working copy be left in some weird state?  What if you have already spent a lot of time resolving tricky conflicts on a previous file, you'd hate to lose that work.  Or what if you know one particular file is going to be onerous and you'd like to resolve conflicts there first?  Wouldn't it be nice if Mercurial could just present you a list of files with conflicts and let you deal with them on your own time and in the order that you choose?  It turns out, Mercurial can do just that.  Here's how:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hg merge --tool internal:merge
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The first command tells mercurial to use its (not so smart) non-interactive merge tool.  If it comes across a conflict it inserts markers into your files.  As an alternative you can specify the &lt;code&gt;internal:dump&lt;/code&gt; merge tool.  Instead of putting markers into your files, it creates three new files with a &lt;code&gt;.other&lt;/code&gt;, &lt;code&gt;.local&lt;/code&gt;, and &lt;code&gt;.base&lt;/code&gt; extension, which are a little easier to use if you want to do some manual inspection of the various versions.  The cool thing, in either case, is you don't &lt;em&gt;have&lt;/em&gt; to do anything manual.  First things first though.  You can now see which files have merge conflicts by typing:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hg resolve --list
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Those with a &lt;code&gt;U&lt;/code&gt; in front of them have unresolved conflicts and need some attention.  Those with &lt;code&gt;R&lt;/code&gt; in front are just fine.  Here's the best part.  To resolve the conflicts for a given file using your favorite diff/merge tool, and I'll use kdiff3 as an example, type this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hg resolve --tool kdiff3 filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The file is merged with kdiff3 (or your tool of choice) just like it would have been with a regular &lt;code&gt;hg merge&lt;/code&gt; command.  In the case of kdiff3, it's smarter than the internal Mercurial merge tool and it may resolve the conflicts without popping up a window and asking for your help.  Be happy when that happens.&lt;/p&gt;

&lt;p&gt;You can also just manually edit the files to resolve the conflicts.  If you do that, type:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hg resolve -m filename
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;to let Mercurial know you've taken care of it.  Once you see all &lt;code&gt;R&lt;/code&gt; files when you type &lt;code&gt;hg resolve --list&lt;/code&gt; you're all done.  You can run your tests and then commit the merge.&lt;/p&gt;

&lt;p&gt;This isn't very useful for simple merges, but for big complicated merges (where, maybe, you have waited too long and two branches have diverged &lt;em&gt;a lot&lt;/em&gt;), this is a really nice technique.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-3171281171822754860?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/3171281171822754860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=3171281171822754860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3171281171822754860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3171281171822754860'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2011/04/incremental-merge-with-mercurial.html' title='Incremental Merge with Mercurial'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1391448149428348217</id><published>2010-12-14T19:02:00.000-08:00</published><updated>2010-12-14T19:02:00.356-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='verification'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='eda'/><title type='text'>A UNIX/Linux Environment Manager</title><content type='html'>&lt;p&gt;I have written A UNIX/Linux environment manager that allows on-the-fly configuration of your shell environment.  It's called, &lt;a href="http://bitbucket.org/krupan/albion/"&gt;albion&lt;/a&gt;.  Using albion, environment variables, aliases, functions, and so forth can be changed without requiring you to do the tedious log-out-and-log-back-in-again routine. Simply type 'albion load &lt;environment-name&gt;' and your shell environment will be reconfigured according to the specification in your environment file. It should work with any POSIXy shell (bash, ksh, zsh, etc.)&lt;/p&gt;

&lt;p&gt;Albion is similar to the &lt;a href="http://modules.sourceforge.net/"&gt;Environment Modules Project&lt;/a&gt;, however, environment configuration files (configs) are written in standard shell language, not tcl. Another improvement over modules is that when unloaded, the effect of the configs is correctly undone, even if the configs have changed or been deleted after loading. The main albion tool is written in Python, with some supporting pieces written in POSIX shell code.&lt;/p&gt;

&lt;p&gt;albion is currently alpha quality. The core functionality seems to be working just fine, but has only been tested in a bash shell environment. There is very little documentation, and it could use an install script to make getting started easier.  The code is &lt;a href="http://bitbucket.org/krupan/albion/"&gt;available on bitbucket&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1391448149428348217?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1391448149428348217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1391448149428348217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1391448149428348217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1391448149428348217'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/12/unixlinux-environment-manager.html' title='A UNIX/Linux Environment Manager'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-179516258916309439</id><published>2010-10-21T08:32:00.000-07:00</published><updated>2010-10-21T08:46:55.710-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>How to Disable Ubuntu command-not-found</title><content type='html'>&lt;p&gt;Ubuntu, in all its helpfulness, has a feature that tries to guess what you mean when you type commands at the bash prompt.  If you type a command that's found, it runs it, of course.  If you type a command that it can't find, it takes a moment to search available packages for install and suggest what you might do to make that command available.  It sometimes looks like this:

&lt;pre&gt;&lt;code&gt;$ foo
No command 'foo' found, did you mean:
 Command 'xoo' from package 'xoo' (universe)
 Command 'fop' from package 'fop' (universe)
 Command 'fox' from package 'objcryst-fox' (universe)
 Command 'zoo' from package 'zoo' (universe)
 Command 'goo' from package 'goo' (universe)
foo: command not found
&lt;/code&gt;&lt;/pre&gt;

It's great when you have a new system and you haven't yet installed everything you need.  Type &lt;code&gt;emacs&lt;/code&gt; before emacs has been installed, and it will helpfully tell you the exact command to use to install it.  After a while, though, you have all the packages you need, and the only time you see this feature in action is when you mistype something.  When this happens to me, all the package suggestions and apt-get commands are just annoying.  This, for example, is not helpful:

&lt;pre&gt;&lt;code&gt;$ les foo.txt
The program 'les' is currently not installed.  You can install it by typing:
sudo apt-get install atm-tools
les: command not found
&lt;/code&gt;&lt;/pre&gt;

I'd much rather see this quick, short message so that I can get on with fixing my mistake by adding another 's':

&lt;pre&gt;&lt;code&gt;$ les foo.txt
-bash: les: command not found
&lt;/code&gt;&lt;/pre&gt;

I finally found &lt;a href="http://techthrob.com/2010/06/04/how-to-disable-command-not-found-in-ubuntu/comment-page-1/#comment-12448"&gt;how to fix it&lt;/a&gt;.  Put this line in your &lt;code&gt;.bashrc&lt;/code&gt;:

&lt;pre&gt;&lt;code&gt;unset command_not_found_handle&lt;/code&gt;&lt;/pre&gt;

Much better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-179516258916309439?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/179516258916309439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=179516258916309439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/179516258916309439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/179516258916309439'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/10/how-to-disable-ubuntu-command-not-found.html' title='How to Disable Ubuntu command-not-found'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6340277618022645653</id><published>2010-10-17T20:30:00.001-07:00</published><updated>2010-10-21T14:45:19.505-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revision control'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>My .emacs is now in Mercurial</title><content type='html'>&lt;title&gt;&lt;/title&gt;
&lt;p&gt;A while ago I decided to start maintaining my .emacs file under revision control.  I picked git because it seemed like the cool thing to do.  I put it &lt;a href="http://gitorious.org/bryan-s-dot-emacs"&gt;on gitorious&lt;/a&gt; so that I could easily sync it with my home and work machines, and it was public in the off chance that it might help out some other emacs user.  Today I &lt;a href="http://stackoverflow.com/questions/491554/how-do-i-convert-a-git-repository-to-mercurial"&gt;converted&lt;/a&gt; it from git to mercurial, because for some reason&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hg incoming&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;is more intuitive and easier for me to remember than&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git fetch &amp;&amp; git log ..origin/master&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Maybe I'm weird that way.  Anyway, the new repo is &lt;a href="http://bitbucket.org/krupan/bryans-dot-emacs/"&gt;on bitbucket&lt;/a&gt;.  That is all.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6340277618022645653?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6340277618022645653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6340277618022645653' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6340277618022645653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6340277618022645653'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/10/my-emacs-is-now-in-mercurial.html' title='My .emacs is now in Mercurial'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-611976618923845622</id><published>2010-10-08T14:08:00.001-07:00</published><updated>2010-10-08T14:15:37.540-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Email with Thunderbird, Compose with Emacs</title><content type='html'>&lt;p&gt;My Mac let's me use emacs keyboard shortcuts everywhere.  I'm really sad that I don't get that in Linux.  How the universe ever got into this state is beyond my comprehension.  Mail.App has gotten me hooked on emacs keybindings when typing emails especially.&lt;/p&gt;

&lt;p&gt;The solution in Linux, it turns out, is to just use emacs.  I already have &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/4125/"&gt;It's All Text&lt;/a&gt; for Firefox, with emacsclient as the editor.  I just found &lt;a href="http://globs.org/articles.php?lng=en&amp;pg=2"&gt;External Editor&lt;/a&gt; for Thunderbird, with emacsclient as the editor and &lt;a href="http://os.inf.tu-dresden.de/~mp26/emacs.shtml"&gt;tbemail-mode&lt;/a&gt; for extra goodness.  I think that'll do.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-611976618923845622?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/611976618923845622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=611976618923845622' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/611976618923845622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/611976618923845622'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/10/email-with-thunderbird-compose-with.html' title='Email with Thunderbird, Compose with Emacs'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-4533358563376976029</id><published>2010-09-30T08:14:00.000-07:00</published><updated>2010-09-30T14:54:07.170-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revision control'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Mercurial is Teh Awesome</title><content type='html'>&lt;p&gt;My team at work recently switched from Subversion to Mercurial for revision control.  That&amp;#8217;s no small feat for a hardware design team (see: &lt;a href="/2009/07/averse-to-change.html"&gt;Averse to Change&lt;/a&gt;).  It helps a little that we are mainly FPGA people (a lot &amp;#8220;softer&amp;#8221; than an ASIC), but there are still definitely hardware attitudes about change.  Our software partners made the change a while ago, so they already had some process and infrastructure set up that made it easier for us, plus they could point out from real experience that it was an easy transition with many benefits.  That helped a lot.&lt;/p&gt;

 &lt;p&gt;I took the lead on making the change for our team (is it true everywhere that on a digital design team, the verification engineers are the de-facto &amp;#8220;tool guys&amp;#8221; as well?).  I studied up on how exactly mercurial works.  I mean, I had the basic idea down since I&amp;#8217;ve been toying with the fancy new revision control tools for a &lt;a href="/2007/03/cutting-edge-revision-control.html"&gt;while now&lt;/a&gt;, but I didn&amp;#8217;t really reach enlightenment until a few months ago when I read Steve Losh&amp;#8217;s &lt;a href="http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/"&gt;A Guide to Branching in Mercurial&lt;/a&gt;.  I highly recommend it.  My team now makes heavy use of named branches in Mercurial.  Turns out we used branches a fair amount in Subversion and so the named branch workflow was a good fit for us.  The fact that everyone had felt the pain of merging svn branches helped to motivate the switch to mercurial as well.&lt;/p&gt;

 &lt;p&gt;I used the hg convert extension to copy all of our history and a few important branches from subversion to mercurial.  Besides the output of &lt;code&gt;hg help convert&lt;/code&gt;, my old friend Rock&amp;#8217;s &lt;a href="http://rock.hymasfamily.org/blog/2010/04/08/branches-subversion-conversion/"&gt;Branches – Subversion Conversion to Mercurial, Part 2&lt;/a&gt; helped me understand that process.  Creating splicemaps to get merge information from subversion to mercurial was an important concept.  I was confused on the syntax for a bit (convert could use some better error messages), but I figured it out eventually.  The branchmaps were cool too, because we did have a badly named branch in subversion that we were able to give a better name in the conversion process.&lt;/p&gt;

 &lt;p&gt;It&amp;#8217;s amazing what a good revision control tool does to you.  With old clumsy revision control my mode of operation was just stashing changes to files, mainly so that I could hopefully go back to something that was working if needed.  It was just a big undo button, in a way.  I started noticing our very smart Linux kernel hacker software guys talking about linear history and clean cohesive changesets.  Changesets where only one feature or bug was affected at at time.  Changesets that showed a clear step-by-step process to completing a feature or fix.  They scoffed at commits with messages like, &amp;#8220;checkpoint: it compiles now.&amp;#8221;  At first I thought, &amp;#8220;snobs,&amp;#8221; but then I realized that mercurial provides tools that actually make it pretty easy to mess with your changes before pushing them to a public repository.  And why not?  When you are working in your own private local repository, why shouldn't you make sure everything looks neat and polished before going public with it?  I started playing with the rebase and histedit mercurial extensions.  Most of the software guys here swear by mercurial patch queues, but that just sounded archaic and complicated to me.  I had some limited success with histedit, but recently I had another epiphany.  Patch queues are actually pretty amazing.  Again, Steve Losh helped with &lt;a href="http://stevelosh.com/blog/2010/08/a-git-users-guide-to-mercurial-queues/"&gt;A Git User’s Guide to Mercurial Queues&lt;/a&gt;, but also just trying them out and seeing how nicely integrated with mercurial they are really helped a lot.  I hadn&amp;#8217;t realized that they were actually pretty darn easy to use, and so very flexible.&lt;/p&gt;

&lt;p&gt;With Mercurial, revision control is no longer just a place to stash code, it&amp;#8217;s a code editing tool all of it&amp;#8217;s own.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-4533358563376976029?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/4533358563376976029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=4533358563376976029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4533358563376976029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4533358563376976029'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/09/mercurial-is-teh-awesome.html' title='Mercurial is Teh Awesome'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6913049142078089817</id><published>2010-08-19T08:54:00.000-07:00</published><updated>2010-08-19T09:29:59.082-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>ls colors on Ubuntu</title><content type='html'>&lt;p&gt;I &lt;code&gt;ls&lt;/code&gt;-ed some files today and noticed a few listed with blue backgrounds and white text.  I use the &lt;code&gt;--color&lt;/code&gt; option to &lt;code&gt;ls&lt;/code&gt; because it's pretty, and because the colors provide information that's not always blindingly obvious from regular &lt;code&gt;ls&lt;/code&gt; output.  Case in point, what did this blue background with white text mean?&lt;/p&gt;

&lt;p&gt;It turns out that, at least for Ubuntu 9.10 an 10.04 (the two I tried), you can see a list of the colors that &lt;code&gt;ls&lt;/code&gt; uses for various things by typing:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dircolors --print-database&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, I had a hunch that these files were hardlinks, and sure enough, I saw this line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;HARDLINK 44;37 # regular file with more than one link&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And looked up a few lines to see that, yes, 44 is blue and 37 is white.  Cool.  Just to be extra sure I passed the file names to the &lt;code&gt;stat&lt;/code&gt; command and saw the, &lt;code&gt;links: 2&lt;/code&gt; for those files.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6913049142078089817?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6913049142078089817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6913049142078089817' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6913049142078089817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6913049142078089817'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/08/ls-colors-on-ubuntu.html' title='ls colors on Ubuntu'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-9117760726827700209</id><published>2010-08-05T10:57:00.000-07:00</published><updated>2010-08-06T07:11:50.376-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>How not to mount a particular server with autofs</title><content type='html'>&lt;p&gt;There are a couple servers that I use the fancy new (to me at least) autofs scripts to mount on my Ubuntu 9.10 client machine.  You know, the ones that let you just &lt;code&gt;cd /net/servername/exportname&lt;/code&gt; and it automagically turns that into the command to mount that export from that server at that mountpoint (so cool).  To test something out though, I wanted to make sure one of the servers was not auto-mounted by autofs.  The simple way to tell autofs to ignore that server (let's call it, foobarbaz) is to edit &lt;code&gt;/etc/auto.net&lt;/code&gt; and put this snippet right after the &lt;code&gt;key="$1"&lt;/code&gt; line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# don't mount foobarbaz, for now:
           
if [ $key = "foobarbaz" ]; then
    exit
fi&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then restart autofs:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo /etc/init.d/autofs restart&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And autofs automagically mounts any nfs server except foobarbaz.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-9117760726827700209?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/9117760726827700209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=9117760726827700209' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/9117760726827700209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/9117760726827700209'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/08/how-not-to-mount-particular-server-with.html' title='How not to mount a particular server with autofs'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-3481536546300440630</id><published>2010-08-03T08:52:00.000-07:00</published><updated>2010-08-03T09:03:26.841-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Mac nfs client, Linux nfs server</title><content type='html'>&lt;p&gt;I have a Mac laptop at work and it's been interesting to play with.  We have nfs mounted home directories for our Linux workstations and I thought, hey, my Mac is a UNIX machine, it should be able to mount that nfs export too! Turns out, no, not by default. You get a nice "Operation not permitted" error message.  The problem is that Mac nfs clients insist on using high numbered TCP ports, and Linux nfs servers by default insist on rejecting clients that use high numbered TCP ports.&lt;/p&gt;

&lt;p&gt;You can tell the Linux server to stop rejecting clients using high numbered ports with the &lt;code&gt;insecure&lt;/code&gt; option in &lt;code&gt;/etc/exports&lt;/code&gt;, or you can tell your Mac client to stop using high ports with the &lt;code&gt;resvport&lt;/code&gt; option to your &lt;code&gt;mount&lt;/code&gt; command.  Most websites I found while googling for this just listed the Linux nfs server solution, which works fine if you have control over the server.  Most people have a lot more control over their client.&lt;/p&gt;

&lt;p&gt;For autofs on the Mac, put &lt;code&gt;,resvport&lt;/code&gt; at the end of the &lt;code&gt;/net&lt;/code&gt; line in &lt;code&gt;/etc/auto_master&lt;/code&gt;, and at the end of the &lt;code&gt;AUTOMOUNTD_MNTOPTS&lt;/code&gt; line in &lt;code&gt;/etc/autofs.conf&lt;/code&gt; and then restart autofs (I was getting tired of all this at this point and just rebooted my Mac, I'm sure there's a less drastic way to restart autofs).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-3481536546300440630?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/3481536546300440630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=3481536546300440630' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3481536546300440630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3481536546300440630'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/08/mac-nfs-client-linux-nfs-server.html' title='Mac nfs client, Linux nfs server'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8359556511962478809</id><published>2010-06-01T07:55:00.000-07:00</published><updated>2010-06-01T08:07:05.245-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Trying to like Chrome</title><content type='html'>&lt;p&gt;Now that the Google Chrome browser is official for &lt;a href="http://www.google.com/chrome?platform=linux"&gt;Linux&lt;/a&gt; and &lt;a href="http://www.google.com/chrome?platform=mac"&gt;Mac&lt;/a&gt;, I've been trying to use it and like it.  It's hard though.  I keep looking for the tabs below the address bar, but Chrome decided to put them up higher.  It's not a huge deal, but it's causes some friction.  The other problem I noticed right away is when you get a bunch of tabs open, the tabs get really small, and the x button to close a tab is almost a full 1/4 of the entire tab.  It's easy to click the x and close a tab when you don't mean to.  In firefox this happens too, and the remedy is to click History-&gt;Recently Closed Tabs and get your tab back.  No such option in Chrome.  There is a list of recently closed pages, but if you click one of then, it doesn't open a new tab, it just switches the tab that you are on to the page in the history.  Grr.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8359556511962478809?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8359556511962478809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8359556511962478809' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8359556511962478809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8359556511962478809'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/06/trying-to-like-chrome.html' title='Trying to like Chrome'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1497364615443765272</id><published>2010-05-20T21:50:00.000-07:00</published><updated>2010-05-20T20:50:46.738-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Don't Use Brasso On Your Blackberry</title><content type='html'>&lt;p&gt;My phone is an old blackberry curve that I found used on craigslist.  I&amp;#8217;m cheap.  It was in decent shape, but there was one scratch on the screen that kept bothering me.  The internet said I might be able to polish it out  with &lt;a href="http://www.google.com/search?&amp;#38;rls=en&amp;#38;q=brasso+blackberry&amp;#38;ie=UTF-8&amp;#38;oe=UTF-8"&gt;brasso metal polish&lt;/a&gt;.  It wasn&amp;#8217;t too expensive, so I ordered some and gave it a try.  After polishing until my hand was cramped, the one scratch had become lost amongst a million new scratches.  My eyes watered as I tried to focus on the screen through the damaged plastic.  Dismayed, but still hopeful, I rested a bit and then polished some more, thinking that sometimes things have to get worse before they get better.  Well, I&amp;#8217;m still wondering if better was just around the corner, because I finally gave up.&lt;/p&gt;

 &lt;p&gt;In disappointment I went back to the internet to try and find a better answer.  Namely, a new plastic screen.  It took me a while to figure it out, but the correct search term is &lt;a href="http://www.google.com/search?&amp;#38;rls=en&amp;#38;q=blackberry+curve+housing&amp;#38;ie=UTF-8&amp;#38;oe=UTF-8"&gt;blackberry curve housing&lt;/a&gt;.  Only $15, perfectly clear plastic, and no hand cramps.  Now I just need to figure out what to do with the rest of that brasso.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1497364615443765272?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1497364615443765272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1497364615443765272' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1497364615443765272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1497364615443765272'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/04/dont-use-brasso-on-your-blackberry.html' title='Don&apos;t Use Brasso On Your Blackberry'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-379471134154754847</id><published>2010-05-11T12:49:00.000-07:00</published><updated>2010-05-11T13:00:55.110-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Emacs Now Has Uptime</title><content type='html'>&lt;p&gt;I noticed a few places mentioning that &lt;a href="http://permalink.gmane.org/gmane.emacs.announce/17"&gt;emacs 23.2 has been released&lt;/a&gt;, and I went and read the &lt;a href="http://web.cvs.savannah.gnu.org/viewvc/emacs/NEWS.23.2?revision=1.1&amp;root=emacs&amp;view=markup"&gt;changelog&lt;/a&gt; and noticed a few cool new things.  Probably the best was down in the emacs 23.1 section.  Yes, emacs now has an uptime command, &lt;code&gt;M-x emacs-uptime&lt;/code&gt;.  That is awesome.  My current emacs uptime (on my work machine): 4 days, 21 hours, 52 minutes, 47 seconds.  What's yours?&lt;/p&gt;

&lt;p&gt;P.S. if you aren't using emacs-server and emacs-client yet, you probably don't stand a chance in this contest.&lt;/p&gt;

&lt;p&gt;P.P.S. Hmm, did &lt;a href="http://steve-yegge.blogspot.com/2007/01/pinocchio-problem.html"&gt;Steve Yegge&lt;/a&gt; have anything to do with this new feature?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-379471134154754847?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/379471134154754847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=379471134154754847' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/379471134154754847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/379471134154754847'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/05/emacs-now-has-uptime.html' title='Emacs Now Has Uptime'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-3368459117530915126</id><published>2010-05-06T07:57:00.000-07:00</published><updated>2010-05-06T08:03:00.761-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Real-life Laser Defense Against Malaria</title><content type='html'>&lt;p&gt;This is the coolest thing I've read in a while.  If the article is too long and/or technical, at least watch the high-speed video of the mosquito getting fried.  It's awesome!  &lt;a href="http://spectrum.ieee.org/consumer-electronics/gadgets/backyard-star-wars/0"&gt; Backyard Star Wars&lt;/a&gt; (the weapon system, not the movie).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-3368459117530915126?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/3368459117530915126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=3368459117530915126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3368459117530915126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3368459117530915126'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/05/real-life-laser-defense-against-malaria.html' title='Real-life Laser Defense Against Malaria'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6413703322452840809</id><published>2010-03-04T20:33:00.001-08:00</published><updated>2010-03-04T20:53:49.225-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='verification'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>New Build Tool: fabricate.py</title><content type='html'>&lt;p&gt;I stumbled onto a new build tool today: &lt;a href="http://code.google.com/p/fabricate/"&gt;fabricate&lt;/a&gt;.  I can't believe how cool it is, and that nobody has thought of it before (OK, actually, &lt;a href="http://www.eecs.berkeley.edu/~billm/memoize.html"&gt;one person did&lt;/a&gt;, but still!).  You give it a command, and it runs the command with &lt;a href="http://en.wikipedia.org/wiki/Strace"&gt;strace&lt;/a&gt; and looks for all the files the command reads and produces and uses those as the command's dependencies and outputs, respectively.  The next time you run the command with fabricate, if the outputs don't exist or the dependencies have changed it re-runs the command, otherwise, it doesn't.  In other words, it does all the work that you normally would try and do with make, automatically.&lt;/p&gt;

&lt;p&gt;Another cool thing about this is that it will work with anything.  You don't have to write builders for it like you would for &lt;a href="http://www.scons.org/"&gt;scons&lt;/a&gt; (another tool I looked at for a bit).  I spent some time trying to get scons to run &lt;a href="http://model.com/"&gt;modelsim&lt;/a&gt; compiles and simulations for me, and it was way too hard to make it work.  I just tried fabricate with a small modelsim job and it worked perfectly.  I'm excited to play with fabricate some more.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6413703322452840809?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6413703322452840809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6413703322452840809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6413703322452840809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6413703322452840809'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/03/new-build-tool-fabricatepy.html' title='New Build Tool: fabricate.py'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1534534888254976953</id><published>2010-03-02T07:29:00.000-08:00</published><updated>2010-03-02T07:41:39.715-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='family'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Our New Home Phone: Ooma</title><content type='html'>&lt;p&gt;Since my family and I just moved to a new state for this new job, we took the opportunity to look at different options for home phone.  Some friends had switched to &lt;a href="http://www.ooma.com"&gt;ooma&lt;/a&gt; and liked it, and after a little research, we decided to go with ooma too, specifically the ooma &lt;a href="http://www.ooma.com/buy"&gt;telo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We got it at best buy on sale for about $225, and that's all you pay.
Apparently we'll eventually have to start paying about $11 a year for some
sort of telecom tax.  Other than that, nothing.  You might be able to
find the telo for cheaper on ebay or something too, I didn't look into
that too much.&lt;/p&gt;

&lt;p&gt;I connect my cable modem directly to the telo, and then the telo to my
router, and then my computers to my router.  You plug your normal land-line phone into telo too, and then it works like it always has.  With everything
going through the telo, it does QOS to make sure your voice traffic
always has enough bandwidth, and it can do port forwarding so web and
ssh requests still get to my linux machine.  It supposedly does the
right thing with 911 if you register your address with them (if I
remember the setup process right).  Setting it up wasn't &lt;em&gt;too&lt;/em&gt; tricky
(and would have been easier without the port forwarding and my comcast
connection coincidently going down right in the middle of it all).&lt;/p&gt;

&lt;p&gt;You get voicemail for free and the telo box gives you a convenient
answering machine interface to it.  It has a speaker and you can hear
when someone calls and leaves a message.  You can pick up the phone
while they are leaving their message and start talking with them.  You
can play, rewind, save message and all that answering machine stuff by
using the big buttons on the telo box.  A red light flashes when you have a new message waiting.  My wife likes that (and I'll admit, I really like it too).  There is also a web interface to voicemail where you can listen to the messages as
sound files, and you can have it send you a text message and/or an
email whenever someone leaves a voicemail (not transcribed or
anything, but google voice can do that if you really want).&lt;/p&gt;

&lt;p&gt;You also get caller id that displays phone numbers only.  If you want
names you can pay ooma for their premium service.  Our home phone has
a phone book and if you save a number in there it knows how to display
the name we saved, so we numbers only is fine for us.&lt;/p&gt;

&lt;p&gt;Voice quality seems fine.  Occasionally we've had some minor little
weirdness where it seems like it was slow to notice that you picked up
the phone, and once (only once) I unplugged the telo and plugged it
back in to fix where it didn't notice we had hung up.  It plays a
little chime when you pick up the phone that's a little obnoxious, but
other than that it's been fine and you hardly notice that it's VOIP.&lt;/p&gt;

&lt;p&gt;I like that it's standalone hardware and not software based like
MagicJack (which is windoze only, another sticking point for me).  It
is more expensive, and won't give you a big immediate savings.  After
6 months of not paying $40 a month for regular phone service though, it's paid for.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1534534888254976953?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1534534888254976953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1534534888254976953' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1534534888254976953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1534534888254976953'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2010/03/our-new-home-phone-ooma.html' title='Our New Home Phone: Ooma'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8677612985892224817</id><published>2009-12-05T10:07:00.000-08:00</published><updated>2009-12-05T10:16:20.218-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='verification'/><title type='text'>Open Source EDA Dream</title><content type='html'>&lt;p&gt;A friend of mine who is also a verification engineer lamented to me that Cadence didn't seem to be supporting SystemVerilog very well.  This is what fell out of my head and into the email reply I sent him.&lt;/p&gt;

&lt;p&gt;I notice that Cadence bloggers seem to all like specmen E better than systemverilog, and synopsys people, of course, like VMM more than anything else.  So, I guess I&amp;#8217;m not surprised that Cadence isn&amp;#8217;t supporting SystemVerilog that well.  The EDA industry is weird.  I like how the software world, with open source, collaborates so well on developing the best tools for everyone.  There almost needs to be a Linux-like simulator that everyone in EDA rallies around and works together on.  Or if Linux isn&amp;#8217;t the best comparison, maybe gcc, or firefox, or apache.  They are defacto standard tools now in the software world.  In the software world, if you have a new compiled language, you pretty much have to write a gcc (Gnu Compiler Collection) compiler for it.  If you have an idea for a webserver improvement, better make it an apache module.  If you are writing a cool web app, it has to work well on firefox.  Any new programming tool (revision control, linter, profiler, debugger) has to run under Linux or nobody is going to notice it.  If you are interested in OS schedulers, filesystems, memory managers, etc., and you want industry and academia to take notice, you make your scheduler, filesystem, memory manager, etc. work with Linux.  Since those are all open source projects, it&amp;#8217;s not that hard to do any of that.&lt;/p&gt;

 &lt;p&gt;If EDA worked the same there would be one open source simulator that supported verilog, vhdl, SystemVerilog, SystemC, e, vera, and about 10 other obscure languages that people had dreamed up over the years.  It would run on 20 different operating systems and support all kinds of logging, debuggers, coverage, and waveform formats.  Acellera would prototype new standards in beta versions of the simulator.  You&amp;#8217;d get support on email lists and HOWTO web pages and wikis, often directly from the people writing the code.&lt;/p&gt;

 &lt;p&gt;I think the thing about software tools is, if you write software, you have the skills to understand and modify your own tools.  If you design circuits, you might not have the skills to understand and improve your simulator.  Software people could do it, but if it&amp;#8217;s not a tool they are likely to use themselves, they probably aren&amp;#8217;t going to be very interested.  The EDA world in general is also a lot smaller than the software world so the chances of someone having the Linus like motivation to tackle a project like that are much smaller.  Instead we EDA engineers beg and plead and pay out the nose for Cadence, Mentor, and Synopsys to do everything for us.  They are careful to make everything an open standard now (like e, for example), but if nobody, or only one company supports that standard, does it matter?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8677612985892224817?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8677612985892224817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8677612985892224817' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8677612985892224817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8677612985892224817'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/12/open-source-eda-dream.html' title='Open Source EDA Dream'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-5909530710835661308</id><published>2009-11-18T08:21:00.000-08:00</published><updated>2009-11-18T08:29:58.335-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Initial Thoughts on Google Go</title><content type='html'>&lt;p&gt;I read the &amp;#8220;tutorial&amp;#8221;: and thought, &amp;#8220;the syntax is Frankenstein ugly.  They have Guido on staff, but this looks like they consulted Larry Wall.  Why didn&amp;#8217;t they just write an open source &lt;a href="http://www.digitalmars.com/d/"&gt;D&lt;/a&gt; compiler?&amp;#8221;&lt;/p&gt;

 &lt;p&gt;Then I read the &lt;a href="http://golang.org/doc/go_faq.html"&gt;FAQ&lt;/a&gt;.  Some very interesting ideas, and personally, ever since using C++ for some large embedded programming projects (large?  embedded?   not as oxymoronic as you might think), I&amp;#8217;ve been thinking these same things for a while now:&lt;/p&gt;

 &lt;blockquote&gt;&lt;p&gt;No major systems language has emerged in over a decade, but over that time the computing landscape has changed tremendously. There are several trends:&lt;/p&gt;

 &lt;ul&gt;
  &lt;li&gt;Computers are enormously quicker but software development is not faster.&lt;/li&gt;

  &lt;li&gt;Dependency management is a big part of software development today but the “header files” of languages in the C tradition are antithetical to clean dependency analysis—and fast compilation.&lt;/li&gt;

  &lt;li&gt;There is a growing rebellion against cumbersome type systems like those of Java and C++, pushing people towards dynamically typed languages such as Python and JavaScript.&lt;/li&gt;

  &lt;li&gt;Some fundamental concepts such as garbage collection and parallel computation are not well supported by popular systems languages.&lt;/li&gt;

  &lt;li&gt;The emergence of multicore computers has generated worry and confusion. 
&lt;/ul&gt;
 &lt;p&gt;We believe it&amp;#8217;s worth trying again with a new language, a concurrent, garbage-collected language with fast compilation.&lt;/p&gt;&lt;/blockquote&gt;

 &lt;p&gt;D has been around a while, but it just doesn&amp;#8217;t seem to be catching on; maybe because it just doesn&amp;#8217;t have a large corporation behind it.  Maybe because it&amp;#8217;s not fully open source.  Or, maybe because it doesn&amp;#8217;t have all the features of Go.&lt;/p&gt;

 &lt;p&gt;Bryan&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-5909530710835661308?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/5909530710835661308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=5909530710835661308' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5909530710835661308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5909530710835661308'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/11/initial-thoughts-on-google-go.html' title='Initial Thoughts on Google Go'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8747735772236867509</id><published>2009-11-11T11:13:00.000-08:00</published><updated>2009-11-11T11:58:11.479-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='family'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>I Got a Mac</title><content type='html'>&lt;p&gt;My employer just supplied me with a MacBook Pro running OS X Version 10.6.1 (is that a little redundant?).  For a long time I have eyed macs with wary suspicion, but with a lot of curiosity too.  If Microsoft is evil, as some like to say, because it locks customers in to its proprietary software, Apple must be at least twice as evil.  They lock customers in to their software *and* hardware!  I kind of like the new laptop, though.  Mechanically, it's awesome.  The aluminum body feels nice and solid.  The lid doesn't latch when it closes, it just kind of (magnetically?) holds to the body.  The buttons and USB slots and everything are also very nicely done.  The display is one of those glossy ones for "brighter colors" and I hate the glare.  The user interface has me all confused with buttons and menus in places I'm not used to.  It has this fancy new mouse trackpad that is huge and it lest you do multi-finger stuff kind of like an iPhone (which I don't have).  That's all going to take some getting used to also.&lt;/p&gt;

&lt;p&gt;The biggest thing that surprised was the childhood memories that it evoked. The first computer I ever used was a Mac.  Grandpa is a chemical engineer, and he recognized right away how useful personal computers would be.  He had a Mac Classic in his den and he would let me play with it all I wanted when I came to visit.  MacPaint was about all I could do with it when I was 5 years old, but I moved the mouse and clicked on things, pushed a floppy disk into its drive and then drug the icon to the trash to eject it, and poked around at whatever I could.  On this new laptop when I first saw the little mouse pointer turn to the text entry icon, the same icon that the Mac classic used, all the memories of that Mac Classic in Grandpa's den came back.  There are a few other subtle little things, like the apple menu, that give me a little bit of nostalgic joy every time I encounter them as well.  It's very cool that Apple has kept some things the same over all those years.  Apple can't be totally evil, right?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8747735772236867509?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8747735772236867509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8747735772236867509' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8747735772236867509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8747735772236867509'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/11/i-got-mac.html' title='I Got a Mac'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-5378425084222585206</id><published>2009-10-26T09:55:00.001-07:00</published><updated>2009-10-29T08:39:04.637-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eda'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Flexlm, let me count the ways</title><content type='html'>&lt;p&gt;Trivial to defeat for the dishonest, a complete hassle and waste of time for the honest, who are we, in the EDA industry, kidding with flexlm licensing?  As customers we buy this incredibly sophisticated and powerful (and expensive!) simulation and synthesis software, and then it fails to run at times because of this fragile, buggy license software wrapper around it.  Why do we put up with it?&lt;/p&gt;

&lt;p&gt;And vendors, you treat your enterprise customers, who shell out tens if not hundreds of thousands of dollars for your software, as if you don't trust them?  You force them to set up, troubleshoot, and babysit these finicky and frail license servers, just so they can run the software they've already paid you (a lot!) for?  Why?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-5378425084222585206?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/5378425084222585206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=5378425084222585206' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5378425084222585206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5378425084222585206'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/10/flexlm-let-me-count-ways.html' title='Flexlm, let me count the ways'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6353552318031832671</id><published>2009-10-23T11:16:00.000-07:00</published><updated>2009-10-23T11:16:00.142-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Convert putty key to openssh on linux</title><content type='html'>&lt;p&gt;I had a putty generated ssh key that I wanted to use on my linux box (long story).  Turns out it's simple to convert it using linux tools.  Here are the steps:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo aptitude install putty-tools&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then, to convert a private putty key named id_dsa.ppk to an openssh key named id_dsa:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;puttygen id_dsa.ppk -O private-openssh -o id_dsa&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then just type in the key's passphrase and you're done.  You can type &lt;code&gt;puttygen --help&lt;/code&gt; to see similar options for public keys.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6353552318031832671?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6353552318031832671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6353552318031832671' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6353552318031832671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6353552318031832671'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/10/convert-putty-key-to-openssh-on-linux.html' title='Convert putty key to openssh on linux'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-2051553025756174030</id><published>2009-10-22T10:18:00.000-07:00</published><updated>2009-10-22T10:36:04.027-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>New Job, New Focus</title><content type='html'>&lt;p&gt;I have a new job!  I am now a verification engineer at a relatively new hardware company in Utah.  I worked on digital design and verification stuff back during internships in college and then for the first few years that I worked full-time.  Then about five years ago I switched over to embedded software.  It's fun to be back in the hardware design world.  Better verification and system modelling was a hot topic five years ago, and it looks like a lot of progress has been made in the intervening years.  It's really cool to see.  Another big win with the new job is, no more windoze!  ASIC designers know a good development environment runs on Linux ;-)&lt;/p&gt;

&lt;p&gt;I mostly use this blog to write down helpful reminders for myself, and as a start, here's my first verilog tip.  Code browsing with &lt;a href="http://ctags.sourceforge.net/"&gt;ctags&lt;/a&gt; works for verilog too!  I used find to get a list of all our verilog files and put that in a file called, file-list.txt.  Then I generated tags like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ctags -e --verbose --language-force=verilog -L file.list&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;One huge oversight of emacs verilog-mode is that they overrode the pop-tag-mark keybinding to insert a multi-line comment instead.  I got distracted with other things so I haven't done it yet, but I'm sure that's not too hard to fix.&lt;/p&gt;

&lt;p&gt;Anyway, I'm excited for the new opportunity.  In closing, here are some verification blogs that I found, but haven't read much of.  Yet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.intelligentdv.com/blog/"&gt;http://www.intelligentdv.com/blog/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ninjaverification.wordpress.com/"&gt;http://ninjaverification.wordpress.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.oh-onemorething.com/"&gt;http://www.oh-onemorething.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.verilab.com/blog/"&gt;http://www.verilab.com/blog/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How's that for a focused blog post?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-2051553025756174030?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/2051553025756174030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=2051553025756174030' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/2051553025756174030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/2051553025756174030'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/10/new-job-new-focus.html' title='New Job, New Focus'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-547488830312257514</id><published>2009-10-21T09:29:00.000-07:00</published><updated>2009-10-21T09:50:43.580-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>.bash_profile vs. .bashrc</title><content type='html'>&lt;p&gt;There are many subtleties in the way shells start up and what they automatically source when they do.  At one point I had to have this down pat for my job, for both Red Hat Linux systems and HP-UX systems.  It has gotten a little fuzzy since then, but I rediscovered this basic point today: profile files are sourced once when you log in, your rc file is sourced every time you start a shell.&lt;/p&gt;

 &lt;p&gt;But what does that mean?  If you put something like this in your .bashrc:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;export PATH=$PATH:/home/username/bin&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;And start up, say, a gnome-terminal, your PATH will have &lt;code&gt;/home/username/bin&lt;/code&gt; appended to it.  To see it type this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;echo $PATH&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;Good enough.  Now, in that gnome-terminal, if you execute something that causes another sub shell to be spawned (like, you execute a script), your .bashrc will be sourced again, and that export statement will execute again.  Try typing this in your gnome-terminal:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bash # starts a subshell
echo $PATH&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;See &lt;code&gt;/home/username/bin&lt;/code&gt; repeated twice?  That&amp;#8217;s really not what you want to happen.  That&amp;#8217;s why you want to export environment variable in your .bash_profile, not your .bashrc.  I don&amp;#8217;t like logging out of my desktop session and logging back in to effect changes made to my .bash_profile, so I go into my gnome-terminal preferences under Title and Command and check the box next to &amp;#8220;Run command as a login shell.&amp;#8221;  That way every time a gnome-terminal starts up, it&amp;#8217;s acts like a new login.  It starts up with a clean environment and it sources my .bash_profile.  Then I add this at the end of my .bash_profile to make sure my .bashrc gets sourced too:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I'm sure my former self could have explained this better and with more precision, but for what most command-line junkies do, this should be sufficient.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-547488830312257514?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/547488830312257514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=547488830312257514' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/547488830312257514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/547488830312257514'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/10/bashprofile-vs-bashrc.html' title='.bash_profile vs. .bashrc'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-7854919880781782532</id><published>2009-10-07T21:42:00.000-07:00</published><updated>2009-10-07T21:57:25.213-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Little Things</title><content type='html'>&lt;p&gt;Things that never fail to fill me with childlike giddiness:&lt;/p&gt;

 &lt;ul&gt;
  &lt;li&gt;When code that I wrote talks over a network.&lt;/li&gt;
  &lt;li&gt;When multi-threaded code that I wrote shows evidence of actually doing two or more things in parallel.&lt;/li&gt;
  &lt;li&gt;When my code makes an LED blink.&lt;/li&gt;
  &lt;li&gt;When my code makes a motor move.&lt;/li&gt;
       &lt;/ul&gt;

 &lt;p&gt;These are not new things to me, but each time I do them with a new piece of hardware or as part of a new project it fills me with such wonder and joy, and once it&amp;#8217;s done it&amp;#8217;s still fun to run the code over and over and watch it happen again and again.  It takes a long time for the satisfied feeling to wear off.  It&amp;#8217;s even more amazing if it&amp;#8217;s more than one of those in combination (multi-threaded blinking of many LEDs, over a network, while moving a motor!).  I haven&amp;#8217;t confessed this to anyone before, but lately I&amp;#8217;ve seen engineers more seasoned than I show the same excitement that I feel in these same scenarios, and I believe that I am not alone.  It&amp;#8217;s the little things that count.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-7854919880781782532?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/7854919880781782532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=7854919880781782532' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/7854919880781782532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/7854919880781782532'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/10/little-things.html' title='Little Things'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8543027181220096311</id><published>2009-08-18T15:59:00.000-07:00</published><updated>2009-08-19T23:23:30.940-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosopy'/><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Extreme</title><content type='html'>&lt;p&gt;&lt;a href="http://www.codinghorror.com/blog/archives/001296.html"&gt;Pretty soon, all programming will be web programming.&lt;/a&gt;&lt;/p&gt;

 &lt;p&gt;And I thought &lt;strong&gt;I&lt;/strong&gt; was making extreme statements to make a point in my &lt;a href="/2009/07/averse-to-change.html"&gt;last&lt;/a&gt; &lt;a href="/2009/07/simple-software-cost-measurement.html"&gt;two&lt;/a&gt; blog entries!  I wonder if Mr. Atwood understands how much programming goes into all the hardware devices that surround him?  That code isn&amp;#8217;t written in Ruby or Javascript.&lt;/p&gt;

 &lt;p&gt;As for my extreme statements about how readily software is changed, I leaned pretty heavily towards one idea.  I&amp;#8217;m not usually one to have an strong opinion out to an extreme.  Engineering is all about trade-offs and holding to extreme ideals doesn&amp;#8217;t seem to fit with good engineering.&lt;/p&gt;

 &lt;p&gt;I discussed the Averse To Change essay with some friends and read the comments from all of my readers (thanks you two!).  One thing that came up was the idea of using the right tool for the right problem as a bigger reason to use software, not just because it&amp;#8217;s easy to change.  But what is it that makes software the right tool?  I&amp;#8217;d say it&amp;#8217;s the right tool for problems that you know you don&amp;#8217;t have completely defined, that you will learn more about as you go.  Problems that require agility and adaptability to solve.  That&amp;#8217;s why I pretty much stick by what I said.  Of course you have to balance ease of change with other needs like reliability.  Life-critical systems, as one commenter pointed out, are the ultimate example of that.  But even in those systems software is the easiest part to change.  Exactly as it should be.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8543027181220096311?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8543027181220096311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8543027181220096311' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8543027181220096311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8543027181220096311'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/08/extreme.html' title='Extreme'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-7388280637411304105</id><published>2009-07-27T20:31:00.001-07:00</published><updated>2009-07-27T20:36:06.409-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosopy'/><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Simple Software Cost Measurement</title><content type='html'>&lt;p&gt;&lt;em&gt;This was written at the same time as &lt;a href="/2009/07/averse-to-change.html"&gt;Averse to Change&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

 &lt;p&gt;I&amp;#8217;ve been jealous of mechanical or electrical engineers who can point at the direct material cost of their design, that concrete dollar amount, and say, that&amp;#8217;s how much it costs.  They gloat about redesigns that result in the same functionality but with a reduction in direct material cost. They rarely even have to talk about the cost in engineering time that it took to get to that cost reduction.  Once I realized what the &lt;a href="/2009/07/averse-to-change.html"&gt;true value of software&lt;/a&gt; was, I realized that we too could use a simple measure like DM cost:  lines of code.  Not like the horribly misguided productivity measurements of old where more lines of code was better.  When you realize that the ability to quickly make changes is priority number one, you see that less lines of code is better.  I like this because it&amp;#8217;s a lot like DM cost, where it&amp;#8217;s easy to count and less is more, and even just a little less is usually worth the effort.  In the physical world, that small reduction in DM cost is multiplied by volume.  If a part is purchased in large amounts, a small reduction in cost equals a large savings.  In software, even saving a few less lines of code can be multiplied by how many times the design may need to be changed and how much easier it will be to make those changes.  A small reduction in lines of code equals a big reduction in total cost.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-7388280637411304105?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/7388280637411304105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=7388280637411304105' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/7388280637411304105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/7388280637411304105'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/07/simple-software-cost-measurement.html' title='Simple Software Cost Measurement'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1887277597016950279</id><published>2009-07-22T21:16:00.000-07:00</published><updated>2009-07-22T21:58:43.492-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosopy'/><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Averse to Change</title><content type='html'>&lt;p&gt;&lt;em&gt;This was written about a year ago and left unpublished because it talked about people I was working with.  I like the people in the examples, despite my disagreements about they way they work, and I didn't want to hurt anyone's feelings, so I left it hidden on my hard drive.  After a conversation a couple days ago at my new job about the apparent recent &lt;a href="http://www.codinghorror.com/blog/archives/001288.html"&gt;death of software engineering&lt;/a&gt;, I was reminded of this essay that I had written.  I think it needs to see the light of day, so hopefully with the passing of time since the examples took place nobody will get upset.  There are certainly no hard feelings on my side because I am far from perfect myself.  OK, on to the essay.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Software (and the engineering that goes into crafting it) is a very misunderstood thing, especially at hardware focused shops.  It is misunderstood by management, but that&amp;#8217;s old news.  I&amp;#8217;m afraid it&amp;#8217;s misunderstood by many of the engineers, even software engineers, as well.  This leads to a lot of unnecessary difficulty and awkwardness in the software design and engineering process.  Let me describe two scenarios from my experience that resulted from this kind of misunderstanding.&lt;/p&gt;

 &lt;h4&gt;Bob&lt;/h4&gt;

 &lt;p&gt;Bob is a programmer.  He actually started his engineering life as some other kind of engineer.  It doesn&amp;#8217;t really matter, it could be mechanical, electrical, chemical, you name it, but somewhere along the line he got into programming and now that&amp;#8217;s what he does.  He seems to do solid work and is a smart guy.  You notice, however that he gets more and more stressed as projects get closer to the end.  Any new feature or new requirement or even a discussion of the possibility of making a change to the original design really sets him off.  His face gets red and his volume increases at meetings.  Everyone else gets uncomfortable.  He fights every late-project code request tooth and nail but he usually manages to pull through in the end without &lt;strong&gt;too&lt;/strong&gt; many late-project regressions in his code&amp;#8230;&lt;/p&gt;

 &lt;p&gt;Then the day comes that you take a good look at his work.  Maybe he takes over a another module that you worked on and you review his code after he&amp;#8217;s been working on it a few months.  As you look at what he&amp;#8217;s done to your carefully crafted design you are aghast.  Requirements have changed and some redesign was needed, but that&amp;#8217;s not what Bob has done.  No, rather than remove large chunks of code that should now be obsolete, he has bent over backwards to use the existing code as much as possible.  Functions have been re-purposed and their names no longer make any sense.  Variables names are now nonsensical.  Some sections of code have been &amp;#8220;removed&amp;#8221; with prodigious use of &amp;#8221;#if 0&amp;#8230;#endif,&amp;#8221; and other sections of code have been routed around with conditionals, but nothing has actually been deleted or renamed.  Some new functions have been added and lots of tweaking of parameters has been done in order to fit a new interface onto and over the old one.  Hard-coded &amp;#8220;special-case&amp;#8221; code seems to be the rule rather than the exception.  Copy-n-paste is not foreign to Bob&amp;#8217;s repertoire either.  The whole thing is a Frankenstein&amp;#8217;s mess of duplicate code, spaghetti code, dead code, and just plain wrong code all mixed together.  When you talk to him about his approach to this problem he excitedly tells you how little change he had to make to get the new requirements working.  The only thing you get excited about is that you finally understand why it was so hard for him to make changes late in the game and why regressions arose why he did so.  Bob is missing something fundamental about software engineering.&lt;/p&gt;

 &lt;h4&gt;Fred&lt;/h4&gt;

 &lt;p&gt;Fred is a programmer.  He also has an interest in tools, and since nobody else expressed any interest he got the job as tools guy.  Everyone else on the team loves that he talks to the IT department for them and that they never have to deal with IT directly.  Still, there is some grumbling that they are using a 6-year old version of Linux on their development machines.  Come to think of it, none of their other tools have been updated in quite a while.  Haven&amp;#8217;t there been some new features and bug fixes in that time?  Since they are targeting an embedded system it doesn&amp;#8217;t really matter which version of Linux they develop on, but they could at least use an update on emacs or vim, and getting help writing scripts in Python 2.2 is getting harder and harder.  A few of them have started to compile newer versions of various tools like that on their own, but finding the right libraries for Redhat 8 is pretty tough.&lt;/p&gt;

 &lt;p&gt;Pressing management, someone finds out that he&amp;#8217;s been told to upgrade the team&amp;#8217;s tools, but he hasn&amp;#8217;t made much progress.  Talking to him he says that there just hasn&amp;#8217;t been enough time for him to do it.  How hard can it be, one asks?  Get a spare workstation, slap the latest version of Linux on it, and then just make sure our cross-compiler still runs, right?  Oh no, he explains.  You see, we use ctags 5.2.3, which came with Red Hat 8, and we have to Verify that ctags 5.5.4  works the same on the new version of Red Hat.  There&amp;#8217;s also gftp, which people have gotten used to, which might not work the same when we upgrade.  Fred also hasn&amp;#8217;t had time to verify the new versions of ssh, python, bash, nedit, vim, emacs, and so, and so on.  These open source people keep updating their software willy nilly, it&amp;#8217;s hard to keep up, says Fred.  One leaves this conversation with a clear understanding that Fred pays amazing attention to detail and that he has also erected an insurmountable barrier to changing the team&amp;#8217;s tools.&lt;/p&gt;

 &lt;h4&gt;Misunderstood&lt;/h4&gt;

 &lt;p&gt;I really had a hard time deciphering what it was with these people until I realized that they both had the same basic problem.  They are totally averse to change.  They are completely paralyzed by the thought of changing their carefully crafted systems, whether it be the code they&amp;#8217;ve written, code someone else has written, or an assemblage of code that makes up a development toolset.  Once they have something working, they are appalled by the idea of having to change it.  This is unfortunate because it is a complete and utter misunderstanding of the true value that software has in a system.&lt;/p&gt;

 &lt;p&gt;When you design a system these days, software is always a given.  I believe most assume it&amp;#8217;s a cost thing.  You could design hardware to do what the software is doing in most devices, but it would cost so much more.  If that&amp;#8217;s the case, why have any specialized hardware at all?  Why not have a few general purpose processors and implement all of your features in software?  Wouldn&amp;#8217;t that be the cheapest way to do it?  Hmm, well, those general purpose processors can be expensive, especially to get them fast enough to do things at the same speed that specialized hardware can do them.  Sometimes many times more expensive than the cost of a specialized ASIC.&lt;/p&gt;

 &lt;p&gt;If that's the case, then why not craft your whole system out of specialized hardware?  You can make it do things really fast, and with some good design effort and high enough volumes specialized ASICs can be very cheap.  Very cheap, that is, until you find a bug in the ASIC, or realize there&amp;#8217;s another feature you need.  Then you find out how expensive it is to re-spin a chip, and the later in the project you have to do that, the more expensive it is both in terms of the money already spent manufacturing buggy parts, and in the money it will cost to make new masks and delay your project while the new version of the ASIC is in the fab.  And will you have it all correct after only one re-spin?  There&amp;#8217;s a lot of risk there.  That&amp;#8217;s why hardware designers are averse to change; they should be!  It&amp;#8217;s expensive, so get the requirements right the first time, darn it, and you better not come late to them with a change in requirements.&lt;/p&gt;

 &lt;h4&gt;Real Reason We Do Software&lt;/h4&gt;

 &lt;p&gt;This is where the real value of software comes into play.  It&amp;#8217;s not that it&amp;#8217;s intrinsically cheaper than hardware, it&amp;#8217;s that it&amp;#8217;s cheaper to &lt;strong&gt;change&lt;/strong&gt; than hardware.  The real value of software in a system is its malleability.  It&amp;#8217;s flexibility.  The ability to make a late change to a feature, to fix a bug found close to shipping date, or to run a quick experiment is by far the main benefit of software.  As software engineers, the best service we can provide to a project is to make changes to our code as quickly as possible.  Reluctance and resistance to change our code and our software tools is a hold-over from hardware design and is the complete opposite of what we should be doing.&lt;/p&gt;

 &lt;p&gt;The ability to change and adapt is what should drive all of our design decisions when we craft software.  The simpler a design, the more modular, and the less lines of code the better.  The better tools we have to edit, refactor, branch, merge, and otherwise change our code the better.  The faster we can confidently make changes to our code, the more value our software will add to a project.  If we complain and resist changes to our code at every turn, if we ever consider ourselves done with our software, we are killing our contribution to the product.  If we burden a project with cumbersome software change request procedures, we lessen the value of our software.  The ability to quickly and easily be changed is software's core contribution to a system.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1887277597016950279?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1887277597016950279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1887277597016950279' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1887277597016950279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1887277597016950279'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/07/averse-to-change.html' title='Averse to Change'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-460810205156772966</id><published>2009-07-08T10:24:00.000-07:00</published><updated>2009-07-08T10:24:27.136-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>If You Have To Run Windows</title><content type='html'>&lt;p&gt;If you have been spoiled by the developer heaven that is a well running Linux machine and you have to run windoze, this is what I&amp;#8217;ve found that begins to almost make it bearable.&lt;/p&gt;

 &lt;ul&gt;
  &lt;li&gt;You must first open file explorer (windows-e) and do Tools-&gt;Folder Options-&gt;View and then check, &amp;#8220;Display the contents of system folders,&amp;#8221; and uncheck, &amp;#8220;Hide extensions for known file types.&amp;#8221;  Also, View-&gt;Details is recommended.&lt;/li&gt;

  &lt;li&gt;Right-click on the question mark down near the bottom-right of your screen, left of the clock and all the icons (in the Taskbar), and chose &amp;#8220;Hide the language bar&amp;#8221; (or whatever the annoying thing is).&lt;/li&gt;

  &lt;li&gt;Right-click on the Taskbar itself and check &amp;#8220;Show Quick Launch&amp;#8221; and uncheck &amp;#8220;Hide inactive icons&amp;#8221;&lt;/li&gt;

  &lt;li&gt;On any command windows (cmd.exe, cygwin, etc.), fix the font.  Click on the icon in the upper-left corner of the window and choose &amp;#8220;Properties.&amp;#8221;  Click on the &amp;#8220;Font&amp;#8221; tab, and choose &amp;#8220;Lucida Console.&amp;#8221;  You can make the window bigger with the &amp;#8220;Layout&amp;#8221; tab too, if you need.&lt;/li&gt;

  &lt;li&gt;Get a nice &lt;a href="http://digitalblasphemy.com/freegallery.shtml"&gt;desktop background image&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.gnu.org/software/emacs/windows/Installing-Emacs.html"&gt;swap caps and ctrl&lt;/a&gt;.  Scroll down a bit to find the registry script.  And acutally, if you just make caps a ctrl, and leave ctrl as ctrl, other people that sit down at your machine won&amp;#8217;t be so confused.&lt;/li&gt;&lt;/ul&gt;

 &lt;p&gt;Now, install the following programs (and don&amp;#8217;t allow any of them add an icon to your desktop, a Quick Launch icon is OK if you really use it a lot):&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.mozilla.com"&gt;Firefox&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://fy.chalmers.se/~appro/nt/TXMouse/"&gt;txmouse.exe&lt;/a&gt;.  Gives you X11-like copy-n-paste (even in cmd.exe windows) and focus-follows-mouse.&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://ourcomments.org/Emacs/EmacsW32.html"&gt;emacs w32&lt;/a&gt;.  I went with the patched version this time, but I&amp;#8217;ve used unpatched in the past haven&amp;#8217;t noticed a big difference.&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.gimp.org/"&gt;gimp&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.pidgin.im/"&gt;pidgin&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://virtuawin.sourceforge.net/"&gt;VirtuaWin&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.cygwin.com/"&gt;cygwin&lt;/a&gt;.  Select lots of goodies like gcc and openssh and whatever else your fingers type without thinking when you are at a command-line.&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://gnuwin32.sourceforge.net/"&gt;gnuwin32&lt;/a&gt;.  Sometimes you end up at a command-line other than cygwin&amp;#8217;s and your fingers still type things like ls, which, less, grep, and so forth.  That&amp;#8217;s what these are for.&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.locate32.net/"&gt;locate32&lt;/a&gt;&amp;#8212;fast file finder.&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://code.google.com/p/msysgit/"&gt;git for windows&lt;/a&gt;&amp;#8212;if you need some solid open source revision control.&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://console.sourceforge.net/"&gt;Console2&lt;/a&gt;.  This is much nicer than the basic cmd.exe.  You can resize it!  It does transparency! and tabs!  The neat trick is that you can make different types of tabs that each run their own shell, such as c:\cygwin\Cygwin.bat, or the git-bash shell.  After you have made your tabs, create multiple shortcuts to start console 2, each specifying a different tab to start with using the &lt;code&gt;-t&lt;/code&gt; option.  You can give them the cygwin and git-bash icons to really polish things up.&lt;/li&gt;&lt;/ul&gt;

 &lt;p&gt;And because I have Linux machines that my windoze machines must talk with:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://winscp.net/eng/index.php"&gt;winscp&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/"&gt;putty&lt;/a&gt;.  Not just for ssh, but for telnet (handy for embedded development), and works as a serial terminal too.&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://sourceforge.net/projects/xming/"&gt;xming&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

 &lt;p&gt;For embedded software development:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://kin.klever.net/pumpkin/"&gt;pumpkin&lt;/a&gt;&amp;#8212;hilarious looking and sounding, but functional, tftp server&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://hp.vector.co.jp/authors/VA002416/teraterm.html"&gt;Terra Term&lt;/a&gt;.  For when putty doesn&amp;#8217;t quite cut it as a serial terminal, and yes, the latest version is from 1998.  That worried me also.&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/3669809752172683097-460810205156772966?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/460810205156772966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=460810205156772966' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/460810205156772966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/460810205156772966'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/07/if-you-have-to-run-windows.html' title='If You Have To Run Windows'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-3441936621736182151</id><published>2009-06-17T22:02:00.000-07:00</published><updated>2009-06-18T06:00:16.985-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><title type='text'>Large Hidden Files</title><content type='html'>I'm working on another backup script.  I admit it had been over a year since I had backed up my home hard drive.  In that time, the stuff my old script had been backing up from my home directory got a lot bigger.  Why?  I found a couple obvious culprits that I should have seen right away, but then it was less obvious.  Running &lt;code&gt;du | sort -rn&lt;/code&gt; is always insightful when this problem comes up, and I found that I had a .local directory that was 2.3 GB in size and a .cache that was almost 1 GB.  Ouch.  Looks related to &lt;a href="https://wiki.ubuntu.com/Tracker"&gt;tracker&lt;/a&gt;.

The other biggie that I had totally missed was that I had played around with &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;, and it stores its hard drive images in the hidden .VirtualBox directory.

What is with these programs stashing huge amounts of data in hidden directories?  In the case of VirtalBox, it could be very important data.  Is that smart to hide it from the users like that?  I don't like it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-3441936621736182151?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/3441936621736182151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=3441936621736182151' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3441936621736182151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3441936621736182151'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/06/large-hidden-files.html' title='Large Hidden Files'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1139554242399523051</id><published>2009-06-11T22:02:00.000-07:00</published><updated>2009-06-11T22:02:35.324-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><title type='text'>Playing With Dar</title><content type='html'>&lt;p&gt;I'm playing with backups again.  Most recently, I'm looking at &lt;a href="http://dar.linux.free.fr/"&gt;dar&lt;/a&gt;.  Some quick notes:&lt;/p&gt;

&lt;p&gt;To backup just &lt;code&gt;/etc&lt;/code&gt;, become root, make sure your pwd is &lt;code&gt;/&lt;/code&gt;, and type this:

&lt;pre&gt;&lt;code&gt;dar -v -c /path/to/etc-backup -g etc&lt;/code&gt;&lt;/pre&gt;

This will create a file named etc-backup1.dar at the path you specified.  The -v is optional.  To do the same but encrypt the archive do this:

&lt;pre&gt;&lt;code&gt;dar -K passphrase -v -c /path/to/etc-backup -g etc&lt;/code&gt;&lt;/pre&gt;

Where "passphrase" is your sneaky passphrase.  To list the contents of the archive:

&lt;pre&gt;&lt;code&gt;dar -K passphrase -l /path/to/etc-backup&lt;/code&gt;&lt;/pre&gt;

Of course, you leave out the &lt;code&gt;-K passphrase&lt;/code&gt; if you didn't encrypt it in the first place.  Notice that you don't give it the full filename, ever.

Getting more advance, to write the backup to a file on a remote machine over ssh, do this:

&lt;pre&gt;&lt;code&gt;dar -c - -g etc | ssh user@host dd of=/path/to/etc-backup.1.dar&lt;/code&gt;&lt;/pre&gt;

You tell dar that the backup file is stdout, pipe that to ssh, and use dd on the remote side to put the backup into the file.  Note that you need to give the resulting file a proper dar filename since you don't have dar on the remote side doing it for you.  Not a bad little tool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1139554242399523051?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1139554242399523051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1139554242399523051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1139554242399523051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1139554242399523051'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/05/playing-with-dar.html' title='Playing With Dar'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8031080879103642088</id><published>2009-05-18T14:22:00.000-07:00</published><updated>2009-05-18T14:40:18.693-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Early Thoughts on Developing for Windows</title><content type='html'>&lt;p&gt;I didn't completely escape the clutches of Microsoft when I found my new job.  This new place does some development for windows CE, it turns out.  I've been struggling through some build issues with some code for the last couple days, and my early impression of developing for windows are not good.  I'll admit possibly a little bias, but I'm really trying to keep an open mind.  Really.&lt;/p&gt;

&lt;p&gt;First of all, the command-line tools are severely lacking in Windows.  My mentor here is showing me all kinds of command-line tricks to get stuff done, which I really appreciate, but cmd.exe is awful, copy-n-paste is weird, you can't resize the window by dragging the edge.  Useful commands like which, grep, find, just don't exist.  Agony.  I know about cygwin, but I've never been able to integrate that well with the rest of windoze, and especially not with Visual Studio.&lt;/p&gt;

&lt;p&gt;My second complaint is online help. MSDN appears to be quite voluminous, and somewhat helpful actually, but if you run into something that's not in there, all you can find are forum threads where developers make uninformed suggestions to each other and sometimes they happen to find something that works.  It's not their fault, the source code for all their tools is secret, so it's really hard to know exactly why the build tools do what they do or the compiler says what it says.  The open source folks theoretically can find out exactly why a tool is behaving weird, and with enough people on the internet you can usually find someone who has the correct explanation for the exact wonky behavior you are seeing.  Not always a fix, but at least an intelligent explanation that is much more convincing than, "I don't know, have you tried service pack 2?"&lt;/p&gt;

&lt;p&gt;OK, back to having a good attitude and plowing ahead.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8031080879103642088?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8031080879103642088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8031080879103642088' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8031080879103642088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8031080879103642088'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/05/early-thoughts-on-developing-for.html' title='Early Thoughts on Developing for Windows'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-3150256981648231172</id><published>2009-05-14T22:26:00.000-07:00</published><updated>2009-05-14T22:31:54.233-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu 9.04 + X11 forwarding + Windows XP + Putty + XMing</title><content type='html'>&lt;p&gt;Wow, I sure thought this was a longshot when I went searching for an obscure problem I was having.  Strangely enough, someone else using putty and Xming to run X11 applications from a Jaunty machine also got the error message:

&lt;pre&gt;&lt;code&gt;&lt;a href="http://georgia.ubuntuforums.org/showthread.php?p=7221660"&gt;PuTTY X11 proxy: wrong authentication protocol attemptedError: Can't open display: localhost:10.0&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And their fix worked for me too.  Thanks, timkoop on the Ubuntu Forums!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-3150256981648231172?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/3150256981648231172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=3150256981648231172' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3150256981648231172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3150256981648231172'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/05/ubuntu-904-x11-forwarding-windows-xp.html' title='Ubuntu 9.04 + X11 forwarding + Windows XP + Putty + XMing'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8178080064493018069</id><published>2009-05-11T10:13:00.000-07:00</published><updated>2009-05-11T10:17:59.740-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Upgrade from 8.10 to 9.04</title><content type='html'>Pretty much just like &lt;a href="/2008/11/upgrade-from-804-to-810.html"&gt;the upgrade from 8.04 to 8.10&lt;/a&gt;, minus the xorg problem.  The &lt;code&gt;/etc/apache2/sites-available/default&lt;/code&gt; didn't even change this time, but I still had to kick apache to get it to serve my virtual host.  Not sure what's going on there.  One thing I noticed that I forgot to write down about the last upgrade, that is still weird with Jaunty, is the network manager applet has a red X on it, as if I'm not connected to a network, even though networking is configured how I like and working just fine.  I'll have to google that one someday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8178080064493018069?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8178080064493018069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8178080064493018069' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8178080064493018069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8178080064493018069'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/05/upgrade-from-810-to-904.html' title='Upgrade from 8.10 to 9.04'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6148216702732616180</id><published>2009-05-06T13:16:00.000-07:00</published><updated>2009-05-06T13:16:12.322-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Upgrade from 8.04 to 8.10</title><content type='html'>I'm a little behind on my version of Ubuntu at home.  Last night I finally upgraded to 8.10.  Very smooth compared to past experiences.  Video didn't work at first.  I just deleted my xorg.conf entirely and then X started up just fine.  My apache virtual host was not being served.  Everything caused the default junk in &lt;code&gt;/var/www&lt;/code&gt; to be served up.  Here's what I believe the relevant diff off &lt;code&gt;/etc/apache2/sites-available/default&lt;/code&gt; was:

&lt;pre&gt;&lt;code&gt;bryan@brzo:/etc/apache2/sites-available$ diff -urNp default.dpkg-old default.dpkg-new
--- default.dpkg-old    2007-10-31 21:38:12.000000000 -0700
+++ default.dpkg-new    2008-09-19 06:41:53.000000000 -0700
@@ -1,5 +1,4 @@
-NameVirtualHost *
-&amp;lt;VirtualHost *&amp;gt;
+&amp;lt;VirtualHost *:80&amp;gt;&lt;/code&gt;&lt;/pre&gt;

Restoring &lt;code&gt;NameVirtualHost *&lt;/code&gt; and &lt;code&gt;&amp;lt;VirtualHost *&amp;gt;&lt;/code&gt; statments seemed to fix the problem.  I have not taken the time to understand why, and if anyone wants to comment and enlighten me I'll greatly appreciate it.

Look for another post soon on how the upgrade from 8.10 to 9.04 goes!  I know, try to contain your excitement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6148216702732616180?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6148216702732616180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6148216702732616180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6148216702732616180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6148216702732616180'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/11/upgrade-from-804-to-810.html' title='Upgrade from 8.04 to 8.10'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-4312020431353438026</id><published>2009-05-05T22:05:00.000-07:00</published><updated>2009-05-06T06:34:41.882-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><title type='text'>Life Update</title><content type='html'>You may have noticed that the blurb about me has changed slightly.  My career status has been in flux over the last few months, but has now settled.  Back in January the project I was working on at HP was canceled.  My rather large R&amp;D lab was told that we no longer had work to do.  Our only job was to find another job.  The upper managers would try to find spots for us on other projects within HP, but we were basically told to not hold our breath.  So I didn't.  I updated my resume and went to work.  I interviewed with an interesting company located about an hour away from my home, up the &lt;a href="http://www.fs.fed.us/r6/columbia/"&gt;Columbia Gorge&lt;/a&gt;, named &lt;a href="http://www.insitu.com/"&gt;Insitu&lt;/a&gt;.  They were (and still are) busy interviewing and hiring many people and it took a while to hear back from them.  In the meantime I was offered another position at HP.  Not having anything else firm, I accepted.  I quickly learned that it was a .NET/C# windoze programming position.  No more playing with hardware, no more bit twiddling register manipulations, no more ISRs, no more using an oscilloscope to debug my code.  I was sad, but I tried to have a good attitude.  C# has some interesting things about it, right?  Well, when I heard back from Insitu with a job offer to do embedded software, it was very tempting.  When I considered more interesting work at a place that is hiring and growing rather than laying people off, the choice seemed pretty clear.  The big downside is that 1 hour commute each way.  HP was only 5 minutes away.  I could move my family to White Salmon and get the same commute, but we aren't there yet.  And so I drive.  And listen to books on CD.  It's not too bad.  The work, and work environment, is just about what I imagined it would be as well.  Upbeat, excited, and employee friendly.  I have hardware on my desk again, and they even bought me a pair of ESD safe shoes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-4312020431353438026?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/4312020431353438026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=4312020431353438026' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4312020431353438026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4312020431353438026'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/05/life-update.html' title='Life Update'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1605389418128202840</id><published>2009-03-20T12:19:00.000-07:00</published><updated>2009-03-20T12:29:24.525-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Emacs next-line Changed Behavior?</title><content type='html'>&lt;p&gt;I just made a macro to do some quick-n-dirty editing and noticed that c-n, or next-line, acts funny.  If the line is long and wraps, it goes to the next visual line, not the actual next line of text (as delimited with a newline).  Inconsistently, c-e, or move-end-of-line, still goes to the end of the actual line, not to just before it wraps (moves to the newline).  This is with emacs 23.0.60.1, which isn't an official release, so maybe that's just what I get for being bleeding edge.  Anyway, it was kind of weird and I wanted to document it.  I like the old behavior of c-n better, but the c-e thing allowed my macro to still be possible.&lt;/p&gt;

&lt;p&gt;Some good that came of this was that &lt;a href="http://twitter.com/markhepburn"&gt;markhepburn&lt;/a&gt; &lt;a href="http://twitter.com/markhepburn/status/1179064101"&gt;noticed this too&lt;/a&gt;, and google picked it up, and now I can see all the other cool emacs discoveries he has posted in his twitter feed.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1605389418128202840?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1605389418128202840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1605389418128202840' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1605389418128202840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1605389418128202840'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/03/emacs-next-line-changed-behavior.html' title='Emacs next-line Changed Behavior?'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-9048885755572881750</id><published>2009-02-17T22:05:00.000-08:00</published><updated>2009-02-17T22:08:30.349-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Packet Protector</title><content type='html'>&lt;p&gt;A friend recently purchased an ASUS WL-500g Premium V2 wifi router and installed &lt;a href="http://packetprotector.org/"&gt;PacketProtector&lt;/a&gt; on it for his mom.  She wanted some filtering for the household internet connection, and my buddy thought that this would be a nice self-contained, stand-alone, hard-to-bypass solution for her and the fam.  So far it seems to be all of that.&lt;/p&gt;

&lt;p&gt;I got to thinking about my own curious boys and wondering if I might want some &lt;a href="http://dansguardian.org/"&gt;DansGuardian&lt;/a&gt; filtering on my own internet connection.  I've been pretty anti web filter ever since I discovered the web, mainly because I've been successful at avoiding and ignoring bad stuff on my own, and have only been annoyed by filters that always seem to block useful pages right when you need them.  I've realized lately, though, that without even thinking about it very much, I really don't let my kids online at all.  I think it's because I know that they won't be able to avoid &lt;em&gt;all&lt;/em&gt; the bad stuff, and I fear they won't ignore and quickly move past it like a well disciplined adult (ha!) would.  That's a shame though.  My 8-year old has a lot of curiosity and questions about how things work and why things are the way they are, and doing a little internet research insteading just &lt;strike&gt;bugging&lt;/strike&gt; asking Mom and Dad would do him a lot of good.  I don't think he even knows how to google.  I started to think that some filtering might set us free at our house.&lt;/p&gt;

&lt;p&gt;With that all in mind, I got online and my own ASUS router arrived a few days ago as I had just started reading up on PacketProtector.  Installing it was a little tricky but not too bad.  They key for me was the &lt;a href="http://wiki.openwrt.org/OpenWrtDocs/Installing/TFTP?action=show&amp;redirect=OpenWrtViaTftp"&gt;openwrt wiki page on using tftp&lt;/a&gt;.  That ifconfig command to get the network settings correct was what I had missed at first.&lt;/p&gt;

&lt;p&gt;Once packetprotector was all up and running with the USB stick, it was time to config it.  There is very little documentation, so I thought I'd better write down what I went through.&lt;/p&gt;

&lt;p&gt;To get to the web interface I had to make sure and use https, not http, and then the same username and password that you use for ssh to log in.&lt;/p&gt;

&lt;p&gt;Wireless is off by default.  I turned it on, but still couldn't get connected.  I tried without any encryption.  Then I changed it to a 128-bit WEP key instead of a 40-bit key and my Intrepid Ibex box connected just fine.  Interesting.&lt;/p&gt;

&lt;p&gt;Dansguardian is off by default.  Enable it under the Proxy menu.  You can test its basic operation by visiting &lt;a href="http://stupidicus.googlepages.com/test"&gt;this website&lt;/a&gt; that has, " a DG score of 475 since it mentions bypassing DG."&lt;/p&gt;

&lt;p&gt;Poking into the dansguardian config files, I noticed that pretty much everything but the weighted phrase lists were commented out.  I asked my buddy about this, and he asked if I had noticed that it was using &lt;a href="http://www.opendns.com/"&gt;OpenDNS&lt;/a&gt; (I suggest reading the &lt;a href="http://en.wikipedia.org/wiki/OpenDNS"&gt;wikipedia entry on OpenDNS&lt;/a&gt; as well).  It seems that, maybe to save the router some work, OpenDNS is relied upon for blacklisting instead of DanGuardian.  I signed up for an OpenDNS account and that seems to work pretty well.  Well enough that I wonder if I even need this fancy router setup.&lt;/p&gt;

&lt;p&gt;Other things that Packet Protector does is &lt;a href="http://www.clamav.net/"&gt;clamav&lt;/a&gt; and &lt;a href="http://www.snort.org/"&gt;snort&lt;/a&gt; scanning of your network traffic.  I was noticing some increased latency in my browsing with both of those turned on, so I disabled clamav and things seemed to speed up (I rarely use windoze at home and feel plenty safe without it).  My friend forwarded me this &lt;a href="http://packetprotector.org/forum/viewtopic.php?id=3960"&gt;Packet Protector performance report&lt;/a&gt;, which seems to contradict my unscientific findings, but oh well.  Maybe I'll try his test myself, but overall I'm with the others on that forum thread.  This is all running on only $90 of hardware.  It can be excused for being a little slow.&lt;/p&gt;

&lt;p&gt;Packet Protector needs some serious documentation help.  The web-based configuration could really use some help too.  I think it's a great idea though, and I think I'll stick with it.  I can tell that the filtering isn't perfect, so I'll still need to have some Fatherly Chats with my son before (and after) setting him free on the internet.  Since he and I both just love having those, hopefully some filtering will lessen the need for them at least a little.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-9048885755572881750?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/9048885755572881750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=9048885755572881750' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/9048885755572881750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/9048885755572881750'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/02/packet-protector.html' title='Packet Protector'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-4813885757654641037</id><published>2009-02-12T14:58:00.000-08:00</published><updated>2009-02-12T15:56:38.682-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Laptop Twinview Dual-external Displays</title><content type='html'>&lt;p&gt;I feel like I'm so close on this, but I'm just not getting it.  I mentioned &lt;a href="/2009/01/ode-to-compaq-8510w.html"&gt;my 8510w laptop setup&lt;/a&gt; previously, and how I have two xorg.conf files that I switch between, restarting X to configure using either my dual-external displays or my laptop display.  Well, I'm not satisfied with this setup.  I've been playing with xrandr and MetaModes and I can use xrandr to switch from the dual external displays to the single laptop display, and I can sort of switch back to the external displays, but it either only uses one of them and you can pan to view the whole dual-display-sized screen, or it uses the laptop display and one of the external displays.  Grr.&lt;/p&gt;

&lt;p&gt;Has anyone been able to get this to work?  I've seen mention of using refresh rates or EDID to somehow get this working, but I haven't seen any solid examples of what to do.  I've also seen suggestions to just use nvidia-settings.  That's a lot of clicking.  I'd love just a simple script to run.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-4813885757654641037?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/4813885757654641037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=4813885757654641037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4813885757654641037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4813885757654641037'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/02/laptop-twinview-dual-external-displays.html' title='Laptop Twinview Dual-external Displays'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-4812311307519169594</id><published>2009-02-09T22:18:00.000-08:00</published><updated>2009-02-12T15:56:59.004-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Web Site Stats Are Fun</title><content type='html'>&lt;p&gt;I hooked &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt; up to this blog and have had fun looking at all the stats in their different views.  I was about to do the same for my little family blog that I run on my home machine, when I realized that I have all the log files right there, I shouldn't need Google's crazy javascript to figure the stats out for me.  Cue &lt;a href="http://awstats.sourceforge.net/"&gt;awstats&lt;/a&gt;.  I combined advice from &lt;a href="http://ubuntu-tutorials.com/2008/01/16/configuring-awstats-on-ubuntu-server/"&gt;here&lt;/a&gt; and &lt;a href="http://www.petersblog.org/node/697"&gt;here&lt;/a&gt; to get it set up, and it wasn't too difficult.  It's cool to see where people are coming from (some friends of ours have blogs, and we didn't even know it!), and what crazy search terms people find our site with ("are fumes from rotten milk toxic?").  I know, web site stats are old news for most hardened bloggers, but I'm liking it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-4812311307519169594?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/4812311307519169594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=4812311307519169594' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4812311307519169594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4812311307519169594'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/02/web-site-stats-are-fun.html' title='Web Site Stats Are Fun'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-9134706360804973033</id><published>2009-02-05T11:25:00.000-08:00</published><updated>2009-02-05T11:36:10.601-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Phone on Fire</title><content type='html'>&lt;p&gt;Another interesting &lt;a href="http://www.lisaksimone.com/phoneonfire/"&gt;embedded systems blog&lt;/a&gt;.  The &lt;a href="http://www.lisaksimone.com/phoneonfire/2009/01/16/sample-chapter-from-if-i-only-changed-the-software-phone-on-fire/"&gt;sample chapter&lt;/a&gt; from her book was an entertaining read too.  I got a little impatient with the explanations to the, evidently, inexperienced co-worker and I just wanted to get to the end of the chapter to see that I was right about the cause of the bug.  The sloppy indentation was a little too much of a giveaway, if you ask me.  I first thought that it was a perfect argument against coding standards, seeing as how that buggy line wouldn't have stood out so much if it had been following the standard, but then I realized that if there was no standard (as I've seen somewhere before), then all the lines look equally sloppy and the bad ones never stick out like that (because the buggy code is always formatted incorrectly :-)&lt;/p&gt;

&lt;p&gt;Anyway, not your usual embedded systems reading material, in a very good way.  I'm glad the &lt;a href="http://www.ganssle.com/tem-back.htm"&gt;Embedded Muse&lt;/a&gt; pointed it out.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-9134706360804973033?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/9134706360804973033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=9134706360804973033' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/9134706360804973033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/9134706360804973033'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/02/phone-on-fire.html' title='Phone on Fire'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-421395906183435349</id><published>2009-02-02T21:40:00.000-08:00</published><updated>2009-02-03T19:28:10.698-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Bike Headlight</title><content type='html'>&lt;p&gt;It gets dark early up here in winter, so I've got a little more to say about flashlights.  About a year ago my wife and I sold my old Nissan Altima and I used the proceeds (and then some) to buy a nice bicycle for commuting to work.  At this time of year, when I first got the bike, it's just getting bright enough when I come home from work that I didn't need much of a headlight, so I thought I was all set up with the cheap headlight from Fred Meyer.  As winter came this year I quickly learned just how dark it gets by 5 PM up here in the northwest.  I needed a better headlight.&lt;/p&gt;

&lt;p&gt;Being the cost-conscious engineer that I am, I did my due diligence researching and looking around before I decided on a solution.  There was no way I wanted to pay upwards of a hundred dollars for a headlight.  For a while I thought about &lt;a href="http://www.instructables.com/tag/?q=bicycle+headlight&amp;limit%3Atype%3Aid=on&amp;type%3Aid=on&amp;type%3Auser=on&amp;type%3Acomment=on&amp;type%3Agroup=on&amp;type%3AforumTopic=on&amp;sort=none"&gt;making my own headlight&lt;/a&gt;, but then I found a website that talked all about using &lt;a href="http://www.bikeforums.net/archive/index.php/t-370258.html"&gt;flashlights as bicycle headlights&lt;/a&gt; (&lt;em&gt;UPDATE&lt;/em&gt;: safer for work link, with more ideas).  These were cheaper than the parts lists on instructables, more robust, and with this setup you could still easily use it as a regular hand-held flashlight when you weren't biking.  I was sold.  I headed down to our new Lowe's and got the Task Force 3 Watt LED Flashlight and some conduit hanger and rigged it all up:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2oYUaFZ6U14/SYfX_7ndIdI/AAAAAAAAAL0/yIDROqeeFdE/s1600-h/hpim0892.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_2oYUaFZ6U14/SYfX_7ndIdI/AAAAAAAAAL0/yIDROqeeFdE/s320/hpim0892.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5298440979959587282" /&gt;&lt;/a&gt;

&lt;p&gt;I used some &lt;a href="http://www.jbweld.net/products/jbweld.php"&gt;JB Weld&lt;/a&gt; to make sure the two hangers held together (at the enthusiastic recommendation of the Lowe's guy) and it works great.  The flashlight is really bright, especially for only $25.  The downside is that it rattles.  It's not just the batteries, as the website states, it's something inside the on/off switch endcap.  I haven't taken it apart to see if I can figure it out.  I love having a light that bright and the rattles don't bother me very much.  I worry more about blinding oncoming drivers.  It's awesome.&lt;/p&gt;

&lt;p&gt;I found a nice addition to my lighting system at Walmart not too many weeks later.  They sell a bunch of different Coleman flashlights using Cree XR-E LEDs (the instructables people concur that those are the best).  I bought a &lt;a href="http://www.walmart.com/catalog/product.do?product_id=10196615&amp;sourceid=1500000000000003260410&amp;ci_src=14110944&amp;ci_sku=10196615"&gt;headlamp&lt;/a&gt; for $25 that is even brighter than that Task Force from Lowe's.  I seriously could get by with just that on my rides home from work, but I use both now.  The Task Force is more focused and goes farther, the headlamp beam spreads out more and lights up the road right in front of me better.  With them both blazing I feel ready for the darkest of dark.  Lights are cool.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-421395906183435349?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/421395906183435349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=421395906183435349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/421395906183435349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/421395906183435349'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/01/bike-headlight.html' title='Bike Headlight'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2oYUaFZ6U14/SYfX_7ndIdI/AAAAAAAAAL0/yIDROqeeFdE/s72-c/hpim0892.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6346391396950804443</id><published>2009-01-29T09:53:00.000-08:00</published><updated>2009-01-29T14:55:05.649-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revision control'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Ode to the Compaq 8510w</title><content type='html'>&lt;p&gt;I got a sweet new laptop at work.  It's a &lt;a href="http://h10010.www1.hp.com/wwpc/us/en/sm/WF06a/321957-321957-64295-321838-3329741-3369263.html"&gt;Compaq 8510w&lt;/a&gt;. The Core 2 Duo T7500 is fast, 3 GB of RAM is luxurious, and the 1900x1200, 15.4 inch widescreen LCD is pretty.  I installed Ubuntu 8.10 and it sleeps (suspends to RAM) and wakes up like no other Linux box I've ever had, which is very, very nice (though the XO has started doing that with the latest update extremely well too).  I installed the corporate image of windoze XP under VirtualBox.  With the processor's virtualization extensions it runs pretty snappily.  I can watch the corporate propaganda WMV movies, use Lookout for calendaring, and access the internal IE-only "web" apps just fine.&lt;/p&gt;

&lt;p&gt;I went with VirtualBox instead of kvm this time, kind of just to see what the differences where.  I had to set up bridge networking because the corporate image didn't like not having a corporate IP address.  I hear the newest version of VirtualBox doesn't need this, but here is the script I run to set up bridged networking with the "old" version:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;brctl addbr br0
ifconfig eth0 0.0.0.0
brctl addif br0 eth0
dhclient br0
VBoxTunctl -b -u bryan
ifconfig tap0 up
brctl addif br0 tap0&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To remove the bridge and set it back to normal I do this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ifconfig tap0 down
VBoxTunctl -d tap0
ifconfig br0 down
brctl delbr br0
dhclient eth0&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I got help from &lt;a href="http://www.linuxfoundation.org/en/Net:Bridge"&gt;here&lt;/a&gt; and &lt;a href="http://home.nyc.rr.com/computertaijutsu/vboxbridge.html"&gt;here&lt;/a&gt; on this.  The scripts work well, except that Firefox gets confused when I switch back and forth.  That happens to Firefox when I VPN into work and then disconnect the VPN.  I'm sure there's a good explanation.&lt;/p&gt;

&lt;p&gt;The other really cool thing about this laptop is that with the docking station, it can drive two external monitors.  It's easy to do with the windoze nvidia driver, but with the Linux driver it wasn't as straightforward.  Mainly because the version of the nvidia driver that came with Intrepid (version 177) simply didn't support this option.  After getting some help from the other Linux lovers at work I realized that this was my problem.  Doing an &lt;code&gt;aptitude search nvidia&lt;/code&gt; showed that there was a more recent version available and a few older versions.  Thankfully it's a simple &lt;code&gt;aptitude install nvidia-glx-&amp;lt;version&amp;gt;&lt;/code&gt; to try a different version.  I tried version 180 to no avail, and then found that version 173 worked.&lt;/p&gt;

&lt;p&gt;The way I could tell it was working was by running nvidia-settings while docked and connected to the two external monitors and finally being able to see them under X Server Display Configuration.  You have to disable the Seiko LCD screen (DFP-0) to get the other two (DFP-1 and CRT-0, since there's one DVI and one VGA connector on the dock) configured and working with twinview.&lt;/p&gt;

&lt;p&gt;When I undock, the LCD screen stays blank.  If I manage to restart X then the display comes up on the laptop LCD, but it's still at the dual-display resolution that doesn't fit on the built-in LCD very well.  My solution was to &lt;code&gt;git tag&lt;/code&gt; (since I still keep &lt;a href="/2007/07/put-etc-under-revision-control-with-git.html"&gt;/etc under git&lt;/a&gt;) the dual display xorg.conf and then recreate the single built-in LCD xorg.conf and tag it too.  To switch between them when docking and undocking I created two scripts, one is called 'laptop' and looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh
cd /etc/ &amp;&amp; sudo git checkout xorg-laptop-display X11/xorg.conf&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The other is called 'external' and looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh
cd /etc &amp;&amp; sudo git checkout xorg-external-dual-display X11/xorg.conf&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It works pretty well, but I still have to restart X after running the scripts.  I've heard of this cool thing called &lt;a href="http://www.x.org/wiki/Projects/XRandR"&gt;XRandR&lt;/a&gt;, but it seems like I read that the nvidia driver doesn't Just Work with xrandr.  I need to look into that some more.&lt;/p&gt;

&lt;p&gt;So, my work satisfaction went up when I got this machine.  I never thought I'd want a large "mobile workstation" laptop like this, but when I think about how fast and nice it is, it doesn't feel nearly so heavy to carry.  I should probably disclose that I may happen to work for the same galactic corporation that makes this laptop, but I'm in a totally different part of the galaxy, far from where laptops are made.  There is absolutely no bias in this endorsement at all.  And nevermind that I would not have considered shelling out for such a nice machine myself :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6346391396950804443?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6346391396950804443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6346391396950804443' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6346391396950804443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6346391396950804443'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/01/ode-to-compaq-8510w.html' title='Ode to the Compaq 8510w'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-489741421397088485</id><published>2009-01-22T18:42:00.000-08:00</published><updated>2009-01-22T19:58:27.590-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>End of the Flashlight Story</title><content type='html'>Sorry it's been so long.  I did play with my &lt;a href="/2008/12/flashlight-schematic.html"&gt;flashlight&lt;/a&gt; some more.  I did exactly what I said I was thinking about doing at the end of that last entry, cutting traces and soldering on new wires, but since the wire I used was so thick there was no way it was going to fit back inside the case.  I gave myself credit for fixing it anyway.

Not long after I read about &lt;a href="http://www.evilmadscientist.com/article.php?story=edgelitcards"&gt;edge-lit holiday cards&lt;/a&gt;.  They looked so cool in the pictures I had to try it.  My wife scratched her best wintery scene on some acrylic that I paid waaaay too much for at Michael's and I taped together the light source, using one of the LEDs from my flashlight (yep, I broke it again).  I think the acrylic from Michael's was too thick and hard to scratch, and looking at the original instructions again, I'm seeing that they used much smaller pieces too.  Ours didn't light up nearly as well.  It was fun though.  Here's how it turned out:

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2oYUaFZ6U14/SXkzM9kTMVI/AAAAAAAAALI/2OLQVvqpdlA/s1600-h/hpim0936.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_2oYUaFZ6U14/SXkzM9kTMVI/AAAAAAAAALI/2OLQVvqpdlA/s320/hpim0936.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5294319134728991058" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2oYUaFZ6U14/SXkzaGyIiQI/AAAAAAAAALQ/jv3bp4gkIl4/s1600-h/hpim0934.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_2oYUaFZ6U14/SXkzaGyIiQI/AAAAAAAAALQ/jv3bp4gkIl4/s320/hpim0934.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5294319360541231362" /&gt;&lt;/a&gt;

I know, not too impressive of a lighting job.  The photography could use some help too, but I had to document it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-489741421397088485?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/489741421397088485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=489741421397088485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/489741421397088485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/489741421397088485'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2009/01/end-of-flashlight-story.html' title='End of the Flashlight Story'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2oYUaFZ6U14/SXkzM9kTMVI/AAAAAAAAALI/2OLQVvqpdlA/s72-c/hpim0936.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-4211141762143872799</id><published>2008-12-11T21:51:00.001-08:00</published><updated>2009-01-22T18:42:10.630-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>A Flashlight Schematic</title><content type='html'>&lt;p&gt;Well, I took &lt;a href="/2008/11/flashlight-story.html"&gt;the broken flashlight&lt;/a&gt; to work.  I have colleagues there who are genius electrical engineers and one in particular, Sam, had a fun time with this challenge.  I explained to him the situation and handed him the circuit board.  He peered closely at the board, rotating it round and round as he traced all the connections.  As he did so he made notes on my whiteboard and after a few minutes he had deciphered the full schematic of the circuit and it's intended operation.&lt;/p&gt;

&lt;p&gt;We then hooked up a bench power supply and took some measurements (with a much nicer multimeter than I have at home).  We measured
2.45 mA of current flowing when 6V is connected and the lights are
off.  At 220 mA hours of battery life:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;220/2.45 = 89.79 hours

89.79 hours / 24 hours/day = 3.74 days&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Which totally correlates with my experimental data.  Here's the schematic for your viewing pleasure (click to make it bigger):&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2oYUaFZ6U14/SUIB8E72yoI/AAAAAAAAAJY/50m0MfMXBGY/s1600-h/flashlight_schematic.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_2oYUaFZ6U14/SUIB8E72yoI/AAAAAAAAAJY/50m0MfMXBGY/s320/flashlight_schematic.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5278783844860217986" /&gt;&lt;/a&gt;

&lt;p&gt;You can see
some measurements we took and a curve for the diodes.  Yes, it drew a lot more current from the bench supply than it did from batteries.  We started with
those diode equations but didn't end up going anywhere with them.  Sam
thought maybe the transistors weren't turning all the way off so he
soldered resistors between the gate and drain (or was that the source...it's been a while since I've had to know that) to pull the gate
voltage up higher and force it into cut-off, but that didn't help.  Then we just measured
voltage across R1 (going into the chip U1) and calculated the current
through it and it turned out to be 2.45 mA.  We probably should have done that
first, but oh well.  It was fun even if we couldn't fix it right there.&lt;/p&gt;

&lt;p&gt;I've been thinking about going to radio shack and looking for another small switch to use.  You see, I don't really need three modes.  On and off would be fine, so I could just put a new switch in series with the batteries, cut the trace to the chip, and bypass the transistors, just making it a simple battery, switch, resistor, LED circuit.  That would be nice and simple and just as effective.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-4211141762143872799?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/4211141762143872799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=4211141762143872799' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4211141762143872799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4211141762143872799'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/12/flashlight-schematic.html' title='A Flashlight Schematic'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_2oYUaFZ6U14/SUIB8E72yoI/AAAAAAAAAJY/50m0MfMXBGY/s72-c/flashlight_schematic.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-5894865202165108919</id><published>2008-11-26T07:15:00.000-08:00</published><updated>2008-12-03T07:57:53.733-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>A Flashlight Story</title><content type='html'>&lt;p&gt;Back in May of this year, in preparation for a campout, I bought a nice looking LED headband flashlight at Walmart.  It's a &lt;a href="http://www.garritylites.com/"&gt;Garrity&lt;/a&gt; light and it ran me about $13.  I used it on the campout and fell in love.  It was incredibly light-weight and I soon forgot it was on my head, yet it was plenty bright (click these images for larger versions).&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2oYUaFZ6U14/SS10MogZQeI/AAAAAAAAAIA/bDuTKbM4jQU/s1600-h/hpim0860.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_2oYUaFZ6U14/SS10MogZQeI/AAAAAAAAAIA/bDuTKbM4jQU/s320/hpim0860.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5272998499101262306" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2oYUaFZ6U14/SS10ZmQlgFI/AAAAAAAAAII/CPFBjOBkn8g/s1600-h/hpim0862.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_2oYUaFZ6U14/SS10ZmQlgFI/AAAAAAAAAII/CPFBjOBkn8g/s320/hpim0862.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5272998721836384338" /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;After the campout it sat in a drawer for a few days before I had occasion to use it again.  When I pulled it out of said drawer and pushed the button to turn it on, nothing happened.  Saddened, I figured it must have been bumped and turned on while in the drawer or maybe one of my boys had found it and left it on.  I bought new batteries and used it while performing some bicycle maintenance in my dimly lit garage late one night.  I put it away high on a shelf away from any bumps or curious hands afterwords.  A few days later, the batteries were dead again.  I've gotta return this defective thing to Walmart, I thought to myself, but never found the time.  Here it is 6 months later, I have not package nor receipt, and I'm afraid I still don't have the desire to venture back into Walmart only to be rejected for my $13 return.&lt;/p&gt;

&lt;p&gt;Instead, I decided that there was a remote chance I could fix it myself.  Even with my basic EE knowledge and caveman electrical tools (Radio Shack multi-meter) I should be able to figure this out, I figured.  It's just a flashlight.  The obvious thing would be a short, right?  I extracted the light from the headband:&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2oYUaFZ6U14/SS10mAczmaI/AAAAAAAAAIQ/uB-RDbGUxhs/s1600-h/hpim0864.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_2oYUaFZ6U14/SS10mAczmaI/AAAAAAAAAIQ/uB-RDbGUxhs/s320/hpim0864.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5272998935025392034" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And opened up the back.&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2oYUaFZ6U14/SS11dYa4PrI/AAAAAAAAAIg/oCD0XCVffI8/s1600-h/hpim0865+(Modified+in+GIMP+Image+Editor).jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 314px;" src="http://1.bp.blogspot.com/_2oYUaFZ6U14/SS11dYa4PrI/AAAAAAAAAIg/oCD0XCVffI8/s320/hpim0865+(Modified+in+GIMP+Image+Editor).jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5272999886352563890" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Probing the battery connections, I discovered that with the flashlight sitting off there was 77.5 kOhms of resistance between the two pads, not a &lt;em&gt;completely&lt;/em&gt; open circuit, right?  That's gotta be it.  I inserted some new batteries with the multimeter in series and there was no current draw.  Hmm.  Well, it takes two CR2032 batteries for a voltage of 6V.  I don't know what to use for their internal resistance, but even assuming none, V/R give us:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;6V / 77500 Ohms = 77.4 microamps.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;My meter doesn't exactly go into the microamp range so maybe...  Another thing to consider is this isn't a mechanical switch so maybe that's not a straight up resistance I was measuring anyway.  I found a datasheet online just for furn and read that these little batteries have a 220 mAh capacity.  I believe the calculation for two batteries supplying 77.4 microamps would be (Note the correction: two batteries in series does not double the current.  Thanks, Nols):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(.220 &lt;strike&gt;* 2&lt;/strike&gt; Ah) / .0000774 amps = &lt;strike&gt;5684.75&lt;/strike&gt; 2842.38 hours&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So that &lt;em&gt;could&lt;/em&gt; be draining the batteries while the light is off, but it would take more than a couple days.  Maybe that's not actually the problem.  For fun I measured the current used when the light was on.  The numbers weren't as memorable and I wasn't thinking blog entry at that point, so I didn't write them down.  I think it was about 60 milliamps on the low setting and 100 milliamps on the high setting.  Nothing outrageous.&lt;/p&gt;

&lt;p&gt;I decided to take it apart.  It was a tight little package with no screws, and no good place to pry.  After a few minute of frustration I hit it with a blunt object and out popped this black plastic piece:&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2oYUaFZ6U14/SS11uNb7zvI/AAAAAAAAAIo/Qzz4AyOcyhw/s1600-h/hpim0866.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_2oYUaFZ6U14/SS11uNb7zvI/AAAAAAAAAIo/Qzz4AyOcyhw/s320/hpim0866.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5273000175461977842" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then I pried out the circuit board.&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2oYUaFZ6U14/SS11-WNRFqI/AAAAAAAAAIw/-fmSiMgyBRk/s1600-h/hpim0867+(Modified+in+GIMP+Image+Editor).jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 262px;" src="http://2.bp.blogspot.com/_2oYUaFZ6U14/SS11-WNRFqI/AAAAAAAAAIw/-fmSiMgyBRk/s320/hpim0867+(Modified+in+GIMP+Image+Editor).jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5273000452694283938" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2oYUaFZ6U14/SS12GBC7DhI/AAAAAAAAAI4/GmIDxaV_4YE/s1600-h/hpim0869+(Modified+in+GIMP+Image+Editor).jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 178px;" src="http://3.bp.blogspot.com/_2oYUaFZ6U14/SS12GBC7DhI/AAAAAAAAAI4/GmIDxaV_4YE/s320/hpim0869+(Modified+in+GIMP+Image+Editor).jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5273000584452705810" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And at this point I'm kind of at the end of my EE rope.  I don't see any obvious shorts sucking current out of my batteries (and my multimeter didn't find any either).  I see some transistors, resistors, and caps that are likely the constant current driver circuit for the LEDs (maybe similar to &lt;a href="http://www.instructables.com/id/Circuits-for-using-High-Power-LED_s/?ALLSTEPS#step6"&gt;this one, even&lt;/a&gt;), and then a blob of epoxy covering something else mysterious but probably benign, and that's about it.  No fix, but at least I have some really bright LEDs to play with.&lt;/p&gt;

&lt;p&gt;If you have any suggestions on how to debug or fix my battery sucking flashlight feel free to chime in down in the comments.  If you are from Garrity, I will blog about how amazing it was that you found my blog and how nice you were to send me a new flashlight. :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-5894865202165108919?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/5894865202165108919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=5894865202165108919' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5894865202165108919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5894865202165108919'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/11/flashlight-story.html' title='A Flashlight Story'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_2oYUaFZ6U14/SS10MogZQeI/AAAAAAAAAIA/bDuTKbM4jQU/s72-c/hpim0860.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-416234301193013523</id><published>2008-11-09T21:58:00.000-08:00</published><updated>2008-11-09T22:47:08.387-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Carefully Upgrading to Django 1.0</title><content type='html'>&lt;p&gt;I&amp;#8217;m a little behind, but I finally upgraded my family website to &lt;a href="http://www.djangoproject.com/weblog/2008/sep/03/1/"&gt;Django 1.0&lt;/a&gt;.  First of all, I wanted to keep the main site running my older version of django from subversion while having 1.0 installed and being used by the development version.  First I added the old install to my apache configuration&amp;#8217;s PythonPath.  Here&amp;#8217;s the diff:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-   PythonPath "['/home/bryan/web/murdockfamily'] + sys.path"
+   PythonPath "['/home/bryan/web/django_src', '/home/bryan/web/murdockfamily'] + sys.path"&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;Then I deleted the symlinks to that django install from any site-packages locations:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo rm /usr/lib/python2.4/site-packages/django /usr/lib/python2.5/site-packages/django /usr/local/lib/python2.5/site-packages/django&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;Then reloaded apache:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo /etc/init.d/apache2 reload&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;And it seemed to still work.&lt;/p&gt;

 &lt;p&gt;Next I untarred Django 1.0, and installed it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tar -zxvf /home/bryan/downloads/Django-1.0.tar.gz
cd Django-1.0
python setup.py build
sudo python setup.py install&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;I restarted apache again at this point to make sure the production site was still running.  Thankfully, it was.&lt;/p&gt;

 &lt;p&gt;Then I started up the development server in the development branch of the family website and saw it fail while trying to use Django 1.0.  Sweet.  Just for sanity&amp;#8217;s sake I did this to make sure it still worked with the old version:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ PYTHONPATH=/home/bryan/web/django_src ./manage.py runserver 10.0.0.10:8080
Validating models...
0 errors found&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;And the world is still sane.  The next step, of course, will be to fix those errors I got when starting the development server with Django 1.0.  I&amp;#8217;ll let you know how that goes.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-416234301193013523?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/416234301193013523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=416234301193013523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/416234301193013523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/416234301193013523'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/11/carefully-upgrading-to-django-10.html' title='Carefully Upgrading to Django 1.0'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8266779593055314972</id><published>2008-11-03T21:58:00.000-08:00</published><updated>2008-11-04T17:31:00.830-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><title type='text'>Convert a PostgreSQL Database from LATIN1 to UTF8</title><content type='html'>&lt;p&gt;I had a problem with my family django-powered website.  I have an aggregator for all our friends blogs, very similar to the &lt;a href="http://www.djangoproject.com/community/"&gt;Django aggregator&lt;/a&gt;, except that mine hasn&amp;#8217;t been aggregating.  After some serious investigation, I found that psycopg was barfing error messages because the feeds that were being stuffed into my postgresql database contained utf-8 characters that it couldn&amp;#8217;t figure out how to convert into latin1 characters.  I hadn&amp;#8217;t paid any attention to this, but apparently my blog database was using latin1.  Lame.  I decided it was time to learn how to convert it to utf-8.&lt;/p&gt;

 &lt;p&gt;First, I did a pg_dumpall in order to get a look at things (this happens automatically every night, actually):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/usr/bin/pg_dumpall -U &amp;lt;special user&amp;gt; &amp;gt; /home/bryan/backups/all.dbs.out&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;Sure enough, my database was created like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;CREATE DATABASE bryan WITH TEMPLATE = template0 OWNER = bryan ENCODING = 'LATIN1';&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;So, I dumped just that database:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;pg_dump -U &amp;lt;special user&amp;gt; bryan &amp;gt; bryan.dbs.out&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;Then I converted it to utf-8 with iconv:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;iconv --from-code latin1 --to-code utf-8 bryan.dbs.out &amp;gt; bryan.dbs.out.utf8&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;Then I dropped the lame old latin1 database, after shutting down apache2:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo /etc/init.d/apache2 stop
dropdb bryan&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;Then I created the shiny new utf-8 database, using the command from the pg_dumpall output, with a slight change:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;psql -U &amp;lt;special user&amp;gt; bryan &lt; "CREATE DATABASE bryan WITH TEMPLATE = template0 OWNER = bryan ENCODING = 'UTF8';"&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;Then I restored the converted backup:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;psql -U &amp;lt;special user&amp;gt; bryan &lt; bryan.dbs.out.utf8&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;After starting up apache2 again:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo /etc/init.d/apache2 start&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;The website looked just like it did before.  Phew!&lt;/p&gt;

&lt;p&gt;Next I ran my &lt;a href="http://code.djangoproject.com/browser/djangoproject.com/django_website/apps/aggregator/bin/update_feeds.py"&gt;update_feeds.py&lt;/a&gt; script and my aggregator aggregated, which was really awesome to see.  I have some serious reading to catch up on now.&lt;/p&gt;

 &lt;p&gt;References:&lt;/p&gt;

 &lt;ol&gt;
  &lt;li&gt;&lt;a href="http://archives.postgresql.org/pgsql-general/2006-03/msg01259.php"&gt;http://archives.postgresql.org/pgsql-general/2006-03/msg01259.php&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.postgresql.org/docs/8.2/interactive/backup-dump.html"&gt;http://www.postgresql.org/docs/8.2/interactive/backup-dump.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.postgresql.org/docs/8.2/interactive/manage-ag-dropdb.html"&gt;http://www.postgresql.org/docs/8.2/interactive/manage-ag-dropdb.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.postgresql.org/docs/8.2/interactive/manage-ag-createdb.html"&gt;http://www.postgresql.org/docs/8.2/interactive/manage-ag-createdb.html&lt;/a&gt;&lt;/li&gt;
 &lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8266779593055314972?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8266779593055314972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8266779593055314972' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8266779593055314972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8266779593055314972'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/11/convert-postgresql-database-from-latin1.html' title='Convert a PostgreSQL Database from LATIN1 to UTF8'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8398806049152020922</id><published>2008-10-15T22:39:00.000-07:00</published><updated>2008-10-15T22:44:13.366-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Linux Programmer’s Manual on Ubuntu</title><content type='html'>&lt;p&gt;I typed &lt;code&gt;man sscanf&lt;/code&gt; on my Ubuntu 8.04.1 system at home and was shocked to see this reply:&lt;/p&gt;

&lt;blockquote&gt;No manual entry for sscanf&lt;/blockquote&gt;

&lt;p&gt;Never had a UNIX or UNIX-like system ever left me out in the cold like this without help.  Fortunately, I found &lt;a href="http://ubuntuforums.org/showthread.php?t=74868"&gt;where to get the manpages&lt;/a&gt;.  Just &lt;code&gt;sudo aptitude install manpages-dev&lt;/code&gt; and everything is all better.  Phew.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8398806049152020922?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8398806049152020922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8398806049152020922' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8398806049152020922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8398806049152020922'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/10/linux-programmers-manual-on-ubuntu.html' title='Linux Programmer’s Manual on Ubuntu'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-4459105328488140178</id><published>2008-10-13T22:42:00.000-07:00</published><updated>2008-10-13T22:51:26.489-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Stack Overflow: Pretty Impressive</title><content type='html'>&lt;p&gt;Every now and then I check up on what &lt;a href="http://www.joelonsoftware.com/"&gt;Joel&lt;/a&gt; has to say, and I recently discovered that this &lt;a href="http://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt; website is now up and running.  I tested it out this evening by asking a simple little C++ question that I was feeling too lazy to look up.  The first nice thing was that I didn't have to register.  After I typed my question, I only had to type in a username and email address and it just posted my question without bothering me further.  Nice.  Then I waited a couple minutes and hit "reload" on the page and lo and behold, three answers had already appeared.  Within 5 minutes I had 4 answers.  None were quite what I was looking for (not really fair that I kind of already knew the answer and was fishing at this point), so I edited my question, started typing this blog post, and then hit "reload" again and saw another answer trying harder to fit my criteria.  Fast results.  I'm impressed.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-4459105328488140178?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/4459105328488140178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=4459105328488140178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4459105328488140178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4459105328488140178'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/10/stack-overflow-pretty-impressive.html' title='Stack Overflow: Pretty Impressive'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1939061063150012109</id><published>2008-09-05T06:58:00.000-07:00</published><updated>2008-09-05T08:10:05.880-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python For "One-Hour" Scripts</title><content type='html'>&lt;p&gt;I wrote a "quick" script at work yesterday.  I always have to put "quick" in quotes when I do this.  I try to be good and write code to automate repetitive tasks that I do.  Many others have advocated this and I find it to be very good advice, especially if you are a programmer.  For me it usually happens like this:  I'm doing something repetitive or tedious and I think, hey, I could spend an hour and write a script to do this.  Over my career I've used Perl, shell scripts, and Python to do this.  In that order.  Yes, I learned Perl before I learned shell scripting (bash and korn shell on HP-UX), and no, Python hasn't completely replaced shell scripting, but I've all but abandoned Perl (and for my real firmware work I program in C++, just so you know).&lt;/p&gt;

&lt;p&gt;Whenever this happens it always takes more than an hour to write one of these "one-hour scipts."  Yes, I'll confess.  Sometimes much longer.  With Perl most tasks would only require a few lines of code that I could write in 15 minutes, and those  few lines would be syntactically correct and would do &lt;em&gt;close&lt;/em&gt; to what I wanted.  Then it would always take me about three more hours to get them to do exactly what I wanted, usually because of some idiomatic Perl subtlety.  Modifying or even just reading scripts later was painful too.  It was pretty frustrating but I learned a lot and I did improve, but not by a whole lot.  Shell scripts take me longer to get code that is actually syntactically correct and runs, but once I get there it is usually doing what I want.  I don't write enough of shell scripts to memorize when you use brackets after an if, and just what the spacing should be around them and the stuff inside, where do I need a semi-colon, what grep or sed options do I need, and so forth.  They syntax for shell scripts (and chaining the various UINX tools together inside said scripts) is really hostile.  One-hour shell scripts take about as long as one-hour Perl scripts did.  Reading them later isn't &lt;em&gt;as&lt;/em&gt; bad a Perl.&lt;/p&gt;

&lt;p&gt;Python, on the other hand is really, really nice.  The syntax is so clean and the built-in libraries and functions are so handy.  Even when months go by without me writing one of my "one-hour scripts" I can get back into Python easily.  I can even modify and re-use methods from other scripts I've written without having to pour over them trying to figure out what the code is doing.  I think I probably could even finish those one-hour scripts in an hour, but it's funny, I usually still take as much time as I used to with Perl or Bash.  I'm usually spending the extra time, and this is embarrassing, cleaning up the script and making it "production" worthy, or just trying out new things.  You know, refactoring, adding command-line options with &lt;a href="http://docs.python.org/lib/module-optparse.html"&gt;optparse&lt;/a&gt;, adding docstrings so I can run pydoc on my script and have it produce pretty documentation, generalizing and moving code into modules that other one-hour scripts can import, replacing for loops with list comprehensions or generator expressions, stuff like that.  It's downright ridiculous to do for these one-off throw-away one-hour scripts, but it's good practice, right?  It's way more fun that debugging Perl or Bash was, and I'm learning stuff, and it's still within the "one-hour script" time budget, so it's all good.&lt;/p&gt;

&lt;p&gt;The funny thing is, writing Python has helped my C++ coding too.  Object oriented or functional programming techniques that are possible in C++ are drop-dead simple in Python.  I've been able to easily try out and get comfortable with the concepts in these little Python scripts first, and then go tackle the same concept in C++ with it's much more cumbersome syntax.  I may be the only firmware engineer who has written my own functor or used a back_inserter.  How cool is that? (no really, I'm not sure...is it cool if nobody else can understand my code?  Hmmm...)&lt;/p&gt;

&lt;p&gt;In the end, I know, this is probably old news for many of you, but Python rocks.  Go spend an hour and automate something tedious with it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1939061063150012109?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1939061063150012109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1939061063150012109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1939061063150012109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1939061063150012109'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/09/python-for-one-hour-scripts.html' title='Python For &quot;One-Hour&quot; Scripts'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-3270280304144738923</id><published>2008-08-30T21:44:00.000-07:00</published><updated>2008-08-30T22:01:46.990-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lart'/><title type='text'>Less Awful Resume Tool</title><content type='html'>&lt;p&gt;If you read Steve Yegge's &lt;a href="http://steve-yegge.blogspot.com/2007/09/ten-tips-for-slightly-less-awful-resume.html"&gt;Ten Tips for a (Slightly) Less Awful Resume&lt;/a&gt;, you'll notice that he lists various words and phrases that you should avoid using in your resume.  I was re-reading that hilarious, uncouth, yet insightful blog entry a couple days ago and started sweating that I might have a Weasel Word or two in my own resume.  This could happen purely by accident, of course (we all get sloppy now and then, right?), so this obviously called for an automated tool.  As a result, I present to you the Less Awful Resume Tool, or, lart.&lt;/p&gt;

&lt;p&gt;lart is a simple tool (written in Python) that searches a text file (ideally your resume) for those words and phrases called out in Steve Yegge's essay, and alerts you to their presence.  I have claimed no copyright over this work, and the code is hosted at the &lt;a href="http://gitorious.org/projects/lart"&gt;Less Awful Resume Tool&lt;/a&gt; project on gitorious.  You can do a git pull as instructed there to get the code, or &lt;a href="http://gitorious.org/projects/lart/repos/mainline/archive/dcc3c294488b555cf19e816a6274c39cd4f70008.tar.gz"&gt;download a tarball&lt;/a&gt;.  There's no installation, it's just one file that you run as a command-line application, passing it a text version of your resume (which is the only version you need, according to the essay).  If you'd like me to add a feature or fix a bug, feel free to send me a &lt;a href="http://gitorious.org/projects/lart/repos/mainline/merge_requests/new"&gt;merge request&lt;/a&gt; (or just leave a comment here if that's easier).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-3270280304144738923?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/3270280304144738923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=3270280304144738923' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3270280304144738923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3270280304144738923'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/08/less-awful-resume-tool.html' title='Less Awful Resume Tool'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6076163155784174454</id><published>2008-08-18T07:11:00.000-07:00</published><updated>2008-09-15T21:36:29.159-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Bad Vibrations</title><content type='html'>Having seen &lt;a href="http://www.evilmadscientist.com/article.php/bristlebot"&gt;Bristlebot&lt;/a&gt;, I thought I knew exactly what I was looking for as I carefully disassembled my Samsung SGH-C417 phone.  You see, it had accidentally gone for a ride in the washing machine and after quickly removing the battery, and then patiently letting it dry for a few days, it still wouldn't stop vibrating.  Everything else worked fine, so I figured I'd open it up, find the little motor that looks like the one powering the Bristlebot, cut the wires to it, and then I'd still have a working cell phone.  Here are some pics of what I saw once I opened it up:

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2oYUaFZ6U14/SLeCXGL0N0I/AAAAAAAAAGM/DXMKlwtmKr8/s1600-h/hpim0674.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_2oYUaFZ6U14/SLeCXGL0N0I/AAAAAAAAAGM/DXMKlwtmKr8/s400/hpim0674.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5239800024777635650" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2oYUaFZ6U14/SLeCD7sg4wI/AAAAAAAAAGE/Obq7a_n37A0/s1600-h/hpim0675.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_2oYUaFZ6U14/SLeCD7sg4wI/AAAAAAAAAGE/Obq7a_n37A0/s400/hpim0675.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5239799695544476418" /&gt;&lt;/a&gt;

Can you see the little DC motor?  I couldn't either, and as I fought with stubborn little screws and plastic tabs to uncover more of its innards, I became more frustrated with this little phone.  I could still power it up and feel it vibrating the whole time, but I could not pinpoint where it was coming from.  I definitely could not see a spinning motor anywhere.  After a while, the last part to look under was the board with the LCD screen embedded in it.  It was getting late and I couldn't see any way to carefully remove it, so in frustration I just put my screwdriver tip under it and pried.  The ribbon cable to the camera lens tore and the wires to the speaker broke.  The other battery or speaker looking thing remained attached and it finally caught my eye.  "Could that be it?" I questioned.  There was nothing under the board.  "How could it be?" I agonized, but sure enough, when I connected the battery to the main board and powered on the phone, that's exactly what started vibrating.  It had been in plain site within easy reach of my wire cutters from the moment I had pried apart the plastic cover, but I hadn't questioned what it was.  Like the befuddled Stormtrooper, I only knew that it wasn't the DC motor I was looking for.

Here's a closer look at the battery/speaker looking vibration source:

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2oYUaFZ6U14/SLeExWPG8FI/AAAAAAAAAGc/Lua6INaw6kg/s1600-h/hpim0684.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_2oYUaFZ6U14/SLeExWPG8FI/AAAAAAAAAGc/Lua6INaw6kg/s400/hpim0684.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5239802674786267218" /&gt;&lt;/a&gt;

After this failed repair job, I soothed my bruised embedded systems engineering ego by taking the cell phone parts to work and arraying them on my desk.  As interested engineers stopped to paw through the mess I asked each of them to identify what makes it vibrate.  Very few figured it out without my help, even though most of us firmware engineers have hardware experience in our past.  A couple EEs where stumped for a bit too, which was very consoling.  I still don't know exactly what that part is called or how it works.  Is it a solenoid relay that is rapidly switched on and off?  Feel free to educate me in the comments. 

I guess the moral of the story is to remove all pre-conceived notions when you enter a debugging task and question everything you don't understand.  Or maybe it's just that you should check your pockets before putting your pants in the wash.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6076163155784174454?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6076163155784174454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6076163155784174454' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6076163155784174454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6076163155784174454'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/08/bad-vibrations.html' title='Bad Vibrations'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2oYUaFZ6U14/SLeCXGL0N0I/AAAAAAAAAGM/DXMKlwtmKr8/s72-c/hpim0674.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-3118497631048599052</id><published>2008-08-13T16:53:00.001-07:00</published><updated>2008-08-26T20:52:03.228-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><title type='text'>Open Office Stupidity</title><content type='html'>&lt;p&gt;If you receive a document as an attachment, open that attachment, start editing, and then click save, guess what happens?  You work is quietly saved in a file in &lt;code&gt;/tmp&lt;/code&gt;.  Guess what happens when you try to find that important file later?  Sure, it shows up in the menu under File-&gt;Recent Documents, but when you select it, it has likely been deleted, as is the fate of most files left in &lt;code&gt;/tmp&lt;/code&gt; for too long.  Wonderful.&lt;/p&gt;

&lt;p&gt;This happened to my brother-in-law (a non-geek who has successfully been using Linux for a couple years now, well, until now, I guess) a couple weeks ago resulting in the loss of some hard work of his, and I almost let it happen to me today.  Couldn't we make our apps a little smarter?  If it's running on a UNIX like system, would it hurt to make it aware that &lt;code&gt;/tmp&lt;/code&gt; is not a safe place to save its user's files?  Could it at least give people a little warning before doing so?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UPDATE&lt;/em&gt;:  I don't know what happened, but I received an attachment today and Open Office 2.4.1 and Firefox 3.0.1 on my Ubuntu 8.04.1 system opened it read-only, with only a "save as" option available.  It wouldn't even let me edit the document before doing the save as.  This is excellent and exactly how I think it should work.  For the record, a quick search leads me to believe that &lt;a href="https://bugs.launchpad.net/ubuntu/+source/firefox/+bug/15179"&gt;Firefox changed&lt;/a&gt; to save temporary files as read-only.  One can only hope other mail clients do something similar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-3118497631048599052?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/3118497631048599052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=3118497631048599052' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3118497631048599052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3118497631048599052'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/08/open-office-stupidity.html' title='Open Office Stupidity'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1077004218595498826</id><published>2008-07-25T22:19:00.000-07:00</published><updated>2008-07-25T22:23:55.170-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='family'/><title type='text'>4,600 Miles in Two Weeks</title><content type='html'>&lt;p&gt;My wife is from Oklahoma and we currently reside in Vancouver, WA.  We don’t get to see her family out there in the midwest very often and we just missed a trip out there in April due to the stomach flu (long, messy story).  Since April our youngest has turned 2 thereby raising the price of airline tickets for our family by another $500 or so.  We also recently purchased a nice new minivan.  All of this coalesced into a decision to pack up our three boys and drive to visit her family.  We took it in two weeks, visiting friends and other family members along the way, and it was quite an adventure.  Even with the price of gas these days it was less expensive than flying us all and renting a van for the time we would have been there.  In fact, gas got cheaper the farther we got from Washington.  Those Oklahomans have it pretty good at $3.87 or so a gallon.&lt;/p&gt;

&lt;p&gt;We had a really fun time and connected with a lot of people that we hadn’t seen in a while.  It is especially fun to see your kids hit it off with your friends and relatives and their kids, even when they’ve never met before.  We also saw first hand just how big and diverse America is (or, half of it, at least), from the evergreens in Washington, to the mountains of Utah, the desolate high desert of southern Wyoming, the endless plains of east Colorado and Kansas, and the rolling green hills of Oklahoma.  Occasionally I thought about the people that walked some of that same route 150 or more years ago and it boggled my mind.&lt;/p&gt;

&lt;p&gt;For me personally, it was nice to hardly think about work for two straight weeks.  I’ve never taken that much time consecutively before, and it felt good.  It’s good to be home and sleep in my own bed after that as well.  As I sit at my computer at work my neck feels stiff and I occasionally get the feeling that I’m moving.  Visions of endless highways flash before my eyes.  Long range truckers have my respect.  Even if they don’t drive with three energetic boys in the back seats, driving is tedious.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1077004218595498826?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1077004218595498826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1077004218595498826' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1077004218595498826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1077004218595498826'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/07/4600-miles-in-two-weeks.html' title='4,600 Miles in Two Weeks'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1783149751469182880</id><published>2008-06-26T22:36:00.000-07:00</published><updated>2008-06-27T22:08:56.515-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='olpc'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>XO Post Upgrade</title><content type='html'>&lt;p&gt;When you run &lt;a href="http://wiki.laptop.org/go/Olpc-update"&gt;olpc-update&lt;/a&gt; to upgrade the software on your XO laptop, you lose some of your customizations (which I &lt;a href="/2008/06/upgrade-xo-to-build-703.html"&gt;just did&lt;/a&gt;).  Here's what I've customized so I have a quick reference to get it all back next time.&lt;/p&gt;

&lt;p&gt;Set the &lt;a href="http://wiki.laptop.org/go/Sugar-Control-Panel#Setting_The_Timezone"&gt;timezone&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;su
sugar-control-panel -s timezone 'America/Los_Angeles'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Set a root password:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;su -l
passwd
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This allows me to ssh to the XO (as root, I know, I know) which at least allows me to use my nice desktop keyboard and monitor to do most of the rest.  I tried setting the user account password instead once, but it seems like Sugar wouldn't start after that.  &lt;a href="http://wiki.laptop.org/go/Remote_display#Preparations"&gt;This page seems&lt;/a&gt; to indicate that you should be able to do that (now?) though.  I'll have to try it again.&lt;/p&gt;

&lt;p&gt;Set up &lt;a href="http://bc.tech.coop/blog/080128.html"&gt;quake terminal&lt;/a&gt; (scroll down the page a bit).  I keep a copy of the quake_terminal.txt file in my home directory on the laptop.  To set it up I just do this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;su -l
cp /home/olpc/quake_terminal.py /usr/share/sugar/shell/view/quake.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/p&gt;Then apply this patch to &lt;code&gt;/usr/share/sugar/shell/view/keyhandler.py&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;--- keyhandler.py.beforequaketerm 2008-06-25 07:26:44.000000000 -0700
+++ keyhandler.py 2008-06-25 07:26:04.000000000 -0700
@@ -22,6 +22,8 @@ import subprocess
 import dbus
 import gtk
 
+import quake
+
 from hardware import hardwaremanager
 from model.shellmodel import ShellModel
 from sugar._sugarext import KeyGrabber
@@ -32,6 +34,7 @@ _BRIGHTNESS_MAX = 15
 _VOLUME_MAX = 100
 
 _actions_table = {
+    '&lt;ctrl&gt;Down'     : 'quake_term',
     'F1'             : 'zoom_mesh',
     'F2'             : 'zoom_friends',
     'F3'             : 'zoom_home',
@@ -87,6 +90,10 @@ class KeyHandler(object):
         for key in _actions_table.keys():
             self._key_grabber.grab(key)            
 
+    def handle_quake_term(self):
+        quake_term = quake.get_quake()
+        quake_term.toggle_visible()
+
     def _change_volume(self, step=None, value=None):
         hw_manager = hardwaremanager.get_manager()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Except diff and patch aren't installed on the XO by default.  You can &lt;code&gt;yum install patch&lt;/code&gt; as root to get patch.  I haven't tracked down which rpm supplies diff yet, actually.&lt;/p&gt;

&lt;p&gt;You probably don't have to restore mplayer if you install it according to &lt;a href="http://olpcnews.com/forum/index.php?topic=863"&gt;these instructions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A nice open source eBook reader is &lt;a href="http://www.fbreader.org/"&gt;FBReader&lt;/a&gt;.  Here's how to install an &lt;a href="http://imagic.weizmann.ac.il/~dov/olpc/"&gt;olpc version of FBReader&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wget http://imagic.weizmann.ac.il/~dov/olpc/fbreader-0.8.15-1.dov.i386.rpm
su
rpm -Uvh fbreader-0.8.15-1.dov.i386.rpm&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I have to have my &lt;a href="http://wiki.laptop.org/go/Emacs"&gt;emacs on my XO&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;su
yum install emacs&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I've decided that Firefox is &lt;a href="http://wiki.laptop.org/go/Xfce#Install_Firefox_2"&gt;my favorite browser on the XO&lt;/a&gt;.  To install, edit &lt;code&gt;/etc/yum.repos.d/olpc-koji-update1.repo&lt;/code&gt; and remove firefox from the &lt;code&gt;exclude=&lt;/code&gt; list.  Then&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;yum install firefox&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or, you could try firefox 3.  It seems like it'd be really nice since it uses less memory.  I just installed it for the first time on the XO and I'll report back how it works.  To install it download the Linux version from &lt;a href="http://www.mozilla.com"&gt;Mozilla&lt;/a&gt; and uncompress it in your &lt;code&gt;/home/olpc&lt;/code&gt; directory like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tar -jxvf firefox-3.0.tar.bz2&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Then run it from the command-line like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;firefox/firefox &amp;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It will take a loooong time to start.  Accept the licence agreement and wait a bit more.  Then you have some huge icons and fonts staring back at you.  Type &lt;code&gt;about:config&lt;/code&gt; in the address bar and hit tab a few times and then enter to get past the warning.  Adjust the &lt;code&gt;layout.css.dpi&lt;/code&gt; setting to be 134.  I got that from &lt;a href="http://olpcnews.com/forum/index.php?topic=2066.msg19063#msg19063"&gt;this forum post&lt;/a&gt;.  So far it seems pretty good.  With Firefox 2 gmail was completely unusable except in basic HTML mode and with Firefox 3 it's almost doable when it's in its default javascripty mode.&lt;/p&gt;

&lt;p&gt;And that's really all I've had to customize on this thing.  Maybe someday I'll try Ubuntu or Debian on it, but so far the modified fedora 7 and Sugar work fine.  Linux is Linux.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UPDATE&lt;/em&gt;: I forgot two things: &lt;a href="http://wiki.laptop.org/go/Adobe_Flash#Installation"&gt;flash&lt;/a&gt; and &lt;a href="http://wiki.laptop.org/go/RestrictedFormats#Sun_Java"&gt;java&lt;/a&gt; (just follow the instructions on the wiki).  Oh, and Firefox 3 is still working great.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;MORE UPDATES&lt;/em&gt;: OK, with firefox 3, you can't just follow the instructions on the wiki for flash and java.  You also have to do this (assuming you simply untarred firefox-3.0.tar.bz2 in your home directory like I directed above):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /home/olpc/firefox/plugins
ln -s /usr/lib/flash-plugin/libflashplayer.so
ln -s /usr/java/jre1.5.0_13/plugin/i386/ns7/libjavaplugin_oji.so&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The version numbers might change for java, but otherwise, that's how you get the plugins to be found by firefox 3.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1783149751469182880?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1783149751469182880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1783149751469182880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1783149751469182880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1783149751469182880'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/06/xo-post-upgrade.html' title='XO Post Upgrade'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6589697547535601267</id><published>2008-06-26T22:03:00.000-07:00</published><updated>2008-06-26T22:18:53.898-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olpc'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Upgrade XO to Build 703</title><content type='html'>&lt;p&gt;I upgraded my &lt;a href="http://www.laptop.org"&gt;XO&lt;/a&gt; to &lt;a href="http://wiki.laptop.org/go/OLPC_Update.1_Software_Release_Notes"&gt;Build 703&lt;/a&gt; this week.  It was a little difficult at first, but I like it now.  It's so cool that it now suspends when you close the lid.  This is the first Linux laptop that I've had that does that so smoothly.&lt;/p&gt;

&lt;p&gt;Disk space is at a premium on this little machine.  I actually couldn't get Sugar to start after the upgrade until I did a ctrl-alt-f1 over to a virtual console and removed some files from my home directory.  One utility that is nice for adding and, maybe more importantly, removing Activities is &lt;a href="http://wiki.laptop.org/go/Xo-get"&gt;xo-get.py&lt;/a&gt;.  Once installed you can just &lt;code&gt;./xo-get.py remove ActivityName&lt;/code&gt; to free up more disk space.  Nice.&lt;/p&gt;

&lt;p&gt;Removing activities wasn't nearly enough though.  I was still really full on disk space and after poking around with &lt;code&gt;du&lt;/code&gt; I found the &lt;code&gt;/versions&lt;/code&gt; directory that seems to contain the complete set of files for the previous version of the OLPC software (after an update you can boot the previous version by holding down tho 'o' gamepad key).  That takes up a lot of disk space.  I searched and searched to see if there was a recommended safe way to get rid of stuff in &lt;code&gt;/versions&lt;/code&gt;, and all I found was a mailing list post saying that you *should* be able to &lt;a href="http://lists.laptop.org/pipermail/community-support/2008-January/001485.html"&gt;delete stuff in the versions directory&lt;/a&gt;.  I didn't feel safe deleting stuff that seemed to be the currently running OS (I checked &lt;code&gt;/versions/run/BIGLONGHASHEDVALUE/etc/issue&lt;/code&gt; to be sure), but I deleted the old version and everything seems to be running OK still.  A little faster even.&lt;/p&gt;

&lt;p&gt;We are going on a long road trip and the XO is the only laptop I'm going to bring.  Wish me luck.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6589697547535601267?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6589697547535601267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6589697547535601267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6589697547535601267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6589697547535601267'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/06/upgrade-xo-to-build-703.html' title='Upgrade XO to Build 703'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6146317160620164900</id><published>2008-06-14T07:14:00.000-07:00</published><updated>2008-06-14T07:14:07.576-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revision control'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>You Really Should Hack Linux</title><content type='html'>&lt;p&gt;I have a confession to make.  I'm an avowed Linux geek, yet I haven't complied &lt;a href="http://kernel.org/"&gt;the kernel&lt;/a&gt; in years.  The last time was probably in school when I had to write my own scheduler for the kernel as an assignment, which isn't all that bad when you consider that most people compiling their own kernels are just enabling some obscure driver that they needed.  They haven't made Major Modifications to a core piece like The Scheduler.  Right?  Right?  Well, OK, the scheduler wasn't anything to write home about, but it still felt pretty l33t.  Anyway, I've decided it's time I delve into the source of Linux again.  It's one of the most successful large software projects on the planet, and it's completely open for anyone to dig into.  It would be a horribly wasted opportunity for a serious software engineer to miss out on, especially someone interested in nitty-gritty low-level stuff.  Even if you aren't interested in OS code or drivers at all, you could study it to learn about tools, coding conventions, documentation techniques, release management processes, debugging techniques, or how to do modularity and configurability, all for a pretty big project.  Where else can you get all that for free?  Convinced yet?  OK then.  Off we go.&lt;/p&gt;

&lt;p&gt;I'll be using my Ubuntu Hardy Heron machine for development.  Conveniently enough, there is a nice little package you can install called linux-kernel-devel which is described thusly:&lt;/p&gt;

&lt;blockquote&gt; This is a dummy package that will install all possible packages required to hack comfortably on the kernel.&lt;/blockquote&gt;

&lt;p&gt;I don't know about you, but &lt;em&gt;I&lt;/em&gt; like to be comfortable when I hack.  There is a helpful package included in linux-kernel-devel called kernel-package that makes it easy to create a debian package (.deb) out of our custom kernel, and to do that it's nice to have &lt;a href="http://freshmeat.net/projects/fakeroot/"&gt;fakeroot&lt;/a&gt;, which allows you to make debian packages without actually being root, so install these two packages like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo aptitude install linux-kernel-devel fakeroot&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It is customary (necessary?) to put your Linux source code in the &lt;code&gt;/usr/src&lt;/code&gt; directory.  Astute readers will notice that this directory is owned by root, but users in the &lt;code&gt;src&lt;/code&gt; group can write there too.  To avoid doing too much as root, add yourself to the src group like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo adduser &amp;lt;username&amp;gt; src&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You'll need to log out and log back in (or start a new login shell, or maybe you can simply &lt;code&gt;newgrp src&lt;/code&gt;) for the change to take effect.  Test that you can create a file in &lt;code&gt;/usr/src&lt;/code&gt; with a &lt;code&gt;touch newfile&lt;/code&gt; command in that directory.  Did it work?  Sweet.&lt;/p&gt;

&lt;p&gt;Now it's time to download some source code.  The kernel is kept under revision control with git.  There are other ways to get the source, but if you want the full kernel hacking experience, clone Linus' git repository in &lt;code&gt;/usr/src&lt;/code&gt; like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will probably take a while (I told you this was no toy project!).  Once you've done that you can stay up-to-date by running &lt;code&gt;git pull&lt;/code&gt; in the linux-2.6 directory.&lt;/p&gt;

&lt;p&gt;Before we make a change, let's create our own branch to work off of.  In the linux-2.6 directory run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git checkout -b my-cool-branch&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Choose a better branch name then that.  This will create the branch and make it current.  Type &lt;code&gt;git branch&lt;/code&gt; to see which branches you have and which one is current.  OK, now we can make sure that the kernel will build (a good idea to do before you go making changes to the code).  Before you build though, you need to configure your kernel.  There are an amazing number of configuration options for the kernel.  You can see these by running &lt;code&gt;make xconfig&lt;/code&gt; (if it doesn't work, try installing libqt3-headers first, or maybe you only need qt3-dev-tools and libqt3-mt-dev, sorry, I didn't test that very well).  Pretty overwhelming at first.  An easier thing to try at first is to re-use the configuration for the currently running kernel.  On Ubuntu (and Debian) the configurations for installed kernels are found in &lt;code&gt;/boot/config-*&lt;/code&gt;.  Copy the config for the currently running kernel like this:

&lt;pre&gt;&lt;code&gt;cp /boot/config-`uname -r` .config&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;make xconfig&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;to see what is in that configuration and tweak it if desired (I wouldn't yet).  Once you are happy with your configuration, save and exit xconfig.  Now it's time to start building.  Well almost.  First make sure we are starting out clean.  This is where we start doing everything as "fakeroot," and we use the make-kpkg command instead of make itself (read their man pages for more information).  OK, clean:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fakeroot make-kpkg clean&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That should have been fairly quick.  Now the big command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;fakeroot make-kpkg --revision=1 --append-to-version=mycustomkernel --initrd kernel_image kernel_headers&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Time to sit back and watch compiler messages fly by.  This will take a while (it took 104 minutes on my &lt;a href="http://kvm.qumranet.com/"&gt;kvm&lt;/a&gt; ubuntu virtual machine).  When it finishes, you will have a nice .deb package of your new kernel and its modules in your &lt;code&gt;/usr/src&lt;/code&gt; directory.  From anywhere you can now type this to install it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo dpkg -i /usr/src/linux-image-2.6.26-rc5mycustomkernel_1_i386.deb&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(Obviously the filename will vary depending on which version you are based off of and what options you fed to make-kpkg for --revision and --append-to-version).  Now reboot and see if it runs!&lt;/p&gt;

&lt;p&gt;OK, I think that's enough for one blog entry.  I cover actually making a change to some kernel code in another entry. I'll just close with a list of good references that I used in getting this done.&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.howtoforge.com/roll_a_kernel_debian_ubuntu_way"&gt;http://www.howtoforge.com/roll_a_kernel_debian_ubuntu_way&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.ubuntu.com/community/forum/software/CustomKernel"&gt;https://help.ubuntu.com/community/forum/software/CustomKernel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.ubuntu.com/community/Kernel/Compile"&gt;https://help.ubuntu.com/community/Kernel/Compile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.howtoforge.com/kernel_compilation_ubuntu"&gt;http://www.howtoforge.com/kernel_compilation_ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.howtogeek.com/howto/ubuntu/how-to-customize-your-ubuntu-kernel/"&gt;http://www.howtogeek.com/howto/ubuntu/how-to-customize-your-ubuntu-kernel/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://linux.yyz.us/git-howto.html"&gt;http://linux.yyz.us/git-howto.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://newbiedoc.sourceforge.net/system/kernel-pkg.html"&gt;http://newbiedoc.sourceforge.net/system/kernel-pkg.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Documentation subdirectory in the kernel source.  HOWTO is a good place to start.&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/3669809752172683097-6146317160620164900?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6146317160620164900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6146317160620164900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6146317160620164900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6146317160620164900'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/05/you-really-should-hack-linux.html' title='You Really Should Hack Linux'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6264511231015934729</id><published>2008-06-12T17:08:00.000-07:00</published><updated>2008-06-13T09:37:40.655-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>WAF Build System</title><content type='html'>&lt;p&gt;I just took &lt;a href="http://code.google.com/p/waf/"&gt;WAF&lt;/a&gt; for a very brief test drive after seeing &lt;a href="http://lists.gnu.org/archive/html/emacs-devel/2008-06/msg00466.html"&gt;ESR mention it on emacs-devel&lt;/a&gt; (trying to find an answer to a completely different emacs related issue).  I really like how easy it is to install and try out a demo with it, and the manual isn't bad.  I like the colored output and ascii-art progress bars.  Nice touches.&lt;/p&gt;

&lt;p&gt;It's all Python, which is both good and bad.  The syntax isn't super intuitive (compared to basic make where you pretty much just list files and commands), being all python functions that set up and and get called by internals of the tool itself, but I guess once you get the hang of it that wouldn't be too bad.  It also does more than just build.  It handles detection of compilation tools, dependency tracking (yes it understands C/C++ preprocessing), and also does languages other than C/C++.  If I had a new project I'd definitely give it a try.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6264511231015934729?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6264511231015934729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6264511231015934729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6264511231015934729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6264511231015934729'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/06/waf-build-system.html' title='WAF Build System'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8214220183961711355</id><published>2008-06-09T09:13:00.000-07:00</published><updated>2008-06-09T22:00:16.537-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu Hardy - Worse Photo Import Than Before</title><content type='html'>&lt;p&gt;I like f-spot a lot, but it has a few things that really bug me.  I guess I should stop complaining and &lt;a href="http://f-spot.org/Get_Involved"&gt;get involved&lt;/a&gt;, but then I'd have to learn C#.  I don't know if I can bring myself to do that ;-)  Anyway, here is what I used to see when I connected my digital camera to my Ubuntu 7.10 machine:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2oYUaFZ6U14/SC8E3wvds5I/AAAAAAAAAEs/5s5FsjSosN8/s1600-h/gthumb-import.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_2oYUaFZ6U14/SC8E3wvds5I/AAAAAAAAAEs/5s5FsjSosN8/s320/gthumb-import.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5201381450659509138" /&gt;&lt;/a&gt;

&lt;p&gt;Now that I have Ubuntu 8.04, when I plug in my camera I first see this:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2oYUaFZ6U14/SEyggSrLzQI/AAAAAAAAAFE/DqLCeDRCC2Y/s1600-h/camera-selection.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_2oYUaFZ6U14/SEyggSrLzQI/AAAAAAAAAFE/DqLCeDRCC2Y/s400/camera-selection.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5209715345590045954" /&gt;&lt;/a&gt;

&lt;p&gt;Yes, that's two confusing choices for one camera.  Choosing either gets the same results:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2oYUaFZ6U14/SEygzs_Jg1I/AAAAAAAAAFM/5ItNXIUVv9w/s1600-h/select-photos.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_2oYUaFZ6U14/SEygzs_Jg1I/AAAAAAAAAFM/5ItNXIUVv9w/s400/select-photos.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5209715679070618450" /&gt;&lt;/a&gt;

&lt;p&gt;Yup, it's offering to download some xml files and some other non-image files, and more room is devoted to showing you the full path to the files (that you really don't care about) than to showing you the actual thumbnail image.  The option to delete from the camera what you just downloaded is gone too.  Oh, and no videos will actually show up in F-spot, the program that is now doing this importing.  Was anyone who uses a digital camera consulted on this move?  I'm &lt;a href="http://ubuntuforums.org/showthread.php?p=4865648"&gt;not alone&lt;/a&gt; in not liking this change.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8214220183961711355?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8214220183961711355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8214220183961711355' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8214220183961711355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8214220183961711355'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/05/ubuntu-hardy-worse-photo-import-than.html' title='Ubuntu Hardy - Worse Photo Import Than Before'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2oYUaFZ6U14/SC8E3wvds5I/AAAAAAAAAEs/5s5FsjSosN8/s72-c/gthumb-import.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1468952435739894244</id><published>2008-05-30T14:35:00.000-07:00</published><updated>2008-05-30T15:56:03.122-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>"could not stat the resume device file"</title><content type='html'>&lt;p&gt;We have a local mirror of the Ubuntu repos here at work and they are pretty fast.  I couldn't figure out how to get update-manager to use them, so I upgraded my desktop machine to Hardy Heron by changing everything in &lt;code&gt;/etc/apt/sources.list&lt;/code&gt; from gutsy to hardy and typed &lt;code&gt;sudo aptitude update &amp;&amp; sudo aptitude full-upgrade&lt;/code&gt; and let it run.  It asked a couple questions about modified config files and such which I answered, and then it was done.  I rebooted and it put up the pretty "UBUNTU" with the new pulsating &lt;a href="http://en.wikipedia.org/wiki/KITT"&gt;KITT&lt;/a&gt;-esque progress bar...and it never went beyond that.  I finally hit alt-f1 and saw that it was waiting for my input with the prompt:&lt;/p&gt;

&lt;blockquote&gt;resume: could not stat resume device file /dev/sda10. Please type in the name to try again or press ENTER to boot the system&lt;/blockquote&gt;

&lt;p&gt;I hit enter and it seemed to boot just fine.  This is a pretty annoying thing to have to do every time you boot, so I searched until I found the solution for me: &lt;a href="https://bugs.launchpad.net/ubuntu/+source/uswsusp/+bug/108230"&gt;reinstall initramfs-tools&lt;/a&gt;, like so:

&lt;pre&gt;&lt;code&gt;sudo aptitude reinstall initramfs-tools&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Like Lauri Kainulainen wrote in that launchpad bug report, I've never used hibernate on this machine, so this is pretty puzzling.  However, I'm continually impressed that I can find help for these obscure problems so quickly.  It pays to use a popular distribution and to not be the first to try out new things with it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1468952435739894244?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1468952435739894244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1468952435739894244' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1468952435739894244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1468952435739894244'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/05/could-not-stat-resume-device-file.html' title='&quot;could not stat the resume device file&quot;'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6764805743337555824</id><published>2008-05-25T08:31:00.000-07:00</published><updated>2008-05-25T20:21:44.239-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>KVM in Ubuntu Hardy Heron</title><content type='html'>&lt;p&gt;Apparently there are some &lt;a href="http://redkrieg.com/2008/03/25/kvm-kernel-virtualization-in-ubuntu-hardy/"&gt;new&lt;/a&gt; &lt;a href="http://tombuntu.com/index.php/2008/04/14/virtualization-with-virt-manager-and-kvm-in-ubuntu-804/"&gt;gui apps&lt;/a&gt; for running and interacting with &lt;a href="http://kvm.qumranet.com/"&gt;KVM&lt;/a&gt; on Ubuntu 8.04.  After reading those two blog entries, I fired up virt-manager and virt-install, and wasn't very impressed.  I didn't like the idea of piping the graphics through VNC when all I want is to run a virtual machine on my local desktop.  And why do you need a confusing GUI when the command-line utilities for kvm/qemu are so straightforward?&lt;/p&gt;

&lt;p&gt;Now that I've said that, I'll point you at &lt;a href="https://help.ubuntu.com/community/KVM"&gt;this overly complex KVM guide&lt;/a&gt; just so you can follow the first part to &lt;a href="https://help.ubuntu.com/community/KVM#head-b85bd2517ec4a8be8dd507ef7cdc8c8313eb8a84"&gt;check if your CPU supports hardware virtualization&lt;/a&gt;.  I would pretty much ignore the rest of that guide.  Oh, and if your CPU doesn't support hardware virtualization, you can pretty much replace kvm with qemu in all the below steps and this will still work, just slower.

&lt;p&gt;Allright, here's how I set up a new KVM instance on my Ubuntu Hardy Heron box.  I installed Hardy on the virtual machine in this example, but you could just as easily do windoze or about any other OS of your choosing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install kvm if you don't have it already:

&lt;pre&gt;&lt;code&gt;sudo aptitude install kvm&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;create your disk image:

&lt;pre&gt;&lt;code&gt;qemu-img create -f qcow2 ubuntu.qcow2 100G&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;Specify the Ubuntu install CD image as your cdrom drive and tell kvm to boot from that with &lt;code&gt;-boot d&lt;/code&gt;, with ubuntu.qcow2 as your hard drive (also enable sound hardware and use &lt;code&gt;-localtime&lt;/code&gt;, though I think localtime is only needed for windoze to get the time right):

&lt;pre&gt;&lt;code&gt;kvm -soundhw all -cdrom ~/downloads/ubuntu-8.04-desktop-i386.iso -localtime -m 512 -hda ubuntu.qcow2 -boot d&lt;/code&gt;&lt;/pre&gt;

All of these command-line options are explained in the qemu man-page.&lt;/li&gt;

&lt;li&gt;Now just run through the install as normal.&lt;/li&gt;

&lt;li&gt;When that's done, boot up your new system like so:

&lt;pre&gt;&lt;code&gt;kvm -soundhw all -cdrom /dev/cdrom -localtime -m 512 -hda ubuntu.qcow2&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There you have it.  I highly suggest putting that last command in a file and making it executable so you can just run it as a script.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6764805743337555824?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6764805743337555824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6764805743337555824' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6764805743337555824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6764805743337555824'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/05/kvm-in-ubuntu-hardy-heron.html' title='KVM in Ubuntu Hardy Heron'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-7102752509413464403</id><published>2008-05-24T20:50:00.000-07:00</published><updated>2008-05-24T21:16:55.012-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Windoze Activate After Hardy (and KVM) Upgrade</title><content type='html'>&lt;p&gt;This is kind of funny.  At least I thought so.  I fired up my windoze &lt;a href="http://kvm.qumranet.com/kvmwiki"&gt;kvm&lt;/a&gt; instance for the first time since upgrading to Hardy Heron, and I got a pop-up dialog from XP telling me that hardware has changed significantly (click to see the full-sized image):&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2oYUaFZ6U14/SDjn9KncBaI/AAAAAAAAAE8/s-H9f6fgKnA/s1600-h/windoze-kvm-upgrade-funny.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_2oYUaFZ6U14/SDjn9KncBaI/AAAAAAAAAE8/s-H9f6fgKnA/s400/windoze-kvm-upgrade-funny.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5204164407434413474" /&gt;&lt;/a&gt;

&lt;p&gt;Weird.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-7102752509413464403?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/7102752509413464403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=7102752509413464403' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/7102752509413464403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/7102752509413464403'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/05/windoze-activate-after-hardy-and-kvm.html' title='Windoze Activate After Hardy (and KVM) Upgrade'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_2oYUaFZ6U14/SDjn9KncBaI/AAAAAAAAAE8/s-H9f6fgKnA/s72-c/windoze-kvm-upgrade-funny.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8968665875075110756</id><published>2008-05-20T22:41:00.001-07:00</published><updated>2008-05-20T22:55:15.562-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revision control'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Hardy Upgrade Broke Apache Logging</title><content type='html'>&lt;p&gt;I noticed today that &lt;a href="/2008/05/upgrade-to-hardy-many-sound-woes.html"&gt;my upgrade to Hardy&lt;/a&gt; broke my Apache logs for my little family website that I'm hosting.  It turns out that I had a LogFormat definition in apache2.conf called comonvhost.  All my sites in sites-available used this with a line like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;CustomLog /var/log/apache2/access.log comonvhost&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Well, in the upgrade, the commonvhost LogFormat was removed from my apache2.conf and replaced with three other LogFormats named, "combined," "common," and "referer (sic)."  My log file became filled with lines that simply said, "commonvhost."&lt;/p&gt;

&lt;p&gt;Here I'd like pause and say that &lt;a href="/2007/07/put-etc-under-revision-control-with-git.html"&gt;having /etc under revision control&lt;/a&gt; made this very easy to debug.  All I had to do was run &lt;code&gt;git diff -r &amp;lt;some commit before the upgrade&amp;gt;&lt;/code&gt; on the various files in /etc/apache2 and it became obvious very quick what had happened.  I'm so glad I set that up.&lt;/p&gt;

&lt;p&gt;Anyway, after changing my sites-available files to all use the new combined LogFormat instead of commonvhost, my access.log started looking like it should again.  Phew!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8968665875075110756?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8968665875075110756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8968665875075110756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8968665875075110756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8968665875075110756'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/05/hardy-upgrade-broke-apache-logging.html' title='Hardy Upgrade Broke Apache Logging'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-4434821416061017915</id><published>2008-05-19T13:27:00.001-07:00</published><updated>2008-05-19T13:32:38.937-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revision control'/><title type='text'>Subversion Question</title><content type='html'>&lt;p&gt;I have a question about Subversion that I can't quite coax Google into answering.  Is there any problem with copying an existing working copy and using that instead of running &lt;code&gt;svn checkout&lt;/code&gt; to create a new working copy?&lt;/p&gt;

&lt;p&gt;You might want to do this if checkouts from your Subversion repository are very slow, see.  I tried it out and it seems to work, but I wonder if there are any hidden pitfalls to this method.  If you have any ideas please comment.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-4434821416061017915?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/4434821416061017915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=4434821416061017915' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4434821416061017915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4434821416061017915'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/05/subversion-question.html' title='Subversion Question'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-5667613237379401294</id><published>2008-05-14T21:08:00.001-07:00</published><updated>2008-05-19T13:18:56.113-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Upgrade to Hardy, Many Sound Woes</title><content type='html'>&lt;p&gt;&lt;em&gt;WARNING&lt;/em&gt;  I needed a place to take notes while debugging sound issues after upgrading my desktop from Gutsy to Hardy, so here they are.  This is probably a pretty boring read, so continue at your own risk.&lt;/p&gt;

&lt;p&gt;Upgraded to Hardy today.  Got some indistinct error message at the end, so I made sure and ran aptitude update &amp;&amp; aptitude -y full-upgrade &amp;&amp; dpkg --configure -a a few times before and after rebooting.  Then, when I fired up Firefox (fired up... Firefox... get it...?) and went to youtube I realized I didn't have flash anymore.  I aptitude installed flashplugin-nonfree, restarted Firefox, and videos worked.  Yay!&lt;/p&gt;

&lt;p&gt;Then I went away for a while.  When I came back youtube videos had no sound.  This is actually a problem that I was having before the upgrade.  Not even a reboot helped.  I fired up Amarok to see if mp3s still played.  Nope, it froze.  I googled a bit and found &lt;a href="http://www.linux.com/feature/119926"&gt;some pulse audio help&lt;/a&gt; which led me to believe that maybe I needed to add myself to the pulse audio groups.  I did so, tried Amarok again, and the whole system froze.  No magic keys or anything could save me.  I hit the reset button on my case, and when it came back up, still no youtube sound.  I started Amarok and it took &lt;em&gt;forever&lt;/em&gt; to start, and then I made sure it was configured to use pulseaudio for its output plugin (I'm using the xine engine), and it didn't freeze, but it didn't play music either.  Frustrating.  First &lt;a href="/2007/11/gutsy-and-82801h-audio-controller.html"&gt;I had sound problems with Gutsy&lt;/a&gt;, and now seemingly worse problems with Hardy.  Ubuntu, you've been so good to me in the past.  What gives?&lt;/p&gt;

&lt;p&gt;Pressing on, I tried changing the output plugin for Amarok and the whole app froze again.  I tried watching video with totem, no sound.  It froze after a bit too and I had to kill it.  This is getting quite scary.&lt;/p&gt;

&lt;p&gt;Reading some more &lt;a href="https://wiki.ubuntu.com/PulseAudio"&gt;here&lt;/a&gt; and &lt;a href="http://www.pulseaudio.org/wiki/PerfectSetup"&gt;here&lt;/a&gt; I discover this thing called libflashsupport.  Aptitude tells me it's not installed and the description reads:&lt;/p&gt;

&lt;blockquote&gt;Due to various bugs in the Flash 9 plugin sound output of Flash 9 through the pulseaudio soundserver doesn't work properly. This library adds a clutch to
 make Flash 9 sound output in pulseaudio possible.&lt;/blockquote&gt;

&lt;p&gt;After installing this I shut off my computer completely (I'm in full belt-and-suspenders paranoia mode now), waited a few seconds and then turned it back on.&lt;/p&gt;

&lt;p&gt;Taking a more conservative route this time, I started Totem first.  No KDE or flash weirdness there.  It worked, sound and video played without any problems.  Next I tried Amarok with the xine engine output plugin set to autodetect.  It worked, no hang.  Next, youtube.  No sound.  Totem and Amarok still worked even after trying flash.  I don't know if this result is any different from before, unfortunately.  Maybe everything works better as long as you don't do flash first.  I don't know.&lt;/p&gt;

&lt;p&gt;I'm not sure what to try next.  Apparently there might be &lt;a href="http://www.pulseaudio.org/wiki/FlashPlayer9Solution"&gt;a newer version of libflashsupport&lt;/a&gt; that I could try.  &lt;a href="https://answers.launchpad.net/ubuntu/+question/30514"&gt;This advice&lt;/a&gt; is not well explained, but it might be worth a try as well.  Overall, I'm getting the impression that this is more the fault of flash than anyone else.  Cursed closed-source crap!&lt;/p&gt;

&lt;p&gt;I decided to try compiling libflashsupport from source as suggested on the pulse audio wiki.  I aptitude removed libflashsupport first.  After compiling and installing and restarting firefox there was still no youtube sound.  Amarok and Totem were still good though.  I rebooted.  Still no youtube sound.&lt;/p&gt;

&lt;p&gt;And then I saw it.  There is a volume control on the little video controls under the youtube video.  And it was turned all the way down.  Oh.  my.  gosh.  Sure enough, when I turned it up, sound played.  How long has that been the problem!?!?!?&lt;/p&gt;

&lt;p&gt;I decided to undo what I'd done a bit.  I uninstalled libflashsupport as compiled from source and re-installed the ubuntu package.  After restarting Firefox youtube and totem both worked, at the same time even.  I think I'll leave things like that for now.  Don't you love Linux?  I do.  I really do.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-5667613237379401294?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/5667613237379401294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=5667613237379401294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5667613237379401294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5667613237379401294'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/05/upgrade-to-hardy-many-sound-woes.html' title='Upgrade to Hardy, Many Sound Woes'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-3442108469573860483</id><published>2008-05-06T16:50:00.000-07:00</published><updated>2008-05-06T16:55:03.995-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Better gnome-terminal Colors</title><content type='html'>&lt;p&gt;If you use gnome-terminal with a dark background, the default colors that you get when you type, say, ls --color are hard on the eyes, especially the dark blue.  To fix it, right-click, edit current profile, click on the colors tab, and under Palette choose XTerm from the Built-in schemes.  Much much better.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-3442108469573860483?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/3442108469573860483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=3442108469573860483' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3442108469573860483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3442108469573860483'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/05/better-gnome-terminal-colors.html' title='Better gnome-terminal Colors'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1438854526646502986</id><published>2008-04-30T16:58:00.000-07:00</published><updated>2008-06-13T09:38:27.614-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Memristor</title><content type='html'>&lt;blockquote&gt;
  &lt;p&gt;&amp;#8220;Electronic theorists have been using the wrong pair of variables all these years&amp;#8212;voltage and charge. The missing part of electronic theory was that the fundamental pair of variables is flux and charge,&amp;#8221; said Chua. &amp;#8220;The situation is analogous to what is called &amp;#8220;Aristotle&amp;#8217;s Law of Motion, which was wrong, because he said that force must be proportional to velocity. That misled people for 2000 years until Newton came along and pointed out that Aristotle was using the wrong variables. Newton said that force is proportional to acceleration&amp;#8212;the change in velocity. This is exactly the situation with electronic circuit theory today. All electronic textbooks have been teaching using the wrong variables&amp;#8212;voltage and charge&amp;#8212;explaining away inaccuracies as anomalies. What they should have been teaching is the relationship between changes in voltage, or flux, and charge.&amp;#8221;&lt;/p&gt;
 &lt;/blockquote&gt;

 &lt;p&gt;No wonder those analog circuits classes always left me a little bit confused!  Turns out &lt;a href="http://www.eetimes.com/news/latest/showArticle.jhtml;jsessionid=1BAWQSG2DC1TEQSNDLSCKHA?articleID=207403521"&gt;they were teaching it all wrong.&lt;/a&gt; &lt;/p&gt;

 &lt;p&gt;OK, so maybe it wasn&amp;#8217;t a violation of my natural intuition for electronics that made it difficult, but I will definitely buy one of the newly revised text books that these guys are predicting once they come out just to be sure.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1438854526646502986?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1438854526646502986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1438854526646502986' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1438854526646502986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1438854526646502986'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/04/memrister.html' title='Memristor'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6739848087557200165</id><published>2008-04-17T21:38:00.000-07:00</published><updated>2008-04-17T22:38:12.575-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Where'd My Second Core Go?</title><content type='html'>&lt;p&gt;While discussing the specs of our new workstations with a coworker, I ssh&amp;#8217;ed to my blazingly fast home machine and catted /proc/cpuinfo for a quick comparison.  My pride in my hand crafted workhorse was quickly squelched when only one CPU appeared in the output.  &amp;#8220;What is up with that?&amp;#8221;  I wondered.  After some unaming and googling I discovered that Ubuntu had somehow switched me to the &lt;a href="https://answers.launchpad.net/ubuntu/+source/gnome-system-monitor/+question/17809"&gt;lame 386 kernel when I really wanted the generic kernel&lt;/a&gt;.  Funny thing is, the generic kernel was installed, just not the grub default.  Editing my menu.lst and rebooting quickly lead me to my next problem, no nvidia driver.  Thankfully google found me &lt;a href="http://ubuntuforums.org/showthread.php?p=4262751"&gt;the answer again&lt;/a&gt;.&lt;/p&gt;

 &lt;p&gt;I can&amp;#8217;t believe I&amp;#8217;ve been computing with only one of my cores.  And for who knows how long!  The shame of it all.  I'll be watching you much more closely from now on, Ubuntu.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6739848087557200165?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6739848087557200165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6739848087557200165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6739848087557200165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6739848087557200165'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/04/whered-my-second-core-go.html' title='Where&apos;d My Second Core Go?'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-7058571648625675399</id><published>2008-03-21T15:46:00.000-07:00</published><updated>2008-03-24T21:45:11.682-07:00</updated><title type='text'>Thoughts While Reading About D</title><content type='html'>&lt;p&gt;&lt;p&gt;I first heard about &lt;a href="http://www.digitalmars.com/d/index.html"&gt;D&lt;/a&gt; quite a while ago, but I never really looked into it.  I stumbled upon it again today and I&amp;#8217;m actually reading on the website right now.  Some quick thoughts I wanted to jot down:&lt;/p&gt;&lt;/p&gt;

 &lt;ul&gt;
  &lt;li&gt;It&amp;#8217;s compiled, no VM or interpreter, and supports inline assembly, pointers, etc. (could it be used in embedded systems?)&lt;/li&gt;
  &lt;li&gt;Doesn&amp;#8217;t do 16-bit stuff very well (hmm, maybe not all embedded systems&amp;#8230;)&lt;/li&gt;
  &lt;li&gt;No preprocessor, yay!&lt;/li&gt;
  &lt;li&gt;The above means, no #include, it has modules that you import.&lt;/li&gt;
  &lt;li&gt;Arrays know their size!&lt;/li&gt;
  &lt;li&gt;Arrays can be resized&lt;/li&gt;
  &lt;li&gt;Arrays can be associative (i.e. hash tables)&lt;/li&gt;
  &lt;li&gt;No forward declaration needed (from they day I learned C I&amp;#8217;ve wondered why in the world the compiler couldn&amp;#8217;t figure this out itself)&lt;/li&gt;
  &lt;li&gt;Function literals and nested functions (hence, closures).  Wow.&lt;/li&gt;
  &lt;li&gt;Garbage collection and automatic memory allocation, but you can override it if you need to (good!)&lt;/li&gt;
  &lt;li&gt;Built-in synchronization&lt;/li&gt;
  &lt;li&gt;Direct access to C functions&lt;/li&gt;
  &lt;li&gt;Standard object file format&lt;/li&gt;
 &lt;/ul&gt;

 &lt;p&gt;It also says it doesn&amp;#8217;t have, &amp;#8220;a religion, or an overriding philosophy,&amp;#8221; yet it does seem to pick a side on the strong typing debate by advocating its better typedefs and function In and Out Parameters.  It also goes on for a bit more about unit tests and &amp;#8220;contracts&amp;#8221; (not sure what that is even) than I figured a less philosophical language would (maybe that&amp;#8217;s just because I&amp;#8217;m not completely sold on those myself), saying, &amp;#8220;if it has no unit tests and no contracts, it&amp;#8217;s unacceptable.&amp;#8221;&lt;/p&gt;

 &lt;p&gt;It looks promising from the &lt;a href="http://www.digitalmars.com/d/2.0/overview.html"&gt;marketing spiel&lt;/a&gt;.  I&amp;#8217;ve been secretly hoping that something a little higher-level than C++ could be used for writing firmware.  Maybe D could be it.  I&amp;#8217;ll have to actually download a compiler and try it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-7058571648625675399?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/7058571648625675399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=7058571648625675399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/7058571648625675399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/7058571648625675399'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/03/thoughts-while-reading-about-d.html' title='Thoughts While Reading About D'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8977597806870604419</id><published>2008-03-19T13:03:00.000-07:00</published><updated>2008-03-20T09:40:45.428-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Beat the Save Habit</title><content type='html'>&lt;p&gt;It only takes one unfortunate program crash where you lose a lot of work to teach you the importance of saving often.  I use emacs most of the time, and I had developed a nearly subconscious, paranoid habit of hitting c-x c-s every 5 seconds or so while working.  I was starting to catch myself before hitting that save-buffer shortcut even when I was typing in other applications: instant messenging, web page forms, you name it.  Meanwhile, I also started noticing applications that didn't require me to tell them to save my precious work.  Gmail and blogger come to mind right a way.  "&lt;a href="/2007/12/my-c-x-c-s-muscles-are-getting-tired.html"&gt;Why couldn't emacs do the same?&lt;/a&gt;" I wondered.  After hashing it out in that blog entry and on the &lt;a href="http://www.emacswiki.org/cgi-bin/wiki/AutoSave"&gt;emacs wiki&lt;/a&gt;, I added the following to my .emacs file, and I am happy to report that my twitch is gone:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
(defun save-buffer-if-visiting-file (&amp;optional args)
  "Save the current buffer only if it is visiting a file"
  (interactive)
  (if (buffer-file-name)
      (save-buffer args)))

;; This causes files that I'm editing to be saved automatically by the
;; emacs auto-save functionality.  I'm hoping to break myself of the
;; c-x c-s twitch.
(add-hook 'auto-save-hook 'save-buffer-if-visiting-file)

;; save every 20 characters typed (this is the minimum)
(setq auto-save-interval 20)

;; save after 1 second of idle time (default is 30)
(setq auto-save-timeout 1)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now emacs automatically saves my work for me, without me having to ask, and I love it.  It makes me a little nervous when I'm working on a file that's not under revision control, but with modern revision control being so easy to set up and use&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;, that is happening less and less.&lt;/p&gt;

&lt;p&gt;If you see any way to improve this, or if you just want to tell me why it's dumb, please comment.  My emacs lisp skil1z are pretty feeble.&lt;/p&gt;

&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; Just type &lt;code&gt;hg init&lt;/code&gt;, &lt;code&gt;bzr init&lt;/code&gt;, or &lt;code&gt;git init&lt;/code&gt; in the directory where the file lives and you are up and running.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8977597806870604419?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8977597806870604419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8977597806870604419' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8977597806870604419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8977597806870604419'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/03/beat-save-habit.html' title='Beat the Save Habit'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6670444664325783397</id><published>2008-03-12T22:52:00.000-07:00</published><updated>2008-03-12T23:20:10.983-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olpc'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Some More Tweaks to my XO</title><content type='html'>&lt;p&gt;I went through all the tweaks to get &lt;a href="http://wiki.laptop.org/go/Xfce"&gt;XFCE running on the XO&lt;/a&gt;.  It definitely feels snappier than Sugar, but it's all a big hack, and you still don't get the camera and microphone, and networking with wifi-radar was a little iffy.&lt;/p&gt;

&lt;p&gt;Bill Clementson gave some &lt;a href="http://bc.tech.coop/blog/080128.html"&gt;great tips for tweaking the XO&lt;/a&gt; to make Sugar a little more adult friendly.  I love his quake terminal hack, it is so much faster and convenient than the built in terminal activity.  I have also settled on Firefox as my browser like him.  It looks pretty good:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2oYUaFZ6U14/R9jB-V74ELI/AAAAAAAAAEc/O4my8Ios1Mk/s1600-h/firefox-on-xo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_2oYUaFZ6U14/R9jB-V74ELI/AAAAAAAAAEc/O4my8Ios1Mk/s320/firefox-on-xo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5177101048446718130" /&gt;&lt;/a&gt;


&lt;p&gt;For some reason I just couldn't get used to Opera.  Firefox seems a little slower than Opera did, but it still feels faster than the browse activity that came with the XO.  Bump up the minimum font size on Firefox to about 20 and it looks beautiful.&lt;/p&gt;

&lt;p&gt;I got evince to install for viewing PDF files (&lt;code&gt;yum install evince&lt;/code&gt;) and it works pretty well too:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2oYUaFZ6U14/R9jCM174EMI/AAAAAAAAAEk/mhvbYHnWcH8/s1600-h/evince-on-xo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_2oYUaFZ6U14/R9jCM174EMI/AAAAAAAAAEk/mhvbYHnWcH8/s320/evince-on-xo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5177101297554821314" /&gt;&lt;/a&gt;


&lt;p&gt;I spent this evening upgrading my family website all from my couch with the XO.  Being able to flip from Firefox to the terminal with ctrl-down was awesome, and I still can't get over how quiet, cool, and, well, cuddly the XO is.  I used my work laptop for a bit and it is so uncomfortable with all it's sharp corners, noisy fans, and lap-burning heat.  It's also nice to not have to worry about battery time with the XO like I do with the laptop.  Just turning off the LCD backlight saves so much power.  What a great machine.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6670444664325783397?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6670444664325783397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6670444664325783397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6670444664325783397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6670444664325783397'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/03/some-more-tweaks-to-my-xo.html' title='Some More Tweaks to my XO'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_2oYUaFZ6U14/R9jB-V74ELI/AAAAAAAAAEc/O4my8Ios1Mk/s72-c/firefox-on-xo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1047732624245719059</id><published>2008-03-04T21:49:00.000-08:00</published><updated>2008-03-05T11:37:22.136-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>GPS Fun(?) on Linux</title><content type='html'>&lt;p&gt;I have a Magellan SporTrak Map GPS that I won as a door prize a few years back.  Every now and then I dig it out of a drawer and play with it.  I bought a new bike this week, you see, and I downloaded some routes from &lt;a href="http://www.mapmyride.com/"&gt;MapMyRide&lt;/a&gt; that I wanted to put on the GPS so I would have a route to follow while biking.  Should be pretty straightforward, I thought.&lt;/p&gt;

&lt;p&gt;MapMyRide offers downloads of routes in &lt;a href="http://www.topografix.com/gpx.asp"&gt;gpx&lt;/a&gt; format, which I've run into before while playing with this gps stuff.  Cool.  So I downloaded the files and did a quick search for Linux GPS software.  Unfortunately it still looks like &lt;a href="http://www.ncc.up.pt/gpsman/"&gt;gpsman&lt;/a&gt; is still really the only software out there that does what I need (please, please correct me if I'm wrong).  gpsman is a piece of ugly tcl/tk software that does a fine job of connecting to my Magellan and allowing me to download and upload track data using the gpx file format.  The interface is awful.  It opens up three windows that aren't really labeled as to what they are, and offers all kinds of confusing buttons.  And did I mention it's ugly?  Once you get the hang of it, it does work fine though.&lt;/p&gt;

&lt;p&gt;Actually, it did work fine, until I told it to open the gpx file from MapMyRide.  It gave me some kind of error with what I'm guessing was a tcl stack trace.  It said something about time or date, so I opened up the gpx file.  At this point I'm thankful for xml.  It was pretty easy to compare the MapMyRide gpx file with one that gpsman had generated from my gps track data and see that the big difference between the two was that the MapMyRide one didn't have an &amp;lt;el&amp;gt; or a &amp;lt;time&amp;gt; element with each &amp;lt;trkpt&amp;gt; element like the gpsman file did&lt;sup&gt;&lt;a href="#fn1" title="Actually, I ran it through gpsbabel like this first, hoping that would fix the problem:"&gt;1&lt;/a&gt;&lt;/sup&gt;.  If I'm reading the  &lt;a href="http://www.topografix.com/GPX/1/1/gpx.xsd"&gt;gpx schema&lt;/a&gt; correctly, those are optional elements, so I think this is gpsman's fault.&lt;/p&gt;

&lt;p&gt;To work around this, I just grabbed the two missing elements from my gpsman generated gpx file and pasted them into my MapMyRide gpx file.  After that gpsman could "import" the gpx file and then put the track onto my gps.&lt;/p&gt;

&lt;p&gt;Now I can see the track as a nice little dotted line on my gps map view and I'll let you know how the bike ride goes.&lt;/p&gt;

&lt;h4&gt;Footnotes&lt;/h4&gt;

&lt;p class="footnote" id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; Actually, I ran it through &lt;a href="http://www.gpsbabel.org/"&gt;gpsbabel&lt;/a&gt; like this first, hoping that would fix the problem:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gpsbabel -i gpx -o gpx,gpxver=1.0 original.gpx original-1.0.gpx&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It didn't fix the problem, but it least it added line breaks and made the xml easier to read.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1047732624245719059?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1047732624245719059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1047732624245719059' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1047732624245719059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1047732624245719059'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/03/gps-fun-on-linux.html' title='GPS Fun(?) on Linux'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-6273651702924466491</id><published>2008-02-21T15:12:00.000-08:00</published><updated>2008-02-27T10:36:44.047-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Screen as Serial Terminal</title><content type='html'>&lt;p&gt;At work we use minicom on our Linux workstations to connect to the serial port of our development hardware.  It works fine, but it's very text oriented.  It also loses everything in the window if you re-size it.  I've sometimes wondered if there are better alternatives, and today someone on one of our internal forums gave me a nice list.  Sadly I couldn't find any of the suggestions for our old Red Hat 8 development boxes, except screen.&lt;/p&gt;

&lt;p&gt;I've used screen before and it's great.  I had no idea it could do serial communication too.  Here's the command I used for our environment:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
screen /dev/ttyS0 115200,cs8,-ixon,-ixon,istrip
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I also have this .screenrc file that someone gave me years ago:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
# kill startup message
startup_message off

# define a bigger scrollback, default is 100 lines
defscrollback 1024

# remap CTRL-A to CTRL-]
escape ^]]

# status bar
hardstatus on
hardstatus alwayslastline "%{rk}%H %{gk}%c %{yk}%M%d %{wk}%?%-Lw%?%{bw}%n*%f %t%?(%u)%?%{wk}%?%+Lw%?"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That gives you better key bindings and a nice colorful stats line at the bottom of the windows.&lt;/p&gt;

&lt;p&gt;Advantages over minicom are, you can resize the window and you don't lose anything, you have screen's cool detached mode functionality, and there are a million other little nifty things that screen can do that you might find useful (man screen some rainy afternoon).  You might be used to screen keybindings already too.  &lt;strike&gt;A downside is, with minicom you can run it in an xterm with a scroll bar and use your wheelie mouse to scroll the buffer.  That's handy.  I can't get screen to do that.&lt;/strike&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UPDATE:&lt;/em&gt;  You can scroll with your wheel mouse if you run screen in a recent version of gnome-terminal.  See the comments on this entry.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UPDATE 2:&lt;/em&gt;  There's another way to scroll screen output with your mouse that works exactly like minicom.  See comment number 4 below.&lt;/p&gt;

&lt;p&gt;Let me just say at this point that I should have already learned from emacs that when dealing with a UNIX program that has been in use since before I first touched a computer, never say that it can't do something, because it totally can.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-6273651702924466491?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/6273651702924466491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=6273651702924466491' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6273651702924466491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/6273651702924466491'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/02/screen-as-serial-terminal.html' title='Screen as Serial Terminal'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-5167325425295056772</id><published>2008-02-21T13:23:00.000-08:00</published><updated>2008-02-21T13:35:36.099-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Print Free Graph Paper</title><content type='html'>&lt;p&gt;This is just too cool.  You can &lt;a href="http://www.printfreegraphpaper.com/"&gt;print your own graph paper&lt;/a&gt;.  Not just any graph paper, you can choose from these types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cartesian Graph Paper&lt;/li&gt;
&lt;li&gt;Engineering Graph Paper&lt;/li&gt;
&lt;li&gt;Polar Graph Paper&lt;/li&gt;
&lt;li&gt;Isometric Graph Paper&lt;/li&gt;
&lt;li&gt;Logarithmic Graph Paper&lt;/li&gt;
&lt;li&gt;Hexagonal Graph Paper&lt;/li&gt;
&lt;li&gt;Probability Graph Paper&lt;/li&gt;
&lt;li&gt;Smith Chart Graph Paper&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;You can customize paper size, units of measure, and grid-size within each of those, and I had never even heard of Probability Graph Paper!  How cool is probability graph paper?  Seeing a Smith Chart brought back some great memories from college.  I almost printed one out just to hang on my wall.  Very cool stuff.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-5167325425295056772?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/5167325425295056772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=5167325425295056772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5167325425295056772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5167325425295056772'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/02/print-free-graph-paper.html' title='Print Free Graph Paper'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-4477903819409458663</id><published>2008-02-13T18:03:00.000-08:00</published><updated>2008-02-13T18:08:01.792-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosopy'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Throw Some Cold Water On That</title><content type='html'>&lt;p&gt;If you need some good old pragmatic engineering cynicism to counter all the Steveys, Joels, and Pauls of the software blogosphere, go read the &lt;a href="http://blogs.concedere.net:8080/blog/discipline/"&gt;discipline and punish&lt;/a&gt; blog for a bit.  Pretty insightful in a lot of places, and a good counterpoint to a lot of what those crazy programmer/bloggers are saying.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-4477903819409458663?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/4477903819409458663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=4477903819409458663' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4477903819409458663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4477903819409458663'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/02/throw-some-cold-water-on-that.html' title='Throw Some Cold Water On That'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-328849045320061731</id><published>2008-02-11T11:54:00.000-08:00</published><updated>2008-02-11T12:36:26.610-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosopy'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>No, I must be a noob</title><content type='html'>&lt;p&gt;I spoke too soon &lt;a href="/2008/02/im-at-least-teenager-right.html"&gt;in favor&lt;/a&gt; of &lt;a href="http://steve-yegge.blogspot.com/2008/02/portrait-of-n00b.html"&gt;Stevey's latest&lt;/a&gt;.  I'm looking at all my C++ code now in a totally different light, and questioning everything...does that really need to be an enum there, or just an int?  I was going to turn that C-function into a static function of this class, should I bother now?  Do I need that error handler class like I was thinking Friday, or should I just stick a couple functions in this file? Are namespaces useless metadata too?  Gee thanks, Steve!  I mean, what do you want, for us to all write quick and dirty spaghetti code?  After all, the experts who maintain it should be able to figure it out.  Why don't we just write machine code, it's closer to the computation, without any verbose and useless metadata, right?  Can we get a little moderation here?&lt;/p&gt;

&lt;p&gt;If you can't tell, I'm torn.  I like what Steve had to say, but I hate it.  I must be a noob still.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-328849045320061731?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/328849045320061731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=328849045320061731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/328849045320061731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/328849045320061731'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/02/no-i-must-be-noob.html' title='No, I must be a noob'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1922781931740506468</id><published>2008-02-11T09:43:00.000-08:00</published><updated>2008-02-11T10:35:38.990-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosopy'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>I'm At Least a Teenager, Right?</title><content type='html'>&lt;p&gt;I think I'm beyond the &lt;a href="http://steve-yegge.blogspot.com/2008/02/portrait-of-n00b.html"&gt;noob stage&lt;/a&gt; Steve describes.  I can definitely recall writing some comments like he describes a few years ago.  I don't do it now.  Usually.  I admit that I did for that hairy calibration code just a couple months ago, for the algorithm that was handed down by the analog EE that I was supposed to just trust with blind faith.  I couldn't do it.  I had to understand how it worked.  I read up on flyback regulators and peppered that code with so much metadata (now that I know that's what it's called) that comments and types were spilling out at every seam.  So I have to disagree with Steve's conclusion a little here.  He rightly points out that using the narrative style of commenting and other kinds of metadata are ways for us to learn about what we are doing, that it's a way to solidify our thought processes.  His conclusion seems to be that this is a bad thing overall and that we should strive to avoid it.  Personally, I hope I'm always working on stuff that is challenging enough to require some metadata discussion with myself to get it right.  I wouldn't feel like I was learning anything anymore if I didn't, and that's no fun.&lt;/p&gt;

&lt;p&gt;To be fair, he's really not railing against what I'm talking about though.  He's more against those that are into modeling to an extreme for the sake of modeling.  I totally agree with his sentiments there.  This is an excellent read for any programmer.  I know because I agreed with what he wrote so much  :-)  I love how he can take these thoughts that have been sort of half-way forming at the back of my mind and express them so clearly.  Or at least he makes me feel like I was on the verge of making that same brilliant conclusion.  It's very flattering.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1922781931740506468?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1922781931740506468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1922781931740506468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1922781931740506468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1922781931740506468'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/02/im-at-least-teenager-right.html' title='I&apos;m At Least a Teenager, Right?'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-2534106456423865294</id><published>2008-02-10T20:41:00.000-08:00</published><updated>2008-02-10T20:50:14.377-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olpc'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>The XO Plays Movies</title><content type='html'>&lt;p&gt;Video is slightly choppy on the XO, but you can play it with &lt;a href="http://olpcnews.com/forum/index.php?topic=863"&gt;mplayer&lt;/a&gt;.  Sweet!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-2534106456423865294?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/2534106456423865294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=2534106456423865294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/2534106456423865294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/2534106456423865294'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/02/xo-plays-movies.html' title='The XO Plays Movies'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8915327442241844645</id><published>2008-02-01T22:42:00.000-08:00</published><updated>2008-02-01T23:57:34.515-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='olpc'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Puppy Linux</title><content type='html'>&lt;p&gt;I've been making a point lately of perusing "&lt;a href="http://embedded.com"&gt;The Official Site of the Embedded Development Community&lt;/a&gt;," since I consider myself an embedded developer, and well, apparently that's the "Official Site," um, for my, uh, "Community."  It seems more like place for vendors and consultants to promote their business by writing promotional pieces thinly veiled as technical articles, but if it's Official who is a young upstart like me to judge.  Anyway, that's really beside my point.  The reason I'm writing is that there was one article that caught my eye this week about &lt;a href="http://embedded.com/columns/technicalinsights/205918715"&gt;building your own Linux distribution&lt;/a&gt;.  The main thing &lt;em&gt;I&lt;/em&gt; got out of it was to learn of the existence of &lt;a href="http://www.puppylinux.com/"&gt;Puppy Linux&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After the glowing review the author of the article gave of its distribution building tools, I read up a little more on Puppy, and decided to give it a try.  Let me just report to you, that it is sweet!  I'm typing this on my 7 and a half year-old &lt;a href="http://www-307.ibm.com/pc/support/site.wss/MIGR-4JSQHB.html"&gt;Thinkpad T20&lt;/a&gt; laptop (yes it really came with Windows 2000) that has been collecting dust on my shelf for the past year or so, running Puppy Linux.  It feels nearly as snappy as my desktop Core 2 Duo machine that has two processor cores running more than twice as fast as the 700 MHz speed demon in this baby has 16 times the 128 MB of RAM.  The reason Puppy can make this old Stinkpad fly is that the whole OS download was about 90 MB, and when you boot the liveCD, it loads the whole thing into RAM and runs from there.  There is no waiting for the hard drive or the CD drive to spin.  Well, almost none.  I think it could use a little bit more than my 128 MB or RAM to load everything off of the CD, but for the most part my machine is running fast, and eerily quiet.  I like it.&lt;/p&gt;

&lt;p&gt;To squeeze things into 90 MB they have replaced any app that you might be familiar with from Ubuntu with something else.  No Gnome, OpenOffice, Firefox, Nautilus, or even a terminal emulator that you are used to.  It's JWM, Gnumeric/Abiword, Seamonkey, ROX-Filer, and rxvt.  It's Linux, but not one most Linux users see on a daily basis.  Seamonkey, it seems, is good old Mozilla, with the email client and web browser all built into one.  It even has the old clunky looking icons and dialogs from the Netscape/Mozilla days.  The whole desktop gives me an old-school Linux feel.  It's not like these new polished and graphically designed Linux desktops of today.  That's pretty fitting for this laptop I'm running on actually.  I think I installed Redhat 7.3 on it when I first bought it.  Come to think of it, maybe it's not Puppy that looks old-school, but just this washed out, crusty old LCD.  Seamonkey is ugly though, no monitor issues there. OK, enough of the time warp back to the summer of 2001. The apps are different, but capable.  And did I mention they were fast?&lt;/p&gt;

&lt;p&gt;Puppy has some seriously nice ease-of-use features, on top of being really fast.  The desktop background has a few paragraphs explaining where you are at, how to get online, and where to go for help.  Every directory has a little README.txt file that explains what it's for.  I sure could have used that the first time I booted Caldera OpenLinux back in the 20th century!  Flash is included (youtube worked!), and it reportedly plays encrypted DVDs and everything.&lt;/p&gt;

&lt;p&gt;When I slipped in my PCMCIA wireless card (when was the last time you did that!) and clicked the "Connect" icon on the desktop it found the card and walked me through getting online.  I noticed a few other wizard type tools had very verbose and helpful info right there in your face as part of the GUI.  I don't mind reading and it made the unfamiliar tools very easy to get going with.  I'm like documentation.&lt;/p&gt;

&lt;p&gt;I've got more to explore.  Puppy Linux is supposed to be really easy to tweak and build your own distribution with.  You can make it boot form a USB drive instead of a CD.  I'm thinking it would be pretty awesome to run it on the &lt;a href="http://bryan-murdock.blogspot.com/search/label/olpc"&gt;XO&lt;/a&gt;.  I'll keep you posted.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8915327442241844645?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8915327442241844645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8915327442241844645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8915327442241844645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8915327442241844645'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/02/puppy-linux.html' title='Puppy Linux'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-4840074080848390141</id><published>2008-01-28T10:12:00.000-08:00</published><updated>2008-01-28T10:39:27.836-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Source Code Browsing</title><content type='html'>&lt;p&gt;A co-worker recommended &lt;a href="http://www.gnu.org/software/global/"&gt;GNU Global&lt;/a&gt; for browsing source code a few days ago.  It was pretty easy to set up.  Install it and then go to the root of your source tree and type &lt;code&gt;gtags&lt;/code&gt;.  Then you can run global on the command line and try it out.  Try things like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;global funcName&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;global -x funcName&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;global -rx funcName&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;global -sx varName&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That should give you the idea that it can find a function definition and all its references, or a variable name and all its references pretty quickly.  Very handy.&lt;/p&gt;

&lt;p&gt;There is an emacs interface as well.  Load gtags.el (comes with global), open a file, and do &lt;code&gt;M-x gtags-mode&lt;/code&gt;.  &lt;code&gt;c-h m&lt;/code&gt; will show you the commands gtags-mode provides for doing the same thing we just did on the command line.&lt;/p&gt;

&lt;p&gt;I'm not sure if I'm going to switch to using global/gtags.  I already use a combination of &lt;a href="http://cscope.sourceforge.net/"&gt;cscope&lt;/a&gt; and &lt;a href="http://ctags.sourceforge.net/"&gt;Exuberant ctags&lt;/a&gt;, both of which have their strengths, and both of which have emacs interfaces, naturally.  They all seem to have troubles parsing out tags/symbols in my C++ code in various places, but for the most part they work well.  My quick testing showed that GNU Globals did a little worse than what I'm already using using.  You can see some issues it has &lt;a href="http://www.gnu.org/software/global/bugs.html"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Overall, if you aren't already using a tool like this to help you browse your code (maybe you're using good ol' find and grep), I highly recommend picking up one (or more) of these tools.  They are a lifesaver.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-4840074080848390141?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/4840074080848390141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=4840074080848390141' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4840074080848390141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4840074080848390141'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/01/source-code-browsing.html' title='Source Code Browsing'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1882726737010505198</id><published>2008-01-14T21:56:00.000-08:00</published><updated>2008-01-14T22:07:23.996-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olpc'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Windows XP on the XO!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2oYUaFZ6U14/R4xLQ2nKb7I/AAAAAAAAADE/sGkZXEqWgwY/s1600-h/HPIM0196.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_2oYUaFZ6U14/R4xLQ2nKb7I/AAAAAAAAADE/sGkZXEqWgwY/s400/HPIM0196.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5155578426342141874" /&gt;&lt;/a&gt;
&lt;p&gt;Yes, that's Windoze XP on my XO laptop.  Click on the image for a larger version.  The resolution doesn't quite match the XO screen's native resolution.  Minor detail.&lt;/p&gt;

&lt;p&gt;OK, so it's not running &lt;em&gt;directly&lt;/em&gt; on the XO hardware.  It's running on a &lt;a href="http://kvm.qumranet.com/kvmwiki"&gt;KVM&lt;/a&gt; virtual machine.&lt;/p&gt;&lt;p&gt;  And actually, that's not running on the XO hardware either.  It's running on my Core 2 Duo machine that runs Ubuntu.  What's running on the XO is an ssh client, an X server, and some good wifi networking.  The XO makes a sweet little thin client.&lt;/p&gt;

&lt;p&gt;So, um, nothing really to see here.  Sorry if I got anyone's hopes up.  Or fears.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1882726737010505198?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1882726737010505198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1882726737010505198' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1882726737010505198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1882726737010505198'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/01/windows-xp-on-xo.html' title='Windows XP on the XO!'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_2oYUaFZ6U14/R4xLQ2nKb7I/AAAAAAAAADE/sGkZXEqWgwY/s72-c/HPIM0196.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-2188150212018114576</id><published>2008-01-09T22:26:00.000-08:00</published><updated>2008-01-09T23:23:35.149-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olpc'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>One Man's Trash is Another Man's Treasure</title><content type='html'>&lt;p&gt;I just wanted to say a big thank you to &lt;a href="http://theonda.org/"&gt;Antonio&lt;/a&gt; for &lt;a href="http://theonda.org/articles/2008/01/05/the-olpc-nightmare"&gt;bamboozling&lt;/a&gt; me into buying an XO laptop.  I had forgotten that it was his blog entry that got me going with the idea of buying one.  I'm so glad I did. I love it.  My kids love it.  And we've barely scratched the surface of what we can do with it.  My 7-year old confidently explained to my 3-year old, "It doesn't have any games," yet he can't leave it alone.  He's choosing to play with the XO instead of mindless &lt;a href="http://www.pbskids.org"&gt;pbskids.org&lt;/a&gt; games or watching TV.  He hasn't even found the Record or Measure activities yet!  That is success.&lt;/p&gt;

&lt;p&gt;So um, Antonio, if you really don't have use for your, "plastic paperweight," I'd love to take it off your hands.  With only one around the house, we haven't been able to try out the Chat activity or other sharing features yet.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-2188150212018114576?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/2188150212018114576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=2188150212018114576' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/2188150212018114576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/2188150212018114576'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/01/one-mans-trash-is-another-mans-treasure.html' title='One Man&apos;s Trash is Another Man&apos;s Treasure'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-9192611994450655049</id><published>2008-01-05T14:25:00.000-08:00</published><updated>2008-01-05T16:32:13.679-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olpc'/><title type='text'>It Arrived!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2oYUaFZ6U14/R4AUZmnKb5I/AAAAAAAAACY/2HV6YTnfFpo/s1600-h/Photo+by+Bryan.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_2oYUaFZ6U14/R4AUZmnKb5I/AAAAAAAAACY/2HV6YTnfFpo/s400/Photo+by+Bryan.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5152140403805941650" /&gt;&lt;/a&gt;

&lt;p&gt;My XO laptop has arrived!&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2oYUaFZ6U14/R4AWo2nKb6I/AAAAAAAAACg/YKTB_XGjTcM/s1600-h/Photo+by+Bryan_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_2oYUaFZ6U14/R4AWo2nKb6I/AAAAAAAAACg/YKTB_XGjTcM/s400/Photo+by+Bryan_1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5152142864822202274" /&gt;&lt;/a&gt;

&lt;p&gt;And we are impressed.&lt;/p&gt;

&lt;p&gt;It's one awesome machine.  I love the rugged feel.  I had no qualms about letting my 3-year old, or even my 1-year old play with it.  Every portable electronic device should feel this tough and usable.  The 1-year old had a blast with it.  I was really wishing I had a video camera on him.  He sat on the couch with it between his legs and pushed every button with both his fingers and toes.  He flipped the rabbit-ear antenna/latches up and down, rotated the screen, closed it, opened it, cycled through display orientations, and when I got it back from him it typed only in foreign language characters (I had to reboot it to undo that, though I'm sure there's some other way).  He was really mad when I separated him from it.  Hilarious.&lt;/p&gt;

&lt;p&gt;For my usage, the keyboard is too small to touch type, and &lt;a href="http://wiki.laptop.org/go/Wifi_Connectivity#Wireless_Access_Point_Setup"&gt;to get on the internet through my wrt54g I had to change to channel 11&lt;/a&gt; (that took some serious googling to find) but otherwise I have no complaints.  It can't replace my serious work machines, but for browsing the web, checking email, messing around with the camera (as you see above), and playing &lt;a href="http://wiki.laptop.org/go/TamTam"&gt;Tam Tam&lt;/a&gt;, it rocks.  I'll keep playing with it and pushing it to its limits and make some more reports, but for now I'm a pretty happy camper.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-9192611994450655049?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/9192611994450655049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=9192611994450655049' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/9192611994450655049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/9192611994450655049'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/01/it-arrived.html' title='It Arrived!'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_2oYUaFZ6U14/R4AUZmnKb5I/AAAAAAAAACY/2HV6YTnfFpo/s72-c/Photo+by+Bryan.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-7006325859254373513</id><published>2008-01-03T13:09:00.000-08:00</published><updated>2008-01-03T13:49:22.699-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Blogging in the Shadows</title><content type='html'>&lt;p&gt;A while back I set out to find some embedded systems/firmware bloggers.  I had hoped to find something as thought provoking, clever, and interesting as Joel on Software, or Stevey's Drunken blog rants.  I didn't find anything that great at the time, but with a &lt;a href="http://www.benoitlavigne.com/blog/2007/11/26/back-in-the-saddle-take-two/"&gt;nod in my direction&lt;/a&gt; (thanks!!), &lt;a href="http://www.benoitlavigne.com/blog/"&gt;Benoit&lt;/a&gt; has posted a whole slew of interesting blog entries in the past few weeks.&lt;/p&gt;

&lt;p&gt;I haven't had time to read them all, let alone respond, but I wanted to say something.  I had no idea that &lt;a href="http://www.benoitlavigne.com/blog/2007/12/06/toiling-in-the-shadows/"&gt;Canada had a ring ceremony for engineers&lt;/a&gt;.  How cool is that?  The awesome Kipling poem made me all misty eyed.  I loved the &lt;a href="http://www.benoitlavigne.com/blog/2007/12/12/they-almost-sing-about-my-life/"&gt;song about the bubble&lt;/a&gt; too.  I have a cousin from the Bay area who has started two companies and, though not really anything like what's described in this song, ever since his first company I've talked to him and read about that whole world with interest.  Hilarious song.&lt;/p&gt;

&lt;p&gt;I also totally agree that for some reason, even though I love the low-level stuff that I work on, there just &lt;a href="http://www.benoitlavigne.com/blog/2007/12/19/wheres-the-buzz-tell-me-whats-happening/"&gt;isn't that much exciting to talk or read about&lt;/a&gt; in the field for some reason.  So &lt;a href="http://www.benoitlavigne.com/blog/"&gt;what would I like to read about&lt;/a&gt;?  I'll have to think about it.&lt;/p&gt;

&lt;p&gt;Off the top of my head, I think a lot of the buzz in the non-embedded world comes from the fact that you can easily try a lot of the cool stuff out at home for free.  Is there any substance behind all this talk about Ubuntu Linux?  Download it and try it out.  Interested in this Ruby on Rails thing?  Download it and run through the tutorial.  Python?  Java?  Haskell?  Ocaml?  All free, with extensive tutorials included.  The latest web-based gizmo from Google, or Yahoo!, it's free too.  Anyone can try it and write their 2 cents on the matter.  The conversation thrives.&lt;/p&gt;

&lt;p&gt;In the embedded world, not so much.  A commenter &lt;a href="http://www.benoitlavigne.com/blog/2007/12/19/wheres-the-buzz-tell-me-whats-happening/#comments"&gt;gave some examples&lt;/a&gt; of exciting things in the embedded world, but they kind of sit there as meaningless marketing speak or vaporware if I can't test drive them myself.  How about it &lt;a href="http://www.ghs.com/"&gt;Greenhills&lt;/a&gt;?  Your website still looks like it was designed in the '90s.  Have you ever heard of a free download?  Maybe even just a screencast?&lt;/p&gt;

&lt;p&gt;One other difficulty in getting a good conversation about embedded development going is that we all work on very different systems.  Where everyone else in the world develops for Intel processors running either Windows or Linux, we embedded people are all working on custom-made, one-off systems, writing very customized software.  Not many general purpose application frameworks that excite a large crowd of energetic geek bloggers are going to fall out of what we do.  Will they?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-7006325859254373513?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/7006325859254373513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=7006325859254373513' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/7006325859254373513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/7006325859254373513'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2008/01/blogging-in-shadows.html' title='Blogging in the Shadows'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-4035667783546815639</id><published>2007-12-31T12:07:00.001-08:00</published><updated>2007-12-31T12:46:16.642-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='olpc'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>XO Laptop On Its Way</title><content type='html'>&lt;p&gt;While high on &lt;a href="http://en.wikipedia.org/wiki/Vicodin"&gt;Vicodin&lt;/a&gt; after my knee surgery, I disobeyed the post-surgery advice that said not to make any big decisions and I purchased an &lt;a href="http://www.laptop.org/"&gt;XO Laptop&lt;/a&gt; through the &lt;a href="http://laptopgiving.org/en/index.php"&gt;Give One Get One&lt;/a&gt; program.  I really should have written about this sooner, because now it's too late for me to talk anyone else into doing it with me.  The program ended December 31st.  I think I was feeling a bit guilty about spending the money, especially while under a pain-killer induced haze.  I'm not usually that irresponsible!  The more I learn about the laptop, though, the more the guilt is replaced with excitement.  This is one &lt;a href="http://bc.tech.coop/blog/071112.html"&gt;freaking&lt;/a&gt; &lt;a href="http://video.google.com/videoplay?docid=-4285568518538296189"&gt;cool&lt;/a&gt; &lt;a href="http://www.nytimes.com/2007/10/04/technology/circuits/04pogue.html"&gt;computer&lt;/a&gt;.  The video of Ivan Krstic impressed me the most.  Custom ASICs, extreme power management, and serious security (and he's from Croatia, where I lived for two years.  Bok, Ivan!), what more could a geek want?&lt;/p&gt;

&lt;p&gt;Because I didn't order at the beginning of the G1G1 program I knew my laptop wouldn't be arriving in time for Christmas, but I was hoping maybe it'd come in time for my birthday (which is the day after Christmas...).  Now that's it's almost January, the suspense is killing me, when will it arrive?  I searched around a bit and found &lt;a href="http://www.olpcnews.com/sales_talk/g1g1/g1g1_shipping_information.html"&gt;this great bit of advice&lt;/a&gt;, and called FedEx today.  My package from Brightstar is scheduled to arrive this week (they actually told me which day, but in case you are planning on hiding in the bushes at my house and intercepting it, I'm not telling)!  Now I'm really excited.  I have to keep reminding myself to tone down my expectations a little.  It is geared for kids and education, not movie watching and game playing, after all.  I figure that as long as I can read my email with it on a road trip, it'll be worthwhile.  I'll feel warm and fuzzy about the child in Cambodia (or wherever) who gets one too.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-4035667783546815639?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/4035667783546815639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=4035667783546815639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4035667783546815639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4035667783546815639'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/12/xo-laptop-on-its-way.html' title='XO Laptop On Its Way'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-5098656842491707388</id><published>2007-12-30T16:33:00.000-08:00</published><updated>2007-12-30T17:25:48.731-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Lego Digital Designer</title><content type='html'>&lt;p&gt;My boys got some Legos for Christmas (of course!), and my 7-year old brought me the brochure that came with his set and said, "Dad, go to &lt;a href="http://shop.lego.com/"&gt;legoshop.com&lt;/a&gt;!"  I obliged and he, my three-year old, and I had fun looking at the expensive Death Star and Millenium Falcon sets for a while.  Then we poked around some more and discovered the &lt;a href="http://ldd.lego.com/"&gt;Lego Digital Designer&lt;/a&gt;, which is a very cool program.  It basically let's you build with Legos on your computer in 3D--kind of a little Lego CAD program.  Finding pieces is much easier than digging through the big pile on the floor.  You can rotate views, zoom in and out, and play to your heats content.  You can also take screenshots of your designs, print them out, or even send your designs to Lego and they'll box up all the pieces needed for it and sell the kit to you.  Genius!&lt;/p&gt;

&lt;p&gt;It gives you some base models you can use to get started.  My boys liked starting with those and they had a lot of fun just discovering the pieces that were available and how they fit together.  This expands their collection a lot, and Mom doesn't have to worry about our one-year old finding small pieces on the floor to eat.  Here's a screenshot of one of their creations:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2oYUaFZ6U14/R3hBNGnKb4I/AAAAAAAAACQ/dyW85c7PeqI/s1600-h/LDDScreenShot1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_2oYUaFZ6U14/R3hBNGnKb4I/AAAAAAAAACQ/dyW85c7PeqI/s400/LDDScreenShot1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5149937867267141506" /&gt;&lt;/a&gt;

&lt;p&gt;You gotta love the disembodied heads.&lt;/p&gt;

&lt;p&gt;The widoze software (there was a Mac version too) runs under wine on my two Gutsy Gibbon boxes (one for each boy, luckily).  The fast Core 2 Duo machine seems to have no problems with it, but it locks up the old Celeron machine at frustrating times.  Overall, It's really fun to play with.  I'll probably have to install it on my laptop too so I don't have to fight my boys for time to play.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-5098656842491707388?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/5098656842491707388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=5098656842491707388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5098656842491707388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5098656842491707388'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/12/lego-digital-designer.html' title='Lego Digital Designer'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_2oYUaFZ6U14/R3hBNGnKb4I/AAAAAAAAACQ/dyW85c7PeqI/s72-c/LDDScreenShot1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1205746550132626479</id><published>2007-12-21T15:47:00.000-08:00</published><updated>2007-12-21T15:47:05.521-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>My c-x c-s Muscles Are Getting Tired.</title><content type='html'>&lt;p&gt;I've used some of the online office apps a bit, such as Google Docs, and I really like that you don't have to continually save your work.  They take care of that for you.  The blogger web interface that I'm using to type this entry does the same thing.  A few people I work with are big Microsoft One Note fans, and it doesn't even have a save button.&lt;/p&gt;

&lt;p&gt;I believe it's time for emacs to save my files for me.  I have a c-x c-s twitch that I'd like to get rid of.  I hunted around a bit, thinking that I couldn't have been the first emacs user to think of this, but I didn't have much luck.  It turns out that Emacs does &lt;a href="http://www.emacswiki.org/cgi-bin/wiki/AutoSave"&gt;save your work for you automatically&lt;/a&gt;, but it's not quite what I'm looking for.  It saves to separate back up files that you have to use special commands to recover information from, and it still bugs you about saving whenever you do things like compile or exit.  Of course I want to save my work!&lt;/p&gt;

&lt;p&gt;Is there really no good auto-save feature for emacs?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1205746550132626479?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1205746550132626479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1205746550132626479' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1205746550132626479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1205746550132626479'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/12/my-c-x-c-s-muscles-are-getting-tired.html' title='My c-x c-s Muscles Are Getting Tired.'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1961006389801283899</id><published>2007-12-15T22:44:00.000-08:00</published><updated>2007-12-17T21:48:45.062-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Resize a QEMU/KVM Windows Disk Image</title><content type='html'>&lt;p&gt;After &lt;a href="/2007/11/running-gos-under-qemu-on-ubuntu.html"&gt;playing with kvm and qemu during my knee surgery recovery&lt;/a&gt;, I got hooked.  I have a working &lt;a href="https://help.ubuntu.com/community/WindowsXPUnderQemuHowTo"&gt;windoze XP install running under kvm&lt;/a&gt; on my Core 2 Duo, Ubuntu Gutsy Gibbon box, and it flies.  It almost, almost feels like native speed (I also got help &lt;a href="http://www.michaeldolan.com/1030"&gt;here&lt;/a&gt; and &lt;a href="http://kvm.qumranet.com/kvmwiki/Windows_ACPI_Workaround"&gt;here&lt;/a&gt;).  It's great.  Except, not being a regular windoze user, I'd lost track of how much space a windoze installation (and all the service packs and security updates) needs.  When I created my original hard drive image file I made it 6 GB, which, it turns out, is too small.  I didn't want to just create a new disk image and re-install, it took a lot of work to get this image up to it's full 6 GB glory.&lt;/p&gt;

&lt;p&gt;I hunted and found &lt;a href="http://kev.coolcavemen.com/2007/04/how-to-grow-any-qemu-system-image/"&gt;some instructions&lt;/a&gt; for &lt;a href="http://calamari.reverse-dns.net:980/cgi-bin/moin.cgi/FrequentlyAskedQuestions#head-b46370d3ad030e6c1712338f0e5112228c51212a"&gt;resizing qcow (qemu copy-on-write) disk images&lt;/a&gt;, but they just didn't work for me.  Once I converted from qcow (qcow2 actually) to raw, windoze wouldn't boot on the raw image. Gparted didn't show any partitioned drive space either.  Then I remembered I'd always wanted to try clonezilla.  Perfect.  After downloading the &lt;a href="http://clonezilla.sourceforge.net/"&gt;bootable clonezilla iso&lt;/a&gt;, and the &lt;a href="http://gparted-livecd.tuxfamily.org/"&gt;bootable gparted iso&lt;/a&gt;, I went to work like so:&lt;/p&gt;

&lt;p&gt;First, create a new, bigger drive image (Don't worry, it will start really small and grow as you use the space):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;qemu-img create -f qcow2 windoze.qcow2 100G&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Next, boot up windoze with this new second hard drive (this also shows some of the extra options I use to get sound and stuff, as well as wrapping it all in aoss so I can hear the annoying windoze boot-up sounds):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;aoss kvm -soundhw all -cdrom /dev/cdrom -localtime -m 512 -hda original-windoze.img -hdb windoze.qcow2&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I don't know if that was needed, but a "Found New Hardware" bubble came up and I felt good that the second hard drive seemed to have been found.&lt;/p&gt;

&lt;p&gt;Next, boot from the clonezilla CD image:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;aoss kvm -soundhw all -cdrom ~/downloads/clonezilla-live-1.0.3-21.iso -localtime -m 512 -hda original-windoze.img -hdb windoze.qcow2 -boot d
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then you go through the clonezilla wizard to clone the one hard drive to the other.  This was very straightforward.  I went away for a few hours and when I came back it was done.  I'm not sure how long it took.&lt;/p&gt;

&lt;p&gt;I think I booted windows again at this point with just the new windoze.qcow2 image to make sure it worked, and it did.  Amazing.&lt;/p&gt;

&lt;p&gt;Then I booted gparted to grow the partition to be the full size of the disk:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;aoss kvm -soundhw all -cdrom ~/downloads/gparted-livecd-0.3.4-10.iso -localtime -m 512 -boot d windoze.qcow2 &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Gparted was very simple to use and it grew the ntfs partition to the full 100 GB in about 2 seconds.  One more reboot back into windows and I had my new, larger virtual hard drive all working.  Pretty sweet.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1961006389801283899?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1961006389801283899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1961006389801283899' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1961006389801283899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1961006389801283899'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/12/resize-qemukvm-windows-disk-image.html' title='Resize a QEMU/KVM Windows Disk Image'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8446999543237178490</id><published>2007-12-08T16:22:00.000-08:00</published><updated>2007-12-08T16:22:34.382-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosopy'/><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><title type='text'>Next Big Language--UML?</title><content type='html'>&lt;p&gt;I took a class at work called, "Real-Time Software Design with UML 2.0."  The instructor seemed to think that it was destined to be the &lt;a href="http://www.google.com/search?q=next+big+language"&gt;Next Big Language&lt;/a&gt;.  I have my doubts.&lt;/p&gt;

&lt;p&gt;When I &lt;a href="http://c2.com/xp/TheSourceCodeIsTheDesign.html"&gt;design with code&lt;/a&gt;, I can type it very quickly and even somewhat sloppily into a &lt;a href="http://www.gnu.org/software/emacs/"&gt;code editor&lt;/a&gt;.  The editor will then take care of formatting it all nicely, indenting, spacing, presenting with an nice font, colorizing the various code constructs, and so forth.  I just have to get the ideas expressed and the tool takes care of most of the formatting for me.  Even more, it's saved in a simple text format that is universal.  Any text editor on any operating system will understand it.  Once I've written the code, I then have a compiler and/or linter that will tell me if I've left off any key constructs, made any syntax mistakes, or any of a number of common logical errors.  Basically, with the good tool support that is out there, I can write code as fast or faster than I can dream it up.&lt;/p&gt;

&lt;p&gt;With UML, from what I can gather, it seems like you get none of that.  You either draw on paper or a whiteboard which obviously makes the formatting a manual process.  At least a whiteboard is easier to erase and redraw something than paper, but I'm still very slow at drawing stuff out, and I find myself either spending too much time making sure my boxes and lines are neat and nice, or I end up with an incredibly messy drawing.  With Visio or other diagramming tools, you get nice straight lines, but you still get to worry about the niggly things like where to place your bubbles and boxes, how to arrange your arrows.  Should it flow from left to right or top to bottom or just have a spaghetti mess of boxes and arrows all over the place?  Not to mention there is nothing to verify that you are using proper UML syntax, and that you haven't left anything basic to a coherent design out.  I find that having to think about all these details distracts me from the actual design work.  Then, once you've painstakingly drawn it all out in one tool, you are stuck with that tool.  Want to share your design with someone else?  Sure, you can print it (did you draw it so that it fits nicely on letter size sheets of paper?), or export it to a PDF, but if someone else wants to edit the diagrams, they need to use the same tool you did.  Let's not even mention collaborative design editing and revision control.&lt;/p&gt;

&lt;p&gt;Despite all this, Glennan Carnie from &lt;a href="http://www.feabhas.com/"&gt;Feabhas&lt;/a&gt; told a very convincing story this week.  I came into this course very skeptical, and for the most part he had an answer for all of my concerns.  And pretty good answers too.  In a short, intense, week-long course it's hard to evaluate whether everything he says is really practical and useful in the real world, but the way he tells it I'm at a point where I'd be willing to give it a try...I mean, have a go at it (did I mention Glen is British?).&lt;/p&gt;

&lt;p&gt;This course was not at all what I expected.  Glennan freely pointed out all the flaws, idiosyncrasies, and shortcomings of the UML standard, other UML proponents, and even his own lecture slides.  He made sure to point out more than once that UML is no silver bullet and that design is still difficult to get right.  Instead of presenting UML in glowing worshipful tones, he presented it as a useful tool that can help you systematically design an entire object oriented software system.  A tool which can be used to design first at a high level, ignoring implementation details, and then which can be used to refine the design down in a number of steps all the way to the nitty-gritty details of deciding how big a message queue is needed to communicate between two threads, and what the format of the message should be.  It's very impressive.&lt;/p&gt;

&lt;p&gt;Still, I wonder how it would work to go from an ideal solution to the heavily constrained designs that are needed for my work.  Low-level ASIC driver stuff would be an interesting case-study.  Too bad we didn't have more time with him to get into some of our own stuff like that.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.feabhas.com/uml_training_courses/uml_training_courses_oo-503.html"&gt;Course description.&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8446999543237178490?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8446999543237178490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8446999543237178490' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8446999543237178490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8446999543237178490'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/10/next-big-language-uml.html' title='Next Big Language--UML?'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1962795873399767737</id><published>2007-11-25T18:07:00.000-08:00</published><updated>2007-11-30T09:05:29.475-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>ReCAPTCHA and Django FreeComments</title><content type='html'>&lt;p&gt;My little family blog has been discovered by spammers.  They have started leaving comments on my &lt;a href="http://www.djangoproject.com"&gt;Django&lt;/a&gt; powered blog.  Not very often, but enough to be annoying.  I heard about &lt;a href="http://recaptcha.net/"&gt;reCAPTCHA&lt;/a&gt; and thought it was a fabulous idea, so I decided that was how I wanted to up the ante for the spammers on my blog.  Integrating reCAPTCHA with the &lt;a href="http://code.djangoproject.com/wiki/UsingFreeComment"&gt;Django freecomments&lt;/a&gt; wasn&amp;#8217;t as easy as I thought it would be though, so I want to write down how I made it work in case it will help somebody else down the road.&lt;/p&gt;

 &lt;p&gt;First of all, I did my due diligence and googled for help.  I didn&amp;#8217;t find much, but I found &lt;a href="http://groups.google.com/group/django-users/browse_thread/thread/39419d308ffa4cc0/a2fdc672cde8cf67?lnk=gst&amp;#38;q=recaptcha#a2fdc672cde8cf67"&gt;an email&lt;/a&gt;, &lt;a href="http://www.djangosnippets.org/snippets/478/"&gt;a snippet&lt;/a&gt;, and &lt;a href="http://nikolajbaer.us/blog/recaptcha-django-free-comments/#comments"&gt;a blog&lt;/a&gt; that got me going in the right direction.  While I&amp;#8217;m citing references here, I also made use of &lt;a href="http://code.djangoproject.com/wiki/UsingFreeComment"&gt;the comments page on the Django wiki&lt;/a&gt;, and &lt;a href="http://www.djangoproject.com/documentation/request_response/"&gt;the request and response documentation&lt;/a&gt; too.  The &lt;a href="http://recaptcha.net/apidocs/captcha/"&gt;reCAPTCHA api docs&lt;/a&gt; were vital as well.&lt;/p&gt;

 &lt;p&gt;OK, after doing my reading googling I got to work.  I registered for a set of reCAPTCHA keys, downloaded the &lt;a href="http://pypi.python.org/pypi/recaptcha-client"&gt;recaptcha-client&lt;/a&gt; python library.  I did the easy install thing to get it, but after doing just that my scripts still couldn&amp;#8217;t import the module.  I ended up just putting captcha.py in my Django project directory.&lt;/p&gt;

 &lt;p&gt;I use the freecomments in exactly the same way that the &lt;a href="http://www.djangoproject.com/weblog/"&gt;Django blog&lt;/a&gt; does (they supplied all &lt;a href="http://code.djangoproject.com/browser/djangoproject.com/django_website/apps/blog"&gt;the code&lt;/a&gt; for me, it was the easiest thing to do), so I&amp;#8217;ll just talk in terms of that (I&amp;#8217;m not ready to share my family blog with the world just yet).  The Django blog has a &lt;a href="http://www.djangoproject.com/weblog/2007/nov/07/sprint/"&gt;comment form at the end of each entry&lt;/a&gt; (scroll all the way down to see it).  Typing your comment here and clicking the Preview Comment button takes you to a preview page (go ahead and try it, you won&amp;#8217;t be posting a comment at this point).  It&amp;#8217;s on the preview page where you find the final submit button.  This is where I decided the captcha would go.  Spambots can preview comments freely, but to submit, the captcha test has to be passed.  I kind of wanted to require the captcha for even previewing, but that was going to be too difficult, and probably too annoying for legitimate commentators.&lt;/p&gt;

 &lt;p&gt;The way to make this work was to wrap the post_free_comment view with a view of my own in order to evaluate the captcha before allowing a comment to be posted.  Here&amp;#8217;s the whole thing:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def postfree_wrapper( request, extra_context = {} ):
    if not request.POST:
        raise Http404, _("Only POSTs are allowed")

    extra_context["recaptcha_error"] = False
    if 'preview' in request.POST:
        # no captcha test needed, but supply the captcha html
        extra_context["recaptcha_html"] = captcha.displayhtml(
            settings.RECAPTCHA_PUB_KEY )
        return post_free_comment(request, extra_context)

    if 'post' in request.POST:
        # test captcha before submitting comment

        try:
            recaptcha_challenge_field, recaptcha_response_field = \
                request.POST['recaptcha_challenge_field'], \
                request.POST['recaptcha_response_field']
        except keyError:
            raise Http404, _("No recaptcha fields submitted")
        check_captcha = captcha.submit(recaptcha_challenge_field,
                                       recaptcha_response_field,
                                       settings.RECAPTCHA_PRIV_KEY, 
                                       request.META['REMOTE_ADDR'])

        if check_captcha.is_valid is False:
            extra_context["recaptcha_error"] = True
            #extra_context["recaptcha_error_code"] = check_captcha.error_code
            extra_context["recaptcha_html"] = captcha.displayhtml(
                settings.RECAPTCHA_PUB_KEY, False, check_captcha.error_code )

            # modify the POST object so that it has a 'preview' key in
            # it.  This will cause the post_free_comment method to
            # *not* save the comment, instead it will redisplay the
            # comment preview.
            mutable_post = request.POST.copy()
            mutable_post['preview'] = True
            request.POST = mutable_post

        return post_free_comment(request, extra_context)

    raise Http404, _("No preview or post from comment form")
&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;I figured out how to do most of this from looking at the &lt;a href="http://code.djangoproject.com/browser/django/trunk/django/contrib/comments/views/comments.py"&gt;actual post_free_comment view&lt;/a&gt;.  To briefly explain, the view is used whether the comment is being previewed or posted.  If it&amp;#8217;s a preview, I generate the captcha html using captcha.py and add it to the response context, and forward everything on to the real post_free_comment view.  It does all the real work, and my template will be able to display the captcha html.  If it&amp;#8217;s a post, I check the captcha using captcha.py.  Then, if the captcha was valid I just forward everything on to the real post_free_comment view and it handles validation and posting of the comment.  If the captcha was not valid, I add a recaptcha_error to the context for my template, generate new captcha html, and then do a little trick to get the real post_free_comment view to treat the request as a preview instead of a post.  That was the real trick to all of this that I feel clever about.&lt;/p&gt;

 &lt;p&gt;To get this view called I had to modify my urls.py and add this ahead of the comments urls include:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; ( r'^comments/postfree/', 'postfree_wrapper' ),&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;Next I needed to modify my free_preview.html template to display the captcha and some helpful text above it.  To do that, I only had to add this to my template:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{% if recaptcha_error %}
    &amp;lt;p&amp;gt;Oops!  Those must have been too hard to read.  Please try again.&amp;lt;/p&amp;gt;
{% else %}
    &amp;lt;p&amp;gt;If your comment looks good, simply type the words in the box to
          prove you aren't an evil robot, and then click Post.&amp;lt;/p&amp;gt;
{% endif %}
{{ recaptcha_html }}
&lt;/code&gt;&lt;/pre&gt;

 &lt;p&gt;I put this right above the &amp;#8220;Post public comment&amp;#8221; button of the form.  You can see an entire free_preview.html template &lt;a href="http://code.djangoproject.com/wiki/UsingFreeComment"&gt;on the wiki&lt;/a&gt; (scroll down a ways).  Mine looks an awful lot like that one, with only the above addition.&lt;/p&gt;

 &lt;p&gt;Lastly, add your reCAPTCHA keys to your settings.py, like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RECAPTCHA_PUB_KEY = ''thisisabiglongpublickeythatyougetfromrecapthca
RECAPTCHA_PRIV_KEY = 'andthisisabiglongprivatekeythatyoualsogetfromrecaptcha'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And that's it.  I hope that helps some other poor soul who wants to add reCAPTCHA to their Django powered blog, but who doesn't have the spare time laying on a couch with their leg elevated after surgery to figure it all out like I did.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1962795873399767737?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1962795873399767737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1962795873399767737' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1962795873399767737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1962795873399767737'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/11/recaptcha-and-django-freecomments.html' title='ReCAPTCHA and Django FreeComments'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8913419737520705628</id><published>2007-11-23T21:15:00.001-08:00</published><updated>2007-11-23T21:52:27.867-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Running gOS under QEMU on Ubuntu</title><content type='html'>&lt;p&gt;I'm stuck on the couch with my knee elevated after having had surgery on Tuesday.  I tore my meniscus playing Ultimate (a non-contact sport if ever there was one.  I think I've just decided that cleats are the root of all evil).  So, being stuck on the couch, I've been reading a lot and playing with my computer, of course.&lt;/p&gt;

&lt;p&gt;I downloaded the CD image for &lt;a href="http://www.thinkgos.com/"&gt;gOS&lt;/a&gt; a couple weeks ago, and I finally decided to give it a try.  I couldn't just burn it to a CD and boot it up though.  Where's the fun in that?  I decided to try it under &lt;a href="http://kvm.qumranet.com/kvmwiki"&gt;kvm&lt;/a&gt; on my Ubuntu Gutsy Gibbon box instead.  Turns out, that doesn't work.  It just crashes with the cryptic message, "exception 6 (0)" and some kind of register dump.&lt;/p&gt;

&lt;p&gt;Since you have to install &lt;a href="http://fabrice.bellard.free.fr/qemu/"&gt;qemu&lt;/a&gt; in order to run kvm, I tried running it under qemu next.  It started to boot, but then got to a point where it just dropped me to a busybox shell with a prompt like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(initramfs) _&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Turns out, after some googling, that this is a &lt;a href="https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.22/+bug/120316"&gt;known issue&lt;/a&gt;, and this workaround worked for me:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;In the boot menu
 1. Push F6 ( Other Options)
 2. remove: "quiet splash --"
 3. add: "break=top"
 4. Push Enter

Later when you see "/bin/sh: can't access tty; job control turned off"

type the following:
 modprobe ide-generic
 exit

...Start from CD image continues :-)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It then took a while (this is with the &lt;a href="https://help.ubuntu.com/community/WindowsXPUnderQemuHowTo"&gt;kqemu kernel module&lt;/a&gt; installed), but once it was all booted up it ran pretty darn well.  I was impressed with the smooth little toolbar at the bottom of the screen with icons for all the google applications.  Very nice idea.  I'm impressed with qemu too.  Once I followed the instructions I linked to, it was easy to set up and runs things pretty quickly.  It was a fun little adventure while icing my knee on the couch.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8913419737520705628?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8913419737520705628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8913419737520705628' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8913419737520705628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8913419737520705628'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/11/running-gos-under-qemu-on-ubuntu.html' title='Running gOS under QEMU on Ubuntu'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1277726229962638310</id><published>2007-11-23T11:38:00.000-08:00</published><updated>2007-11-23T11:58:52.400-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Getting Desktop Effects Back for Gutsy</title><content type='html'>&lt;p&gt;When I upgraded my Ubuntu machines from Feisty Fawn to Gutsy Gibbon the cool beryl/compiz desktop effects stopped being so cool.  I have learned how to fix it, however, from a few &lt;a href="http://forlong.blogage.de/article/2007/8/29/How-to-install-Compiz-Fusion-on-Ubuntu-Feisty---tutorial-for-advanced-andor-KDE-as-well-as-Xfce-users"&gt;awesome &lt;/a&gt; &lt;a href="http://forlong.blogage.de/article/2007/8/26/The-best-way-to-install-Compiz-Fusion-on-Ubuntu-Feisty"&gt;blog&lt;/a&gt; &lt;a href="http://forlong.blogage.de/article/2007/8/29/How-to-set-up-Compiz-Fusion"&gt;entries&lt;/a&gt;.  Here's how I did it.&lt;/p&gt;

&lt;p&gt;First, remove any oddball compiz/berylemerald repositories from your sources.list.  Everything you need is in the standard Ubuntu Gutsy Gibbon repositories.&lt;/p&gt;

&lt;p&gt;Next, remove any compiz/beryl packages that you previously had installed:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
sudo apt-get remove compiz* &amp;&amp; sudo apt-get autoremove
sudo apt-get remove beryl* emerald* &amp;&amp; sudo apt-get autoremove
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, install the needful compiz packages:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
sudo aptitude install compiz compizconfig-settings-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you can turn it on by running System-&gt;Preferences-&gt;Appearance and the clicking over to the Visual Effects tab.  Choose Custom and then click on Preferences to bring up the settings manager.  Then you can follow the &lt;a href="http://forlong.blogage.de/article/2007/8/29/How-to-set-up-Compiz-Fusion"&gt;How to set up Compiz Fusion&lt;/a&gt; instructions to get wobbly windows, desktop cube, and all the other good stuff set up.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1277726229962638310?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1277726229962638310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1277726229962638310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1277726229962638310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1277726229962638310'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/11/getting-desktop-effects-back-for-gutsy.html' title='Getting Desktop Effects Back for Gutsy'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-3925068300471815325</id><published>2007-11-03T20:04:00.000-07:00</published><updated>2007-11-03T20:18:39.647-07:00</updated><title type='text'>Gutsy and 82801H Audio Controller</title><content type='html'>&lt;p&gt;As I &lt;a href="/2007/10/gutsy-gibbon-upgrades.html"&gt;mentioned&lt;/a&gt; before, sound stopped working when I upgraded from Feisty Fawn to Gutsy Gibbon.  I have the Intel 82801H  (ICH8 Family) HD Audio Controller.  I tried to get it working a few different ways, all following suggestions from various Ubuntu forum and launchpad websites (yes, this seems to be a well known bug), but what finally worked was "Method B" found on &lt;a href="https://wiki.ubuntu.com/Gutsy_Intel_HD_Audio_Controller"&gt;this page&lt;/a&gt;.  Phew!  To celebrate I watched some videos on YouTube.  They are much better when you can hear 'em.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-3925068300471815325?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/3925068300471815325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=3925068300471815325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3925068300471815325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/3925068300471815325'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/11/gutsy-and-82801h-audio-controller.html' title='Gutsy and 82801H Audio Controller'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-5704681273078071280</id><published>2007-11-01T10:09:00.001-07:00</published><updated>2007-12-17T21:49:19.085-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Pretty Emacs for Gutsy</title><content type='html'>&lt;p&gt;Pretty fonts for emacs on Gutsy Gibbon was easy to fix (unlike the &lt;a href="/2007/10/gutsy-gibbon-upgrades.html"&gt;sound problem&lt;/a&gt; I'm having).  Just follow the instructions for &lt;a href="http://peadrop.com/blog/2007/09/17/pretty-emacs-reloaded/"&gt;pretty emacs here&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-5704681273078071280?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/5704681273078071280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=5704681273078071280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5704681273078071280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5704681273078071280'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/11/pretty-emacs-for-gutsy.html' title='Pretty Emacs for Gutsy'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-5681323351847449947</id><published>2007-10-26T22:04:00.000-07:00</published><updated>2007-10-31T22:50:54.162-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Gutsy Gibbon Upgrades</title><content type='html'>&lt;p&gt;I've upgraded all four of my machines (two home machines and two work machines) from Feisty Fawn to Gutsy Gibbon.  Two were pretty simple, the other two were tricky.  One still doesn't have sound, which is really frustrating.  I'm going to write up the gory details for my own benefit.  It'll probably be boring for you.  Sorry, blogs are like that ;-)&lt;/p&gt;

&lt;p&gt;My laptop was the easiest.  I don't keep anything on its hard drive.  It's pretty much used as a thin client, so I could just about do a fresh install every time.  I don't like to have to reconfigure stuff from scratch though, so I did the update-manager upgrade.  It was quick, under two hours, and everything seems to be working fine.  Oh, except my anti-aliased fonts on emacs.  Those went away for some reason.  That happened on all the machines.  I probably just need to add back in the right repository for that.&lt;/p&gt;

&lt;p&gt;The kids' machine at home had a small hiccup.  It's an older celery-on machine and I'm running the Xubuntu desktop.  It also has two 80 GB hard drives that I have in a RAID 0 configuration, for speed (oh yeah!).  The upgrade had no problems with the RAID setup, but partway through update-manager configuring all the new packages, the screensaver came on and locked the screen, and for some reason it would not take my password.  I had to ctrl-alt-1, log in, and kill xscreensaver.  That killed X too though, and I had to manually use dpkg --configure -a to finish the upgrade.  Everything seems fine now though.&lt;/p&gt;

&lt;p&gt;My desktop at work was a chore.  It probably has a fairly non-standard setup for Ubuntu:  nfs mounted home directory, nis authentication, and a whole bunch of automounted nfs directories, and dual displays.  I kept getting an error about packages not being authenticated for some reason.  I thought it had something to do with our proxy, or maybe the repositories were overloaded whenever I tried and I just couldn't get things downloaded properly.  I tried using the alternative install CD to do the upgrade instead of the regular update-manager process, but I either had the same authentication errors, or a strange message about not being able to calculate the upgrade.  I tried putting our web proxy in /etc/apt/apt/conf.d, I tried setting the proxy under System-&gt; Preferences-&gt; NetworkProxy, but what finally worked was setting the http_proxy environment variable in a terminal and then running update-manager from that terminal.  It was weird.&lt;/p&gt;

&lt;p&gt;I left it downloading packages and went home for the night.  When I came back the next morning the screens were black and the keyboard lights were flashing.  I finally use &lt;a href="http://en.wikipedia.org/wiki/Magic_SysRq_key"&gt;magic keys&lt;/a&gt; to reboot it.  X wouldn't come up, so I ctrl-alt-1ed and logged in (as a local user, nis wasn't working either).  I did the same dpkg --configure -a that I had to do in the kiddos laptop and that ran for a while.  At some point X started and the keyboard lights flashed again.  Another reboot, more dpkg, and I got to a point where I encountered the &lt;a href="https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.22/+bug/115616"&gt;device-mapper bug&lt;/a&gt;.  I rebooted with magic keys again, but I booted an older kernel, removed evms as prescribed, and rebooted (nicely this time) again.  I was finally able to get all the way through configuring all the packages, but it said it couldn't configure partially installed packages: acpid, ubuntu-desktop, powermanagement-interface, and acpi-support.  I did an aptitude remove of all of those, and then an aptitude install to get them back, and finally everything seemed to be working.  I did another aptitude update and aptitude full-upgrade just to make sure, rebooted, and now everything seems to be working (except my emacs fonts, dang it!).  Phew!&lt;/p&gt;

&lt;p&gt;Home desktop system.  Everything seemed to go smoothly during the upgrade, however my sound didn't work when it was all said and done.  There was some other weirdness due to an odd repository that I had added, but that was easy to fix.  The sound problem however has not been easy.  It appears to be a known problem.  See &lt;a href="http://ubuntuforums.org/showthread.php?p=3677919"&gt;this&lt;/a&gt; and &lt;a href="http://ubuntuforums.org/showthread.php?t=530374"&gt;this&lt;/a&gt; and &lt;a href="https://wiki.ubuntu.com/Gutsy_Intel_HD_Audio_Controller"&gt;this&lt;/a&gt;.  Yes, lspci shows that I have this audio hardware:&lt;/p&gt;

&lt;pre&gt;
&lt;code&gt;
00:1b.0 Audio device: Intel Corporation 82801H (ICH8 Family) HD Audio Controller (rev 02)
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;I tried the module-assistant steps and my audio still doesn't work.  Grrr.  Ubuntu, you've been so good to me for so long.  Why now?  Why something so basic as sound?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-5681323351847449947?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/5681323351847449947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=5681323351847449947' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5681323351847449947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/5681323351847449947'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/10/gutsy-gibbon-upgrades.html' title='Gutsy Gibbon Upgrades'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-4910582094762338447</id><published>2007-09-25T21:47:00.000-07:00</published><updated>2007-09-25T22:47:11.005-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Is There No Good iPod Software for Linux?</title><content type='html'>&lt;p&gt;What good is a blog if you can't complain and vent your frustrations to the world?  I have a 3rd generation iPod that I won in a raffle way back before anyone even knew what an iPod was really.  The only software that worked with an iPod on Linux in those days was &lt;a href="http://www.gtkpod.org/about.html"&gt;gtkpod&lt;/a&gt;, and let me tell you, using that software was an incredible exercise in patience.  I had about 5 GB of music, and it took about 5 full minutes for gtkpod to display any of my music.  Then if you, say, clicked a tab to have it sort by artist name, it was another 5 minutes for it to redisplay the sorted list of music, and you could do nothing else with gtkpod until it was done with that redisplay.  It was so infuriating, but for some reason I stuck with it.  Once I learned what things would send it off into long periods of unresponsiveness, I carefully avoided clicking on those things and was able to get some music synced up to my iPod.  If I ever did accidentally click the wrong thing and send if off into one of its redisplay cycles I would howl in agony.&lt;/p&gt;

&lt;p&gt;Most recently I've been using &lt;a href="http://amarok.kde.org/"&gt;Amarok&lt;/a&gt; to interface with my iPod on Linux.  My blood pressure has been a lot lower since ditching gtkpod.  It has worked pretty well, but had no support for iPod playlists, which was a bit of a bummer.  I think they've fixed that now, but for some reason the current version of Amarok for my Ubuntu (1.4.7) just crashes when I try and send files over to the iPod.  This bothered me enough today (I don't actually use my iPod much, to be honest) that I tried &lt;a href="http://www.banshee-project.org/"&gt;Banshee&lt;/a&gt;.  I was impressed.  It's pretty slick, and typical for Gnome vs. KDE, much simpler to use than Amarok.  I plugged in my iPod and hit synchronize and it hung for a while, then started to synchronize, and then it crashed.  It looks like maybe it was trying to encode some random wma files (where did those come from?) so it could copy those to the iPod.  That's kind of a nice idea, Banshee, but futile.  Is there any way to turn that "feature" off?  Poking around in the Preferences I see that the default "Output format" for "CD Importing" is AAC.  Um, that's weird.  Anyway, there seems to be no option to tell it to just ignore non-mp3 files when synchronizing.  There's probably a gconf setting...  Maybe I'll try banshee again later.&lt;/p&gt;

&lt;p&gt;So, desperate, I actually fired up gtkpod.  My stomach started to churn as I had it import my music.  It popped up a window telling me that it couldn't import some pdf files, and some text files.  I thought that was fabulously helpful.  Then, once it imported everything, the moment of truth came.   I moused over the Artist column, averted my eyes, and clicked.  My blood pressure instinctively rose and I looked back, and gtkpod was just sitting there with my songs sorted by artist.  I did it again with my eyes open, and it sorted 2402 songs by genre in the blink of an eye.  This was very encouraging.&lt;/p&gt;

&lt;p&gt;I plugged in my iPod next, dismissed Rhythmbox (I &lt;em&gt;know&lt;/em&gt; there's a gconf setting to make that stop, I just haven't bothered to find it.  Can &lt;a href="http://www.gnome.org/projects/rhythmbox/"&gt;Rhythmbox&lt;/a&gt; even write to iPods yet?), and gtkpod couldn't find it.  I had to wade through it's messy preferences dialog and tell it that the iPod wasn't in /media/ipod, but /media/BRY'S IPOD (who knows why?).  After that it acted like it still wasn't working for a while, but then suddenly there was my iPod, playlists and all.   The next test was to see if it would sync up with what's on my hard drive.  I right-clicked on the iPod name and say the old familiar array of choices that never quit made sense to me.  I tried "Sync Playlist with Dir(s)" and it told me "Nothing was changed."  Finally I stumbled upon File-&gt;Update tracks from files and it started to act like it was syncing stuff up.  While it was doing this I noticed that the box above the list of songs that has tabs for Artist, Album, Genre, etc. doesn't actually list those things in alphabetical order.  Very nice.  It gave me no indication of how long this syncing process was going to take but was displaying each song name in that status bar at the bottom for about a half second to a second each.  How long is 2402 seconds?  Well, it didn't take quit that long, but when it was done some new songs that I have on my hard drive but not yet on my iPod where still not on my iPod.  I give up.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-4910582094762338447?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/4910582094762338447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=4910582094762338447' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4910582094762338447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/4910582094762338447'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/09/is-there-no-good-ipod-software-for.html' title='Is There No Good iPod Software for Linux?'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-8209671861014234642</id><published>2007-09-18T22:06:00.000-07:00</published><updated>2007-09-18T22:38:04.097-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Joel's History of Computing</title><content type='html'>&lt;blockquote&gt;But then, while you’re sitting on your googlechair in the googleplex sipping googleccinos and feeling smuggy smug smug smug, new versions of the browsers come out that support cached, compiled JavaScript. And suddenly NewSDK is really fast. And Paul Graham gives them another 6000 boxes of instant noodles to eat, so they stay in business another three years perfecting things.&lt;/blockquote&gt;

&lt;p&gt;I just read &lt;a href="http://www.joelonsoftware.com/items/2007/09/18.html"&gt;this entry from Joel&lt;/a&gt; and I laughed out loud.  It's funny, but it's also incredibly insightful.  In a way, it's Joel's answer to &lt;a href="http://steve-yegge.blogspot.com/2007/02/next-big-language.html"&gt;Steve's New Big Language&lt;/a&gt;, but much more ambitious in its predictions and prognostications.  I like it a lot.&lt;/p&gt;

&lt;p&gt;Just for the record, a few of the genius observations from this essay have briefly visited my thoughts.  I've pondered the various Ajax user interfaces that are all over the place.  I've really been bothered that writing a web application seems to be a major step backwards in development methodologies, not to mention how slow they are.  Of course, I never bothered to write these ideas down and develop them like Joel has here.  I'm kicking myself now for that.  Oh well.&lt;/p&gt;

&lt;p&gt;Actually, lately I've been pondering more about whether embedded software will ever be written in a higher-level language than C or C++ (no, I don't really consider C++ to be higher-level than C).  I think the real-time parts of firmware will always have need to be optimizable down to assembly to squeeze out every last clock cycle, but there are large portions of firmware that aren't real-time.  I guess cell phones are already running Java apps, but if you read Joel's blog entry, you notice that he pointed this scenario out precisely because it's a good example of how badly the Java VM approach works:&lt;/p&gt;

&lt;blockquote&gt;You can follow the p-code/Java model and build a little sandbox on top of the underlying system. But sandboxes are penalty boxes; they’re slow and they suck, which is why Java Applets are dead, dead, dead. To build a sandbox you pretty much doom yourself to running at 1/10th the speed of the underlying platform, and you doom yourself to never supporting any of the cool features that show up on one of the platforms but not the others. (I’m still waiting for someone show me a Java applet for phones that can access any the phone’s features, like the camera, the contacts list, the SMS messages, or the GPS receiver.)&lt;/blockquote&gt;

&lt;p&gt;So I don't think anything more than simple games are going to be written for embedded platforms in a higher level language like Java.  I'm thinking most interpreted languages here, like Python, Ruby, etc. are in that "like Java" group in this scenario (sad, I know).  It's going to have to be something that compiles to "native" code (the machine code for your target processor, of course), but still has high-level language features like memory management, and dynamic typing, and all those other things that we love about Perl, Python, and so forth.  So let's hear it.  What will be the NBL for embedded systems?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-8209671861014234642?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/8209671861014234642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=8209671861014234642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8209671861014234642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/8209671861014234642'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/09/joels-history-of-computing.html' title='Joel&apos;s History of Computing'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3669809752172683097.post-1083422666116565142</id><published>2007-09-18T16:20:00.001-07:00</published><updated>2007-09-18T16:20:02.090-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firmware'/><title type='text'>Refactoring Firmware</title><content type='html'>&lt;p&gt;At &lt;a href="http://steve.yegge.googlepages.com/transformation"&gt;the behest of Steve Yegge&lt;/a&gt;,
I began reading the book, Refactoring, by Martin Fowler. Click the
previous link and read what he has to say about it and see if you
aren't intrigued. That essay, and the fact that my manager had the book
collecting dust on his bookshelf, really made me want to read this book.&lt;/p&gt;

&lt;p&gt;I finally started reading it this weekend, and even though I'm only
52 pages into it (well, I've taken some excursion into other parts of
it, so I've read more like 100 pages), I completely agree with Steve.
This is a good book. The writing is direct, concise, unapologetic, and
still somehow very friendly. It introduces new vocabulary (new to me at
least) seamlessly. There are extensive code examples (yes, you have to
read code, Martin doesn't apologize for that either), but the code is
fairly simple and you get to witness it becoming simpler before your
eyes.&lt;/p&gt;

&lt;p&gt;Here are a couple salient quotes to whet your appetite for this book:&lt;/p&gt;

&lt;blockquote&gt;Any fool can write code that a computer can understand.  Good programmers write code that humans can understand. (p. 15)&lt;/blockquote&gt;

&lt;blockquote&gt;You may be concerned about performance in this case. As
with other performance issues, let it slide for the moment. Nine times
out of ten, it won't matter. (p. 121)&lt;/blockquote&gt;

&lt;p&gt;Some of things he does to clean up code totally made me stop and ask
the same question as Steve, "Is this guy insane, or merely an idiot?"
Actually, for me it was more like, "Sure this looks good for your
desktop software application code, but does any of this apply to
firmware?" The more I think about it, the more I think it can apply in
a lot of places in our firmware. We have a lot of code that isn't
exactly human readable, and I'm pretty sure it doesn't have to be that
way. A lot of the refactorings in this book are things we all do here
and there anyway.&lt;/p&gt;

&lt;p&gt;I have a lot more of this to read, and I need to try some of it out
on my code. This probably isn't the last you'll hear about it from me.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3669809752172683097-1083422666116565142?l=bryan-murdock.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bryan-murdock.blogspot.com/feeds/1083422666116565142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3669809752172683097&amp;postID=1083422666116565142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1083422666116565142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3669809752172683097/posts/default/1083422666116565142'/><link rel='alternate' type='text/html' href='http://bryan-murdock.blogspot.com/2007/09/refactoring-firmware.html' title='Refactoring Firmware'/><author><name>Bryan</name><uri>http://www.blogger.com/profile/11394436715172971234</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
