Richard Jones' Log

Fri, 30 Apr 2004
Gadgets

I'm pretty sure these are all non-existent. And one of them is decidedly not cool.

Just so we're clear, it's the last one that's not cool.

Aside: I don't know whether others will see this, but the Google auto-ad I see at the bottom of the page is for "Bling Bling ... Compare Prices at 40,000 Stores. Find the Best Deals on Jewelry!".

category: Noise | permanent link
Thu, 29 Apr 2004
What are the TV programmers thinking???

We pretty much watch two shows on TV: Angel and Alias. The latter is often painful, but after Angel it's the most interesting scripted show on television at the moment.

Angel started out this season showing at 10:30pm on a Tuesday night. That's bearable - we're used to this kind of timeslot for Buffy and Angel. Then it got moved to Thursday night. Then to 11:30pm. We don't care, since we're off to bed at 9pm we're taping it anyway. And you get all those kooky post-midnight ads to fast-forward through.

Last week Angel didn't air at all - in its place was "Average Joe 2: Hawaii". Erk. They did screen an episode of Alias (which also screens on Tuesday at 9:30pm) that night though, so we had something to watch the next night.

This week, Alias is screening tonight at 9:30 (still on Tuesday too). And Angel's back at 11:30. And in between? Yep, "Average Joe 2: Hawaii".

Wierd.

Mon, 26 Apr 2004
Thankyou, Carl Patten!

You helped cheer me up following an awful day :)

category: Python | permanent link
Sun, 25 Apr 2004
(Update) Roundup benchmark time again

Update: have added timings for N=100,000 (or thereabouts), which equates to 87,000 or so open issues.

Roundup 0.7 includes some new optimisations, specifically automatic generation of a number of table indexes in the RDBMS backends.

I've added a script "tools/load_tracker.py" which loads a tracker with N issues and N/100 users. Random distribution of priorities, statuses and assignetos. Approximately 85% of issues are open (ie. 17 in 20, 170 in 200, etc).

Against a stock classic tracker, loading the standard index page (sort by activity, group by priority, showing batches of 50 issues at a time):

Backend N Index Page Time
anydbm 200 3.5s
sqlite 20,000 1.1s
100,000 4.5s (9.4s)
metakit 20,000 1.9s
100,000 8.4s (18s)
mysql 20,000 1.3s
45,000 2.1s
65,000 3.3s (5.7s)
postgresql 20,000 1.1s
75,000 2.7s
100,000 4.1s (5.7s)

Note:The second (bracketed) values indicate the time for a concurrant index page view (I press reload in a second browser window shortly after requesting the first). The sqlite and metakit backends serialise accesses, so their second access time is understandably doubled.

Wed, 21 Apr 2004
MySQL "gotchas" page

Anthony pointed me at this page of MySQL gotchas. In short, the author has found aspects of MySQL that in any other RDBMS would be considered "bugs" but in MySQL they're "gotchas".

The contents listing includes "What goes in - isn't (always) what comes out" and "Silent Column Specification Changes". And the "February 31st" entry really has to be read to be believed. As the author puts it in considering one of the gotchas, "Whoops, no InnoDB table support":

This gotcha is true to MySQL's apparent design philosophy: "if it's not supported, do the next best thing. Silently."

Hmm. There's a definite parallel between MySQL and Perl here... whereas my Python-wired "explicit is better than implicit" brain balks at this kind of behaviour...

Of course, I'd have to add to this page my own experiences dropping databases, though I'm pretty sure this is actually a bug, even if the developers refuse to acknowledge it exists.

Update: I missed the link to this other page.

category: Noise | permanent link
Tue, 20 Apr 2004
Great cartoons about gaming
category: Games | permanent link
Sun, 18 Apr 2004
Two more Roundup releases...

Another bugfix release for the 0.6 maintenance branch, and the final beta for the new, improved 0.7 release. It's a pity the version numbering now goes 0.6.9 to 0.7.0. A casual observer could easily think that there's little change between the two, even though there's a ton of new work in the 0.7 codebase. Maybe I'll force a 0.6.10 out, just to make it clear what's going on...

category: Python | permanent link
Roundup's demo mode very popular

Roundup (my issue tracker project) has an "instant-gratification demo mode" which basically consists of running "python demo.py" in the source directory. This creates a demo tracker and starts up the web interface and allows people to poke around the thing to see what it's about.

So it turns out that people have discovered that you can just fiddle with the demo (add and remove properties, edit the HTML, etc) just like a regular tracker. And then when you're done fiddling, you just copy the directory to a "live" site.

I made this even better in 0.7, as you can now specify the backend to use in the demo (roundup has many different database backends, now including postgresql).

I highly recommend adding something like this to anyone's pet project, as it pretty much removes any barrier to entry. Well, except on Windows, where I still have to get my head around getting an installer going... :)

category: Python | permanent link
Fri, 16 Apr 2004
Distutils MANIFEST checking

So it turns out that some programs don't unpack distutils tarballs correctly. My test runner now executes the following code:

def check_manifest():
    """Check that the files listed in the MANIFEST are present when the
    source is unpacked.
    """
    try:
        f = open('MANIFEST')
    except:
        print '\n*** SOURCE ERROR: The MANIFEST file is missing!'
        sys.exit(1)
    try:
        manifest = [l.strip() for l in f.readlines()]
    finally:
        f.close()
    err = [line for line in manifest if not os.path.exists(line)]
    if err:
        n = len(manifest)
        print '\n*** SOURCE ERROR: There are files missing (%d/%d found)!'%(
            n-len(err), n)
        sys.exit(1)

Distutils doesn't automatically check the files unpacked from a source distribution against the packaged MANIFEST. I'm not sure that it could, without potentially breaking some of the other distribution mechanisms. This uncertainty comes from having no clue as to how I could make it run this function when someone tries to install Roundup from source... Anyone? :)

Update: I believe the following is safe. Instead of checking the manifest at install time, I check it at build time:

from distutils.command.build import build

class build_roundup(build):
    def run(self):
        check_manifest()
        build.run(self)

later:

setup(
    ...
    cmdclass = {
        'build': build_roundup,
    },
)
Mon, 12 Apr 2004
Linkfest

Too busy to post real entries, so here's random links (Harper's, Overlawyered, Legaltorrents, IOTD Gallery, free boardgames, SMH web diary):

  • Harper's index for March 2004: is as eye-opening as ever (includes a link to a speech made by Donald Rumsfeld attacking war profiteering by US military contractor Brown & Root).
  • Overlawyered: Chronicling the high cost of our legal system (US, Australia and others)
  • Legaltorrents: a collection of legally downloadable, freely distributable files, both net.label electronic MP3s and other media items, which we've made available via BitTorrent.
  • Image Of The Day Gallery: cool snapshots of computer graphic works-in-progress, back on the air after a hiatus.
  • Free boardgames: page actually contains a top 10 selection, but there's more linked.
  • SMH Web Diary: a great daily read of current afairs analysis, with feedback. Has a charter available.

That'll do for now :)

category: Noise | permanent link
Sat, 03 Apr 2004
Photo Friday: Atmosphere

I have a few dozen of these kinds of photos cycling as my desktop background. This is one of my favourites. All taken from our backyard.

Thu, 01 Apr 2004
MySQL. Ugh.

My latest with MySQL was this gem:

mysql> show tables;
+-----------------------+
| Tables_in_rounduptest |
+-----------------------+
| __words               |
| msg_files             |
+-----------------------+
2 rows in set (0.00 sec)

mysql> drop table __words;
ERROR 1051: Unknown table '__words'

The only way I could fix this was to delete the database from disk. Again.