But while the library may feel small it has a grand vision of being the new messaging layer. And really, it is not that weird when you come to think of it. Scalability issues are mostly just communication and portability issues, ZeroMQ can solve these problems for you.
What we need is something that does the job of messaging but does it in such a simple and cheap way that it can work in any application, with close to zero cost. It should be a library that you just link with, without any other dependencies. No additional moving pieces, so no additional risk. It should run on any OS and work with any programming language.
And this is 0MQ: an efficient, embeddable library that solves most of the problems an application needs to become nicely elastic across a network, without much cost.
Abbreviated notes for installing PyQt 4.7.3 on Mac OS 10.6 (Snow Leopard). This assumes you have already downloaded and installed the Qt SDK.
cd tmp
wget http://www.riverbankcomputing.co.uk/static/Downloads/sip4/sip-4.10.2.tar.gz
untar sip-4.10.2.tar.gz
open doc/html/index.html
cd sip-4.10.2
python configure.py --arch i386 --sdk MacOSX10.4u.sdk
make
sudo make install
cd ..
rm -rf sip-4.10.2/
wget http://www.riverbankcomputing.co.uk/static/Downloads/PyQt4/PyQt-mac-gpl-4.7.3.tar.gz
untar PyQt-mac-gpl-4.7.3.tar.gz
cd PyQt-mac-gpl-4.7.3
python configure.py --use-arch i386
make
sudo make install
cd ..
rm -rf PyQt-mac-gpl-4.7.3/
Software Carpentry’s tag line is “Basic software development practices for scientists and engineers.” Definitely worthwhile — although I’d recommend hg or git over subversion.
Mercurial for Git users answered many of my questions on the nuances of Mercurial. The branch model, bare repositories, and command equivalence table were especially helpful for someone like myself who has used both systems but never fully understood the distinctions.
I wanted to share a quick introduction to using a Mercurial repository on Windows with TortoiseHg. This assumes someone has already setup the repository on a shared network drive (we’ll call \\Shared\Repo\Project44) and you want to keep up do date with the changes directly in Windows Explorer.
After rebooting, Right-click -> TortoiseHG -> Settings -> Global -> Commit, and set your Username to something. I’m using “Alan Brooks”.
Right-click -> TortoiseHG -> Clone a Repository.
Put your \\Shared\Repo\Project44 in “Source Path”.
Click “clone” in the upper left.
The folder “Project44” on your hard drive is a working copy of all the latest files and also a complete copy of the entire history of the project (a.k.a. the repository in the “.hg” folder). I’ll call this folder your “local repo” for short.
Example Workflow
Edit some code or files until you get to a point where you’d like to record a small incremental change in your local repo.
Notice that the files/folders you’ve changed all have little red marks in Windows Explorer.
Commit to your local repo. Right-click -> HG Commit …, select files to commit, write a checkin comment, then click Commit. This commit will be an atomic action for all the files as a group.
Sync with the remote repo. Right-click -> TortoiseHG -> Synchronize…, click Pull to get anyone else’s changes. If there are changes, they may need merged before you push. If no changes, click Push to publish your changes to the repo.
Look at the history. Right-click -> TortoiseHG -> View Changelog.
References
A couple of good things to read to get started with Mercurial are:
I was frustrated that Spotlight wasn’t indexing any of my source code. What’s the point of Great, instant, system-wide search that doesn’t look in files I care about most? What’s going on?
The method I used was to edit the info.plist file in RichText.mdimporter (found in /System/Library/Spotlight/), adding <string>public.python-script</string>. Then, I told Spotlight to re-index the RichText file format via:
While experimenting with /etc/sshd_config settings on Snow Leopard (10.6), I had disabled PAM (by setting UsePAM no). This had an unintended side effect of making launchctl behave poorly for periodic tasks I run from the ~/Library/LaunchAgents folder. I turned PAM back on (set UsePAM yes) and all was happy.
I came across Google’s Python Style Guide and enjoyed it. It mentioned pychecker which is a nice static analysis tool for helping to find bugs in Python code.
I am loving the grin tool. It’s like a find/grep mashup with good defaults. In human-speak, that means you can easily search source code on the command line with a short command.
Just go pip install grin it already (or easy_install grin if you’re old school).
Profiling tools are essential to understanding where to focus your attention when improving software performance. RunSnakeRun is a nice way to visualize, sort, and better understand Python profiling data.
I like the idea of Quickly: make easy one-line commands for creating, editing, designing, running, packaging, and releasing Ubuntu GUI projects. Ars’s overview captures the gist of it well.
There are two main ways I’ve been using Mercurial over the last couple years: on the command line and via tortoisehg (right-click) on Windows. This is a quick reference to the command-line interface. Mercurial on the command line is called “hg” (a reference to the element Mercury).
Help
>> hg % lists basic commands
>> hg help % lists all commands
>> hg help pull % gives detailed help on command "hg pull"
Where am I?
>> hg status % tell which files have been modified
>> hg st % same as hg status (you can abbrevitate
% non-ambiguous commands)
>> hg log -l 5 % log of last 5 commits
>> hg diff % current changes to your working directory
>> hg diff -c 9 % changes made by revision 9
Committing as you work
>> hg commit -m "change 1" % regular commit
>> hg add new.c % tell hg to start tracking a file
>> hg ci -m "change 2" % "ci" is short for commit (legacy)
>> hg rename new.c blue.c % rename a file (like copy + remove)
>> hg revert ---all % oops, I didn't want to rename
>> !del blue.c % del manually (stop tracking blue.c)
>> hg mv new.c red.c % "mv" is short for rename
>> hg ci -A -m "change 3" % "-A" adds/del's files, avoids
% the "hg add, hg remove" dance
Syncing with another repository
>> hg pull % grab any new changes from default repo
>> hg update % update your working directory with the changes
>> hg merge % merge new code with your code
>> hg ci -m "merge" % commit merge result
>> hg fetch % short for "hg pull, hg update, hg merge, hg ci"
>> hg push % send your changes to the default repo
Merging
>> hg heads % list the potential heads that could be merged
>> hg merge % auto-merge (specify rev with -r if >2 heads)
>> hg resolve % if auto-merge failed, retry after manual edits
Repository management
>> hg init % make a new repo in the current dir
>> hg clone C:\Repo % clone the repo to work on a branch/idea
Advanced, but nice (many require enabling extentions)
>> hg view % launches a graphical history viewer
>> hg paths % where this repo pushes and pulls from
>> hg rollback % undo the last commit (only OK if not pushed)
>> hg shelve % stash work-in-progress to fix something else
>> hg unshelve % resume your work-in-progress
>> hg rebase % move a set of commits to a new baseline
>> hg tip -p % show latest committed changes
Hope this helps. Please send me ideas for other commands that you like to use often.
I’d like to congratulate my sister, Jessica, on winning Best of Show in the Madden Arts Center Art Show. Read all about it in the Herald and Review. Well done, sis!
Is the free anti-virus tool now available directly from Microsoft any good? Any one out there used it? Ars Technica reviewed it positively. When I need to run Windows, I’ve never loved Norton or the free AVG. I have been using ESET NOD32 lately and it is ok. But next time I set up a Windows machine, I think I’ll give Microsoft Security Essentials a try.
Mercurial is a great version control tool. I like it for the following reasons:
distributed (you can checkin changes with no network connection)
free, open-source
written in Python (easy to customize with workflows)
works well on Mac, Linux, and Windows
TortoiseHG on Windows means non-developers at work can use it
simple to get started with, but powerful features available
hg is the shortest and easiest name to type on the command line compared to the only credible competitors: git, svn, bzr … it doesn’t get any better than 2 adjacent letters on the home row!
I’ve used a couple different XML parsing libraries in the past, but have always had a desire for XML to behave just like an object where accessing attributes maps directly to accessing XML children. Who would have known it — the lxml library, one of the fastest XML processors offers exactly this API, calling it lxml.objectify. I can’t wait to try it …
In some situations, it would be nice to be able to spit out an automated report as a Word document. Mike Maccana has come up with a new tool for doing just that and shared the code on github as project python-docx. I like it.
While learning about structural image quality techniques, I implemented some test code to experiment a bit. Since I didn’t have the MATLAB image processing toolbox conveniently available, I shell out (call external command line programs) to some Imagemagick functions a bit, so watch out for that.
I just found out that Python 2.5 or newer allows relative imports, something I had been writing custom code to work around. Python documentation gives examples in 3 forms:
from . import echo
from .. import formats
from ..filters import equalizer
pip is an alternative to easy_install where you can install and upgrade python packages easily with commands like:
pip install -U ipython
Fabric facilitates deploying code to a remote location.
virtualenv lets you setup and manage working environments that aren’t littered with everything you ever installed into your global site-packages directory.
I also recommend virtualenvwrapper, which puts a nice interface on top of virtualenv.
After visiting the Ophthalmologist yesterday, I received a prescription
for corrective lenses with some crazy numbers on it. It looked something
like this:
It turns out that this is a precription for distance vision only (near
vision corrections are usually not necessary for a 25-year-old).
What are the abbreviations?
O.D. abbreviates oculus dexter, Latin for “right eye”
O.S. abbreviates oculus sinister, Latin for “left eye”
SPH stands for spherical diopter units
CYL stands for cylindrical diopter units
AXIS defines the angle of the CYL correction in degrees
The spherical component is the main correction as it acts equally to
correct blur in all directions. The cylindrical component corrects blur
in only one direction — therefore it is useful in correcting
astigmatism. The axis angle defines the direction of the necessary
cylindrical correction.
Addenda (2011 April 24):
In addition, my pupillary distance is 65 mm. This distance from pupil center to center is useful for ordering glasses online (such as at Warby Parker).
I implemented numpyIO.py because I often use scipy.io.numpyio.fread() and scipy.io.numpyio.fwrite(), but I don’t want to depend on scipy. It uses numpy’s tofile/fromfile functions instead.
Why might you want this instead of SciPy’s numpyio? Well, I can think of a few reasons:
it imports faster because it only depends on numpy, not scipy
easier to package with py2exe or py2app
it is slightly faster
it lets you avoid rewriting legacy code that makes extensive use of scipy’s deprecated fread/fwrite
cd ~/tmp
wget http://www.python.org/ftp/python/2.6.1/Python-2.6.1.tgz
untar Python-2.6.1.tgz
cd Python-2.6.1
mate Mac/README
./configure --enable-framework
make
make install
cd ..
Update setuptools so that easy_install works.
wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c9-py2.6.egg
sh setuptools-0.6c9-py2.6.egg
Add the following to my .profile so that the binaries installed by easy_install take precedence over my old Python 2.5 stuff.
Do the slightly tougher installs: NumPy (svn rev 6271), SciPy (svn rev 5300), matplotlib, and euclid. See http://www.scipy.org/Installing_SciPy/Mac_OS_X for details. Before starting, I also updated to the latest apple developer tools, although this isn’t strictly necessary.
wget http://r.research.att.com/gfortran-4.2.3.dmg
open gfortran-4.2.3.dmg # install using GUI
wget http://www.fftw.org/fftw-3.2.tar.gz
untar fftw-3.2.tar.gz
cd fftw-3.2
./configure
make
sudo make install
cd ..
svn co http://svn.scipy.org/svn/numpy/trunk numpy
cd numpy
python setup.py build
python setup.py install
cd ..
svn co http://svn.scipy.org/svn/scipy/trunk scipy
cd scipy
python setup.py build
python setup.py install
cd ..
python
>>> import numpy
>>> numpy.test('1','10') # 6 problems in 1897 tests, but usable
>>> import scipy
>>> scipy.test('1','10') # 168 errors of 3990 tests, but usable
sudo port install libpng
sudo port install freetype
easy_install matplotlib
ipython -pylab
>>> plot([1,2,3])
svn checkout http://pyeuclid.googlecode.com/svn/trunk/ pyeuclid
cd pyeuclid
python setup.py install
cd ..
Install wxPython and PythonCard for GUI development.
wget http://downloads.sourceforge.net/wxpython/wxPython2.8-osx-unicode-2.8.9.1-universal-py2.6.dmg
wget http://downloads.sourceforge.net/wxpython/wxPython2.8-osx-docs-demos-2.8.9.1-universal-py2.6.dmg
open wxPython2.8-osx-unicode-2.8.9.1-universal-py2.6.dmg
open wxPython2.8-osx-docs-demos-2.8.9.1-universal-py2.6.dmg
wget http://prdownloads.sourceforge.net/pythoncard/PythonCard-0.8.2.tar.gz
untar PythonCard-0.8.2.tar.gz
cd PythonCard-0.8.2
python setup.py install
open /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/PythonCard/samples/minimal/
Then, Ctrl-click and open minimal.py with Python Launcher to test.
Set good “don’t mess with my line endings” option before first checkout:
git config --global core.autocrlf false
Do this one time to suck in the repo w/history from SVN:
git svn clone svn://myrepo.com/project/
Do this loop over and over until your code ready to push back to SVN. The cool thing about this is that the adds and commits can be done off the network! Don’t forget to merge and re-test your changes after the rebase:
git add .
git commit -m "Added some awesome stuff"
git svn rebase
Push all local changes back to the SVN repo, which will now have all the local commits you did when you were on the airplane:
git svn dcommit
One other key tip is what when you want to decommit or rebase but you are in the middle of some changes, don’t worry. git-stash to the rescue:
git stash
git svn rebase
git stash apply
Also, here are a few links that inspired this post:
I’ve been working more with git lately and have found a few more interesting sites I’d like to share.
The Git Community Book is a great quick reference for finding out how to use a command if you can’t recall from the man page.
If you want to really understand the gory details of branching and merging with git (and I do highly recommend understanding them … easy branching is the best part of git coming from a svn background), then read this long article on LWN.net.
Also, R. Tyler Ballance has a series of blog entries on moving his team from subversion to git. I especially liked Team Development with Git which details the bad habits of developers that are just becoming familiar with distributed source control.
The Battery Powered blog tells us how to deploy a Git Repository Server in Ubuntu, which may prove useful soon. Currently, I’m just using Git for my local work and then pushing to a SVN repo, but I’d like to move others to Git soon.
Amanda and I are running the Chicago Marathon this year. We’re hoping our friends will want to come watch us run on Sunday, October 12!
We are running as part of a fundraising group that supports the Chicago Children’s Memorial Hospital. So, Amanda made a fun video showing her unique Rocky Balboa training methods.
Anyway, hope you enjoy the video. If you like it and want to sponsor us, head to Amanda’s donation site and make a pledge to support her. Or, you can pledge to support me here.
I helped put together a simple website and RSS feed of Haiku published by Bronze Man Books. Read the announcement or check out today’s haiku of the day!
Check out GPULib from Tech-X Corp. It gives you the ability to run mathematical functions on your GPU card (certain NVIDIA models only, as the moment). Includes a blog and bindings for Python (pystream) and MATLAB.
Today is becoming python link day, so here are a few more:
Idiomatic Python has some great tips on how to use python as it was intended.
The Python Package Index is a good place to look for code someone has already written that might solve the problem you’re thinking about, and probably in a much cleaner way than you were thinking. This used to be known as the Cheese Shop.
pyeuclid is a nice 2D/3D vector, matrix, and quaternion math library (that needs better docstrings and a ray-sphereoid intersection).
Straight-forward Python reference the explains the standard library rather completely and cleanly just by showing a simple example for each module and function. Very nice for a quick lookup of something you don’t quite remember.
Because it obscures the nice Leopard python that includes Numpy and Dtrace, remove your old Python completely.
sudo rm -rf /Library/Frameworks/Python.framework/
Check that NumPy is already installed and working.
python
import numpy
numpy.test(1,10)
Install latest IPython, version 0.8.2. Note that I always alais untar='tar xvzf' in my bash setup.
wget http://ipython.scipy.org/dist/ipython-0.8.2.tar.gz
untar ipython-0.8.2.tar.gz
cd ipython-0.8.2
sudo python setup.py install
Install a fortran compiler binary because it is needed to compile/install Scipy. I get the PPC version of gfortran. You can also find the Intel version at HPC Mac OS X.
wget http://internap.dl.sourceforge.net/sourceforge/hpc/\
gfortran-ppc-leopard-bin.tar.gz
sudo tar -xvf gfortran-ppc-leopard-bin.tar.gz -C /
Edit a disttools file in Apple’s NumPy distribution so it is more lenient in allowing the use of the above gfortran compiler when building SciPy. Inspired by this note.
cd /System/Library/Frameworks/Python.framework/Versions/2.5/\
Extras/lib/python/numpy/distutils/fcompiler
sudo cp -p gnu.py gnu.py.bak
And edit the following lines as follows (I use mate gnu.py to edit in TextMate).
Our boy continues to be quite the fun addition to the family. He can run around playing fetch all day. He also likes to fight with Little Buddy (a.k.a. our Roomba). I think we should teach him to ride it around.
Thanks to this TidBITS article, I was tipped off to find this Mac OS X Hint about how you can rebuild the Launch Services database that determines which applications show up in your “Open With” contextual menu. My Open With had a huge amount of cruft accumulated over time with Classic apps, apps on my backup hard drive, and an annoying number of image droplets in the Photoshop/Samples/Droplets folder.
So I rebuilt my Launch Services database to make my Open With much cleaner and faster. Here’s how I did it.
Eject my backup hard drive so that the database doesn’t include duplicate copies of all my applications.
Archive the Photoshop/Samples/Droplets/ folder (right click, Create Archive, then delete the folder).
Add the following line to my ~\.profile so typing the lsregister command is easier. (alias ... should all be on one line)
# make launch services register easy to find
alias lsregister='/System/Library/Frameworks/
ApplicationServices.framework/Frameworks/
LaunchServices.framework/Support/lsregister'
Save a description of the old database (out of curiosity, not necessary).
lsregister -dump | less > lsregDumpOld.txt
Rebuild the database. (all on one line)
lsregister -kill -r -f -domain system -domain system
-domain user "/Applications"
Save a description of the new database (again just curious).
lsregister -dump | less > lsregDumpNew2.txt
The new database is now about 1 MB, down from the original 6 MB. There sure was a lot of junk in there!
I can hear up to 17.1kHz. Steve can only hear up to 14.7kHz. So I win
this round. Although maybe that means he can save more disc space and
compress his MP3s a little more?
If you want to perform your own test, you can use Python on Windows as
follows:
from winsound import Beep
Beep(14000, 1000)
14000 is the frequency 14kHz and 1000 is beep duration 1000ms (1
second). Crank up the frequency until you can’t hear it.
Update: alternate MATLAB one-liner for doing the same:
Update 2: Paul says he can hear up to 16.9kHz well but also claims to faintly hear 18-20kHz. I think that means he wins, because I cannot hear above 17.1kHz at all. He said he used headphones whereas I used crappy laptop speakers, so I consider that cheating a little.
Update 3: So apparently, the results are very dependent on the speakers being used. I tested Amanda at home using the Bose speakers and she can hear up to 17.5kHz. Funny thing: with these speakers, I can hear up to about 18.4kHz. Not sure what to make of that except that I’m winning again.
Woah, I just randomly double-clicked a word while reading an article nytimes.com and it popped up a definition/theauraus with information on that word. Seems to work while reading articles, but not on the front page.
It is actually more than just a dictionary. For example, go read about Led Zeppelin finally doing digital downloads and when you click Zeppelin, it gives a short bio on the band. Says it’s powered by Answers.com.
Hack the iPhone is the best site that collects iPhone hacks, how-to’s, and downloads. Installer.app is a package manager that lets you install, update, and uninstall a great variety of 3rd party iPhone software. Awesome. Finally, iFuntastic lets you change your icons, backgrounds, and install apps.
Suppose you are using Subversion to manage your code and find that you’d like to include revision information within a file. You might read this and think it won’t work, but do not be dismayed. You really wanted to look at Keyword Substitution in the Subversion book.
There you will find that enabling substution on a file is rather easy. Say you have some code in Spam.py and you’re running TortiseSVN. Then, the basic process is:
Add a property svn:keywords with value Date Revision Author HeadURL Id
Put a keyword in the file where you want it to expand the thing — I put $Id$ in the docstring of Spam.py. Id is a summary which, after checking in, expanded to "$Id: Spam.py 513 2007-10-10 23:10:30Z username $".
On Mac OS X, Hex Fiend handles editing of binary files beautifully.
On occasion, I also need to munge around with large hex files on
Windows. Today, I found the XVI32 hex editor — it does the
job nicely, letting me delete out segments and re-save the result. It
probably wouldn’t work as well with extremely huge files because it does
everything in-memory, but for 300MB files, it works great.
In the never-ending search for commuting content, I stumbled upon listening to words. It has a decent collection of interesting video and audio lectures available for free. Give it a listen.
A CSS framework that “gives you a solid CSS foundation to build your project on top of, with an easy-to-use grid, sensible typography, and even a stylesheet for printing.” Check it out. By the way, Google Code is starting to host some great stuff lately …
Sometimes it is nice to be able to send huge files to people over the web without hosting a server. pando and YouSendIt are both good solutions for doing that. Pando gives 1GB free while YouSendIt gives 2GB.
I love the tagline “A really fast dictionary … fast like a ninja.” ninja words really is litening fast with instant results that show up in your browser window without reloading.
I was having trouble mounting, reading, or writing to an external USB hard drive on my Mac. Trouble was it is formatted with NTFS and I didn’t want to reformat. Solution: install macfuse and ntfs-3g then go to Terminal and type
diskutil list | grep Windows_NTFS
to find your NTFS disk matching /dev/disks, then mount the disk
Check out my good friend Steve Hoelzer’s Master’s thesis on reducing blocking artifacts in DCT-coded images (like highly-compressed JPEGs). I enjoyed the clear and concise executive summary.
Last weekend, I became a proud double-uncle when my brother’s family grew from 2 to 4 overnight! Ashley Nicole and Lindsey Grace were born at 12:30 in St. Louis on January 12, 2006.
Now there’s a way to put video back to my TiVo from my Mac. The
interface for turning it on is hidden until you either command-click the
TiVo preference pane or type defaults write com.tivo.desktop FileVideo
-dict-add VideoUIEnabled -bool true into Terminal (this feature is
also known as “TiVoToComeback”).
If you ever find yourself needing to do video playback and format conversion with a wide variety of video formats on Windows, I have a few key free pieces of software to recommend:
VirtualDub: a video capture and processing tool that can very quickly read, manipulate, and write AVI files in many formats (VirtualDubMod, a spinoff, handles even more formats) (Wikipedia description)
VirtualDub filters: the other great thing about VirtualDub is that there are many plugin filters available that implement a varietyof video/image processing algorithms
ffdshow: a codec (decoder and encoder) package that installs as a native Windows DirectShow filter, enabling playback of many modern video formats in Windows Media Player
Auto Gordian Knot: a tool for converting DVD video content into XviD or DivX or x264 MPEG4 video
MediaInfo: reveals the codecs used for video and audio contents within a video file
The DOAJ lists scholarly journals that give free access to the full text articles. Some papers are pretty decent — I poked around and found the International Journal of Signal Processing interesting.
The IR & EO Systems Handbook — the definitive reference for Infrared and Electro-Optical systems — is available for free. For scanned PDFs, the quality is high. Unfortunately, the fact that they are scanned means that the text is not searchable.
Volume 1: Sources of Radiation
Volume 2: Atmospheric Propagation of Radiation
Volume 3: Electro-Optical Components
Volume 4: Electro-Optical Systems Design, Analysis, and Testing
Volume 5: Passive Electro-Optical Systems
Volume 6: Active Electro-Optical Systems
Volume 7: Countermeasure Systems
Volume 8: Emerging Systems and Technologies
For some reason, TiVo Desktop version 1.9.3 (008) for Mac OS X is a processor hog for me. Especially after I’ve committed the crime of actually running iTunes or iPhoto on a given day.
I’ve noticed that stopping and starting TiVo Desktop improves this situation, but I’ve also gotten personally tired of doing this, so now I offer you a way of automating an escape from this monotony. Use the plist file here:
saved in the /Users/uname/Library/LaunchAgents/ folder with a name something like com.QuickSilverWatch.plist in combo with these launchd instructions. Or, just use lingon as described is this Mac OS X Hint. Either way, you’ll need this applescript to actually reboot TiVo Desktop:
-- open Sys Prefs and wait for it to open
tell application "System Preferences"
activate
end tell
-- stop/start TiVo Desktop w/10 trys
repeat 10 times
delay 1
try
tell application "System Events"
tell application process "System Preferences"
-- set frontmost to true w/10 trys
repeat 10 times
try
click menu item "TiVo Desktop" of menu ...
"View" of menu bar 1
delay 1
tell window "TiVo Desktop"
click button "Stop"
click button "Start"
end tell
exit repeat
end try
end repeat
end tell
end tell
exit repeat
end try
end repeat
-- quit Sys Prefs
tell application "System Preferences"
quit
end tell
Babynamewizard.com has a tool called NameVoyager that shows a
graph of popular baby names over time. The data is massaged out of the
Social Security Administration’s records. The really cool thing is that
you can type parts of names and get instant feedback as the popularity
graphs change. It’s fun to explore — check it out.
The plots show the 1000 most popular names versus time whre the
popularity axis is the number of names per million babies. When looking
at the “all names” graph (the first graph that comes up as you visit the
website), it’s interesting to see observe an upward trend in name
diversity since the 50’s. This trend shows up directly as the thickness
of many name-lines decreases and indirectly because the overall number
of top 1000 names displayed goes down. In the 50’s, 95% of the names
were in the top 1000 while in 2005 only about 75% were in the top 1000.
Go find interesting trends.
A journalist goes undercover as a salesman at 2 car dealerships. Read
it if you’re considering buying a car (or at least look at the
recommendations at the end).
In The IDE Divide, Oliver Steele uses his analytical knife to split developers into language mavens versus tool mavens. What would you rather use on your next project?
Anyterm and Ajaxterm provide a way to use SSH (remote login) through any browser. Once this is setup, it would be slightly easier than downloading PuTTY.
Creating passionate users is becoming one of my favorite websites. Yesterdays post on why face-to-face matters notes how video chat is very close to face time but lacks in the eye contact department:
Video chat is better than any other form of non face-to-face, because you get facial expressions, tone of voice, body language, AND real-time responsiveness. But—he said there’s still a very unsettling feature for the brain because there’s really no way for BOTH speakers to make eye contact! … there’s no way to have the camera right in your face, in a place where you can still look into the other person’s eyes. Bottom line: You can see the camera or the person’s eyes… but not both.
I wonder if some fancy image processing could be applied so as to give the illusion of eye contact between both parties.
In most times, places, and industries over the past century, managers who worked their employees this way would have been tagged as incompetent — not just because of the threat they pose to good worker relations, but also because of the risk their mismanagement poses to the company’s productivity and assets. A hundred years of industrial research has proven beyond question that exhausted workers create errors that blow schedules, destroy equipment, create cost overruns, erode product quality, and threaten the bottom line. They are a danger to their projects, their managers, their employers, each other, and themselves.
I like iStockphoto. It’s much easier that looking through huge clip art galleries — you just search and buy royalty-free photos right on the website. I enjoy looking for burros, donkeys, and mules.
Luxagraf mates markdown and XeTeX (LaTeX with MacOS X fonts) to produce a wonderful offspring: hi-fi text. In goes clean, minimal markdown text. Out comes beautiful typeset pdf documents.
I installed Broadband Optimizer, a program that aims to increase network speed on Mac OS X by increasing TCP memory buffers, effectively making data come in bigger chunks.
I used 3 online bandwidth testers to quantify the improvement (clearing Firefox’s cache between each test). I took the best of three runs of each test.
Justin Williams of MacZealots.com gives some good tips on installing and using subversion on Mac OS X. I found subversion indispensable in keeping track of all the code and writing for my master’s thesis.
Haskell (a programming language) has no update operator. There is no order of operations. Find out more from this introduction to a “functional” programming language.
Face and text recognition for your personal photos. Upload, do little training, then search by face. “Hey computer, find me all the photos that have both Tim and Chad because I’m to lazy to browse my 30000 thumbnails.”
Try it. (only Firefox and IE6 currently supported)
Here’s a nice guide for using the mod_rewrite Apache web server module for making nice URLs. I use it to make my blog URL dailyburrito.com/blog instead of dailyburrito.com/blah/blah/morecrap/blosxom.cgi and to make www.dailyburrito.com map to dailyburrito.com (for some reason, I really hate that www).
I altered the configuration of Apache web server that comes installed Mac OS X in two spots to accomplish the above goals. First, I edited the main Apache configuration document by adding the following line at the very end of /etc/httpd/httpd.conf, instructing Apache to look at my own configuration files.
Include /private/etc/httpd/users/*.conf
Then, I created the file /private/etc/httpd/users/alan_apache_setup.conf that looks like this:
# Blosxom script redirect
ScriptAlias /blog /Library/WebServer/CGI-Executables/blosxom.cgi
# Redirect visitor by domain name
RewriteEngine On
RewriteCond %{HTTP_HOST} !^dailyburrito.com$ [NC]
RewriteRule ^(.*)$ http://dailyburrito.com$1 [R,L]
A transcript of Robert F. Kennedy’s amazing speech about the some of the horrific things that we are doing to our environment. It touches on everything from coal-burning power plants to mercury in the water to strip mining to cultural values to draft dodging. Long, but well worth the read.
When you evolve out of start-up mode and start worrying about being professional and dignified, you only lose capabilities. You don’t add anything… you only take away. Dignity is deadly.
This feature is proposed in their issue tracking database as Issue 1256. It recently got bumped from consideration for version 1.3 and is now being considered for 1.5. For some reason, the fact that subversion doesn’t keep the last modification date of files under version control is very annoying for me.
Woo hoo! My final report for class is now complete and available in html and markdown text formats. The report describes the eigenface and fisherface techniques for facial recognition and includes MATLAB source code.
Sandvox looks to be a very promising tool for creating websites
that look great and comply with standards. You can download the public
beta now and try it out.
Recently for my master’s work, I found that a very nice implementation
of JPEG compression is available from the Independent JPEG
Group. The code and supporting
documents are quite nice and flexible. At
least one of my readers (Steve) will like to hear that it supports compressing
with a user-specified quantization table.
Mr. Kahan is a math/EE/CS professor at Berkely who writes some
interesting notes on limitations and problems with math libraries. His
work is archived on his homepage.
Some of my favorites include:
“Knowledge and productivity are like compound interest.” Given two
people of approximately the same ability and one person who works ten
percent more than the other, the latter will more than twice
outproduce the former. The more you know, the more you learn; the more
you learn, the more you can do; the more you can do, the more the
opportunity - it is very much like compound interest. I don’t want to
give you a rate, but it is a very high rate. Given two people with
exactly the same ability, the one person who manages day in and day
out to get in one more hour of thinking will be tremendously more
productive over a lifetime.
While my normal computing platform of choice is Mac OS X, I do end up
using Windows at work. On OS X, I really love the quick-launching
abilities of LaunchBar and QuickSilver, so naturally I’m
always on the look-out for similar launcher utilities for Windows.
Launchy is a promising start. It was
written for fun by a guy who just wanted it for himself, then shared it
with friends, then shared it with the world. Despite being so young, it
has three of the best features I deem necessary in this strain of
program:
blazing fast speed
almost non-existant UI (it only shows up with a keyboard command,
Alt+Space)
The CVCL (Computational Visual Cognition Lab) at MIT presents a gallery
of perceptual image illusions. The hybrid faces are very
interesting. They combine high and low spatial frequency information to
create a face that changes with viewing distance. (via Ian Rowland
via reddit)
Doh! Right after posting this, I realized that Steve Hoelzer beat me to
the
punch.
Nice scoop, fellow reddit reader.
I can’t really tolerate a command line and/or programming environment
that doesn’t include a usable auto-completion feature (like Python’s
built-in shell). To solve this problem, I’m using the “enhanced” shell
IPython on my Windows machine. It wasn’t
working well, but then I found that IPython’s docs suggest that I need
the readline extention:
While you can use IPython under Windows with only a stock Python installation, there is one extension, readline, which will make the whole experience a lot more pleasant. It is almost a requirement, since IPython will complain in its absence (though it will function).
The readline extension needs two other libraries to work, so in all you need:
DARPA’s Grand Challenge (a race
between vehicles that are able to navigate an off-road course without
human intervention) started yesterday. It looks like they will soon be
announcing the winner because only 1 of the 23 teams is still running
with no chance of catching up to the very tight pack of 4 teams that
have completed the 132 mile race in less than 10.5 hours.
It’s looking like the final placing will be:
9h 55m: Stanford Racing Team’s Stanley, a Volkswagen Touareg with GPS, IMU, laser, radar, vision, and wheel speed sensors.
9h 59m: CMU Red Team’s Sandstorm, a 1986 HMMWV with vision, radar, laser, and GPS sensors.
10h 4m: CMU Red Team’s H1ghlander, a 1999 H1 Hummer with INS, GPS, and laser sensors.
10h 17m: Gray Team’s GrayBot, a 2005 Ford Escape Hybrid with cameras, laser, and GPS sensors.
It is amazing how close the 4 teams that finished were. Sandstorm only
lost by 4 minutes!
Drew McLellan reviews a few tools that allow multiple people to edit a document together online: Writely, JotSpot Live, and Writeboard. His criticism of Writeboard leads to improvements the following day.
The creator of the creative commons license, Lawrence Lessig, has made his book Free Culture available free online. Since his license allows noncommercial derivitive works with attribution, people have remixed the book into many interesting versions:
Steve is quite the photographer, getting some great-looking night pictures of us all last night. So here’s Alan & Amanda, Laura & Kris, then Dawn & Steve.
A sampling of thier proofs is now available. The couple did such
a great job of looking good, it must have made the photographer’s job
easy — some great pictures were the result.
Note: to download the photos on your computer, just go to the following
website. You can replace the number 16 with any picture number from 1
to 45 to see other photos.
Steve and Dawn are going to be parents! Check out the ultrasound.
As you can see in the right hand lower corner of the pictures, the due
date is around March 29-30th.
I recently decided to brush up on
Unicode because I’m
preparing to redesign this website and I’d like it to fully use Unicode as it’s
text-delivery format.
What is Unicode? It is basically a mapping of a single number that represents each character in every writing system. It even includes some dead languages from the past.
I was struggling with how to enter Unicode characters on Mac OS X, when I finally
found some useful tools that can be enabled by the “Input Menu” tab of the
International System Preferences. If you enable “Character Palette” and “Unicode
Hex Input”, you’ll get a little flag in your menu bar that lets you choose among
two useful input methods:
Character Palette - graphically pick your glyphs (see screenshot)
Unicode Hex Input - type in the hex Unicode code point while holding down the
option key
This is one of those simple once you know it but annoying to figure out
settings. Via google, I found the solution — add the folling lines
to “.inputrc” in your home directory:
For extra fun, you can make the command line cycle through options instead of printing them all when you press TAB. Try adding the following line (via
macosxhints):
TAB: menu-complete
The jury in my head is still out on if I prefer this behavior. I wish
they would just hurry up and decide so I can get used to it.
Update: Note that this takes effect in new terminal windows and new
logins, not your current command line session.
Update 2: Steve suggested an
alternative approach is to add the following lines to “.profile” or
“.bashrc”:
# make bash autocomplete with up arrow
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
# make tab cycle through commands instead of listing
bind '"\t":menu-complete'
Tommorrow, The Mathworks released an update to MATLAB. It’s funny that I’m
reading about it right now, yet it is not released until tomorrow. Some of the
improvements of interest to me (and to Steve) include:
better Mac support for plotting, speed, and the compiler
large scale modeling which seems to be their buzzword for the integration of Simulink and Stateflow with GUI navigation
bug fixes in the Image Processing Toolbox, including an improved imagerotate
According to the PNAS Journal (a favorite of Berkely Groks), the quasi-Monte Carlo Metropolis algorithm can get your results much quicker if your MC problem happens to fit their conditions: it has to be “completely uniformly distributed” (CUD). If you have a CUD problem, PNAS can solve it (those of your giggling at this are immature).
Thanks to my friend Sotos for pointing this one out.
This saga was enabled by my recent upgrade to Mac OS X 10.4 (the upgrade itself went very smoothly). I decided that I should setup squid to run automagically via launchd. Luckily, faithful reader Steve wrote a tutorial that explaines exactly how this should work.
It’s all working great now, but that took a little doing. I followed Steve’s commands exactly but ran into trouble because of a permissions problem with the cache. Steve recommended changing the permissions (sudo chmod -R 755 /sw/var/cache/) and I now realize that following his advice would have fixed the problem right away.
Instead of listening to the Wise Words of Steve, I decided it would make sense to do a sudo killall launchd. Oops. If I would have read this more carefully, I might have remembered that launchd is now responsible for starting the window manager on Tiger, but alas, I was driven to figure it out without thinking.
So, you might ask at this point: what happens after you sudo killall launchd? As happens often in scientific inquiry, I have stumbled upon the answer to this oft-pondered quandry by chance.
Here’s what happened:
Apps that were already running continued to run, minus network connections
New apps wouldn’t launch — the app would bounce in the Dock forever
Couldn’t Shut Down, Restart, or Log Out
I guess the lesson is: typing sudo killall whatever on stuff you don’t know anything about is probably a bad idea.
For travel, visit kayak, another very simple,
clean interface. After the search completes, it has awesome little sliders
to narrow your results by price and times.
I suppose the theme of the day has become simple web interfaces.
Indeed is a new job search company.
Googley-simple interface that meta-searches many of the major job listings
online. (via This is going to be BIG!’s 10 Steps to a Hugely Successful
Web 2.0
Company,
also a good read)
Jason Kottke (who makes a living running his interesting links
website) explains the idea for a WebOS in his
article entitled GoogleOS? YahooOS? MozillaOS?
WebOS?. His idea is
that a users of WebOS only need to run a browser and web
server locally and then all of the actual work can be done in web
applications.
Some current web apps that are already trending toward a WebOS include
Gmail, Flickr, and Bloglines. In the future, we’d expect IM, word
processing, spreadsheets, iTunes, backup, and all of those fun
business apps.
One of his key ideas in making this all possible is that the local web
server would provide synchronization & caching of local changes to
your data as necessary so you don’t have to be connnected to the
internet to use web applications. As you connect to the internet, the
local server and remote server synchronize without the user worrying
about it (think BlackBerry for the desktop).
A couple of his best ideas for WebOS apps:
Gmail. While online, you read your mail at gmail.com, but it also
caches your mail locally so when you disconnect, you can still read it.
Then when you connect again, it sends any replies you wrote offline,
just like Mail.app or Outlook does. Many people already use Gmail (or
Yahoo Mail) as their only email client…imagine if it worked offline as
well.
Newsreader. Read sites while offline (I bet this is #1 on any
Bloglines user’s wish list). Access your reading list from any computer
with a browser (I bet this is #1 on any standalone newsreader user’s
wish list).
Today Google released thier newest product/service — Google
talk — as Windows-only client software.
It’s
really too bad this didn’t end up being a web applicaiton. Gmail was
done so well that it had me hoping for a great web-i-fied IM client too.
Kottke was also
dissapointed.
For us mac-loving freaks, even though we didn’t get an actual Google
talk client, there is a smidgen of love: it works with iChat allowing
both text and audio
chat,
even though Google says
it only works with text.
Tipped off by this Mac OS X
hint I
went looking to see if anyone might be trying to break into my computer
via scripted ssh login/password guessing attacks. After reading some of
the comments on macosxhints and doing some digging, I figured out a nice
way to check for attacks by using grep to search the system.log files.
zgrep 'Illegal' /private/var/log/system*
zgrep (a variant of grep) searches the archived log files in
addition to the current ones. On my system, this produced a long list
of breakin attempts that look like they are coming from an automated
script running through user names.
I’m not sure if disabling the ssh password, as the hint suggests, is
the best idea to counter this attack (and, I admit, I’m too lazy to
setup the crypto keys thing for now).
For my own home computer, I thought it would be better to only allow
login for myself and keep my password very strong. To accomplish that, I
edited the cooresponding settings in /etc/sshd_config to to the
following:
# Enable only SSH2 protocol (not the less secure SSH1)
Protocol 2
# Don't allow any remote root login
PermitRootLogin no
# Make sure only a particular user (dorkuser) can SSH
AllowUsers dorkuser
That’s it! Much more secure. dorkuser is, of course, not my real
username.
For fun, here’s a look at a processed (minus IPs and my user name)
snippet from the log:
08:38 sshd: Illegal user wwwrun
08:40 sshd: Illegal user wwwrun
08:42 sshd: Illegal user wwwrun
08:44 sshd: Illegal user wwwrun
08:46 sshd: Illegal user wyoming
08:48 sshd: Illegal user wyoming
08:50 sshd: Illegal user wyoming
08:52 sshd: Illegal user 0002593w
08:54 sshd: Illegal user 001
08:56 sshd: Illegal user 1
08:58 sshd: Illegal user 123
09:00 sshd: Illegal user 1234
09:02 sshd: Illegal user 127
09:04 sshd: Illegal user 16
09:06 sshd: Illegal user 1a4
09:08 sshd: Illegal user 1dd
09:10 sshd: Illegal user 22b
09:12 sshd: Illegal user 2a
09:14 sshd: Illegal user 3e
09:16 sshd: Illegal user 4ct
09:18 sshd: Illegal user 511
09:20 sshd: Illegal user 561
09:22 sshd: Illegal user 587
09:24 sshd: Illegal user 72
09:26 sshd: Illegal user 75
09:28 sshd: Illegal user 9ia
09:30 sshd: Illegal user a
09:32 sshd: Illegal user a
09:34 sshd: Illegal user a_kirchner
09:36 sshd: Illegal user a1775b
09:38 sshd: Illegal user a4
09:40 sshd: Illegal user aaaa
09:42 sshd: Illegal user aabraham
09:44 sshd: Illegal user aadriano
09:46 sshd: Illegal user aaghie
09:48 sshd: Illegal user aagt
09:50 sshd: Illegal user aahie
09:52 sshd: Illegal user Aaliyah
09:55 sshd: Illegal user aaltje
09:57 sshd: Illegal user aandjstructural
09:59 sshd: Illegal user aando
10:01 sshd: Illegal user Aaron
10:03 sshd: Illegal user aaron
10:05 sshd: Illegal user aaron2
10:07 sshd: Illegal user aart
10:09 sshd: Illegal user aatef
10:14 sshd: Illegal user aba
10:16 sshd: Illegal user aba
10:18 sshd: Illegal user Aba
10:20 sshd: Illegal user abaintelkam
10:22 sshd: Illegal user abawah
10:24 sshd: Illegal user abby
10:26 sshd: Illegal user abc
10:28 sshd: Illegal user abculp
10:30 sshd: Illegal user abe
Fog Creek Copilot’s (Joel Spolsky’s latest product that was developed by interns in one summer) technical details explained. It’s a nice combination and simplification of existing tech (TightVNC and MatrixSSL) and that should be useful for many users.
Also, MatrixSSL looks to be a good simple SSL implementation. Here’s some specs included in the GNU Public License version:
< 50KB total footprint with crypto provider
SSL server and client support
Included crypto library - RSA, 3DES, ARC4, SHA1, MD5
In this post, Ned Gulley points out a
recent New Scientist magazine article that links modern Fundamentalism to the forgotten
ideas of mythos and logos.
The International Herald Tribune has a great side-scrolling web
design powered by CSS and JavaScript. It works by dynamically flowing text into 3 columns
depending on the height of your browser window. There are Next Page and Previous Page
controls that work instantly because you already have the full articly text — a
JavaScript simply displays the section you are
interested in seeing.
Check out this article for an
example. I’m wondering how this handles pictures embedded in the article. Can it flow
around them nicely? Their JavaScript had some variables that referred to an
“articlePhoto” but the code was commented out, so maybe there are some problems.
Mr Hoelzerrecently linked to a Harvard magazine article, Deep into sleep, that convinced me it might be worth trying sleeping more. My hate of sleep has been broken a bit.
Especially The Fatigue Tax section of the article seems to be scientifically sound. However, in defense of my personal “I hate sleep — it’s a waste of time” doctrine, I would have to point out that there is a bit of a problem with the part of this article that talks about less sleep hastening death. This may be a confusion correlation and causation. I’ve not read any of the actual research and this is really out of my league to evaluate very well, so that’s about all I can say for now …
Michael Robertson advocatesGizmo, a competator to Skype, the free
program that lets any user make telephone calls over the internet. Of
course, he would advocate it since he started the company that makes it,
SIPphone.com. Anyhoo, it does look pretty nice at first glance. Wanna
try, Kris or
Steve?
My brother, Arik Brooks, just updated his
website and I definitely like the new design
because it’s much cleaner both visually and in the code (he’s now using CSS
for almost all of the formatting).
If you’d like to look at the design before and after, check out the following
screenshots of the main page (or just check the internet
archive).
Before (now this is old-school html if I ever did see it):
After (much nicer with a good style):
A notable new section describes their New
House including weekly photos of
the house he and Laura are having built. I’m excited to visit once it is
complete!
Also, his wife Laura now has a
page as well. I like the clean
blue design on her page.
where the arguments specify: -n number of requests to use in the benchmarking session -c number of simultaneous requests to perform
As noted in the comments of ridiculous_fish’s Mystery
entry, there is apparently a
stalling problem with using ab that may be caused by something deeper
in OS X.
Definition of
Ajax
by Jesse James Garrett that is probably the origin of the term that
simplifies “Asynchronous JavaScript + CSS + DOM + XMLHttpRequest”.
The acronym AJAX comes from Asynchronous JavaScript And XML.
I stumbled across Michael A. Covington’s
presentation on how to
write more clearly, think more clearly, and learn complex material more
easily. I enjoyed it.
The New York Times has a useful
blogroll that
links to some of the supposed “best” web logs out there (athough they
missed my
two favorites: DrunkenBlog and Daring
Fireball).
Kris Classen, my good friend and 1 of 2 dedicatedreaders of the site, offers the following analysis of my previous post.
regarding the news post, he [Paul Graham] is mostly correct for the type of news that makes TV…. they dont have much actual analysis, and they favor
worthless human interest stories… however, good papers like the wash
post and the NY times actually have interesting articles because the
authors bother to do research to add context and meaning to those
meaningless presidential speeches… likewise any other specialty
publications that focus on their topic (like even the shuttle article
you have)—the writers who take the time to do a good job produce an
interesting product… i think the bottom line for the guy you are
quoting is that he just isnt interested in politics, so he finds
politics stories to be uninteresting….
I like Kris’ idea that the value of good reporting is adding context in explaining why things like political speeches happen. As you can see, Kris is a fan of the ellipsis (at least, in email).
I really liked this quote in Paul Graham’s latest
writing. He’s
talking about the fact that a very large amount of the content produced
by the news media is not very interesting or thought-provoking.
Most articles in the print media are boring. For example, the
president notices that a majority of voters now think invading Iraq was
a mistake, so he makes an address to the nation to drum up support.
Where is the man bites dog in that? I didn’t hear the speech, but I
could probably tell you exactly what he said. A speech like that is, in
the most literal sense, not news: there is nothing new in it.
Nor is there anything new, except the names and places, in most “news”
about things going wrong. A child is abducted; there’s a tornado; a
ferry sinks; someone gets bitten by a shark; a small plane crashes. And
what do you learn about the world from these stories? Absolutely
nothing. They’re outlying data points; what makes them gripping also
makes them irrelevant
Web writing is so much more interesting than “the news”.
Here’s a very interesting
article that
rips up NASA’s shuttle program (via
kottke.org). The author stresses that we are
spending too much money on the uninteresting experiment of keeping
primates alive in space that could be much better used in unmanned
exploration programs like the Mars rovers or Titan lander.
we have the right to demand that the space program have some purpose
beyond trying to keep its participants alive
This article at motorcyclistonline.com has a hilarious/frightening
description of helmet testing. Favorite quote: “To minimize the G-forces
on your soft, gushy brain as it stops, you want to slow your head down
over as great a distance as possible.”
Sure makes you think twice about not wearing a helmet on a bicycle or
motorcycle.
Psyco can really speed up the execution of Python code (only on i386
processors for now). It is a just-in-time compiler so you can run your code
fast with no change in your souce code. If you’re interested in more tech
detail, check out the theory (pdf).
Some other packages of interest are Matplotlib (provides a plotting
library with commands similar in syntax to MATLAB), numarray
(array/matrix processing), py2app (converts python scripts to
standalone Mac OS X apps), and the Python Imaging Library (PIL).
The distributed version control system called Codeville sounds very
nice. I’d like to check it out. Favorite feature: “Almost trivial to use for
personal projects without running a server”.
Jonathan Rentzsch describes the details on how to use the command
line tool fs_usage to discover what files a program is opening, reading,
writing, saving, and so on. This could be is quite useful for figuring out
where a program is storing information or what might be going wrong with
a mis-behaving app.
Update:
For example, the following shows filesystem activity for Safari (-w forces a wide
detailed output and -f filesys shows only file system related output instead of
including network related output too).
sudo fs_usage -w -f filesys Safari
See also:
sc_usage (system call usage statistics)
latency (monitors scheduling
and interrupt latency)
I liked Paul Graham’s tips on writing. It reads like a bullet
list, which makes it a little choppy, but it succeeds in offering many
useful ideas in a form that is compact enough to understand all-at-once.
Here are my favorite points:
write version 1 fast
rewrite many times
if you can’t get started, verbally explain your point to a friend
I decided to give MarsEdit from ranchero software a try and it was very enjoyable. It took all of 5 minutes to get it working great with my Blosxom weblog software. You simply point it towards the folder your weblog files are stored in and it configures the rest very nicely. I like how it lets you compose drafts before publishing them to your blog … just like composing an email before sending it.
The only reason it took 5 minutes instead of 2 is that I wanted the preview mode to use Markdown. As suggested here, the MarsEdit developers already made this very easy to change the default mode to Markdown. Simply setup a default by typing the following into a Terminal window (it should all go on one line).
I’m on a search for ideas on how to give my website and blog a nice
makeover. Open Source Web Design might be nice — there seems
to be no fee associated with thier designs.
Update: here’s a nice implementation of rounded corners without using
images called Nifty Corners. I like it.
I gave a presentation on image quality and some related topics
(global and local image phase, steerable pyramid wavelet transforms,
statistical modeling of natural images, and structural image quality).
Some of the most interesting questions resulting from the talk were:
How should one interpret the diagram from the Phase & Perception of
Blur paper — specifically, what do the converging lines represent? My
current interpretation is that they are equal-phase contours
corresponding to a well-localized feature point at any scale.
What is the gaussian scale mixture (GSM) model? I hope to better
explain and interpret this in an upcoming blog entry.
How do SSIM and CWSSIM compare to the latest perceptual error-based
models of image quality (such as ones derived from the Watson paper)? A
specific test could evaluate structural methods with images that are
only degraded with a just-noticable difference (JND). In other words,
look at errors that are just visible at the threshold of human
perception instead of the gross “suprathreshold” errors that we looked
at before.
This entry documents the most interesting papers I’ve been reading and studying this quarter. I have sorted them into categories and then sorted chronologically to show the influence that early papers has on the newer ones.
Image Phase
1975 Kuglin and Hines, “The phase correlation image alignment method”
1979 Oppenheim, Lim, Kopec, and Pohlig, “Phase in speech and pictures”
1980 Hayes, Lim, and Oppenheim, “Signal reconstruction from phase or magnitude”
1999 Thomson, “Visual coding and the phase structure of natural scenes”
2000 Kovesi, “Phase congruency: A low-level image invariant”
2003 Wang and Simoncelli, “Local Phase Coherence and the Perception of Blur”
Subband Transforms: Steerable Pyramids
1991 Freeman and Adelson, “The design and use of steerable filters”
1991 Simoncelli, “Shiftable Multi-scale Transforms”
1995 Simoncelli, “The steerable pyramid: A flexible architecture for multi-scale derivative computation”
2000 Portilla, “A Parametric Texture Model based on Joint Statistics of Complex Wavelet Coefficients”
Statistical Image Modeling
2002 Srivastava, “On advances in statistical modeling of natural images”
2005 Simoncelli, “Statistical Modeling of Photographic Images”
2005 Wang, “Reduced-Reference Image Quality Assessment Using a Wavelet-Domain Natural Image Statistic Model”
Perceptual Image Quality
1998 Watson, “Toward a perceptual video-quality metric”
1998 Eckert, “Perceptual quality metrics applied to still image compression”
2001 Chen and Pappas, “Perceptual Coders and Perceptual Metrics”
2002 Wang, “Why is Image Quality Assessment So Difficult?”
2004 Pappas, “Perceptual Criteria for Image Quality Evaluation”
2004 Wang, “Image Quality Assessment- From Error Visibility to Structural Similarity”
2005 Wang, “Translation Insensitive Image Similarity in Complex Wavelet Domain”
Thanks to my dedicated reader, Steve, for providing feedback to my recent entries on image quality using structural similarity. He had these ideas:
Start with a low quality image (such as one that is already blurry) and degrade it more. See if results still are good — does SSIM measure this further degradation in a reasonable way?
What happens with an image that is all noise and then gets distorted? There is no structure to start with.
I ran a quick test to check out the first idea. The results follow. Click the thumbnails to view full-sized images. The image on the left is the image that has been blurred once, while the one on the right has been blurred twice.
The additional blurring operation gave a MSE = 9.9 and a MSSIM = 0.975. Qualitatively, this result makes sense — I think we lost much more visual information with the original blur than this one.
In response to the second question (what if the original image is noise only), I found that the results depend on the type of distortion. Distortion by shifting the mean or stretching the contrast gave results similar to those obtained when using natural images (MSSIM = 0.998 or so).
However, it was interesting look at the distortion caused by compressing the noise image using jpeg to achieve a MSE = 60. To achieve a MSE of 60, the jpeg algorithm couldn’t compress the noise image (shown below) very much. I can’t distinguish between the “original” and “degraded” images, therefore, my intuitive understanding is that the compressed noise-only image has a high image quality. The high MSSIM result of 0.952 coincided well with my intuition.
Many papers have suggested that phase information in an image is very important. A report from Alan Oppenheim in 1979 entitled Phase in Speech and Pictures demonstrated that much of the structural information in an image is preserved even when it is represented by phase alone.
He describes an experiment in which an image is decomposed into phase and magnitude parts using a Fourier transform, then the magnitude is set to unity, and an image is reconstructed from the remaining phase information.
The idea is that Fourier phase includes important information about the features and details in an image. The following figures show an original and the phase-only reconstruction of an example image. These were produced by the following MATLAB commands:
% start with an image stored in variable "im"
im_fourier = fft2(im);
im_phase = angle(im_fourier);
im_reconstruct_from_phase = abs(ifft2(exp(i*im_phase)));
im_reconstruct_from_phase
% display original & reconstructed image
% (scaled for visibility)
imshow(im,[])
imshow(im_reconstruct_from_phase.^.4),[])
Many of the high-frequency structures have been preserved in the phase-only image. Indeed, the transformation into a phase-only image can be approximately interpreted as a high pass filtering operation.
It turns out that the intelligibility of the phase-only representation depends on the magnitude “smoothness” of the signal being looked at. Since most natural images contain mostly low frequency content, their magnitude rolls off quickly at high frequency and this leads to the situation where the “high pass” interpretation of the phase-only transform holds.
The main idea in this paper (available here) is that human visual perception is built to understand a scene based on its structure suggesting that this structural information is the key component of visual quality. A good way to measure image quality, then, is to quantify the degradation in the structure within a distorted image versus an original.
This is a change in the fundamental assumption from past image quality work. Previous approaches measure perceptual image quality assuming that image intensity is the key component of visual quality. These methods often measure intensity error and then penalize these errors according to visibility.
To get started, let’s go over some definitions of commonly used “image quality” terms and abbreviations.
image quality: a field of study with goals of quantifying subjective human-perceived visual quality and developing objective measures that accurately predict subjective quality
subjective image quality: human-perceived visual quality, often measured for a group of test subjects and reported as a mean opinion score (MOS)
objective image quality: quantitative measures that can accurately predict subjective image quality
full-reference: the complete undistorted original image is available
no-reference or blind: only the distorted image is available
reduced-reference: partial information (extracted features) about the original image is available
MSE: mean squared error, the average of squared pixel intensity differences
PSNR: peak signal-to-noise ratio
Error-Sensitivity Approach
The assumption here is that the perceived distortion is directly related
to the error signal. These approaches apply a sequence of steps consisting of: preprocessing to scale/align and account for human color perception, CSF (contract sensitivity function) filtering to account for human spacial and temporal frequency response, channel decomposition into temporal and spacial subbands, error normalization according to a perceptual masking model, and error pooling to weight errors and come up with a single quality number.
Some common problems with these approaches have been emphasized in this paper, including:
the quality definition problem: it’s not clear that error visibility corresponds well with image quality
the supra-threshold problem: most perceptual studies have been
evaluated with small errors, where the error is producing a JND (just
noticeable difference) and therefore, the studies don’t account for large
errors very well
the natural image complexity problem: the images used to develop
perceptual threshold are very simple compared to natural images
the cognitive interaction problem: foveation (where a person is likely
to look in an image) and cognation of the image also leads to variable
image quality perception
Structural Similarity Approach
The goal of the new approach is to “find a more direct way to compare the structures of the reference and the distorted signals.” The assumption is humans extract structural information from images — not pixel intensities.
An image quality metric based on structural similarity can overcome many of the problems associated with the error-sensitivity method. The SSIM index is one specific implementation of a structural similarity approach — it is not the only possible architecture that uses the structural similarity paradigm, but it is interesting as a first example of structural similarity’s utility.
SSIM: An Example Structural Approach
Algorithm Description
The figure above shows a proposed image quality measurement system
that compares registered images x and y. The similarity
measure SSIM(x,y) is a function of luminance l(x,y),
contrast c(x,y), and structure s(x,y). Also, it is
necessary to include three constants (C1, C2, and C3) to prevent
unstable results when the denominators approach zero.
The average intensity (ux and uy) is used to define the luminance function
l(x,y) = (2*ux*uy + C1) / (ux^2 + uy^2 + C1).
The standard deviation (sx and sy) is used to define the contrast function
c(x,y) = (2*sx*sy + C2) / (sx^2 + sy^2 + C2).
The correlation (sxy) after removing the mean and normalizing by the standard deviation is used to represent structural similarity:
s(x,y) = (sxy + C3) / (sx*xy + C3).
Finally, the similarity is computed as a combination of the luminance, chrominance, and correlation in a general form
SSIM(x,y) = l(x,y)^a * c(x,y)^b * s(x,y)^g
where a > 0, b > 0, and g > 0 are parameters that determine the relative weighting of each term.
For the specific implementation in this paper, SSIM is simplified by choosing a = b = g = 1 and C3 = C2/2, giving
Local image statistics are measured in a weighted 11x11 circular window around each pixel to generate SSIM for each pixel. A few other numbers are needed to fully define the parameters C1 and C2. The dynamic range of the pixels is defined as L (255 for 8-bit grayscale). Then, C1 and C2 are given as functions of L and some small constants K1 << 1 and K2 << 1.
C1 = (K1*L)^2 C2 = (K2*L)^2
In the paper, the author uses these settings: K1 = 0.01; K2 = 0.03. A single number representing overall image quality is computed by averaging the SSIM values to give a mean:
MSSIM(X,Y) = 1/M * sum( SSIM(:) ).
Test Results
Using the example MATLAB implementation referenced in the paper, I
compared MSSIM with mean-squared error (MSE) for a few images. The
following figure shows the test images I used. Also, there is a
high-resolution version (540kB).
From left-to-right starting across the top row, these images are
1. the original version
2. jpeg-compressed
3. blurred
4. added gaussian white noise
5. mean-shifted
6. contrast-stretched
All of these versions were created to give an equal mean-squared error (MSE) of 60 — this clearly demonstrates that MSE does not correlate with perceived quality. It is clear that the image quality of 2 and 3 is much worse that the others. Let’s see if MSSIM works better.
Structural similarity accurately predicts the high quality of images 5 and 6, the mean and contrast-shifted images.
It is interesting to discuss the results from image 4, the one with gaussian white noise added. MSSIM is the lowest for this image, contradicting my expectation that image 4 has a perceptual image quality somewhere between the worst images (2 and 3) and the best images (5 and 6). I wonder why this result didn’t match my expectations …
Anyway, I hope you enjoyed this summary. Please send me suggestions and/or comments.
GeoURL is an interesting website that implements a location-to-URL
reverse directory that can be used to find URLs by proximity to a given
location.
I used terraserver to find my location — it turns out I’m at
42.05062 degrees latitude and -87.68261 degrees longitude (western
hemisphere longitudes are negative). Interestingly, my building didn’t
exist in 2002 when this sattelite picture was taken — it was just a
parking lot then.
To become a part of the GeoURL database, I added the following <meta>
tags to my website’s <head> section:
For the course project, I’m studying objective image quality metrics, or the computation of a number that corresponds to the perceived quality of an image.
One image quality metric that is often used when comparing a reference and degraded image is the mean squared error (MSE), computed by simply averaging the squared differences between the reference and degraded image. For example, the degraded image could be a highly compressed version of the reference. While MSE is simple to understand and easy to compute, it does not achieve a good correspondance with perceived image quality.
Some interesting image quality methods have been proposed and tested recently. Junquig Chen from the IVPL evaluates metrics used when optimizing image compression, comparing MSE with subband, wavelet, and DCT-based metrics (see the SPIE paper).
It’s that time of year again — time to prepare for the 2005 Cubs season
by desperately trying to get tickets.
They go on sale this Friday, February 25th. The online “waiting room” is
open at 9:30 a.m. and then sales start at 10:00. Also, you can get a
wristband Wednesday or Thursday and if you’re lucky, acquire some
tickets in person at Wrigley Field on Friday. For more information, check
out the Cubs single-game ticket instructions.
In my previous post, I was hoping to speed up the AAC-to-MP3 transcoding
by compiling LAME on my own. This turned out to be very easy and gave
quite an impressive performance improvement.
Here are the steps on the command line for a G4 (from the blacktree
forum). Note that the multi-line commands should be entered on one
line.
$ cd ~
$ mkdir tmp
$ cd tmp
$ curl http://internap.dl.sourceforge.net/sourceforge/lame/lame-3.96.1.tar.gz -o lame-3.96.1.tar.gz
$ tar xvzf lame-3.96.1.tar.gz
$ cd lame-3.96.1
$ ./configure CFLAGS="-O3 -falign-loops-max-skip=15 -falign-jumps-max-skip=15 -falign-loops=16 -falign-jumps=16 -falign-functions=16 -malign-natural -ffast-math -fstrict-aliasing -funroll-loops -floop-transpose -mpowerpc-gpopt -fsched-interblock --param max-gcse-passes=3 -fno-gcse-sm -mcpu=G4 -mtune=G4"
$ make
$ sudo make install
$ cd ~
$ rm -rf tmp
After compiling, I compared the resulting binary program in
/usr/local/bin/lame to the fink-compiled lame and found that the optimized
version was 3.6x faster (7 versus 25 seconds) at compressing an mp3 with
the default options.
This optimization reduced my processor usage while transcoding with TiVo
from 80% to 25%.
After digging around to learn more about TiVo Desktop 1.9 for Mac OS X, I
learned about an interesting hidden feature: you can play back AAC files
on your TiVo by using a transcoding feature.
On the TiVo Community Forum thread about version 1.9, a user
describes that you can use LAME to transcode unprotected AAC
files. This doesn’t get you iTunes Music Store DRM’ed AAC playback, but if
you’ve ripped many other CDs in AAC (like I have), you’ll be quite happy
about this.
The basic idea is:
1. Install the lame command line program in /usr/local/bin/lame
(or do “fink install lame”, then “ln -s /sw/bin/lame /usr/local/bin/lame”)
2. Stop and re-start TiVo Desktop via the Preference Pane
3. Enjoy
On my dual-800 G4 powermac, the fink version of lame used about 75% of one
processor to do the real-time AAC to MP3 conversion.
Alternatively, I’m hoping that compiling lame using an optimization
suggested on this blacktree forum will give me an improvement.
This update contains: a revised preferences mechanism, support for
photo album heirarchies, a new plug-in API, and minor bug fixes.
I installed the TiVo Desktop 1.9 update on my Mac and I was happy to
notice that the background process that runs when TiVo Desktop is on is
much more efficient. With 1.8, cpu usage was 3-7% all of the time, even
when I wasn’t playing music or looking at photos on TiVo. With 1.9, the
cpu usage is 0.0% with occasional spikes to 0.9% — much improved.
Also of interest was some of the information displayed by the installer.
Here’s a snippet:
Changes since version 1.8
* TiVoDesktop can now work with applications other than iPhoto to
share photos.
* Enhances performance and stability.
I wonder what applications other than iPhoto they have in mind?
Unfortunately, this update does not support TiVo To Go or the playback
of AAC files in Music & Photos. For Mac users, waiting is.
A while back, I read In the Beginning … Was the Command Line by Neal
Stephenson and I think it eventually led to overcoming my fear of the
command line and learning to value a text-based interface for some
tasks.
Garret Birkel wrote an interesting update and response to Neil’s
work that I enjoyed reading. This update brings the discussion to 2004
is presented interspersed with the original essay: the format works
well.
I came across an interesting web portfolio created with an
iPod-like interface. It even plays music and switches songs while you’re
viewing it. Check out a screen shot.
Well, they aren’t. Therefore, I link to Steve’s blog entry that
says to go to www.nomorecoasters.com. Read it, then buy good DVD-R
and CD-R discs in the future. Yes yes.
Map24 is similar to mapquest or yahoo maps in purpose, but it
shines in implementation. The interactive map is a Java applet that lets
you smoothly zoom, scroll, and navigate the map. It updates very
smoothly and nicely without reloading the webpage.
Google Labs is always coming up with interesting ideas. They’ve
got another winner with the newest addition: Google Suggest.
It’s a makeover of google.com with a tweak that auto-completes the
search term you are typing. A drop-down list of popular search terms is
generated with each character typed. The amazing part is how
quickly it works.
As documented in this slashdot comment, it is implemented using an
XmlHttpRequest in a Javascript that sends very small amounts of data
back and forth to update the list.
Here is a map showing where our condo is. The red square is our
place. There is public parking for a good price just north of the
dark blue square. Mi casa, su casa.
Benjamin Roe’s “Usable GUI Design: A Quick Guide” nicely
summarizes some of the most useful ideas in user interface design. His 5
major points are:
0) The user is not “using” your application, rather getting their work
done with the help of your application.
1) Fitt’s law: big stuff close to your mouse is easier to click on.
2) Avoid unnecessary interference with your user.
3) Use the power of the computer to be helpful to the user. Don’t
burdon with mundane tasks.
4) Make items easy to distinguish and find.
I also think that saving state is a very great feature that could
improve many applications. Ben mentions this under his point 3, but I
just wanted to emphasize that saving state is very important. Some of my
favorite applications do this well (MATLAB, UltraEdit, Firefox with
SessionSaver) once it is setup, but I think it should be the default!
On a related note to my previous post, The MathWorks, makers of MATLAB,
have just released thier first toolbox focusing on supporting
distributed computing.
The Distributed Computing Toolbox allows one to develop a MATLAB
program or Simulink simulation that can be run on a cluster of
computers. It’s very platform-savvy: it runs on Linux, Mac OS X,
Solaris, or Windows.
As reported on Mac OS X Hints, it is possible to use MATLAB to
Xgrid. It only should work well for those “embarassingly parallel” tasks
that you can manually split into chunks of data to process, but it could
be interesting!
Congratulations to Shayna and Mark! They had a really fun wedding at the
Palmer House in downtown Chicago on November 7th. Now that they are back
from honeymooning in Aruba, thier wedding website has somegreatpictures. Check it out!
Have you ever wondered why humans have such big butts? We may have been born to run (nytimes.com, registration required). Here’s a bit of the explanation:
Earlier human ancestors, like chimpanzees today, had pelvises that could support only a modest gluteus maximus, nothing like the strong buttocks of Homo.
“Have you ever looked at an ape?” Dr. Bramble said. “They have no buns.”
Dr. Lieberman, a paleontologist, explained: “Your gluteus maximus stabilizes your trunk as you lean forward in a run. A run is like a controlled fall, and the buttocks help to control it.”
Northwestern’s Associated Student Government has a great restaurant
guide for the Evanston area. I added a few ratings for my favority
places. Can you tell I’m looking forward to moving back there?
The Massachusetts Institute of Technology offers much of the course
material from more than 500 of thier courses at the MIT
OpenCourseWare website. It’s a great resource when you want to
brush up on a subject or learn something new.
The OQO is a tiny computer that looks pretty cool. It’s only 5in wide by 3.5in tall by 0.9in thick and it includes a 1GHz Transmeta processor, 20 GB hard drive, and 256 MB of RAM. Will this type of thing get cheaper and kill the PDA?
Auto Repair 101 is a good beginner’s guide to car repair. I like
to read up a bit before heading to the shop, so that I at least sound
like I know what I’m talking about.
Roger Johansson has put together a very complete list of web development mistakes that many people make. I sure make a few of them, but hope to fix them soon!
In more family news, my brother Arik Brooks moved his website from Bradley University (where he went to undergrad) to Washington University (grad school).
Paul Graham gives a great answer to the question, “How do you
write a quality essay?”
A sample to wet your appetite:
The most obvious difference between real essays
and the things one has to write in school is that real
essays are not exclusively about English literature.
Certainly schools should teach students how to write.
But due to a series of historical accidents the teaching
of writing has gotten mixed together with the study of
literature. And so all over the country students are
writing not about how a baseball team with a small budget
might compete with the Yankees, or the role of color in
fashion, or what constitutes a good dessert, but about
symbolism in Dickens.
With the result that writing is made to seem boring and
pointless. Who cares about symbolism in Dickens? Dickens
himself would be more interested in an essay about color
or baseball.
I miss the old days of HyperCard stack tinkering, but PythonCard
looks like it could be interesting. Also, if HyperSense ever gets
its OSX version done, it might be good.
Westwind computing describes all of Mac OS X’s hidden files and directories very nicely. This is a good reference when using the command line because it tells where to expect all of the command line applications to be stored.
Kevin Larson at Microsoft describes the history of research into how we
recognize words. We use our gool ol’ built-in neural network, of
course, recognizing words by their letter combinations as our fixation
point hops along, skipping over the small/common/easily recognized
words.
W3Schools provides a very complete CSS Reference that I find
useful. Did you know CSS2 profides Aural style sheets for use by the
blind and others with reading problems?
Version 6 of the Internet Protocol supports up to about 3.4 x 10^38
addresses. This is enough for 4.3 x 10^20 unique addresses per square
inch of the Earth’s surface. Do you think we’ll run out of those?
Steve’s writeup of Gmail is pretty much how I feel about it too.
I’m not too concerned with the “privacy” issues people have raised with
Gmail — I think you should consider all unencrypted email to be pretty
out-in-the-open anyway.
It’s sure fun having Gmail account! If you want to try contacting me,
just email me at the user “alancbrooks”, then an “at” symbol, then
“gmail.com”.
The Pay It Forward concept, popularized by this movie, works
in the context of sharing the Gmail invitations that allow you to
get on of Google free email accounts.
Here’s the thread on MacRumors forums that is working proof of the
pay it forward idea. Also, Gmail swap is another great place for
getting Gmail addresses.
TLAs decrease the SNR of technical communication. (TLA abbreviates
“three letter acronym” and SNR stands for “signal-to-noise ratio”.)
When you examine a technical report or presention about an unfamiliar
subject, often the abundant use of acronyms causes a great deal of
trouble in understanding. To the uninformed reader, the acronyms
increase the “noise” level of the “signal” that the author is trying to
convey.
Only when one is familiar with a particular field’s abbreviation jargon
do they have the ability to fully understand the information. So, TLAs
are kind of “encoded” information. If you don’t know the code, the
information is just noise.
(A fun* analogy is in spread spectrum communication: information is
encoded and transmitted over such a wide spectrum that is looks like
nothing but noise except to the reciever who has to code that pulls the
signal out of the noise.)
*fun for dorky engineers at least
That’s the thought of the day. If you love it, eat a burrito.
My parents, Randy and Shirley Brooks, are transitioning their fun little
haiku company’s website from family-net to
www.brooksbookshaiku.com. Be on the lookout for an awesome
re-design!
The Sixth Annual Davito BocceFest is today! The city
slickers (Me, Dave Stopek, Mark Fullarton, and Mick Montgomery) are
sure to have our first victory ever. Look for pictures to come! For more
on Bocce ball, look at the Wikipedia coverage.
Markdown has now gone to version 1.0, so my previous story is obsolete.
Enjoy. Also, this site is now rendered using Markdown 1.0 — it is nice.
If you’re interested in trying this easy tool that allows one to write
HTML with out thinking HTML, check out the dingus.
John Gruber, the creator of the wonderfully simple writing syntax
Markdown, has written an insightful article explaining his
view that Apple’s current “licensing” situation with the iTunes Music
Store (iTMS) is not similar to thier Macintosh OS platform licensing
decisions two decades ago.
I agree. Licensing is little related to the value of the iPod — ripping
all of your CDs to your computer and using iTunes/iPod to organize and
listen to them is the most compelling use of the iTunes/Pod combination.
iTMS is just icing on the cake.
I heard about these a while ago, but forgot the name. A Captcha is a
test used to tell computers and humans apart. See the Wikipedia
definition and the Carnegie Mellon project.
Steve mentioned my interest in Wikipedia, an online encyclopedia
created by its readers. Some interesting news about it has recently
surfaced. As reported on Slashdot, Wikipedia founder Jimmy
Wales responds to some questions about Wikipedia.
The idea of creating useful free content other than source code is
certainly intriguing.
I’ve posted a slide show with my photos from our vacation to Washington DC and Virginia beach. If you have any pictures to add (Dad?), please send them my way.
Check out Dan’s new astronomical imaging website. I’m hosting it on
my server for a while, so that is fun. He takes many interesting
photographs with his telescope. One of the best is from his recent
trip to the Badlands.
Special restaurant ratings brought to you by Jessica (my 9-year-old sister).
Her main requirements for a good restaurant center around the available food options. If they serve plain pasta with a large helping of parmesan cheese on the side, an A or higher is guaranteed. Her other dining favorites include peanut butter and jelly, crab legs, and ice cream.
How do Washington D.C. residents get to vote? I don’t understand this district thing.
Update: Quickly searching the wikipedia, I found out that Washington DC residents do vote for President but do not have any representation in Congress. For more details, check out the wikipedia entry yourself.
I awoke to my beautiful wife ready to see D.C. We had a lovely bagel at COSI and then we were off on our first mission to the SPY Museum!
At the museum, I realized my true calling. I must leave my job as soon as we get home and begin a new life of secrecy as a man of international mystery.
Today, we took off at 9, grabbed a light breakfast at Cosi, and then headed to the International Spy Museum.
Jessica was very excited about seeing the spy museum and was telling us all types of James Bond facts along the way. We saw all types of recording devices, mini-cams, radio transmitters, and so on.
One of the most memorable artifacts was a fancy round seal that was given as a gift to a US Official from Soviet school children in the 1970s. Many years later, it was revealed that the gift had a listening device cleverly hidden within.
Then we headed on to the Smithsonian History Museum. We saw the insect zoo, gemstones (including the Hope Diamond), and the animal bones.
Then we headed out to the National Gallery of Art, where Amanda really was into the impressionist drawings. One of her favorites was Children Playing on the Beach by Mary Cassatt. I really liked The Bridge at Argenteuil by Claude Monet.
Finally, we ended our walking tour by checking out the newly opened World War II memorial.
Construction
Much of the capital is currently under construction, probably for a combination of security and beautification purposes.
The White House’s surrounding grounds are being updated and you really can’t get to close to it … although this squirrel could:
The Washington Monument’s grounds were all torn up and the public could only get near it via one path. Also, the reflecting pond was empty and full of stinky gunk — yuck.
Boxers and Dinner
I was a little forgetful with a particular undergarment that is nice to change often, so after getting back from our walking tour, Amanda and I headed over to Filene’s Basement to pick up some boxers for me.
Then, on our way back, we noticied the Old Ebbitts restaurant and got our name on the list. It was a great dinner — I loved the Chicken and Crab Saltisoma.
Today, we left for Washington at 4:45 AM — now that’s early! My mom is
a good morning driver, so she took the early shift. We started off on
I-72 and I-74 from Decatur to Champaign and then to Indianapolis. Then,
our route was I-70 all of the way.
It was a 14 hour tour: we arrived at the Sofitel at about 8 PM
eastern time. We were excited because our hotel is about a block from
the White House. We then went on a mission to ease our hunger, settling
on Bobby Van’s Steakhouse after walking around a bit and realizing
that this area’s restaurants are mostly open at lunchtime.
The food was tasty (I had a crabcake) and we were satisfied.
We went to sleep and enjoyed our room (Manda was getting decorating
ideas).
For some fun today, I created a favicon.ico file (the little icon
displayed next to the web address in most browsers). I started with my
background geek image and did all of the image processing on the command
line using imagemagick and png2ico.
The png2ico developer, Matthias Benkmann, has a simple
description of how to setup a favicon.
I used the following command sequence to reduce the background image to
the correct size, convert it into the .ico format, and then put it in
the right spot for my Mac OS X webserver. :
Once again, I commend his use of cascading style sheets (CSS). His blog
style sheet is here. He helped me improve my site a bit with CSS
— note the background image sticks to the middle right part of the
screen and doesn’t scroll with the text.
Hi friends and family! Hope you got the move info. Thanks for
coming to check out my weblog (“blog” for short).
I’m running this off of my own computer from home, so if any of you have
anything you’d like to post (photos, comments, etc..), I’ve got plenty
of web server space, so please feel free to email me about that.
Last week, I spent Tuesday and Wednesday serving my first jury duty. I
served at the Dailey Center for the Circuit Court of Cook County.
They have a one day, one trial system where your service obligation is
fulfilled if you (1) wait in the juror waiting room all day, (2) get
called for jury selection but are dismissed, or (3) get selected and
serve on one trial.
I was selected as the 12th juror, so I served on a civil case Wednesday.
It was interesting, and fortunately easy to come to a consensus when the
jury deliberated.
It was a fun forth weekend — we saw a Cubs/Sox game at
Wrigley, I got a new grill (and made some tasty steaks), and
enjoyed some fireworks off of the balcony.
Since moving to Arlinton Heights, I’ve been trying to get HDTV over the
air. The experiment didn’t succeed — I could only get 3 channels (WGN,
ABC, and PBS). Without FOX and NBC, it wasn’t worth it.
However, when a channel did come in with HD content, it looked
awesome! The nature specials on PBS were very clear and in widescreen
high-definition (you could really see that bobcat fight the snake).
For the record, I used a Motorola HDT-100 high definition
television receever on an open-box deal from Circuit City (for $270). It
worked well, but had to be returned in the end because …
… it turns out I live on the wrong side of the apartment to be able to
receive signals from the Sears Tower and Handcock building in downtown
Chicago. I did have some luck with the Gemini Silver Sensor UHF antenna
— it’s very directional and helped with the multipath problems caused
by the signals going through my apartment building. A good website on
general antenna info (for dummies) is here.
Also, antennaweb.org is a great website. You type in your
address and it can tell you what direction all the TV stations are from
your address and then recommend an antenna type.
This weekend, I had my first chance to see US Cellular Field — it was
the Cubs vs the Sox. Although the Sox won, it was a beautiful
day for a game. After the game, we walked through the Taste of
Chicago for some yummy eats — fried okra and a steak taco were
my favorites.
For those who are interested, Amanda and I are moving to an
apartment in Arlington Heights this Sunday. We got our keys and
checked it out today — it was quite nice! This is our intermediate
place to live while our condo back in Evanston is built.
Our new address:
299 N Dunton Ave Apt 604
Arlington Heights, IL 60004
Congrats to my friend Kris Classen on putting that law degree to use and
getting a new job at the Appelate Court of Illinois in Richmond,
IL. He’ll be working for Jack O’Malley.
I was excited to have my simple hint posted at macosxhints
today. It’s just a convenient way to quit Mail.app remotely so that I
can check email using pine.
To concatenate head.html, tail.html files and auto-open result
Tack on another command (cat) that concatenates the text from the header, stdin, and footer. Then open the result in your default browser. E.g. (should be all on one line):