Children of a Lesser Good

Regular readers of this blog are probably pretty clued in about my better-known software projects – gpsd, fetchmail, giflib, libpng, INTERCAL, ncurses, Battle for Wesnoth, Emacs VC and GUD modes, and the like. If those are the best, what about the rest? Here’s a tour of some of the lesser-known stuff I’ve written or had my fingers in. Warning: obscurity, trivia, and obsolescence lie ahead!

Retrolanguages

It’s no news to my regular readers that I derive a perverse thrill from reviving horrible ancient languages from the paleolithic strata of computing. INTERCAL is my best-known such project, but there are others.

cupl actually gives you an interpreter for two revenants from the dawn age – Cornell University Computing Language (CUPL) and Cornell Compiler (CORC).

mad is the Michigan Algorithm Decoder, a wonderfully strange old language from the realy 1960s. What can you say about a lanuage where you have explicit operations to twiddle a stack of values of a variable as a substitute for the function local scope you don’t have? Yes, I know; it sounds like INTERCAL. No, not quite.

mixal is an implementation of the hypothetical MIXAL assemply language from Donald Knuth’s “The Art Of Computer Programming”. I didn’t write this, but I ported it to Unix and got the permissions required to redistribute the MIX examples and description from the book.

Development Tools

One of my very first C programs back in the early 1980s was hexdump. Yes, Unix had the od command, but I always prefered the CP/M style of hex dump – 16 hex bytes per line with ASCII over on the right and a gutter in the middle that helps you figure offsets by breaking them into groups of 8. Because I was working on an SNA terminal emulator when I wrote it, this hex dumper also has the unusual ability to dump EBCDIC. A quarter-century later EBCDIC is long gone from my life but I still think the CP/M display style of hex display is superior.

semex is almost as old. No, nothing to do with plastic explosive; it’s an interactive excerciser for the System V semaphore facilities found in Linux and other modern Unixes. You can use it to learn how they work with less friction than writing your own C code, or as a callable tool for use from scripting languages that don’t have a native binding to the semaphore calls.

ascii is a handy little utility that recognizes many different ways of naming an ASCII character (hex, octal, binary, decimal, C escape, ISO character table pair, slang names, and others) and prints out all the equivalents.

minised, aka small-sed, is the fast, small sed originally distributed in the GNU toolkit and still distributed with Minix. The GNU Project dropped it when they built their own sed around an enhanced regexp package, but minised still better for some uses (in particular, it’s faster and less memory-intensive).

Occasionally I hare off in a direction nobody seems interested in. Back when GNU gettext was just getting known, I thought it was too heavyweight. I wrote my own tool for internationalization, cstrings and used it on a couple of small C projects. Alas, I don’t think anyone else ever did.

When I was an active libpng developer, I wrote the support for six of the more obscure chunk types that had been described in the PNG standard but not implemented in the reference library. It frustrated me that there were no decent tools for doing surgery on the more obscure chunk types, so I wrote sng. This was a program that could unpack a PNG into an editable text form and reverse the transformastion. Need to wrote a program to tweak, say, the meters-to-pixel field in a pHYs chunk? No problem – explode the PNG with sng, hack it in your favorite text editor, and unexplode it with sng. Writing the regression-test suite was easy :-).

I’d love to know if anyone but me ever got any use out of my C-to-Python translator, ctopy. It turns out that regexp-bashing can do about 80% of the job on well-formed C. I translated a couple of fairly large programs with it, including Super Star Trek (which see below).

It’s not likely there are many SCCS files left out there, but if you know what one is and you want to lift it to RCS, sccs2rcs is your tool. This isn’t the C-shell version that floated around unmaintained for many years, it’s my Python rewrite with much better error checking.

Because I cleverly got it accepted into the Subversion suite, svncutter is not its own project any more. This is a tool for slicing and dicing Subversion repositories. The single trickiest thing it can do is merge runs of adjacent commits with the same commit comment – a not-uncommon form of scar tissue when a repo has been up-converted from SCCS/RCS/CVS. It can also selectively delete commits and excise files from a repo history entirely.

Now we reach deep into obscurity for yacchack, a project so ancient and neglected that I never even gave it a web page. It was a set of hacks to enable building multiple YACC parsers into the same runtime, turning the parser globals into members in a state structure that you could have more than one of. I remember that this worked once but have forgotten what I wrote it for.

Communications

ssh-installkeys installs your SSH keys on remote sites for you. Unlike its direct competitor ssh-keyinstall, you need enter your password only once; it uses a send/expect library to run an ssh session that does all the work.

The web is a wonderful thing, but I hate, hate, hate having to do mechanical clicky-dances on websites; service designers who don’t provide an API for scripting transactions with them deserve to be hung up by their thumbs (yes, SourceForge, I’m talking to you!). My freshmeat-submit tool exercises the API at freshmeat.net; with it, you can post release announcements and edit project metadata. This tool is actually intended to be called by other programs as part of your release process.

In fact, the main user of freshmeat-submit is my shipper program. shipper automates the tedious process of shipping a software release to standard places, including your own hosted website, FTP archive sites, and the like. Optionally it can generate and upload a templated web page for the project and announce to Freshmeat. This program is in alpha state and rapidly acquiring more capablity.

Document and Web Tools

There are few things more entertaining than to succeed at programming an algorithmic solution to a problem the domain experts thought was impossible to automate. It was supposed to be impossible to lift the ugly-presentation-level tag soup in troff markup (man, ms, mm, me etc.) to nicely structured XML-DocBook. But, it turns out, with a sufficiently clever application of cliche analysis it can be done. ctdoclifter has about a 95% successful conversion rate. This may be the most algorithmically dense code I’ve ever written.

I found the conditionalization facilities in XML-DocBook too painful to use, so I wrote xmlif to fix this. It’s a simple preprocessor that interprets XML processing instructions in your text body in a way that allows you to conditionally include or export different portions of the text.

vh stands for Volks-Hypertext. Back when I was first working on the Jargon File, I distributed it for a while in a flat-text form in which all the references to entries were surrounded by curly brtaces, a la “{foo}”. A guy named Ray Gardner thought “Hey, why don’t I…” and write what we’d now call a browser for the File – it was screen-oriented, could page up and down, and could chase links. The right and left arrow keys hopped from link to link on the page; press enter on a link and go to the entry. The idea for the browser was Ray’s, but some of the interface polish was mine.

What makes this interesting is that we weren’t imitating the text-mode lynx browser and the World Wide Web – we were anticipating it. Shortly after vh’s first release in 1991 I got email from a then-obscure programmer named Tim Berners-Lee hinting that he was doing some hypertext-related stuff and asking if I might be interested in collaborating on some standards. I replied “yes”, but never heard back from him.

Of course Tim Berners-Lee didn’t stay obscure for very long after 1991. I’ve wondered ever since if Ray Gardner and I actually influenced the design of HTML. If I ever meet Sir Tim, I’ll ask him.

The urgency to get rid of GIFs is gone now that the blocking patent has expired, but PNG is still a better image format and gif2png is still your handiest tool for mass-converting the things. I didn’t write it, but I’ve been the maintainer for a decade – and I did write web2png, which can convert an entire hierarchy of web pages in place, patching links as needed.

sitemap is a tool for automatically building a site map from your web pages, meant to be run as a cron job. It mines indexing information about the pages from meta tags. I’ve had it running on my website for thirteen years.

imgsizer optimizes a web page, or an entire tree of them, by analyzing IMG tags and adding width and height attributes to them derived from analyzing the image. This hint to the layout engine of a browser can significantly speed up page rendering.

Because I’ve been such a Unix guy for the past million years, some people might find it difficult to believe that I ever worried about moving data back and forth from DOS/Windows systems. But I did, back in the 1980s, and wrote mstrans so I could batch-convert entire directories of manuscript files. It’s not hard to imagine where this could still be useful.

Games

Battle For Wesnoth isn’t my first game project, no, not by any means. I was a Nethack developer for many years; heck. it’s my doing that Nethack has color on the screen. I used to write and port a lot of games back in the days when we used terminals instead of GUIs. Some of these retain considerable play value today; one or two even qualify as timeless classics.

Save the Federation from the invading Klingons! Visit exotic planets and strip-mine them for dilithium! Encounter mysterious space thingies! Long, long ago, there was a family of tremendously influential games called “Star Trek”; the earliest of this seems to have been a tiny BASIC game from 1971. One of the most influential versions was written in FORTRAN in 1973-1974 at the University of Texas; it was eventually translated into C to become BSD Trek. Super Star Trek is the UT game, translated into Python and with most of the features from BSD Trek and several later versions folded in.

Super Star Trek is, no question, a timeless classic. You can play it in either its original TTY-like mode, or you can enable the screen-oriented interface.

Almost as venerable is wumpus. Hunt The Wumpus was first written in BASIC in 1974, and seems to have the first game with a map that was topologically interesting, e.g not a grid. You hunt the wumpus in an icosahedral cave, hoping pot him by shooting one of your limited supply of arrows through nearby rooms. But beware lest you stumble over the Wumpus himself (which will eat you) or fall into a pit or get carried off by bats! This implementation lovingly preserves the crude interface of the original. Also includes superhack, which is a structurally similar game with a different premise.

Or there’s my bs game from 1993 – yeah, it’s Battleships for the terminal screen. The point-and-shoot with arrow keys is primitive compared to clicking a mouse in a GUI…but, oh, wait, you can point and shoot with a mouse in this thing, too. That’s not something you see often in a program running in a terminal emulator, and the magic I used is unlikely to work anywhere but under Linux. (Not originally mine, but I rewrote it to make the UI not suck.)

Then there’s bluemoon a nice card solitaire game that’s not injured by lacking a GUI. (Also not originally mine, but I rewrote it to make the UI not suck.)

Once upon a time in 1994, I saw a neat little game for the old pre-Unix Macintosh called “Galaxis”. I thought it was fun, so I wrote a workalike.

greed is a game that might not work as well if it did have a GUI. You use arrow keys to walk around a field of digits, trying to eat as many as possible. The catch is that the length of your next move is set by the digit you eat, and you can’t cross your own back trail. Somebody named Matt Day wrote this back around 1989 and then disappeared. I’ve kept it maintained since 1994.

Imagine you are skiing down an infinite slope, facing such hazards as trees, ice, bare ground, and the man-eating Yeti! Unfortunately, you have put your jet-powered skis on backwards, so you can’t see ahead where you are going; only behind where you have been. However, you can turn to either side, jump or hop through the air, teleport through hyperspace, launch nuclear ICBMs, and cast spells to call the Fire Demon. And since the hazards occur in patches, you can skillfully outmaneuver them. This game, ski would definitely not work as well with a GUI. Not my design, but very funny and worth my effort to maintain it.

It’s not real likely anyone will ever want to play Tetris on a terminal screen again, but in case they do they can dust off tetrix. Originally written for the Amiga; I ported it to Unix. Probably best mercifully forgotten now.

Finally, there’s VMS-Empire. This game was ancestral to the whole genre of 4X (expand/explore/exploit/exterminate) games, including Civilization and Master of Orion. Its history before 1990 is a bit murky, but I’ve been maintaining it since. This game should not be forgotten; it, too, is a timeless classic.

Miscellanea

I used to play Magic The Gathering. To help me evaluate the probability of, say, pulling any of 3 Hurloon Minotaurs in my first 7 cards of a 60-card deck, I wrote deal. It computes hypergeometric distributions for non-replacement probabilities. It’s based partly on an earlier program called “cardprobs” that seems to have sunk without trace.

Bayesian filtering has become a very popular spamfighting method. Shortly after Paul Graham invented the technique in 2002, I observed sadly that, much as I love Lisp, his use of it as an implementation language made it far less likely that this worthy idea would get the traction it deserved. I wrote bogofilter, the first Bayesian spam-filter in C. I handed it off to others about a year later. It has achieved extremely wide use.

In 2003, as a reaction to the SCO lawsuit, I wrote a comparator that uses a shred-and-hash technique find similar portions of program text in very large source trees (fuzzy matching after whitespace normalization, brace, and comment removal is supported). Ron Rivest (yeah, the “R” in RSA) was kind enough to design a custom hash function for me. A main virtue of this program is that it’s eye-poppingly fast – I have actually seen it compare up to two million lines of code per minute on a 1.8GHz Intel box.

letterize takes a phone number and tries to turn it into the most plausible string of English characters that you could type on a phone keypad to get that number. Most plausible, that is, given the relative frequency of trigraphs in English.

Morse Classic is a Morse code training program for aspiring radio hams. I was handed the maintainer’s baton years ago but haven’t had to do much more than merge sporadic contributions from others; the code is old but very stable.

nolan was a program that gave the Nolan Quiz, something we’d now hardly think of doing with anything but a Web form. The implementation technique was kind of interesting, though; I wrote a little markup language that was compiled to C by a script written in sed and awk.

X Video Explorer was a tool I wrote in conjuction with the XFree86 Video Timings HOWTO I used to maintain. Because mdern display hardware autoconfigures using EDID, the tool and the HOWTO are both obsolete.

41 thoughts on “Children of a Lesser Good

  1. Anyone remember a game called ELIZA?

    It wasn’t really a game per se, it was like talking to a psychologist.

    You would type something in, and Eliza would respond. You might say “I feel bad,” and Eliza would respond, “Why do you feel bad?”

    It was kind of fun; something you could log on to a BBS and play in the 1980s on your Commodore 64.

  2. Just a typo, I’m sure, but you’ve linked gif2png when talking about the XML-DocBook conditionals project, as well as in its own section.

  3. >A little confused as to what gif2png has to do with XML or DocBook.

    That was just me not having corrected a cut and paste properly. It’s fixed now.

  4. @esr:

    Regarding ssh-installkeys, you shouldn’t hard-code the names of the key file pairs (‘~/.ssh/id_rsa’ , ‘~/,ssh/id_rsa.pub’, etc.), nor should you hard-code the name of the authorized keys file (‘~/.ssh/authorized_keys’), since these names and paths are configurable in the sshd configuration. The script should, instead, parse the exact names from config. I say this because I worked at one place where these are configured differently. I would have fixed this myself and submitted patches to you, except that another admin had already written a different script in shell that worked for their configuration and that was the ‘approved’ method. :-/

    Furthermore, I’d humbly suggest not inlining pexpect for three reasons reasons: The first is that that version 0.94 is a very, very old version of pexpect and suffers from several bugs. The second is that the newer versions that exist specifically have better built-in ssh support. The third is that the first two reasons are why we have package managers. :)

    Feel free to call me out if I’m way out of line here.

    @everyone re: Super Star Trek. A long time ago, I wrote a BBS version of this game that used the DOOR.SYS dropfile and my then-super-cool 16550AFN assembly language async routines (they were FAST!). Unfortunately I lost all of the source when the only hard drive it was sitting on crapped out. :( If only there had been sites like Sourceforge and Berlios in the late 1980s…

  5. Isn’t writing hexdump a necessary rite of passage for every half capable programmer?

  6. If you have Emacs, you can run an Eliza clone with “M-x doctor”. It’s still around.

    For extra fun, try “M-x psychoanalyze-pinhead”. This will feed Eliza quotes from Zippy the Pinhead, leading to some truly surreal conversations.

  7. “But, it turns out, with a sufficiently clever application of cliche analysis it can be done.”

    Could you explicate that (“cliche analysis”)?

    I assumed it was just a term of art I’d never come across, but a quick search suggests it’s not in anything like common use outside of completely unrelated contexts (such as film criticism)…

  8. >Feel free to call me out if I’m way out of line here.

    You’re probably right. I haven’t fixed these things because it has worked as is and nobody has bugged me about it before now. Patches would be welcome.

  9. >Could you explicate that (”cliche analysis”)?

    I learned the term from an AI researcher. Sometimes you can do structural analysis of markup soup if the tags are commonly used in stylized, cliched ways; you look for the cliches and extract meaning from them. For example, markup for italic in a manual-page section named “FILENAMES” effectively always means the composer was trying to distinguish a filename from running text; you lift this cliche to DocBook <filename> tags. doclifter uses a combination of a couple of hundred cliches with compiler-like parsing techniques.

  10. esr Says:
    > Sometimes you can do structural analysis of markup soup if the tags are commonly used in stylized, cliched ways;

    Excuse the nit pick, but that sounds more like an idiom than a cliche to me.

  11. > Anyone remember a game called ELIZA?
    > It wasn’t really a game per se, it was like talking to a psychologist.

    There is a python library (http://www.jezuk.co.uk/cgi-bin/view/software/eliza) that does this.

    At one point there was also a python library that would do most of the work for chatting on AOLs Instant Messenger.

    Yeah, it was an amusing script. I need to see if anyone’s wrapped libpurple in python.

  12. Really interesting projects you had up your sleeve back in the day.

    It seems that as computing is getting more and more advanced technologically, the novelty and fun factor of using a computer has diminished considerably. Would you say so?

  13. I guess I’m going to have to do something with CORC at some point, then… I’ve got a manual for the original implementation around here somewhere.

  14. Another buglet: you linked to deal (which is later described to be about calculating card probabilities in Magic The Gathering) when talking about tetrix / deatetrix

    It’s not real likely anyone will ever want to play Tetris on a terminal screen again, but in case they do they can dust off dealtetrix.

    BTW, why some of links are http://freshmeat.net/projects/project, and some are http://catb.org/~esr/project?

  15. I hope you didn’t forgot about ciabot in contrib/ section of Git sources; you have a patch or two pending…

  16. >>It seems that as computing is getting more and more advanced technologically, the novelty and fun factor of using a computer has diminished considerably. Would you say so?

    Nonsense, computing is just getting more interesting.

    For example, I am now able to imagine building a self-replicating logistic network. You see, I want to put together a thing-o-matic so that it can produce a lego copies of itself, as well build lego factories that put together lego pieces into robot and copies of itself, and so on.

    Than I’ll have cranebots for moving lego into places, trainbots to carry legobots and lego bricks, lego quadcopters for surveying and uploading terrain data, and so on to build the train network of my dream. Maybe it’ll build a lego manufacturer plant at other locations as well so it can produce the logistic network. Than I’ll fund the purchase of the raw material by transporting goods across the logistic network so I can do these things all over again.

    Recursive craziness! MUHAHAHAHAHAH.

    I guess I’ll just start with making money to buy a thing-o-matic and learning how to model 3D objects so I can get started. This project will keep me busy for years since I lack all the knowledge of engineering, terrain surveying, robotics and only have a little more than basic programming knowledge.

  17. >> It seems that as computing is getting more and more advanced technologically, the novelty and fun factor of using a computer has diminished considerably. Would you say so?

    Oh yeah, I also forgot the fact that I was playing with a Neal Stephenson plot device called a cyrptocurrency. It’s literally the wet dream of crypto-anarchist and libertarian everywhere. I feel like I was living in a cyberpunk novel.

    A Neal Stephenson plot device! Holy shit. What the hell I gotten myself into lately? It even have a self select market anarchists too!

  18. >It seems that as computing is getting more and more advanced technologically, the novelty and fun factor of using a computer has diminished considerably. Would you say so?

    No. I can do more interesting projects today. I’ll be blogging about one of them shortly.

  19. Oh yeah, I also forgot the fact that I was playing with a Neal Stephenson plot device called a cyrptocurrency. It’s literally the wet dream of crypto-anarchist and libertarian everywhere. I feel like I was living in a cyberpunk novel.

    Um. The Cypherpunks did that about 15 years ago. There’s a bunch of implementations out there, some even ran for a while.

  20. > No. I can do more interesting projects today. I’ll be blogging about one of them shortly.

    Yes, but I remember the time when there was a lot of fun in overcoming (or trying to overcome) the computing limitations (of the previous era) to achieve something useful. I don’t know whether you have experienced that feeling. These days, it appears that everything is possible with the limitless computing power and the multitude of specialized computing gadgets in our hands. Or maybe I’m just feeling jaded with technology at present.

  21. hari wrote “Yes, but I remember the time when there was a lot of fun in overcoming (or trying to overcome) the computing limitations (of the previous era) to achieve something useful.”

    You can still have fun overcoming computing limitations (and other practicalities) to do neat stuff today. At one extreme, I have several times enjoyed solving an easy problem with duct-tape-level tech — $0.70 microcontrollers, wire wrap, Dremel tools, etc. Of course, as the frontier of duct-tape-level technology advances, some things that were easy become uninteresting, but it’s still interesting to do lots of things: e.g., various things related to mobile robotics. At the other extreme, it’s become much easier to mess around with things that used to be very hard and/or expensive, and are now merely challenging. E,g,. it’s become pretty practical to mess with various entry-level software problems in computer vision, machine learning, and computational chemistry or fluid dynamics; also with hybrid hardware/software problems in signal processing and control theory. Most networking-related projects, local or Internet, landline or wireless, have become vastly easier and cheaper. And various other stuff has, too: e.g., I see a considerable amount of potential fun in building a sandbox virtual world around a physics engine and a 3D graphics engine.

  22. >Um. The Cypherpunks did that about 15 years ago. There’s a bunch of implementations out there, some even ran for a while.

    I am well aware that cryptocurrency is not a new idea and heard of some implementation but I am not aware if any were actually running today. What I have heard is that bitcoin is the first truly decentralized cryptocurrency that doesn’t relies on trust at all.

    Even if that isn’t true at all, at the very least, a new generation is learning how to run a quasi-anarchistic economy.

  23. > Yes, but I remember the time when there was a lot of fun in overcoming (or trying to overcome) the computing limitations (of the previous era) to achieve something useful. I don’t know whether you have experienced that feeling. These days, it appears that everything is possible with the limitless computing power and the multitude of specialized computing gadgets in our hands. Or maybe I’m just feeling jaded with technology at present.

    I know what you mean. I managed to get some of it back by throwing away a lot of the work that has been done to make everything easier: building LFS instead of using a regular distro, learning to do my work in LaTeX files built using emacs (neither of which I’d ever used before — but when that got to be routine I did one piece in hand-hacked XHTML, with a minuscule subset of the functionality of LaTeX baked into it by a python script of my own devising. I called it faketex. This is how far I’m willing to go to make things hard for myself :) ).

    Anyway, once I got to the point where I was routinely doing things like that, I experienced a singular realisation: that anything I can imagine doing with the machine in front of me can probably be done (if in a thoroughly irritating and kludgey way) using source code that’s only a Google-forage away. This is an extremely liberating feeling; it cured me of all willingness to ever buy software again :). At the same time, it can also be very demotivating.
    As our host has observed, most open-source hackers want to be demigods. When every idea one has turns out on cursory examination to be unoriginal and extensively implemented by somebody else about five years ago, it’s difficult for someone of my benighted imagination to see how I could ever become one. Clearly, I am long on laziness, but short on impatience and hubris :).

  24. I know what you mean. I managed to get some of it back by throwing away a lot of the work that has been done to make everything easier: building LFS instead of using a regular distro, learning to do my work in LaTeX files built using emacs (neither of which I’d ever used before — but when that got to be routine I did one piece in hand-hacked XHTML, with a minuscule subset of the functionality of LaTeX baked into it by a python script of my own devising. I called it faketex. This is how far I’m willing to go to make things hard for myself :) ).

    Ah, this is what I also do from time to time. Learning something new from scratch tends to relieve this feeling of being sick of technology and gadgets.

    You can still have fun overcoming computing limitations (and other practicalities) to do neat stuff today. At one extreme, I have several times enjoyed solving an easy problem with duct-tape-level tech — $0.70 microcontrollers, wire wrap, Dremel tools, etc. Of course, as the frontier of duct-tape-level technology advances, some things that were easy become uninteresting, but it’s still interesting to do lots of things: e.g., various things related to mobile robotics. At the other extreme, it’s become much easier to mess around with things that used to be very hard and/or expensive, and are now merely challenging. E,g,. it’s become pretty practical to mess with various entry-level software problems in computer vision, machine learning, and computational chemistry or fluid dynamics; also with hybrid hardware/software problems in signal processing and control theory. Most networking-related projects, local or Internet, landline or wireless, have become vastly easier and cheaper. And various other stuff has, too: e.g., I see a considerable amount of potential fun in building a sandbox virtual world around a physics engine and a 3D graphics engine.

    Oh yes, I do understand this point of view as well. But approaching advanced problems like the ones you mentioned require more engineering knowledge and less computer knowledge.

    And of course, our ability to be surprised and excited by what a computer can do today has been dulled thanks to the internet and the free flow of information.

  25. >Yes, but I remember the time when there was a lot of fun in overcoming (or trying to overcome) the computing limitations (of the previous era) to achieve something useful.

    Bah. I was there for the “old days”. Mostly they sucked. Powerful computers and being limited only by my own problem-solving ability is better.

  26. Yes, but I remember the time when there was a lot of fun in overcoming (or trying to overcome) the computing limitations (of the previous era) to achieve something useful.

    Bah. I was there for the “old days”. Mostly they sucked. Powerful computers and being limited only by my own problem-solving ability is better.

    I can see both sides of this. Personally, I have always believed that constraints lead to creativity. I have always taken “Necessity is the mother of invention” to refer to constraints as well as features.

    Nonetheless, Eric is right. It is a lot of fun to be able to bring a huge amount of computational ability to bear on a problem. In my own work, I am often designing things with lots of constraints. But I develop on very powerful systems, and I spend a lot of time writing code that manages the constraints as well as the features. I write code that generates code, code that simulates code, code that generates test vectors for code, etc. 20 years ago, all this was written in assembly or C for speed. Today, most of the meta-code I write is in Python. It is pure Joy compared to 20 years ago.

    I like Terence Parr’s motto: “Why program by hand in five days what you can spend five years of your life automating?”

  27. I was there for the “old days”. Mostly they sucked.

    Heh. I remember hearing about a folk singer who was noted for singing sea chanteys meeting a man who’d sailed on clippers in the China trade. The sailor told him that he hated those songs because they reminded him of just how miserable his life was before he found a job on shore.

  28. >It seems that as computing is getting more and more advanced technologically, the novelty and fun factor of using a computer has diminished considerably. Would you say so?

    I’m still very new to programming, but it seems that today, as compared to a lot of my reading, it is much easier to do a lot of entertaining and useful things that wouldn’t have been possible not that long ago, but it is also harder to do anything fundamental because you’re trying to work with more complex systems. Even dealing with hardware has gotten more complicated, I built a computer in 1998, but have been having trouble trying to upgrade a newish one.

  29. esr Says:
    >Bah. I was there for the “old days”. Mostly they sucked.

    I wasn’t there in the old days, but I had to use adb to debug a program once. I concur. It sucked.

    I also once debugged a program with an oscilloscope — that sucked even more.

  30. esr -

    On the game front, have you seen the Kingdom of Loathing? It is browser based, but is best understood as sort of a meta-game, incorporating, well, everything it can. It has the wonderful obtuse/perverse strategic aspects of nethack in spades, and a lot of subtle play on offer, with a goofy flavor on top.

    Not, sadly, open source. Amusing, though.

  31. > Even dealing with hardware has gotten more complicated, I built a computer in 1998, but have been having trouble trying to upgrade a newish one.

    True. What I was talking was that I miss the sheer excitement of old when I used to have to wait in line for using a computer at a nearby computer ‘centre’. Being allowed to use a computer was something of a privilege at school as well before we had regular computer science classes. The sheer excitement of writing my first program and getting the correct output is something I miss today knowing fully well that if I have any problems to solve, google is just a click away. This is a sure demotivating factor for a hobbyist (not for somebody like ESR though, as his reply shows) like me.

    I agree that a lot of interesting stuff can be done with computers today. But because of the expanse of knowledge and the wide variety of specialized computing devices out there in the mass market chances are somebody with more time and resources has solved the problem in your hand much better than you have already. Something of the mystique and excitement has gone away.

    I don’t doubt that the dedicated engineers, hackers and researchers with plenty of time and resources still have lots of excitement about technology. It’s just that the average hobbyist like me who finds that the problems within my scope of time, intellect and dedication present no big challenges and even if so, there is somebody out there who has done it better. While computers have become accessible and ubiquitous, they are also no longer special or unique as a device that fits in the palm of my hand now has almost the same computational ability and power and in some cases are even better than computers (in the traditional sense).

  32. >On the game front, have you seen the Kingdom of Loathing?

    I have friends who love it, but I don’t find it appealing.

  33. >But because of the expanse of knowledge and the wide variety of specialized computing devices out there in the mass market chances are somebody with more time and resources has solved the problem in your hand much better than you have already.

    Watch for my next blog post, in which I will provide an instructive counterexample.

  34. > Watch for my next blog post, in which I will provide an instructive counterexample.

    Awaiting it. Thanks.

    ( On a somewhat related note I must admit that I feel very inferior technically to most of the people who comment here when I read your in-depth posts and also about your past and present open source projects. You might have noticed that some of my comments and views expressed are very timid and reserved because of that. I freely admit that sometimes things go way above my head because of this. )

  35. “Morse Classic” — heh, I just started hacking together some of my own scripts to teach myself Morse. This will probably be useful — very timely for you to point it out today!

  36. E,g,. it’s become pretty practical to mess with various entry-level software problems in computer vision, machine learning, and computational chemistry or fluid dynamics; also with hybrid hardware/software problems in signal processing and control theory.

    I’m writing a digital sound synthesizer. In frigging Scheme. And it does better-than-real-time performance for pretty complicated waveforms including multivoice music. I’ve been reading up on signal processing and generation for ideas and techniques. This kind of thing just wasn’t possible from your house back in the day; if you wanted to experiment with complex sounds you had to be a pro musician with expensive kit or an engineer for a company like Roland or Ensoniq.

    This only became possible because $500 laptops come with WAY more CPU power than anyone actually needs for basic $500-laptop tasks.

    Speaking of CPU power, it’s great fun to watch my brand new ThinkPad chew through a NetBSD kernel compile in not much more time than it took my first Unix workstation, a crufty old Tandy Model 16, to compile hello world!

  37. It must be weird to have one of the libraries you work on used by a competitor of one of the programs you work on.

  38. Back when I was first working on the Jargon File, I distributed it for a while in a flat-text form in which all the references to entries were surrounded by curly brtaces, a la “{foo}”.

    I remember that! I wrote an emacs mode for browsing the Jargon File, following those links. Can’t find it now, though.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">