MySecurityVault
The largest programming project I have worked on was done at WhiteCanyon, and that was my work on MySecurityVault. This was my first real GUI project, other than a couple of simulations I wrote in undergraduate Operating Systems, so it was pretty exciting for me, and rather poorly designed. :) I wrote it in Borland 6 using the VCL, with what we'll call a monolithic design. In other words, most of the functionality was in the main form rather than in sub classes. I have since learned the beauty of a model-view-controller pattern, and wish I had known about it then. It may be for the best though, as it gave me some evidence of why it can be very bad to not use it.
I was very pleased with the encryption scheme for MySecurityVault, as it is very secure and robust. We use a password salt, iterative hashing, RSA encryption of a symmetric key for a blowfish encrypted vault, and some good random number generation. To get the random data, we have the user type on the keyboard and move the mouse, grabbing the lowest few bits of the mouse coordinates or the time between key presses.
MySecurityVault ended up being a very useful program for me, in that I could create customized categories to store any sort of personal information, knowing that it would be kept safe. While that sounds like marketing-speak, I really do use it for my own passwords, credit card numbers, contact information, product codes, even lists of movies and books I want to read. You can also use it for encrypting files, but I didn't use that feature as much, just because I don't have many files to encrypt. It's satisfying to create a program that is actually useful, and that I know other people actually use. (I know they do, I've answered their emails about it.)
If you're interested in trying it out, it is free for the basic usage, so all the password saving and lists and such. You can find it at WhiteCanyon.com.
My Chess
In one of my early undergraduate programming classes, we had to make a Chess game controller in order to apply the technique of polymorphism. (A "pawn" object inherits from a "piece" object, and a board is a series of pointers to pieces.) I liked that project, because it had a nice visual result. However, we didn't create the GUI, only the back-end logic (No AI, just making sure pieces made legal moves) so when I moved to a new system and couldn't get the project to compile, it would have been a hassle to figure out the libraries in order to get it to recompile. So I decided to go with the bigger, yet more enjoyable hassle, and simple recreated the program. I flatter myself by thinking that my years of programming experience resulted in a much better designed piece of software, and I know that I ended up with a cooler GUI. :)
At some point, I would love to create an AI for my game, but for now, I simply have it interface with gnuchess, an open source chess AI. I tried to make it modular enough so that plugging in some AI won't be a challenge, but that was years ago, so who knows what my view of "modular-enough" was back then.
This program requires sdl, sdl-image and sdl-ttf in order to compile, and gnuchess in order to play against the computer. Let me know if you have any problems compiling. MyChess.tgz
Ruby Calculator
I really enjoy programming in Ruby, so just for the sake of a program to write in Ruby, I decided to create a calculator. It ended up that I liked it more than most of the alternatives, so I actually use it as my main calculator when I'm on the computer. It is console based (I made a graphical graphing component, but didn't want to keep it up, so I commented it out) and it has some basic stats functions that I recently added on a whim since I'm taking a statistics course at the moment.
An interesting quirk about my calculator: it calculates Pi each time the program is run, the first time you request it. So if I type in "2*pi", my code will actually calculate pi and cache the result. Why does it do this? Because I was curious how pi is calculated, so I decided to do that rather than hard-code the answer. I calculate it to the amount of precision that I am displaying, so it is only correct to about 14 decimal places. Similarly, I calculate phi, e, square roots and arc tangents myself rather than calling the related functions, simply because I was curious. So, my way is probably not as efficient (though hopefully equally accurate) but it was much more fun.
This calculator supports arbitrarily nested parentheses and order of operations on complex calculations, as well as storing values in variables (a=2*pi). It also supports using hexadecimal and binary in calculations (0x23 or b101), constants such as phi, e and pi, and your basic math functions like square root, power, natural log, factorial, etc. To use the stats functions, simply type "stats" as your expression and press enter. The program will then prompt for your data, either one item per line, or several items on a line separated by commas. Once you enter a blank line, it will calculate for you the mean, mode, median, variance, standard deviation, average absolute deviation, range, and plot out a simple little histogram.
Anyway, enjoy it, and let me know if I should add some functionality to it. Even if you add it yourself, let me know so I can make sure it has all the necessary features. calculator.rb