My formal role on the Transforming Musicology project is Project Manager. This involves ensuring that goals are reached, objectives are met, and deliverables are, well, delivered. Two things seem to be key to these ends: maintaining a good and current overview of both high and low level project activity; and maintaining good communication across the whole project team.

Early on in the project, one of the co-investigators started an IkiWiki for us to use for various project management activities. Since then it's been my responsibility to develop this resource. Given that I've asserted that awareness of activity and communication are crucial for project management, how have I used the wiki to enable those?

We're using an IRC for part of our communication needs, although not all project team members are fully conversant in IRC and its idiosyncrasies. So I thought it would be useful to keep a log on the wiki. I already have a log file for the channel which is generated by dircproxy so I started looking for ways to get an HTML version of this onto the wiki. Nothing was immediately apparent. Stuff exists for generating HTML from channel logs, so I thought about scripting something to dump some HTML to somewhere accessible from the wiki which, in turn, lead me to thinking about automating it the proper IkiWiki way: with a plugin. And irclog was born.

It provides a directive, [[!irclog ]], which pulls a channel log from a given location, uses Parse::IRCLog to parse the log for \say and \me events, and renders those events as HTML to be included in place of the [[!irclog ]] in the page. The implementation involved adding dircproxy-specific parsing to Parse::IRCLog. (It would be nice to get that merged into Parse::IRCLog itself, but for now it's bundled with the plugin.) It also involved thinking up strategies for allowing the host on which the wiki is compiled to get at the channel log at compile time. I did this by allowing the location parameter to the [[!irclog ]] directive to be a string parsable by the core URI module and then implementing (well, not quite) handlers for a number of URI schemes. In fact, I've only really tested the scheme I'm actually using, ssh. In my case, the wiki compiling host holds an SSH key with a public part authorised on the dircproxy host to retrieve the log file. I then have cron on the wiki compiling host rebuild the wiki periodically to cause the log to be updated. (There might be a less sledge hammer-like solution to the updating problem: perhaps --rendering the page and moving the result to the $DEST_DIR?)

To make the plugin a bit more of an IkiWiki citizen, it allows inclusion of wikilinks by providing a text substitution feature. You can specify a keywords argument to the [[!irclog ]] directive which should contain a string formatted a bit like a Perl hash (e.g. richard=>[[richard]]) and which indicates that occurrences of the 'key' should be replaced by the 'value'. The replacement text could be a wikilink, thus allowing your IRC log to integrate with the rest of your wiki. The obvious usage (and the one I've implemented) is a mapping from nicks to project team members' user pages.

A future post may document how I'm using IkiWiki for task management...