The physical to the virtual

If you’re like me, you have at least 40 computers lying around, some of which have software installed that’s useful just often enough to justify their continued existence — inevitably, right after you decide the hardware would be useful for another purpose and wipe out the disk.

In this day and age of virtual computing, it seems like it should be trivial to make a drive image, drop it on a network drive, and then mount that as a virtual image.  I don’t know of any drive imaging software that’s directly compatible with virtual machines, or vice versa, so there’s a conversion step involved, where the image from the drive imaging software becomes a drive image for the virtual machine.

Conversion is probably the wrong word to use here, since the process seems to involve running the drive image on the virtual machine software to recover the image.  For virtual machines, I used VMWare, and for the drive image software, I used Ghost.

Getting Ghost to save its images to a network share is a matter of selecting the right options when creating its boot disk, most notably the network driver, that has to match the hardware of the machine you’re making the image of.  Note that there appears to be a 2 gigabyte limit for files (probably because Ghost is essentially running from DOS) so that Ghost will need to create “spanning” files, or a whole bunch of 2 gigabyte files, that will comprise the image.

If all goes well here, create another boot disk for Ghost to restore the image.  This time, you’ll want to get the right network drivers for VMWare, which emulates “AMD PCNet II” hardware.  You can get the right drivers here.

Booting a virtual machine from there, I noticed that Ghost.exe wasn’t actually on the boot disk (makes sense, since it’s over 1 megabyte by itself) so I copied it to the network drive made accessible to the boot disk.  Before running it, I noticed that I had to manually run “mouse” (the mouse driver) to be able to use my mouse for its DOS-based GUI.

Following the menus to select an image, I got to the point where a dialog box came up to select the image, filling in the A: drive as the default location, and the machine locked up.  I don’t mean just the virtual machine either, but the host machine itself.  Trying various combinations of A: drive access, removal, and virtualization was no help, Ghost would consistently lock up at this point.

The problem appears to be the dialog itself, and perhaps whatever it’s doing to the floppy drive.  Selecting the file from the command line did the trick:

ghost.exe -clone,mode=restore,src=first_1.gho,dst=1

Note that this takes a long time.  It took about 12 hours to recover an 80 gigabyte hard drive into a virtual machine.  Your mileage may vary.

After all this, once the virtual machine comes up, the almost inevitable result for an XP system will be a blue screen of death — easily remedied by booting the virtual machine from the XP installation CD, and running the recovery process (by pretending to install up until the point where it detects a prior installation of XP, then pressing R.)

Share

More Tales of Loot (and Another Apartment)

Loot de Doot Doot and I moved into a high-rise Streeterville apartment that didn’t have any pet prohibitions.  At one time, it must have had a wonderful view, since one entire wall of the apartment was comprised of glass windows.  By the time I moved in, another building had been built right across the street, blocking all but a sliver of Lake Michigan.  On the plus side, at the right time of day it was possible to see the residents of the building across the street brushing their teeth.

Helping us move were a couple of big guys who did moving on the weekends, one large enough to have to duck to make it through doorways.  There was a microwave on top of our full-sized refrigerator, and he pointed over and asked, “does this go?”  “Sure,” I said, meaning the microwave, and he picked up the refrigerator with the microwave on top, with about as much difficulty as I might have lifting an empty box.  Well, maybe a little less.

Demonstrating his usual good judgment, Loot puffed himself up to as big as his kitteny frame could possibly get, and actually tried to intimidate this man with his size, causing him to raise an eyebrow.  “I think something’s wrong with your cat.”

Dirty, Dirty, Loot

Dirty, Dirty, Loot

Among Loot’s many fetishes was a deep-seated need to do battle with tissue boxes, usually in the middle of the night, when decent people were nestled in their soft beds, merely dreaming of attacking tissue boxes.  To discourage this wasteful habit, I hit upon the idea of surrounding each tissue box in the apartment with packing tape, face-up, so that a cat would pretty much have to step on it in order to get to the tissue.  It worked — in the morning, the tissue box would still be full, and there was a ball of tape saturated with white hairs.  Each night, I’d do this, and each morning, there would be a sticky ball of tape.  It was a full two years before the tape was actually intact one morning.  (I watched Loot carefully for a few days to make sure he wasn’t sick, but it appears that he actually had managed to learn something.)

Like many other cats, Loot had a knack and desire for unseating potted plants and playing in the dirt.  When caught, Loot would insist that “somebody else” must have knocked over the plant and played in the dirt.  He’d explain away the dirty patches on his normally white fur as being “some kind of genetic thing,” or that maybe “some guy had put dirt on him.”

When we got a little potted cactus, its spines seemed like an ideal Loot-deterrent, and showed all signs of being the first plant that would survive more than a few days in an apartment with Loot.  It took the apparently random deaths of several cacti before we caught Loot in the act:  he would very carefully position his mouth around the spines, and once he was finally in position, poke his teeth into the fleshy part of the cactus.  Then he’d sit and watch the juices run down the plant with the kind of smug expression that only a cat can muster.  Future cacti survived by virtue of getting the tape treatment that ultimately proved successful in protecting my tissue boxes.

For years, I had been receiving anonymous postcards in the mail, with only the words “wish you were here!”  They came from all over the United States, and occasionally, foreign countries, always the same message, but sometimes in different handwriting.  Every time I moved, they would be mailed directly to the correct address, so I reasoned that they must be coming from somebody I knew, but I had no idea who.  About the time I moved, the postcards tapered off, but I started receiving stuff.

Among other things, I received a dozen sets of curiously small ceramic cat salt-and-pepper shakers, a set of steak knives missing a knife (the special instructions in the order indicated that the factory was to remove a knife before shipping,) a cheap electric drum machine with the power supply missing (with instructions not to ship one included on the packing slip), a dozen personalized pens with my name misspelled, three extension cords snipped in half, and a gross of turkey basters.

Whoever was sending these things was purposefully toying with my intense desire for things to work and my equally strong desire not to throw things away.  I tried to use the ceramic kittens.  I tried to locate the missing steak knife, and a power supply for the drum machine, and actually repaired the extension cords, most likely spending more than simply buying extension cords outright.  I couldn’t think of anything to do with 144 turkey basters, but this was close to the number of apartments in the building, so at 2:00 a.m. one morning, I put a turkey baster in front of every door in the building, with a post-it note attached to each one that said, “seems like something you can use!”  They might get thrown out, but a few might actually prove useful, thus assuaging my guilt better than simply throwing away 144 perfectly serviceable turkey basters.

I never did find out who sent my the postcards, or the stuff.

Warm Laundry

Warm Laundry

I bought an antique clock that needed some work on the mechanism.  Over the course of about a week, I disassembled the entire thing, and put it all back together, having adjusted every bearing and lever.  I wound it and left it on the coffee table overnight, so see how accurately it could keep time.  In the morning, I discovered that it had stopped some time during the night.  I couldn’t think of a reason in the world why it would stop, and completely disassembled and reassembled the mechanism once again, and it showed no signs of stopping while I watched it.  But the clock wouldn’t run for an entire day, always having stopped some time during the night when I checked it in the morning.

Every few months, I’d work on the clock with similar success, utterly failing to find anything wrong with the clock that would explain its stoppage.  After about a year of this, I happened to be up late, and found Loot sitting near the coffee table, staring at the pendulum.  After a few minutes, he swatted it with his paw until it stopped, and walked away, slowly and self-satisfied.  Yes, it turns out there was absolutely nothing wrong with the clock.

The building management decided to go condo, and had a party at a neighborhood restaurant for the residents to encourage them to buy their own units.  It was a nice party, with beer, blues music, and their own t-shirts.  At the end, they passed around a little survey for residents to provide feedback by putting a tally next to statements they found true.  At the bottom of the page was the statement with the most votes, where somebody had written in, “better than that weird turkey baster promotion.”

Share

A Tale of Loot (and our apartment)

When I first moved to Chicago, I moved to a cheap apartment known as a “4+1,” for four levels of living over one level of parking.  No pets were allowed, but they did allow the tiger fish I had at the time, so it wasn’t a concern.

Loot Talks to the Fish

Loot Talks to the Fish

After about a month, my sister-in-law found a stray kitten.  He was tiny, and white, and fresh out of the bath he’d been given.  Every time I spoke, he’d stare at me with the most intense expression of contentment I’d ever seen, on a cat or otherwise.  I decided to take him home.

I’m of the opinion that cats should not have elegant or sophisticated names.  Cats tend to be full of themselves anyway, and a patently ridiculous name can help their humility.  So his name thenceforth was “Loot de Doot Doot,” or just “Loot!” for short, which he’d recognize as his own name when properly yelled for emphasis.

Although Loot never scratched, he did have ear mites when I first got him, and I had to take him to the vet a few times in the first week.  To avoid making it obvious to the management that I had a pet (it was not clear what the consequences would be) I tucked Loot into my backpack, which he actually seemed to enjoy.  On his final trip home from the vet, I stopped to buy a couple of hotdogs from a street vendor, and without thinking, tucked them into the small outer pocket to eat when I got home.  He looked pretty crazy when I let him out, and didn’t want to ride in the backpack after that, though he would occasionally climb in … just in case.

Loot was a source of chaos and a loyal companion, with more of the former.  I returned home from work one day to discover that Loot had emptied an entire economy sized box of tissues, spreading torn tissues all over the floor.  He had managed to cover every visible area of carpet, and sat proudly in the middle of the room so that I could admire his handiwork.  “Now you don’t have to walk all the way to the box if you need a tissue,” he explained, “you can just stop, bend over, and pick one up.”  He seemed genuinely confused why I was not pleased.

I invited a friend from college over for a beer, and in the manner of cats, Loot made himself scarce.  I didn’t think to mention to my friend that I had a cat, until he was sitting on my couch, and Loot leapt up behind him and grabbed his head with both paws. From my angle, I saw an amazingly comical expression of shock and surprise on my friend’s face.  Luckily, no blood had been drawn, because I could not stop laughing.  I actually have not seen him since that day.

One of Loot’s few talents was the ability and desire to keep things on his head, which I would occasionally exploit by putting small items on his head, which he would carefully balance until he forgot about them, or got distracted.  On a regular basis, I would balance empty cans on his head, which he would dutifully keep in place, usually until I bothered to retrieve them.

A Little Hat

A Little Hat

On Saint Patrick’s Day, one of the beer companies had a promotion where they topped their beers with little green plastic hats.  We had a few friends over, and we had about a six pack of hats.  One of the party-goers, perhaps me, put one on Loot’s head, and he proudly wore it for hours, holding his head flat, walking around slowly and carefully before ultimately refusing to move for fear it would fall off.  When it inevitably did fall off, he seemed inconsolable until he was distracted — or perhaps 10 seconds.

The apartment itself sucked.  One of Loot’s more useful pursuits was chasing and eating roaches, which I tried to discourage in the event that he was ingesting pesticides, but he did at least seem to keep them at bay by smacking them as they crept out of the baseboards.

My neighbors were insanely loud.  After being woken up again at two in the morning (no easy feat, I am a very heavy sleeper) I visited my upstairs neighbor.  I had to pound on the door, and he answered, apparently oblivious as to both the time and why I would suddenly stop by for a visit.  I was struck by two things.  First, there were moving boxes everywhere, so it was hard to see anything, even furniture.  Second, although loud, his stereo actually seemed a little quieter than it did downstairs in my apartment.

“Come in,” he invited.  We stood among stacks of boxes, since there appeared to be nowhere to sit.

“Did you just move in?” I asked conversationally, since it didn’t appear obvious to him why I’d stopped by in my bathrobe at two in the morning.

“I’ve been here five years,” he said, his expression saying, “what an odd question.”

“Moving out?” I said, trying not to seem too hopeful.

“Nope.”

“Well, I’ve come up here because I can hear your stereo in my apartment below yours.  And I don’t just mean that I can make out the words, I mean it’s actually at a higher volume in my bedroom than I’d turn on my stereo if I were listening to my own stereo.”

He pointed between the boxes at his massive speakers.  “Nah, man, I point my speakers at the floor to make them quieter.”  I could see that the speakers were, indeed, lying face down on the floor.

“But I live below you.”

“Yes?”

“Where the sound is directed.”

“Huh?”

“Look, could you just turn it down so I can sleep?”

“That’s why I put the speakers on the floor.  It makes it quieter.”

“It’s louder downstairs.  Pointing them at the floor makes it quieter up here, but louder down there,” I explained slowly.  “It would be better if you pointed them at you and then turned the volume down.”

He seemed completely baffled by my words.  “But…  Pointing them down makes it quieter.”

Surprisingly, I successfully fought the urge to punch him in the face and managed to talk him into turning the volume down.  Later, I had the same conversation with him about five more times.

Although probably the most obtuse, he certainly wasn’t alone.  On any given night, somebody in the building would either be having a party, have an important drug deal to conduct, or find some excuse to turn their stereo up so loud that it was impossible to sleep.  I wasn’t sure how anybody in the building could sleep, and it didn’t help that the building itself had thin walls and a structure that would resonate with bass.

So without looking back, I decided to move to a nicer place that actually did take pets.  The leases overlapped, so I made sure Loot had enough food and water and spent the night in the new place the first day I could.  After work the next day, I went back to pack up the last of the stuff for the movers, and as I approached the apartment building from the garage underground, I heard an incredibly loud, rhythmic pounding.  “Good riddance to this place,” I thought.  It was louder, in the garage, than it was in my apartment when the tenant above blasted me awake.

As I got off the elevator, the noise was overpowering.  A repetitive beat, but now I could hear a repeating synthesizer melody over the bass.  At about the same time I recognized the tune as being one of the “back up” loops from a cheap Casio synthesizer, I realized the noise was actually coming from my apartment.

The Casio was connected to the only amp I had, which was actually quite powerful and loud.  Loot had managed to turn it all the way up, then step on the right combination of keys to put this horribly cheesy beat into an infinite loop.  Loot sat on the kitchen table, looking quite pleased with himself.

I rushed in and turned it off, leaving the door open.  A woman leaned in, one of my nicer neighbors whom I rarely saw.  She noticed the boxes, and said, “oh, are you moving out?  I’ll miss your little cat.”

“Yes…  What?”  As far as I knew, she had never been in the apartment before, and I’d certainly kept it a secret that I had a cat at all.

“Oh yes, every time somebody comes up the elevators, his little white paws come out under the door, and he talks to us.”

“Oh.  Well, I hope the noise didn’t bother you.  How long was it going, anyway?”

“No, it didn’t bother me at all,” she said, though I wasn’t sure if she were just being nice.  She gave it a moment’s thought.  “A little over 24 hours, I think.”

Not one person complained.

Share

Just Like Suicide

On my first day in college, I was settling into my dorm room, and in wandered one of the ugliest people I’ve ever seen.  The college experience is unique in that you’re suddenly in close proximity to a large number of people whom you don’t know, are vaguely your own age, are on the cusp of adulthood, and coincidentally the onset age of many forms of mental illness.  The little troll-like beast looked around at the stuff I was unpacking, and half-asked, half-pronounced, “So, you like hockey?”

I didn’t want to leap to conclusions, so I looked around for any indication that I liked hockey, or that anything in the room implied anything of the sort.  It’s not that I dislike hockey, it’s just that I never gave it a second thought.  Perhaps it was some kind of test question, or conversational opener.  “Why do you ask?”

“You just kind of looked like you like hockey,” he replied.  This didn’t strike me as particularly complimentary.

After a moment, it was apparent he was going to say nothing more.  “Do you like hockey?” I asked him, for no particular reason, starting to feel vaguely uncomfortable with his continuing presence.

“It’s okay, I guess,” he stated flatly, and wandered out the door.

I’m normally the type of person who ends up being friends with people who are socially awkward or who don’t make friends easily.  I’ve never been able to bring myself to walk away from the lonely, and can usually find something interesting or redeeming in anybody.  By virtue of sticking up for or trying to help the downtrodden, I seemed to end up hanging out with them frequently.

I made a sincere effort with the troll to engage him in normal conversations.  Partly because of his striking unattractiveness, I made even more of an effort than came naturally.  In nearly every conversation, the troll managed to insult me in some way, and despite my best efforts to draw him in to social situations, got nowhere.  Everybody absolutely hated him.

I didn’t hate him, which meant that I got to commiserate with people who had to deal with him.  He actually had an amazing ability to say, at any given point, the very thing that would piss off the greatest number of people, and was such a pernicious loser that he was thrown out of every organization he attempted to join (an amazing feat, frankly) — he even attempted to join the volunteer fire department and was judged “a danger to himself and others” on the first day of training.

After a while, I gave up.

Near the end of the quarter, I was walking by his room on the way to the cafeteria, and heard him wailing, “I just can’t win!”   I stopped for a moment, and he howled, “I don’t care any more!  I don’t care any more!” in an anguished screech.

I wasn’t quite sure what to do.  A few friends saw me standing there, and stopped and stood there with me.  After a moment, the troll screamed louder, “I don’t care any moooore!  I don’t care no moooore!”

About a week earlier, we had all been present on the couches in my room in a mad college combination of studying and drinking when our mutual friend “Matt” staggered into the room and announced, in a drunken slur, that he’d “had quite enough.”  We waited for Matt to say something else, or pass out, but instead he ran toward our large, open, fourth-floor window.

My roommate, closest to the window and thinking faster than any of us, managed to grab Matt by the ankles as he was halfway out the window.  Matt bent at the waist as momentum carried him forward, and his face hit the side of the building.  Three of us hauled him back inside, unconscious.

Matt’s face was scraped up, but otherwise he didn’t seem in very bad shape, so we dumped him in the common room, careful to leave him face down.

Neither Matt nor the rest of us spoke of the incident again, but it was foremost on our minds as we stood outside the troll’s door.

“You think he’s going to kill himself?”

“He probably should, I hate that guy.”

“Oh come on, we can’t just stand by and let him kill himself, whether we like him or not.  We should get him some help.”

“Okay, let’s go in.”

I knocked, then banged, on the door, but the troll didn’t answer.  He just kept up that awful screaming:  “I don’t care any mooooore!”

Crap.  I tried the knob, but his door was locked.

“Now what?”

“We’ve got to break in”

We knew from experience that the dormitory doors could be opened by applying enough pressure to the metal frame while pushing the latch.  We ran to our rooms and came back with a crowbar and a thin screwdriver.  When we got back, the troll was still screaming, “I don’t care any moooore!”

I winced at the awful noise.  “My god, he sounds like he’s suffering.”

“At least we know he’s still alive.”

After a moment, the four of us managed to spring the door open, and tumbled into the troll’s room.

He was sitting in the dark under his desk, in nothing but his underwear.  He looked remarkably pleased to see us break his door and spill into his room, as if we’d all decided to visit him on his birthday.  He was wearing huge, ear-covering headphones, which he removed upon seeing us.

“Oh hey, guys,” said the troll, “I was just listening to some Phil Collins.”

Share

X10 and Compact Fluorescents

X10 is an unfortunately-named industry standard for controlling devices (e.g., lights) via low-voltage signals over power lines.  First created in 1975, it has the advantage of having relatively cheap hardware, and although there have been attempts to create a more modern and capable replacement, they have been hampered by high costs — an X10 switch might cost $10 if one shops around, and a Lonworks or Insteon switch might cost $100 or more.  Until the day comes when each outlet in my home is also its own web server, I think I’ll settle for the balance of control and cheapness that X10 provides.

X10 works by adding a 5 volt signal to the powerline’s power, which is then picked up by an X10 device that listens to the embedded command (e.g., turn on, turn off, dim, and so on.)  The problem with this is that various other things plugged into the powerline tend to absorb or attenuate this 5V signal, so by the time it reaches the device which should be listening, it can be too weak to reliably accomplish anything.

The traditional solution is to locate devices that are weakening the X10 signal, and place them behind a filter.  This works pretty well, although it can be tedious to locate the devices responsible, and it’s possible to require a lot of filters for acceptable performance.  An alternative is the installation of a repeater, which listens for the signal and echoes it back to the powerline, presumably closer to whatever device you’re trying to control.  It’s not cheap, and if the signal is weak enough, either the repeater won’t hear the original signal, or the device won’t hear the repeater.  I’ll come back to this problem in a moment.

Compact fluorescents are little fluorescent bulbs that screw into the place of regular bulbs, and consume considerable less power than incandescent lights.  However, they aren’t compatible with X10 switches designed for incandescent bulbs.  You can either use X10 switches designed for fluorescent loads (also known as “non-dimming,” “appliance,” or “relay”) or you can buy dimmable compact fluorescent bulbs, which has the advantage of able to dim them … somewhat.  (As they dim, they flicker and go out where an incandescent bulb would continue to dim through yellow and red — compact fluorescent bulbs simply cannot be dimmed as well or through the same range.)

However, these bulbs have the side effect of attenuating the X10 signal, and built-in lights aren’t candidates for simple plug-in filters.

On the plus side, there’s a device that can overcome this — not by filtering each source of attenuation, but by boosting the X10 signal itself.  It’s called an XTB, or X10 Transmit Booster, and it’s a clever little device that sits between the source of your X10 signals and the power line, intercepting the 5 volt X10 signal and putting out about a 20 volt X10 signal.

It works really, really well.

The XTB kit and components

The XTB kit and components

The company — or more accurately, guy — who produces these hasn’t the wads of cash for UL approval, so they’re sold in kit form.  The kit itself is beautifully put together, with excellent instructions.  The trickiest part was a surface-mount op-amp.

When it arrived, I’ll admit to being eager enough to whang the thing together in about half an hour, with the caveat that soldering components is almost second nature to me, and that I probably should have read the part about mounting the LED a little more carefully.  On the plus side, it worked flawlessly.  For those not adept with an iron, it’s possible to have it assembled for you.

If you’re running X10 and have any kind of signal issues, I’d recommend this before I’d recommend bothering with filters.

Share

Airports, Great Places for Practical Jokes

I fly a lot, though I flew even more in the days before online conferences were remotely practical.  In the early 90’s, I was flying from O’Hare to Dulles.  I had some time to kill, so I used a payphone to dial my voicemail.  If that didn’t make it clear that this was nearly 20 years ago, perhaps the fact that I had a pony tail and dark glasses, and looked vaguely like a Bond villain does.

Then, as now, people would occasionally leave rambling messages that didn’t really say anything, but just in case there was something important at the end, I’d listen to the whole thing.  I’m sure I looked fairly frustrated after the fourth time the caller meandered his way through saying the same thing he easily could have summarized — or not said at all — and I noticed a girl standing at the pay phone next to me, holding the receiver to her ear with a vapid expression and twirling her gum, staring at me.

I put on a crazy expression and said into my receiver, “I killed him, he’s dead,” in a thick German accent and slammed down the phone on the still-rambling voicemail.  Then I turned my head slowly and looked at her.

“Oh.  My.  God,” she mouthed, and hung up, and scurried away.

I didn’t give her a second thought, and checked my watch.  Plenty of time before my flight, so I figured I’d go get a pretzel or something.  As I got in line, I looked over, and the girl is chatting with a policeman.

Uh oh.

She sees me, yells “Never mind!  Thank you for the directions!” at the cop, and scurries away again.  The cop shrugs at me as if to say, “what was all that about?”

I didn’t see the girl again, and by the time I got through the pretzel line, my flight was boarding.  As I got on, I noticed the same girl was on my flight, already seated.  And my seat was right behind her.  She had noticed me as well, and now wore an almost comical expression of abject terror.  I briefly considered saying something to her, but concluded that she was so wound up that it could not possibly end well.

When the flight attendant came by to ask her if she wanted something to drink, she nearly jumped out of her seat, then yelled back, “I CAN’T SEE ANYTHING WITHOUT MY GLASSES.  I WEAR GLASSES.  BUT NOT RIGHT NOW.  WHEN THEY’RE NOT ON MY FACE, I CAN’T SEE A THING.  I CAN’T WEAR CONTACTS, EITHER.”  She spent the rest of the flight alternating between sitting perfectly still and comically pretending not to be able to see at all.

People tend to jump out of their seats when a plane lands, but nobody moved more quickly than she did.  If she had brought any luggage on board, she was content to leave it behind.  As soon as the door opened, she climbed past everybody, yelling, “I have a connection to make!  To … uh … Mexico!” and plowed off the plane, running down the jetway.

Dulles has a weird system where passengers need to take a huge bus between terminals, and when I stepped on the bus, surely enough, there was the same girl, pressed up against the front window, jumping from foot to foot.  I considered turning around, but she spotted me, letting out a little shriek, which she quickly stifled.  I waved and smiled, but I didn’t think anything would calm her down at this point.

Once the bus stopped, she disappeared.  Assuming she had run, I took my time, hoping not to encounter her again.  I happened to look up, out the window, and there she was on the tarmac, running parallel to the terminal.  I figured the best thing to do was to make myself scarce before airport security picked her up.


After 9-11, the TSA took over, and things got weird for a while (and, to some extent, still are.)  One thing I noticed right away were the presence of “amnesty cans,” where passengers were supposed to be able to throw things away before they got to the security line.

Like what?  Guns?  I was curious, so I walked over, and looked into the can.  The interior was kind of dark, so I leaned in.

Mostly lighters, a few bottled waters, nothing too interesting like chain saws or detonators, and a collection of things like tissue and wrappers that I cannot imagine one needs amnesty for.

One of the ever-vigilant TSA saw me, and yelled, “hey!  You!”

I’m not really in the security line any more, and as far as I know, I haven’t committed any crimes, so for some reason, my first impulse is to run.  With the can.  Hunched over a bit.  Yelling, “AMNESTY!  AMNESTY!”

Yes I did.

I have to give the Chicago Police some credit, for at least watching the Hunchback of Notre Dame, if not reading the book, since they were content to stand by with amused smiles as the TSA chased me down to the next security line, where I left the can and blended in with the crowd.

After a few minutes of searching, the guy from the TSA who yelled at me recognizes me, but I can see the uncertainty in his eyes.

“The airport is no place for practical jokes,” he says to me, managing to be both pointed and noncommittal.

“So…  What exactly did you have in mind before you found this out?”

Share

Anteaters, Anonymous

For a while in college, I lived in a weird, 50’s-era, largely metal dormitory.  It probably seemed ultra-modern at the time, but now had a kind of vintage, well-worn look to its metal shelves and cabinets.  Also at the time, I was quite fond of Swiss Cheese Crackers (renamed to Nabisco Flavor Originals Swiss Cheese Baked Snack Crackers, and apparently discontinued, which is really too bad, they tasted great.)  I bought a box with what little money I had, ate a few, and put them on the shelf next to the bed.

I had the afternoon off in my class schedule, so I took a nap in the afternoon to make up for working on a class project late the night before.  It was dark when I woke up, and I didn’t know what time it was.  I thought my roommate might be home, and since he was a fairly light sleeper, I thought it best not to turn on the light and check.  However, I was hungry, so I located the box of crackers, and sat quietly on the bed, eating them.

I had eaten my way through about half the box when my roommate came home, and turned on the light.  I noticed two things immediately:  first, it was about dinner time, and therefore it would not be uncivilized for me to get up and go get something better for dinner.  Second, as I lifted another cracker from the box, I noticed that it was crawling with tiny red ants.

In fact, they were so covered with the little ants, the crackers looked more dark red than their customary yellowish-orange, and appeared to gently undulate with the motion of all the ants.  I dropped the cracker back in the box, and picked up another.  Surely enough, it was covered too, and a peek in the box confirmed that the entire box was full of them.

I took a moment to calculate the odds that the half-box of crackers had been entirely ant-free while I was consuming them, and the act of turning on the light had suddenly winked the ants into existence to neatly coat each cracker and fill the box.

It seemed vanishingly unlikely.  I’d been eating crackers and ants for probably half an hour.  Did the flavor seem a little off?  I hadn’t really noticed.  Experimentally, I picked up a cracker dripping with ants as if it had been dipped in ant-colored honey, and popped it in my mouth.

Yep, hardly noticeable.

By now, my roommate was staring at me with a mixture of surprise and mild disgust.  “What the hell is wrong with you?” he said.

I started to explain about the ants.

“Not that,” he said, exasperated.  “They have pizza and bacon in the cafeteria, and you’re missing it.”

Share

High Fructose Corn Syrup and Kidney Stones

I’ll be as succinct and as blunt as I can be:  high fructose corn syrup gave me kidney stones.

For nearly ten years, I got kidney stones about once per year, on average.  Kidney stones are probably the most painful thing I’ve ever experienced, and I tried an awful lot of things before arriving at this conclusion.  Eliminating high fructose corn syrup from my diet has eliminated my kidney stones — for several years now.

I’m well aware that anecdotal evidence is not scientific, and I’m just an uncontrolled sample of one, but in my case, there’s no room for any doubt whatsoever.  There’s evidence beyond myself, however, such as the here, here,  and here.

This is prompted by this widely aired, misleading pack of lies:

High Fructose Corn Syrup Advertisement

I reject the assertion that it’s “all natural,” since it’s highly chemically processed, and I also reject the assertion that “like sugar, it’s fine in moderation.”  It’s probably fine in moderation; I can probably slip and have some every now and then without having a kidney stone, but I don’t have to avoid either sugar or honey.

I also object to this sort of snarky advertising — it implies that everybody with an objection to high fructose corn syrup does so on the basis of unfounded rumor that they cannot articulate.  And the answer?  “It’s made from corn!”

Asbestos is all natural, for heaven’s sake, so it’s hardly a strong argument that something that’s natural must be good for you.  It’s also somewhat misleading, because high fructose corn syrup certainly doesn’t appear anywhere in nature, it’s purely an artificial product.

It’s also a political ad, since it’s produced by the “Corn Refiners Association,” which is a group pushing its agenda in Congress.  Shouldn’t it be properly labeled as a political ad?

Tobacco is just as natural a product.  You can pretty much just mentally fill in “tobacco” for everything in the ad and you can see where I’m coming from.

I highly recommend avoiding corn syrup, particularly if you’ve ever had a kidney stone.

And to you, Corn Refiners Association, for shame.  I sincerely hope your thinly-veiled political ads cause a massive backlash, and that consumers educate themselves about the real danger of your health-damaging products.

Share

Backing Up Open Files on Windows with Rsync (and BackupPC)

Update:

Versions of the files below may be downloaded here.  This post is probably still useful as documentation.

 


 

This isn’t specific to BackupPC by any means, but I’ll preface this with a brief explanation:  BackupPC is a “set it and forget it” backup system driven from the server, that allows you to back up the entire network of *nix and Windows PCs.  It doesn’t require any software on the systems it backs up at all, since it relies upon rsync and smbclient, and optionally ssh.

For *nix, this works beautifully.  For Windows, this also works beautifully, except that “open files” can’t be backed up at all.  This problem isn’t unique to BackupPC, any attempt to back up or copy these files will fail, so most commercial backup systems have special “open file” clients to cope with it.

The official Windows solution for XP and later is something called a “volume shadow copy.”  It’s probably far more complex than it possibly needs to be, but essentially, it creates a pseudo-volume for any actual volume, with the difference being that you can actually back up files on it.  So, this can be handily used for rsync in order to make full backups, including every single file…  in theory, anyway.

My goals in getting this working:

  1. The solution should work with off-the-shelf components (i.e., no binaries or code)
  2. Installation and footprint should be minimal
  3. It should “just work” — if it’s too delicate, it’s not all that useful as a backup solution

It took quite a bit of trial-and-error, so I’ll skip what didn’t work, and get straight to what actually does work.  There are a few required components:

  1. winexe, a *nix program for remotely executing commands on Windows systems
  2. vshadow, a Windows program that creates and manages shadow copies
  3. dosdev, a Windows program that maps drive letters to volumes
  4. cwrsync, a Windows version of rsync (the “server” isn’t necessary)

Once all the pieces are assembled, I created a C:\BackupPC directory on the Windows box with all the necessary files.  Note that rsync does not need to be installed as a service, it actually gets loaded on-the-fly.  (Note that this directory is hard-coded in a lot of the files.) Here’s a listing of that directory:

Directory of C:\BackupPC
08/08/2008  07:11 PM                65 backuppc.cmd
08/10/2008  12:56 PM             1,928 cwrsync.cmd
07/22/2008  04:30 PM         1,082,368 cygcrypto-0.9.8.dll
04/11/2008  07:03 AM           999,424 cygiconv-2.dll
04/11/2008  07:03 AM            31,744 cygintl-3.dll
04/11/2008  07:03 AM            20,480 cygminires.dll
07/22/2008  04:30 PM         1,872,884 cygwin1.dll
04/11/2008  07:03 AM            66,048 cygz.dll
09/28/2004  02:07 PM             6,656 dosdev.exe
08/11/2008  11:08 PM             1,000 pre-cmd.vbs
08/11/2008  11:05 PM                44 pre-exec.cmd
07/22/2008  02:26 PM           348,160 rsync.exe
08/11/2008  10:12 PM               161 rsyncd.conf
08/11/2008  10:12 PM                22 rsyncd.secrets
08/11/2008  11:26 PM             1,177 sleep.vbs
06/08/2005  03:17 PM           294,912 vshadow.exe
08/11/2008  10:09 PM               581 vsrsync.cmd
08/11/2008  11:33 PM               308 vss-setvar.cmd

So, here’s how it works.  Before each backup, BackupPC has an option to call a local script first, waiting for that script to finish.  Here’s the execution chain:

  1. preusercmd.sh launches “pre-exec.cmd” on the Windows box
  2. preexec.cmd launches “pre-cmd.vbs”
  3. pre-cmd.vbs cleans up some files, launches “sleep.vbs” in the background (more on this later) and then launches “backuppc.cmd” in the background, and waits for the pid file to appear that signals that rsyncd has been launched
  4. backuppc.cmd launches vshadow, and tells it to execute vsrsync.cmd
  5. vsrsync.cmd maps the shadow volume to B:, and launches rsyncd — it sits and waits here, leaving vshadow and rsync open while the backup or rsync process runs — on the shadow copy on B:

Once the backup is completed, another local script is run — here’s its execution chain:

  1. postusercmd.sh puts a file called “wake.up” in the C:\BackupPC directory
  2. sleep.vbs wakes up, sees this file, reads rsyncd.pid, and kills the rsyncd process
  3. vsrsync.cmd now continues, since the rsync process is dead.  It unmaps the B: drive.  Once this script completes, vshadow automatically deletes the shadow volume.

Sure, it seems simple, but a lot of work went into that, since there are a lot of nuances to sort out.  Here are the file listings:

preusercmd.sh

#!/bin/bash
WINEXE=/usr/bin/winexe
UNAME="Administrator"
PWD="admin.password"
WRKGRP="WORKGROUP"
BOX=$1
$WINEXE --interactive=0 -U $UNAME -W $WRKGRP --password=$PWD //$BOX 'cmd /c c:\backuppc\pre-exec.cmd'
sleep 5
echo "Rsync and shadow copy loaded"
kill $$
# The script needs to be killed, otherwise, winexe waits for input

pre-exec.cmd

cd \backuppc
@echo off
cscript pre-cmd.vbs

pre-cmd.vbs

Const Flag = "C:\BackupPC\rsyncd.pid"
'
' Pid file shouldn't be there already
'
If DoesFileExist(Flag)=0 Then
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set aFile = fso.GetFile(Flag)
   aFile.Delete
End If
'
' Nor should "wake.up"
'
If DoesFileExist("C:\BackupPC\wake.up")=0 Then
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set aFile = fso.GetFile("C:\BackupPC\wake.up")
   aFile.Delete
End If
'
Set objShell = CreateObject("WScript.Shell")
objShell.Exec "cscript C:\BackupPC\sleep.vbs"
'
Set objShell = CreateObject("WScript.Shell")
objShell.Exec "C:\BackupPC\backuppc.cmd > C:\BackupPC\file.out"
'
' Just sleep until the file "rsyncd.pid" appears
'
While DoesFileExist(Flag)
   wscript.sleep 10000
Wend
'
' functions
'
function DoesFileExist(FilePath)
Dim fso
	Set fso = CreateObject("Scripting.FileSystemObject")
	if not fso.FileExists(FilePath) then
		DoesFileExist = -1
	else
		DoesFileExist = 0
	end if
	Set fso = Nothing
end function

sleep.vbs

Const Rsync = "C:\BackupPC\rsyncd.pid"
Const Flag = "C:\BackupPC\wake.up"
'
' Just sleep until the file "rsyncd.pid" appears
'
While DoesFileExist(Rsync)
   wscript.sleep 10000
Wend
'
' Now sleep until the file "wake.up" appears
'
While DoesFileExist(Flag)
   wscript.sleep 10000
Wend
'
Set fso = CreateObject("Scripting.FileSystemObject")
Set aFile = fso.GetFile(Flag)
aFile.Delete
'
' It's time to kill Rsync
'
Set fso = CreateObject("Scripting.FileSystemObject")
Set aReadFile = fso.OpenTextFile(Rsync, 1)
strContents = aReadFile.ReadLine
aReadFile.Close
'
Set objShell = CreateObject("WScript.Shell")
objShell.Run "taskkill /f /pid " & strContents, 0, true
'
' Wait for Rsync to let go
'
wscript.sleep 5000
'
' Delete PID file
'
If DoesFileExist(Rsync)=0 Then
   Set objShell = CreateObject("WScript.Shell")
   objShell.Run "cmd /c del C:\BackupPC\rsyncd.pid", 0, true
End If
'
' functions
'
function DoesFileExist(FilePath)
Dim fso
	Set fso = CreateObject("Scripting.FileSystemObject")
	if not fso.FileExists(FilePath) then
		DoesFileExist = -1
	else
		DoesFileExist = 0
	end if
	Set fso = Nothing
end function

backuppc.cmd

cd \backuppc
vshadow -script=vss-setvar.cmd -exec=vsrsync.cmd c:

vsrsync.cmd

REM @ECHO OFF
call vss-setvar.cmd
cd \BackupPC
SET CWRSYNCHOME=\BACKUPPC
SET CYGWIN=nontsec
SET CWOLDPATH=%PATH%
SET PATH=\BACKUPPC;%PATH%
dosdev B: %SHADOW_DEVICE_1%
REM Go into daemon mode, we'll kill it once we're done
rsync -v -v --daemon --config=rsyncd.conf --no-detach --log-file=diagnostic.txt
dosdev -r -d B:

rsyncd.conf

use chroot = false
strict modes = false
pid file = rsyncd.pid
[C]
path = /cygdrive/B/
auth users = Administrator
secrets file = rsyncd.secrets

postusercmd.sh

#!/bin/bash
WINEXE=/usr/bin/winexe
UNAME="Administrator"
PWD="admin.password"
WRKGRP="WORKGROUP"
BOX=$1
PID=$($WINEXE -U $UNAME -W $WRKGRP --password=$PWD //$BOX 'cmd /c echo '1' > c:\backuppc\wake.up')
echo "Rsync and shadow copy unloaded"
Share

Crazy Days at Metropolitan State — Inside Out

Three days.  When a patient was first brought in to the hospital, an analysis was done over 72 hours to determine if the patient is “a danger to themselves or others,” and therefore will be staying indefinitely, or if not, to be released.  It’s also the first thing a new patient, “Jomo,” said to me.

“Three days, man, and I should be out of here.”   He sounded more nervous than confident, probably reassuring himself.  “I swear, man, I just took a lot of acid, and now it’s mostly worn off.  So they’ve got to let me go, right?”

We actually had a lot of patients on the ward who claimed that drugs, particularly hallucinogens, caused their problems.  The scientific belief was that schizophrenics tended to abuse drugs, or that drugs could be contribute to the experience that tips the brain balance in a person with schizophrenic tendencies.  “Let’s hope so,” I said.  “That’s why they’ve got you scheduled for a brain scan today.”

Schizophrenia generally shows up on a brain scan, either as reduced activity in the frontal lobes, or shrinkage in the areas of the brain associated with attention, memory, and social behavior, and sometimes (at that time) used to identify schizophrenics who couldn’t be definitively diagnosed from their behavior — for example, because they tested positive for drug use within their 72-hour observational period.

I took Jomo over for his scan, and waited with him through the procedure.  He was understandably nervous — the results of this scan would determine his fate — possibly even whether he’d spend the rest of his life in an institution.  Perhaps more importantly, it could be an early indication of a progressive disease, of which he’d only experienced the first symptoms.  Jomo was at the age where nearly all schizophrenia first manifests itself — between 18 and 23 — and what he thought was a drug experience could genuinely be his first symptoms of his brain detaching from reality.

I was within that range as well.

The next day, we got back Jomo’s scan results, with the interpretation:  “inconclusive.”  The scan showed some reduced activity and shrinkage, but it was not yet profound.  Jomo would be staying for a while.


Later that night, my roommates and I had been invited over to dinner at our elusive third neighbor’s house, so we walked a few blocks to the local convenience store to pick up some drinks so we didn’t show up empty handed.  (On a side note, I never adopted the local dialect of calling the store a “packy,” short for “package store,” which referred to its ability to sell alcoholic beverages.)

On the way back, a car pulled up alongside us, and a man in the passenger seat shouted, “fuck you, Mickey Mouse!”  I was wearing a Mickey Mouse shirt.

This seemed like an unusual amount of hatred for a cartoon character, and I said, “What?”

The car screeched to a halt, and two big, muscular, prison-tatooed guys jumped out.  They looked typecast for brainlessly violent goons in a movie.  They pushed us around a bit, trying to start a fight.  None of us made any threatening moves, attempting our best to diffuse the situation, but without any idea what any of us had actually done to provoke their ire.   “Do not FUCK with us!  We have a guns in the car and will KILL your asses!” they yelled as they sped off.

“People from your ward?” asked one of my roommates as their car swerved out of sight.

“Heck no,” I said, my heart still pounding.  “I’ve never felt that threatened on the ward.”


We met our neighbor for the first time, who we hadn’t actually seen much. We’d seen his Trans Am, the exact model featured in Smokey and the Bandit, complete with the bird logo on the hood.  It had been out of style for a while even then.  The man himself usually wore mirrored aviator sunglasses, and had a Burt Reynolds-style moustache, but he’d never actually stopped to talk until that day, so when he told us all the neighbors were invited over to his apartment for a cookout, we all agreed that it would be a good opportunity to meet him.

He grilled hamburgers outside, and served us in his kitchen.  None of the other neighbors showed up, but he only had six chairs — and there were five of us and one of him.  We ate burgers and chips and drank the beer we had brought.  About halfway through her burger, one of the girls pulled the other two girls aside, and they all left, leaving me, my roommate “Tom,” (who also worked at Metropolitan State) and my neighbor together.  I had another burger while we talked, eating quickly as usual.

Our neighbor went out back(probably to tend the grill, or grab another beer) and “Nancy,” one of my roommates, stepped back in.  “Something’s not right,” she said.  “I’ve been throwing up.  All of us have.”  Tom and I looked at each other.  None of the girls had eaten all of their burgers, but they seemed fully cooked.  Tom had eaten all of his, and I had managed to eat two.  Nancy left quickly again, clutching her stomach.

“Uh oh,” said Tom, looking a little green.

We felt the heave at the same time.  Tom headed for the front door, barely making it outside.  I headed for the sink.  After heaving, I was rinsing out the sink when Tom came back in, and whispered to me, “I think we’re in a lot of trouble.  I’m hallucinating.”

I looked up at Tom.  I noticed his dilated pupils first, then his face distorted like it was melting.  His face and body pulsed and flowed and changed colors as I stared, fascinated and horrified — and suddenly nauseated again.  Tom fell to the floor, crawling away, as I bent over the sink again.

I saw my neighbor come back in through the back door.  “Something’s wrong with the food,” I told him, not quite thinking straight, and trying to think of what kind of food poisoning would cause hallucinations.

“I know, motherfucker.  I didn’t eat any,” he said, staring at me through his mirrored sunglasses.  My reflection in the sunglasses undulated and moved crazily.  In those sunglasses I could see my own soul, twisting.  “That’ll teach you fuckers to narc me out.”

I hadn’t a clue what he meant.  “What?” I said, unable to tear my eyes away from his glasses with my reflection dancing in them.

He pushed me into a chair.  After a moment, I’d realized he’d tied me to it.  My stomach was still heaving, but there was nothing in it.  “Where is everybody?”  I asked.

“Doesn’t matter, Mickey Mouse,” said one of the huge guys from the car who had pushed us around earlier.  He and the other goon from the car were now there, two guns on the table.  “We’ve got your friend in the other room.”

I can’t string any thoughts together; as I watch the room and the three guys in it swirl and pulsate.  Perhaps I have done something horrible to them.  Had I called the police on them?  Perhaps I had informed Starsky and Hutch, or maybe even the Duke boys?  I couldn’t remember.

One of them pulls out a gigantic knife, and I watch the blade bend and twist and reflect painful light through my skull.  “We’re going to give you a choice.  We can either kill your friend, or cut off one of your thumbs.”

I’m now beginning to realize the kind of trouble I’m in.

I hold out my left thumb.  There isn’t really a choice involved.  I’m suddenly fascinated by it, as it squirms and dances, and imagine it gone from my hand.   “You’ll let him go, right?”

“That’ll cost you both thumbs,” said my neighbor with a laugh.  He ties my hand tightly to the end of a chair, and the gleaming, swirling knife comes screaming out of the sky toward my thumb.  It’s terrible and absurd, and I laugh as the knife touches the joint.

Deep red blood appears on a line along my thumb, and I stare at it, giggling like an idiot, as the pain shoots through my entire body.  Not just my body.  The entire room hurts.  My teeth are on fire.  The mirrored glasses hurt, bouncing reflective metallic pain off the corners of my skull.  I’m laughing, or screaming, I can no longer tell which, as I drift out of consciousness.

It’s dark outside when I wake up later.  The room glides and twists about me, and I’m tied to the chair everywhere; my arms, my chest, my legs, my dreams, my soul.  I notice that both my thumbs are still on my hands, and I count them to make sure.  It’s hard work, and it takes a while to complete.  “Two,” I say out loud.  Around my arm, there’s surgical tubing loosely wrapped, and dots of blood on the veins of my arm.  The two guns that were on the table are now two empty syringes, and I ponder this for a while, wondering how such a transformation could have been effected.

The room throbs and pounds, sending waves of pain through my entire body.  Agony comes from all directions, and pierces me everywhere.  My teeth sting, my muscles are jerking everywhere, and electricity shoots through me.  I hurt in places I don’t even have, and the pain doesn’t stop at the boundaries of my body.  The hours and days drag on, and I feel myself … detach.

When I next have a coherent thought, I’m in a hospital bed.  Some memories come back to me, but I don’t know what’s real.  Running through broken glass on the street; climbing rusty metal steps covered with pigeon and bat droppings, running down the streets, scraping against buildings and falling, trying to cram myself under the back seat of my own car, trying to escape the pain, desperately repeating every phrase any patient of mine had ever uttered to anybody who would listen in an attempt to make them understand…   My feet hurt, and I wonder if they’re cut up badly.

I realize that I’m strapped down.  Weirder, I recognize the restraints from some dim corner of my memory.  Ever so slowly, my brain starts to re-engage, and I realize I’m strapped to a bed in my own hospital.  I don’t recognize the ward or the room.  I actually say out loud, “holy shit, I’ve gone insane.”

Into the room steps Tom, “holy shit,” he echoes.  “I was afraid you were gone for good.  It’s been four days.”

“What happened?” I asked weakly, still a little nauseated, and still, I noticed, hallucinating slightly.

Tom took a deep breath, and started to explain.  “Well, turns out our neighbor is a coke dealer, if you hadn’t figured that out.  I guess he thought we’d called the police and turned him in.  Apparently, he put a combination of rat poison and LSD into the hamburgers.  The girls went to the hospital and got their stomachs pumped as soon as they left.  They figured it was food poisoning.”

“Did they let you go?” I asked.  “After they said they would…”

“Well, I crawled out the door, and threw up in our apartment for a while,” Tom said.  “After I finally felt like I could move again, I went back to look for you.  But I was tripping pretty hard, and not thinking too straight.  I walked around to the back door, and you’re in there with three guys and they’ve got guns, so I go to call the police…”  Tom winced, “but I kind of got lost.  I couldn’t think straight at all.”

“So they didn’t have you in the other room?” I asked, now wondering if he was ever there.

“Nope,” Tom went on.  “I don’t think they saw me.  Anyway, I wandered around until I ran into Rose around 10 in the morning, at one of the gas stations she works in.  She helped me find my way back, and when we went to the back door, you were in the dark all by yourself, tied to a chair, screaming.  You didn’t recognize either of us.”

“We cut you free, and you kept screaming.  We went to call the police, and you went running out of the place.  By the time the police got there, we had no idea where you had gone.   But they found you that night, apparently you kept hailing taxicabs and then screaming incoherently at the drivers, so they called the police.  They brought you to the hospital and they got you into detox with me.  But I don’t think they know what they shot you up with.”  Tom pointed at the track marks on my arm.

“This isn’t detox,” I pointed out.

“Nah, after a few days of that, they were afraid you’d snapped completely, so you were brought here for your 72 hours of observation.  Every time you woke up, you’d scream and try to run away.”

“So, what happened to those guys?  The neighbor and the goons, I mean,” I asked, wondering if the police had caught them, too.

“After they left you, they headed for the Mexico border.  The police took our statements and told us we might be needed to testify, but yesterday, they told us it wouldn’t be necessary.  They were killed by police when trying to escape.”

Wow.  “Hey, while you’re here,” I asked, “you think you can take me out of these restraints?”

“Sure, man,” said Tom, as he started to unbuckle the straps holding me down.  “Now that you’ve got your shit back together, we can probably move you back to a regular hospital until your feet heal.  Oh, yeah, and somebody else wanted to see you while you’re here, if you want.”

It was Jomo.

“Dude!” said Jomo, shaking the hand that Tom had freed from the restraints moments before.  “They’re letting me out!”

“Awesome,” I responded.  “What changed?”

“Well, man,” said Jomo, “you provided a damned good example of just how fucked up somebody can get on drugs and still have a normal brain.  I think that helped me out.”

“Glad to be of help,” I said weakly.

“Plus,” he added, “I wasn’t never as crazy as you.”

Share