The Cryptogram of Life |:
In our last (unpublished) column, we draw some parallels
between the puzzles solved by the cryptographer and
We discuss some tools to make annotating your code easier,
so that you can always say "RTFM."
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.
In which we show you how we've been
producing random test data -- though not
our columns -- for all these years.
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.
The Nesting Instinct ||:
In which we use XML as an excuse to build
an industrial-strength parser.
Simplify, Simplify ||:
In which we complete our Perl module
for Expect-like functionality.
In which we attempt to find a substitute for
the Expect programming tool, and find that our
search for simplicity is not so simple.
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.
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.
Squishing Data ||:
In which we consider the problem of compressing
data, and show how efficient the existing common
compression programs are.
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.
(The link to the On-line Encyclopedia of Integer Sequences in the
article is stale: try
Reader Filters ||:
In which we convert text files for the ubiquitous
reader applications on Palm devices.
Reading, Revisited ||:
In which we once again
discuss books and reading
after a gap of two years has changed the legal
and technological landscape.
In which we once again bridge the gap between our
favorite text processing tool, troff and
the brave new world of HTML.
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.
Testy, Aren't We? ||:
In which we develop some test harnesses and tests,
using Kent Beck's techniques from last month's column.
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.
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.
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.)
Back to Basics: sort ||:
In which we think about one of the most-useful,
but under-used, Unix utilities.
More Sex ||:
In which we conclude our discussion about the
evolutionary pressure to keep gender ratios
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.
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.
Calendar Pages ||:
In which we begin the last year of the millenium
by printing pages for our day planner.
In which we discuss Tom Christiansen's alternative
to a what-you-see-is-what-you-get generator
for presentation slides.
In which we talk about digital photography,
and all the information hidden in those data files
that come off your fancy camera.
In which we tie together web tools, i18n, programming
for the fun of it, and the art in Haemer's den.
A Pipe Tool ||:
In which, continuing our development of Unix tools in Perl,
we show how to build mkfifo.
Software Ptools ||:
In which we visit Tom Christiansen's version of the Unix tool set
--- implemented in Perl.
I18N, Part 2 ||:
In which we conclude our brief once-over of internationalization.
I18N, Part 1 ||:
In which we provide a summary discussion of internationalization,
and how to make your software speak many languages.
Odds and Ends ||:
In which we cover a set of miscellaneous topics which
we couldn't stretch out to be complete columns.
A Simple Web Script ||:
In which we develop web versions of ``hello, world''
and explore other ways to poke the web.
Going Through Our Lockers ||:
In which we move to junior high school for a slightly
more complicated math problem.
Differences Among Women ||:
In which we explore an elementary school math problem
and make some observations about our correspondents
and learning math.
Reader, part 2 ||:
In which we conclude development of the
(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.)
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.
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.
Puzzles, part 2 ||:
In which we show the hows and whys of tsort, as
part of the solution to last month's problem.
In which we avoid work by solving a problem posed in a Usenet
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
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
for the analogy.)
We Argue With Our Code ||:
In which we explore how to handle command-line arguments.
Not Looking Through Our Mail ||:
In which we build some mail filtering tools to toss out
or preprocess some of what we receive.
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
Looking Through Our Mail ||:
In which we build a tool to find specific mail messages in our
completely disorganized collection of mail boxes.
(Work) ... And How to Avoid It ||:
In which we discuss some tricks to help you achieve your
greatest laziness potential.
Comparing Text, part 2 ||:
In which we finish developing our running text comparison
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.
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é.
Your Résumé, part 1 ||:
In which we begin to develop a troff macro package to help
us produce a résumé.
Practical CVS, part 2 ||:
In which we complete our discussion of CVS.
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.
Practical RCS ||:
In which we have a quick tutorial on the Revision
Control System, proper use of which may obviate
last month's article.
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.
We Use vi to Edit Web Pages ||:
In which we explore using vi and our earlier
script to build a what-you-see-is-what-you-get
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
we provide the
US map data in GIF coordinates for our Web page,
US map data in longitude and latitude coordinates
wrapped up in PostScript form.
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.
(Annoyingly, we don't have a PDF of the original column, so
we have to resort to HTML.)
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.
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.)
The Date Class, part 3 ||:
In which we continue with our development of a C++ Date class.
We provide an implementation of strftime().
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.
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.
The Problem with Menus, part 3 ||:
In which we finish discussing the menu problem.
The Problem with Menus, part 2 ||:
In which we continue to explore the menu problem.
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.
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.
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.
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.
Formatting a Web Page ||:
In which we talk at length about formatting HTML into
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.
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.
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.
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.
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
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.
Addresses, part 2 ||:
In which we continue talking about address books.
We build tools for reversing first and last names for sorting,
addresses from our book to print envelopes directly,
and for printing the address book to fit in our pocket diary.
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.
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.
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.
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
It allows tightly-coupled code and program documentation to share the same
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,
More information on WEB and CWEB can be found in:
Knuth, Donald E:
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,
Copeland & Haemer:
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:
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
both mail at the same time.
This page was last updated 1 November 2017.