current endeavors : 100 pushups

Software

As I start some new software projects I'll link to them from here. For the time being, see my software blog.

Recent projects

Artificial Intelligence [Video] ...
Knowledge representation
Language parsing
Voice recognition
Home automation
Kitchen computing
Cloud computing (ish)
Mobile computing

Blog image capture: An efficient way to add images to blog posts.

Raytracer

During my fourth year at the University of Waterloo I really enjoyed CS488, Computer Graphics. Here are some screenshots of scenes I rendered using the ray tracer that I wrote in C.

Future project ideas / interests

There are many software projects that I'd have a lot of fun with. Here's a list of some things I'd like to work on:

1.Designing a Programming Language: The most interesting area of computer science to me right now is programming languages. I think the popularity of Ruby on Rails really got my attention, as well as some home-grown languages that I've used at work. I never did take the fourth year compiler course at Waterloo, but I'd like to do that, and from there, write a compiler for a language of my own. At work, the most common language in use is C or C++. While using these languages, I'm often scratching my head -- it's amazing that we still make use of languages in 2006 that require so much typing and structure to get so little done.

When I think about the future, I see software developers using languages and constructs that, while they bare resemblance to today's languages, are substantially different. They strike me as being somewhat less explicit and more descriptive (to a point); a little more like our natural languages. I see them as being simpler to use from the stand point of getting done what you want done, but substantially more complex in their implementation / inner-workings. These languages of the future would be doing a lot more leg work for you, filling in the blanks with intelligent, yet not necessarily optimal, solutions. This infusion of intelligence, if you ask me, isn't anything like "human" or "brain" intelligence. Rather, it would have its roots in the smarts we're starting to see emerge from Google. If you mis-type a search keyword, Google is able to, almost by magic, guess what you really *meant*. Cutting through ambiguity in this intelligent fashion seems to be a hallmark of the future. Statistics, probability: If it can be determined with 99% certainty that this is what is meant, then let's go with it, unless we're later corrected to do otherwise. This very small amount of fuziness, I believe, will be a huge breath of life into computers.

The programming language I'm working on is called Lemur. It is a fairly close cousin of C and Perl, but refines many aspects of syntax and introduces some SQL-like constructs. It also includes a lot of high-level functionality right in the syntax of the language, such as reading a file by saying: myvar = [/tmp/myfile.txt].

Working on this language has been a lot of fun, and I feel like I've been quite successful so far. Writing the compiler for the language will be where the rubber hits the road, though. I hope my vision isn't spoiled by the realities of compiler design.

2.The Turing Test: The Turing Test is a setup where you have a person sitting at a computer chatting via something like an instant messanger program (like MSN Messenger) with someone that could either be a person or computer at the other end. The job of the person is to figure out whether what they're chatting with is a computer. If they can tell, the computer has failed the Turing Test. This is one of the holy grails of computer science, and while I don't feel especially motivated in this area (I have a good appreciation for how imensely difficult it is), I feel like I should take a kick at this can!

More

3.Software Development Methodology: After working at a company now for three years, I'm getting a clearer picture in my mind of "if I were to run a development shop, I'd do it this way". I'm a big fan of standards (that evolve) and process/workflow mapping. For instance, does a company have guidelines for how its software is written? Is the company rigorous about unit testing, documentation, etc.? There are many aspects to successful software development and exploring them is of increasing interest.

4.Handwriting Recognition: In fourth year I really enjoyed working on algorithms to recognize handwriting. What makes it fun for me is that while it's a difficult problem, hard work and creativity is all it takes to be successful. And when you watch the software successfully recognizing written characters, that's a very rewarding feeling. When I use my iPaq, I am sometimes impressed but more often frustrated why its designers didn't make better use of context to improve recognition. For instance, if I'm in a text box that expects me to enter a date, and I write "6:00", why would it recognize that as "6:oo"? Or if I write "6:00 PM", why would it recognize "6:00 PN"? With some additional smarts the user experience could be much better. I'd really enjoy working on this sort of thing.

5.A Computer Game: When I was 15, I was excited by the possibility of writing a computer game. But at the time I didn't posess the skills necessary. Most amateur computer games never really see the light of day, but I still think this could be a very enjoyable endeavor. I love to work with graphics and performance problems, so this is a natural fit.

6.Search Problems: Google is a fantastic search engine... I'm often impressed with their search results. Yet I still see lots of room for improvement in certain areas. For instance, someone who does a lot of searching in a certain domain of knowledge I think begins to realise that while the search results (and the information you end up reading) are often good, they are still a long way from spectacular. See this article for more details.

7.More