I have done quite a bit of programming in my days. Most of the work I have done is not general release work, but has been done for work projects. I break this page down by category. Public programs for the Mac, public programs for Windows, scientific data acquisition programs, and scientific data analysis and visualization programs. In general, I try to sort these programs by most date within each category.
As the result of a repetitive stress injury, I haven't had the opportunity to do much "freelance" programming work in the past several years. As such, most of my recent programming efforts are scientifically oriented. At the moment, I am attempting to learn Cocoa to start writing Mac programs again. Learning both Objective-C and the Cocoa environment at the same time is a bit daunting, but I'm making it slowly through.
My philosophy on programming has developed over the years. I put significant effort into making sure that any program I write is both easy to use and highly flexible. In the 90% of the user cases that I have thought about, I try to make using my programs as easy as possible. However, there are always going to be 10% of the cases that I don't know about, and so I always make sure that my software gives the user access to as many options as possible, while allowing the novice to use the software without changing any options.
This is especially true when programming scientific software. Although getting the software to work is a very important step, many scientists stop there. They make programs that do one thing, and one thing only. When they have a slightly different case, they must re-work the problem, at least changing some source code. I believe having flexible code and a useable, understandable, and extensible user interface is just as important as "getting it right." The time I have put into writing a significant volume of analysis and visualization code has been returned to me, and other people in my lab, manyfold times.
The Indexer is perhaps the most complete application I have ever written. The purpose of the application was to extract indexing information from PageMaker documents and use this information to compile and create an index for a yearbook. It employed AppleScript to extract text from PageMaker. It would parse this text, looking for signs of any names within the database that were in the text. It accounted for the possiblity of different name variations ("First Last", "Last, First", "First Middle Last" - this one even if the middle name was not known.) It was a full-featured application with support for a very wide variety of input types, and a very wide selection of output options.
Unfortunately, when about 90% of the way through porting this application to Windows, I developed a severe repetitive stress injury (RSI, also now known as OOS (Ocupational Overuse Syndrome)), and had to completely abandon programming for a couple of years. By the time I looked at the code again, it was too archaic to try and reuse (it being a very early project of mine, there was very little in the way of data and interface abstraction.) It does, however, work very well in MacOS 9, and is free for use there if you so desire.
SafeAlert is a library for putting up "Safe" alert boxes to your user. These boxes are safe because they can be put up in the background, and the user will be notified, and the alert will not be put up until the user brings the application to the foreground. They also do a few other wonderful things for you. =)
The Insult Generator is a very simple application. When you launch it, it prints a nice Shakespearean insult on your screen, and puts up a big button that tempts you to be insulted again. That's it. You can copy the insult and paste it into your e-mails, if you wish.
Beckman Convert converts Beckman DU-650 spectrometer files into ASCII text files for use in plotting programs. It can also do spectral math.
Dialog Controls was one of my first Macintosh public projects. It is not really useful anymore, but it was designed to show how to make multiple-page preferences dialogs using a popup menu to select between options.
Mancala is my version of the game Mancala. You can play two player, or against the computer, which has a moderate to easy skill level. Development of Mancala stopped a long time ago. If you are having problems with 1.0 (such as a screen asking you for $150), download 2.0 and these problems go away.
CPlot is an open-source plotting library for C++/MFC based applications. It supports XY and image plots and is very flexible. It includes built-in support for printing, contextual menus, and multiple data sets.
The sourceforge page for CPlot is the best place to find information and the most recent version.
Image is a data acquisition system for a CCD camera system. It uses triggered acquisition to record images 32 times per second from a CCD camera. These images are stored and can be operated on to perform on/off background subtraction, or even real-time ion counting. Data can be streamed to disk for further frame-by-frame analysis later.
The software also includes controls for changing the firing time of the pulsed nozzle. This allows for computer-controlled experiments both for finding optimal crossing timing as well as for simple on/off background subtraction (on is correct timing, off is timing significantly off).
PPC is the photoelectron-photofragment coincidence (PPC) spectrometer data acquisition program from my PhD days. I did not write the original code for this software, but am very familiar with it as I made several modifications to the code to improve performance and especially improve the user interface. The code is written in Pascal.
I wrote the bolt testing program during my summer internship at Boeing. It was a LabView based data acquistion program which also interfaced with FileMaker to keep a database of the results.
The instrument was a multiple output (I think 16) bolt stress tester. Essentially, a bolt was tightened inside the machine to a certain torque level and the stresses on the bolt were measured and recorded. The software recorded and analyzed these stresses, and signaled the user as to what force should be used on the bolt. The software also recorded the results of the tests into a bolt database that could be used for future reference.
This software replaced a one-channel chart recorder where the chart would leave the room with the engineer who brought the bolt in, and no record was kept of tests previously performed.
SDC et al.
SDC was another code that I inherited (and you can guess the status of the code by the fact that SDC stands for "Self-Documenting Code." Needless to say, there were not many comments in the code!) With the amount of re-working that I have done to the code, it is essentially all my code nowadays. By taking advantage of certain speed advantages for manipulation of large arrays built into IDL (as well as smarter programming practices overall), I was able to decrease our analysis and visualization time to approximately 20% of previous levels (yes, an 80% savings.) while adding a significant number of features and analysis options.
SDC could analyze large data sets consisting of upwards of 1,00,000 events where each event consisted of data from 40 channels of recorded data. It could analyze two-, three- and four body dissociation events, and charted the results in a myraid of different ways.
I included the "et al." in the title to be able to mention the significant amount of support code that I have written in IDL. It is, perhaps, one of my favorite languages when dealing with data analysis and visualization. I wrote plotting codes that reduced plotting times for publication-quality plots from perhaps 30 minutes to 15 seconds. I also wrote code that would automatically calibrate and "center" data, saving huge amounts of time for each data set.
I am very familiar with widget programming and direct graphics, as well as IDL syntax and speed advantages. I have not delved significantly into object graphics because the direct graphics did what I needed well enough.
WinAbel is a Windows GUI program, written in C++ using MFC, for manipulating images and calculating the Abel Transform of the image. The program allows for significant manipulation of the image: simple transformations (move, rotate), filtering (hamming, rectangular, etc), smoothing, calculation of FFT of rows and columns, as well as other things. It supports a variety of data formats (for both input and output), and also allows for recording and replaying of history files which allows complicated batch operations to be performed on a large number of files.
Plotting within WinAbel uses my CPlot plotting libraries.