Joel on Software got a free Mini appliance from Google. Within an hour or two of using it, he discovered the same behavior I find so infuriating about ours: The upgrade process.
Upgrading requires two steps: one for the "system version" and another for the "software version". No problem, right? Well, you have to reboot the appliance in between these two steps. Which requires physical access.
Yeah, instead of programming a "reboot" button into the Web interface, Google decided to give you a "shutdown" button and instructions to pull the plug after waiting "several minutes for the system to shutdown". (For your reference, Google, all the reboot button has to do is system("/sbin/shutdown", "-r", "now"); instead of system("/sbin/shutdown", "-h", "now");.)
Sigh.
Tonight an interesting bug cropped up in the development version of Podbop, where it was basically getting confused and finding the wrong city. I'll spare you the ugly details.
The thing is, I would never have discovered this issue had I:
It took me a while of staring at the generated SQL to understand the bug. When a table has two or more unique constraints which share at least one column, the WHERE clause ends up looking like:
WHERE ( … first unique constraint … ) OR ( … half of the other unique constraint … )
This gives us a pretty good chance of returning the wrong row. Whoops.
I can hear the programmers saying, "Sounds like a lack of test coverage in DBIx::Class…" Well, yeah.
What amazes me is that it hadn't cropped up in at least one application out there. I know people are testing the development releases of DBIx::Class, but I guess no one had more than one unique constraint on their tables.
Well, it's code I contributed, so I better fix it. :-)
I'm going hunting
When I was a kid, my mom made me go to "Tuesday Group" meetings. This was mostly upper-middle class women, some with children, who took it upon themselves to introduce new families to Gainesville. Most of the families had recently migrated to the US.
We met one Tuesday each month at one woman's house, or the clubhouse in another's subdivision. The group never met at our house. We weren't that well-off, and our house was too small for the number of people.
I don't have many specific memories about Tuesday Group, though one really sticks out. I was playing with a few kids on the host family's giant trampoline. After stepping down, a high schooler decided to test me. He asked me if I knew the definition of a light-year.
I was ashamed of myself, to be honest. How could I not know something so simple?
Looking back, I wonder if he was making fun of me because he thought he was smarter than me. (I hear he works for Google now, so hey.) I was a pretty rambunctious kid, so maybe he was getting back at me. Perhaps his little sister (who I had crushed on at one point) asked him to humiliate me. Maybe he was teasing me because he was teased at school that day. Who knows?
What bothers me the most is that I can't read or hear "light-year" without remembering this experience.
The following package will be installed or updated:
svk
The following 115 additional packages will be installed:
algorithm-annotate-pm algorithm-diff-pm apr apr-dev apr-ssl apr-ssl-common apr-ssl-shlibs aprutil-dev autoconf2.5 automake1.9 bfd-pm bison class-accessor-pm class-autouse-pm586 clone-pm586 compress-zlib-pm586 cyrus-sasl2-dev cyrus-sasl2-shlibs daemonic data-hierarchy-pm586 data-uuid-pm586 db43-ssl db43-ssl-shlibs db44-aes db44-aes-shlibs devel-stacktrace-pm encode-pm586 file-chdir-pm586 file-type-pm freezethaw-pm gawk gdbm3 gdbm3-shlibs getopt-long-pm586 gettext-dev glib glib-shlibs gmp gmp-shlibs guile guile-dev guile-shlibs html-parser-pm586 html-tagset-pm html-tree-pm586 io-digest-pm io-pager-pm io-string-pm ipc-run3-pm libapr0-shlibs libaprutil0-shlibs libgmpxx4-shlibs libmpfr1 libmpfr1-shlibs libtool14 libtool14-shlibs libwww-pm586 libxml2 libxml2-bin libxml2-shlibs locale-maketext-lexicon-pm586 locale-maketext-simple-pm m4 neon24-ssl neon24-ssl-shlibs openldap23-dev openldap23-shlibs openssl097 openssl097-dev openssl097-shlibs perlio-eol-pm586 perlio-via-dynamic-pm perlio-via-symlink-pm pkgconfig pod-escapes-pm pod-simple-pm python-nox python23-nox python23-nox-shlibs python23-socket-nox readline readline-shlibs readline5 readline5-shlibs regexp-shellish-pm ruby18 ruby18-dev ruby18-shlibs svk-pm586 svk-pm586-bin svn-client-ssl svn-mirror-pm586 svn-simple-pm586 svn-ssl svn-ssl-dev svn-ssl-shlibs svn-ssl-swig-pm586 svn-ssl-swig-pm586-shlibs swig swig-shlibs system-openssl-dev tcltk tcltk-dev tcltk-shlibs term-readkey-pm586 texinfo text-aligner-pm text-diff-pm text-table-pm time-date-pm uri-pm586 vcp-pm586 xml-autowriter-pm586 xml-parser-pm586 yaml-pm
Oh. My. God. Must install Gentoo on PowerBook.
So I'm really sick of Bloglines. I think Sam Ruby pushed me over the edge with his Atom exploit. (I also unsubscribed from Sam's feed as a result…)
Further, the Bloglines crawler is rather rude, which was more recently noted by James Farmer and Matt Mullenweg.
I'll be installing Plagger the next chance I get. The slides from miyagawa's presentation from YAPC::NA 2006 piqued my interest. I'd be willing to bet Plagger gets support for the Atom threading extensions before Bloglines. :-P