Archives / Search ›

Upgrade complete

This blog is now running on a modern WordPress. It had been on a hacked-up version of 2.0.11 for way too long.

I also took this opportunity to make many changes I’ve been putting off for months or years. There’s still brokenness in some of the old migrated-from-Radio UserLand posts from 10 years ago, which I am now in a better position to fix are now fixed.

Hopefully, the only things readers will notice is that the blog is faster (I set up caching again), a better fit for smaller-screened devices (CSS media queries make “responsive design” brain-dead simple these days), and search results make more sense. OpenID support is gone, but nobody other than me used it anyway.

Feel free to comment or email me if you notice anything else…

Jawbone ERA vs. BlueAnt Q3: a podcast-oriented comparison

It’s been over two years since I posted here and I just wanted to assure you, dear reader, that I’m still alive. You can see some more frequent signs of life on my Twitter feed. Mostly I complain about computers, though the majority of my life is taken up by medical school these days.

To avoid this being an entirely content free post, I will discuss something I’ve got a lot of experience with but never wrote about: Bluetooth headsets. I listen to podcasts almost exclusively through Bluetooth headsets, and have for about the past three years.  I wear a headset for probably an average of an hour a day, sometimes more like three or four on the weekends when I’m cooking, cleaning and doing laundry. My right ear is stretched compared with my left ear as a result. I almost never talk on the phone with my headsets, so if you’re looking for a comparison of call quality, look somewhere else.

I have, over the years, owned 6 mono headsets and 4 stereo headsets, not counting the Plantronics headset I got for my father. While most are so bad they don’t bear mentioning, my favorites have been the Jawbone ICON and ERA. I bought the ICON in June 2010; it worked perfectly reliably until I accidentally washed it in September 2011. Newly clean, the LED still came on to indicate the battery was charging, but it never showed as fully charged and wouldn’t power on any more—I don’t blame it! I bought an ERA shortly thereafter, which worked fine until about a week ago when the volume started spontaneously dropping. I think this is simply a loose connection to the speaker as I can often restore the volume by changing the headset’s position. The headset took quite a lot of abuse including several drops so, again, I don’t really blame its design or manufacture. Earlier this week, instead of getting another ERA (left), I bought a BlueAnt Q3 (right), which I haven’t decided to send back yet.

Jawbone ERA vs BlueAnt Q3, inside

I thought about making a comparison table, but then I realized how much I hate comparison tables, so here are some bulleted lists instead.

Things I really liked about the Jawbone ICON and ERA:

  • A2DP support. Without this, it’d be pretty useless for listening to podcasts.
  • The power switch is a slider (the extent of my hatred for the Apple aluminum Bluetooth keyboard power button is not printable in this forum).
  • The status LED is on the inside of the headset, and is a ring of moderate brightness rather than a pinpoint of extreme brightness.
  • Jawbone includes a wonderful shape-holding micro USB cable for recharging. For a while, it was infuriating to try to connect the device to the cable by feel given the odd angle at which it sits, but I eventually realized that the curve on the cable more or less matches the curve on the inside of the headset, and all was well.
  • The headset only has one button, whose function is relatively easy to determine: one tap either performs call control functions (if the phone is ringing/off hook) or speaks the approximate remaining talk time. Holding it triggers Siri, if nothing is playing, or cycles the volume if something is.
  • Mac software lets me do things including renaming the headset, upgrading firmware, configuring the button behavior, and installing experimental features like (originally) A2DP support.
  • You can monitor battery life from the iPhone display.
  • The device shows essentially no wear after heavy use for years, aside from the JAWBONE text rubbing off slightly.
  • Charging status is easy to see: red pulsing ring for charging, white for charged.

Things I found useless or annoying on the Jawbone ICON and ERA:

  • There’s no audible feedback for the first few seconds when turning on the headset. Startup is slow — total time from power on to pairing with an iPhone 4S is about 5 seconds.
  • About once a month, the headset would power on, far away from any computer or USB port, and decide that it was waiting for a software update. The headset would feel the need to remind me of this mantra (“Please wait while new software is being installed. Your headset will restart when it’s done.”) every few seconds for a minute. This would play over the top of any audio. There was no way that I could find to abort this process and, you know, use the headset immediately.
  • Volume control requires you to hold down the button while audio is playing (otherwise, it triggers Siri, the way I have it configured), and inevitably causes me to overcorrect and/or trigger Siri.  It’s hard to figure out whether the volume is increasing or decreasing, as it alternates after it “bounces” off the extrema.
  • Related to the above: triggering Siri requires holding down the button, hearing 2 beeps from the headset, then waiting a while before hearing Siri’s acknowledgement.
  • You’re supposed to be able to trigger various actions by tapping or shaking the headset. These never worked reliably for me.
  • I have to carry around two earbuds: one is comfortable to wear for hours when listening to audio, but it puts the headset so far away from my mouth that the phone call quality — or, more relevantly for me, Siri — is essentially unusable. The other earbud I use for phone calls, very infrequently. There’s also an ear hook, but it does not attach securely and has been awkward to the point of uselessness in my experience.
  • Sometimes A2DP would drop until I power cycled the headset, though the phone would think it’s playing. This may very well be Apple’s bug, as iOS Bluetooth has certainly had its share.

The BlueAnt Q3 shares quite a few of the Jawbone headsets’ features (A2DP, iPhone-visible battery life, power slider) and will hopefully be an adequate replacement.

Things I like better about the BlueAnt Q3, thus far:

  • Startup and connection is substantially faster: under three seconds versus 5 for the ERA. Audible feedback on startup is a battery report (unfortunately just as a level like “high”), rather than a chime, and is essentially immediate.
  • A2DP is supported when two devices are connected simultaneously. The Jawbone ERA will connect to two devices at once, but only the first-connected device streams audio to the headset. The Q3 announces “There are two phones connected” when the second device connects.
  • While fewer earbuds are supplied, and none are designed to sit inside your ear canal (unlike on the ERA), the smaller-size, simpler-design earbud fits me pretty well and — crucially — still allows me to use Siri with good accuracy. No more adding surreal shopping list items while I’m cooking! There’s an ear hook that attaches securely and works well unless I’m deliberately shaking my head (in which case the earpiece moves, but doesn’t fall off).
  • Incoming calls play the caller’s name through the headset, rather than just the phone number. I believe synthesized names are synced from your phone via PBAP.
  • Volume control is a 1D slider (self-centering, like a joystick) which works whether or not audio is playing. If no audio is playing, you get feedback via audio clips such as “Volume up” or “Minimum volume”. Beeps indicate the extremes of volume if audio is playing.
  • There’s still only one button, excepting the volume control, and absolutely nothing requires you to hold it down.¹ You either tap once and say one of a small set of voice commands to the headset (report on both headset and iPhone battery life, pairing, redial, etc.), or tap twice to trigger Siri.
  • There are more thorough and well-designed voice prompts; for example, on an incoming call, there’s help on what buttons to push to answer or ignore it, carefully timed so it doesn’t bother you if you know what to do. Audio pairing help is extensive, unobtrusive and well-done.
  • It’s possible to trigger a connection attempt from the headset (tap the button and say “Am I connected?”), a wonderful thing if you’re using iOS with its obnoxious refusal to provide fast access to Bluetooth settings.

Things the BlueAnt Q3 doesn’t have, or which I find worse than on the Jawbone ERA:

  • There’s an annoying click at the end of each voice prompt audio clip, perhaps when the speaker is getting power cycled. This should really be eliminated.
  • One of the voice prompts is just wrong. “Your BlueHead headset is connected.”
  • I get a loud noise in my ear, probably from compression of the earbud, when I try to push the button if I don’t hold the headset still with my hand.
  • The button offers too much resistance to pressure, feels flimsier, and is oriented vertically rather than horizontally.
  • There is no Mac software or ability to rename the headset (“BlueAnt Q3 V1.35”), though a firmware upgrade tool is coming.
  • Obnoxious flashing LED is obnoxious — bright, and on the outside. At least I don’t have to see it.
  • The grille (decorative?) is already getting things stuck to it after an hour — bad design.
  • It comes with an ordinary micro-USB cable, and the headset is difficult to connect to it by feel. It’s possible to use the Jawbone cable, but you don’t end up with a very secure fit.
  • The range and interference robustness are substantially worse — not usually an issue when I have the phone in my pocket. I should quantify this at some point.
I can’t discern any difference audio quality-wise, but keep in mind I listen to spoken word content. The BlueAnt headset does seem to get louder. I really wish iOS permitted control of non-iTunes audio via Siri. Play/pause would be enough! I guess we’ll find out in a few weeks if anything will change in iOS 7.

Some comparative photos I took are here.

For further information, I find iLounge’s reviews to be consistently accurate (Q3 and ERA). There is an iPhone 5-specific issue — related to wideband audio, and looking like Apple’s fault — with the Q3, which is discussed in the review and acknowledged on BlueAnt’s Web site. There’s now a special version of firmware 1.41 to work around the issue. As discussed above, a Mac updater is not yet available (it’s promised for a few months hence) but the Windows updater worked fine in VMware Fusion.

¹Actually, a few features do require holding the button and/or volume slider, but I would never use them daily as I would with Siri on the Jawbone ERA. One swaps the behavior of volume up/down so it makes sense in your left ear, some others handle call waiting/conferencing, and one resets the headset.

Building 32-bit OpenJDK on 64-bit Red Hat Enterprise Linux 5.2

In the next few weeks, I’ll be posting some shorter, more technical entries like this one—more related to Linux/Java/Python stuff rather than the Mac, as I’m spending most of my time in that world. As I’ll soon be embarking on dissertation writing, I can use the practice.

Our research machines were recently updated to 64-bit Red Hat Enterprise Linux 5.2. I used this opportunity to get rid of a bunch of locally built software sitting in my home directory, though I still must install my own Python, Emacs and (32-bit) Java.

On the day of the upgrade, everything moved over smoothly, to my surprise. Several weeks passed. Then a few days ago I promptly crashed the machine with OpenJDK on it by trying to reboot it in uniprocessor mode. Nobody’s around to poke the power button and I’m not back for a few weeks, so I have to rebuild all of OpenJDK, not just HotSpot, on another machine. This, like previous adventures building OpenJDK, has not exactly been fun.

Now, OpenJDK doesn’t really do cross-compilation—at least, it’s not well-tested. The best reference I found online was this message from last December, which provides a bizarrely formatted patch (what kind of pathname style is that?). Some files have moved around since then and some newer pieces of OpenJDK doesn’t seem to reference any of the variables set by it. I therefore used a combination of an updated patch and some brute force workarounds to get OpenJDK built.

The following packages provide libraries OpenJDK links against:


You’ll also need a 32-bit bootstrap JDK; I used Sun Java 6 Update 11 installed with JPackage (which required hacking the spec file because the RPM version on RHEL5 doesn’t support architecture specification…).

Finally, I needed to build a 32-bit FreeType 2.3.x, which was a simple

CC="gcc -m32" ./configure --prefix=../freetype; make install


Since I build OpenJDK somewhat often, I defined a shell alias which sets up all the necessary variables:

  njobs=$(( 3 * $(grep -c processor /proc/cpuinfo) / 2 ))
'ALT_FREETYPE_LIB_PATH='$SCRATCH'/openjdk/freetype/lib '\
'ALT_FREETYPE_HEADERS_PATH='$SCRATCH'/openjdk/freetype/include '\
'make DEV_ONLY=true BUILD_DEPLOY=false '\

Note I’m mostly sanitizing my environment there so it doesn’t try to link against software installed in my home directory. You’ll need to substitute the paths to the FreeType version you built.

OpenJDK then compiles with this patch and ojmake ARCH_DATA_MODEL=32 CC="gcc -m32" CXX="g++ -m32". The latter two variables should not be necessary, but certain bits of OpenJDK (such as the new FreeType-based font renderer) don’t seem to listen to ARCH_DATA_MODEL=32.

If you get a message such as:

ERROR: FreeType version  2.3.0  or higher is required.
 make[2]: Entering directory `.../openjdk/jdk7/jdk/make/tools/freetypecheck'
Required version of freetype: 2.3.0
Detected freetype headers: 2.3.7
Detected freetype library: 2.2.1
Failed: too old library.

despite the fact that you do have these versions installed, you need to make clean (make sure to do so with the right flags otherwise it’ll just clean the 64-bit object dir!). Otherwise, freetype_versioncheck won’t be rebuilt, instead reporting the same wrong answer.

Bonus: the zsh function I used to generate the patch above from a Mercurial forest.

fdiff() {
  local -a trees
  trees=($(hg ftrees))
  local prefix=${trees[0]}
  for i ("" ${trees/$prefix}) ( # substitution collapses empty items
    cd $prefix/$i
    hg di --no-color | perl -pe 's|( [ab])/|$1'$i'/|g if /^(diff|---|\+\+\+)/'

Goodbye, arnold

19:00 = sabi [] quit (Quit: goodbye, arnold old friend.)
overlord% console arnold
Enter njriley@console's password:
[Enter `^Ec?' for help]

arnold console login: nicholas
Last login: Sat May 17 22:24:06 from [...]
{nicholas#console@arnold:1025} ~%sudo /usr/sbin/shutdown -i6 -g0 -y      7:21PM

Shutdown started.    Sun May 18 19:21:17 CDT 2008

Changing to init state 6 - please wait
Broadcast Message from root (console) on arnold Sun May 18 19:21:18...
Log off now or risk your files being damaged

{nicholas#console@arnold:1026} ~%                                        7:21PM
INIT: New run level: 6
The system is coming down.  Please wait.
System services are now being stopped.
Killing: 103
Stopping baculafd.
Stopping openvpn.
May 18 19:21:28 arnold openvpn[302]: event_wait : Interrupted system call (code=4)
Waiting for PIDS: 302.
postfix/postfix-script: stopping the Postfix mail system
No screen session found.
May 18 19:21:31 arnold syslogd: going down on signal 15
The system is down.
syncing file systems... done

Today I shut down for good.1 It’s just a computer, but I’m strangely emotional about it.

I first wrote in March 2003 about buying arnold on eBay. A generous friend has been hosting arnold for free at his residence since then—first about a mile away in Champaign, then moving in July 2003 to Virginia where it’s been ever since. It’s served me well with no hardware failures until some ECC errors prodded me into moving the last service (dynamic DNS) off it yesterday.

As I mentioned back in September, I’ve been working on reducing my administrative load. I’m now nearly finished migrating services, but two aging machines—calamity and shrug—remain to be decommissioned.

I’ve mentioned calamity a few times over the years; it predates arnold by a couple of years, having ably served as my parents’ DNS, email, Web, VPN and monitoring server. There’ve been no hardware failures, though I’ve upgraded the hard drives and SCSI card once and switched the backup medium from xfsdump on an external MO drive to the network via Bacula. I moved the email and Web services off a few months ago; when I swap the Mac mini for my old G4 in a few months, I’ll have a slightly newer machine to host its remaining services. (You can see calamity on the right in this photo from May 2006, to the left of hamton, a hand-me-down PC which died before it could be put to any use.)

shrug (which is not a Tiny Toon Adventures character; blame doomsey) is a P3/700 still running FreeBSD 4.11. It hosts my primary email environment, which has had a long and varied history.

In the 90s, I read mail in a bunch of places—some via Eudora and POP, some via Unix mailreaders including pine, mutt and (ex)mh. My accounts included,,, three Brandeis accounts, online service Internet gateways (CompuServe, AOL, eWorld, BIX and Delphi at various times) and some others I’d rather not mention. Over time, I reduced the number of accounts I checked to three, for personal, school and work use. My “forever” personal email address was, served by a small ISP in Massachusetts. Mail for school lived on until November 1999, then until January 2001. was served starting in mid-1999 by, an old 486DX2/66 in the corner at my then-employer. (My old reliable USR Courier in that picture was a fallback for our flaky RADSL connection.) At the time I didn’t use much for email; my mail, what little of it there was, forwarded to my account. Eventually, Shore.Net got bought and destroyed; I learned the lesson that I should never rely on someone else’s domain name for my email. (Update, July 2009: there’s a happy ending, Shore.Net is back, albeit as a shadow of itself).

Since I was switching labs at the time I didn’t have a server at school to use, but luckily I could borrow Invantage’s new colocated server for a few months. thus became’s MX in January 2001. chronos also hosted my first truly consolidated email setup, with procmail and Mutt folder-hooks configured to deliver mail from three accounts into separate inboxes: (the mailspool, i.e., !), (=INBOX) and (=+/INBOX). I dumped my Shore.Net account in March and switched’s MX to in August 2001, where it remains. pair is still around, still independent, still conservative and reliable; its CEO still posts in the newsgroups. I plan to keep my account there for the foreseeable future.

With’s MX switched, I could finally migrate my email setup from chronos, moving it to and finally to (later in September 2003. On shrug I added an IMAP server and several generations of spam and virus filtering. I’ll be moving off shrug over the next few weeks to a similar setup where I won’t be the machine’s primary administrator. (shrug was originally like that, too, but its owner graduated and left maintenance to me.)

Planning and executing these migrations is tedious and mind-numbing, so I’m glad they’re coming to a close along with graduate school; I’ll have more time in future to focus on things I really care about. Another good thing about getting rid of machines is that I don’t need to come up with a new naming scheme as I thought I would. My laptops since then have all been named Shirley; my Intel iMac is Mary.

1Actually, runlevel 6 reboots; I’ve still got to wipe the disks.

Moved servers

This weblog is now running on a brand new Joyent Shared Accelerator. It brings all kinds of great goodies such as OpenSolaris, ZFS, greater resource limits and newer versions of PHP and MySQL, but hopefully the average reader won’t notice any difference aside from pages rendering a bit faster. Stumbling blocks were MySQL character set conversion (when is UTF-8 not UTF-8?) and a change in PHP object handling breaking the OpenID plugin (patch).

Still remaining in the great server migration: moving, and from their current locations on, and, respectively. It’ll be great when I have consolidated and don’t have to play sysadmin quite so much.

If you’re missing frequent posts and are interested in the minutiae of my life, feel free to watch Twitter and Flickr. As I’m wrapping up writing and getting back to research coding again, you’ll find lots of complaints about broken software in the near future, I’m sure. (Currently I’m fighting with JPackage; why oh why must the CS department have standardized on Red Hat?)

Older Posts ›