Saturday, August 25, 2012

Constructing a library of microcomputer software

This has been a silent space for the past little while.  It's not another case of "blog starts, ten minutes pass, blog ends," but rather waiting on formal approval for making some software freely distributable.

In the meantime, I've returned to contemplating how best to construct my dream project: a digital library of all things from the days of microcomputing past, with a particular emphasis on amateur content and making it maximally possible to examine and actually run the programs in the collection.

Of course, there are a great many projects and archives out there with overlapping aims, notably TOSEC.  There are a few things that I find dissatisfying about these in general: lack of meta-information, limited searchability, emphasis on commercial releases, and not much in the way of source code or encouraging further development.  Rather than being mostly a huge collection of old games you might like to replay, I'd like a retrocomputing library to put items in a cultural context and encourage interaction with them -- even foster continued development.

This has been a bee in my brainsteam for a number of years, and along the way I've tried out some great open source or freely redistributable digital library packages out, chief among them being FedoraCommons and Greenstone.  There are a couple of reasons why they miss the mark for me for a project like this:

  1. Metadata construction: There are a lot of items to categorize, and I find that existing system tend to have a large cost (time cost per item) associated with the metadata.  Some of it is the cognitive load of trying to pound square pegs into a round hole (especially true of MARC, Dublin Core, and the like), and some of it is interface sluggishness.  To minimize time per item, I need a flexible, loosely-defined format that I can manipulate in a text editor.
  2. Item transformations: The core of the library I envision would be to transform the stored items in various ways.  Suppose the item in question is a game program written in Commodore BASIC.  The library interface ought to be able to give you that program as a disk image, tape image, binary file, text listing, pretty-printed text listing, or possibly even loaded up into an in-browser emulator.  While Fedora has provisions for this sort of thing, I need some flexibility of implementation.
  3. Auto-indexing: Another core feature that I'm after is the ability to harvest indexing data directly from software items.  As a basic principle, if a string appears on the screen in the course of a game, it ought to be discoverable using that string -- ditto with code snippets, graphic assets, etc.
  4. Schema changes: As a system like this develops, I can expect the metadata to change in format and capabilities a number of times as I discover what's really important, aspects that I'd overlooked, and so forth.  When that happens to a system built on top of a fully normalized relational database, the results tend to be a mass of awkward bandaids or painful rewrites.
As a result of these, I'm strongly drawn to a homegrown NoSQL approach built around protocol buffers and BigTable (or the like).  There's a well-defined text representation of protocol buffers, and they're designed especially for the purpose of extending them while maintaining backward compatibility with existing data.  Dropping a SQL representation of the data allows me to think more easily in terms of a distributed hosting model -- and while the data will be noisier and less compact, I'd rather have that than constantly fight with a rigid schema that doesn't quite fit the item at hand.

(I also have to admit that as a professional developer, I'm drawn to solutions that involve me building things, and I'm a fan of these technologies in part because they're a big part of my day-to-day programming life.)

At this point, I've got a draft of some initial proto buffer definitions for metadata, and I'm going to begin trying to organize some items to see whether it's fast and expressive enough to build a library around.  With luck, my next  post will share those definitions...

No comments:

Post a Comment