If The Sabot Fits...
If The Sabot Fits...
Originally shared by Trey Harris
How can the civil service resist? Here's how I did it.¹
I ran the campus-wide (non-departmental) email and login system for UNC Chapel Hill in the mid-to-late nineties. At one point, to settle a lawsuit, the governor's office (not a court) ordered us to release the list of all 21K+ email addresses to an entity that I won't name, but will just say was well-known for mass harassment of individuals on the early Internet.
I knew I had to comply, but I also knew I didn't want to just hand over those email addresses to be spammed and harassed. (Anti-spam technology at the time was very primitive and fairly ineffective.)
So i read the order carefully: it said I had to provide all the email addresses on our system, in a "single document", with all email addresses "in the same format". It also specified that I had to have a "consistent delimiter" between the addresses (preventing me from, for example, giving them a dump of all the usernames without spaces between them, leaving them to figure out what to do with alexjanehhardy8frigglejreed3htreysfeinstein...)
If I'd wanted to be coöperative, I'd have just pulled the list, put it in a plain text file, one email address per line, and emailed the plaintiffs the file. But I did not want to be coöperative. Yet, I did have to follow the law and my orders. So, what to do?
Some background on the data: our addresses were in the form of@email.unc.edu, where could be up to 8 characters; the mean username length was ~6 characters. So a file containing all those 21K addresses plus a delimiter would be around 441,000 characters, or about 430 kilobytes. That was a reasonably large file to send in an email attachment back then, but not an absurdly large one. We weren't using floppies anymore (and that file would even have fit on a 3.5 inch floppy with space to spare).
But my machines were in the old central-computing machine room, containing the machines where statisticians from almost every department at the university had, for decades, run statistical analyses and other batch jobs on datasets on the mainframe. Back then, most "time-sharing" multi-user systems weren't interactive for the bulk-computing portion of jobs; people would login to the system via hard-wired or networked remote terminals, input their data and programs, submit the "job" (a command to run their program on the dataset), and logout. The jobs would then be run—mostly overnight when the interactive users weren't taking up computing cycles—in "batch", hence "batch jobs".
When you submitted a job, you could specify how you wanted the output: in a new dataset, in a report, in a plain file, as an email, etc. But there was another option, too: you could get your output as a printout. This was leftover from the days when there wasn't a campus internet, and most people had no access to a computer screen they could use to spend many minutes or hours reading output from the mainframe. It was a less and less-frequently used option, but some of the older professors still used it because they were used to it or liked to markup the output with pencil.
If a print job was requested, the printers that would handle the job weren't laser printers, or even ink jets. They were either daisy wheel (meaning, essentially, a very fast computer-controlled typewriter, which would press typewriter-like stamps against ribbon onto the page to print out text) or dot-matrix (similar, but instead of a typewriter-like set of characters, a printhead with an array of plungers that could be quickly reconfigured would press dots of ribbon onto the page). Usually, daisy wheel was used for text-only output (because it was faster and prettier), dot-matrix for output that included graphics (which daisy wheel was mostly incapable of handling).
Both printers were huge, noisy things, working on paper that was about 15 inches wide. This paper was "fanfold" (meaning, a continuous sheet of paper, printed on only one side, that had been perforated every 11 inches for tearing into pages) "tractor feed" (meaning the paper had, on either side, holes along the entire length the printer could use to pull the paper along; the strips with the holes were perforated too so they could be removed for aesthetic reasons), "green bar" (meaning that every 1/2 inch alternated green or white; three lines of daisy wheel text fit in each bar. This was to help readers keep their place given the very wide paper that allowed 132 columns per line).
Once the job had been output, a bell would ring and a light would flash and the machine room operators (who worked 24×7) would (literally!) rip the last page of paper out of the printer. They'd then see who the job was for, put a cover page on it (that another printer—by the time I was there it was a laser printer—had printed at the same time), and put the entire stack (still fan-folded, meaning it was a continuous strip of paper not torn into pages) onto a shelf in the machine room that was accessible to the public hallway via rows of cabinets in the corridor wall, each marked with the first digit of job numbers or letter of usernames so the person requesting the print job could retrieve it themselves.
The point is: with 11 inch long pages at six lines per inch (three lines per 1/2 inch bar), or 66 lines per page, we had printers that would quickly and inexpensively print out a document that was, say, about 21,000 lines long. That would be about 320 pages, which was well under what came in a box, so it would even be a single continuous sheet (a "document"!).
That seemed perfectly responsive to my order, but it would be difficult for the plaintiff to use to create a database of email addresses to harass. Still... OCR (optical character recognition) scanners existed even then, and they were pretty good at recognizing daisy-wheel output. There were even tractor-feed scanners available—while I didn't expect the plaintiff to have one, it might be worth it to them to send the paper to a service bureau that would scan it for a fee. So I thought about how to make it more difficult.
First, I'd use the dot-matrix printer, even though the output was all text. OCR wasn't as good with dot-matrix output. The green-bar paper was designed so that 66 or 88 lines would nicely align with the bars—but by using the dot-matrix, I could use whatever type size I liked. I found a number of lines (I think it was 65 or 67) that meant every green-white transition would have a line going right across it. Better, and what's more, using an unusual type size like that meant that most lines were printed between two passes of the printhead, and they never perfectly lined up. (But they were still readable by a human being, which was all that mattered.)
At 132×66, the paper could hold up to 8,712 characters. If instead of printing the addresses one to a line, or "newline-delimited" I printed them continuously with a single space between them ("space-delimited"), I could fit on average 415 addresses per page. That would bring the total number of pages way down from ~350 to just around 50 pages, but on the plus side "a 50 page document" didn't sound at all ridiculous as a response. So I did that—and I didn't word-wrap; if the 132nd column was reached in the middle of an email address, it would just immediately continue on the next line. (The fact that every address ended with "@email.unc.edu" meant there'd be no ambiguity to a human reader.)
Then I just added a few little touches. Changing the space delimiter to a comma (with no space after) made the entire page a mass of ink. Shuffling the alphabetized list before printing it made it impossible to use to find specific addresses and would increase the chances that a data-entry typist would get first characters wrong.
The final touch: I went into the old-ribbon bin and printed the 50 pages out with a previously-used ribbon, which made the characters grey and faint—so long as I could read the addresses on the last page myself, it was still "responsive" as far as I was concerned.
I took the fifty pages, tore off the tractor feed strips (just to make OCR'ing a little harder), stuck them in a big pouch envelope, and mailed them off, reporting up that I'd complied as ordered. No one ever mentioned the matter again, and the entity I'd sent the "document" to never spammed my users en-masse.
I bring this up today because I hope if you're a civil servant reading this, it might inspire you to think up your own creative ways of "complying" with immoral or illegal orders. Resistance takes many forms—even, sometimes, the form of a mass of faint text on fifty pages of green bar paper.
—
¹ Note: I'm eliding some detail here and taking full responsibility even though others may have known what I was doing, because I don't want to rope them into criticism, particularly since many are still on the government payroll. Still, I don't want to take credit for actions of others either, so if you worked with me back then and you'd like me to credit you, just send me a direct message or reply here.
https://en.wikipedia.org/wiki/Line_printer
Originally shared by Trey Harris
How can the civil service resist? Here's how I did it.¹
I ran the campus-wide (non-departmental) email and login system for UNC Chapel Hill in the mid-to-late nineties. At one point, to settle a lawsuit, the governor's office (not a court) ordered us to release the list of all 21K+ email addresses to an entity that I won't name, but will just say was well-known for mass harassment of individuals on the early Internet.
I knew I had to comply, but I also knew I didn't want to just hand over those email addresses to be spammed and harassed. (Anti-spam technology at the time was very primitive and fairly ineffective.)
So i read the order carefully: it said I had to provide all the email addresses on our system, in a "single document", with all email addresses "in the same format". It also specified that I had to have a "consistent delimiter" between the addresses (preventing me from, for example, giving them a dump of all the usernames without spaces between them, leaving them to figure out what to do with alexjanehhardy8frigglejreed3htreysfeinstein...)
If I'd wanted to be coöperative, I'd have just pulled the list, put it in a plain text file, one email address per line, and emailed the plaintiffs the file. But I did not want to be coöperative. Yet, I did have to follow the law and my orders. So, what to do?
Some background on the data: our addresses were in the form of
But my machines were in the old central-computing machine room, containing the machines where statisticians from almost every department at the university had, for decades, run statistical analyses and other batch jobs on datasets on the mainframe. Back then, most "time-sharing" multi-user systems weren't interactive for the bulk-computing portion of jobs; people would login to the system via hard-wired or networked remote terminals, input their data and programs, submit the "job" (a command to run their program on the dataset), and logout. The jobs would then be run—mostly overnight when the interactive users weren't taking up computing cycles—in "batch", hence "batch jobs".
When you submitted a job, you could specify how you wanted the output: in a new dataset, in a report, in a plain file, as an email, etc. But there was another option, too: you could get your output as a printout. This was leftover from the days when there wasn't a campus internet, and most people had no access to a computer screen they could use to spend many minutes or hours reading output from the mainframe. It was a less and less-frequently used option, but some of the older professors still used it because they were used to it or liked to markup the output with pencil.
If a print job was requested, the printers that would handle the job weren't laser printers, or even ink jets. They were either daisy wheel (meaning, essentially, a very fast computer-controlled typewriter, which would press typewriter-like stamps against ribbon onto the page to print out text) or dot-matrix (similar, but instead of a typewriter-like set of characters, a printhead with an array of plungers that could be quickly reconfigured would press dots of ribbon onto the page). Usually, daisy wheel was used for text-only output (because it was faster and prettier), dot-matrix for output that included graphics (which daisy wheel was mostly incapable of handling).
Both printers were huge, noisy things, working on paper that was about 15 inches wide. This paper was "fanfold" (meaning, a continuous sheet of paper, printed on only one side, that had been perforated every 11 inches for tearing into pages) "tractor feed" (meaning the paper had, on either side, holes along the entire length the printer could use to pull the paper along; the strips with the holes were perforated too so they could be removed for aesthetic reasons), "green bar" (meaning that every 1/2 inch alternated green or white; three lines of daisy wheel text fit in each bar. This was to help readers keep their place given the very wide paper that allowed 132 columns per line).
Once the job had been output, a bell would ring and a light would flash and the machine room operators (who worked 24×7) would (literally!) rip the last page of paper out of the printer. They'd then see who the job was for, put a cover page on it (that another printer—by the time I was there it was a laser printer—had printed at the same time), and put the entire stack (still fan-folded, meaning it was a continuous strip of paper not torn into pages) onto a shelf in the machine room that was accessible to the public hallway via rows of cabinets in the corridor wall, each marked with the first digit of job numbers or letter of usernames so the person requesting the print job could retrieve it themselves.
The point is: with 11 inch long pages at six lines per inch (three lines per 1/2 inch bar), or 66 lines per page, we had printers that would quickly and inexpensively print out a document that was, say, about 21,000 lines long. That would be about 320 pages, which was well under what came in a box, so it would even be a single continuous sheet (a "document"!).
That seemed perfectly responsive to my order, but it would be difficult for the plaintiff to use to create a database of email addresses to harass. Still... OCR (optical character recognition) scanners existed even then, and they were pretty good at recognizing daisy-wheel output. There were even tractor-feed scanners available—while I didn't expect the plaintiff to have one, it might be worth it to them to send the paper to a service bureau that would scan it for a fee. So I thought about how to make it more difficult.
First, I'd use the dot-matrix printer, even though the output was all text. OCR wasn't as good with dot-matrix output. The green-bar paper was designed so that 66 or 88 lines would nicely align with the bars—but by using the dot-matrix, I could use whatever type size I liked. I found a number of lines (I think it was 65 or 67) that meant every green-white transition would have a line going right across it. Better, and what's more, using an unusual type size like that meant that most lines were printed between two passes of the printhead, and they never perfectly lined up. (But they were still readable by a human being, which was all that mattered.)
At 132×66, the paper could hold up to 8,712 characters. If instead of printing the addresses one to a line, or "newline-delimited" I printed them continuously with a single space between them ("space-delimited"), I could fit on average 415 addresses per page. That would bring the total number of pages way down from ~350 to just around 50 pages, but on the plus side "a 50 page document" didn't sound at all ridiculous as a response. So I did that—and I didn't word-wrap; if the 132nd column was reached in the middle of an email address, it would just immediately continue on the next line. (The fact that every address ended with "@email.unc.edu" meant there'd be no ambiguity to a human reader.)
Then I just added a few little touches. Changing the space delimiter to a comma (with no space after) made the entire page a mass of ink. Shuffling the alphabetized list before printing it made it impossible to use to find specific addresses and would increase the chances that a data-entry typist would get first characters wrong.
The final touch: I went into the old-ribbon bin and printed the 50 pages out with a previously-used ribbon, which made the characters grey and faint—so long as I could read the addresses on the last page myself, it was still "responsive" as far as I was concerned.
I took the fifty pages, tore off the tractor feed strips (just to make OCR'ing a little harder), stuck them in a big pouch envelope, and mailed them off, reporting up that I'd complied as ordered. No one ever mentioned the matter again, and the entity I'd sent the "document" to never spammed my users en-masse.
I bring this up today because I hope if you're a civil servant reading this, it might inspire you to think up your own creative ways of "complying" with immoral or illegal orders. Resistance takes many forms—even, sometimes, the form of a mass of faint text on fifty pages of green bar paper.
—
¹ Note: I'm eliding some detail here and taking full responsibility even though others may have known what I was doing, because I don't want to rope them into criticism, particularly since many are still on the government payroll. Still, I don't want to take credit for actions of others either, so if you worked with me back then and you'd like me to credit you, just send me a direct message or reply here.
https://en.wikipedia.org/wiki/Line_printer
Comments
Post a Comment