Skip to main content

Jesse Vincent

How to reboot an Arduino Leonardo / Micro into the bootloader.

2 min read

One of the things we're building for the Keyboardio Model 01 is an interactive keyboard shell that I've provisionally named "quiche". 

Today, I implemented functionality to allow the user to reboot the ATmega32U4 inside the keyboard into the Caterina bootloader so the user can upload new firmware.

It took a lot more time than it should have to find the right magic incantations to get the bootloader to stay in firmware upload mode. (In the end, it was just a matter of looking at CDC.c inside the Arduino core.)

So that nobody else has to stumble through this as I have, I've pasted my solution below.

// [...]
// Set the magic bits to get a Caterina-based device // to reboot into the bootloader and stay there, rather // than run move onward // // These values are the same as those defined in // Caterina.c uint16_t bootKey = 0x7777; uint16_t *const bootKeyPtr = (uint16_t *)0x0800; // Stash the magic key *bootKeyPtr = bootKey; // Set a watchdog timer wdt_enable(WDTO_120MS); while(1) {} // This infinite loop ensures nothing else // happens before the watchdog reboots us

Solutions that didn't work for for me included:

  • Writing raw assembler like:

asm volatile ("jmp 0x7800"); // This address also happens to be bootloader-size dependent

  • Tweaking MCUSR to try to convince the bootloader that an external reset had been initiated.


Jesse Vincent

In which our hero travels from Tokyo to Boston in a single bound

11 min read


Last week, I was in Taipei for As usual the conference was well put together and had lots of tasty food.  After the conference, Audrey, Luke and I spent a few days working on new features for Checkmarkable, my startup Prime Radiant's product. I also met one of the guys behind Vortex keyboards and scored myself a sexy new KBT Pure 60% keyboard, but more on that another day.

 I spend a lot of time on airplanes. Specifically, I spend a lot of time on Oneworld airplanes.  Typically, I visit Taiwan once or twice a year. Nobody flies directly from Boston to Taipei. The most convenient flights for me to get from Boston to Taipei have historically been Boston-Chicago, Chicago-Tokyo and then Tokyo-Taipei.  I like having a convenient excuse to visit friends in Tokyo.

 As I was booking this year's trip to OSDC, I started fiddling with dates to see if I could shave a few hundred bucks off the somewhat heart-stopping fare that first popped up.  When I added a 3 day layover in Tokyo, the flights that came up were a little different than usual. Tokyo-Boston travel time was shorter by about 4 hours and the flight that popped up was a codeshare on JAL. (That it showed up as a direct flight wasn't the first thing that caught my eye. AA 154 shows up as NRT-BOS, but involves a layover, customs clearance and a plane change at O'Hare.)

 And then I noticed the equipment it said JAL would use for the flight - 787 - Boeing's new Dreamliner. I started poking around flyertalk and yep, JAL was coming to Boston - using the 787 for the first regularly scheduled route between Asia and Boston.  I dithered for a couple days and managed to miss getting a seat on the inaugural flight. As soon as _that_ happened, I clicked the "buy" button so I wouldn't miss my seat on the second 787 flight to Boston.

 Usually, I try really hard to fly on American Airlines "metal" for longhaul international travel -- The frequent flyer perks they give me every year include a few free upgrades for just about any flight, so long as it's on one of American's planes.  12+ hours in coach is typically a pretty brutal affair, but I was willing to make an exception...just this once.

 Because it was booked as a codeshare, I couldn't find any way to select my seat online. It seemed like it wouldn't matter very much even if I could -- JAL hadn't posted the seatmap for the 787 yet. (They wouldn't actually take delivery of the planes until March 27th.)  With a little bit of digging, I found out something interesting about how JAL assigns row numbers. Row 45 is always the exit row.

 So I called American.

"Hi, I'm flying on JAL 8 on April 23. Is there any way you can assign me a seat now?"

'Sometimes they let us. Sometimes they don't. I'd be happy to try for you, Mr Vincent.'

"Great! Is there any chance that there's a window seat in Row 45?"

'How's 45A?'

stunned silence

"...ok. That'd be great!"

This was the second flight of JAL's new 787 service to Boston. It was already mostly full. JAL's frequent flyers can book these seats online. And nobody had picked the exit row window.

Several weeks passed. I flew to Taipei. I spent a couple days in Tokyo. I saw Karen and Marty. I ate a bunch of incredibly tasty food.  I wandered around Akihabara.  

JAL lets you check in online up to 72 hours before your flight. American and JAL use different reservation networks, so my flight had an American PNR (Passenger Name Record - that 6 letter record locator code) and a JAL PNR. My American PNR wasn't letting me check in on I called up American and got my JAL PNR. That didn't work either.

This is when the most impressive and astonishing part of my travel experience happened. Sunday night, I opened up to confirm my flight details for the next morning and noticed the "Check in online" button at the bottom of the screen. This button has almost never worked for me for international flights on American. And this was a codeshare. I knew that pressing this button would show me a nice error message about how my flight wasn't actually eligible to check in online. When I clicked the button, nothing happened. I clicked it again. Nothing happened again. And then I noticed the "Popup blocked" message in the browser's URL bar. I allowed chrome to show me the error popup.

It wasn't an error popup. redirected me to and checked me in online and then emailed me a boarding pass. Airline IT isn't actually supposed to _work_.

Scrutinizing the boarding pass, I noticed my sequence number. (Most airline boarding passes show a number indicating the order in which passengers checked in)

   SEQ: 186

So, I was the 186th person to check in for the flight, a good 14 hours before departure. On most longhaul international flights, that number wouldn't be exceptional. On JAL's 787, it's a little surprising - It is a 186 seat aircraft. I haven't gone digging too deeply - It may just have been a bug or some nuance of JAL sequence I'm not aware of. Or I might indeed have been the last passenger to check in for the flight.

It took me...9 minutes from stepping off the Skyliner at Narita to the JAL Lounge.

I got to the gate about an hour before departure. Sure, I could have hung out in JAL's lounge longer, but DREAMLINER!  The departure area was already half full. And our plane was already at the gate, which wasn't too surprising. JAL 787 #1 wasn't actually back from its maiden flight to Boston yet. This plane was brand new.

It was parked next to a BA 777. Compared to the gorgeous curved wings of the 787, the 777 just looked...clunky and dated.


More people were taking pictures of the departure board than the plane. Go figure.

Boarding started about 10 minutes late. The fabled arched entryway of the 787 was...nice, but nothing to write home about. . o O { Though I suppose I just have }


I walked back through Business and the first bit of economy to seat 45A. Before I got there, I didn't really know what to expect. I could have had a cold, cramped little seat with no window. That sometimes happens in exit rows. But no. The seat was fairly roomy (very roomy for JAL). It reclined. The video monitor and tray were in the armrest.


And if I stretched my legs out as far as I could, I could just barely use the emergency exit door as a footrest.

The 787's windows don't have shades. They have a dimmer that lets you set 5 levels of blue-tinted transparency.  I immediately started playing with the window's controls. The windows don't go all the way opaque, but the darkest setting is enough to keep the interior pretty dark, even in bright sunlight.

Speaking of windows - They promised us a window in the bathroom. That one does have a shade...when it exists. No such luck in JAL Economy.


The interior of the plane definitely felt roomier and airier than a 767, though not much more spacious than a 777. Not bad for a plane with 10 rows of Business and 17-odd rows of Economy.  Boarding was mercifully quick - the plane was full, but there just weren't that many passengers.

Before we took off, a flight attendant brought over the "responsibilities of passengers in the exit row" cards and asked if we'd be willing to follow crew-member instructions in the unlikely event of an Japanese. Apparently, I nodded well enough.

Our taxi out to the runway took 20+ minutes. On the ground, the 787's wings are incredibly bouncy. I know they've passed some impressive wing-break tests, but it was just slightly terrifying.

It was a gray, rainy day - takeoff was a little bit bumpy and the flight didn't really even out for about 45 minutes.

Inside, the 787 is quiet, but not astonishingly so. You can't forget you're on an airplane.

JAL's inflight entertainment system was..decent. It was snappy and actually registered touches when you touched the screen. The interactive maps were pretty and responsive.  The "I'm working" watch cursor made it pretty obvious that (like many IFE systems) it was running X (and presumably Linux.)  Unfortunately, I'd already seen every movie I wanted to of their relatively thin selection.

The IFE had a feature I've never seen anywhere else....ebooks. In this case, branded as "JAL Sky Manga" - They say that they're working on an English version, but for now, it's all in Japanese. They had a few dozen manga to choose from, divided into general interest, Boys' Manga and Girls' Manga. I think the most surreal part of it was the pageturn navigation -- To go to the next page, you click the left arrow on your remote. To go to the previous page, you click the right arrow. It makes perfect sense. Japanese books start from what I, as an American cultural absolutist would call the "back" of the book.

In coach, we were fed 3 times. The first meal was a choice between chicken curry and something described to me as "Japanese Pork" - In general, the flight attendants spoke to me in Japanese. I know enough food words that this wasn't actually a big deal (and I know they spoke to other Western passengers in English. Go figure) Desert after the first meal was a "Boston 1955" Mr Donut ice cream sandwich.  The ice cream was light and airy and a little bit too frozen. 

The second food service was a cup of soup and a Danish.

The third food service was...clam chowder and "AIR MISDO" - I know you're all dying to know if JAL can pull off a competent New England Clam Chowder.  I'm a bad New Englander - I don't really like chowder on the best of days. I chose to skip the airplane chowder.  I'm sorry I've let you down.


AIR MISDO was...reasonably decent. A pair of small, cakey donuts. One with chocolate and sprinkles. One plain.

I spent most of the flight coding. If you know me, that should tell you just about everything you need to know about the flight's comfort. The 787 has in-seat universal sockets at every seat. Mine cut out for 30-90 seconds every 20 minutes or so, but on the whole behaved itself.

One of the cool things about the 787 is that, because it's made of carbon fiber instead of aluminum, they can keep it pressurized to something that approximates sea level much more closely than any plane you've ever flown on. Coming off the plane, @rasmus asked me if I'd noticed the difference. Indeed I had. Usually, I feel fairly...freeze-dried after 13 hours in a small tube in the sky. I felt a lot less shattered than usual after this flight.

As we were disembarking, the staff were handing us each a card:

R6081504.jpg R6081502.jpg

Arriving at Logan, we appeared to be the ONLY plane at the international part of Terminal E. 11:30AM isn't exactly a common time for flights to and from Europe  and nobody else is flying from Boston to Asia. A quick Global Entry scan and I was through passport control and down at the baggage claim. The siren started screeching, the conveyor started rolling bag was the first one to drop onto the belt.

From there, I made my way to Terminal B and had lunch with @schwern and @noirinp, who were on their way to PDX by way of DFW.

After lunch, I collapsed into a cab and made my way home to a pair of very cross cats who quickly forgave me for my long absence and a very, very long afternoon before finally collapsing into bed at a respectable 10pm.

Overall, I was really quite impressed by the 787. It's a nice, comfortable modern aircraft. I'd totally fly to Tokyo in Economy on JAL's 787 service again.

I have a few more pictures up on Flickr.


Jesse Vincent

K-9 Mail 2.400 for Android

4 min read

It gives me great pleasure to announce K-9 Mail 2.400.  This release represents a significant improvement on K-9 Mail 2.000, released in early December.

K-9 Mail is an open-source email client for Android-powered devices. Originally based on the client shipped with Android 1.0, K-9 Mail has seen extensive development by a community of developers around the world over the past 15 months.

Major new features in this release include full-text search of mail, "starring" of messages, the ability to perform actions on multiple messages at once, a much more robust and efficient IMAP push mail implementation, significant performance improvements and a new icon designed by Vincent Lum.

You can download K-9 Mail 2.400 from or from the Android Market.

Other user-visible changes include:

  * Guess mime type (when not specified) of attachments of received messages using file name extension so that we can open them - baolongnt

  * Headers in Accounts, Folder List and Message List now show unread count and background processing activity -- danapple0

  * Added a new "touch friendly" style with message previews - jessev

  * Made it possible to enable or disable "stars" for flagged messages - jessev

  * Added swipe-to-select for operations on multiple messages - jessev

  * There is now an Expunge action in the option menu. - danapple0

  * A new "Batch ops" option menu in Message List.  Provides star/unstar, mark as read/unread and delete and select/deselect all.  Move and copy are partially implemented, but disabled. -danapple0

  * The "Sort by..." menu now toggles ascending/descending when the currently selected sort mode is clicked. -danapple0

  * Eliminate carriage returns from reply and forward text.  (Fixes Issue 518) - danapple0

  * Add a global preference for enabling animations, beyond those that are necessary.  Defaults to "enabled." -danapple0

  * 250, 500 and 1000 messages may now be synced per folder. - jessev

  * Allow user to set a limit on the number of folders to be handled with push technology. - danapple0

  * Initial implementation of CRAM-MD5 support for IMAP and SMTP. (Patch contributed by Russ Weeks ) - jessev

  * For IMAP accounts, it is now possible to disable the copying of deleted messages to the Trash folder, by setting the Trash folder to -NONE-. - danapple0

  * Each IMAP account can be set to expunge messages in a folder as soon as a move or delete is performed on the folder ("immediately"), each time the folder is polled, or only when executed manually. - danapple0

  * For WebDAV accounts, the user can now choose the server-side equivalents of the special folders, just like for IMAP. - danapple0

  * Implemented delete intent broadcast using a modified patch from stephane.lajeunesse - baolongnt

  * Implementation of a Receiver and Service to provide for the capability to accept control from other Android applications.  Allows for changing both Account-level and global settings.  Account-level settings can be applied to a single Account or to all Accounts. - danapple0

  * Overhaul our setup wizard to have a more reasonable bottom bar and to reuse that layout code where possible; standardize the id of the 'next' button - jessev

  * "Starred" messages in MessageList and Message views - jessev

  * Bulk-star, delete and "mark as read" for messages - baolongnt,danapple0,jessev

  * Implement References/In-Reply-To/X-User-Agent headers. Patch from e.w.stemle - jessev

  * You can now "swipe" left or right in the Message view to go to the previous or next message, respectively - jessev

  * First pass at stopping the "Sending messages" notification when there's nothing to send. - jessev

  * fix the header background color to not ignore theme in horizontal mode - jessev

  * Add double-tap at top or bottom of a message to jump to the top or bottom of the message - jessev

  * Improvements to render quality of plaintext messages. - jessev

  * Added a message-flip animation. - jessev

  * New sort-by and reverse-sort icons by Vincent Lum - jessev

  * Deleting messages in messageView now preserves the direction the user was "travelling" in before the delete - jessev

  * Provide additional date format display options in Preferences - danapple0

For a full set of release notes, please visit:

Jesse Vincent

Learn from my misery: Don't buy a nook.

13 min read

The short version

Barnes & Noble have, without a doubt, the worst customer service of any company I have dealt with in the past decade.

They've made repeated promises to me that they've failed to keep and told me that it's my fault. They've put out _press releases_ about how generously they were taking care of the customers whose nooks failed to arrive for Christmas and then turned around and flatly refused to honor that promise.

If you want a hackable linux-based ebook reader with a great user experience and great customer support, buy a Kindle.

Update - January 26: It took the Internet four days to do what B&N never managed - Y'all have bought enough stuff from amazon after clicking that "buy a kindle" link above to net me $100 in referral fees (That's 3 kindles and some assorted other stuff.) Thank you! In turn, I'll be making a $100 donation to the EFF.

Update - Feb 2: Last Monday, around lunchtime, I got voicemail from Melanie at B&N.  We didn't manage to actually connect on the phone until Wednesday. She was friendly and apologetic.  Somewhat differently than all my previous interactions, she told me that the reason I didn't the promised compensation was that she had denied the request. And that she and made a mistake. She said she was sorry. The gift card showed up a few hours later and the shipping charges were refunded on Friday. All told, still not exactly the smoothest shopping experience. But it's over.

The long, ranty version

On November 9th, I ordered a nook from Barnes & Noble. It promised to be the most awesomest ebook-reading experience ever. With Wifi and 3G connectivity, it was clearly going to be better than the Kindle I had to hack to network overseas. With native support for ePub and PDF, I wasn't going to need to go and gain root on the device and then spend weeks creating document conversion software like I did for the Kindle. Best of all, it was going to run Android, so I'd be able to write custom software for it with relative ease.

When I placed my order on November 9th, Barnes & Noble promised me a ship date of December 11th. Oof. I waited patiently...

On December 11th, no nook arrived. Instead, I got email from Barnes & Noble:

From: Barnes & Noble 
Subject: Here Comes Your nook
This is to confirm that your nook is about to ship. Although your
shipment has been slightly delayed, we've upgraded you to overnight
shipping to ensure you'll receive your nook by December 18.

On December 13th, I was warned that accessories might hold up my order and that if I really wanted my nook, I should cancel the light and warranty I'd ordered along with my nook. In reply to my clicks, I got email from Barnes & Noble confirming that I had cancelled the booklight and warranty they sold me and that my nook had already entered the shipping process and was not cancelled.

On December 17th, I spoke to Barnes & Noble customer service. They confirmed that my nook had not shipped yet and that I would not receive it on the 18th. In fact, she told me that it would ship on December 21st and that it hadn't been upgraded to overnight shipping - that it would show up on Christmas Eve. This was somewhat frustrating to me as this was now the _second_ missed ship date for my order. I wrote to customer service that night. Their autoreply told me they'd get back to me within 48 hours. They didn't.

On December 21st, I called up Barnes & Noble to ask when my nook might ship. The first tier customer service rep was....actively hostile until after he put me on hold and read through my order. When he came back on the line, he said "Oh. You're on a third delay. Hold please." I believe that it was at this point that I was first told that if they blew their December 24th delivery date, they were going to give me a $100 gift card.

Later in the day on December 21st, I got this mail from Barnes & Noble:

From: service 
To: jesse 
Subject: Re: Help! multiple nook delays and broken promises
Dear Customer,
We apologize for any confusion. You are set to receive the order on

On December 24th, I got this mail from Barnes & Noble:

Date: Thu, 24 Dec 2009 10:34:23 -0500 (EST)
From: service 
To: jesse 
Subject: Re: Help! multiple nook delays and broken promises
Dear Jesse Vincent,
Thank you for shopping with us.
Despite our efforts, we are unable to ship your order  in the
expected timeframe. We sincerely apologize for the multiple delays with
you item. We see that you have made contact with our customer service
center and you have been provided of the steps we are taking with your
order. We thank you for your patience and appreciate you working with us
in this matter.

The "steps" the customer service rep alluded to were, of course, the promise made by Barnes & Noble the previous day - If I didn't get my nook by Christmas, they were going to give me a $100 gift card.

I replied to this mail within a few hours and heard nothing back by email for a week.

On December 28th, while waiting for a flight from Boston to San Francisco, I called Barnes & Noble's customer service line again to ask when I might, you know, see my nook and the $100 they'd promised me. I was immediately transferred to a supervisor. The supervisor was friendly and apologetic. (Everyone I've spoken to at Barnes & Noble has been personally friendly and apologetic. Their call-center staff have _excellent_ empathy training.) The supervisor put me on hold and read over my order. When he came back on the line, he apologized again and confirmed that yes, something was wrong and that yes, Barnes & Noble owed me $100. He told me that I would receive email with a $100 Barnes & Noble gift card within 24 hours and that he was personally starting an inquiry into what the heck happened to my nook. He promised I'd get email back from him within a day. At that point, I was pretty happy that someone was finally being responsive and that this was basically all sorted out.

About 6 hours later, I got off the plane at SFO and checked my email. I had mail from Barnes & Noble! It was not the mail I expected:

Dear jesse vincent ,
As you requested, your order  been canceled.

At this point, Barnes & Noble customer service was closed for the night. Some friends joked that perhaps Barnes & Noble felt so bad about how badly they'd jerked me around that they'd cancelled the order because they were sending me a free nook. That would have been nice. Sadly, it was not what had happened.

I called the next day (December 29) and related the newly updated tale of woe. I was put on hold and transferred to a supervisor. The supervisor was friendly and apologetic. She told me that the only thing she could do was to start an inquiry into my order with operations and that it would take up to three business days. Someone would get back to me before those three days were out and tell me what happened.

Three business days came and went. No call from Barnes & Noble.

Meanwhile, on January 1st, I got email back from Barnes & Noble in reply to the email I sent them on December 24th. It read:

Dear Customer,
Thank you for your e-mail.
We recently received an email from you. However, the email did not
include a text message. Kindly re-send your inquiry with a text message
so that we may respond to your request.

...followed by the full text of the message I'd sent them.

A day later, on January 2nd, they sent me another reply to the same message:

Dear Customer,
Thank you for inquiring about your order with We've
changed our order inquiry policy to futher strengthen the privacy and
security needs of our customers.
To respond to your request, we must ask you to provide your order
number, which you can find in the subject line of your order
confirmation email or shipping confirmation email.

...followed by the full text of the mail I'd sent them, including the exchange I'd had with Barnes & Noble customer service staff dating back to December 21st. This included the ticket number we'd been corresponding on throughout this time, as well as my name, address, phone number, email address and, of course, the order number.

On January 3rd, I called up Barnes & Noble customer service again. Once I provided my order number and an abbreviated sob story, I was transferred to Regillio, a supervisor. He was polite and apologetic. He put me on hold and read through the notes on my order. When he got back on the phone, he told me that he was going to have to research this issue and get back to me.

On January 4th, he called me back. The man deserves a medal. He told me that yes, something had cancelled my order, but that it was clearly in error. Unfortunately, there was no way to resurrect the order. He could, however, enter a new order and bump it to the front of the queue. Regillio did assure me that he was waiving the shipping charges on this new order and that I should ignore any shipping charges on the invoice. With shipping and tax, the order totalled out at $278.19.

On January 5th, my nook shipped...via some sort of process that involved an off-brand delivery service from New Jersey shipping my nook to a USPS depot in Massachusetts and then having the postal service deliver my nook. It took 3 or 4 days to arrive. No, they didn't honor their previous promise to upgrade my order to overnight shipping. It was only a few more days of delay, but it was another broken promise.

As of January 22nd, my credit card statement shows that Barnes & Noble charged me $278.19. No, Barnes & Noble did't refund the shipping charges like they'd promised. It's not a lot of money in the grand scheme of things, but it was yet another broken promise.

On January 7th, Angie from Barnes & Noble emailed me to say they needed another 24-48 hours before they could tell me what happened to my gift card.

On January 15th, I called up Barnes & Noble's customer service line to see if they'd managed to figure out why they hadn't yet sent me the gift card they'd promised or called me back to explain what had gone wrong. I read my order number to the first-tier customer service rep. She told me that she was transferring me to a supervisor. The supervisor, Wendy, was polite and apologetic. She told me that my order's notes showed that Barnes & Noble corporate had rescinded their promise to send me a $100 gift card because I'd cancelled my order. She then commented that this must clearly be in error because the notes also indicated that for weeks after I'd purportedly cancelled my order I'd been told, every several days, that my nook would ship in several days. She told me that she would petition management to un-rescind their promise to me. She promised to get back to me by the end of the day or the following Monday.

Nobody called me on Monday, January 18th.

On January 20th, I called Barnes & Noble to ask what had ever happened to that $100 they promised me. The first-tier customer service rep spent a few minutes reading the notes on my order before telling me that "oh, yeah. I see here we said we'd get back to you by Monday. And I don't see any notation that we ever got back to you." I waited on hold for a supervisor for 15 or so minutes. The supervisor was friendly and apologetic. She told me that they would investigate what happened and get back to me in 3 business days. I explained to her (politely, I promise!) why that wasn't going to be ok. She transferred me to her supervisor, Tiffany. Tiffany was even more friendly and even more apologetic. Tiffany promised to call me back on Friday to tell me what had really happened and how Barnes & Noble was going to fix it.

Today is January 22nd. Tiffany called me back about an hour ago and told me that Melanie, a Vice President of Customer Care had instructed her to tell me that, despite repeated assurances to the contrary, Barnes & Noble wasn't going to be able to honor their promise to me because their computers showed that my order had been cancelled.

Where do I go from here?

At this point, I have little hope of ever seeing any sort of compensation from Barnes & Noble. They've strung me out past the limit of their 14-day return policy, so I couldn't even return the device.

I don't really know what's next for me and the nook. I can tell you that Barnes & Noble are never getting another dime of my money. I hope you think twice before giving them any of yours.

Somewhat coincidentally, Amazon announced the Official Kindle SDK this week. If you want a hackable linux-based ebook reader with a great user experience and great customer support, buy a Kindle. (Yes, I make money if you click that link. Actually, if just four people buy Kindles because of this post, I end up with the $100 Barnes & Noble stiffed me.)

Update - January 26: It took the Internet four days to do what B&N never managed - Y'all have bought enough stuff from amazon after clicking that "buy a kindle" link above to net me $100 in referral fees. (That's 3 kindles and some assorted other stuff.) Thank you! In turn, I'll be making a $100 donation to the EFF.

Update - Feb 2: Last Monday, around lunchtime, I got voicemail from Melanie at B&N.  We didn't manage to actually connect on the phone until Wednesday. She was friendly and apologetic.  Somewhat differently than all my previous interactions, she told me that the reason I didn't the promised compensation was that she had denied the request. And that she and made a mistake. She said she was sorry. The gift card showed up a few hours later and the shipping charges were refunded on Friday. All told, still not exactly the smoothest shopping experience. But it's over.

Jesse Vincent

Oops! I did it again - Perl 5.11.1

4 min read

Milo had been caught red-handed in the act of plundering his countrymen, and, as a result, his stock had never been higher. He proved good as his word when a rawboned major from Minnesota curled his lip in rebellious disavowal and demanded his share of the syndicate Milo kept saying everybody owned. Milo met the challenge by writing the words "A Share" on the nearest scrap of paper and handing it away with a virtuous disdain that won the envy and admiration of almost everyone who knew him. His glory was at a peak, and Colonel Cathcart, who knew and admired his war record, was astonished by the deferential humility with which Milo presented himself at Group Headquarters and made his fantastic appeal for more hazardous assignment.

- Joseph Heller, Catch-22 


It gives me great pleasure to announce the release of Perl 5.11.1.

This is the second DEVELOPMENT release in the 5.11.x series leading to a stable release of Perl 5.12.0. You can find a list of high-profile changes in this release in the file "perl5111delta.pod" inside the distribution.

You can (or will shortly be able to) download the 5.11.1 release from:

The release's SHA1 signatures are:

4eb796d28849ea21466166cea0b580d98163564f  perl-5.11.1.tar.bz2

aa4ca3b0cffa1bbcbcdb09e81c6ece759112ce14  perl-5.11.1.tar.gz

We welcome your feedback on this release. If you discover issues with Perl 5.11.1, please use the 'perlbug' tool included in this distribution to report them. If Perl 5.11.1 works well for you, please use the 'perlthanks' tool included with this distribution to tell the all-volunteer development team how much you appreciate their work.

If you write software in Perl, it is particularly important that you test your software against development releases. While we strive to maintain source compatibility with prior stable versions of Perl wherever possible, it is always possible that a well-intentioned change can have unexpected consequences. If you spot a change in a development version which breaks your code, it's much more likely that we will be able to fix it before the next stable release. If you only test your code against stable releases of Perl, it may not be possible to undo a backwards-incompatible change which breaks your code.

In the release announcement for 5.11.0, I asked readers to test the new version of Perl with their in-house applications and CPAN modules.  Among other things, that testing turned up previously undiscovered issues in a change to Perl's Regular Expression semantics which we were able to defang in time for 5.11.1.

\Notable changes in this release:

  • Package declarations can now include a version number. 
  • suidperl is no longer available as part of perl. If your code depends on suidperl, you need to find an alternate solution. (This was actually true as of 5.11.0)
  • Over the years a number of language constructs and interpreter features have been deprecated and will eventually be removed. As of this release, Perl enables deprecation warnings by default.
  • Perl's tests are now aware of (and work around) a bug in Mac OS X 10.6 locales.
  • Support for Windows 95, 98, ME and NT4 has officially ended. 

This release represents approximately 3 weeks development since Perl 5.11.0, containing 22,000 lines of changes across 396 files from 26 authors and committers:

Abigail, Alex Vandiver, brian d foy, Chris Williams, Craig A. Berry, David Fifield, David Golden, demerphq, Eric Brine, Geoffrey T. Dairiki, George Greer, H.Merijn Brand, Jan Dubois, Jerry D. Hedden, Jesse Vincent, Josh ben Jore, Max Maischein, Nicholas Clark, Rafael Garcia-Suarez, Simon Schubert, Sisyphus, Smylers, Steve Hay, Steve Peters, Vincent Pit and Yves Orton.

Many of the changes included in this version originated in the CPAN modules included in Perl's core. We're grateful to the entire CPAN community for helping Perl to flourish.

Yves Orton will release Perl 5.11.2 on November 20, 2009.

Leon Brocard will release Perl 5.11.3 on December 20, 2009.

Ricardo Signes will release Perl 5.11.4 on January 20, 2010.

Jesse Vincent


16 min read

UPDATED 5 April 2009 - 11:16 EDT: Pointers changed to Savory installer and uninstaller 0.06 which provide minor run-time reliability and book-detection fixes. If you are running 0.05, you should uninstall the old version and install 0.06.

UPDATED 6 April 2009 - 9:41 EDT: I put together beta-quality support for picture-perfect PDF production. You can try it out if you promise to report back

UPDATED 6 April 2009 - 22:44 EDT:Screenshots of savory's improved PDF converter.

Over the past few weeks, I've spent much of my spare time with my new Kindle2...When I bought it, I was excited to have a gorgeous, solidly built ebook reader backed by Amazon's catalog. I figured I'd end up reading a bit more than I already did and spending a bit more money on books than I already did. Both turned out to be true. What I didn't count on was finding a new hobby.

Hi, I'm Jesse and I have a software problem.

When I get a new bit of hardware, I often end up writing software for it. In 2001, when I got one of Canon's first Digital SLRs, I found myself writing code to extract usable images from the "RAW" image files the camera produced. This fall, I picked up a new T-Mobile G1 to replace an iPhone...and found the email client lacking. The Android platform that the G1 runs on is free and open. So I dusted off some long-unused Java experience and created K9, an enhanced version of Android's email client.

I really didn't think this would happen with the Kindle. I was wrong.

What is Savory?

Savory is a native ebook conversion package for the Kindle 2. It lets you download and read PDFs and ePubs on the Kindle without a manual conversion step.

So, you hacked the Kindle?

No. There have actually been a number of other user-generated Kindle updates. igorsk created the toolset which generates Kindle and Kindle2 updates. Other members of the Kindle community have created Kindle2 updates which change the Kindle's fonts to support books in non-western language, let you set your own screensavers and a bunch more. These packages already contain everything a technically savvy user would need to install software on the Kindle. What I did was to port an ebook-conversion package to run reasonably efficiently on a 500mhz ARM with 128 megabytes of system memory and to write a small program which watches for new ebooks in a few chosen formats and run those through the conversion tool.

Does Savory let me decrypt books Amazon has protected with DRM?


So this is like KindlePid?

Nope. Not at all. KindlePid is a tool for reverse-engineering your Kindle's "Mobipocket Pid." KindlePid lets you buy DRM-protected ebooks from providers other than Amazon. Savory converts PDFs and ePubs that you download to your Kindle over WhisperNet or 3G into unprotected .mobi documents. There are web-based and desktop tools which can do everything Savory can do. Savory just brings these features directly to your Kindle 2.

Does Savory let me read DRMed ebooks?

No. Savory does not include support for ebooks protected by DRM. DRM is an incredibly "hot" topic in the ebook world right now. There are varying opinions on its efficacy. My opinions on the matter aren't relevant, except to say that I am not touching the topic with a 10 foot pole. It will not convert DRM-protected ebooks into a format the Kindle will read. It will not add or remove DRM from any ebook.

Does Savory let me do anything Amazon didn't already let me do for free?

No. It just makes some things that are a little cumbersome out of the box simple and transparent. It's already possible to use desktop and web based services to transcode ePub and PDF documents into the Kindle-compatible Mobipocket format. Amazon also provides both free and for-pay email-based conversion services you can use.

Does Savory work with the Kindle 1?


Why did you create Savory?

I'm in love with my Kindle. I've been reading ebooks on screens of various sorts for many years, but the Kindle2 is the first device that I actually enjoy reading as much as I enjoy reading paper books. I've tried other ebook readers, but for a variety of reasons, they just don't work for me. My goal is to make it easier for readers to read more free content on the Kindle.

I got the idea after reading Tim O'Reilly's editorial in Forbes about why the Kindle platform will be more successful if it's more open. My first experiments were actually in server-based transcoders to convert PDFs and epubs to Kindle-compatible Mobipocket books, but I quickly realized that running the converter locally on the Kindle would result in a much better user experience and make the Kindle more useful. And yeah, it seemed like an interesting project.

What document formats does Savory let me read?

Savory allows you to read .epub and .pdf files on your Kindle. It does this by converting these documents to Mobipocket format ebooks using Calibre. You should note that the version of Calibre Savory uses only works with text-based PDFs. If you have image-based or scanned PDFs, conversion will fail. (Images in your PDFS are ok. There just needs to be some text to extract.) Updated: Screenshots of the new and improved PDF converter.

How does Savory work?

Plain-english version

Savory installs a small program which runs on your Kindle and watches for new files in the 'Documents' directory with names ending in '.epub' and '.pdf'. When the system notifies Savory that a document has shown up, it wakes up and runs an open-source file conversion program called Calibre. Savory also updates your Kindle2's browser configuration file to tell it that the Kindle can now handle .pdf and .epub documents.

Technical version

Savory changes the browser configuration file to allow download of pdf and epub documents. It adds a new "init" script which tries to mount savory-image.ext3 on boot. If that succeeds, it runs bin/savory_daemon from within the image mentioned above. savory_daemon is a Python script that watches the documents/ directory and invokes a converter based on Calibre when it sees something that looks right.

Is Savory supported by Amazon?

No. If you have a problem with Savory, DO NOT CONTACT AMAZON. This isn't software they wrote. They're not responsible for it. Please don't bother them about it.

If the nice folks at Amazon contact me (you can find my email address at the bottom of this FAQ) and ask me to stop distributing Savory, I will do so. My goal isn't to "hack" the Kindle, deprive Amazon of revenue or place an increased support burden on Amazon's Kindle team. I just want to make the Kindle2 an even more useful reader than it already is.

Does Savory void my warranty?

I don't know. If you're not comfortable with the possibility, do not install Savory.

Does Savory come with any guarantee or warranty?

I guarantee that Savory will not give you the ability to fly or to see through walls. Past that, no. Savory comes with no warranty or guarantee OF ANY KIND. If it causes your Kindle to burst into flames or gives your pets the ability to read, you are ENTIRELY ON YOUR OWN. By downloading and installing Savory, you accept full responsibility for anything it does.

Savory is distributed under the MIT license:

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.


What do I do if Savory breaks my Kindle?

Head on over to the MobileRead Kindle forums and post your sob story. Hopefully, someone there can help figure out what went wrong and help you get back to a working state. Remember that Savory comes with absolutely no warranty and everybody on MobileRead who might help you out is a volunteer.

How do I install Savory?

Installing Savory or any other third-party update on your Kindle may destroy your Kindle. If that happens, you will have a $360 paper weight. DO NOT INSTALL SAVORY UNLESS YOU'RE WILLING TO END UP WITH A DEAD KINDLE.

You'll need to download three files:

This file contains Savory's file-conversion system and assorted tools.

Download and unzip this file. Then, mount your Kindle2 on your desktop with USB and drag savory-image.ext3 into the "system" folder on your Kindle2.


This file is a Kindle update which will remove an installed copy of Savory from your Kindle. Please keep a copy of this file handy in case you ever need it.


This file is a Kindle update.

You should copy this file to the root directory of your Kindle. After you do that, unmount the kindle and click the "Menu" button, select "Settings", click the "Menu" button and click "Update Your Kindle" This will apply the update.

If "Update Your Kindle" is greyed out, mount the Kindle on your desktop again and DELETE the update file. Then, unmount the Kindle. If you're not already on the Settings page, click "Menu" and select "Settings". Make sure your Kindle is plugged into your computer with the USB cable. Click "Menu" and select "Restart". The Kindle will boot up and immediately enter USB mode. Copy the update file to the Kindle again and follow the instructions above.

I've found that the Kindle is much happier recognizing update files if you reboot the Kindle while it's connected to your computer with USB and copy the update to the Kindle before the Kindle's UI comes up at all

If you copy the file to your kindle and reboot without applying the update, it will end up in a reboot loop - I haven't figured out why yet. If that happens, hold down the "Home" button while booting to get into recovery mode. From there, you can mount the Kindle on your desktop with USB, delete the .bin file and try again.

How do I turn Savory off temporarily?

Mount your Kindle on your computer with USB. Rename the savory-image.ext3 file in the Kindle's "System" folder. Then, unmount your Kindle, click "Menu", select "Settings", click "Menu" and click "Restart your Kindle." When you later want to re-enable Savory, repeat the process, naming the file back to "savory-image.ext3"

How do I remove Savory completely?

If you've decided that Savory isn't for you or you need to remove Savory to perform an Amazon-provided system update, it's a two step process. First, you'll need to follow the instructions above about how to temporarily turn off Savory. Then, download and run the "update_RemoveSavory-0.06.bin" system update and apply it just like you applied the original system update.

Amazon's system updates very carefully check each and every file they're about to update to make sure that they are exactly as Amazon left them. This ensures that a system update doesn't unexpectedly corrupt an "important" file. Savory updates the Kindle's browser configuration to allow download of pdf and epub files, adds an "init script" to start up the savory daemon which watches for new files to convert and modifies the Kindle's "version.txt" file. This way, anyone doing support for your Kindle will know it's not running a stock system image and NOT ELIGIBLE FOR SUPPORT FROM AMAZON.

Savory copies each file it modifies before making changes. All files Savory modifies are saved with the file suffix "-beforesavory". When you uninstall Savory, it restores the pristine versions of these files.

What does Savory do to my battery life?

It makes it shorter. So far, it doesn't feel like it makes it much shorter. Comparisons and benchmarks would be appreciated

What does Savory do with the "originals" of ebooks it converts?

You'll find the originals of any book Savory converts (or fails to convert) in the savory-archive folder on your Kindle when you browse it from your computer.

Where can I get the source code to Savory?

Savory is hosted on Google Code:

What software does Savory use?

Savory wouldn't have been possible without kindle-update-maker, created by Igor Skochinsky.

Savory is about 200 lines of Bourne Shell and Python, built to drive a modified copy of Kovid Goyal's open-source Calibre ebook conversion and management suite.

The disk image containing the Savory daemon and the modified version of Calibre contains a number of dependencies, listed below. You can download all of these source tarballs from

The patches to Calibre are available in the same source repository as the rest of Savory. All other packages are unmodified. Revision 2689 Revision: 370;a=snapshot;h=HEAD;sf=tgz as of 2009-03-30 - pyinotify-0.8.1-py2.6.egg-info

How much code is Savory?

The unique parts of Savory are about 85 lines of shell script and 135 lines of Python.

Why's the Savory disk image nearly 90 megabytes uncompressed?

Savory uses Calibre, a free and open ebook conversion suite. In turn, Calibre uses Python, Qt and some other libraries. While I've slimmed down the requirements by hand, we have a long way to go before Savory fits in 5 or 10 megabytes.

What license is Savory under?

The original code in Savory is available under the terms of the MIT License. The various components bundled with Savory are all free or open software, but they're not all released under the same license.

I want to be able to use my Kindle to read books in some other format. How do I make that happen?

Savory supports a subset of the conversions provided by Calibre. If you contribute to Calibre, Savory should be able to take advantage of those improvements.

Can I run other software on my Kindle?

I don't know. Can you?

Can you help me run other software on my Kindle?


The Kindle has a 3G modem in it. Can I use that to get free internet access for my laptop?

Don't even think about it. The Kindle's 3G internet access is currently provided gratis to all Kindle users for the purpose of browsing the web and downloading ebooks. Amazon could choose to start charging for this "experimental" feature at any time. On top of that, Amazon knows where you live, has your credit card number and, thanks to the Kindle's GPS, knows where you are right now.

Where can I get support for Savory?

The MobileRead forums are probably the right place to start.

So, why is it called Savory?

When I first got a my Kindle2, I experimented with a web-based transcoding proxy which lets you download ePub and PDF files to the Kindle using a tool running on a server. I called the project an "unsavory ePub hack." This new tool is a good deal more elegant and easier to use. It's no longer unsavory. That must mean it's Savory

Savory is awesome! Now I want a Kindle!

Great! That's the kind of thing I like to hear. Savory is (and will always be) 100% free. BUT! Shameless plug warning If you buy a kindle (or anything else) from Amazon, I'll earn a referral fee which goes to feed my ebook habit. Buying a Kindle 2 from Amazon through this site helps us tell Amazon that we want the Kindle to support open formats. If more than a few of you buy a Kindle through this blog, I'll post a running tally.

Who created Savory?

I'm Jesse Vincent. You can reach me at jesse - at - Please don't contact me directly for help with Savory, even if it sets your dog on fire or you're sure that I'll make an exception for you.

If you need help with Savory, I refer you to the forums at (See above)

Jesse Vincent

Yes, I am teasing you. But why am I building Qt on my Kindle?

5 min read

root 1 0.0 0.2 1484 300 ? Ss Mar22 0:03 init [5]
root 2 0.0 0.0 0 0 ? Sroot 3 0.0 0.0 0 0 ? SN Mar22 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? Sroot 5 0.0 0.0 0 0 ? Sroot 6 0.0 0.0 0 0 ? Sroot 37 0.0 0.0 0 0 ? Sroot 38 0.0 0.0 0 0 ? Sroot 40 0.0 0.0 0 0 ? Sroot 58 0.0 0.0 0 0 ? Sroot 76 0.0 0.0 0 0 ? S Mar22 0:12 [pdflush]
root 77 0.0 0.0 0 0 ? S Mar22 0:05 [pdflush]
root 78 0.0 0.0 0 0 ? Sroot 79 0.0 0.0 0 0 ? Sroot 101 0.0 0.0 0 0 ? Sroot 136 0.0 0.0 0 0 ? Sroot 146 0.1 0.0 0 0 ? Sroot 156 0.0 0.0 0 0 ? Sroot 190 0.0 0.1 1520 208 ? Sroot 384 0.0 0.0 0 0 ? Sroot 386 0.0 0.0 0 0 ? Sroot 390 0.0 0.0 0 0 ? Sroot 394 0.0 0.0 0 0 ? Sroot 583 0.0 0.0 0 0 ? Sroot 696 0.0 0.4 1948 616 ? Ss Mar22 1:02 /usr/sbin/syslog-ng
root 1023 0.1 0.0 0 0 ? Sroot 1043 2.7 4.5 205616 5832 ? Ssl Mar22 52:00 fsp /mnt/base-us /mnt/us -o rw
92 1332 0.0 0.3 2236 504 ? Ss Mar22 0:04 /usr/bin/dbus-daemon --system
root 1367 7.9 0.4 19080 520 ? Ssl Mar22 147:54 /usr/bin/powerd
root 1466 0.0 0.0 1468 120 ? Ss Mar22 0:00 /usr/sbin/tphserver
root 1526 0.0 0.1 19012 244 ? Ssl Mar22 0:00 /usr/sbin/volumd -d /dev/mmcblk0p4
root 1605 0.0 0.1 2652 140 ? Ss Mar22 0:00 /bin/sh /usr/bin/
root 1644 0.0 0.3 2648 396 ? Ss Mar22 0:00 /usr/sbin/crond -c /etc/crontab/
root 1757 0.0 0.1 2648 188 ? S Mar22 0:00 /bin/sh /opt/amazon/ebook/bin/
root 1793 0.0 0.1 2652 188 ? S Mar22 0:00 /bin/sh /opt/amazon/ebook/bin/
root 1795 0.0 0.1 2652 152 ? S Mar22 0:00 logger -p local2.debug
root 1821 2.8 22.2 390176 28280 ? SLl Mar22 52:31 /usr/java/bin/cvm -Xmx16m -Xbootclasspath/a:/usr/java/lib/localedata.jar:/usr/java/lib/charsets.jar -Dsun.boot.library.path=/usr/java/lib:/usr/java/lib -cp :/opt/amazon/ebook/lib/MobiCore-impl.jar:/opt/amazon/ebook/lib/MobipocketCoreReader.jar:/opt/amazon/ebook/lib/ReaderSDK.jar:/opt/amazon/ebook/lib/SearchSDK.jar:/opt/amazon/ebook/lib/booklet.jar:/opt/amazon/ebook/lib/cd.jar:/opt/amazon/ebook/lib/framework-api.jar:/opt/amazon/ebook/lib/framework-impl.jar:/opt/amazon/ebook/lib/jdbm.jar:/opt/amazon/ebook/lib/json.jar:/opt/amazon/ebook/lib/kxml2.jar:/opt/amazon/ebook/lib/xyml.jar:/opt/amazon/ebook/booklet/AudiblePlayer.jar:/opt/amazon/ebook/booklet/AudioPlayer.jar:/opt/amazon/ebook/booklet/Browser.jar:/opt/amazon/ebook/booklet/Demo.jar:/opt/amazon/ebook/booklet/Experimental.jar:/opt/amazon/ebook/booklet/Home.jar:/opt/amazon/ebook/booklet/MobiReader.jar:/opt/amazon/ebook/booklet/PictureViewer.jar:/opt/amazon/ebook/booklet/Search.jar:/opt/amazon/ebook/booklet/TestSwitches.jar:/opt/amazon/ebook/booklet/XymlBooklet.jar:/opt/amazon/ebook/booklet/msp.jar:/usr/java/lib/libjnisystem.jar -Ddebug=1 -Dcheck_comm_stack=true -Dhttp.keepalive.timeout=60000 -Dhttp.maxConnections=16 -Dallow_demo=false -Dawt_fb_enable=0 -Dextkeyboard=false -Dconfig=/opt/amazon/ebook/config/framework.mario.conf -DPLATFORM_CLASS_FILE=/opt/amazon/ebook/config/platform.conf -DENABLE_SEARCH_INDEXING_THREAD=true
root 1892 0.0 0.1 2100 188 ? Ss Mar22 0:19 /usr/local/bin/telnetd -p 2323 -l /bin/sh
root 1929 0.0 0.1 1056 176 ? Ss Mar22 0:00 /opt/local/unsavory/sbin/dropbear -d /opt/local/unsavory/etc/dropbear_dss_host_key -p 22
root 1959 0.0 0.1 2652 148 ttymxc/0 Ss+ Mar22 0:00 /sbin/getty -L 115200 ttymxc0 -l /bin/login
root 2365 0.1 0.0 0 0 ? Sroot 5155 0.0 0.4 2652 584 pts/5 Ss 00:54 0:00 /bin/sh
root 6826 0.2 0.6 2824 880 pts/5 S+ 02:40 0:05 /bin/sh ./configure --prefix=/opt/savory -qt-freetype -no-cups -no-nis -qt-libjpeg -qt-libpng -qt-libtiff -no-opengl -depths 1,4 -no-qt3support -no-webkit
root 7707 0.0 0.0 0 0 ? Sroot 7708 0.0 0.0 0 0 ? Sroot 8503 0.0 0.0 0 0 ? Sroot 8617 0.0 0.0 0 0 ? Sroot 11603 0.1 1.0 28336 1392 ? Ssl 02:57 0:02 /usr/bin/monit -Ic /etc/monitrc
root 11856 0.0 0.3 1460 408 ? Ss 02:58 0:00 /usr/sbin/watchdogd
root 12366 0.0 0.9 84160 1188 ? Sl Mar22 0:01 audioServer -I
root 12484 0.1 0.7 3656 956 ? Ss 02:59 0:01 /opt/local/unsavory/sbin/dropbear -d /opt/local/unsavory/etc/dropbear_dss_host_key -p 22
root 12485 0.0 0.5 2652 720 pts/0 Ss 02:59 0:00 -sh
root 12489 0.0 0.7 3668 924 pts/0 S+ 02:59 0:00 /mnt/us/unsavory/bin/screen-4.0.3 -x
root 12490 0.0 0.5 2652 712 pts/1 Ss 02:59 0:00 /bin/sh
root 15956 0.0 0.0 0 0 ? Sroot 23310 0.0 0.5 2652 712 pts/2 Ss+ 03:09 0:00 /bin/sh
root 23469 0.0 0.5 2652 720 pts/3 Ss 03:09 0:00 /bin/sh
root 23598 0.0 0.0 0 0 ? Sroot 24135 0.0 0.0 0 0 ? Sroot 25652 0.0 0.5 2652 716 pts/4 Ss 03:14 0:00 /bin/sh
root 26479 0.2 0.7 2532 960 pts/4 S+ 03:15 0:00 make
root 26482 0.0 0.4 2648 584 pts/4 S+ 03:15 0:00 /bin/sh -c cd src/tools/bootstrap/ && make -f Makefile
root 26483 0.1 0.8 2572 1068 pts/4 S+ 03:15 0:00 make -f Makefile
root 28838 0.0 0.4 1888 628 pts/4 S+ 03:21 0:00 g++ -c -pipe -g -fno-exceptions -O2 -fPIC -Wall -W -DQT_BOOTSTRAPPED -DQT_LITE_UNICODE -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_CODECS -DQT_NO_DATASTREAM -DQT_NO_GEOM_VARIANT -DQT_NO_LIBRARY -DQT_NO_QOBJECT -DQT_NO_STL -DQT_NO_SYSTEMLOCALE -DQT_NO_TEXTSTREAM -DQT_NO_THREAD -DQT_NO_UNICODETABLES -DQT_NO_USING_NAMESPACE -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -I../../../mkspecs/qws/linux-generic-g++ -I. -I../../../include -I../../../include/QtCore -I../../../include/QtXml -I../../3rdparty/zlib -I.uic/release-shared-emb-generic -o .obj/release-static-emb-generic/qiodevice.o ../../corelib/io/qiodevice.cpp
root 28839 49.5 24.5 36116 31160 pts/4 R+ 03:21 0:09 /mnt/us/savory-toolchain-4.1.2/bin/../libexec/gcc/arm-unknown-linux-gnueabi/4.1.2/cc1plus -quiet -I../../../mkspecs/qws/linux-generic-g++ -I. -I../../../include -I../../../include/QtCore -I../../../include/QtXml -I../../3rdparty/zlib -I.uic/release-shared-emb-generic -iprefix /mnt/us/savory-toolchain-4.1.2/bin/../lib/gcc/arm-unknown-linux-gnueabi/4.1.2/ -D_GNU_SOURCE -DQT_BOOTSTRAPPED -DQT_LITE_UNICODE -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_CODECS -DQT_NO_DATASTREAM -DQT_NO_GEOM_VARIANT -DQT_NO_LIBRARY -DQT_NO_QOBJECT -DQT_NO_STL -DQT_NO_SYSTEMLOCALE -DQT_NO_TEXTSTREAM -DQT_NO_THREAD -DQT_NO_UNICODETABLES -DQT_NO_USING_NAMESPACE -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE ../../corelib/io/qiodevice.cpp -quiet -dumpbase qiodevice.cpp -mcpu=arm1136jf-s -auxbase-strip .obj/release-static-emb-generic/qiodevice.o -g -O2 -Wall -W -fno-exceptions -fPIC -o -
root 28840 0.5 3.5 5828 4536 pts/4 S+ 03:21 0:00 /mnt/us/savory-toolchain-4.1.2/bin/../lib/gcc/arm-unknown-linux-gnueabi /4.1.2/../../../../arm-unknown-linux-gnueabi/bin/as -mcpu=arm1136jf-s -meabi=4 -o .obj/release-static-emb-generic/qiodevice.o
root 28994 0.0 1.7 7404 2248 pts/5 R+ 03:21 0:00 /var/tmp/maemo-build/src/qt-embedded-linux-opensource-src-4.5.0/bin/qmake -spec /var/tmp/maemo-build/src/qt-embedded-linux-opensource-src-4.5.0/mkspecs/qws/linux-generic-g++ -o /var/tmp/maemo-build/src/qt-embedded-linux-opensource-src-4.5.0/./examples/network/fortuneserver /var/tmp/maemo-build/src/qt-embedded-linux-opensource-src-4.5.0/examples/network/fortuneserver/
root 28995 0.0 0.7 2644 992 pts/1 R+ 03:21 0:00 ps auxwww
root 32292 0.2 1.0 3896 1272 ? Ss Mar23 1:15 /mnt/us/unsavory/bin/SCREEN-4.0.3

Jesse Vincent

So. Much. New. Music.

1 min read

In the past 96 hours, I seem to have just kept obtaining new music.

Solvent "Solvent City"
Empire State Human "Pop Robot"
t.A.T.u. "200 km/h in the wrong lane"
Some random Magnetic Fields mp3s
Vienna Teng "Waking Hour"
Liz Phair "Liz Phair"

"Ya Soshla C Uma" (Roughly, I've gone crazy) by tatu is today's constant-repeat track. I've had mp3s of it for a while that I picked up from a Russian FTP site 3 months ago, but I didn't actually remember the band's name or realize the band was "Those two Russian teenaged girls who are making a big deal out of being lovers on stage") The american release of the album seems to include a number of tracks that have been rerecorded in English. So now I need to go out and buy the Russian import as well.

Ya Soshla C Uma and Liz Phair's 'White Hot Cum' seem to be the tracks that have captured my attention the most. So. Damn. Catchy.

Jesse Vincent

RT 3.0.0 Released

3 min read

It gives me great pleasure to announce the immediate availability of RT 3.0.0. This release represents over a year of work extending and enhancing RT 2.0 by Best Practical staff and volunteers.

You can download this release at:

This is a significant new release with major new features, including:

  • The new web interface is prettier, easier to use and also more standards compliant.
  • RT now includes a flexible "approvals" system that lets you define site-specific policies to require approval before certain classes of ticket can be resolved.
  • The mail gateway has been rebuilt to use an RPC mechanism to talk to your RT server, rather than needing to run setgid on your RT server.
  • Groups and access control have been completely reworked.
  • Group membership is now recursive, so you can create groups which contain other groups.
  • The installation process has been overhauled. Autoconf (./configure) make installation easier than ever before.
  • Users can now delegate their rights to other users.
  • Full "custom field" support has replaced RT 2.0's "keywords".
  • Custom fields can now contain arbitrary text, as well as "Select from list".
  • RT now stores all data as Unicode internally, so it's much easier to work with multiple languages.
  • RT's core and web interface has been fully internationalized. RT now speaks: English, French, German, Spanish, Portuguese, Dutch, Finnish, Czech, Russian, Japanese, Traditional Chinese, and Simplified Chinese.
  • RT even easier to extend than ever before: The API is much better documented, the web interface includes a new "Callbacks" mechanism to let you embed your own components without touching a line of RT's source code. The core libraries include a new "Overlay" system to let you override RT's core functionality at the subroutine level.
  • The 'scrips' system is even more powerful. Now administrators can create custom scrips right from RT's web interface.
  • RT 3.0 is much better tested than any previous release of RT. Each release must pass a suite of over 750 tests before being released to the public.
  • There's a full manual (currently available in draft form at
  • And, of course, there's lots more.

A beta-quality tool to import data from an RT 2.0 instance into fresh RT instance is available at:

More comprehensive versions of this import tool will become available in the coming weeks. And I thought I'd get a break now. But no. at least two more releases in the next three weeks. AIEEEEEE.

Jesse Vincent


2 min read

(now that I have all 12 duplicates deleted, let's try again)

Date: Mon, 18 Nov 2002 22:27:09 -0500
From: Jesse Vincent
Subject: RT 3.0 alpha 1

I'm pleased to announce the first "alpha" test release of RT 3.0, RT 2.1.48.

This release contains the complete new isntallation system complete with
autoconf support and rewritten testdeps and database setup tools.

This release is NOT ready for production use (hence the "alpha" designation.)
Do not deploy this system for mission critical data. We can not guarantee that
things won't change incompatibly before 3.0.0, though at this point, the schema
and API are largely frozen.

RT 3.0 is a major new release of RT which adds too many new features to list
here. A few hilights include:

* Completely redesigned ACL system that's faster and more flexible
* Rights granted to a user can be redelegated to another user
* The "scrips" system is a good deal more flexible
* Groups can now contain other groups, in addition to containing users
* RT now speaks: Traditional Chinese, German,
French, Spanish, Portuguese, Czech, Russian and Finnish in addition
to English. (Simplified Chinese was not included in this
release, due to a last minute error.)

We know that not everything is done yet. Particularly:

* The new CLI isn't yet complete.
* The new mail gateway isn't yet complete.
* The commandline admin tool hasn't yet been updated for all of
3.0's new features.
* Some edges are still rough
* Not all bug fixes from the 2.0 branch have been "pulled up" into
the RT 3.0 branch yet.
You can pick up the release from:

As you work with RT 3.0 alpha 1, we'd like to ask that you send questions,
comments and issues to If you've isolated a specific
bug, please send mail to containing as detailed a report
as you can manage, along with any resolution you're aware of. (We like diff -u)