<?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-5582182612187833327</id><updated>2012-01-13T11:09:19.435-08:00</updated><category term='puppet'/><category term='firefox'/><category term='make'/><category term='emacs'/><category term='agile'/><category term='java'/><category term='shell'/><category term='computerscience'/><category term='wrt54g'/><category term='flymake'/><category term='network cpipe ssh'/><category term='dnsmasq'/><category term='event'/><category term='art'/><category term='tomato'/><category term='book'/><category term='wget'/><category term='apt-getn xargs'/><title type='text'>John Tells All</title><subtitle type='html'>&lt;p&gt;This blog is for technical and personal posts. Over different jobs over the years I've written hundreds of articles, and now it's time to share with everyone!
&lt;/p&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>57</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-1565997427906814926</id><published>2012-01-13T11:09:00.000-08:00</published><updated>2012-01-13T11:09:19.456-08:00</updated><title type='text'>Ssh tunnels are great</title><content type='html'>&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;At work I'm connecting to multiple Munin statistics servers. On my lappytop I'm only running one server, so how do I get multiple sets of results? &amp;nbsp;Answer: create a tunnel to another server!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;The Munin protocol is extremely easy, send "fetch X" to get statistics on X. &amp;nbsp;In my example df=Disk File usage. &amp;nbsp;Here's how to get local information, via Munin running locally on port 4949.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;$ echo 'fetch df' | nc -q1 localhost 4949&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;# munin node at freebeer&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;_dev_sda1.value 5.29318865322941&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;_dev.value 0.0339391645617528&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;_dev_shm.value 0.378827479751794&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;_var_run.value 0.00922469512382616&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;_var_lock.value 0&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;.&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;Here's how to make a remote machine's Munin (on port 4949) show up on localhost (port 4950). This means we can scan multiple local ports to get information on many different machines.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ssh -fNL &lt;i&gt;localport&lt;/i&gt;/localhost/&lt;i&gt;remoteport&lt;/i&gt; &lt;i&gt;remotehost&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;Option "-f" means drop into the background after asking for a password. &amp;nbsp;Next option "-N" is so the ssh connection doens't try to run anything remotely. &amp;nbsp;The next bit actually creates the tunnel. &amp;nbsp;It reads (L)ocal port 4950 maps to remotehost 4949. &amp;nbsp;The "localhost" in slashes is in respect to the connected session -- from our perspective it's remotehost.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: inherit;"&gt;Here it is in context. &amp;nbsp;Establish a tunnel, use it to get Munin Disk Filesystem information for the remote host.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ ssh -fNL 4950/localhost/4949 myremotehost&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ echo 'fetch df' | nc -q1 localhost 4950&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;# munin node at myremotehost&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;_dev_xvda2.value 3.15090884943856&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;_dev.value 0.022631566185207&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;_dev_shm.value 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;_var_run.value 10.3138711271508&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;_var_lock.value 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;_lib_init_rw.value 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.engadget.com/2006/03/21/how-to-ssh-tunnels-for-secure-network-access/"&gt;http://www.engadget.com/2006/03/21/how-to-ssh-tunnels-for-secure-network-access/&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-1565997427906814926?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/1565997427906814926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2012/01/ssh-tunnels-are-great.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/1565997427906814926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/1565997427906814926'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2012/01/ssh-tunnels-are-great.html' title='Ssh tunnels are great'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-7637713220270534458</id><published>2011-12-11T11:55:00.001-08:00</published><updated>2011-12-11T11:55:45.196-08:00</updated><title type='text'>backing up an Android device</title><content type='html'>My beloved Cheese, a Samsung Galaxy S Android phone, has lots of photos on it. &amp;nbsp;I want copies on my main Ubuntu computer. &amp;nbsp;Also Cheese is complaining about running out of room, even though I'm down to 130 apps -- I want to examine the phone and delete hidden files taking up precious space. &amp;nbsp;To do all this I'm installing a file server on the phone, then editing and copying things at my leisure from the main computer vs using the fiddly little phone screen.&lt;br /&gt;&lt;br /&gt;1. Install &lt;a href="http://www.appbrain.com/app/software-data-cable/com.lyy.softdatacable"&gt;Software Data Cable&lt;/a&gt;&amp;nbsp;on Android. &amp;nbsp;This is an FTP server for your phone, so you can easily see &amp;nbsp;files on the phone and copy to/from your computers.&lt;br /&gt;Another choice is the excellent ASTRO File Manager, which has a SMB (Windows network file system) module.&lt;br /&gt;&lt;br /&gt;2.Start Software Data Cable. &amp;nbsp;Press "Start Service"&lt;br /&gt;&lt;br /&gt;3. In Ubuntu, open the URL given in step #2, like&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; &lt;a href="ftp://192.168.11.148:8888/camera360/"&gt;ftp://192.168.11.148:8888/&lt;/a&gt;&lt;/span&gt;&amp;nbsp; If all is well you'll see a listing of Android application folders, like "camera360".&lt;br /&gt;&lt;br /&gt;4. To sync files, drag and drop using the above file manager, Nautilus. &amp;nbsp;Or use "wget" which understands FTP. The following says "make a copy on my PC of all JPG images stored on the SD card on the phone. Keep all directories the same."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;wget --mirror -nv --accept jpg ftp://192.168.11.148:8888/ .&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;If things don't look right try the above command and leave off "-nv" to make things more verbose.&lt;br /&gt;&lt;br /&gt;Note that the above only gives you access to the "external SD card" parts of the Android phone. &amp;nbsp;The other, "internal" flash are generally hidden. &amp;nbsp;To access this area anyway you can enable it in Data Cable's settings area -- but this is sketchy and not recommended.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-7637713220270534458?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/7637713220270534458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/12/backing-up-android-device.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7637713220270534458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7637713220270534458'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/12/backing-up-android-device.html' title='backing up an Android device'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-6300198681621167379</id><published>2011-11-24T12:48:00.000-08:00</published><updated>2011-11-24T12:48:28.063-08:00</updated><title type='text'>Using tmux to share a terminal | Richard WM Jones</title><content type='html'>&lt;a href="https://rwmj.wordpress.com/2011/11/23/using-tmux-to-share-a-terminal/"&gt;Using tmux to share a terminal | Richard WM Jones&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-6300198681621167379?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/6300198681621167379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/11/using-tmux-to-share-terminal-richard-wm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6300198681621167379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6300198681621167379'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/11/using-tmux-to-share-terminal-richard-wm.html' title='Using tmux to share a terminal | Richard WM Jones'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-3288407236324506669</id><published>2011-10-24T15:01:00.000-07:00</published><updated>2011-10-24T15:01:18.521-07:00</updated><title type='text'>Linux is awsome</title><content type='html'>At work we process many millions of emails a day, so we get a lot of bounces.  The following code helps me make the system smarter. It translates to "for the most recent five users who's received a bounce message, find all of their bounces in the last 24 hours and show me the Subject lines, with user and date information."&lt;br /&gt;&lt;br /&gt;&lt;PRE&gt;find `ls -1t | head -5` -type f -mtime -1 -print0 | xargs -0 egrep Subject /dev/null | less&lt;/PRE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-3288407236324506669?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/3288407236324506669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/10/linux-is-awsome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/3288407236324506669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/3288407236324506669'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/10/linux-is-awsome.html' title='Linux is awsome'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-2537892354666788019</id><published>2011-10-19T14:25:00.000-07:00</published><updated>2011-10-19T14:25:02.190-07:00</updated><title type='text'>Webex with Ubuntu Oneiric Ocelot</title><content type='html'>Read elsewhere how to install all the needed dependencies.  Here's a magic bit:&lt;br /&gt;&lt;br /&gt;&lt;PRE&gt;sudo add-apt-repository "deb http://archive.canonical.com/ natty partner"&lt;br /&gt;sudo apt-get update&lt;br /&gt;sudo apt-get install sun-java6-plugin&lt;/PRE&gt;&lt;br /&gt;A final trick: I use Firefox for work stuff, and Chrome for personal tasks -- thus I don't have to deal with multiple profiles, nor does sketchiness in one browser affect the other.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-2537892354666788019?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/2537892354666788019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/10/webex-with-ubuntu-oneiric-ocelot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/2537892354666788019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/2537892354666788019'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/10/webex-with-ubuntu-oneiric-ocelot.html' title='Webex with Ubuntu Oneiric Ocelot'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-6953350194010972872</id><published>2011-09-30T12:21:00.000-07:00</published><updated>2011-09-30T12:22:40.293-07:00</updated><title type='text'>I love Python (espeak speech synthesizer demo)</title><content type='html'>&lt;code&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;'''&lt;br /&gt;espeak.py -- demo each of the English espeak voices&lt;br /&gt;'''&lt;br /&gt;&lt;br /&gt;import os, re, time&lt;br /&gt;from itertools import ifilter, imap&lt;br /&gt;&lt;br /&gt;# Pty Language Age/Gender VoiceName       File        Other Langs&lt;br /&gt;#  5  en             M  default           default     &lt;br /&gt;&lt;br /&gt;pat = re.compile('\s* \d+ \s+ (en\S*) \s+ \S \s+ (\S+)',re.VERBOSE)&lt;br /&gt;for m in ifilter(None, imap(pat.match, os.popen('espeak --voices=en'))):&lt;br /&gt;lang,voice = m.groups()&lt;br /&gt;if '-' in lang:&lt;br /&gt;continue&lt;br /&gt;print voice&lt;br /&gt;os.system('espeak -v {0} "{0}... beer is good food" 2&gt;/dev/null &gt;/dev/null'.format(&lt;br /&gt;voice))&lt;br /&gt;time.sleep(3)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/shavenwarthog/setup/blob/master/misc/espeak.py"&gt;https://github.com/shavenwarthog/setup/blob/master/misc/espeak.py&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-6953350194010972872?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/6953350194010972872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/09/i-love-python-espeak-speech-synthesizer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6953350194010972872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6953350194010972872'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/09/i-love-python-espeak-speech-synthesizer.html' title='I love Python (espeak speech synthesizer demo)'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-2017804612867449082</id><published>2011-09-22T11:17:00.000-07:00</published><updated>2011-09-22T11:17:38.063-07:00</updated><title type='text'>Change Screen Brightness with Fn key in Ubuntu 11.04/10.10</title><content type='html'>&lt;a href="http://ubuntuguide.net/change-screen-brightness-with-fn-key-in-ubuntu-11-0410-10"&gt;Change Screen Brightness with Fn key in Ubuntu 11.04/10.10&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-2017804612867449082?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/2017804612867449082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/09/change-screen-brightness-with-fn-key-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/2017804612867449082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/2017804612867449082'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/09/change-screen-brightness-with-fn-key-in.html' title='Change Screen Brightness with Fn key in Ubuntu 11.04/10.10'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-287773177804297732</id><published>2011-08-20T12:42:00.000-07:00</published><updated>2011-08-20T12:42:51.333-07:00</updated><title type='text'>5 tips for packaging your Python projects « Fetchez le Python</title><content type='html'>&lt;a href="http://tarekziade.wordpress.com/2011/08/19/5-tips-for-packaging-your-python-projects/"&gt;5 tips for packaging your Python projects « Fetchez le Python&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-287773177804297732?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/287773177804297732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/08/5-tips-for-packaging-your-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/287773177804297732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/287773177804297732'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/08/5-tips-for-packaging-your-python.html' title='5 tips for packaging your Python projects « Fetchez le Python'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-7671640584255654921</id><published>2011-07-29T11:08:00.000-07:00</published><updated>2011-07-29T11:08:32.671-07:00</updated><title type='text'>link: Some Python Design Patterns</title><content type='html'>&lt;a href="http://christopherolah.wordpress.com/2011/07/29/python-design-patterns/"&gt;Some Python Design Patterns « Christopher's Blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-7671640584255654921?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://christopherolah.wordpress.com/2011/07/29/python-design-patterns/' title='link: Some Python Design Patterns'/><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/7671640584255654921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/07/link-some-python-design-patterns.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7671640584255654921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7671640584255654921'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/07/link-some-python-design-patterns.html' title='link: Some Python Design Patterns'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-7102466463866880730</id><published>2011-07-18T12:11:00.000-07:00</published><updated>2011-07-18T12:26:25.345-07:00</updated><title type='text'>adventures with the Nook Color</title><content type='html'>I just got a Nook Color, and it's awesome.  I wanted something to 1) read recipes in the kitchen, 2) have some fun with, and 3) use for Caustic and/or other music production.&lt;br /&gt;&lt;br /&gt;I rooted it.&lt;br /&gt;&lt;br /&gt;More on that later, but I thought I'd add some points for other prospective cheap tablet people:&lt;br /&gt;&lt;br /&gt;1) many apps act a little awkward on the tablet. Specifically "Go Launcher" is not really usable. "Frogger" and "SPC Music Sketchpad" look strange but are okay.  The Cynaogen Mod7-provided ADW.Launcher works very well.&lt;br /&gt;&lt;br /&gt;2) it feels faster than my Samsung Galaxy S, but laggier. That is, sometimes touches aren't recognized when I'd like.  It's unpredictable, a minor annoyance.&lt;br /&gt;&lt;br /&gt;3) from Amazon Appstore: Autodesk Sketchbook Mobile, Fieldrunners HD, and iCookbook.&lt;br /&gt;&lt;br /&gt;When you get a tablet, run to download a bunch of sexy cool apps:&lt;br /&gt;&lt;br /&gt;- Google Earth (and Maps)&lt;br /&gt;&lt;br /&gt;- Substrate live wallpaper&lt;br /&gt;&lt;br /&gt;- Chumby.  This gives you access to a *lot* of silly or beautiful useful clocks. This is much better than the Android-ish stash of clocks.&lt;br /&gt;&lt;br /&gt;Overall for consumption of media (Gmail, maps, music) the Nook Color is tremendous fun. The lack of a camera, microphone, and 3G make the device feel a lot "quieter" than a cell phone. The battery life is also a bit better. Picking up the small Galaxy S now feels like I'm using a small powerful Swiss army knife, whereas using the Nook makes me feel more relaxed and comfortable.&lt;br /&gt;&lt;br /&gt;A lot of fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-7102466463866880730?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/7102466463866880730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/07/adventures-with-nook-color.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7102466463866880730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7102466463866880730'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/07/adventures-with-nook-color.html' title='adventures with the Nook Color'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-6070643642244987212</id><published>2011-06-30T12:52:00.000-07:00</published><updated>2011-06-30T12:52:28.772-07:00</updated><title type='text'>The proper way to install pip, virtualenv, and distribute for Python</title><content type='html'>The key bit to realize is that "virtualenv" installs "pip" and "distribute", which are the latest and bestest packaging tools for Python.&lt;br /&gt;&lt;br /&gt;(optional) add these to ~/.bashrc:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;PIP_REQUIRE_VIRTUALENV=true&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;PIP_RESPECT_VIRTUALENV=true&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. install system-level virtualenv&lt;br /&gt;&lt;pre&gt;sudo aptitude install virtualenv&lt;/pre&gt;&lt;br /&gt;2. use it to create a clean "distribution" centered around a private Python executable and your own packaged scripts&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;virtualenv --no-site-packages --distribute ENV&lt;/pre&gt;&lt;br /&gt;3. activate it for this shell&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;. ENV/bin/activate&lt;/pre&gt;&lt;br /&gt;This modifies the local PATH, so now "python" is your private one. Add/remove packages to your heart's content without messing with the system-global one.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;which pip&lt;br /&gt; #  /home/johnm/work/ex-package/ENV/bin/pip&lt;/pre&gt;&lt;br /&gt;4. verify by installing a package from the internet&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;pip install coverage&lt;br /&gt;python -c 'import coverage'&lt;/pre&gt;&lt;br /&gt;5. verify by installing a local package&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;pip -v install Mypackage-0.1dev.tar.gz&lt;br /&gt;python -c 'import mypackage'&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-6070643642244987212?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/6070643642244987212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/06/proper-way-to-install-pip-virtualenv.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6070643642244987212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6070643642244987212'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/06/proper-way-to-install-pip-virtualenv.html' title='The proper way to install pip, virtualenv, and distribute for Python'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-6866235611312340865</id><published>2011-06-14T11:00:00.000-07:00</published><updated>2011-06-14T11:00:23.792-07:00</updated><title type='text'>Getting started with Python « Endlessly Curious</title><content type='html'>excellent pointers to get started programming in Python: &lt;a href="http://www.endlesslycurious.com/2011/06/14/getting-started-with-python/"&gt;Getting started with Python « Endlessly Curious&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-6866235611312340865?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.endlesslycurious.com/2011/06/14/getting-started-with-python/' title='Getting started with Python « Endlessly Curious'/><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/6866235611312340865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/06/getting-started-with-python-endlessly.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6866235611312340865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6866235611312340865'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/06/getting-started-with-python-endlessly.html' title='Getting started with Python « Endlessly Curious'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-5880462321560049154</id><published>2011-05-19T11:30:00.000-07:00</published><updated>2011-05-19T11:30:27.260-07:00</updated><title type='text'>Study Hacks » Blog Archive » Anatomy of an A+: A Look Inside the Process of One of the World’s Most Efficient Studiers</title><content type='html'>learn quickly by connecting ideas, not memorizing facts&lt;br /&gt;&lt;br /&gt;&lt;a href="http://calnewport.com/blog/2011/05/18/anatomy-of-an-a-a-look-inside-the-process-of-one-of-the-worlds-most-efficient-studiers/"&gt;Anatomy of an A+: A Look Inside the Process of One of the World’s Most Efficient Studiers&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-5880462321560049154?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://calnewport.com/blog/2011/05/18/anatomy-of-an-a-a-look-inside-the-process-of-one-of-the-worlds-most-efficient-studiers/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+StudyHacks+%28Study+Hacks%29&amp;utm_content=Google+Reader' title='Study Hacks » Blog Archive » Anatomy of an A+: A Look Inside the Process of One of the World’s Most Efficient Studiers'/><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/5880462321560049154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/05/study-hacks-blog-archive-anatomy-of-a.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5880462321560049154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5880462321560049154'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/05/study-hacks-blog-archive-anatomy-of-a.html' title='Study Hacks » Blog Archive » Anatomy of an A+: A Look Inside the Process of One of the World’s Most Efficient Studiers'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-8168208564018155493</id><published>2011-05-18T12:11:00.000-07:00</published><updated>2011-05-18T12:11:45.916-07:00</updated><title type='text'>I salute Fabrice Bellard</title><content type='html'>Recently the amazing hack of "boot Linux in a web page" has been circulating around. Bellard wrote a x86 emulator in JavaScript, then took the straight Linux binaries and was able to boot it. In a web page. At reasonable speeds. His distribution even includes a C compiler.  &lt;i&gt;This is amazing&lt;/i&gt;, but that's not all.&lt;br /&gt;&lt;br /&gt;Bellard wrote the emulator QEMU, which lets you run one set of software "inside" another. It's mostly used for virtual machines, so you can run multiple operating systems inside a "host" OS. The guests can run Linux or Windows or whatever. The guest virtual machines can even be of different CPU types: ARM on a x86!  This can be incredibly useful.  But that's not all.&lt;br /&gt;&lt;br /&gt;A large majority of video software uses the "ffmpeg" library. It's quite low level, but lets you do conversion of different screen sizes, bit rates, and codecs. Also written by Bellard, and now extended by a team for the last few years.&lt;br /&gt;&lt;br /&gt;Among his other hacks are TCC, a tiny C compiler, which lets you use C as a scripting language. It's fast and complete enough to be used as a boot loader. That is, you can "boot" TCC, which then compiles and runs the Linux kernel. The entire thing. It recompiles on the fly.&lt;br /&gt;&lt;br /&gt;Lastly he has some software to turn your computer into a TV transmitter. This is impossible, but he's found a way to do it by tweaking VGA video registers and timings and so forth.&lt;br /&gt;&lt;br /&gt;I salute you, Fabrice Bellard.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bellard.org/"&gt;Fabrice Bellard's Home Page&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-8168208564018155493?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://bellard.org/' title='I salute Fabrice Bellard'/><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/8168208564018155493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/05/i-salute-fabrice-bellard.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8168208564018155493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8168208564018155493'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/05/i-salute-fabrice-bellard.html' title='I salute Fabrice Bellard'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-365307045269587611</id><published>2011-05-15T12:00:00.000-07:00</published><updated>2011-05-15T12:00:50.453-07:00</updated><title type='text'>Dell Vostro V13 review | Linux User</title><content type='html'>I just bought one of these -- it's pretty good, an expandable netbook.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linuxuser.co.uk/reviews/dell-vostro-v13-review/"&gt;Dell Vostro V13 review | Linux User&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-365307045269587611?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.linuxuser.co.uk/reviews/dell-vostro-v13-review/' title='Dell Vostro V13 review | Linux User'/><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/365307045269587611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/05/dell-vostro-v13-review-linux-user.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/365307045269587611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/365307045269587611'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/05/dell-vostro-v13-review-linux-user.html' title='Dell Vostro V13 review | Linux User'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-7456045196038827594</id><published>2011-05-13T12:25:00.000-07:00</published><updated>2011-05-17T15:34:25.731-07:00</updated><title type='text'>Hidden Treasures of the Python Standard Library</title><content type='html'>&lt;a href="http://www.examville.com/examville/Hidden%20Treasures%20of%20the%20Python%20Standard%20Library-ID7385"&gt;Hidden Treasures of the Python Standard Library&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-7456045196038827594?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/7456045196038827594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/05/hidden-treasures-of-python-standard.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7456045196038827594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7456045196038827594'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/05/hidden-treasures-of-python-standard.html' title='Hidden Treasures of the Python Standard Library'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-8418967458190161155</id><published>2011-05-05T16:53:00.000-07:00</published><updated>2011-05-05T16:53:27.544-07:00</updated><title type='text'>Python Workshop slides now available!</title><content type='html'>&lt;a href="http://173.231.53.155/2011PythonWorkshop/"&gt;http://173.231.53.155/2011PythonWorkshop/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-8418967458190161155?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/8418967458190161155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/05/python-workshop-slides-now-available.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8418967458190161155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8418967458190161155'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/05/python-workshop-slides-now-available.html' title='Python Workshop slides now available!'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-676516332500527977</id><published>2011-04-30T14:26:00.000-07:00</published><updated>2011-04-30T14:26:43.526-07:00</updated><title type='text'>X keyboard binding</title><content type='html'>I have a tiny IOGear wireless keyboard. It's great: about 12" wide, 6" deep, with a little trackball.  I can sit eight feet away from my big TV and work. When it's not needed, I can easily tuck it out of the way.&lt;br /&gt;&lt;br /&gt;One big drawback: no native Home nor Page Up or Down keys. This is rather awkward: to scroll down a web page I always have to look carefully at the little blue "Fn" key on the left side of the keyboard, then carefully find the down arrow on the right side of the keyboard, then press and release them both.  I'd rather not have to actually look while reading very important web pages, so I found a solution.&lt;br /&gt;&lt;br /&gt;My window manager "wmii" uses the Super key to switch workspaces and move windows around. The Alt key is used by some apps. I'd like to have both Fn-Down and Super-Down map to PageDown, so it's not as awkward to scroll web pages.&lt;br /&gt;&lt;br /&gt;To solve this, there are a lot of twisty little utilities, all slightly similar and different. Xev shows raw X events, and can tell you if your keys (like multimedia keys: Volume Up and so forth) are recognized by the raw X server. Xmodmap lets you remap events, like swapping CapsLock and Alt.  Xbindkeys permits commands to run on key sequences, like pressing Alt-T to run a terminal. Xmacro lets you record and play back sequences of raw X events, including things like PageDown.&lt;br /&gt;&lt;br /&gt;Lastly there's "xdotool", which sends key, mouse, or window manager events. For example, to scroll inside the current terminal, type:&lt;br /&gt;&lt;PRE&gt;xdotool key Shift+Page_Up&lt;/PRE&gt;&lt;br /&gt;First version of ~/.xbindkeysrc:&lt;br /&gt;&lt;PRE&gt;"xdotool key Page_Up &amp;"&lt;br /&gt;  Mod4 + Up&lt;br /&gt;"xdotool key Page_Down &amp;"&lt;br /&gt;  Mod4 + Down&lt;/PRE&gt;&lt;br /&gt;This sort of works, but often fails: the window will flicker but not scroll.  Second version searches for the topmost Chrome window, then sends the code to it.  That doesn't work either...&lt;br /&gt;&lt;br /&gt;To be continued.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-676516332500527977?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/676516332500527977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/04/x-keyboard-binding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/676516332500527977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/676516332500527977'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/04/x-keyboard-binding.html' title='X keyboard binding'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-8718592056248331818</id><published>2011-04-06T11:07:00.000-07:00</published><updated>2011-04-06T11:07:45.426-07:00</updated><title type='text'>Minimum Font (Chrome Extension) - Home - Open wiki - Gitorious</title><content type='html'>This extension makes website fonts large enough to read -- very useful when using a big TV as a monitor.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gitorious.org/minimum-font-extension/pages/Home"&gt;Minimum Font (Chrome Extension) - Home - Open wiki - Gitorious&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-8718592056248331818?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://gitorious.org/minimum-font-extension/pages/Home' title='Minimum Font (Chrome Extension) - Home - Open wiki - Gitorious'/><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/8718592056248331818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/04/minimum-font-chrome-extension-home-open.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8718592056248331818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8718592056248331818'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/04/minimum-font-chrome-extension-home-open.html' title='Minimum Font (Chrome Extension) - Home - Open wiki - Gitorious'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-4169854932415250563</id><published>2011-03-24T12:59:00.000-07:00</published><updated>2011-03-24T12:59:47.815-07:00</updated><title type='text'>network management</title><content type='html'>&lt;br /&gt;I'm firmly in the "NetworkManager is the devil" camp, because it messes up my network configuration without triggering a loud error in syslog or somewhere. Grr.&lt;br /&gt;&lt;br /&gt;I'm now using &lt;a href="http://wicd.sourceforge.net"&gt;wicd&lt;/a&gt; to manage my wireless/ethernet networks.&lt;br /&gt;&lt;br /&gt;Note, to use wicd in a non-systray window manager (wmii), type "wicd-client -n &amp;amp;"&lt;br /&gt;&lt;br /&gt;Lastly, "ifconfig" is deprecated(!). &amp;nbsp;Use "ip" instead -- &lt;a href="http://en.wikipedia.org/wiki/Iproute2"&gt;http://en.wikipedia.org/wiki/Iproute2&lt;/a&gt;&lt;br /&gt;&lt;PRE&gt;"ifconfig" =&amp;gt; "ip a"&lt;br /&gt;"route" =&amp;gt; "ip r"&lt;br /&gt;&lt;/PRE&gt;&lt;a href="http://andys.org.uk/bits/2010/02/24/iproute2-life-after-ifconfig"&gt;http://andys.org.uk/bits/2010/02/24/iproute2-life-after-ifconfig/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-4169854932415250563?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/4169854932415250563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/03/network-management.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/4169854932415250563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/4169854932415250563'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/03/network-management.html' title='network management'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-8547610598792396585</id><published>2011-03-04T13:52:00.000-08:00</published><updated>2011-03-04T14:00:07.839-08:00</updated><title type='text'>EasyTether internet tethering for Android on Debian</title><content type='html'>My local cable provider likes to mess with me, so on occasion I get internet via my cellphone. In practice this works rather well. Install EasyTether on the phone and on your Debian machine. Connect via USB, then run some commands on the Debian side to route packets via your cellphone.The software is designed to be run standalone, not as part of the normal Linux system, which is a little weird. The following stanza helps with this. If you add the following to /etc/network/interfaces, you can turn on/off the tethering using the normal ifup/down commands:&lt;pre&gt;iface easytether0 inet dhcp&lt;br /&gt;      pre-up easytether connect &amp;&lt;br /&gt;      pre-up sleep 1&lt;br /&gt;      pre-down killall easytether&lt;br /&gt;&lt;/pre&gt;That is, after the above is added, do "sudo ifup easytether0" to route packets through the USB-connected Android device. To turn it off, do "sudo ifdown easytether0".This solution is rather buggy. Disconnect and reconnect the USB cable to solve some problems. Also, by default EasyTether doesn't route ICMP packets, which means you can't use "ping -c1 4.2.2.2" to verify your internet connection is up.  "curl google.com" is a good check instead.Note that EasyTether Lite doesn't route https, which means Gmail and Facebook doesn't work. To get around the latter, use the mobile site: http://m.facebook.com   The full software is $10 and has been a fantastic value for me -- highly recommended.http://www.appbrain.com/app/easytether-lite/com.mstream.easytether_beta&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-8547610598792396585?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/8547610598792396585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/03/easytether-internet-tethering-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8547610598792396585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8547610598792396585'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/03/easytether-internet-tethering-for.html' title='EasyTether internet tethering for Android on Debian'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-2830994468178965110</id><published>2011-02-16T14:22:00.000-08:00</published><updated>2011-02-16T14:22:29.122-08:00</updated><title type='text'>video: installing drivers and tweaking DPI</title><content type='html'>&lt;P&gt;With the new kernel, the nVidia drivers can be installed.  I didn'thave luck with the free nouveau drivers, so went with the proprietarynVidia setup. Download it, then:&lt;/P&gt;&lt;PRE&gt;aptitude install gcc make binutils linux-headers-2.6.37-trunk-686&lt;br /&gt;sh ./NVIDIA-Linux-x86-260.19.36.run&lt;/PRE&gt;&lt;P&gt;It worked! But... fonts are way too large. At the login page the"user" and "password" fields have letters so big they overflow thespace. Terminal windows are unusable. It looks terrible.&lt;/P&gt;&lt;P&gt;I'd already seen this and had found a fix.  The Samsung TV lies like arug to the computer about how big it is. So, on the Linux side justignore the TV's boasts and set the DPI manually.&lt;/P&gt;&lt;P&gt;File /etc/X11/xorg.conf, add text in bold:&lt;/P&gt;&lt;PRE&gt;Section "Device"&lt;br /&gt;    Identifier     "Device0"&lt;br /&gt;    Driver         "nvidia"&lt;br /&gt;    VendorName     "NVIDIA Corporation"&lt;br /&gt;    BoardName      "GeForce GT 430"&lt;br /&gt;&lt;b&gt;# JM:&lt;br /&gt;    Option         "UseEdidDpi" "FALSE"&lt;br /&gt;    Option         "DPI" "100 x 100"&lt;/b&gt;&lt;br /&gt;EndSection&lt;/PRE&gt;&lt;P&gt;Restart X to see the changes.  For my system, this was:&lt;PRE&gt;service gdm stop ; service gdm start&lt;/PRE&gt;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-2830994468178965110?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/2830994468178965110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/02/video-installing-drivers-and-tweaking.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/2830994468178965110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/2830994468178965110'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/02/video-installing-drivers-and-tweaking.html' title='video: installing drivers and tweaking DPI'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-5972269396494630171</id><published>2011-02-16T14:18:00.000-08:00</published><updated>2011-02-16T14:18:07.681-08:00</updated><title type='text'>video: nVidia GT 430 on Debian, upgrading the kernel</title><content type='html'>&lt;P&gt;For my new media computer, I chose a nVidia GT 430. It's cheap at $80,small, and doesn't require big power connectors used by my older gamercard. It's also another nVidia card, which has some level of supportfor Linux.&lt;/P&gt;&lt;P&gt;Debian Squeeze runs Linux 2.6.32, but the 430 is new enough that itrequires newer drivers to work well. I wasn't looking forward todicking with the kernel and/or X settings just to be able to use mycomputer. It's easy to spend hours or days tweaking things that mighthelp, or might not.&lt;/P&gt;&lt;P&gt;For additional challenge, the video card takes over the audio.  ThenVidia card can transmit both video and audio over the same HDMI cableto the TV. This is cool because I can control computer audio via theTV remote. However this means I'd switch from my nice Mackie studiomonitors to the little speakers inside the TV.&lt;/P&gt;&lt;P&gt;So, under normal Debian with the new GT 430, graphics are old VESAstyle: low resolution and sluggish. And, no audio at all -- notthrough the HDMI connector, nor through the motherboard's audio port.But the video is usable.&lt;/P&gt;&lt;P&gt;To verify Debian with new kernel would work with the 430, I found aderivative: PureOS. Installing to a USB flash drive didn't workvery well, but it gave me enough confidence to redo the kernel in mymain Debian hard drive.  http://pureos.org/index.php?lang=english&lt;/P&gt;&lt;P&gt;Upgrading the kernel turned out to be rather easy and not risky. It'sin two steps:&lt;/P&gt;&lt;P&gt;1a) "pin" the system so it sees both stable and unstablepackages. It'll use stable most of the time, but the newer files areavailable if needed.&lt;/LI&gt;&lt;P&gt;File /etc/apt/preferences, add the text in bold:&lt;/P&gt;&lt;PRE&gt;Package: *&lt;br /&gt;Pin: release a=statler&lt;br /&gt;Pin-Priority: 1001&lt;br /&gt;&lt;br /&gt;Package: *&lt;br /&gt;Pin: release a=squeeze&lt;br /&gt;Pin-Priority: 100&lt;br /&gt;&lt;br /&gt;&lt;b&gt;# JM:&lt;br /&gt;Package: *&lt;br /&gt;Pin: release a=experimental&lt;br /&gt;Pin-Priority: 69&lt;/b&gt;&lt;/PRE&gt;&lt;P&gt;1b) tell the system where unstable packages are located&lt;/P&gt;&lt;P&gt;File /etc/apt/sources.list, add text to the end:&lt;/P&gt;&lt;PRE&gt;# JM:&lt;br /&gt;deb http://ftp.debian.org/debian/ experimental main contrib non-free&lt;br /&gt;deb-src http://ftp.debian.org/debian/ experimental main contrib non-free&lt;/PRE&gt;2) install the new kernel.  It automatically adjusts the boot managerso that you can use either the new or old kernel when the computerboots.&lt;PRE&gt;aptitude update&lt;br /&gt;aptitude install linux-image-2.6.37-trunk-686&lt;br /&gt;reboot&lt;/PRE&gt;&lt;P&gt;With our system running Debian with an upgraded kernel, we're now ready to install the nVidia drivers, thus making our video card happy&lt;P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-5972269396494630171?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/5972269396494630171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/02/video-nvidia-gt-430-on-debian-upgrading.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5972269396494630171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5972269396494630171'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/02/video-nvidia-gt-430-on-debian-upgrading.html' title='video: nVidia GT 430 on Debian, upgrading the kernel'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-391699047693173648</id><published>2011-02-16T14:10:00.000-08:00</published><updated>2011-02-16T14:10:07.572-08:00</updated><title type='text'>new media computer</title><content type='html'>My old computer is a bit of a mess. Over three years it's accumulated&amp;nbsp;a few hard drives, with cables strewn about. A new computer isn't in my&amp;nbsp;budget, but I'm tired of looking at the full-size computer case in my&amp;nbsp;living room.&lt;br /&gt;&lt;br /&gt;Thus, my media PC project. I bought a case small enough to fit in the&amp;nbsp;media cabinet under my 46" tv/monitor, which will contain the guts of&amp;nbsp;the old computer. Then the old case will vanish, and my living room&amp;nbsp;will look great! No more cables multiplying like rabits, languidly&amp;nbsp;lazing about, collecting dust and tripping my Roomba.&lt;br /&gt;&lt;br /&gt;This project is in several steps:&lt;br /&gt;&lt;br /&gt;1) find the right case. This was rather harder than I'd expected.&lt;br /&gt;&lt;br /&gt;2) replace video card. My old gamer video card is too big and&lt;br /&gt;power-hungry.&lt;br /&gt;&lt;br /&gt;3) rearrange hard drives. New case only has room for two.&lt;br /&gt;&lt;br /&gt;4) move motherboard from old case to new, without a hammer.&lt;br /&gt;&lt;br /&gt;5) what the hell, let's change operating systems.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-391699047693173648?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/391699047693173648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2011/02/new-media-computer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/391699047693173648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/391699047693173648'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2011/02/new-media-computer.html' title='new media computer'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-8226612438063860429</id><published>2010-03-21T14:11:00.001-07:00</published><updated>2010-03-21T14:11:38.825-07:00</updated><title type='text'>"Danger: Emacs"</title><content type='html'>&lt;a href="http://www.flickr.com/photos/hackaday/3841760416/"&gt;http://www.flickr.com/photos/hackaday/3841760416/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;heh&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-8226612438063860429?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/8226612438063860429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2010/03/danger-emacs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8226612438063860429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8226612438063860429'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2010/03/danger-emacs.html' title='&quot;Danger: Emacs&quot;'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-5290574332878883422</id><published>2010-03-21T14:03:00.000-07:00</published><updated>2010-03-21T14:06:27.714-07:00</updated><title type='text'>HOW TO SET UP REMOTE CONTROL FOR LINUX (lirc)</title><content type='html'>Using a infrared (IR) remote control for Linux consists of getting&lt;br /&gt;several pieces to be configured correctly, and to talk to each other&lt;br /&gt;correctly.&lt;br /&gt;&lt;br /&gt;STEP 1 -- install Lirc&lt;br /&gt;&lt;br /&gt;apt-get install lirc&lt;br /&gt;&lt;br /&gt;STEP 2 -- configure your remote&lt;br /&gt;&lt;br /&gt;In this case, I have a Microsoft Media Center remote. Therein the problems start. It&lt;br /&gt;has a Vista logo, but is marked "HP" on the bottom, and is recognized&lt;br /&gt;as a "Philips" USB device:&lt;br /&gt;&lt;br /&gt;$ lsusb&lt;br /&gt;Bus 005 Device 002: ID 0471:060c Philips&lt;br /&gt;&lt;br /&gt;To tell Lirc which remote you have, type:&lt;br /&gt;&lt;br /&gt;$ sudo dpkg-reconfigure lirc&lt;br /&gt;&lt;br /&gt;and follow the prompts. &amp;nbsp;This changes settings in /etc/lirc/lircd.conf&lt;br /&gt;and probably other files.&lt;br /&gt;&lt;br /&gt;To verify this worked, use the "show cooked codes" command and press&lt;br /&gt;keys on your remote. &amp;nbsp;To quit, press control-C.&lt;br /&gt;&lt;br /&gt;$ irw&lt;br /&gt;000000037ff07bed 00 ChanUp mceusb&lt;br /&gt;000000037ff07bed 01 ChanUp mceusb&lt;br /&gt;000000037ff07bf2 00 Home mceusb&lt;br /&gt;000000037ff07bf2 01 Home mceusb&lt;br /&gt;&lt;br /&gt;At this point, your remote works, and your computer is correctly&lt;br /&gt;translating the bitstream into keys.&lt;br /&gt;&lt;br /&gt;STEP 3 -- translate keys into actions&lt;br /&gt;&lt;br /&gt;Add this to your ~/.lircrc file:&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;prog &amp;nbsp; = irexec&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;button = Home&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;config = echo "Hello world!"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;To test this, run the "how does program X translate key Y" command,&lt;br /&gt;ircat. &amp;nbsp;In this case, we're intercepting the irexec command:&lt;br /&gt;&lt;br /&gt;$ ircat irexec&lt;br /&gt;&lt;press home="" key=""&gt;&lt;/press&gt;&lt;br /&gt;echo "Hello world!"&lt;br /&gt;&lt;br /&gt;Once the translation step works correctly, run it for real:&lt;br /&gt;&lt;br /&gt;$ irexec&lt;br /&gt;&lt;press home="" key=""&gt;&lt;/press&gt;&lt;br /&gt;Hello world!&lt;br /&gt;&lt;br /&gt;STEP 4 -- translate keys into "smart" actions (VLC media player)&lt;br /&gt;&lt;br /&gt;Change your ~/.lircrc file into this:&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;prog &amp;nbsp; = irexec&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;button = Home&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;config = echo "Hello world!"&lt;br /&gt;end&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;prog &amp;nbsp; = vlc&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;button = Home&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;config = key-stop&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Start irexec again, and also VLC on a video:&lt;br /&gt;&lt;br /&gt;$ killall irexec&lt;br /&gt;$ irexec &amp;amp;&lt;br /&gt;$ vlc mymovie.avi&lt;br /&gt;&lt;br /&gt;Pressing "Home" should stop the video, but it doesn't work -- VLC has&lt;br /&gt;to know to subscribe to Lirc events:&lt;br /&gt;&lt;br /&gt;$ vlc --control lirc sample.avi&lt;br /&gt;&lt;br /&gt;When Home is pressed on the remote, Lirc sends the event to *all*&lt;br /&gt;applications that are interested. In this case, pressing Home prints&lt;br /&gt;"Hello world!" in the terminal, and the movie stops.&lt;br /&gt;&lt;br /&gt;The Lirc service, lircd, grabs infrared data from the USB device and&lt;br /&gt;translates it to button names. In this case, it knows I&lt;br /&gt;have a Media Center remote "mce", so the IR squiggles it got when I&lt;br /&gt;pushed the Home button, it understands as "the user pressed the Home&lt;br /&gt;button".&lt;br /&gt;&lt;br /&gt;Each application subscribes to Lirc events. The lircd service&lt;br /&gt;translates specific buttons for specific applications. In this case,&lt;br /&gt;the "vlc" media player received the "key-stop" message, and it stopped&lt;br /&gt;the video. The "irevent" application also received a message, in this&lt;br /&gt;case the "echo hello world" string, so it printed a message to the&lt;br /&gt;terminal.&lt;br /&gt;&lt;br /&gt;If something goes wrong, look at each part of the setup:&lt;br /&gt;&lt;br /&gt;- IR signals to buttons with lircd&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;"irw" displays buttons&lt;br /&gt;&lt;br /&gt;- buttons to actions&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp;"ircat vlc" shows actions for a specific program, in this&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp;case vlc&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp;"irexec" does things directly, like printing messages&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Different applications understand different messages. &amp;nbsp;Many programs&lt;br /&gt;don't understand remote buttons at all, so an intermediate programs is&lt;br /&gt;used to do the translation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;STEP 5 -- translate buttons into "dumb" mouse/keyboard events (Google Chrome)&lt;br /&gt;&lt;br /&gt;Add this to ~/.lircrc:&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;prog = irxevent&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;button = Home&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;config = Key CTRL-t CurrentWindow&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Test the mapping:&lt;br /&gt;&lt;br /&gt;$ ircat irxevent&lt;br /&gt;&lt;home key="" pressed=""&gt;&lt;/home&gt;&lt;br /&gt;Key CTRL-t CurrentWindow&lt;br /&gt;&lt;br /&gt;Now run irxevent directly. &amp;nbsp;It intercepts the Home button, then sends&lt;br /&gt;a keypress to the current window. In this case, Control-T on a Google&lt;br /&gt;Chrome window opens up a new tab.&lt;br /&gt;&lt;br /&gt;$ killall irxevent ; irxevent&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hope this helps!&lt;br /&gt;&lt;br /&gt;- john&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;REFERENCES:&lt;br /&gt;&lt;br /&gt;- lircd.conf, mapping buttons to actions:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lirc.org/html/configure.html#lircd.conf"&gt;http://www.lirc.org/html/configure.html#lircd.conf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- keys for Google Chrome:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/support/chrome/bin/answer.py?hl=en&amp;amp;answer=95743"&gt;http://www.google.com/support/chrome/bin/answer.py?hl=en&amp;amp;answer=95743&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- VLC&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.gentoo-wiki.com/wiki/VLC/LIRC"&gt;http://en.gentoo-wiki.com/wiki/VLC/LIRC&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- my setup:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://github.com/shavenwarthog/setup/blob/master/lircrc"&gt;http://github.com/shavenwarthog/setup/blob/master/lircrc&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-5290574332878883422?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/5290574332878883422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2010/03/how-to-set-up-remote-control-for-linux.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5290574332878883422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5290574332878883422'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2010/03/how-to-set-up-remote-control-for-linux.html' title='HOW TO SET UP REMOTE CONTROL FOR LINUX (lirc)'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-7327343431682493648</id><published>2009-11-20T10:03:00.000-08:00</published><updated>2009-11-20T10:22:18.241-08:00</updated><title type='text'>Message Queuing slides and source code!</title><content type='html'>I gave a talk at the local Python user group, &lt;a href="http://socal-piggies.org/scp"&gt;SoCal Piggies&lt;/a&gt;. We discussed message queues: they're useful for synchronizing processes, increasing reliability and scalability. The entire source tree, with slides and extra goodies, is linked below.  Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/shavenwarthog/4120377626/" title="mq-screensho"&gt;&lt;img src="http://farm3.static.flickr.com/2700/4120377626_a235b25332_o.png" width="548" height="407" alt="mq-screenshot" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://bitbucket.org/shavenwarthog/amqp-ex/src/"&gt;https://bitbucket.org/shavenwarthog/amqp-ex/src/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(diagram credit: RedHat)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-7327343431682493648?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/7327343431682493648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/11/message-queuing-slides-and-source-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7327343431682493648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7327343431682493648'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/11/message-queuing-slides-and-source-code.html' title='Message Queuing slides and source code!'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-8668554485197793776</id><published>2009-11-16T09:14:00.000-08:00</published><updated>2009-11-16T09:14:40.770-08:00</updated><title type='text'>Superdevelopers at Facebook</title><content type='html'>Facebook gets unprecedented traffic. They don't want things to go down so they... release changes constantly, a few times a day! They use peer review and their immense audience to see how well their solutions work, then iterate.  The other teams *support* engineering, rather than being gatekeepers.&lt;br /&gt;&lt;br /&gt;I actually did this at a medium-sized site many years ago.  Push change to live, capture logs for five minutes while people beat it, then undo the change.  It worked well.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cacm.acm.org/blogs/blog-cacm/51564-extreme-agility-at-facebook/fulltext"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-8668554485197793776?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/8668554485197793776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/11/superdevelopers-at-facebook.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8668554485197793776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8668554485197793776'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/11/superdevelopers-at-facebook.html' title='Superdevelopers at Facebook'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-621849524521664816</id><published>2009-11-10T10:49:00.000-08:00</published><updated>2009-11-10T11:35:05.250-08:00</updated><title type='text'>ntop and RRD</title><content type='html'>"ntop" conveniently displays web pages with charts and plots of your local network traffic.  To record historical traffic, it uses Round Robin Database (rrd).  The default ntop package enables the RRD plugin, but doesn't give itself permission to write out its data. Here's how to get the two to work:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo apt-get install ntop&lt;br /&gt;sudo install -d /var/lib/ntop&lt;br /&gt;sudo install -o nobody -d /var/lib/ntop/interfaces&lt;br /&gt;sudo install -o nobody -d /var/lib/ntop/rrd&lt;/PRE&gt;To test, start "sudo ntop" (probably in "screen"), then open the web page http://localhost:3000&lt;br /&gt;&lt;br /&gt;To activate the RRD plugin, select Plugins / Round Robin / Describe, then click the red "no" to become a blue "yes."  You'll see messages in the terminal where you started ntop.&lt;br /&gt;&lt;br /&gt;After a few moments, you can view RRD graphs. One is in Summary / Network Load.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-621849524521664816?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/621849524521664816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/11/ntop-and-rrd.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/621849524521664816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/621849524521664816'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/11/ntop-and-rrd.html' title='ntop and RRD'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-1955663984826420679</id><published>2009-10-26T11:58:00.000-07:00</published><updated>2009-10-26T11:58:45.711-07:00</updated><title type='text'>Fast Parallel Downloading (for apt-get and aptitude) #3</title><content type='html'>"aptitude" has more features, but is as low-hassle and scriptable as "apt-get".  For instance, you can say "this package was automatically installed", which means if you don't need it any longer, it'll be automatically removed. Another perk is a direct way of asking "why was/wasn't this package installed?", to help sort out sometimes confusing package dependencies.&lt;br /&gt;&lt;br /&gt;Alas, it doesn't have the "print-uris" trick which I relied upon in doing quick upgrades. I've found a simple workaround: use both aptitude and apt-get.  The following script updates the list of available packages. It uses apt-get to download -- but not install -- all updates. Lastly, it uses aptitude to upgrade the packages, using the freshly-downloaded files.  A "safe" upgrade won't delete a package to let another package be installed correctly, it just does installs.&lt;br /&gt;&lt;br /&gt;For a one-line version, see morch's &lt;a href="http://johntellsall.blogspot.com/2009/04/fast-parallel-downloading-for-apt-get.html?showComment=1255812388935#c2941514028377139032"&gt;a previous comment.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;blockquote&gt;cd /var/cache/apt/archives/&lt;br /&gt; aptitude update&lt;br /&gt; apt-get -y --print-uris -u upgrade | grep -o -e "http://[^\']+"  \&lt;br /&gt; | xargs -r -l3 -P5 wget -nv &lt;br /&gt; aptitude -y safe-upgrade &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-1955663984826420679?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/1955663984826420679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/10/fast-parallel-downloading-for-apt-get.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/1955663984826420679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/1955663984826420679'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/10/fast-parallel-downloading-for-apt-get.html' title='Fast Parallel Downloading (for apt-get and aptitude) #3'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-3031907175585718374</id><published>2009-10-25T17:54:00.001-07:00</published><updated>2009-10-25T17:54:29.144-07:00</updated><title type='text'>Bits of Evidence</title><content type='html'>Slideshow adding Science to "Computer Science". Includes references to a lot of myths like "best programmers are 45x better than the worst ones."&lt;div style="width:425px;text-align:left" id="__ss_2338367"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/gvwilson/bits-of-evidence-2338367" title="Bits of Evidence"&gt;Bits of Evidence&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=devdays-2009-091024190903-phpapp01&amp;stripped_title=bits-of-evidence-2338367" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=devdays-2009-091024190903-phpapp01&amp;stripped_title=bits-of-evidence-2338367" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/gvwilson"&gt;Greg Wilson&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-3031907175585718374?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/3031907175585718374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/10/bits-of-evidence.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/3031907175585718374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/3031907175585718374'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/10/bits-of-evidence.html' title='Bits of Evidence'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-5640599571443417740</id><published>2009-10-20T14:45:00.001-07:00</published><updated>2009-10-20T14:45:34.389-07:00</updated><title type='text'>turning batch MapReduce into infinitely streaming data wrangling</title><content type='html'>&lt;a href="http://radar.oreilly.com/2009/10/pipelining-and-real-time-analytics-with-mapreduce-online.html"&gt;Pipelining and Real-time Analytics with MapReduce Online&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-5640599571443417740?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/5640599571443417740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/10/turning-batch-mapreduce-into-infinitely.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5640599571443417740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5640599571443417740'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/10/turning-batch-mapreduce-into-infinitely.html' title='turning batch MapReduce into infinitely streaming data wrangling'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-7833702786840031483</id><published>2009-10-11T13:49:00.000-07:00</published><updated>2009-10-11T13:49:45.940-07:00</updated><title type='text'>Comparison of Scrum, XP, Kanban, and other Agile Methodologies</title><content type='html'>&lt;a href="http://agilesoftwaredevelopment.com/blog/jackmilunsky/state-agile"&gt;State of Agile&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-7833702786840031483?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/7833702786840031483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/10/comparison-of-scrum-xp-kanban-and-other.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7833702786840031483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7833702786840031483'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/10/comparison-of-scrum-xp-kanban-and-other.html' title='Comparison of Scrum, XP, Kanban, and other Agile Methodologies'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-8788047869828051697</id><published>2009-10-09T10:40:00.000-07:00</published><updated>2009-10-09T10:40:59.557-07:00</updated><title type='text'>Empirical Data behind Software Development Techniques</title><content type='html'>Our friends at Microsoft Research have published four papers testing--and measuring--development ideas. One big surprise was that a company's organization "can predict software failure-proneness with a precision and recall of 85 percent. " It's more important than using assertions or increasing test coverage!&lt;br /&gt;&lt;br /&gt;Other results: test coverage isn't a direct measure of software quality, and assertions are useful.&lt;br /&gt;&lt;br /&gt;I was glad to see some numbers behind what I've experienced, that Test Driven Development increases quality. "What the research team found was that the TDD teams produced code that was 60 to 90 percent better in terms of defect density than non-TDD teams. They also discovered that TDD teams took longer to complete their projects—15 to 35 percent longer."  Hmm.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://research.microsoft.com/en-us/news/features/nagappan-100609.aspx"&gt;Exploding Software-Engineering Myths&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-8788047869828051697?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/8788047869828051697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/10/empirical-data-behind-software.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8788047869828051697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8788047869828051697'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/10/empirical-data-behind-software.html' title='Empirical Data behind Software Development Techniques'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-2925925660678212698</id><published>2009-10-06T12:20:00.000-07:00</published><updated>2009-10-06T12:22:28.700-07:00</updated><title type='text'>Unit testing in Coders at Work</title><content type='html'>Very interesting essay on how master programmers (including Jamie Zawinski) write. Includes a TDD and traditional Sodoku solvers, with completely different implementations.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gigamonkeys.com/blog/2009/10/05/coders-unit-testing.html"&gt;Unit testing in Coders at Work&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-2925925660678212698?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/2925925660678212698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/10/unit-testing-in-coders-at-work.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/2925925660678212698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/2925925660678212698'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/10/unit-testing-in-coders-at-work.html' title='Unit testing in Coders at Work'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-5487299056625298041</id><published>2009-10-06T12:14:00.000-07:00</published><updated>2009-10-06T12:20:35.980-07:00</updated><title type='text'>Fast Parallel Downloading (for apt-get) #2</title><content type='html'>This is how to upgrade your Ubuntu system, downloading several packages in parallel.  See &lt;a href="http://johntellsall.blogspot.com/2009/04/fast-parallel-downloading-for-apt-get.html"&gt;previous article&lt;/a&gt; for details:&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;cd /var/cache/apt/archives/&lt;br /&gt;apt-get -y --print-uris -u dselect-upgrade &gt;debs.list&lt;br /&gt;egrep -o -e "http://[^\']+" debs.list | xargs -l3 -P5 wget -nv&lt;br /&gt;apt-get -u dselect-upgrade&lt;br /&gt;&lt;/PRE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-5487299056625298041?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/5487299056625298041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/10/fast-parallel-downloading-for-apt-get-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5487299056625298041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5487299056625298041'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/10/fast-parallel-downloading-for-apt-get-2.html' title='Fast Parallel Downloading (for apt-get) #2'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-6982078738656257580</id><published>2009-09-18T10:32:00.000-07:00</published><updated>2009-09-18T10:32:06.112-07:00</updated><title type='text'>Programs matter more on programmers, than the language</title><content type='html'>A study in 2000 showed a very wide range of performance for different programmers, more so than the language used.  C/C++ tended to be fastest, but not by much.  C/C++ and Java had a wide range of variability -- a programmer's skill was more important here.  With Perl, for some reason, skill didn't matter as much.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://p.einarsen.no/?p=151"&gt;Never mind the language, the programmer is what matters | Psychology of Programming&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-6982078738656257580?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://p.einarsen.no/?p=151' title='Programs matter more on programmers, than the language'/><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/6982078738656257580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/09/programs-matter-more-on-programmers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6982078738656257580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6982078738656257580'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/09/programs-matter-more-on-programmers.html' title='Programs matter more on programmers, than the language'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-7232890314728823239</id><published>2009-09-14T09:28:00.000-07:00</published><updated>2009-09-14T09:35:46.814-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Ultimate Quality Development System</title><content type='html'>Our friends at Divmod have come up with an extremely clear method of rapidly delivering high quality software.  The basic idea is you write a bug report, create a code branch, then check in the branch with a "review" tag.  When someone reviews and okays your code, you merge into the trunk. This method has lots of benefits, including taking the drama out of peer review, and making it very easy to safely test on multiple platforms.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://divmod.org/trac/wiki/UltimateQualityDevelopmentSystem"&gt;http://divmod.org/trac/wiki/UltimateQualityDevelopmentSystem&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(via Twisted)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-7232890314728823239?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/7232890314728823239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/09/ultimate-quality-development-system.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7232890314728823239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7232890314728823239'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/09/ultimate-quality-development-system.html' title='Ultimate Quality Development System'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-7582616549368193474</id><published>2009-09-10T17:33:00.000-07:00</published><updated>2009-10-06T12:17:10.129-07:00</updated><title type='text'>Using a HDTV as a Monitor</title><content type='html'>I sit across the room from my 46" TV and use a wireless keyboard.  It's great!  Alas, some Gnome and other Linuxy programs get confused by the TV's size and dimensions, so they display HUGE FONTS. On some programs, but not others.  The last straw was when Emacs23 came out and I couldn't use it.  But, now, it's all fixed!&lt;br /&gt;&lt;br /&gt;Here's the magic jibberish from /etc/X11/xorg.conf:&lt;br /&gt;&lt;pre&gt;Section "Monitor"&lt;br /&gt;       Identifier      "Samsung" # LNA650&lt;br /&gt;&lt;br /&gt;# from Samsung manual, for 1920x1080p:&lt;br /&gt;        HorizSync    67.500&lt;br /&gt;        VertRefresh  60.000&lt;br /&gt;# http://www.mythtv.org/wiki/Specifying_DPI_for_NVIDIA_Cards&lt;br /&gt; Option    "UseEdidDpi"  "FALSE"&lt;br /&gt;        Option "DPI" "100x100"&lt;br /&gt;EndSection&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This stanza gives you the old-school behavior so you can quickly test the X configuration. Hit Control-Alt-Backspace to restart the X server:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Section "ServerFlags"&lt;br /&gt;# re-enable Control-Alt-Backspace to restart X server:&lt;br /&gt;       Option          "DontZap"               "false"&lt;br /&gt;EndSection&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks, Aun!  http://ubuntuforums.org/showthread.php?t=1181631&lt;br /&gt;&lt;br /&gt;EDIT: added "UseEdidDpi" line, to turn off the buggy DPI sensing, and use DPI=100 instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-7582616549368193474?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/7582616549368193474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/09/using-hdtv-as-monitor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7582616549368193474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7582616549368193474'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/09/using-hdtv-as-monitor.html' title='Using a HDTV as a Monitor'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-51995975384103963</id><published>2009-06-13T12:45:00.000-07:00</published><updated>2009-06-13T12:55:37.045-07:00</updated><title type='text'>Python easy_install, really</title><content type='html'>Python's easy_install, at least under Ubuntu, is neither easy, nor does it install stuff if you're not root.&lt;br /&gt;&lt;br /&gt;Here's the shortcut:&lt;br /&gt;- make your local packages directory.  This means you can easily zap all your "I'm playing around with it" libraries and apps without damaging the system.&lt;br /&gt;- tell Python (and easy_install) to search it&lt;br /&gt;- also, tell easy_install to install packages into it&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ mkdir -p $HOME/local/lib/python2.6/site-packages&lt;br /&gt;$ export PYTHONPATH=$HOME/local/lib/python2.6/site-packages&lt;br /&gt;$ easy_install-2.6 -d $HOME/local/lib/python2.6/site-packages pyevolve&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If the automatic network search doesn't work, then manually download the Egg and try again:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ easy_install-2.6 -d $HOME/local/lib/python2.6/site-packages Desktop/Pyevolve-0.5-py2.6.egg&lt;/pre&gt;&lt;br /&gt;Then test it:&lt;br /&gt;&lt;pre&gt;$ python -c 'import pyevolve; print pyevolve.__version__'&lt;br /&gt;0.5&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note you'll have to add the PYTHONPATH into your ~/.bashrc, else you'll get errors like this:&lt;br /&gt;&lt;pre&gt;$  (env -i !!)&lt;br /&gt;(env -i python -c 'import pyevolve')&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "&lt;string&gt;", line 1, in &lt;module&gt;&lt;br /&gt;ImportError: No module named pyevolve&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-51995975384103963?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/51995975384103963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/06/python-easyinstall-really.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/51995975384103963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/51995975384103963'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/06/python-easyinstall-really.html' title='Python easy_install, really'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-1817223452940328901</id><published>2009-06-05T14:05:00.001-07:00</published><updated>2009-06-05T14:05:50.939-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Kanban Development Oversimplified</title><content type='html'>I loved this article It's clearly written, with a brief descriptions of the large numbers of tradeoffs within the Agile ecosystem. Specifically, choosing a different size length of time to develop each feature makes a huge difference.  I've been using very small, one-day timeboxes.  The article notes that larger boxes, four weeks, can often help the client make meaningful, business-oriented decisions vs going over each bit of minutia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-1817223452940328901?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/1817223452940328901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/06/kanban-development-oversimplified.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/1817223452940328901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/1817223452940328901'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/06/kanban-development-oversimplified.html' title='Kanban Development Oversimplified'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-1746049145927226709</id><published>2009-06-04T07:43:00.000-07:00</published><updated>2009-06-04T07:46:01.959-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computerscience'/><title type='text'>taxonomy of trees/sets/lists? automatic parallelization?</title><content type='html'>On slide 59, Guy Steele shows how to automatically translate serial into parallel code!:&lt;br /&gt;&lt;br /&gt;http://groups.csail.mit.edu/mac/users/gjs/6.945/readings/MITApril2009Steele.pdf&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-1746049145927226709?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/1746049145927226709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/06/taxonomy-of-treessetslists-automatic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/1746049145927226709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/1746049145927226709'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/06/taxonomy-of-treessetslists-automatic.html' title='taxonomy of trees/sets/lists? automatic parallelization?'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-4360188423449121388</id><published>2009-05-28T14:23:00.000-07:00</published><updated>2009-05-28T14:25:17.066-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wget'/><title type='text'>Download and extract a tarball in one step</title><content type='html'>&lt;pre&gt;wget -O - (URL) | tar xvzf -&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-4360188423449121388?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/4360188423449121388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/05/download-and-extract-tarball-in-one.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/4360188423449121388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/4360188423449121388'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/05/download-and-extract-tarball-in-one.html' title='Download and extract a tarball in one step'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-6633386469419088780</id><published>2009-05-18T20:19:00.000-07:00</published><updated>2009-05-18T20:37:51.270-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network cpipe ssh'/><title type='text'>Cheap Network Measurement</title><content type='html'>You can't control what you can't measure.  I want a fast local wireless network, counting only from my workstation to the router.  If I change settings or drivers, how can I tell if it's an improvement or not?  How can I gauge my network speed, including driver and network settings?&lt;br /&gt;&lt;br /&gt;There are jillions of tools available*, but they mostly 1) require a specific client on the server, or 2) don't actually &lt;i&gt;send&lt;/i&gt; traffic, they passively analyze what's there.&lt;br /&gt;&lt;br /&gt;Here's a solution: transmit a largish file to the server, where it will ignore the data.  Measure the network bandwidth locally using 'cpipe' or another tool.&lt;br /&gt;&lt;br /&gt;Setup: enable SSH on the router, install "cpipe" locally.&lt;br /&gt;&lt;pre&gt;cat /boot/vmlinuz-* | cpipe -vt | ssh router 'cat &gt;/dev/null'&lt;/pre&gt;&lt;br /&gt;I get lines like this, with statistics on each of many chunks of data:&lt;br /&gt;&lt;pre&gt;thru: 280.736ms at  455.9kB/s ( 288.7kB/s avg)  768.0kB&lt;br /&gt;thru: 330.929ms at  386.8kB/s ( 299.6kB/s avg)  896.0kB&lt;br /&gt;thru: 315.523ms at  405.7kB/s ( 309.7kB/s avg) 1024.0kB&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This version buffers 10,000KB into a single chunk before sending it over the network, giving a slightly more accurate bandwidth number:&lt;br /&gt;&lt;pre&gt;cat /boot/vmlinuz-* | cpipe -b 10000 -vt | ssh router 'cat &gt;/dev/null'&lt;br /&gt;thru: 13908.225ms at  411.6kB/s ( &lt;b&gt;411.6kB/s avg&lt;/b&gt;)    5.6MB&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;*: &lt;a href="http://www.ubuntugeek.com/bandwidth-monitoring-tools-for-ubuntu-users.html"&gt;http://www.ubuntugeek.com/bandwidth-monitoring-tools-for-ubuntu-users.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-6633386469419088780?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/6633386469419088780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/05/cheap-network-measurement.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6633386469419088780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6633386469419088780'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/05/cheap-network-measurement.html' title='Cheap Network Measurement'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-5184384054320766562</id><published>2009-05-14T12:37:00.000-07:00</published><updated>2009-05-14T12:43:45.099-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>Hassle-free Adobe Flash on Ubuntu 64-bit</title><content type='html'>&lt;PRE&gt;sudo apt-get install flashplugin-nonfree &lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;Of course, install Firefox Flashblock so movies don't autoplay: http://flashblock.mozdev.org/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-5184384054320766562?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/5184384054320766562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/05/hassle-free-adobe-flash-on-ubuntu-64.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5184384054320766562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5184384054320766562'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/05/hassle-free-adobe-flash-on-ubuntu-64.html' title='Hassle-free Adobe Flash on Ubuntu 64-bit'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-5318420473567044902</id><published>2009-04-22T15:46:00.001-07:00</published><updated>2009-04-22T15:58:45.282-07:00</updated><title type='text'>network monitor?</title><content type='html'>Dear Lazyweb, I want a web-based display of everything that's happening on my network. This is easy, and there are dozens of apps for this, however I also want:&lt;br /&gt;&lt;br /&gt;- easy to install.  "apt-get install beer &amp;&amp; firefox http://localhost/beer" should do it.&lt;br /&gt;&lt;br /&gt;- default install doesn't ask me for a MySQL root password, or have me edit a something configuration something plugin something, I just want to see roughly what it looks like and does.&lt;br /&gt;&lt;br /&gt;- default install should show me something about the local machine (and hopefully, the local network) w/o editing a zillion configuration files.&lt;br /&gt;&lt;br /&gt;- hopefully web-based, but a X11 application is good too.&lt;br /&gt;&lt;br /&gt;Ideas?  Here are some that fail the test:&lt;br /&gt;- Nagios.  Lots of stuff, but fails the "show me now" test.&lt;br /&gt;- Munin.  A little lighter than Nagios, but similarly uncommunicative.&lt;br /&gt;- Cacti.  Well, maybe I'll give this one another five minutes to find the URL.&lt;br /&gt;- Monit.  Awesome *very* fast and light web-based tool, alas lacks pretty graphs. It's a distributed process-control tool.&lt;br /&gt;- Tomato.  Awesome, very pretty, lots of interactive graphs. Only monitors itself, the router.&lt;br /&gt;- Gkrellm. Fast graphs, not ugly. Only monitors one machine at a time.&lt;br /&gt;- Conky. Similar to gkrellm(?)&lt;br /&gt;&lt;br /&gt;Suggestions?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-5318420473567044902?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/5318420473567044902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/04/network-monitor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5318420473567044902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5318420473567044902'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/04/network-monitor.html' title='network monitor?'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-6420408422312596563</id><published>2009-04-22T10:43:00.000-07:00</published><updated>2009-04-22T10:45:12.434-07:00</updated><title type='text'>Date and Time in Ubuntu</title><content type='html'>This lets you interactively set your time zone:&lt;PRE&gt;dpkg-reconfigure tzdata&lt;/PRE&gt;&lt;br /&gt;This sets the clock: &lt;PRE&gt;ntpdate ntp.ubuntu.com&lt;/PRE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-6420408422312596563?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/6420408422312596563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/04/date-and-time-in-ubuntu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6420408422312596563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6420408422312596563'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/04/date-and-time-in-ubuntu.html' title='Date and Time in Ubuntu'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-8097632172214241736</id><published>2009-04-22T09:06:00.001-07:00</published><updated>2009-05-14T12:57:42.768-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wrt54g'/><category scheme='http://www.blogger.com/atom/ns#' term='puppet'/><category scheme='http://www.blogger.com/atom/ns#' term='tomato'/><category scheme='http://www.blogger.com/atom/ns#' term='dnsmasq'/><title type='text'>Server names in Dnsmasq</title><content type='html'>My domain name service (DNS) is running on a router using the wonderful Tomato firmware. When a computer boots up, it sends its hostname (i.e. "sally") to the router, which records the hostname and returns the corresponding IP ("192.168.7.10").&lt;br /&gt;&lt;br /&gt;This is all grand.  But, what if different services require a computer to have multiple names? That is, when the Puppet service fires up on my lappytop, it looks for the hostname "puppet" by default. Given the above scheme, a computer has one and only one name; DNS doesn't know that "sally" is also known as "puppet".&lt;br /&gt;&lt;br /&gt;Here's how to fix that.  The router is running Tomato, which uses Dnsmasq as the DNS service. It automatically figures out the normal hostname/IP mapping, for instance "sally" in the above example.  We can tell it to point other names, like "puppet", to individual IP addresses.&lt;br /&gt;&lt;br /&gt;Open up the Tomato administration page.  Click Advanced / DHCP-DNS, and paste this into the Custom Configuration block after enabling all three checkboxes:&lt;br /&gt;&lt;PRE&gt;bogus-priv&lt;br /&gt;expand-hosts&lt;br /&gt;&lt;br /&gt;domain=lan&lt;br /&gt;&lt;br /&gt;# service names, these are in addition to /etc/hostname&lt;br /&gt;# for each computer:&lt;br /&gt;address=/puppet.lan/192.168.7.13&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;To test:&lt;br /&gt;&lt;PRE&gt;$ ping -c1 puppet&lt;br /&gt;PING puppet.lan (192.168.7.13) 56(84) bytes of data.&lt;br /&gt;64 bytes from spootoxin.lan (192.168.7.13): icmp_seq=1 ttl=64 time=0.077 ms&lt;br /&gt;&lt;br /&gt;--- puppet.lan ping statistics ---&lt;br /&gt;1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;rtt min/avg/max/mdev = 0.077/0.077/0.077/0.000 ms&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;Notice the system translates "puppet" to "puppet.lan" -- these are different names! The results for "dig puppet" and "ping puppet" can be different.&lt;br /&gt;&lt;br /&gt;Check /etc/resolv.conf :&lt;PRE&gt;domain lan&lt;br /&gt;search lan&lt;br /&gt;nameserver 192.168.7.1&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks to http://ponderer.org/tomato_firmware for the tip!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-8097632172214241736?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/8097632172214241736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/04/server-names-in-dnsmasq.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8097632172214241736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/8097632172214241736'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/04/server-names-in-dnsmasq.html' title='Server names in Dnsmasq'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-4680730048007584396</id><published>2009-04-18T21:14:00.000-07:00</published><updated>2009-05-14T12:56:02.901-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apt-getn xargs'/><title type='text'>Fast Parallel Downloading (for apt-get)</title><content type='html'>I'm rebuilding a Ubuntu server.  Normally apt-get downloads one file at a time, which can get dull when you're installing 598 files.  I found the tool "apt-fast" which downloads one or two files quickly, by downloading with multiple streams per file.  This is somewhat sketchy, as it requires installation of additional software, assumes the file gets spliced together correctly, and doesn't gracefully handle network problems.&lt;br /&gt;&lt;br /&gt;I have a solution: xargs&lt;br /&gt;&lt;br /&gt;Xargs walks on water.  It is &lt;i&gt;incredibly&lt;/i&gt; useful.  In a nutshell, it runs a single command on a list of files.  I'll post a lot more later, but here's how to speed up apt-get:&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;cd /var/cache/apt/archives/&lt;br /&gt;apt-get -y --print-uris install ubuntu-desktop^ &gt; debs.list&lt;br /&gt;egrep -o -e "http://[^\']+" debs.list | xargs -l3 -P5 wget -nv&lt;br /&gt;apt-get -y install ubuntu-desktop^&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;Replace "ubuntu-desktop^" with whichever task or package you want.  Since ubuntu-desktop is a task, a huge collection of packages, the "^" on the end is required (and magic).&lt;br /&gt;&lt;br /&gt;The options say to take three packages into a batch (-l3), and download five batches at a time in parallel (-P5). These settings are arbitrary, but provide a nice speedup while also not hammering the Ubuntu repository servers too hard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-4680730048007584396?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/4680730048007584396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/04/fast-parallel-downloading-for-apt-get.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/4680730048007584396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/4680730048007584396'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/04/fast-parallel-downloading-for-apt-get.html' title='Fast Parallel Downloading (for apt-get)'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-298310646620930953</id><published>2009-04-08T13:49:00.002-07:00</published><updated>2009-05-14T12:57:00.166-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flymake'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='make'/><title type='text'>Makefile for Python testing</title><content type='html'>This version supports Emacs's awesome Flymake syntax checker:&lt;br /&gt;&lt;br /&gt;&lt;PRE&gt;RECENT_PY := $(shell ls -1t *.py | awk '!/flymake/ {print; exit}')&lt;br /&gt;&lt;br /&gt;all test test-fast:&lt;br /&gt; ./$(RECENT_PY)&lt;/PRE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-298310646620930953?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/298310646620930953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/04/makefile-for-python-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/298310646620930953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/298310646620930953'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/04/makefile-for-python-testing.html' title='Makefile for Python testing'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-5335780862904614381</id><published>2009-04-07T12:58:00.000-07:00</published><updated>2009-05-14T12:56:33.944-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Agile Software Development</title><content type='html'>I suggest everyone run, not walk, to read Alistair Cockburn's "Agile Software Development (2nd edition)."  He talks about how people learn, and how Agile turns software development into a "cooperative game", like rock climbing.  That is, developers have different roles, and each role supports the others so the team can progress farther, producing more software features to deliver to the client.&lt;br /&gt;&lt;br /&gt;The author's notes on how people learn helped me immediately in my teaching practice.  My classes are both more accessible (can help more people) and more focused (presenting more sophisticated knowledge.)&lt;br /&gt;&lt;br /&gt;(Note the 2nd ed is a bit different from the 1st, and so recommended.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-5335780862904614381?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/5335780862904614381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/04/agile-software-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5335780862904614381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5335780862904614381'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/04/agile-software-development.html' title='Agile Software Development'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-7943377213472347454</id><published>2009-04-02T13:48:00.000-07:00</published><updated>2009-04-02T13:54:12.426-07:00</updated><title type='text'>modest makefile for rapid Java testing</title><content type='html'>This makefile is designed to help test several Java programs, each one in its own self-contained source file, for example "hello.java"   If you type "make hello.test", the program will be compiled and executed.  To test everything in the directory, type "make test-all".  To rebuild everything then re-test, do "make clean test-all".&lt;br /&gt;&lt;br /&gt;To test a new program, just start writing it.  When "make test-fast" is executed, the class file will be built, then run.  That is, you never have to update the Makefile  -- it picks up the most recent Java source file automatically.&lt;br /&gt;&lt;br /&gt;I bind "make test-fast" to the big keypad Enter key, but that's for another blog post.&lt;br /&gt;&lt;br /&gt;&lt;PRE&gt;RECENT_JAVA := $(shell ls -1t *.java | head -1)&lt;br /&gt;&lt;br /&gt;all test-fast: $(basename $(RECENT_JAVA)).test&lt;br /&gt;&lt;br /&gt;test-all: $(patsubst %.java,%.test,$(wildcard *.java))&lt;br /&gt;&lt;br /&gt;%.class: %.java&lt;br /&gt; javac $&lt;&lt;br /&gt;%.test: %.class&lt;br /&gt; env CLASSPATH=.:$(CLASSPATH) java $(basename $&lt;)&lt;br /&gt;&lt;br /&gt;check-syntax:&lt;br /&gt; javac -Xlint $(CHK_SOURCES)&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt; rm *.class&lt;br /&gt;&lt;/PRE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-7943377213472347454?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/7943377213472347454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/04/modest-makefile-for-rapid-java-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7943377213472347454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/7943377213472347454'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/04/modest-makefile-for-rapid-java-testing.html' title='modest makefile for rapid Java testing'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-5346624228679929025</id><published>2009-04-02T13:12:00.000-07:00</published><updated>2009-04-02T13:18:20.491-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>don't let network/disk hogs take over</title><content type='html'>Long-running or big I/O programs -- disk copies or network downloaders -- can make your system sluggish.  To remedy this, tell the Linux kernel that those processes should only hit the disk if the system is idle, that is in scheduling class "3".&lt;br /&gt;&lt;br /&gt;NOTE: this command, like most examples, is safe.  It only prints out what would be done.  To actually run this and other shell examples, remove the "echo" statement.&lt;br /&gt;&lt;br /&gt;&lt;PRE&gt;pgrep bash | xargs -i --no-run-if-empty echo ionice -c3 {}&lt;/PRE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-5346624228679929025?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/5346624228679929025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/04/dont-let-networkdisk-hogs-take-over.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5346624228679929025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/5346624228679929025'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/04/dont-let-networkdisk-hogs-take-over.html' title='don&apos;t let network/disk hogs take over'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-1526779247784349985</id><published>2009-04-02T12:52:00.000-07:00</published><updated>2009-04-02T12:54:00.536-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>moving old directories out of the way</title><content type='html'>This oneliner moves all non-2009 directories into a subdirectory:&lt;br /&gt;&lt;br /&gt;&lt;PRE&gt;mkdir OLD&lt;br /&gt;echo mv `ls -1tl | awk '!/2009-/ {print $NF}'` OLD/&lt;/PRE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-1526779247784349985?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/1526779247784349985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/04/moving-old-directories-out-of-way.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/1526779247784349985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/1526779247784349985'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/04/moving-old-directories-out-of-way.html' title='moving old directories out of the way'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-6688848154417783571</id><published>2009-04-02T12:44:00.000-07:00</published><updated>2009-05-14T12:56:49.264-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='flymake'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='make'/><title type='text'>show Java problems in realtime in Emacs</title><content type='html'>after installing Flymake, create this Makefile:&lt;br /&gt;&lt;br /&gt;&lt;PRE&gt;all:&lt;br /&gt;&lt;br /&gt;check-syntax:&lt;br /&gt; javac -Xlint $(CHK_SOURCES)&lt;/PRE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-6688848154417783571?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/6688848154417783571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/04/show-java-problems-in-realtime-in-emacs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6688848154417783571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6688848154417783571'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/04/show-java-problems-in-realtime-in-emacs.html' title='show Java problems in realtime in Emacs'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-4767418018061784841</id><published>2009-04-02T12:34:00.000-07:00</published><updated>2009-05-14T12:56:24.296-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='event'/><category scheme='http://www.blogger.com/atom/ns#' term='art'/><title type='text'>art for William S Burroughs!</title><content type='html'>&lt;a href="http://www.track16.com/exhibitions/2009-04-04-burroughs/pr.php"&gt;Track 16 Gallery&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-4767418018061784841?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/4767418018061784841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/04/art-for-william-s-burroughs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/4767418018061784841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/4767418018061784841'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/04/art-for-william-s-burroughs.html' title='art for William S Burroughs!'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5582182612187833327.post-6028372397433138590</id><published>2009-03-15T13:20:00.001-07:00</published><updated>2009-04-02T12:42:21.038-07:00</updated><title type='text'>Overview</title><content type='html'>This blog is for technical and personal posts. Over different jobs over the years I've written hundreds of articles, and now it's time to share with everyone!&lt;br /&gt;&lt;br /&gt;Los Angeles is filled with arty wonderfulness, and I'll share them too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5582182612187833327-6028372397433138590?l=johntellsall.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johntellsall.blogspot.com/feeds/6028372397433138590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johntellsall.blogspot.com/2009/03/overview.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6028372397433138590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5582182612187833327/posts/default/6028372397433138590'/><link rel='alternate' type='text/html' href='http://johntellsall.blogspot.com/2009/03/overview.html' title='Overview'/><author><name>John M</name><uri>http://www.blogger.com/profile/10134085861618082210</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_RNlfgA9x43A/Ss9wb7PkSfI/AAAAAAAAABM/rxkpRwwW9pE/S220/john-orange.jpg'/></author><thr:total>0</thr:total></entry></feed>
