One of my spare-time projects is building an mp3 stereo appliance for home. (The trouble with having spare-time projects when you're a professor is that you don't have any spare time.) It's based on a cheap(ish) set-top box that runs Linux on a Pentium-compatible embedded processor. This unit is responsible for actually playing the MP3 files, which are actually stored on a different machine and accessed across the network. It uses a relational database that describes what MP3 files are available.
Since the set-top box doesn't have any user interface components, I want to have a remote interface that will let me control the device from my laptop with a wireless network card. The web site should let me do various things:
This project is to design an interface that will do these things. Assume the exististence of an MP3-player interface and a database (using JDBC) that stores the MP3 information (we can mock these up).
Digital cameras are great. They're small, easy to handle, and, since they eliminate processing costs, they make it easier to take lots of pictures. The trouble is what to do with them once you've got them. My camera dumps its photos in files with names like IMG_0123.JPG. This makes it very hard to identify images, figure out which ones I want to see, and so on. I can process these into albums on the web, but that's also complicated since I may want to use some images in multiple albums, some in none, and so on.
The goal of this project is to develop a system for managing digital photo collections.
We're used to using full-text searching on the web at search sites like Google. Full-text searching allows you to do two things. First, it lets you search through large text collections for phrases or individual words. Second, it lets you search by similarity -- to find documents that contain content similar to a sample document, for instance.
Search engines are a limited way to use full-text indexing, though. First, they search only web content, rather than your own files, email archives, etc. Second, they require you to explicitly form queries for searches (which is often hard to do). Third, they require that you stop what you're doing to go to the search page and initiate a search. We could imagine various other ways to make use of full-text search, though. Imagine browsing the web and having a "helper window" that always displays links to other pages similar to the one you're looking at right now, updated automatically as you browse. Or an email system that automatically clusters email messages by similarity or allows you to search by similarity.
I have a set of Java classes for a fast, high-quality full-text indexing engine. Come up with some ways to integrate this into tasks that traditional search engines don't support. (Note: the Java search engine will work over archives that we have (e.g. email, text documents) but not over web content. However, you could instead put something together that wraps Google searches in Java if you need to get access to web content searches.)
Build an interface for clients of an online dating service.
There are obvious, straight-forward and boring ways to do this, which essentially reduce to simple database lookup. (Yawn.) There are also interesting and different ways to do this, which might involve automatic notifications, hotlists, automatic chatrooms, and all sorts of other things. You'll also need to be aware of the privacy issues, and how to balance information disclosure and protection.
Going on a foreign trip involves a lot of planning and lining up a lot of informatio you'll need while you're there -- itineraries, transit schedules, hotel and contact information and more. While you're on the trip, too, you generate a lot of information -- photos, diary entries, reports and so on.
Imagine a system to help people organize their foreign trips. It has multiple components. Before you leave, it helps you plan your trip, collect information you might need about sights and about practical matters like hotels and transport. Once the trip is planned, the information is all downloaded into some convenient form, perhaps a PDA. Once you're on the trip, you use the PDA both to access this information and to keep a diary of your trip. Periodically, you link the PDA to a PC to upload your trip diary to a web page where your friends and family back home can track your progress.
Note: This project is potentially a lot larger than the others. You should probably talk to me about focussing on one part of it, or splitting it between two groups.
There's a lot of information to keep track of when running a class -- who's registered (which changes over the course of the class), email messages from students, TAs and staff, homework assignments, lecture materials, and grades for different parts of the class. At the end of the quarter, final scores have to be calculated, curves drawn and grades assigned.
Like most people, I do this with a combination of tools -- email, web pages, my own files, and an Excel spreadsheet. These are all very general tools, and not specialised to the task at hand, so sometimes it's a complex business figuring out how each tool should be used and how to make them all work together.
Design a "professor's assistant" which can handle all of these functions in an integrated manner.
Most people learn the imperative, procedural aspects of programming first. When they first encounter the object-oriented model, they have a hard time understanding what's going on. This can be even harder in languages like Java which, by running over a virtual machine, abstract away even further from people's intuitive models of the hardware/software interface.
One way to help people deal with these problems is to provide them with a visualisation of what's going on inside the JVM as it runs their programs. This is rather like what an execution monitor or profiler would do, collecting statistics about the behaviour of programs, except that it should run in real time alongside the program. Imagine a window that gives you a graphical depiction of message sends, object counts, instance creation rates, memory usage, stack depth, garbage collection, and so on. As your program runs, this visualisation gives you a way of seeing what's going on.
This project will take an existing JVM implementation and augmented it with facilities that allow it to visualise running Java programs, to allow people to better understand and tune their code.
Note: This is a very open-ended project. You're going to have to focus on some particular issues. It's also very hard to prototype, which is dangerous. And finally, it depends on being able to find a good, hackable JVM to work which (I'm working on this). On the other hand, the potential pay-off is high if you can do it right.
Right now, I'm working on a large grant proposal. There are around 10 faculty and 2 staff activity working on preparing this document, writing various sections, commenting, organising material, etc. One person maintains a web site where each of the sections is held, with information about who has "checked out" each part of the document (just informally, there's no version management system underneath). This requires a lot of human intervention to keep the web site up to date, to manage versions, to periodically "build" a complete document for reference purposes, etc.
Build a system to automate this. Startby figuring out what tasks people want to perform with a system. Remember, this isn't just for a single user, but for many people collaborating. What sorts of problems might emerge? How can their work be coordinated? Then put together a system that makes it easier for us to all work together.