We're heading into the last few weeks of term, and project deadlines are looming. Well, not quite looming (this term's projects for postgraduates all have to be handed in during the first week of next term), but I'm off to San Francisco with Kate for a couple of weeks of holiday over Easter, and I want to get as much as I can out of the way before then.
- An Enterprise Java Beans app for Web Applications and Services; pretty dull stuff; I've never really done any larger-scale EJB before and there's not a lot of room for going off-piste in this project, it's a set thing we just have to make;
- For Pervasive Computing, I'm planning to build on the work I was doing with morse code transmission over LEDs and light sensors, and do an exploration of how to optimise the performance of said transmission without getting into error-correcting codes or statistical language models: just sticking to the hardware and sensor properties, and seeing what can be done at a low level. This'll be fun, because I'm pretty ignorant about hardware;
- Adaptive Systems is the real doozy: I'm looking at the "information ecosystem" which Bret Victor describes in his lovely Magic Ink paper. It's a structure he proposes for having software react to the end-user's context: different applications propose topics of interest to a platform which offers these topics to content providers (e.g. a restaurant recommender), filters the responses, and uses them to inform graphic design. So, if you were emailing a friend about pizza and switch to your maps app, you might find pizza restaurants to be subtly highlighted. The nice thing about this architecture is that it allows for a range of content providers or applications to plug into it, without knowing anything about one another. I couldn't find anyone who's done anything along these lines, and Bret doesn't know either… so it felt worth playing with.
To fit within the remit of an Adaptive Systems project, I'm going to model the feedback mechanisms between the maps app, platform, and topic providers: the system should learn over time, building an understanding of what an individual user finds useful or useless, by taking into account what they click on, what they ignore, and what they express active disinterest in. Oh, and after 3 years of promising myself I'd learn functional programming, I'm finally getting stuck into Clojure, which I'm using for this project.
I also have a suspicion that I'm going to return to superoptimisation for my dissertation project next term. Every 5 or so years someone seems to wander across the topic and build a new superoptimiser for a specific hardware architecture, which is then obsolete within a few years. I'm thinking of building one for the Java virtual machine: something that could be open-sourced for other people to work on in future (to add fitness functions, better equivalence testing, better strategies for cutting down the search space), as well as being useful today.
I haven't gone much further than that with a plan; I'd likely start out optimising pure static functions only, possible just those with primitives for input and output. I'm thinking that Clojure might be a good choice for this project: it'd let me load generated byte code in-process, parallelises nicely (handy when it comes to testing large numbers of candidate byte code sequences) and a functional language could be handy for managing equivalence tests.
I'm still talking to a couple of folks about other possible projects, but that's looking likeliest right now; and so I've borrowed a hefty tome on the JVM which I'll be padding through over the next few weeks.