Thursday, August 17, 2006

ENCM 599 Project Ideas

The first two projects would certainly require two semesters (and beyond); the last two might be small enough that I could make something useful in one semester.

1. A note taking program

This would be a word processor tailored to in-class note-taking on a laptop or tablet PC. This would be an experiment in making computer note-taking feasible and useful. Features could include:

- Diagram sandboxes - you could draw a diagram in a full-screen window, and when you're finished, the drawing would be shrunk down to a smaller size within the main document.
- Automatic tablemaking - making tables of data is time-consuming in a conventional word processor. Making use of the tab and space keys, my note-taking program could allow users to create and arrange tables on-the-fly without opening menus or dialog boxes.
- Minimizing the number of drawing tools by giving more than one capability to tools. For example, the basic freehand pen tool would normally just put ink on the screen. But if you draw in a particular fashion, other actions could happen instead:
- Scribble out text to erase it and place the text cursor in its place.
- When you click on a point, a dot is created on the screen (as you would expect from a freehand tool); but if you then begin to type, the dot is replaced with what you typed. In other words, the pen could also do cursor placement.
- Draw a freehand line from one margin to another to "rip" the virtual page in half. You could then drag the line to create new virtual paper.
- After you draw a line or circle something, you could run commands that change your action from drawing to something else, such as deleting or selecting. In other words, the program could support noun-verb interaction in addition to verb-noun interaction.
- Keyboard-based diagramming - diagrams could be drawn quickly with a keyboard.

I could come up with a great many ideas, but they won't all fit in a one- or two-semester project. I suppose I will have to decide whether I want to focus on laptop-based usage (keyboard bound) or tablet PC usage (pen bound).

2. Designing a computer language/compiler

I am not really happy with any existant language, so I would like to attempt my own design.

The main focus of the language would be extensibility, and this would be primarily a research project--just trying to figure out how to make a sufficiently extensible language. I would start by making a large and diverse list of features that I think should be possible in an "ideal" language. It would include all the major features of all the major languages, e.g.:

- Object-oriented programming
- Multiple inheritance
- Interfaces with single inheritance
- Templates (C++) - time-efficient genericity
- Generics (C#) - space-efficient genericity with runtime specialization
- Inner functions
- Closures
- Coroutines (Stackless Python)
- Garbage collection
- Dynamic typing
- Static typing
- Functional programming (Haskell)
- Static type inference (Haskell)
- Unit type checking (e.g. giving an error if the programmer attempts a + b where "a" is measured in metres and "b" in square feet.) and inference (e.g. metres * seconds / seconds = metres), and syntax to allow this feature.
- Interface reconfiguration & extension (changing/extending an object's interface without changing its identity - I can explain better if you like)
- High performance & low-level programming (C/C++/Asm)

I would then attempt to design an appropriate set of compiler modules with a well-defined interface between them. The idea would be to design an open compiler architecture so that one could write 'plug-ins' that add features to the compiler.

In addition to language features, I would like to consider extensible syntax. The fondest dream here is a language which can take on the syntax of another language (e.g. Java), but provide additional features not found in that language, and also to allow code using different syntax to interoperate on an intimate level. .NET is a step toward that ideal, but inter-language interoperability is limited to a specific set of features defined by Microsoft, and (seemingly) every language used must be compiled to a DLL separate from code in other languages.

3. Something involving a dictionary

Last semester I made a user-editable interdictionary web application: see http://qwertie.net/

I would like to continue working on this project somehow, or another related project.

One idea is to attempt to import some large part of Wiktionary (http://www.wiktionary.com) into my dictionary, so that the features of my application can be used to browse Wiktionary. Perhaps a better idea is to actually contact the developers of Wiktionary, and see if I could help add features to their website.

Finally, it would be nice to make a PocketPC version of my dictionary.

4. PocketPC keyboard extension

Some time ago I wrote a keyboard application for Palm pocket computers (see http://millikeys.sourceforge.net/). But my Palm broke a couple years back, and MilliKeys has not been updated since.

PocketPCs have handwriting recognition, which is very cool, but handwriting is simply not as fast as typing can be.

Recently I was inspired by an input method on a cell phone: each number key is assigned several letters (e.g. 2=ABC). You can input a word using just numbers and the phone automatically figures out the intended word, so you type "43556" and it figures out that you want "hello".

I would like to do something related, with a sort of fuzzy logic. The on-screen keyboard on a PocketPC has very small buttons, so you must type on it, you must type carefully. I would like to implement a keyboard with probabalistic input, that would allow you to miss keys and still get the intended output. So if it were a Qwerty keyboard, you could hit the keys "gwklo" and it would automatically output "hello". For each character, it would use Fitts' law to model the input and determine the likelihood that various characters were intended. Using probability formulas, in conjunction with a dictionary, it would then determine the most likely intended word. It would also allow the user to use what he actually typed instead.

Additionally, it could support features of MilliKeys, such as the ability to make a short stroke to type punctuation, capital letters, etc.