Jeffreys Copeland & Haemer's ``Work'' Articles and Software


This page was last updated 1 November 2017.

In April, 1995, we began writing a column entitled ``Work'' for RS/Magazine. This followed our earlier RS series on Internationalization (5/92-4/93), POSIX (8/93-12/94), and Literate Programming (1/95-3/95). Collectively, we refer to all of these as the ``Jeffreys columns''. In April, 1997, ``Work'' moved to SunExpert (later renamed Server/Workstation Expert), published (like RS was) by the really nice folks at The Computer Publishing Group in Boston. Unfortunately, in December, 2001, CPG suspended publication of S/W Expert, so the Jeffreys are on haitus.

However, we occasionally post more recent things we've done that you might find interesting on our ``New Work'' page.

two guys with droopy moustaches
(Allie Copeland took this picture of us one evening while we were reviewing proofs of a column. Or maybe she just caught us without our normal beer glasses in hand. That's Copeland on the left, Haemer on the right.)

The purpose of the ``Work'' column is to explore some of the problems we run across in getting our jobs done (or problems we find when we're messing around avoiding work) and how they can be solved with the application of a little bit of software.

We make no promises that any of this will be useful, but if you've read our columns and want to try out the software without having to type it in, here it is. You're welcome to use the code we've provided here for non-commercial purposes; for any other use, please contact us first. We also don't promise to support this software, but if you find it useful, or make improvements, or find bugs, please let us know---send us e-mail below.

The software is all in compressed Unix shar.gz files. If you're on a Unix machine, uncompress the file with gunzip, and then execute the resulting shar file using your preferred shell to unfurl the archive. For example,

$ gunzip foo.shar.gz
$ sh foo.shar
or in a single pipe,
$ gunzip -c <foo.shar.gz | sh
If you're on a non-Unix machine, you may need to do some hand-waving to extract the code.

datetitlesynopsis
1/02The Cryptogram of Life In our last (unpublished) column, we draw some parallels between the puzzles solved by the cryptographer and the geneticist.   (software)
12/01Documentation We discuss some tools to make annotating your code easier, so that you can always say "RTFM."   (software)
11/01Hard Problems In which we talk about really difficult propositions, like NP-complete problems, and simplifying test matrices, and generating random haiku and finding the east pole.   (software)
10/01Nonsense In which we show you how we've been producing random test data -- though not our columns -- for all these years.   (software)
9/01Son of Address Book In which we build a tool to import data from our flat ASCII address book (see our columns on addresses) into a program like Microsoft Outlook or the Palm desktop.   (software)
8/01The Nesting Instinct In which we use XML as an excuse to build an industrial-strength parser.   (software)
7/01Simplify, Simplify In which we complete our Perl module for Expect-like functionality.   (software)
6/01Simplicity In which we attempt to find a substitute for the Expect programming tool, and find that our search for simplicity is not so simple.   (software)
5/01Commonplace Book In which we show how to produce a pleasantly typeset and indexed copy of your on-line file of quotations, so that you can have a commonplace book like your grandfather, and curl up with it in your wingback chair.   (software)
4/01Compression Practicum In which, continuing thoughts from January (reader software for the Palm handheld device) and March (compression), we build the compression module for January's reader filter.   (software)
3/01Squishing Data In which we consider the problem of compressing data, and show how efficient the existing common compression programs are.   (software)
2/01High School Algebra, Backwards In which we noodle around with Gregory's theorem, which we didn't actually learn in high school, though we should have.   (software) (The link to the On-line Encyclopedia of Integer Sequences in the article is stale: try http://oeis.org/ instead.)
1/01Reader Filters In which we convert text files for the ubiquitous reader applications on Palm devices.   (software)
12/00Reading, Revisited In which we once again discuss books and reading after a gap of two years has changed the legal and technological landscape.
11/00Tables In which we once again bridge the gap between our favorite text processing tool, troff and the brave new world of HTML.   (software)
10/00Real Cookies In which we (munch) eat some animal crackers (chomp) in our quest for (gobble) statistical data, and (nibble) write some quick statistics programs on the way. We provide the data we collected so you can play along at home.   (software)
9/00Testy, Aren't We? In which we develop some test harnesses and tests, using Kent Beck's techniques from last month's column.   (software)
8/00The Art of Software Testnig In which we discover Kent Beck's book eXtreme Programming eXplained, and find out we've been doing some things right all along.
7/00Gernsback Meets Aristotle In which we talk about alternatives to the standard plurality method of a democratic election, explain why fair is in the eye of the beholder, and provide a live example based on the preferential voting for the Hugo Awards.   (software)
6/00Escher, Penrose, Foyer In which we explore how oddly-shaped tiles can make interesting patterns that are dismayingly non-symmetrical. (Reader Jim Homan pointed out that our tiling patterns had errors. We've left the errors in the diagrams in the article, but the shar file has been updated to contain corrected pictures.)   (software)
5/00Back to Basics: sort In which we think about one of the most-useful, but under-used, Unix utilities.
4/00More Sex In which we conclude our discussion about the evolutionary pressure to keep gender ratios roughly even.   (software)
3/00Sex In which we ask ``why is sex always the same?'' and explore some of the implications of the genetics involved in choosing gender, developing some interesting simulation code along the way.   (software)
2/00Back to Basic(s) In which we provide a gentle introduction to the style of development on Unix, for our Unix-challenged friends, by building a solution to a simple problem.   (software)
1/00Calendar Pages In which we begin the last year of the millenium by printing pages for our day planner.   (software)
12/99Perlpoint In which we discuss Tom Christiansen's alternative to a what-you-see-is-what-you-get generator for presentation slides.   (software)
11/99Pictures In which we talk about digital photography, and all the information hidden in those data files that come off your fancy camera.   (software)
10/99Babelfish In which we tie together web tools, i18n, programming for the fun of it, and the art in Haemer's den.   (software)
9/99A Pipe Tool In which, continuing our development of Unix tools in Perl, we show how to build mkfifo.   (software)
8/99Software Ptools In which we visit Tom Christiansen's version of the Unix tool set --- implemented in Perl.   (software)
7/99I18N, Part 2 In which we conclude our brief once-over of internationalization.
6/99I18N, Part 1 In which we provide a summary discussion of internationalization, and how to make your software speak many languages.
5/99Odds and Ends In which we cover a set of miscellaneous topics which we couldn't stretch out to be complete columns.   (software)
4/99A Simple Web Script In which we develop web versions of ``hello, world'' and explore other ways to poke the web.   (software)
3/99Going Through Our Lockers In which we move to junior high school for a slightly more complicated math problem.   (software)
2/99Differences Among Women In which we explore an elementary school math problem and make some observations about our correspondents and learning math.   (software)
1/99Reader, part 2 In which we conclude development of the electronic reader. (We have to confess that we don't have a solution to the supplemental bookmarks exercise we posed in the text of the column. We're going to use the excuse that the dog ate our homework.)   (software)
12/98Reader, part 1 In which we begin to develop electronic reader software for your desktop or laptop. The less source code is available here, too; you'll need it to build the underlying paging software.   (software)
11/98A Short History of Reading In which (paraphrasing a title from Warren Chappell, who wrote A Short History of the Printed Word) we impersonate James Burke and discuss how books came to be and their future. A column for the literary among our readers.
10/98Puzzles, part 2 In which we show the hows and whys of tsort, as part of the solution to last month's problem.   (software)
9/98Puzzles In which we avoid work by solving a problem posed in a Usenet posting.   (software)
8/98Virtual Threaded News Reader, part 2 In which we complete the code we began in the previous column, by finally explaining how to complete the insertion sort into a tree of news articles. This article, like the last one, is written in CWEB.   (software)
7/98Cathedrals, Bazaars and Threaded News Readers In which we begin to develop a tool to rethread news articles, after we stretch an analogy to its breaking point. This article is written in CWEB; follow the link for more information. (See here for the analogy.)   (software)
6/98We Argue With Our Code In which we explore how to handle command-line arguments.
5/98Not Looking Through Our Mail In which we build some mail filtering tools to toss out or preprocess some of what we receive.
4/98Stepwise Refinement for Efficiency's Sake In which we develop and re-develop (and re-develop) a piece of software, making it more elegant and more efficient each time.   (software)
3/98Looking Through Our Mail In which we build a tool to find specific mail messages in our completely disorganized collection of mail boxes.   (software)
2/98(Work) ... And How to Avoid It In which we discuss some tricks to help you achieve your greatest laziness potential.
1/98Comparing Text, part 2 In which we finish developing our running text comparison filter.   (software)
12/97Comparing Text, part 1 In which we explore the tools at hand for comparing running text, such as the output of a formatter, and discover that we need to develop a new filter.   (software)
11/97Your Résumé, part 2 In which we complete the troff macros from last time and then use them to generate HTML for a web version of our résumé.   (software)
10/97Your Résumé, part 1 In which we begin to develop a troff macro package to help us produce a résumé.   (software)
9/97Practical CVS, part 2 In which we complete our discussion of CVS.
8/97Practical CVS, part 1 In which we begin discussing the Concurrent Version System, which sits on top of RCS to manage collections of files and allow multiple users to simultaneously update the code.
7/97Practical RCS In which we have a quick tutorial on the Revision Control System, proper use of which may obviate last month's article.
6/97Hoist By Our Own Petard In which we figure out what we need to do to be able to undelete a file, because we all too often manage to delete files we didn't mean to.   (software)
5/97We Use vi to Edit Web Pages In which we explore using vi and our earlier atchange script to build a what-you-see-is-what-you-get HTML editor.   (software)
4/97Drawing on the Net In which we continue our vote counting on the Web with the display of a map of the United States that we'll color on demand. In addition to the HTML/CGI code, we provide the US map data in GIF coordinates for our Web page, and US map data in longitude and latitude coordinates wrapped up in PostScript form.   (software)
2/97Counting on the Net In which we revisit the Web, and begin building a web page tool to count electoral votes from the recent presidential election. We begin with entry of votes.   (software) (Annoyingly, we don't have a PDF of the original column, so we have to resort to HTML.)
1/97Let's Synchronize Our Watches In which we celebrate the new year by building a tool to syncronize our workstation's clock to a known time base.   (software)
12/96The Date Class, the last part In which we complete our development of a C++ Date class. We fold our version of strftime() into the class. We ignore the problems of interesting non-Julian calendars, like Hebrew, Arabic, and Chinese. (For hard-core calendar fans, see Dershowitz & Reingold's ``Calendrical Calculations'' work: they're one of our favorite references on the subject.)   (software)
11/96The Date Class, part 3 In which we continue with our development of a C++ Date class. We provide an implementation of strftime().   (software)
10/96The Date Class, part 2 In which we continue with our development of a C++ Date class. We flesh out our Gregorian class with a method for Easter, and begin to derive a Julian calendar class.   (software)
9/96The Date Class In which we return to one of our favorite problems: calendars. We sketch out a general C++ class for Dates, and a derived class for the Gregorian calendar.   (software)
8/96The Problem with Menus, part 3 In which we finish discussing the menu problem.   (software)
7/96The Problem with Menus, part 2 In which we continue to explore the menu problem.   (software)
6/96The Problem with Menus, part 1 In which we try to solve a problem in printer development. We begin to build some tools to simulate the front-panel menu on a device with an imbedded controller.   (software)
5/96Formatting a Web Page, Redux In which we follow up the reponse to our 2/96 column. We invent some tools for converting troff input to HTML format.   (software)
4/96Building Stuff In which we explore a alternative to make for handling utilities. This shar includes both our version and MacKenzie's version, which we talk about in the article.   (software)
3/96Try, Try, Try Again In which we explore how to handle a changing world. We borrow an idea from an old friend and build a series of tools to make things happen in response to files changing.   (software)
2/96Formatting a Web Page In which we talk at length about formatting HTML into readable form.   (software)
1/96A Bridge Column In which we complete our discussion about diaries, and begin talking about HTML in preparation for the next column. We talk about cleaning old entries out of our to do lists, adding on-time appointments to them, and printing them.   (software)
12/95To Do or Not To Do In which we continue our conversation about diaries. We invent a tool to extract current events from our disparate to do lists.   (software)
11/95Diaries and To-Do Lists In which we talk about keeping track of the future and the past. We produce a Perl program to handle our daily ``to do'' list and turn it into a record of what happened.   (software)
10/95Who Lives Near Here?, part 2 In which we finish talking about geographic proximity. We provide some code to determine the distance between two points, and a wrapper to find places within a circle of a certain size on the globe.   (software)
9/95Who Lives Near Here?, part 1 In which we begin to explore the question of how to determine geographic proximity. We build an Expect script to extract longitude and latitude from a geographic information server.   (software)
8/95Addresses, part 3 In which we finish talking about address book management. We finish our reader exercise on reversing names, and provide a useful tool for managing blank delimited paragraphs.   (software)
7/95Addresses, part 2 In which we continue talking about address books. We build tools for reversing first and last names for sorting, extracting addresses from our book to print envelopes directly, and for printing the address book to fit in our pocket diary.   (software)
6/95Addresses, part 1 In which we begin to build a set of tools for handling an on-line address book. We develop two sets of tools in this and the next few columns: one set uses flat ASCII files, the other relies on tagged files handled by the Unix refer suite. This column has tools for sorting and extracting data from our address book.   (software)
5/95Envelopes In which we do for envelopes what we did for letters in the previous column. We provide scripts for extracting address information from letters, and printing them.   (software)
4/95The ABCs of Letters In which we explore producing letters using our old Unix standby troff. We provide add-on macros for -mm to do letter formatting, and scripts to print the letters.   (software)


Some of our columns are written using the CWEB literate programming tool. WEB was the original literate programming tool, a confluence of Pascal and TeX which Donald Knuth invented to write the TeX typesetting system. It allows tightly-coupled code and program documentation to share the same source file. The source can be preprocessed by weave to generate input for TeX, in order to produce nicely formatted program listing and documentation; or it can be preprocessed by tangle to extract only the code parts, in order to be compiled and executed.

CWEB is an variant of WEB by Silvio Levy and Knuth which uses C instead of Pascal for the programming language. The sources for version 3.4g of CWEB -- the ctangle and cweave processors, and accompanying macros and documentation -- are available here in a compressed tar file. You will need TeX to format the documentation and the output of cweave. For that you want to look at the Comprehensive TeX Archive Network, CTAN.

More information on WEB and CWEB can be found in:

  • Knuth, Donald E: ``Literate Programming,'' Computer Journal, vol 27: nr 1, January 1984, pp 97-111. (This was the original report on WEB.)
  • Bentley, Jon & Donald E Knuth: ``Programming Pearls: Literate Programming,'' Communications of the ACM, vol 29: nr 5&6, May-June 1986, pp 364-369, 471-483.
  • Knuth, Donald E: ``How to Read a Web,'' in TeX: The Program, Addison-Wesley, 1986, ISBN 0-201-13437-3, pp viii-xiii.
  • Copeland & Haemer: ``Literate Programming,'' in RS/magazine, vol 4: nr 1, January 1995, pp 26-30. (This article is not currently available on our web page, unlike our Work series.)
  • Knuth, Donald E & Silvio Levy: The CWEB System of Structured Documentation, Addison-Wesley, 1994, ISBN 0-201-57569-8.
  • Knuth, Donald E: Literate Programming, Center for the Study of Language and Information/Cambridge University Press, 1992, ISBN 0-937073-80-6.

  • You can send us each e-mail: Jeffrey L Copeland or Jeffrey S. Haemer. Or you can send us both mail at the same time.

    This page was last updated 1 November 2017.