November 2009

Moved Slugathon to github

I've been working on Slugathon on-and-off (but mostly off) since 2003. The bare minimum feature set that I consider necessary to do a serious alpha release is almost done. (Release early, release often; but if you release before you actually do anything useful you might just leave a bad first impression and scare off your potential users.) So I've been thinking about installers, and portability to MacOS and Windows, and whether my current hosting solution (svn and Trac provided for free to open source Python projects by WebFaction; thanks WebFaction) would cut it when I had users and possibly more contributors.

I like Trac, a lot. I now strongly prefer Git to Subversion. You can use Git and Trac together with the GitTracPlugin, but it's hard to find a host that has it installed. (SourceForge, for example, now offers both Git and Trac, but not together.) So I decided to go with github. They're the most popular Git host, their paid hosting business seems to be solid enough that they're unlikely to go away anytime soon, they offer free hosting for open source projects, and they have a wiki and an issue tracker.

So this morning I experimentally moved everything from Subversion+Trac to github. I've administered both Svn/Trac and Git/Trac installations at work, so I knew how to do this on a local machine where I had control, but doing things locally is different from doing things on a remote hosting service.

Here's what I did on github:

1. Signed up for an account. (I've poked around github plenty of times, and cloned other people's repositories there to my local box, but I never needed to register until I actually wanted to move my own repository there. Which is exactly the way it should work.)

2. Uploaded an ssh key. I already know ssh so it was just a matter of posting ~/.ssh/id_rsa.pub into a web form.

3. Re-cloned my Subversion repository to my local box, using git-svn, using the –no-metadata option to remove all the ugly "git-svn-id" blobs in the log. I'd done this before when we switched from Subversion to Git at work, but I didn't remember the exact syntax. Luckily it was right there on Github's help page so I didn't even need to check a Git man page.

4. Uploaded my new local Git repository to Github.

5. Realized that I'd forgotten to use the –authors-file option to convert the author metadata from Subversion format (bare username) to Git format (firstname lastname email). Oops, this was also on github's help page but I'd been in too much of a hurry. I poked around github until I found out how to delete a repository, deleted the one I'd just made, redid the git-svn clone with the missing option, and re-uploaded my repository.

6. Basically cut-and-pasted my wiki pages (there were only 8 of them) from Trac to Github's wiki. I did a little tweaking to convert formatting from Trac format to the Textile format that Github uses, but didn't obsess about getting every little format perfect. One thing that github's wiki doesn't support well is images; they let you link to external images, but not post attachments directly into the wiki. So for now the thumbnail screenshots are there, but they don't link to the larger versions.

7. Manually ported all my Trac tickets to github issues. I had 62 tickets, 30 closed and 32 open. Both Trac and the github issue tracker share the same #number format for referring to issues, and I mention ticket numbers inside commit messages, so I thought it was necessary to add all the already-closed issues for historical reasons. I also changed any references to Subversion commit numbers to Git commit ids inside the issues. This was an annoying data entry task, but with only 62 tickets it was faster to just do it by hand than to write some awesome Trac to github conversion script. (Which would require either cooperation from github, or advanced web scraping, since github is a rather fancy web site with JavaScript everywhere.)

8. Changed Slugathon's SourceForge page to point at github rather than WebFaction. (I'm keeping a SourceForge presence for the project because they offer useful things that Github does not, like project mailing lists. Also, if SourceForge ever integrates Git and Trac and I become dissatisfied with Github's new and fairly minimal issue tracker, I might move everything to SourceForge.)

9. Changed the main wiki page at WebFaction to point to github, too. (I will eventually ask WebFaction to delete the project, but first I want to make sure that the move was a good idea. And give Google enough time to cache the version of the page that shows the redirect to github, so people don't think the project just disappeared.)

10. Created a static web page using the instructions at pages.github.com. This feels somewhat redundant with the github wiki, but it gave me a place to park my images.

My conclusion so far: I still like Git a lot more than Subversion. I like github's wiki and issue tracker less than Trac, but they seem to be good enough.

Games
Programming
Python

Comments (0)

Permalink

DC Randonneurs Flatbread 200k Ride Report

When the Flatbread 200k was announced, I thought it sounded like fun. A brevet with no hills? Like Florida, without as many dangerous ancient drivers? Sign me up. I'll choose between just setting a personal best time, or riding it on my junker fixed gear, or just goofing off.

Then it rained last week. Hard. The weather forecasters kept guessing that the rain would stop soon, and they kept being wrong.

So I got up at 4:30 a.m. Saturday morning to head for the ride, expecting only a dozen or so of the most hardcore randonneurs to be there. (It's not nice to call people insane, so we have polite codenames for it, like "R-12.") It rained most of the way to the start.

But then, as the sun came up, the rain stopped. And when I got to the start, I saw about 40 people there, way more than expected for a November brevet with iffy weather. It appears a lot of people like flat rides, and nobody was afraid of the weather. Also, this ride was closer to Baltimore and Philly and New Jersey than most of our rides, so a bunch of people from the northeastern branch of DC Randonneurs showed up. (It was a two-hour drive for me, since I live in the western exurbs of Northern Virginia, but that's the price you pay if you want to ride in the flatlands.)

Another concern was flooding. The downside of doing a flat ride at low elevation right after a week of rain is that half the route might be underwater. But ride organizer Chip re-scouted the route at the last minute and rerouted around the washed-out areas. So now there are two cue sheets for this ride, Low Water and High Water. Thanks Chip for going above and beyond.

I was on my junker fixie with 52×20 gearing. I'd just put a new chain on the night before, and the chain had about a tenth of a mile of testing on it. So I was a bit concerned about whether the chain tension was correct. (It was; no mechanical problems all day.)

The weather was low 50s with a bit of mist in the air and a lot of puddles on the roads, so I chose my Lake winter boots over my summer mountain bike shoes. I went with cotton socks, wool socks, tights, short-sleeved jersey, long-sleeved jersey, light windbreaker, and full-fingered gloves. I had a balaclava, arm warmers and lobster gloves in the rack trunk. This was almost correct. My feet got a bit hot near the end, but I think that if I'd gone with summer shoes they would have been really cold and wet. So maybe I should have gone with just the wool socks without the cotton socks underneath. And I got hot with three layers on top near the beginning and should have started without the jacket. Finally, my hands got cold near the end, but not cold enough to justify stopping to change gloves.

At the start in Centreville MD I was near the front of the pack. Unfortunately the usual hammerfest ensued and I wasn't in the mood to spin 120 RPM, so a couple dozen people passed me, and I was on the back of the front group, going 20 mph. I fought for a while to hang on, then realized I didn't need to spend all that energy, and slowed down to 18. (My newbie dumbassitude may be slowly receding.) In theory, 20 with a draft is probably easier than 18 without a draft. In practice, drafting really closely on a wet road means you get a bunch of road spray in your face. Also, on a fixie, the faster you go the faster you have to spin, and being outside your cadence comfort zone isn't fun.

There was an info control at a wooden bridge around the 8-mile point, where I stopped to write down the bridge's load limit and also pack away my jacket. Then I realized that there were still a bunch more riders behind me, as they blew past failing to stop for the control. I yelled out "control" and some of them turned around and came back to the bridge. I hope nobody got disqualified 8 miles in for not listening to the pre-ride speech or reading their cue sheet.

Just after the first control someone told me my bag was tipping over. I guess the extra weight of a damp jacket on top was too much for the Velcro straps on my $15 Nashbar rack trunk. (I have a fancy Carradice on my usual brevet bike, but it just wouldn't match the junker fixie.) I recentered it and continued. It was lopsided all day but didn't fall off. At some point I realized that, despite hardly drinking anything due to the cold and wet, I wouldn't be able to make it to the bathroom at the first control. The woods and cornfields are less common in the Eastern Shore than further inland, but I eventually found a suitable (except for the thorns) stretch of woods and watered a tree. Then reminded myself to drink because you can dehydrate even in the winter.

I ended up in a small group with Chip (the other one) and George and a tandem and a couple of other single bikes. (Having so many new-to-me riders on one brevet really stretched my name-recollection ability; sorry.) We stopped at a non-control store in Greensboro at the 28-mile point. Normally I'd just press on, but the constant motion required by the fixie was already getting to me a bit, and it felt like a good idea to rest off the bike for a few minutes. I ate a Clif Bar.

The route went through Greensboro MD, then turned into Delaware. The second control was at the Dolce Bakery in Milford. The staff were extremely friendly. I hadn't eaten much and figured my blah performance might reflect a bit of bonk, so I got a breakfast cookie, a chocolate chip cookie, and a ham and cheese croissant. I was slightly confused when the total came to exactly $4.95, then remembered that there's no sales tax in Delaware. That really simplifies small retail cash purchases, since most will come up just short of an even number of dollars, rather than a bit over. All the food was delicious. While eating my carb-feast outside, an older gentleman walked up and started telling me that he couldn't ride a bike. That every time he'd tried, he'd crashed and bled, until he'd stopped trying. Ouch.

Continuing through Delaware alone, I got my first bonus miles of the day. The (revised-at-the-last-minute-in-the-dark) cue sheet said "BR Cabbage Pond Rd". Unfortunately the turn onto Cabbage Pond was unmarked, but the cue sheet was missing the usual "UM." Also, in my opinion it was a full right turn, not a bear right. That said, I kind of thought that was the turn, so I only went a bit farther to confirm, and saw Paul coming back the other way. So it wasn't that much extra riding. There were a lot more unmarked turns than usual on this ride; maybe Delaware doesn't spend as much on signs as other places, since the road grid in such a flat area is more like the simple grids you see out West, less like the random mess we get in most of the mid-Atlantic. (Heck, maybe in the future when GPS is everywhere, localities will stop bothering with road signs. Just like most phone booths have gone away.)

The next control was at the Iguana Grill in Milton. The place was empty except for about a dozen cyclists; it's probably more of a night spot. I think there were only two people working there so the food delivery was a bit slow, but the service was friendly and the burger and fries I had were okay, and I needed the break, so no problem. Got to chat with a few more cyclists from the far northeastern branch of DC Randonneurs.

The big group leaving Iguana Grill was dawdling, so I decided not to wait any longer, figuring they'd catch me soon enough. They did. And most of them eventually dropped me, but then I caught up again at the next control at 85 miles in Bridgeville. Where I grabbed a big Gatorade, didn't wait in the long line for the bathroom, and left early again, trying to make up for my slow riding speed with fast control speed. This time Chip followed me and caught me right away, and we rode together for a while, with me navigating. (For the first brevet ever, I made no navigation errors on this ride, other than the minor bobble I already described, which I'm not counting because the cue sheet was confusing and I was just double-checking both options, not actually lost.) Then we heard the big group coming up behind us, led by Chuck and Crista on the fast tandem. We were absorbed into the group, but the 18 mph pace was too fast for me on my fixie while digesting a meal, so after a couple of miles I dropped off the back and resumed riding solo. So yet another ride where I failed to finish with the C&C group, which I consider to be "par" for brevet speed. (They're consistently fast, but not crazy win-the-brevet fast.) Though I think that if I'd been on my usual brevet bike, I would have stuck to the group. (Normally I fall off the back on either a big climb or a big descent, but there were none of either.)

The route turned back toward Maryland. There was another confusing cue in Denton where we were supposed to skip the marked turn onto Gay St., then later take an unmarked turn onto Gay St. (I wonder if someone stole the second sign, and it's hanging in a fraternity house somewhere?) The unmarked turn looked like a big highway because it featured a big high bridge over a small river. (Possibly the biggest climb on this ride, maybe 30′ vertical. I stood up to climb it.) But there was a "No Outlet" sign if you went straight there, so I figured that was the correct turn. And it was. A couple of miles later I saw a rider going the wrong way, who stopped when he saw me coming. It was Mike, who'd had the same questions I had about the previous turn and was doubling back to check. I was pretty confident that I was on the right track and that our next turn was 0.7 miles ahead, and I guess I convinced him that I knew what I was doing, so we rode together for the rest of the way. (And I was right once again. I am going to get so seriously lost of the next brevet to make up for this one ride's worth of good navigation.) Mike's done a bunch of brevets in the past but not much lately, since he'd been training for an Ironman. So I got to grill him about swimming and wetsuits and getting kicked in the head underwater and whatnot for the last 20 miles of the ride, to distract both of us from how much our legs were hurting. (Me because of the unfamiliarity of spinning at a constant rate for so many miles, him from not having done many long bike rides lately while he worked on his swimming.)

We made it to the end before dark, and there was pizza and beer. So I think despite the horrible weather preceding the ride and the last-minute rerouting, this was a very successful brevet. Turnout was impressive for a November ride, and it drew people from far away. Kudos to Chip for organizing it so well.

So why did I do this one on a fixed gear? Well, I'm no super-hardcore fixie rider who can climb mountains on one, so this was just about my only chance to do a brevet on one. I'd never ridden my junker fixie more than 40 miles before (and that was just an easy out-and-back on the W&OD Trail), so I wanted to see if I could do it, and if it was as easy as on a multispeed bike with a freewheel. Looks like the answers are yes and no. The ability to coast once in a while, or vary your cadence without varying your speed, are helpful for maintaining comfort and controlling fatigue on a long ride. Even if there are no hills where you really need an easier gear. Of course there are superstar riders who can do 1200 km rides on a fixed gear, but I don't think your average PBP finisher could just hop on a fixie and repeat the performance, without a lot of fixie-specific distance training first.

Beyond the self-inflicted handicap of riding a weird bike, everything went perfectly for me on this ride. I had the right clothes, ate and drank enough that I didn't seriously dehydrate or bonk, didn't eat or drink anything that disagreed with me to the point of illness (despite recklessly continuing to eat whatever looked good rather than sticking to a few known-safe foods), didn't get lost, didn't get chased by any mean dogs (there was one dog but he just wanted to play, and actually stopped when I yelled "Stay."), didn't get buzzed by any bad drivers, didn't have any mechanical problems, and finished before dark. My legs are more sore today than they usually are after 200km, but nowhere near as bad as they were after the 400k in May. I have a bit of pain in the outside of my left knee, but not enough to keep me from riding to work tomorrow. Sorry this ride report is so boring; I'm sure I'll do something entertainingly dumb next time.

Bicycles

Comments (0)

Permalink

Cleaning up after gtk-builder-convert

I switched Slugathon from libglade to gtk.Builder back in August, using gtk-builder-convert on the XML files, then a few small boillerplate API changes in the Python code.

Just noticed today that a few dialogs weren't working correctly anymore. (This is the problem with waiting until something is "done" to actually release it — you have to find all the bugs yourself.)

The differences introduced were missing action-widget tags for some buttons, and changes in the ordering of the children within the dialog ActionArea.

Once I figured out what had happened, it was trivial to fix things up. But be sure to test all your dialogs after running gtk-builder-convert. Slugathon has unit tests, but they don't cover the user interface, so I didn't notice the bugs until I played a long test game to verify other changes.

Uncategorized

Comments (0)

Permalink