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.
(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,
or in a single pipe,$ gunzip foo.shar.gz $ sh foo.shar
If you're on a non-Unix machine, you may need to do some hand-waving to extract the code.$ gunzip -c <foo.shar.gz | sh
date | title | synopsis |
---|---|---|
1/02 | The Cryptogram of Life | In our last (unpublished) column, we draw some parallels between the puzzles solved by the cryptographer and the geneticist. (software) |
12/01 | Documentation | We discuss some tools to make annotating your code easier, so that you can always say "RTFM." (software) |
11/01 | Hard 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/01 | Nonsense | In which we show you how we've been producing random test data -- though not our columns -- for all these years. (software) |
9/01 | Son 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/01 | The Nesting Instinct | In which we use XML as an excuse to build an industrial-strength parser. (software) |
7/01 | Simplify, Simplify | In which we complete our Perl module for Expect-like functionality. (software) |
6/01 | Simplicity | 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/01 | Commonplace 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/01 | Compression 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/01 | Squishing Data | In which we consider the problem of compressing data, and show how efficient the existing common compression programs are. (software) |
2/01 | High 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/01 | Reader Filters | In which we convert text files for the ubiquitous reader applications on Palm devices. (software) |
12/00 | Reading, Revisited | In which we once again discuss books and reading after a gap of two years has changed the legal and technological landscape. |
11/00 | Tables | In which we once again bridge the gap between our favorite text processing tool, troff and the brave new world of HTML. (software) |
10/00 | Real 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/00 | Testy, Aren't We? | In which we develop some test harnesses and tests, using Kent Beck's techniques from last month's column. (software) |
8/00 | The 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/00 | Gernsback 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/00 | Escher, 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/00 | Back to Basics: sort | In which we think about one of the most-useful, but under-used, Unix utilities. |
4/00 | More Sex | In which we conclude our discussion about the evolutionary pressure to keep gender ratios roughly even. (software) |
3/00 | Sex | 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/00 | Back 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/00 | Calendar Pages | In which we begin the last year of the millenium by printing pages for our day planner. (software) |
12/99 | Perlpoint | In which we discuss Tom Christiansen's alternative to a what-you-see-is-what-you-get generator for presentation slides. (software) |
11/99 | Pictures | In which we talk about digital photography, and all the information hidden in those data files that come off your fancy camera. (software) |
10/99 | Babelfish | In which we tie together web tools, i18n, programming for the fun of it, and the art in Haemer's den. (software) |
9/99 | A Pipe Tool | In which, continuing our development of Unix tools in Perl, we show how to build mkfifo. (software) |
8/99 | Software Ptools | In which we visit Tom Christiansen's version of the Unix tool set --- implemented in Perl. (software) |
7/99 | I18N, Part 2 | In which we conclude our brief once-over of internationalization. |
6/99 | I18N, Part 1 | In which we provide a summary discussion of internationalization, and how to make your software speak many languages. |
5/99 | Odds and Ends | In which we cover a set of miscellaneous topics which we couldn't stretch out to be complete columns. (software) |
4/99 | A Simple Web Script | In which we develop web versions of ``hello, world'' and explore other ways to poke the web. (software) |
3/99 | Going Through Our Lockers | In which we move to junior high school for a slightly more complicated math problem. (software) |
2/99 | Differences Among Women | In which we explore an elementary school math problem and make some observations about our correspondents and learning math. (software) |
1/99 | Reader, 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/98 | Reader, 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/98 | A 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/98 | Puzzles, part 2 | In which we show the hows and whys of tsort, as part of the solution to last month's problem. (software) |
9/98 | Puzzles | In which we avoid work by solving a problem posed in a Usenet posting. (software) |
8/98 | Virtual 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/98 | Cathedrals, 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/98 | We Argue With Our Code | In which we explore how to handle command-line arguments. |
5/98 | Not Looking Through Our Mail | In which we build some mail filtering tools to toss out or preprocess some of what we receive. |
4/98 | Stepwise 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/98 | Looking 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/98 | Comparing Text, part 2 | In which we finish developing our running text comparison filter. (software) |
12/97 | Comparing 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/97 | Your 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/97 | Your Résumé, part 1 | In which we begin to develop a troff macro package to help us produce a résumé. (software) |
9/97 | Practical CVS, part 2 | In which we complete our discussion of CVS. |
8/97 | Practical 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/97 | Practical RCS | In which we have a quick tutorial on the Revision Control System, proper use of which may obviate last month's article. |
6/97 | Hoist 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/97 | We 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/97 | Drawing 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/97 | Counting 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/97 | Let'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/96 | The 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/96 | The Date Class, part 3 | In which we continue with our development of a C++ Date class. We provide an implementation of strftime(). (software) |
10/96 | The 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/96 | The 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/96 | The Problem with Menus, part 3 | In which we finish discussing the menu problem. (software) |
7/96 | The Problem with Menus, part 2 | In which we continue to explore the menu problem. (software) |
6/96 | The 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/96 | Formatting 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/96 | Building 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/96 | Try, 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/96 | Formatting a Web Page | In which we talk at length about formatting HTML into readable form. (software) |
1/96 | A 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/95 | To 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/95 | Diaries 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/95 | Who 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/95 | Who 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/95 | Addresses, 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/95 | Addresses, 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/95 | Addresses, 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/95 | Envelopes | 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/95 | The 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) |
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:
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.