Talking to machines since the 1980s

Programming computers is one of my passions and has been for most of my life. It all began more than thirty years ago when I sat at my mom’s kitchen table keying in machine language instructions for an eight-bit Motorola microprocessor to make it turn LEDs on and off. I quickly graduated from looking up hex opcodes to writing the CPU instructions in assembly language, letting an actual computer turn them into machine language.1 What followed was of course BASIC, C,2 and a specialized form of assembly language for digital signal processors.3

Software development has come a long ways since then, and now I do everything with object-oriented programming, Python and a little bit of C++. That includes this website, which runs on my own custom server based on the open-source Twisted asynchronous processing framework. It serves simple, fast static HTML that is generated from modified Markdown format with a package flexbooker I wrote for Tellectual Press to publish books. That package is proprietary, but I’ve contributed a few others to the Python Package Index that you are free to copy, use, and modify under the Apache License:

  • ade performs Differential Evolution asynchronously. When running on a multicore CPU or cluster, ade can get the DE processing done several times faster than standard single-threaded DE, without departing in any way from the numeric operations performed by the classic Storn and Price algorithm.

  • AsynQueue provides asynchronous task queueing based on the Twisted framework, with task prioritization and a powerful worker interface. Worker implementations are included for running tasks asynchronously in the main thread, in separate threads, and in separate Python interpreters (multiprocessing).

  • sAsync builds on AsynQueue and the excellent SQLAlchemy package to provide SQL database in an asynchronous fashion. Everything revolves around an AccessBroker that conveniently manages database access, table setup, and transactions.

  • logalyzer parses the bloated HTTP access logs spewed out by your web server to extract the info you want about hits from (hopefully) real people instead of just the endless stream of hackers and bots that passes for web traffic nowadays. Stores the info in a relational database where you can access it using all the power of SQL.

  • yampex is yet another Matplotlib extension. It makes Matplotlib easier to use, especially with subplots. You simply construct a Plotter object with the number of subplot rows and columns you want, and do a context call on it to get a version of the object that’s all set up to do your subplots.


  1. In middle school, I carried a textbook about microprocessors around with me to read instead of the boring official coursework. We were offered one computer class with some Commodore PETs to use–clunky built-in keyboards and character-mode green screens. The teacher took a hands-off approach, and I spent my whole time writing a crude character-based Pac-Man clone. 

  2. BASIC (complete with the infamous GOTO statement) was done on an Apple II and then an Atari 800. In the early 1990s, I finally got around to writing procedural C code–a highlight was a DOS shareware program called Dataviewer that netted me $15 from exactly one user registration. 

  3. My senior project at the University of Washington, which resulted in several patents and significant licensing revenue, was for a hybrid analog-digital radio receiver with a near-baseband single intermediate frequency (IF) stage. The digital portion used an Analog Devices DSP to do decimation with bandpass filtering and aliasing, a Hilbert transform pair, and digital fine-tuning to IQ baseband signals. I programmed all of that in DSP assembly in 1995.