I’ve been playing around with the latest version of Elgg, which is 1.6.1 but it became a little too difficult to keep up with conversations on group discussions and blogs, so I wrote a plugin to do it, BlogWatch. When you install it, you get a Subscribe button on a blog page as well as on a group discussion page:

(more…)
I’ve always wondered how to do that really groovy opening of a new browser window, where the background window is greyed out. Well, I just found out, courtesy of Thickbox.
To add the functionality to the blog, I added this to the header.php of the current style:
<script type="text/javascript" src="/thickbox/jquery-latest.pack.js"></script>
<script type="text/javascript" src="/thickbox/thickbox.js"></script>
<style type="text/css" media="all">
@import "/thickbox/thickbox.css";
</style> (more...)
I’ve been porting blog notifications from Elgg 0.9.2 to 1.6 and so needed to craft a domain model for it. Plumping for a new BlogWatch class with a subscribers “attribute” seemed the way to go:
class BlogWatch extends ElggEntity {
The first thing to contend with is when you create a new class:
$blog_watch = new BlogWatch();
the system calls the load() method for you. However, when you get an existing class via:
$blog_watch_objects = get_entities_from_metadata("watched_guid", $blog_guid);
it doesn’t. (more…)
Middleware Developer
Wins User Interface Prize
How’s that for a headline? Yes indeed, I won third prize in the JISC MOSAIC developer competition, for my course book finder/reading list application:
iLib, The Course Book Finder (more…)
You know what it’s like. The fan is clogged, agile has gone out the window, the phone is ringing off the hook. “Where is that feature?, you’d better have it ready or else… Our users don’t give a hoot about Agile this, XP that, I just need that feature NOW!”. The mess filters down the teflon chain until it lands with a wet slap on your head. Well, next time it happens, read these wise words before you do your rounds of your fellow developers. Combined with Hanlon’s Razor, a mug of strong real coffee and a world weary expression, you have a small toolkit to deal with most situations.
I’ve been working on a messaging system using Apache ActiveMQ embedded in Apache Camel, exposing JMS and Stomp topics that applications can use to provision themselves. As it’s basically a view of digital reality in how it relates to account creation, I decided to call it The Matrix. I’ve already plugged ActiveDirectory into it using GADfly and now Blackboard has a Head Plug. It’s a Building Block I developed that pulls from its own topic in The Matrix and the control page is Shibboleth enabled using Guanxi. Access is determined by the value of your urn:mace:dir:attribute-def:eduPersonEntitlement attribute. The control page lets you start and stop the topic consumer as well as troubleshoot and get diagnostic reports, once I’ve done that bit.
It’s nice to see the original concept coming together. Shibboleth, Messaging, Provisioning and a plethora of programming languages. It’s been a real journey to get this point, plugging two high profile systems into The Matrix.
I’ve been working on a Blackboard Building Block to automatically create users and enroll them on courses, driven via an Apache Camel/ActiveMQ messaging broker, so I wanted a way to start and stop the client, which is inside the block. As this isn’t course specific, I decided to expose a control page on the block and put Guanxi in front of it to Shibboleth enable the authentication to the block. It was simplicity itself. I added the Guard stuff to web.xml and the Guard to the pom, registered the new Guard with the Engine and IdP, rebuilt and installed the block and the WAYF kicked in when I went to the control page.
The problems started when the Engine POSTed the SAML to the Guard inside the block:
Guard ACS connection error
Server returned HTTP response code: 500 for URL: ... guard.guanxiGuardACS
Much toing and froing later, inpsecting content lengths, parameter maps, java security permissions, tomcat logs, apache logs, IIS logs, Windows firewall, I eventually found the problem. To make sure I added a call to request.getParameterMap() in the Guard, which reproduced the problem I was seeing from within Blackboard. As soon as anything and I mean absolutely anything, calls methods on the request, it invalidates the InputStream, which doesn’t support reset. So the data is lost for ever.
Well, not quite. It’s in as a request parameter but the Engine was explicitly saving a SAML stream down the pipe, resulting in this weird parameter setup:

(more…)
I have a bit of a problem with “cross platform” development at the moment. I’m running Windows XP inside an ActiveDirectory forest using VMware Fusion from OSX. A nasty experience a while ago means writing code on a virtual machine’s hard disk is insanity itself. If something happens to the slice you lose everything. OK, you won’t if it’s in source control but using subversion or git from Windows is a pain. Also, why duplicate backup/vss options on a slice when I’m already using everything just fine from OSX? So instead, I develop via a shared folder. I write all the C# code via VisualStudio which points to the “network” share.

(more…)