Older blog entries for deven (starting at number 35)


While it's still beta, I'm getting closer to a stable 1.0.0 release, which is my goal before adding any big new features. I hope to have 0-2 more beta releases followed by 1-2 release candidates before declaring a "stable" release. (On general principle, my plan is to have the stable release be identical to the last release candidate.)

We're fast approaching November 30, which will be the 10-year anniversary of the codebase, and the 1-year anniversary of the public release of the code. I'd love to be able to release 1.0.0 on that date, but I'll have to hurry if I want to do that. (It would also require releases almost daily...) Maybe it's too late to make that deadline, but I can try.

For the most part, the autoconf/automake integration is done. I still need to make a few little adjustments, but it's coming along nicely. I released 1.0.0.beta.6 early yesterday morning (late Wednesday night) with the autoconf support, and early this morning (late last night), I released 1.0.0.beta.7 to clean up GCC-specific options, and to automatically use -DFD_SETSIZE=256 on Cygwin.

I still need to work on an RPM spec file, so I can distribute an RPM of the server for easy installation. Maybe I'll look into other binary packaging possibilities, but I'm not sure how far I want to go in that direction...

I'm still looking for beta sites, so if anyone is interested in running one, please email me!

I've not been keeping up with these diary entries, but that's hardly a surprise. I never seem to find the time...


I've had several beta releases so far, each of which causes a surge of mild interest from the Freshmeat announcement, but I'm still looking for people to run Gangplank sites and use them, or at least help refine the process of getting the system up and running.

I've improved the portability of the system in the last few releases, and the last release works on most Linux systems, several BSD variants (including Mac OS X), Solaris and Cygwin under Win32. Generally, porting to a new Unix variant has been fairly straightforward.

Currently, I'm in the process of integrating autoconf into Gangplank. This should improve portability even more, and simplify compile-time configuration of the default port number and guest access, which previously required the adminstrator to modify the relevant source code. I still need to work on installation-path issues, and consider whether to add code to support setuid operation. I'm also trying to clean up the build process and simplify the release process.

I figure I'm about 80-90% done with this release, but I've probably still got 3-5 hours of work left to do, when I can find the time. I'd also like to create an RPM spec file, but that may end up waiting for the next release.

Gangplank isn't ready for a "stable" release yet, but adding autoconf support was one of the milestones I wanted to reach first. I hope the releases will move from betas to release candidates within the next few releases, but I still need to improve the documentation and try to clean up a few more loose ends first...


I was so focused on getting the initial release out the door that I plum forgot the most important thing! I forgot to test the release! Damn thing didn't even compile. D'oh!

The reason is simple; there was a class named Assoc which implemented hashes (which used to be better known as "associative arrays", hence the Assoc name). Before the release, I decided I should rename the class to Hash to avoid confusion in terminology. I fixed all occurences of "Assoc" of course -- but I failed to notice that there was a Hash() function in the class. It was a private class method used for the hash function, but of course the C++ compiler thought it was a constructor, since I inadvertantly created that collision. I've fixed it now, renaming the Hash() method to HashFunction() to remove the conflict. Unfortunately, this makes the initial release a "brown paper bag" release -- not an auspicious start. *sigh*

This underscores the exact reason why I released it as a beta version (1.0.0.beta.1) instead of as a stable release (1.0.0) -- I didn't want any stable release to ever have a dumb mistake like this in it, so I decided that by policy, a stable release would always be identical to a development release, except for the version number.

There have been several serious bugs in the Linux kernel "stable" series which slipped through because untested code was added to the "stable" release. I wanted to avoid that. And I did -- even though the basic codebase is very stable, there were changes in the released version from the tested-but-unreleased version. Most of the changes were in the comments at the start of the files, but some involved actual code changes. Simple ones (like renaming some source files, occurrences of the system name, Assoc->Hash, etc.) but obviously not completely immune to error.

I guess I've proven the value of my stable release policy, but I wish I had been alert enough to remember to build and test the server before posting the release. Oh well. The new release (1.0.0.beta.2) does compile and run correctly. I tested it this time.

I still need to write more documentation, of course...


Well, I finally managed to put together the initial release for Gangplank. A basic homepage is online along with the initial tarball. I've created an Advogato project page, and submitted the information for a Freshmeat project page, but that hasn't been processed just yet. If anyone gives it a try, please let me know in email, since I may not notice diary entries...

Life is always so busy, but the driving impetus to finish it today (well, yesterday now that it's past midnight) was because original development of the code started 9 years ago today, on November 30, 1992. (Well, I released it on November 30; I didn't get around to dealing with Advogato and Freshmeat until after midnight, so nobody heard of it on the day of release!)

In the end, I decided to abandon the complex versioning scheme that I worked so hard on -- it was all-numeric, and required too much knowledge of what significance different numbers had. I've discussed this with others, and came to the conclusion that I'll use all-numeric version numbers for stable releases only, and always have alpha characters in development/test releases to differentiate them and allow for complex yet comprehensible information in the version number (ok, string). The initial release is 1.0.0.beta.1 -- eventually, 1.0.0 will follow (a stable release) as a re-release of a 1.0.0.beta.x release.

I still have a lot of documentation I need to write, but I get tired just thinking about the scope of that task! I'll have to get to it before I'll be willing to declare a 1.0.0 stable release, however...


My former employer laid off 30 employees yesterday (including most of upper management!), including the one (geoffeg) who I've kept most in contact with since I left in March 2000. He's now looking for a job at a time when they're much harder to find than they used to be...

Egads. My certification is back to "Journeyer". How confusing. Oh well; as long as it's not "Observer", I don't really care what it says.

I've had a busy month for various reasons, and was out of town for a while, so I haven't made any progress on getting together an initial release of Gangplank. I'm still a little unsure how I'm going to handle the release version numbering, and I hate the idea of changing the versions after the initial release. I'd much prefer to nail down the scheme I'm going to use first, but I keep dithering on it.

In any case, I'd better get back to this soon...

A long day, and no progress today. Had to take the dog to the vet, which took a couple hours, then the search for food even took another hour. No time to do anything useful tonight...


Well, I was hoping to get a release together in time for the nice simple release date of August 1, but it didn't work out that way. It's taken more effort than I expected. Oh well, so much for nice simple dates!

I've wasted too much time contemplating version numbering schemes, for one thing. I've come up with a scheme that I think would be neat for the Linux kernel, but it's serious overkill for my project. Nevertheless, I'm gonna use it anyway. Something's gotta be the guinea pig! I've got a good description written up for it now; it's amazing how many hours this part alone took... (I'm sure it's too complex for my own good, but I wanted to give it a try.)

I still need to review the code to make sure I don't release anything overly brain-damaged to the world. I have a couple known kludges that I'm considering trying to clean up before the release, such as having the help text hardcoded into strings in the executable! There was a good reason for this; I've been extremely wary of the possibility of blocking file I/O, since the server is single-threaded. However, there's nothing to stop me from reading it in during the server initialization code (except lack of Round Tuits). It would be cleaner that way...

And there are the more mundane things, like renaming the system internally, stripping old RCS log messages from the source code (should I keep using $Log$, I wonder?) and applying the QPL license to each module. (Yes, I'm starting with the QPL, at least for now.)

Then there's documentation, of course. The only documentation that I have at the moment is the description of the versioning system, which turned out to be fairly difficult to write up in any sort of comprehensible fashion. (It's hard enough to read now, but the earlier drafts were much worse.) I still need to write at least some basic documentation. (A code overview would be nice too.)

And I haven't even gotten as far as worrying about things like CVS, a web site, mailing lists, or any other auxiliary things. I'm just trying to come up with the initial tarball! *sigh*

I suppose this was inevitable; the project is nearly nine years old, and I never really expected it to be easy to put together a clean release archive. But I wish it were easy, all the same!


I still haven't had a chance to work on this initial release, largely because my grandmother is here from out of town. Besides, I've concluded that I shouldn't post it today, even if I had it ready by now. I'm going to be out of town from Monday morning through Friday afternoon, and I may not have Internet access. To be on the safe side, I'd rather not release it until I'm back, since I wouldn't want to appear unresponsive to anyone that might try to contact me about it!

I've been trying to get an initial release of "Gangplank" together for close to a week now, but it's been more complex than I expected. I need to review all the source files briefly to check for anything that shouldn't go out as is, change the name throughout the program, decide whether to fix a couple kludges before it's seen, try to write some basic documentation, etc. What a mess!

I'll probably try to minimize the initial work by making a pre-1.0 release first, and add documentation from there in later releases. Of course, I've got to decide even how to number the releases! While I could punt and do something typical, I've been thinking of ideas for complex-yet-informative version numbering. I was originally thinking in terms of the Linux kernel, but I figure it could be used for any project, so I might as well experiment on mine! (Of course, the numbering scheme I'm coming up with is so terribly complex that it's really only appropriate for a large, complex project, but what the hey...)

Well, I'll get there sooner or later here.

Lots of birthdays this week. Besides hacker on Monday, one of my best friends hada birthday on Tuesday, my wife's birthday was yesterday, and my brother's birthday is tomorrow! (Nobody that I can think of for today, though!)

hacker: Happy birthday!

26 older entries...

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!