Wednesday, November 13, 2019

The Master Plan




One of the most despicable things a human being can do is shoot a seven-year-old girl in the back of the neck. Had I never sworn an oath to the Propo Peace Initiative, I would never have indulged in such depravity.
But I had. “Sorry, kid, but there’s a war on and I’ve got orders.”
Goddammit. Clutching the laser gun with one hand, I wiped the sweat off my forehead with the other.
On her knees in the mud, the girl sobbed. “No, Mister. There is no war, I swear. Please, let me go.”
Sure thing, kiddo. Had I been alone, that’s exactly what I would have done.
But I wasn’t. I was responsible for the lives of three fellow soldiers, so I flicked the arming switch and took aim.
As the capacitors charged, a little, green dot appeared below her hairline.
I raised it a few millimeters to be sure to fry the whole brain. There was no need to make her suffer more than necessary.
“Please, mister. Ask Mother. She’ll tell you that there is no war.”
“Your mother is dead, girl. You’re the last living Jecto in this godforsaken village, and it is my unpleasant task to rectify that.”
She sprang up and scurried past me on the right.
What the fuck? I spun around, stumbled, pulled the trigger, and landed on my ass in the mud.
Twenty-five meters ahead, a concrete foundation exploded in fire and smoke.
I rolled over and buried my face in shit as the shrapnel thumped down around me.
A pebble slammed into my helmet.
I looked up.
Did I get her? No, she bounced out of a smoldering window and vanished.
I fired again from prone position, igniting the window pane in a crackling blaze.
She screamed through the flames.
Good. Doubleplus fucking great. A lump formed in my throat as I staggered toward the ruins of what had been a yellow brick house this morning. Now, it was a fumigating laser barbecue.
Breakfast bubbled in my throat.
I bent forward and retched.
For seven years had I hoped this fucking war would end. But it would always take one more battle, one more raid, one more ghoulish trip to the glue factory to finalize the implementation of the Master Plan. As if that beastly plan was ever going to be fulfilled. For every unit we fed it, it wanted more, and more, and more...fuck.
I cramped up and retched again.
As I wiped the spew from my mouth, an all too familiar capacitor hummed in my neck.
Baez the Bitch. Bless her bedrock heart. I straightened my posture and put my game face on. As I turned to face her, I shut my mouth to keep the foul breath contained.
“That bad, huh.” Private Three-Ten Baez grimaced, making the scar across her withered face look like a slithering, purple snake. “At least, you had the guts to do it yourself. Where’s the body?” Baez didn’t smoke, but she sounded like she did. Too much hollering in the field had broken her voice.
I shook my head. In the back of my mouth, something stuck in a cavity. I pried it loose with the tip of my tongue so I could taste what it was.
Her eyes darkened. “What the fuck? You mean you let her go?”
“No, Baez, I did my best to roast her but she got away.”
“Your heart wasn’t in the kill. Goddammit, I should have known.” She glanced at the sky. “Any drones up there?”
“Not to my knowledge.” Undigested ‘pork’ sausage. I spat. “That girl wouldn’t be worth a missile anyway. She’s half a unit at the most.”
“Corporal Clegg, Sir. You know she’s going to run off to the nearest Jecto camp first chance she gets. The Captain is not going to like this one bit. Not one bit. Your heart must always be in the kill.”
“Yeah, yeah. Where are Ono and Lichtenstein?”
Baez pointed to an alley flanked by charred concrete walls, enveloped in thick, gray fog. “At the rover, waiting for it to charge. While you were playing bleeding heart Jesus with your Jecto girlfriend, they loaded all the cadavers onto the truck.”
“Good. Let’s go, then.” I shouldered my weapon and began walking, sweeping back and forth along the walls.
A cauterized enemy poster warned of ‘Genocidal Propos’ in the area.
Genocidal, my ass. What do they know? I pointed. “Would you look at that shit? What are we doing out here, anyway?”
“Racking up units, Sir.”
“Yeah, but why? What’s the Master Plan? Does anyone even know?”
“Our job is not to wonder why, but to do and die.” Our Army motto sounded less ominous when Baez said it. Perhaps it was her skewed smile, reminding us that somewhere in the Universe, there had to be a place where life was precious.

Thirty meters ahead, the outline of a Volvo truck formed in the smog. With its solar panels deployed, it looked like a giant vulture, feeding on the carrion of endless war.
The sight of it calmed my stomach. I hollered. “Okay girls, mount up. Beatings will continue until morale improves. Next stop, the glue factory.”
Baez snickered. “Where our sins will be forgiven.”
Private Seven-Thirty Ono leaned out the window on the driver’s side. “Where is the glue factory now? There’s no blip on the screen, and I’ve maxed out the range.” Her childish voice fit her angular face, blue eyes and blonde hair. Ono the Nerd was the smart one. Without her, I’d still be raving around, lost in some wasteland somewhere west of Limbo.
“How the hell should I know? It’s probably moving east, towards the capital. Is the truck charged?”
“In this fog? What do you think, Corporal? There’s a transformer station five clicks south. We might get power there.”
“That’s just fucking great.” I trod along the side of the gray, muddy truck. At the back, I climbed onto the platform and pulled the tarp aside. Holding my nose against the stench of blistered body tissue I tallied today’s catch. A headless man in overalls lay across two women as if trying to protect them. Three other bodies leaned against the cabin. One appeared to have been an overweight woman, the two others looked like fleshy scarecrows with burned rags fused to their skin. Six units in total. The woman clutched a garbage bag.
I opened it and peeked inside. Seven dead cats formed a twisted, hairy lump of dead meat.
Worthless. I hopped down from the platform and yelled. “What’s with all the dead cats?”
Ono sneered. “There was this cat lady--”
“Yeah. I saw her back there, thank you very much. What I want to know is why we have to transport them to the glue factory. They’re not even worth a unit.”
“Not to the glue factory, Corporal Sir. We’ll take them home.”
“Oh. Long tail rabbit, again?”
She smiled. “Yes, Sir. It’s better than ‘pork’ sausage.”
Woof, woof
. “Alright, then. Where’s the rover?”
“Dead. We’ll get stranded halfway to the transformer station if we try to tow it. Lichtenstein says she can guard it until we can get the truck fully charged and come back.”
The door hissed open on the passenger side, and a Mama Bear Lichtenstein came strolling around the front of the truck.
For the first time that day, I smiled.
Four-Twenty Lichtenstein, Mother-of-all-Mothers, was the only creature on this Earth that could carry a Proto Battle uniform with the grace of a ninety-kilo ballerina. Her warm, brown eyes gazed into mine. “Corporal, Sir. Are you okay?”
I scoffed. “What do you mean, Mama Bear? Of course, I’m okay.”
“No, you’re not.” She put her arms around me and squeezed the air out of me, whispering, “You couldn’t do it, could you?”
Her words pierced into my soul. My eyes teared up. I pushed her away. “I stink, Mama Bear.”
Behind me, Baez guffawed. “Don’t we all. Can we go now? We’re not home yet.”
Mama Bear Lichtenstein grabbed my shoulders. “I’ll guard the rover until you return.”
With only six units to our credit, if we lost the rover, this day would put us in a hole that it would take months to crawl out of. If we lost Lichtenstein, I’d jump head first into the shredder at the glue factory. With a commanding voice, I shouted, “No way we’re leaving Lichtenstein behind. I’ll stay. You go.” … and fistfuck me for being such an altruistic idiot.
Mama Bear tilted her head. “Are you sure?”
I nodded.
“Okay, then. We’ll get to the transformer, Ono will do her magic, and then we’ll come and get you.”
I gazed up at the truck. Baez’ head appeared in the trapezoidal window as Mama Bear returned to her place next to Ono. The door hissed shut.

It was going to be a lonely afternoon in Shit City.

As I watched the truck whine off into the smog and disappear, a twig snapped to my right.
I pulled down the visor, armed the laser and let the green beam flicker back and forth, searching for hostile heartbeats as I footslogged forward.
A green, pulsating blip at minus twenty-two degrees showed the location of the rover.
Like an animated cell-division, the blip split in two--one stationary, the other moving rapidly North-West.
A saboteur? I ran as fast as I could through the muck until I could see the rover without visual aid.
It was facing East. Like the truck, it too had its solar panels deployed, but it didn’t look like a vulture. With its slanted armor plating and its wheels retracted, it looked like a winged iron pyramid drowning in sewage.
Out of breath, I slunk towards the vehicle, scanning for lumps of explosives along the chassis.
A pair of tiny footsteps, annotated in my visor with a slightly elevated temperature, led from the front of the rover to a motorcycle track.
Gone. I turned towards the rover and gasped.
Scribbled on in the grime across the windshield, I read, “There is no war, mister. Believe it.”

Sunday, February 17, 2019

The story of the Smartarduino Doit 6Dof Robotic Arm - Part 3

This kinematic diagram looks like the DoIT robot with a very important omission. The DoIT is a 'stacking robot' that preserves the orientation of the spherical wrist (the three last links and the end-effector) when θ1 (Servo-1) is moved.
There's an excellent paper on it here.
For this kinematic diagram to be usable, every time we change θ1, we must change θ2 by the same amount in the opposite direction.


I will be trying to find the Denavit-Hartenberg parameters, but not before I've found all the rotation and displacement matrices. D-H is simpler to use but doesn't offer as much insight.
Let's start by reminding ourselves of the rotation matrices
  • Around x
  • Around y
  • Around z
Now, let's take a long, hard look at that kinematic diagram because there's something wrong with it. The numbering of the angles is supposed to indicate what frame is affected by the rotation. Therefore, the first angle is θ1 because it rotates frame 1. But, there's more:

X2 does not intersect Z1.
To fix this, we renumber the angle and move Frame(2) down so it sits on top of Frame(1).

Now, angles are numbered correctly, and X2 intersects Z1

It might seem weird to just move stuff around like this, but think about it: By moving stuff about, we're changing its location, not its orientation.
We will be affecting the displacement vectors, but not the rotation matrices.
Ponimayet?
The rotation matrix R01 consists of two parts, one due to the way the links are bolted together with the servos in resting position, and one due to the way the servo rotates the joint. We have to dot-multiply them together in order to find the complete rotation matrix for the joint.
We'll take the one with the servos in resting position first.
To find the rotation from Frame(0) to Frame(1), let's see how the axes of Frame(1) are projected onto the axes of Frame(0) and set up a matrix.
The first column shows the projection of X1onto the axes X0, Y0, and Z0, respectively. It is in the same direction as X0, so its projection will be 1.
The other axes (Y0 and Z0) are perpendicular to X1 and so its projections onto them will both be 0. We're done with the first column.
The second column is for Y1. It is in the same direction as Z0, and perpendicular to the two others, so we get
As one might have guessed, the third column is for the Z1 axis.
The finished matrix looks like this:
And our complete rotation matrix from 0 to 1 looks like this:

To calculate: Drink coffee. Drink RedBull. This is error-prone and tedious. Thank Zuse we have computers.
It looks a lot better when I don't show how it's done. Besides, since most entries in the matrix on the left are zero, multiplying them is a lot simpler than it looks.

Um ... wait. Did I multiply those in the correct order? Nevermind. Let's move on.

Now, we proceed to find R06=R01·R12·R23·R34·R45·R56. Same procedure as above, but this time, I'll try to recap the rules as I go.

Wednesday, January 3, 2018

The story of the Smartarduino Doit 6Dof Robotic Arm - Part 2

From Blandcorp:

r0: I think that's the last picture where you measure the horizontal distance between the axis for servos 0 and 1. Ok, that's also good: I just need the vertical distance between these axis as well then.

dz: (I assume this is the second to last picture): you seem to be measuring the distance between where the forearm pivots and where that linking rod connects to the elbow. I'd like the distance between where the forearm pivots and the axis of the forearm twist, so a length perpendicular to the one in the picture.

d': (distance between the wrist pivot axis and forearm twist axis) I don't see where you measure this, but from one of your pictures it seems like it might be as good as 0, so that's good.

The minimum angle is approximately 10 degrees - I can't get a more accurate reading.

I'd estimate the maximum angle to be about 150 degrees.

15 cm from Joint 1 (linking the upper arm to the lower arm) to the center axis of Servo 4.

4 cm from Joint 1 to Joint 2, linking the lower arm to the connecting rod. The connecting rod is 11cm  long from Joint 2 to the center axis of Servo 2.

d': (distance between the wrist pivot axis and forearm twist axis) I don't see where you measure this, but from one of your pictures it seems like it might be as good as 0, so that's good.
If it's the one I think it is, it's exactly 0.


dz: (I assume this is the second to last picture): you seem to be measuring the distance between where the forearm pivots and where that linking rod connects to the elbow. I'd like the distance between where the forearm pivots and the axis of the forearm twist, so a length perpendicular to the one in the picture.


Distance between where the forearm pivots and where that linking rod connects to the elbow: 3cm
Distance between where the forearm pivots and where that linking rod connects to the elbow: 3cm



Distance between where the forearm pivots and the axis of the forearm twist: 1.5cm



r0: I think that's the last picture where you measure the horizontal distance between the axis for servos 0 and 1. Ok, that's also good: I just need the vertical distance between these axes as well then.
The horizontal distance is difficult to measure. I decide on 3cm.
The distance from the base to the axis of servos 1 and 2 (opposite) is about 8cm.
Let's try a tentative, simplified Kinematic diagram:
Now, onward to Part 3 ...


Sunday, December 3, 2017

The story of the Smartarduino Doit 6Dof Robotic Arm - Part 1

I've you've never wanted a robotic arm, this story is not for you. However, if you're like me, and you couldn't possibly think of a better way to invest a couple of hundred dollars, then read on.
A few days later, you will receive a cardboard box. No gloss, no smiling kids, just a brown box full of little plastic bags.
Take them out and look at them.
Ah, crap.
There is no way in Hell the contents of those bags could ever become a robot.

It came with DHL, a Christmas present from my dear Elisabeth


But, wait. There's a USB cable in there. They wouldn't put a USB cable in a box, unless ...
Hmm ... it had a USB cable, too ... I wonder ...
I grabbed the two biggest pieces and held them up together. One is a bracket of some sort and the other is ... a bracket of some sort. They didn't snap together or fit in any other way. Not for children, huh? This was not going to be easy. Besides,
I'm a computer programmer. A fluff-head, not a gear-head. 

I rummaged through the plastic bags and found a big bearing, then I looked at the photograph of the robotic arm at www.smartarduino.com. 
Yup. That bearing was going to sit between the two big brackets. Cool. This might be a robotic arm after all.


Scratching my head some more, I realized that it would be impossible to put this together without some sort of instruction manual. I found one, and since then, the vendor, www.smartarduino.com, has put one up on the site: Download it here

Milestone

The next day, I found that I had used up almost all the screws, there were no strange looking mechanical parts left in the box, and, most importantly, the thing looked and felt like a robotic arm.
Cool. Look how happy I am.
Now, for the software. I fasten the ESPDuino board and the PWM shield at the base of the robot, connect all the wires ... um ... some of those wires are too short. A company in Denmark, Let-Elektronik, sells extensions. Beautiful ones, too:
Me? I was too fired up to wait. I found some masking tape, a soldering iron, a butchered USB cable, and pressed on. The ESPDuino board and shield assembly don't really fit on the bracket, but the bracket has slits so it will fit in a skewed sort of way, using leftover screws from the brown cardboard box.

The robot is well engineered. This is stainless steel, not a plastic toy. Yet, one thing bothers me: The backlash between Servo 3 and the connecting rod to Joint 2. There are a number of ways to deal with this. The best way would be to find a tiny rubber band that would sit on the bearing. Another would be to find a clip, snap it onto the bearing and fasten it with masking tape. 
See the lower-left part of the photograph that is not out of focus. 
(Never mind the remote control. That's for the TV.)

Milestone 2

With trembling hands, I find a USB extension cable, plug it into my home computer, an aging, but adequate IBM x3440 e-Server sporting 16gigs of memory. Should I need it, I can add a second processor card and 16 gigs more. Holding my breath, I plug the other end into the blue USB cable.
Expecting a terrible explosion, howling sirens, and blinking blue flashes, I plug the blue USB cable into the ESPDuino controller board.
"VZZ"
I jump. Did it speak?
Nah. But the servos are powered up. The robot's joints won't budge. I keep it connected for a while, sniffing the air, touching the servos to feel the heat. 
Nothing. Powerful electromagnetic forces keep every angle fixed, and there's no heat dissipation whatsoever.
Great.
Now, what?

Milestone 3 - The software

As it turns out, I'm not even half finished. The hardware is in place. To a programmer, this means that the computer is plugged in and ready for use ... except that it needs an operating system, a development system, documentation and a touch of genius before it will do anything interesting.
I recognize the feeling. I felt it once before - in 1985 when I plugged my Sinclair Spectrum to the TV and typed 
PRINT "Hello"

This is 2017. Back in 1985, the unassuming little ESP-32 with its 1MB memory would have been the size of a freezer and cost more than a house.
The specs are impressive. Read them yourself.
It has built-in PWM capability for controlling the servos, but we won't be using that. We have a PWM 16 channel servo controller board mounted on top. There's more - much more - but if I'm ever going to finish this blog, I need to focus on what's actually used.

I should mention that I use Linux, not Windows. If you're a Windows or Mac user, you're probably not reading this, anyway.

The first thing I need is the Arduino IDE. There is probably an Arduino IDE in your package manager. If it's older than 1.8.4, get rid of it. Download from the link above and install it in your home dir.

Then, download The manuals for the ESPDuino and the servo controller board.
Follow the instructions.
No, I won't repeat them here.

Milestone 4 - The first robot Control program

By now, you should have installed the ESP-32 into the board manager.
If not, you know what to do. You want a menu that looks like the one below (or better).
You should also have installed the Adafruit PWM servo driver library.

If you've done all that, you're ready to program the robot.

The first thing to do is to include the AdaFruit library. 
From now on, an assumption is made: You have connected the base servo (Servo 0) to output 0, the servo for the first elevation arm (Servo 1) to output 1, the servo driving the connecting rod to output 2, and the wrist to 3, 4, and 5 - where 5 moves the end effector.

 /*************************************************** 
  This is an example for our Adafruit 16-channel PWM & Servo driver
  Servo test - this will drive 16 servos, one after the other

  Pick one up today in the adafruit shop!
  ------> http://www.adafruit.com/products/815

  These displays use I2C to communicate, 2 pins are required to  
  interface. For Arduino UNOs, thats SCL -> Analog 5, SDA -> Analog 4

  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/
#include <stdio.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

// Depending on your servo make, the pulse width min and max may vary, you 
// want these to be as small/large as possible without hitting the hard stop
// for max range. You'll have to tweak them as necessary to match the servos you
// have!
#define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  600 // this is the 'maximum' pulse length count (out of 4096)

Now, you have access to the servos through the object pwm.

If you don't believe me, compile this sketch and run it:


void setup() {
  Serial.begin(9600);
  pwm.begin();
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  yield();
}

int a =90;

void loop(){
    if (a < SERVOMAX){
        a++;
    }
    if (a > SERVOMIN){
        pwm.setPWM(0, 0, a);
        delay(100);
    }
}

Oh, I forgot. There's supposed to be a 'FLASH' button on the board. 
Well, there isn't.
UPDATE: Don't worry about any of this. Plug in the USB cable, click the upload button and watch as the binary file gets transferred to the ESPDuino's memory.

In order to express the servo angles in degrees and not in pulse width, you can define a macro like the one below.

#define a2p(a) (int)(SERVOMIN + ((a * (SERVOMAX - SERVOMIN)) / 180))

Then, you can save the state of the robot as an array of angles.

float oldAngle[8]; /* Current state of the robot */

Before you compile, upload, and destroy something, let me 
stop you right there.

This is not the whole story.

Remember the connecting rod? Well, the next chapter is dedicated to that little bugger.

UPDATE: As it turns out, that thing was a feature, not a bug--but I had to learn kinematics and read a long and intricate scientific paper before I felt I understood something.
Have fun watching me Forrest Gump my way through it.

The Connecting Rod Catastrophe

Play this video.
Look at joints 1 and 2 as I alter the angle of servo 1. See how the angle of joint 2 increases as the servo increases angle 1.
Unless something is done to keep angle 2 constant as angle 1 changes, the connecting rod becomes too long, too short, or ends up in the dead center of joint 2.
In practice, the machine will lock up. The servos could overheat. If the servos were strong enough, the connecting rod would snap or bend.
There is a word for this. A mathematical word: Catastrophe. Watch this  most excellent video and be sure to understand what I mean when I later refer to some states: Stable Right, Stable Left, Catastrophe.
Where did I get the values 150 and 250? In fact, your values may be different. First, I built a control program in Java, with sliders to move the servos.
Then, I detached the connecting rod from the joint and moved servos back and forth. For every move, I checked to see if I could reattach the rod.
If not, I pressed the button marked 'Catastrophe'.
If I could attach the rod on the left side, crossing the joint, I pressed 'Stable L'.
If I could attach the joint normally, I pressed 'Stable R'.
Every time I pressed one of the three buttons, it would generate a line in the 'Data' window.
I copied the lines into a file, sorted it and entered it into a spreadsheet.
In the spreadsheet, I added columns, most notably one expressing the sum of angles 1 and 2.
Then I plotted it, and log & behold, I found the values 150 and 250.

What remains to be done, is go back to the Arduino sketch and 'translate' the value of a2 into a sensible PWM value, dependent on the state of angle 1, using the knowledge I have gained so far.

First, I'll define some macros to simplify things:

#define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  600 // this is the 'maximum' pulse length count (out of 4096)
#define SERVORANGE (SERVOMAX-SERVOMIN)

// The findings from the spreadsheet #define A2MIN 150
#define A2MAX 250
#define A2RANGE (A2MAX-A2MIN)

The macro to convert from angle to pulse width is pretty straightforward:
#define a2p(a) (int)(SERVOMIN + ((a * SERVORANGE) / 180))

However, for Servo 2, it becomes more complicated. The joint angle a22a depends on both Servo 2 and Servo 1. It must always maintain the invariant 150 <  a1 + a2 < 250.
#define a22a(a,a1) ((A2MIN-a1) + ((a * A2RANGE) / 180)) <<< WRONG!!

Once we have the joint angle, we can get the pulse width.
#define a22p(a,a1) (a2p(a22a(a, a1)))

Yay! End of Part 1.
The Arduino sketch is available on Github.

Now, onwards to the difficult stuff.


Thursday, August 10, 2017

OfElephantGirlsAndFuckingHugeSpiders

Of Elephant Girls and Fucking Huge Spiders

By
Jan Atle Ramsli


It was spring 1985 and lunch time around the oval redwood table in the conference room.


I, Evan Bergstrom, rebel computer geek without a job title, sat with the secretaries -- two ladies in their early forties, one blonde, one dark, both unapproachable with their business suits and their hair tied in Samurai knots. They didn’t work because they had to. They did it because they wanted to. The dark-haired one, Evelyn, was the wife of a fearsome judge. Greta, the blonde, had connections to the city council and beyond.


Gregory McMasters, CEO and major shareholder, known in the trenches as Grievous McMonster, presided over the silently chewing congregation, flanked by Lard Ass Larry Ås, conceptual designer, and Sven the Snake Svensson, director of Sales and Marketing.


Grievous seemed to have something on his mind. He downed a Coke, burped, and squinted at the secretaries. Turning to me, he asked, “So, Bergstrom, what was that phone call about? Last Friday, wasn’t it?”


Shit. Of all the things he could possibly interrogate me about, it had to be that phone call -- as if I had any control over who calls me and who doesn’t.
I had been sitting right here, and he’d been sitting right over there, red-faced and surly, listening to my nervously stuttering progress report, when Evelyn knocked on the door, opened and said there was an urgent phone call for Mr. Bergstrom.
However, from the look I got from Gregory McMasters, it was clear that nothing in this world could be more pressing than a progress report. From my point of view, the verbal report consisted mostly of responses to questions beginning with ‘Why in the goddamn hell’.


The latest stock market updates were almost a week old, and for fuck’s sake, how in the hell was anybody going to get any work done around here.
My ingeniously crafted, automated download scripts had failed, time and time and time again because the modem dialed the wrong number, hung up in the middle of a transfer, and sometimes even interfered with the switchboard in the reception. Everybody wanted me fired.
The sad reality was that converting manual dial-up modems into autodial modems had proven more difficult than initially thought. Though quite interesting to contemplate, the result resembled a crow’s nest, and the home-made tone generator needed constant adjustment.


But, McMonster had been adamant. “You’ll find a way.”


I was about to explain how that way might eventually lead to the purchase of a Hayes-modem from America, a five hundred and forty-nine dollar super-gadget capable of solving all our problems, when Evelyn explained that there there was a life or death situation at my home. I had to take it in the reception.
With an angry frown, McMonster had let me go.


“So, what was it? Tell us.” Larry Lard Ass never missed a chance to mock the proletariat. He’d start with an innocent question like this, then wiggle his way through my brain until he had enough information to make me look like an idiot. He was the one who had tricked me into admitting that yes, in theory, a manual modem could be converted into an autodial modem using only a couple of relays and a tone generator.
That despicable, lazy crook wasn’t very intelligent--far from it--but he had such a God-given gift for leading innocent people into misery.
If my legs were more flexible, I’d kick my own ass for talking to him.
All of his WordStar files were about 15-25 kilobytes in size, and they all began with with the word ‘Outline’, followed by a couple of pages worth of bullshit, bait and platitudes, stinking of swindle to high heaven. How people could invest millions in underground factories that only existed on two pages of printout was beyond my comprehension, but Lard Ass drove a Mercedes to prove that ‘yes, they can’.
According to himself, Larry Ås was the most creative, the most productive, the most deserving of all, and the rest of us losers were but bleak copies of his scintillating genius.
One day, that pig-eyed flesh mountain was going to get what’s coming, if only I could figure out how.


“Come on. Tell us.” Sven the Snake. Tall and skinny, he got his name for the way he slithered around the office, not for being more devious than Lard Ass. He was an honorary member of the Credit Union, with a dozen bankruptcies under his belt. Lately, he had been forced to downsize. He used to drive a Jaguar, but now he drove an Audi Quattro. His wrinkled face and pointy nose made him look so miserable that it was hard to decide whether he was evil or naive. He wasn’t on my shitlist just yet, though by joining this fucked-up lunch table inquisition, he was getting there fast.


Alright, then, whatever. “It was my wife, sir. She was standing on a chair in the living room and couldn’t get down.”
McMasters raised an eyebrow. “Then why in the goddamn hell did she climb onto the chair in the first place?”
“There was a fucking huge spider on the floor, sir. She needed me to come home and kill it.”
Could we leave it at that?
Of course, not. Larry Lard Ass broke out in laughter. “Haha. That sounds like a book title.”
“What does?”
“Of Mice and Men, only this one is called Of Elephant Girls and Fucking Huge Spiders.”


Even the secretaries laughed.
I cringed. My dear wife Elisabeth was busty, yes. And she had a round, lovely face. But she was no elephant girl.

The lunch was over. Gregory and Larry returned to their offices, Evelyn took up position in the Antechamber, and Greta shuffled out towards the reception.


… and I hadn’t even finished the story. After I told my dear Elisabeth to roll up a newspaper and bludgeon the spider to death, then take a cigarette lighter and cremate it, she stumbled and fell off the chair. She hit her arm against the table, broke her wrist, and ended up in hospital. Yes, she’s all right now, thank you for asking.


The solution came to me while reading about the advent of digital cameras, capable of storing several rolls of film on a floppy disk. Larry had small hands. It wasn’t an optical illusion brought on by the fact that his fingers resembled bratwurst. His hands were really that small. He always fumbled a lot at the urinal. Perhaps he had a small penis, too?
I bet he did. Now, combining this with state-of-the-art hardware and software, the photocopier in the reception and the impending teambuilding session next weekend, I had a recipe for revenge.


Digital cameras would be here Real Soon Now, but I couldn’t buy one just yet. I could, however buy a digitizing board for my home PC and hook it up to the TV output from my Panasonic VHS OmniMovie Camcorder PV-200D.
The digitizing board cost a fortune, but it was worth it.
Now, unable to resist a challenge, Larry would never know what hit him.
I aimed the camera at my home office chair, adjusted the focus, then removed the chair.
Bending forward over the keyboard with my pants around my ankles, I now stood where the chair had been, watching my naked backside on the screen.
I pressed ‘Rec’. The cursor traveled downwards, scanning each line of my glaring, green behind.


A photograph can never lie, they say. Welcome to the future: PC Paintbrush for MS-DOS. I loaded the file, cleared enough pixels along the thighs and butt cheeks to make it look as if they were squeezed against a glass plate, then saved a new file.


Perfect. I pressed ‘Print’.
Oink, oink, oink, oink, the printer grinding made me wish I had the money to buy a laser printer, but my computer equipment already cost more than a small house, and Elisabeth was a wonderful, forgiving wife, but even she had her limits.


The next day, I brought my printout to the office. In the reception, I made a copy, folded it up and kept it, waiting, scheming, grinning, machinating, occasionally doing enough useful work to keep the vultures at bay.


Weekend. Yay. Drinks in the boardroom. Gregory insisted. “Anyone who doesn’t get properly drunk at this party will get fired.”
He was probably hoping to grab the secretaries by their most intimate body parts, haul them into the antechamber and have his way with them.
I had other plans. As soon as Larry Lard Ass’ voice began to slur, I staggered his way. “Hey, Larry, how’s it hanging?”
Larry grinned. “Slightly to the left. How about yours?”
Bingo. I pulled my photocopy. “I dunno, Larry. See for yourself.”
“What is that? It looks like a … is that a butt?”
“That there is proof that not only am I the hardest drinker, but I’m also the most creative. The rest of you losers are but mere copies of my genius.”
He snatched it. “You mean it’s your butt? How the hell did you do that?”
“Gregory said that whoever doesn’t get properly drunk will get fired. That’s my proof, right there.”
“Yeah, but … did you sit on the copier?”
I laughed. “How else would I have been able to copy my own ass?”
“And it didn’t break?”
“The glass is made of a composite material to prevent dust particles from settling on the surface. Bulletproof glass, my friend. Bulletproof glass. You can go and check it out if you want to.”
He tilted his head at the paper. “You’re joking.”
“Keep it. You can say it’s yours. I’ll just make another copy. Hey, I could make a copy for everyone--”
Larry’s eyes darted between the antechamber and the reception. “No. Don’t do that. Let’s keep this to ourselves, shall we?”
I sniveled. “Sure, man. Whatever.” As I shuffled towards my seat at the oval redwood table, Larry had left the room.


Ten minutes later, a rumbling crash and a scream told me my plan had worked.
Gregory looked up. “What in the goddamn hell was that?”
Sven the Snake turned toward the reception. “It sounded like Larry.”
I stood up and followed them at a safe distance.


Larry stood, butt naked, gaping at the broken photocopier. Glass splinters stuck out of his bottom, dripping with blood.
There was a sheet of paper in the outbox.
I strolled over and seized it.
Ha. Though I had been right in my conjecture about the size of Larry’s penis, it didn’t matter. There would be no investigation to find out whodunit.


“What in the goddamn hell are you doing?” Gregory roared.
Larrys’ face was a giant tomato. “I, uh, thought it would be stronger--”
My turn. “It reminds me of a new, revolutionary operating system for personal computers.”
“What?” Gregory turned.
“Microsoft Windows, graphical user interface. Only this one is called Micropenis Broken Window, catastrophic loser interface.”