How to send a selfie in 1993

I originally posted this on Quora and then it ended up on Forbes. On Quora, it’s gotten over 2,200 upvotes. As I said on Facebook the other day, if I’d known it was going to get this much attention, I would have written it better.

In 1989, I was working for GeoVision, a GIS company in Ottawa. It remains to this day one of the best places I’ve ever worked. At that time I was in charge of the bug fix team, which for most of the time was just me and three other people, but during pre-release times would baloon up to over 30 developers. After that particular crunch, my manager rewarded me by sending me to the Usenix conference in Baltimore.

One of the features at this conference on the “show floor” was a booth where they were taking pictures of every Usenix member for the “FaceSaver” project. They would give you a sheet of stickers with your picture and name and email address and a few other things. A lot of vendors on the floor had give-aways where you had to give your business card to enter, and some enterprising person not affiliated with Usenix was giving away pieces of card stock so you could use these stickers as your business card, and since I wanted one of these give-aways, I lined up for a picture. (I never won any of the give-aways, but I did get a t-shirt that said “VMSucks” on it in exchange for a resume.)

After the conference, I was able to retrieve a digital copy of this picture – Usenix had put it on their FTP server, and because GeoVision wasn’t on the Internet proper but accessed the network through UUCP at UUNet, so I had to access the file by sending email to a email to FTP gateway called “decwrl” and receiving the file back as one or more emails.

The file after being re-assembled consists of a header with some useful information, and then a bunch of hex digits. I haven’t been able to find a full description of the format currently, but this is what it looks like:
FirstName: Paul
LastName: Tomblin
E-mail: geovision!pt
Telephone: 613-722-9518
Company: GeoVision
Address1: 1600 Carling Ave.
Address2:
CityStateZip: Ottawa, ONT/CANADA K1Z 8R7
Date: Jun 13 1989
PicData: 108 128 8
Image: 96 128 8

030305030304050503040304020302030304050B050B0B0B0A0A0B
0B0C0D0C0C0E0E0C0D11100E100D0D0D0E101114120C0601020308
0D130E1E5B6261593526320C181E1E1D1D1C1D1D1E202120211E1E
1E1C1D1C1C1C1C1D1E1D1E20212321232122212121232220202020

In order to view it or print it, I believe I used a program I’d found on the Usenet newsgroup comp.sources.unix. After decoding, it looked like:
pt

Note how small it is. Back then, 108×128 was actually a pretty good resolution – our screens were low resolution, and so were our printers.

Ok, so flash forward a few years. I was no longer working for GeoVision and now I accessed the network using a text-only VT220 terminal hooked up to a 2400 bps modem dialed into the National Capital Freenet. I’d met a woman on the Usenet newsgroup alt.folklore.urban and we’d been conversing a lot, first via email, but later when the stars aligned and the various machine dependencies worked out we’d use chat, ychat or ochat. But usually the various versions of chat wouldn’t talk to each other and so we’d have to take our chances on IRC, which was a pain in the ass because we’d make a channel to talk, but some jerkwad would see Vicki’s name and barge in to try to chat her up in barely passable English.

But things were progressing to the point where we needed to meet. But first Vicki wanted to see a picture of me. I didn’t have any pictures of myself, but I did have this file that I’d saved on my computer at home. I had to upload it to NCF, then I emailed it to her, and somehow she and her geeky friends at work figured out how to decode it. Since she worked at a university, they probably used Gopher to find the software to decode it. But again, they did it on their Ultrix host, and she didn’t have a graphical connection to Ultrix, so the first time she saw it was when it came off the printer. I’ve seen the printout, and it was full page, which is another indication of the change of resolution from those days until now, although it was probably blown up a bit. I warned her beforehand that in the years since the picture, there was less hair and more of everything else.

After seeing that I looked presentable, she did agree to meet me at a neutral location. And after a few other adventures, we’ve now been married for over 17 years.

And that, my children, is how you got a picture of yourself to another geek in another city in the early 1990s. These days, we FaceTime when we’re in different rooms in the same house.

Damn DMARC

So a couple of weeks or months ago, I noticed something odd with the mailing lists I run. People on Yahoo and AOL claimed that they were missing messages, and Gmail was stuffing mailing list messages from people on Yahoo or AOL into the Spam folder, even though I’d received literally hundreds of messages from those people on those mailing lists in the past.

After investigating, it turns out that both Yahoo and AOL had turned on an anti-spam feature called “DMARC”. Basically what it meant if a message came with a From line saying it was from either of those, but not coming from an approved mail sender, they were asking the rest of the net to treat it as spam. Gmail honored the DMARC request by putting it in the Spam folder, but Yahoo and AOL and some other ISPs were just bouncing the messages or throwing them away.

This DMARC was obviously a huge problem for mailing lists, because what they do is they accept an email from a person, and then send out the message to all the members of the mailing list, and most of them use the person’s email address in the From line of the mailing list message. This breaks under DMARC, because if my mailing list server recieved an email from joe.blow@yahoo and sends out a message to the mailing list members with a From: joe.blow@yahoo, then all those mail servers that implement DMARC are going to see that I’m not designated by yahoo as a valid sender of yahoo email, and they’re going to drop it.

The developers of the Mailman mailing list software were quick to offer some solutions. First they issued 2.1.16, which had a quick and dirty work-around, and then they rolled out 2.1.18, which had what I think is a much better solution. But my problem is that my mailing list server is pure Debian Stable, and I want to only install packages, not get into the hassle of installing things from source and then having to monitor if things are updated. So I waited for 2.1.18 to get backported to Debian Stable (which uses 2.1.15). I put in request tickets to get it backported. They never did. Instead, they made it a package in Debian Testing, which is less stable.

So I did some googling and discovered something called “apt pinning” that would allow me to install some Debian Testing packages on my Debian Stable system. I tried it, and it wanted to drag in a new version of python, which wanted to drag in a new version of libc, and so on. That’s just stupid – the minimum required python for 2.1.18 is exactly the same as the minimum required python for 2.1.15. Whoever set up the .deb was a little over zealous in the requirements section.

I did not particularly want to drag in unstable versions of the very core libraries of a Linux system for no reason, so my next possibility was to install it from source. That was more complicated than it should have been, but relatively painless. First I tried following the instructions that Bill Bradford pointed me at. Unfortunately, immediately it told me that “Distutils is not available or is incomplete for /usr/bin/python” and “be sure to install the -devel package”. Well, unfortunately there isn’t a “python-devel” package. I looked at the script that configure was using to determine what it was looking for, and the problem was a missing Python.h in /usr/include/python2.7/. A bit of searching, and I discovered that this was installed by a package called “python2.7-dev” – so close, but so far from the “python-devel” I had been searching for. After that, I discovered I had to install the “make” program (like I said, this was a pure server system and I hadn’t been building software on it before) and I did my “make install”. Mail seemed to flow, but I couldn’t access the web interface. Bill suggested running the “check_perms -f”, which found and fixed 26 permissions problems, but still things weren’t working. I compared the perms on a few directories between this installation and my last backup, and discovered that neither the installation program nor check_perms had noticed that the cgi-scripts in the /usr/lib/cgi-bin/mailman directory were setgid “root” instead of setgid “list”. I fixed that, and everything started to work.

Now I wanted to test whether the new “dmarc_moderation_action” setting that 2.1.18 provided would actually fix the problem. So I changed the setting on one of my mailing lists, and emailed a guy on yahoo who was on the mailing list to see if he could test it for me. Unfortunately he wasn’t around, so the next morning I bit the bullet and created a yahoo mail account and added it to that list. I tried a post by this user to the list, and it did the right thing (changed the From address to the list address, but used the Yahoo’s person name part in the person name part), and testing that gmail didn’t stuff it in the Spam folder. I made sure it doesn’t do that with non-DMARC addresses like gmail. And then I made that setting change to all my lists.

Finger crossed, and hope that there aren’t too many more updates I have to apply before a 2.1.18 or later Mailman shows up in Debian Stable.

A tale of three GPS/Heart Rate devices

As a kayak racer and a geek, I’m obsessed with numbers, data, tracking stuff. So of course when I’m paddling, I want a device that tells me my speed, time, distance, heart rate, and that will lead me through interval workouts, showing me distance/time remaining in the current segment, how many segments remaining. It also needs to be waterproof and hold a charge for a while.

When I first got a device, I followed the advice of many of my teammates and bought a Garmin Forerunner 301. It was an excellent device for the job – it did every one of my requirements I listed above, and more. Unlike just about every other device on the market it wasn’t a tiny little watch and it had the biggest display of any of them, which is important for kayaking because when you’re paddling you want the device mounted on the front of the cockpit or on your foot strap in a surf ski. It had 3 or 4 pre-configured screens and one customizable one, and when I decided I wanted even more data than I could fit on the customizable screen, I could set it to switch between the screens every few seconds. It was so perfect that when the first one stopped being able to upload to the computer, I decided that in spite of the fact they discontinued it, rather than spending $75 to have Garmin refurbish it, I’d pay $100 to buy one of their clearance ones.

There was only one flaw in the 301 – there was a shitty little rubber gasket that covered the USB port, and it was damn near impossible to get it back on. which meant that after a couple of days in the salt water in Tarifa, the USB port corroded and I couldn’t charge it any more.

So I decided at that point to buy a new Forerunner 310XT. It wasn’t quite as big a display as the 301, but it transferred via wireless and there wasn’t a rust-prone hole in the body. The 310XT has all the features I liked about the 301, but with a few nice extras – you can configure how many screens you have, how many fields on each, and what is in each field. I’ve currently got it configured with 3 screens, with three fields on each. The bottom two always show speed and distance, and the top varies between time, heart rate and lap time (and I’m thinking of getting rid of the lap time screen). One slight downside is that when I’m doing an interval workout, at the end of the interval it doesn’t give as much info on your last interval as the 301. When you finish a distance interval, the 301 tells you your time for that distance, but the 310XT doesn’t.

Unfortunately when it arrived it had two major faults:

  • If was really inconsistent about the wireless transfer – it would usually require me to re-pair the device every time I did a transfer. It didn’t help that just about the time I got it Garmin was recommending people switch from the “ANT+ Agent” to “Garmin Express”, and Garmin Express on the Mac was completely broken.
  • The heart rate monitoring was not reliable. I would put it on, and it wouldn’t show my heart rate until 5 or 6 minutes into my workout.

Garmin eventually responded to my complaints on their support site, on twitter and on this blog by sending me a refurb Forerunner 910XT to replace my 310XT. A 910XT is basically a 310XT but with some extra features for swimmers and cyclists, so the changes didn’t really affect me. But it did start transferring data to my computer reliably, so that was a nice thing.

But the problems with the heart rate continued. I tried using electrolyte gel to try to fix the “won’t start working until 5 minutes into the workout”, and that mostly worked. Except when I used gel, I’d discover that some minutes into the workout, usually an hour or more, it would start flaking out. My heart rate would flash and come back, but for the rest of the workout it would just start ticking down, lower and lower numbers every minute no matter what I was doing. I’d find myself in the middle of a flat-out 1000m “hard piece” in an interval workout and it would be showing my heart rate as 37bpm. I couldn’t reach 37bpm in a coma. Other people on the team had told me they used the electrolyte gel during cold weather because they weren’t producing enough sweat, and I’d never had a problem with the 301, so I was hoping to stop using the gel during the warmer weather, but without it I was getting the “no reading for 5 minutes” *and* getting the “ticking down after an hour” problems.

Again, I contacted Garmin through every method available to me, and the first response I got was just “oh, you’re wearing it wrong”. So I tried everything they suggested (wearing it to one side or the other, above the ribs, below the ribs, on my back), and one thing they didn’t suggest (I shaved my chest hair in a strip where I wear the heart rate strap), but to no avail.

At this point I was getting nervous, because I have my first race of the season this weekend and it looked like I wasn’t going to have a reliable heart rate reading during it. Desperate times call for desperate measures, so I ordered a Polar RC3 GPS.

The Polar RC3 arrived and right out of the box, it started reading my heart rate immediately, with no hesitation and no wait for me to start sweating. But unfortunately I soon discovered it had some severe drawbacks compared to the Garmin. The screens are not configurable at all. There doesn’t seem to be any way to make it cycle between the screens – that’s probably not a problem for runners and cyclists because they have more use of their hands, but that’s almost unforgivable for kayaking. I couldn’t find any way to set up an interval workout the way I wanted to set it up – there seemed to be a mode where it would set up some training according to their recommendations, but not to your coach’s recommendations. The weirdest bit of inflexibility is the color – they sell two different wristband colors. In all the pictures, you see the black wristband pictured with dark letters on a light background, and the orange wristband pictured with light(ish) letters on a dark background, but I thought that was just a stylistic choice. I picked the orange wristband because I figured higher visibility is better for finding it if you lose it. But it turns out that you can’t actually switch it from light on dark to dark on light – the color combination is set in the factory according to the wristband. You can bet it’s just one configuration option in the factory settings, so why they didn’t expose it to the users is just bizarre. Oh, and it also turns out it’s only rated IP5 instead of IP7 so you’re not supposed to immerse it.

So I wasn’t thrilled with the Polar. But since I was determined to have my heart rate for this upcoming race, I thought I was stuck with it. But then my step-daughter Stevie forwarded me an article where a guy who writes reviews of fitness equipment discovered that using a Polar strap (just the fabric and rubber part) with a Garmin transmitter (the part that clips onto the strap) solves a bunch of people’s problems with Garmin heart rates. And so I tried it and my Forerunner started registering my heart rate immediately. I went out and did an hour long workout, and it kept registering my heart rate with no cutouts and no ticking down. Nice!

So I’m going to pass the Polar onto somebody who runs, keeping the strap for myself. Garmin eventually said they were going to send me a new strap, and it’s supposed to arrive today or tomorrow, but I’m thinking I might go with the Polar strap for the race because I’m not planning any more long workouts between now and the race and I don’t want to risk having the same problems.

Spoke too soon.

Update on this post about my Garmin Forerunner:

I just tried it again, and the god damned thing did the same things as before – it took almost exactly 5 minutes into a workout to start showing my heart rate. After the workout, I waited until I had recovered and turned off the GPS and turned it back on, and again, it says “HR Monitor Detected” but no heart rate showing even after twenty minutes. I tried changing the battery in the heart rate monitor strap, no change. Dammit. Time to try some electrolyte gel, I guess.

I’m much happier with Garmin now

So the other day I wrote a blog post about how annoyed I was with Garmin – my brand new Garmin Forerunner 310XT had been acting badly right out of the box, and when Garmin tech support seemed to be ignoring everything I told them and doing the typical “scan the ticket for keywords, send a canned response that doesn’t solve the problem and they would have known it didn’t solve the problem if they’d actually read the ticket” I blew my top and wrote a scathing blog post.

Well, somebody at Garmin noticed my blog post, went back over the interactions I’d had with their tech support and decided that yes, I was being ignored and they needed to make it right. So he sent me a UPS label to ship back my Forerunner, and he replaced my Forerunner 310XT with a Forerunner 910XT. As far as I can tell, a 910XT is basically a 310XT with some extra features to appeal to cyclists and swimmers, which probably won’t help me much. But hey, an upgrade is an upgrade, right?

So I turned it on, configured it to listen to my heart rate monitor, power cycled it again, and it picked up the heart rate monitor in a few seconds! I paired it with Garmin Express, and it worked – Garmin Express is no longer telling me that there is some problem connecting with Garmin’s servers (which makes me think the message was bogus – bad programming there guys). And I went for a bike ride, and as soon as I got home I dropped the Forerunner on the desk beside my computer and before I could sit down it had already sent the data to Garmin Connect. No fiddling around having to change the setting back to enable pairing and pairing and all that manual stuff I had to do with the old one!

So much nicer when things work the way they’re supposed to.

Ok, I’m happier. I’m not ecstatic, but I’m happier. If they’d want to make me ecstatic, they could have done things slightly different:

  • They could have done what the hard drive manufacturers called “advanced shipment” where they take your credit card info, ship you the replacement, and only charge you if you don’t return the broken one. Heck, even Seagate does that and by every other criteria (including the quality of their drives) they suck! As it was, I didn’t have a functioning GPS for the first two paddles of the season – I could have put up with the problems with the 310XT for an extra week if it meant I could have held onto it until the replacement arrived.
  • Maybe I’m being unreasonable, but I always feel a little bit ripped off when I get a new device and it’s DOA, and the replacement they send you is a refurb. I feel like I should get new for new. I can understand why Seagate doesn’t do that for 10 month old drives (I mean, besides the fact that they suck), but the 310XT was only a few months old and it had been broken in this manner since day 1. But I also kind of understand why they don’t.

Bottom line – I’ve bought a Garmin GPSMAP-195 and GPSMAP-296 for flying (biggest mistake in my life was replacing the 296 with an EKMAP-IV when it got stolen instead of a 496), a nuvi 205w for driving, the StreetPilot app for my iPhone, two Forerunner 301s, and a Forerunner 310XT that got upgraded, and right now I don’t see any reason why I wouldn’t buy another Garmin in the future.