[ Content | Sidebar ]

volumes with their own titles

September 19th, 2005

My reading list continues to give me high-priority requirements: the gorgeous Kabuki: Dreams makes me deal with series whose titles aren’t simply Title of Series, Volume XXX.

It was easy enough that I got it out of the way right now, instead of waiting until the weekend.

caleb!

September 19th, 2005

Congratulations to Jordan and Tanya on the birth of their son Caleb on September 15!

french volumes

September 17th, 2005

I was planning to make dbcdb look beautiful (well, something other than butt-ugly) this weekend, but reality intervened in the form of books that I’ve read that didn’t fit into my existing setup. And keeping it up-to-date with respect to my current reading list is my current highest priority, so I spent a couple of hours today adding a few more features.

For Un monde pluriel mais commun, I had to add the ability to link to Amazon France. Which, fortunately, took about 5 minutes to get right; it turns out that (unsurprisingly) both sites use a similar link structure, so I could just swap in .fr for .com and I was all set. Actually, I feel a little uncomfortable with the way I’m handling the Amazon links: it’s not a priori obvious that clicking on the ISBN should bring you to Amazon. But I couldn’t think of a better key-value pair to contain the appropriate link, and I didn’t feel like breaking the key-value mold. Maybe I’ll come up with a better solution later.

The other problematic recently read book was Nextworld, Volume 1. I couldn’t treat that like a regular book both because, when I get around to reading and entering volume 2, I want there to be some connection between the two, and because I wanted the “Nextworld” part italicized in the title but not the volume part.

That took rather more work. The class structure used to be an Entity base class with Author and Book subclasses. Now I’ve inserted a BookLike subclass (for things with titles and authors, basically; yes, it’s a lousy name) between Entity and Book, added a Series subclass of BookLike, and a Volume subclass of Book. There are still aspects of the class structure that I’m not completely comfortable with (e.g. BookLike contains data members that end up being unused in the Volume case), but it’s the simplest way that I can think of to write the code now. (And this is far from a final form, but future changes can wait until I’ve added kinds of data to force those changes.)

Still, while that took more than 5 minutes, it was only an hour or two (1:48, subversion tells me), and the code proved quite capable of accepting such a change without much fuss. (I also took the excuse to delete some of the code from December that would have gotten in my way.) And there’s still one further high-priority change before I can get around to fiddling with CSS: I’m in the middle of reading a book with two authors, which I don’t handle properly. I’ll probably also take the time to add a list of books to the author pages: those pages are horribly bare right now, after all, and now that I’ve done something similar with series pages, I know what’s involved in carrying that out.

weird controllers

September 16th, 2005

When I first heard about the Nintendo DS, I thought it was a gimmick. And I still think it’s a gimmick, though one that’s doing surprisingly well: the system is consistently outselling the PSP in Japan, for example. (No idea how they’re doing in the US.) Part of that is due to cultural differences: some of the top sellers in Japan are quiz / teaching games, which presumably work well with the UI. But that’s not the only reason; when I first saw videos for Nintendogs, I finally started to get it. I’m really impressed by the amazingly tactile feel the game has, the way you use the touch screen to pet your dog, play tug with your dog, throw things for your dog to get, etc. And it’s extremely well done; it seems about as realistic a pet sim as I can imagine right now. (They use the microphone to good effect, too.)

Still, I won’t get Nintendogs, if for no other reason than that I’d feel disloyal to Yosha and Zippy were I to do so. But maybe I’m not the target audience for the DS, anyways; as suggested in Foxtrot last week, it’s expanding its audience beyond traditional video game players, and if it can do that, more power to it. And if the result is lots of experimentation in new genres, I’m all for that, too. And probably Animal Crossing DS will be fabulous, especially if you have DS-owning friends. Maybe that will be the game that convinces me to buy one?

Of course, the reason why I’m posting on this right now is the Revolution controller announcement. I have to say, I was not at all optimistic about that; I like standard video game controllers, and while Nintendo can experiment with a gimmick in the portable space, I don’t see how they can do that in the non-portable space and still remain a serious competitor there. But after seeing the teaser video, I’m completely sold. I love the idea of playing a sword-fighting game by swinging the controller around. Normal genres should be able to adapt profitably to the new controller – playing Metroid on a touch screen sounds like it would incapacitate my hands in about 15 minutes, but playing it with a joystick in my left hand to move and a pointer in my right hand to aim and shoot sounds like a great idea. (Plus, they’ll release a standard controller shell, for unimaginative publishers.) And if it manages to expand the gaming audience by allowing weird new genres (I love the bit in the video with two people conducting an orchestra), great!

Nintendo still has their work cut out for them: other publishers won’t necessarily want to take the time to think how to best use the Revolution’s controller, so they’ll have to carry the console on their own shoulders to an unhealthy extent. But their shoulders are more than capable of such a feat; it’s great to see them taking a chance like this.

one year

September 16th, 2005

I’ve been blogging for a year now. If the counters are to be believed, this is my 151st post, though it’s possible that I wrote some drafts that I deleted before posting. And I don’t seem to be done yet, despite the lack of posts this week. (We’ve been laid low by plague, while our scalps are not yet free from pestilence.)

Thanks for reading!

tao te ching

September 11th, 2005

This version of the Tao Te Ching is pretty cool: click on any character and you’ll get loads of information about it and its possible meanings.

Can you tell I’m spending a few hours going through my backlog of links to look at? Alas, going through the backlog is as likely to increase its size as decrease it, because of further tantalizing references linked to therein…

recycled knowledge

September 11th, 2005

This blog is remarkable.

Alas, its only feed is in Atom, which Gnus doesn’t understand. Hopefully in half a year or so I’ll know enough to be able to write my own feed reader in Ruby.

ruby on rails demo

September 11th, 2005

The Ruby on Rails demo is pretty amazing.

author pages, more fields

September 10th, 2005

My sample page now looks significantly different. The ‘Author’ field links to another web page (a very sparse one currently; more will be added eventually). And there are ‘Last Read’, ‘Rating’, ‘ISBN’, and ‘Own’ fields (all optional). The ISBN field links to an appropriate Amazon page.

A quite pleasant afternoon of programming, all things said. For historical reasons, there were already separate ‘Book’ and ‘Author’ classes that inherited from a common ‘Entity’ base class, so adding the author pages largely consisted of moving methods from ‘Book’ up to ‘Entity’. One of the methods in question was a ‘printField’ method; that method made it basically trivial to add more fields to the book pages.

And it’s getting very easy indeed to add new acceptance tests. If I want an acceptance test that checks that a new field is working properly, now all I have to do is add a new entry to the database where that field is present and stick a file ‘fields-NN.html’ (for an appropriate number NN) with the expected output. No need to modify the acceptance test proper at all, and that acceptance test is all of three lines long:

  #!/bin/sh
  source setup.sh
  run WriteFields

Hidden behind the scenes is functionality to compile the program, generate a target web directory, run the program with the output going in the target directory, do some wget calls to the web server I’m running on my laptop, and compare the results to the expected html output.

Which is pretty slick. I’m embarrassed to say that, at work, I don’t get my hands dirty with acceptance tests as much as I should, so I’m glad I’ve been getting the experience here. And I’m starting to understand how a tool like FitNesse could work, allowing a customer (an actual customer, not a program) to write new acceptance tests just by modifying some simple configuration files.

I’m also proud the test that checks that my Amazon links are correct by digging the link out of my web page, fetching the linked-to page from Amazon, and checking to make sure that it actually links to the book that it’s supposed to. So if Amazon ever changes the format of their links, my tests will let me know!

At this point, dbcdb is quite useful; the database now contains every book I’ve finished reading since I started the project, and the resulting pages have almost all the info I’d like them to have. The next thing I’d like to do is plug in an appropriate style sheet, because they look like crap; that will require essentially no programming, but I’ll have to learn more about cascading style sheets. (And acquire some design sensibilities, which is a good deal harder.)

I spent a little bit of time learning about Ant; I’m not sure I like it very much, though. In particular, one aspect of Java that I’m using is that different classes can each have their own ‘main’. This means that, if you’re interested in one particular program, you probably only want to compile a subset of the classes in your source directory. I don’t know if ant supports that, but the tutorials I’ve found online certainly don’t explain it if it does. Whereas make handles that sort of stuff with its eyes closed. But I can’t get make to handle dependencies correctly (I found another dependency bug, so now I do ‘ make clean’ in my first acceptance test, which means it takes more time than all other tests put together), so I guess I’ll have to move to ant eventually.

kepler’s r.i.p.

September 8th, 2005

Kepler’s Books in Menlo Park closed last week. It’s vaguely possible that it will reopen – a lot of people miss it – but I won’t count on it. This is sad. Not that I went there all the time or anything, but I suppose I would have a decade ago if I’d been living in the area. That difference being, presumably, is why it closed.

The conventional explanation is that it was done in by the one-two punch of Border’s and Amazon; I assume the conventional explanation is correct. A decade ago, there was a lot of talk about how the evil Border’s and Barnes and Noble were putting stores out of business. And, to be honest, I had no patience with those arguments. I believed that bookstores were going out of business – the number of bookstores in Harvard Square probably dropped by half at about that time. (Not that I quite understand the cause and effect there, since no Borders plunked itself down there; it was probably just a part of the gentrification of Harvard Square.) But I didn’t believe that having those bookstores replaced by a Borders was a bad thing.

Lots of the complaints were of the form “having bookstores disappear and be replaced by Border’s will limit your choice”. Which looked to me like baloney; the bookstores that I saw disappearing were the indifferent smallish non-specialist bookstores, so the only choice that I was losing was the choice of ten stores to get the same bestsellers from. The Borders that opened up in downtown Boston at about that time probably had five times the number of different titles available than all of the disappearing Harvard Square bookstores put together. And Borders always treats me like a potential purchaser instead of a potential thief.

And the good bookstores in Harvard Square stayed open: general ones (Wordsworth, the Harvard Book Store), specialist ones (Pandemonium, the incredibly customer-hostile Grolier, though I assume the latter is financed as a sort of hobby). And the Harvard Coop during that time went from a slightly larger indifferent quality bookstore to one that was quite striking both in terms of its selection and in terms of its architecture. They hired Barnes and Noble to manage it; in general, I don’t like Barnes and Noble, and there was a whiff of that taint in the new Coop, but only a whiff. (As far as architecture goes, I have to say that I like the basic Border’s two story with huge staircase/balcony architecture, even if it does feel a bit repetitive at times. Sure, the library stacks denizen in me would like two stories crammed full of books without a huge open space in the middle, but there’s something nice about the cathedral of books associations that the more open architecture gives.)

My coworkers will laugh at this, but it actually took me a while to accept the second punch, Amazon. Don’t get me wrong: being able to order any book you want is a godsend. But I’ve been special ordering books for two decades (I must have spent more time leafing through Books in Print than almost any teenager in the country), so this wasn’t a new concept for me. (It didn’t help that Amazon was charging extra for some of the more esoteric books.) But after a few years, I realized that it was a waste of my time for me to go into a bookstore with a list of fifteen books to special order, to have to read all the names to a clerk (Delany, D E L A N Y, no, no E, just N Y. Tales of Neveryon. N E V E R Y O N. Right. Same author: Straits of Messina. S T R A I … yeah. M E S S I N A. No, I’m not done yet. Is Babel 17 in print? B A B E L, like the tower. Oh well, too bad), all the time considering myself lucky if the clerk would at least tilt the computer’s screen so I can see the misspellings. Much much better for me to be the one sitting at a computer typing.

When I moved out here, I did about half my book buying on Amazon and half at bookstores, both in infrequent large purchases. Since then, my purchases have gotten smaller (and it’s been a couple of years since I’ve done a large single purchase at a physical bookstore), and a lot of my purchases in physical book stores have been at specialty stores or in general purpose book stores that are particularly good at some specialty. For example, the Sunnyvale Border’s has a particularly good computer selection, surprise surprise. (For that matter, their comics selection isn’t half bad, either.)

And Kepler’s ended up getting left out. It’s a bit far away for me to drop in randomly: now that I’ve stopped going to the go club, I almost never end up randomly in Menlo Park. I often went to Kepler’s when looking for a birthday present and don’t have any specific ideas, but even there Amazon is doing increasingly well for me, and of course saves me from having to deal with shipping. And they didn’t have a cafe, which doesn’t matter to me but seems to be the trendy but effective way for bookstores to improve their profit margins.

So I can see why it closed. And its closing won’t have much of a concrete effect on me. But I still miss it.

king felix

September 6th, 2005

We saw a game at Oakland for the first time this season. Liesl’s company has season tickets to the Giants, so we’ve been there, but not Oakland. The game featured Felix Hernandez, whom Baseball Prospectus ranked as their top pitching prospect coming into the season, against Joe Blanton, whose star had dimmed coming into this year but who has managed a 3.51 ERA over 28 starts, an excellent rookie year. (My vote is still for Huston Street, though.)

I hadn’t realized that Hernandez had already been up for almost two months. And he seems to be living up to his billing: seven starts is enough for a 1.59 ERA to mean something, and nothing about his performance yesterday made me think he’d been getting lucky. Admittedly, it’s hard to tell against the A’s: their offense these days seems to either score double digits of runs or none at all.

The Mariners had another recent call-up who put on a bit of a show: the strikingly-named Yuniesky Betancourt did quite nicely both offensively and defensively. Looking at the stats, though, the former at least seems like a bit of a fluke.

Random stat of the day: in three years of high school baseball, Ichiro Suzuki struck out a grand total of 10 times. And every single one of those strikeouts was on a called third strike.

dbcdb: generated using Java

September 4th, 2005

This page looks the same as it did last week, but it’s being generated using Java. Whee. (And I hope it will look a little different by the end of the weekend.)

I didn’t spend too much time programming: my time was mostly spent managing and understanding infrastructure. There’s now an acceptance test which runs all the unit tests, a program to run all acceptance tests. I had a little bit of confusion with the multiple programs named ‘java’ and ‘javac’ on my system, but now the right one is being called.

My most pressing current infrastructure issue is that I really don’t understand how javac works with dependencies. If Foo.java uses a class Bar and if Bar.java uses a class Baz, then it looks like, if I modify Bar.java and tell javac to recompile Foo.java, it will also recompile Bar.java, but if I modify Baz.java, then compiling Foo.java doesn’t cause Baz.java to be recompiled. Or maybe I need to go one level deeper, or maybe I’m misunderstanding things completely. (Hmm: maybe javac knows that touching Baz can’t change Bar’s interface, so, just from the point of view of compiling Foo correctly (as opposed to having it and all the code it calls run correctly), it isn’t necessary to recompile Baz in that situation.)

For now, I’m using a plain old Makefile. Which isn’t right, either, because dependency info isn’t expressed in the Makefiles, but I’m hoping that make plus whatever understanding javac has of dependencies will be good enough. (As long as I don’t do parallel builds; this machine only has one core, though, so that’s acceptable.) Clearly I should learn about ant; I’ll make sure to do that as part of my next iteration.

Most of the reason why I had to write so little code is that, for better or for worse, I saved the non-GUI code from my last attempt at this. Which was a very small amount of code, but I think saving it was a good move: as it was, the changes required for this iteration took more than my two-hour goal. I still had to learn a little bit of Java: I’d never written a unit test in Java for code doing output to a file before. (Or if I had, I didn’t remember.) Working from C++, the theory is pretty obvious – there must by some abstract “output stream” class – but I didn’t know how the details worked.

So I looked at the documentation (I really like javadoc), and, sure enough, we’ve got java.io.OutputStream. Except that it talks about byte streams, and Java (quite sensibly, but unlike C++) makes a distinction between characters and bytes. Nothing leapt out at me from the javadoc, so I pulled out a book and found that Writer was the interface that I wanted. It’s interface was a little sparse; digging around, PrintWriter is more useful.

My first reaction is that I’m not sure that separation is a great idea – why not put all the functionality on Writer? But the answer is presumably that doing so would make Writer a non-interface (since you would want default implementations of the extra methods), which would limit its flexibility given the way Java does multiple inheritance. It also raises the question of whether the function I’m writing should accept a Writer or a PrintWriter; I decided on the former, since it makes the function a bit more generic. Which I think is good design, even if it apparently isn’t always the Java way.

So that’s the function: what about the test? I seem to recall reading that Java has a class called StringBuilder that you’re supposed to use to construct Strings piecemeal, but it dosen’t have a relation to any of these classes. Digging around, though, there’s something called StringWriter which is a sort of Writer encapsulation of StringBuilder. Why doesn’t StringBuilder just implement the Writer interface directly, though? Beats me, not that I’ve thought about it much.

And then, after all of that, the unit test failed in a very mysterious way. At first I assumed that I was misusing the classes in question, but it turns out that the problem was in my understanding of Java’s compilation model, as mentioned above. Once that was all fixed, the acceptance test passed the first time; yay!

I’ll probably end up deleting some more of the code that I wrote in December, but it’s served its role as a crutch. And the new code is wonderfully pregnant with possibilities: I look at it and I can see how I’ll want to move this method to this class, and I’ll probably want to extract a class out of these functions, though I can’t quite see the details of the latter. But right now, the code is quite clean enough for the current desired functionality; I’ll do those refactorings as appropriate for future iterations. (I’ll certainly move some methods in the next iteration: that’s the right time, while right now is too early.)

I’m also starting to completely rethink the priorities of some of my early iterations. I had planned to, in the next few weeks, be able to save the data in XML and read it from XML. The truth is, though, that doing so won’t actually make life any easier for me as a Customer: it’s very easy to write Java code to add more books to the database. Right now, the relevant code looks like this:

  Collection collection = new Collection();
  collection.createBook("Walter Benjamin", "The Arcades Project");
  return collection;

and I can just add a more createBook lines as necessary.

And XML was always intended as a crutch: eventually, I’ll want to generate web pages on the fly, and it’s a bit silly to do that by reading in the entire book collection in XML format. Instead, it’s better to look up whatever book the user requests from a database. So why not skip the XML step, and go straight to using a database?

I haven’t made up my mind completely; I would like an excuse to get my hands dirty with XML, after all. But the truth is that I don’t need it here, and that, in places where I might need it (controlling my iPod, generating an RSS feed), having used XML here won’t help me directly. Also, XML is pretty simple conceptually, so I don’t get the feeling that I really need to get my hands dirty with it to have a basic understanding of what’s going on.

Unfortunately, I don’t know anything about the databases, so I’ll have some reading to do before I can implement those stories involving a database. So for now I’ll stay away from the relevant stories, and concentrate on stories that improve the web pages that I generate (more fields, more kinds of data, whatever) while I read up on the subject.

podcasts

September 2nd, 2005

I’ve subscribed to my first podcasts: Agile Toolkit and The Sound of Vision. It really is nice that I can enter the URL for an RSS feed into iTunes and it will go and fetch new shows for me. And the iPod is definitely the right place for this sort of thing: if the podcasts were just music, maybe I’d be willing to listen to them on the computer, but those podcasts are spoken word, and the verbal part of my by brain is already quite busy enough when I’m using the computer.

I found both podcasts because they were interviewing bloggers that I respected. I’m not sure how long I’ll keep on listening to them – in the former case, I don’t get the impression that there’s a huge backlog of stuff to be added, and the latter one is more business-focused than I’m really interested in. But I’m interested in business issues enough to give it a try for a while, certainly.

One interesting thing about the Bob Martin interview in the Agile Toolkit: he says that there’s a minimum set of agile practices such that, once you have them, you’ll naturally start adopting the whole kit and caboodle. His candidates are:

  • Very short cycles.
  • An open office.
  • Test-driven development, both at the unit test and automated test levels.

Once you have those, he says, the rest will follow: TDD naturally leads to automated integration, an open office naturally leads to pairing, short cycles with automated tests naturally lead to the planning game. (Though later on he says that maybe the planning game is a fourth necessary seed.)

I really would like to experience an open office at some point. My group is still not completely sold on pairing all the time, though we’re moving in that direction, in a healthy fashion (more on that soon, I hope). I can see how upping the chatter level and having more colleagues in your field of view would help: if you can see somebody, it’s easy to ask them a question, and if people are talking about something that you have something useful to contribute to, then it’s easy to jump in, and both of those could naturally lead to pairing.

And, on a different note, in a noisy room it’s a lot harder to concentrate when working alone than when working with somebody else, so you might as well pair just to get any work done! In Peopleware, DeMarco and Lister talk about how cubicles are bad because people need a quiet place to get into a state of flow, so people should have offices. I tend to think that cubicles are indeed bad, but that there are two stable situations: an open work area or offices. In the former, you get the benefits of free information flow; in the latter, you get the benefits of quiet and privacy. But cubicles don’t satisfy on either count.

Not that our current layout is so bad: there are cubicles, but they only have walls on two sides, leading to more open feel and encouraging more communication. (And less claustrophobia.) But I would like to try an open work area at some point. (With small rooms on the fringes for times when you need privacy.)

(On an unrelated note: lice are not my favorite of animals.)

first story

August 28th, 2005

I’ve implemented my first story; the results can be seen at The Arcades Project. (Of course, if things go as planned, then the appearance of that page will drastically change over coming months!)

I was pretty good about writing an acceptance test first. Which meant that I got to install Apache locally on my laptop, and learn how to configure that; there were some twists and turns, but I got it done. I got to learn a bit more about subversion, too; I got some error messages from subversion that I still don’t quite understand, but it seems to be working acceptably now.

And I’ve added some more planning web pages. I still need to add a bunch of stories to the product backlog, though.

dbcdb

August 27th, 2005

I wish that I knew more about certain aspects of modern computer technology, espcially information-management aspects of technology. Examples of things that I wish I knew more about:

  • Java.
  • Ant.
  • Eclipse, especially its automated refactoring tools.
  • How to write a web page that doesn’t look like it was written a decade ago.
  • Web pages that accept input.
  • Web pages that are generated on the fly. By a trendy new language (i.e. not PHP); probably Ruby on Rails.
  • XML.
  • XSLT.
  • RSS/Atom.
  • Databases.
  • FitNesse.
  • Apache.
  • Web services.
  • Subversion.
  • GUI creation and design.
  • AJAX.

Also, there are things about my own information management that bother me. Examples:

  • I give information that I’m interested in to others (e.g. book ratings to Amazon) without keeping a copy of such information myself.
  • Book links in my blog are ugly, and point to an outside source.
  • I’m using Windows to get at my iPod, and it’s not as easy as I’d like for me to edit both its contents and the presentation of its contents.
  • It would be nice to keep (and make available) a list of books that I own or have recently read.

(Whenever the above says “book”, read “book / cd / video game / dvd.”) It would be nice to be able to fix some of these issues, while brushing up my agile development chops at the same time. (Especially in ways that they aren’t getting brushed up at work.)

Last winter break, I started on a project to address some of these issues. Which failed abortively, its only tangible output being a series of posts here on Java. Analyzing this with my finely honed agile management skills, what went wrong? Some things that I didn’t pay attention to:

  • Sustainable Pace. Realistically, I won’t have any time during the week to program on this. (Plan, maybe, but not program.) If I’m lucky, I’ll have a couple of hours at a time in the weekend to program. When I started, I was using a technology that I was unfamiliar with (Java GUI programming); I had a free week to learn about this, which probably would have been enough if I hadn’t spent a lot of that time playing GTA instead of programming. Which was the right decision, but it meant that I never got the product to a useable state that week, even in embryonic form, and it was really hard to make further progress once work started up again. So this time, I have to plan all of my work to fit into two-hour chunks that I can work on every week or two.
  • Frequent Releases. It would be even better if, at the end of each two-hour chunk, I could use the resulting functionality to do something new, that would be reflected on this web site. It would also be acceptable if there were changes that led to the same web site being produced in a different way: they wouldn’t be visible to the outside world, but they would have valuable for me in my Customer role (somebody who wants to produce a web page), not just me in my programmer role.

Putting these lessons together, I can’t get too hung up on the final technology that I’ll use. Which is probably correct for other reasons: eight months ago, I was thinking in terms of Java+XML as a final technology, while now Ruby+database seems more likely; once the implementation gets that far, my technological goals will probably have changed again! What I need to do, instead, is come up with an initial story that I can implement in two hours or less, that will result in a change that is visible on my web page, and that will hold up to potentially drastic technology changes under the surface.

If there’s a change on my web page, HTML will have to be generated; if I can carry it off in two hours, I will have to generate the web page by hand. (Or something morally equivalent, hard-coding strings into a program.) But it would be nice if, a year from now, the same link led to a web page that was generated on the fly, instead of a static web page. So let’s not have the link end in .html.

Fortunately, Apache has a tool (mod_rewrite) that allows you to manipulate how you generate HTML in response to a given URL. So there’s my first story: I’ll write a web page by hand, hide it somewhere on my web site, and learn enough about mod_rewrite so that the link http://www.bactrian.org/dbcdb/2 causes the contents of that web page to be generated. (The ‘2’ at the end instead of ‘1’ is because of the order in which I plan to implement the early stories.)

What shall I use to plan this? I’ll write up some stories, and put them somewhere, as well as a list of technical / planning tasks that don’t have direct Customer value that I’ll address as necessary to complete the stories effectively. I’ll ditch the concepts of iteration and releases, though: every story will be really short and lead to a release, so there’s no room for additional layers. Most of the Planning Game will go away. (I don’t think I’ll bother estimating my stories, either: I’ll just have a note as to whether or not I think it’s necessary to split them before implementing them.) No Pair Programming, obviously. Not much in the way of measurement artifacts, but I will make my list of completed stories available, with dates. And I’ll add a dbcdb category to this blog, so that I’ll feel embarrassed if I don’t work on this project enough to create posts that justify that category.

Hopefully I’ll implement the first story this weekend; if not, then next weekend. I’ll also try to get a few dozen initial stories written up over the next week or so. I’ve put up the list of motivations already; right now, it only contains information that’s in this post, but as I learn about more technologies (or stop caring about technologies), I’ll update it as appropriate.

stopped-up sink

August 25th, 2005

In our house, as in apartments that we’ve lived in, sinks periodically get clogged up. If the drain plug gizmo (what is the name for those things?) is removable, we try removing it and seeing if we can get stuff out of there, but in the last few places we’ve lived, they haven’t been. (There must be a way to remove the ones that don’t just pull out, but I don’t know what it is.)

So we use Drano. And then we use Drano a second time, because the first time never helps. If we’re lucky, the second time works.

But the second time didn’t work too well the last time we had to unplug the upstairs sink, so it got clogged again pretty quickly. Liesl got sick of this last night, and the plunger happened to be up there; so she used the plunger on the sink. Which worked great!

The question here is: why did it take us so long to think of trying this? How did we get this mental block where the plunger is the obvious thing to try for a stopped-up toilet, but we’d never thought of trying it for a stopped-up sink? Sigh. At least now we know.

pinkwaters

August 22nd, 2005

In grad school, Jordan introduced me to Daniel Pinkwater’s books. And they’re great! Well, many of them are great, and almost all of them are at least entertaining. (He’s written a lot of books.) For an introduction, I highly recommend 5 Novels; Jordan will be peeved if I don’t mention Lizard Music, and among his most recent work, I can not praise Bongo Larry highly enough.

But he writes enough books that I don’t feel compelled to go out and buy all of them. So, over the last year or two, I’ve been going through my local library’s collection of his books. (Of which they have most, but not all.) Eventually, though I ran out of his books. But right next to them were two books by Jill Pinkwater, his wife. (And illustrator of many of his books, though he actually illustrated his own early books.)

And they’re really good, too! Both Pinkwaters’ writings have quite a bit in common: very funny, in a world where things that we would consider surreal are quite commonplace, about people who would be considered social misfits in our world. In Jill Pinkwater’s books, some of their social misfit status leaks into the books: it’s quickly overcome in Buffalo Brenda (which I could imagine is a Daniel Pinkwater book), but Tails of the Bronx is a good deal more serious. Looking through Amazon, I see a few more (Cloud Horse, The Disappearance of Sister Perfect, Mr. Fred, a boring-looking cookbook). I don’t think my library has copies, but that’s what interlibrary loan is for…

paris arcades

August 21st, 2005

The Arcades Project has been sitting on my to-read shelf for a year or so. (I’ve finally started reading it, about which more later.) One thing that’s been bothering me since I heard about the book, though: I’ve been to Paris several times, and I don’t recall ever seeing an arcade there! Have they all disappeared, were there only a few to begin with, am I blind, or what? I have fond memories of arcades in Cleveland (though the terminology {a,be}mused me when I was younger), I bought a copy of The Wombles at a store in an arcade in London (why are those books out of print? Legions of loyal British readers, have the wombles passed out of the country’s imagination, were they ever popular?), but in Paris, nada.

It’s certainly possible that I’m forgetting having seen arcades in past trips to Paris; we did walk through one on this trip. Cour du Commerce St. Andre, the map suggests. Right near Le Procope, a centuries-old restaurant famous to us for a pasta recipe named after it (I should post that one of these months), where we had a quite nice meal, with quite good mozzarella (not as good at at La Ferme des Mathurins, but that’s hardly a pan) and a lovely muscat wine.

Anyways, fairly early on in the book there’s a quote on the matter saying

The most important of them are grouped in an area bounded by the Rue Croix-des-Petits-Champs to the south, the Rue de la Grange Bateliere to the north, the Boulevard de Sebastopol to the east, and the Rue Ventadour to the west.

So I pulled out my best-beloved map, and looked it up. After some amount of puzzlement (starting from the fact that Rue Croix-des-Petits-Champs runs north-south, so listing it as the southern boundary seems a bit quixotic), I found the area in question; and right there on the map, running through Rue de la Grange Bateliere, we see some streets bounded by dotted lines: arcades! Looking around, there are, in fact, several “streets” on the map that either are bounded by dotted lines or a sort of dashed lines; the legend says the former are tunnels while the latter are arches (“Passages sous voute”, which doesn’t mean anything to me); the next time I go back, I’ll have to figure out what the distinction is. Maybe the tunnels don’t have glass ceilings, and hence aren’t true arcades? (The one I did see in person is marked as an arch, and it did have a glass ceiling.)

Actually, it turns out that there’s more to be learned from that map, even though I’ve looked at it hundreds of times. A little further southeast, for example, I found some streets outlined in red, between the Forum des Halles and the Pompidou center; the legend confirms the obvious guess, that they are pedestrian streets. With another clump in the Quartier Latin near the river, near where we stayed this time and home to lots of indifferent restaurants and a lovely little artistic knick-knack/sculpture/toy store called Pays de Poche, at 73 Rue Galande. Are there any other clumps that I don’t know about? I didn’t see any after a cursory glimpse.

Returning to that clump of arcades on the map, my first reaction was that it’s in an area I’m not that familiar with, so no surprise that I wasn’t aware of Parisian arcades. Except that even that isn’t true: the time before last, we stayed in a hotel right near (maybe even on? I’m embarrassed to say I can’t remember) Rue de la Grange Bateliere, so we must have walked right past these arcades (/tunnels) dozens of times. Sigh.

And it must be true that some of the arcades have disappeared: apparently the Passage de l’Opera was destroyed to make way for Boulevard Haussmann, and just north of that are some department stores which may be located where arcades once were. (Or may not; maybe I’ll learn that later in the book.)

I should look and see what Christopher Alexander has to say on the subject. Arcades bring together a few nice ideas: pedestrian thoroughfares through buildings, that (like streets) have destinations (e.g. shops) on them, and that have glass ceilings. All of which are fine ideas. In the building where my father works (Kettering, at Oberlin College), there’s a pedestrian thoroughfare cutting right through it, but it really does serve just as a tunnel, with a normal ceiling and only a few doors on the sides. In Harvard Square, there’s a building I used to walk through quite frequently (Holyoke Center? I can’t quite remember what it’s called) that does have many useful doors (including shops) adjoining it. I don’t think it had a glass ceiling, though (which Google satellite maps seems to confirm), but it had a high enough ceiling that it gave much the same effect. For that matter, the Science Center also fits those criteria fairly well (and it does have a glass ceiling); it opens up in a way a street doesn’t, however, so there are fewer doors opening off of its main thoroughfare.

And Paris has adopted the “glass ceiling” idea to stunning effect the last few decades. (Side note: Google maps doesn’t cover France! How lame!) The Musee d’Orsay is one of my favorite buildings in the whole world. I can’t say that I’m all that thrilled by either the Louvre’s pyramids or the architecture of the area underneath it, but the glass ceiling does make it a wonderfully open area, and it’s a lot nicer than the courtyard above it. And the enclosed sculpture garden on the north side of the Louvre is my favorite part of the museum (at least architecturally speaking, though I enjoy it artistically speaking as well).

I should start noticing courtyards more, and figuring out what differentiates ones I like from ones I don’t like.

gran turismo 4

August 19th, 2005

Gran Turismo 4 is the first of that storied series that I’ve played. It’s almost the only driving game that I’ve played this generation (the exceptions being the forgettable F-Zero GX and a few rounds of Mario Kart with friends): I got pretty burned out on driving games last generation, and I needed some time off from them. I enjoyed driving games at the start of last generation: Extreme G was actually the first Nintendo 64 game I bought (admittedly, only because all the games I actually wanted were temporarily unavailable), about which I have no regrets, and Wave Race was quite nice, if not the crown jewel that it is frequently claimed to be. But it took me a little while to notice that IGN kept on giving 9 ratings to racing games that were at best good executions of a genre not known for innovations; by the time I figured that out, I’d lost my taste for driving games.

And GT4 was a good for my one driving game of this generation. I have no idea how they got graphics like that out of a PS2. The physics model seems better than in other driving games I’ve played: it’s the first game I’ve played that modeled drafting, for example. And I learned a lot more about driving from this game than from other games: in less realistic games, you just have to memorize the course and keep control at completely unrealistic speeds, and in other more realistic games I’ve played, I still succeeded by sticking to the insides of corners and braking enough to stop myself from skidding. But my approach to cornering (and in particular to using the whole width of the track) had to completely change when playing GT4, and honestly I still feel like I’ve only scratched the surface there. It helped that they had a nice set of graduated lessons in the form of driving tests to hone your skills.

Some parts of the game play didn’t work so well, though. The way a racing game traditionally progresses is as follows: you start off on easy tracks against bad computer opponents. After getting used to the game and the track, you win; you move on to harder-tracks and/or harder opponents. You frequently get some sort of better car as a side effect of winning; that, combined with your increased skills, mean that the new difficulties are enjoyable but surmountable.

This is cliched, perhaps, but not because it’s a bad idea: driving games by their nature give you a limited design space to play in, and there are only so many ways to get a good difficulty gradient in that design space. The GT series, however, is somewhat famous for ways in which it tries to enlarge the design space: it has lots and lots of cars and lots and lots of tracks (most real-world, some fictional). Which is quite impressive; it doesn’t push my particular buttons, but I acknowledge that it’s a significant accomplishment.

The thing is, though, it makes your progress through the game a good deal less linear. Your choices in cars and tracks start off somewhat restricted (by your budget and lack of driving licenses), but even at the beginning you have many choices, and the number only grows. There are many ways that a player can approach this; I decided to treat it mostly like a normal driving game, and start by playing the first designated beginners’ race.

This was fun: with the only car that I could afford and my initial incompetence and ignorance, I didn’t do well in the races at first. But as I learned the tracks and got better at driving, I placed higher, earned more money from my finishes, was able to upgrade my car (the game has a certain RPG-ish aspect), and with a combination of better skills and better car, was able to win that circuit.

So far, so good; what’s next? There were multiple next-level beginner’s courses (for the different engine positions that your car could have); I picked the one that matched my car’s engine. Like the previous circuit, it started out badly, but started to get better. The thing is, though, it didn’t get better very quickly; some of that could be blamed to my skills (though I don’t think I’m any worse at this sort of thing than your average video game player), but if half the field is pulling away from you on straightaways, ultimately you need to upgrade your car. And the fourth- and fifth- place money that I was earning wasn’t getting the job done fast enough.

So what was I supposed to do? I could have gone back to the easier circuit and earned more money from winning it again, but that would have been boring. So I looked around at other circuits; I found a “Japanese cars of the 90’s” one that I could enter, and surprisingly, it turned out that it was easier than the other circuit that I’d been going through, was in fact just at the right difficulty level for me.

So that was a good outcome; better if the game had made it easier for me to find an appropriate circuit to play, but at least I found one eventually. And with the prize money I got out of that, I was able to upgrade my car to an appropriate level to, with a bit more effort, win the previous circuit that I’d been trying.

The story doesn’t end there, however: when I won that Japanese circuit, I didn’t only get money, I got a car. You get all sorts of random cars when you win circuits; most of them are interesting for car collector geeks but useless for racing terms. This one, however, was very powerful. It had a different engine position than the car that I had been using, so I tried the second-tier beginner’s circuit that was appropriate to that engine type, and I found that I could blow away my opponents, even when driving very sloppily. Which is no fun, but what was I supposed to do? I suppose I could have tried to buy a worse car of that engine type, in an effort to get a reasonable challenge level, but that would have felt perverse; basically, that circuit was turned into a loss for me. And that wasn’t an isolated occurrence: that same car let me blow away several other races as well.

The story here wasn’t all bad: while I soon found an even more obscenely overpowered car that I could use to blow away more opponents, that mattered less in the higher circuits. What started to happen was that I would screw up on corners, allowing the other cars to gain a significant lead on me, which I would proceed to eliminate on the next straightaway, leaving us with a more or less level playing field. So to win the races, I had to memorize the courses, learn the appropriate speeds and locations to enter the corner, and execute correctly almost all the time. Classic good, challenging gameplay, in other words.

Ultimately, there’s a huge amount of depth to this game, and a lot of good gameplay to be found; I’m quite glad I bought it. The bad design of the player’s progression through the game is a serious flaw, however. Like several games I’ve played recently, I could have probably enjoyed playing this game for longer than I had, learning all of its intricacies, but given the breadth of video game choices that I have, I felt it was time to move on.

crayon shinchan

August 16th, 2005

I ran into a manga called Crayon Shinchan a few months ago; I used to be a bit embarrassed at how funny I found it, but I’ve given up on that, and just accepted that it makes me laugh out loud on a regular basis. (I mean that quite literally: I really do inadvertently laugh out loud a couple of times over the course of each volume.) It’s about a young boy (around six or so?), with a truly remarkable combination of innocence, bad behavior, and inappropriately adult remarks. The latter could be grating, but it works very well here.

It’s in an unusual format, at least based on my experience. I’m used to Japanese comics broken up into reasonably coherent episodes / stories that are tens of pages long, and to book-length Japanese comics. And I’m used to American comics in both of those formats, as well as newspaper-length individual strips. (I recently ran into a Japanese comic with more or less the latter format, Azumanga Daioh; is it common in Japan?) Crayon Shinchan, however, is divided up into three-page episodes. (Which are typically loosely connected into story arcs that are about 10-15 episodes long.) I’m not sure what to make of this, but it suits the mood of the comic; I don’t think it would hold up as well with longer stories, but three- or four-panel strips would be too short.

The variety of manga that’s available in the US these days is pretty impressive. I was at a Borders a week or two ago, and they actually had a rather better manga selection than the local comic book stores. I think part of the deal there is that the comic book stores skew fairly strongly towards male customers, while Borders doesn’t have that bias, and there are a lot of manga published in the US these days that are targeted towards teenage girls. (For that matter, I suspect that the Japan-oriented male youths of America don’t necessarily spend much time in comic book stores, either…) Some of which I read; I probably shouldn’t admit to liking Azumanga Daioh or Love Hina, but I do! (I guess it’s okay for me to admit to liking Banana Fish, though.) I’m sure that there’s still a vast amount of material that isn’t making it to the US, but three or five years ago I never would have dreamed at having access to the current range of material.