Have now written a perl script, gplize, that puts correctly commented copyright and gpl license onto the beginning of C, C++, Perl, or XSLT source files. This is in preparation for upcoming move of some of my projects onto savannah. My plan at this point is to release the KB, GameWork, and QC (the names may change), though of course I may get granular and break them apart by subsystem. For QC in particular I needed to write a solid set of tensor classes and these may merit their own separate project.
The cvs host search continues. I just discovered that Savannah is actually a lot bigger than I had previously thought, and includes a number of non-GNU projects thrown up by individuals. Apparently also Savannah is a fork of SourceForge 2.0 because it ceased to be free after that release. This means that it's going to be very similar; I wonder if the GNU people have added any support for moving and renaming things in the repository, one of the things that turned me off about SourceForge. I'll have to see.
Also there's Tigris, which seems smaller both in scope and in number of projects. There are only a handful of general purpose libraries here. I'm not sure if any of my projects would jive with those folks enough to get accepted; possibly the KnowledgeBase would.
Well work on GameWork (my discrete, deterministic game framework) proceedeth. A couple weeks ago I got Dots and Boxes implemented as a multiplayer game, to test my multiplayer version of minimax with alpha-beta pruning, with pretty good results. Because the branching factor is so big in that game (even though it's a dumb game) I added some heuristic move filtering functions that can you can override in your particular implementation. Also threw in a better cutoff mechanism: cutoff by the total number of game states to expand, rather than by lookahead depth, which insures something close to constant response time. If you go strictly by depth and have a fluctuating branching factor you are going to get fluctuating response time for your lookahead.
Have just implemented Mancala under GameWork. My previous implementations carried a lot of overhead because they saved off the board before every lookahead call rather than using a doMove/undoMove strategy. undoMove for Mancala was actually quite tricky. I ended up saving off a small portion of the game state anyway before each lookahead; otherwise it would have been impossible to figure out who the previous player was, or to undo a capture.
Another complication unique to Mancala is that a single move consists of a lot of smaller moves that pick up stones, drop individual stones, perform the capture, etc. Just showing the user the before and after makes it pretty hard to tell what just happened. So I had to figure out a way to break it into smaller steps, but keep the impact on doMove low, so that it wasn't totally polluted with "stepping" code. My solution was to incorporate into the board the concept of a "hand" that is positioned over a well and can be holding some number of stones--it's kind of like a cursor I guess. There are functions that manipulate the hand by telling it to pick up stones, drop one stone, perform a capture, move to the next well, etc. and using these had the nice effect of making doMove cleaner. Of course the real benefit was that along the way the Game class could simply take snapshots of the board, including hand position, and then the GUI could iterate through this play-by-play list later to render it.
As I type this though I'm starting to think an even better way to do this would be to write a stepMove function, with doMove acting as a wrapper around it. That way no space would have to be devoted to the snapshots; they would exist in time instead. This however would break the symmetry between doMove and undoMove so maybe it's more of a toss-up.
Client-side anything on the web is nasty, I just confirmed that for myself for the zillionth time the other day when trying to get the weather feed on the world has turned up and running. My original idea was to do a quick and dirty xsl transformation with javascript and then document.write it. But apparently IE's security settings prevent you from calling xmldom.load on offsite URL's (or if there was a solution to this problem it was obscure). So I just went for a very small perl script that fetches the xml doc via LWP::UserAgent, crontabbed it at 20 min intervals, and then had another perl script called by an SSI perform the transformation.
A common pitfall in software development is to assume that your component is going to be the top-level component, or that a top-level build target will always remain that way. Putting too much code in main(), writing manager classes that do not expose enough of their functionality to clients, not structuring your source tree so that essential functionality can be compiled as a library and linked against, and letting interface code seep into lower level classes are examples of this. A system which doesn't necessarily need to be on top of things, on the other hand, can someday become a subsystem. This is the key to scalability.
Probably the first order of business here is to find a CVS host for my projects. I tell ya I'd like to use SourceForge but, for security reasons, they keep you outta your own repository on the server side. There are certain tasks you need repository access for because CVS is so old and cranky--particularly, moving around files without losing history, reorganizing the directory structure, deleting dangling internal locks, etc.
The problem is that this host must be solid, i.e. sit on the same domain name for about the next ten years. As much as I'm moving around I can't really be a server (though I've been running CVS on my freebsd box for a while now). So I guess the search begins.
Well here we go. I've been meaning to start a blog where I can blab about technical stuff when I need to and this is it. It's going to be a sort of developer's journal, and will include info about my current projects, ideas for future projects, gripes, muscle-flexing, pet peeves, cool things I figure out, whatever.
It will not mention anything going on in my real life (though there is some debate as to which is which); that's what the world has turned is for.