Golden Age of the Internet Startup – Part 2

With a few sales under our belts, we packed up what little equipment we had, and moved to our new space in a downtown commercial high-rise, where we had an entire floor to ourselves.

An entire floor is a huge amount of space. There were ten of us now, including sales, marketing, etc., in a space that could hold 300. The space was fully furnished, and included a boardroom with a view, where all of us could sit, and have ample room for 20 more people.

This wasn’t unusual for any dot-com era startup, but perhaps it was unusual for one without venture capital funding. Bill explained that we hoped to expand quickly, and that more importantly, customers should be able to visit a place that inspires confidence.

One walked off the elevators into a large, well appointed lobby with leather seats and a stainless steel version of our logo on the wall, up to a reception desk, behind which was a glass wall displaying our opulent (and usually empty) boardroom, where one looked through it onto an expansive view of the city. From there, one could go right or left to weave through cube farms before reaching either outer wall, all floor-to-ceiling glass. The few employees scattered about and a few well placed plants and personal items give the impression that a large office had just gone to lunch, or is sequestered in meetings somewhere. You’d probably end up at a huge, well appointed corner office to meet the CEO, or perhaps the head of marketing, or the CTO, or the COO — there were four corners, after all.

Bill was right — the entire place spoke of money and confidence, without being too opulent. On the occasions when customers did come by, we avoided an empty look by using 3-4 cubes each, and inviting friends over to sit around for lunch. (Nobody would ask if all the people in the office actually worked there, but we certainly would not have lied if it came up.)

Along with the cubes and chairs came a big PBX system with hundreds of phones, handy partly since we were so far away from each other. This was in our full server room, where Bill invested in two racks full of servers, along with new PCs for everybody, plus a bunch for empty cubes.

None of the equipment was unused. For every empty cube with a PC humming under the desk, there was a system running tests, compiling code, copying backups, running competitor’s systems, providing remote access, and so on. In addition to selling our main line of software, we also did odd bits of consulting in order to provide the company with income — this included setting up and integrating competitor’s systems (which was handy for a number of obvious reasons) as well as odd jobs like data mining for grocery stores and other utterly unrelated technical tasks.

I sat in the back, near the server room, which gave me a unique view and made it easy to concentrate on writing code.

On the floor below us was a radio station, which we didn’t notice at all our first few months — then they either changed formats or management, or both, and suddenly it was apparent that my office was directly over some kind of listening or sound booth — and during the day, they started cranking up the noise so that not only could it clearly be heard in our office, it was hard to speak to somebody in the same room. I called the building management to complain.

“I’d like you to do something about our downstairs neighbors,” I shouted over the din. “We can’t hear ourselves think up here.”

“I can’t understand you,” said the building manager (a dour woman we’ll call Leslie.) “Maybe you could turn down your music.”

“That’s really my point,” I shouted. “That’s not our music. It’s coming from downstairs.”

“I’ll be right up,” said Leslie, lying through her teeth.

A couple hours and a few phone calls later, Leslie appeared. Perhaps coincidentally, but probably not, the music had been turned off moments before she marched up to my desk.

“I don’t hear anything,” Leslie told me, in an accusatory tone.

“Well, obviously you did when I called, since you complained you couldn’t hear me over the music,” I explained.

“That could have been anybody’s music,” said Leslie dismissively.

This seemed pretty disingenuous and odd, but this same pattern repeated itself a few times, before Leslie actually appeared in my office while a deep bass thump was still shaking my furniture.

“I don’t hear anything,” said Leslie.

“What?” I said, shouting over the noise.

“I said, I don’t hear anything,” she shouted. “I can ask them to turn it down, I guess, but I don’t hear any music at all.”

I didn’t know what to say at this point. I talked to our business manager later, who mumbled something about a possible dispute with the lease. Were they trying to make us leave? I’m not sure, but I was beginning to hate Leslie.

I once had a friend with the curious habit of jumping up in moving elevators, landing with stiff legs. This created a booming sound that resonated throughout a building, and he’d nonchalantly walk off the elevator to nervous stares of people waiting to get on, some of whom would think better of the idea.

With this in mind, I brought in a bowling ball. Next time the music started up, I ceremoniously dropped it on the floor, right above where the music seemed loudest, which was near the server room on a little bit of linoleum floor (the rest of the office was carpeted.) It worked better than I could have imagined — it sounded like the building had been hit with a wrecking ball, sending a BOOOOOM that resonated through the floor and walls. I did this a few more times before the music stopped, and put the ball into a desk drawer.

Leslie showed up a moment later. “Are you guys doing any construction up here?”

“Heavens no,” I told her. “Surely we’d notify the building.”

She eyed me suspiciously. “We’ve had complaints from the floor downstairs, the noise is interfering with their radio broadcast.”

“Is that so,” I mused. “Well, I don’t hear anything.”

She stood, listening, and looking around, presumably for signs of construction equipment.

“I said, I DON’T HEAR ANYTHING,” I shouted at her.

She left in a bit of a huff.

The radio station’s volume got loud a few more times, but a few drops of the bowling ball were enough to stop it quickly. Our downstairs neighbors seem to have quickly learned the cause-and-effect relationship, and the bowling ball became an ornament on my desk.

Leslie dropped by one day on an unrelated matter and noticed it, and appeared to connect the dots all of a sudden.

“Were you dropping that bowling ball on the floor? Because I have to warn you, that would be unacceptable,” she lectured. “I could hear something like that all the way on the first floor.”

Really? Awesome.

“Madam, that’s a valuable ball,” I replied. “Besides, I’m certain it would cause quite a bit of noise, which would be completely unreasonable in a professional office environment. It might be more appropriate for some kind of party floor with loud music. Do you hear any music?”

She ground her teeth a bit, but said nothing. We didn’t have any more trouble from her or the neighbors for the duration of our stay.

Share

Sharing Speakers with Multiple Computers

If you’re like me, you have several devices on your desk that emit audio (or are at least capable of it) — on my desk alone, I’ve got two PCs, a laptop, a Chumby, an iPad, an iPhone, a Mac, and an iPod.

It seems sensible to me that rather than clutter my desk with a cheap pair of speakers for each of these devices, to get one good pair of speakers and connect everything to it.  I have a couple of audio mixers with cables that cost around $10 each in order to properly connect it; at the time, it’s the best thing I could come up with short of building a dedicated device.

N.B.:  y-cables may work okay for a couple of devices, but the signal is attenuated and multiplied, and plugging and unplugging devices from a gob of y-cables is just asking for trouble.

Stoweblank TinyMix

Stoweblank TinyMix

Our friends at Stoweblank produce a high-quality audio mixer that takes the 1/8″ (3.5mm) stereo inputs that all these devices put out, saving a ton on cabling.  As a bonus, it’s USB-powered.

I can hear alerts from my laptop while clicking away on my desktop and playing music on the Chumby, at the same time, plug in and unplug the iPad without causing problems.

In the interests of full disclosure, purchasing anything from a link in this post helps support this site as well.

Share

Golden Age of the Internet Startup

Y2K was a weird time for many in technology fields.  For my part, I was in charge of an e-commerce team at the time that many companies were just beginning to realize the importance of having a presence on the web at all.  Revenues for my brick-and-mortar company were just topping $1 billion…  then overnight, one of our biggest customers made a few dramatic changes, and as a company, we had to shrink to about a quarter of our size to match our wildly decreased revenues.

As the fledgling wing of the business, the e-commerce team bore a disproportionate amount of the downsizing effort, so I laid off most of my very large team.  Another round later, most of my considerably smaller team were laid off.  By the third or fourth round, I’d decided it would be better to taste the riches of the dot-com era than preside over a rapidly-dwindling department, and laid myself off.

Within a week, I had about a dozen job interviews lined up — the availability of dot-com money was in full swing, companies were paying a premium for barely-competent java programmers, and my Vice President of e-Commerce title placed me in demand.  I rejected most of them for various reasons:  I didn’t think much of their technology, or their business, or didn’t have enough control, or just plain didn’t like the interviewer — within two weeks, I settled on a company that seemed to have everything going for it:  supply chain software, capital provided by a consulting business, a foundation for a product, domain skills, and a fair (but not exorbitant) salary.  Perhaps even more important was the contagious enthusiasm exuded by the founder, whom we’ll call “Bill.”

Bill hired two people right away — me, as the Chief Development Officer, in charge of building and supporting our products, and “Jeff,” as the Chief Technical Officer, in charge of infrastructure, IT, and everything else.  Jeff showed me the clause in his contract that included a foosball table in the lounge — something I neglected to ask for — but presumably, we’d have the same lounge, so I wasn’t about to complain.

Our first offices were temporary space with Regus.  We had four desks or so, reception, internet service — a whole office presence.  Since it was shared office space, we rubbed elbows with other Internet startups, cheap lawyers, and a handful of dismal people doing god-knows-what, whom I’d notice carrying a paper lunch bag into their office, and sitting at a desk all day by themselves.  I never saw them with computers or on the phone, so I imagined them spending their waning years pretending to go to a job that no longer existed.

A few years earlier, when I worked for a company on behalf of the CTA, I was shown an empty room with four older people in it with computer printouts and those old adding machines with the crank handles.  It was explained to me that due to their seniority, they effectively could not be laid off, nor could they be forced to train for other jobs, but their skills were utterly obsolete.  So they were put to work verifying account spreadsheets printed by the mainframe, which was deliberately pointless and mind numbing work.  They were not allowed to read books, and had to be strictly on time every day and take only prescribed breaks, or be fired.  Meanwhile, they carefully ran their crank machines, their work destined immediately for the trash bins, waiting out their retirement clocks.  I couldn’t help thinking I might go insane first, or at least beg to be retrained for something.  Anything.

I was reminded of this every day at Regus as I walked past the office of a little guy with a moustache, who didn’t ever have anything on his desk but his lunch, and seemed to spend most of his time looking at a spot on the desk.  I’d flash him a sunny smile and wave, and I might get a half-hearted smile in return, if I was acknowledged at all.  I called him “Willy Loman” and looked forward to days when his door was closed.

We didn’t have dedicated connections or server hardware, so I set up web and email servers in my basement, which had pretty decent connectivity.  The old consulting wing of the company was based in California (with a few employees there) and a few more scattered around.  I managed to marshall these few people into building something we were able to sell to a large retailer, to manage their shipping process.  We didn’t have health insurance yet, but paychecks were regular and covered COBRA payments.

While Jeff and Bill sought funding, I used the few resources we had to build what we could, and put together increasingly ambitious plans based on our ability to secure funding, and our ability to sell what we already had to the burgeoning Internet retail market.

To put this in context, this is an era where a company could boost their stock price by putting an “e-” or a “.com” in their name, where startups would spend millions on waterfalls in their lobbies, Webvan and Pets.com were in full, inexplicable swing, along with Kozmo and Flooz demonstrating that startup capital and a dot-com model were the fast track to corporate success.

On the other hand, we were a down-to-Earth, hard working company, were careful about our spending, and didn’t yet have funding.  What we did have was part of a product, a handful of competent employees, and an office that after a while, nobody bothered going to.  After all, the servers weren’t there, the employees were remote, and venture capitalists were elsewhere — as nice as Regus was, it was clearly temporary, shared office space, not the place you’d bring venture capitalists to impress them with your waterfall, and god knows you wouldn’t want Willy Loman around.

The CEO called and said we’d leased permanent space — it was time to move.

Share

Interlude with Apple Developer Support

As a consumer, getting support for Apple’s devices is pretty easy.  If it’s in warranty or you have AppleCare, it’s not hard to get something fixed.  As a developer, however, working with Apple is … not so easy.

Apple has one of my widgets available for download, which periodically gets updated.  The usual procedure is to log in to Apple, update a few fields, point to the new URL, and everything’s fine in a day or two.

Lately, though, the form has been failing with the error, “Please fill in all required fields.”  There’s no indication of which fields or what to do, so after weeks of trying different combinations of things, I contacted Apple Developer Support.

Dear Apple Developer Support:

I maintain an OSX widget available at [URL.] I am trying to update it using the form at https://developer.apple.com/submission/mac/form_edit.php

However, the form *always* returns the same error: “Please fill in all required fields.”

There is no indication of what fields are not filled out, and I have meticulously filled out every single field. I have attempted to do so from every major browser, including Safari, Firefox, IE, and Chrome, from every OS including OSX and Windows, and from several countries including the US, Canada, and India.

I cannot get this form to work. Is there anything that can be done? Can you tell me what this form wants?

Almost immediately, I got a form letter that they are working diligently on whatever my issue may be, and then a few days after that:

Please include the line below in follow-up emails for this request.
Follow-up: 136749696

Re: Software Downloads feedback

Hello,

Thank you for contacting Apple Developer Support regarding Software Downloads.

Feedback regarding Software Downloads may be submitted to Apple via the Mac OS X web
site:


Please know that the email address you have written to is
used to provide program-level support to members of the Apple Developer Program. We are unable to provide general product support via this Apple channel.

Thank you for understanding our support policies. We appreciate the time that you have taken to send your comments to Apple.

Best regards,

Yutaka Ikeda
Apple Developer Support

So, I’m essentially told that they don’t help with downloads, only developer issues, and I’m directed back to the contact page where I found the address I sent my original email to.
Dear Apple Developer Support:

I am not trying to download anything. I am trying to use the developer site, which is not working.


Omitted: Several back and forth emails where I beg somebody to read my request, and not just send me a random form letter directing me to the contact page.  Also omitted:  I repeat the problem each time.

Please include the line below in follow-up emails for this request.

Follow-up: 136749696

Re: iOS Developer Program

Hello,

Please know in order to consider your request, we need you to furnish the following
information:

– Step by step information to reproduce the issue
– Screenshots reflecting the error messages
– System hardware and operating system configuration
– Browser and version
– Indicate type of connection (i.e., cable, DSL, corporate network, etc.)
– Indicate if you are behind a firewall
– Provide text for any error messages that you have received
– Indicate if you are behind a proxy server

Thank you for your assistance.

Best regards,

Jeremy Nickel
Apple Developer Support

Wait, what? Well, fine, at least I’ve been routed to the correct department.

Dear Apple Developer Support:

Are these delaying tactics? Because seriously, the initial instructions I
included aren’t hard to follow.

Go here:
https://developer.apple.com/submission/mac/form_edit.php

Update the version. Or anything. Use any browser. It doesn’t matter.
Naturally, I’m logged in as me.

Watch it tell you you’re missing a required field.

I usually stop here, but for the full experience, you can spend weeks
trying to get somebody to take a look and provide anything other than a
moronic form response or a nonsensical request for more information.

A few days later, I got this response:

Please include the line below in follow-up emails for this request.

Follow-up: 136749696

Re: iOS Developer Program

Hello,

Please know in order to consider your request, we need you to furnish the following
information:

– Step by step information to reproduce the issue
– Screenshots reflecting the error messages
– System hardware and operating system configuration
– Browser and version
– Indicate type of connection (i.e., cable, DSL, corporate network, etc.)
– Indicate if you are behind a firewall
– Provide text for any error messages that you have received
– Indicate if you are behind a proxy server

Thank you for your assistance.

Best regards,

Jeremy Nickel
Apple Developer Support

Yes. It’s the exact same form letter. Frankly, at this point, I hate Jeremy Nickel, and I want him to burn in hell. Is it really so difficult to understand that a web page is broken? Seriously, Jeremy, if you can’t be bothered to actually read any of the email you get, are you really in the right position?

Dear Apple Developer Support:

Please do not send me this useless form letter again, I’ve answered every
goddamned question more than once. If you have an actual question, feel
free to ask. If you want to send me a form letter, please just tell me
directly “I’m really too stupid to handle this,” it’s more honest and
direct.

> Please include the line below in follow-up emails for this request.
>
> Follow-up: 136749696
>
> Re: iOS Developer Program
>
> Hello,
>
> Please know in order to consider your request, we need you to furnish the
> following information:
>
> – Step by step information to reproduce the issue

Provided. Three times.

> – Screenshots reflecting the error messages

Imagine the screen, with a red “Please fill out all required fields” on
it. If you seriously need a screen shot of that, let me know.

> – System hardware and operating system configuration

I’ve tried several dozen. It does not fucking matter.

> – Browser and version

I’ve tried several dozen. Safari, Firefox, IE, whatever.

> – Indicate type of connection (i.e., cable, DSL, corporate network,
> etc.)

Again, tried on dozens.

> – Indicate if you are behind a firewallÂ

No.

> – Provide text for any error messages that you have receivedÂ

Once again, “Please fill out all required fields.”

> – Indicate if you are behind a proxy server

No. And yes. What the fuck? Who fucking cares? I’m just going to get the same fucking form letter from you anyway.

Tell you what, Jeremy, just fucking GO to the URL, and if it miraculously works for you, send me your operating system, your browser version, and whatever the fuck you filled in to make it work.

Share

L4D2 OS Paged Pool Memory Low on XP

From Steam, I installed and played Left for Dead 2 (L4D2) for a few hours without any problems.  After rebooting after an update, the warning “OS Paged Pool Memory Low” in red appeared in the game, followed shortly by bizarre visuals, halting sound, jerky game play, and ultimately, a lockup or crash.  A few days later (and after rebooting) I tried it again, and it was fine.  Until I rebooted …

It seemed that pawing at it like a confused monkey was not solving my problem, so I consulted the Internet, which recommended a curious mixture of unrelated voodoo and homeopathic remedies, and Steam themselves has a page that mumbles incoherently about drivers and suggests removing parameters that nobody has.  Those few people who have had, and solved this problem, appear to have tried hundreds of things all at once and were clueless as to what fixed the issue.

While making sure drivers are up-to-date is rarely bad advice, it’s unlikely to actually fix anything unless your current drivers happen to be buggy.

So, what’s happening, and how does one fix it?

XP has two memory pools, paged and non-paged, and without going into too much technical detail, paged memory can use disk space to expand its total pool (“virtual memory.”)  XP uses heuristics at boot time to determine how much memory to dedicate to the non-paged and paged pools.

Specifically, XP calculates a limit for the paged pool based on how much address space that other resources, like page table entries, want.  With a lot of RAM and a reasonable amount of swap, XP can still apparently get it wrong.  On the plus side, it can be tweaked manually to solve the issue.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management

in the registry has all kinds of nifty knobs, and the most important one is “PagedPoolSize.”

Note:  before doing this, make sure you have a reasonable amount of physical ram and that virtual memory (My Computer->Properties->Advanced->Performance->Virtual Memory) is set either to automatic, or at least a gig or two or twice physical ram size.

PagedPoolSize is almost undoubtedly set to “0,” which means XP will automatically determine the limits.  Setting this to “0xFFFFFFFF” means “set this as high as possible,” which is a dynamic value, but based on your amount of physical RAM rather than every other knob in the system.  As a troubleshooting step, it’s reasonable to start here — reboot, then try out L4D2.

If it works, you can back this number down a bit:  some testing has shown that 256M is sufficient to play without problems (“0x10000000” hex, or “268435456” decimal) but your mileage may vary.

Share

Medieval Life versus Modern Medicine

I’m a pretty big fan of science — and by that, I mean the scientific method and its reliance upon testable theories and repeatable outcomes.  As a corollary, I generally respect modern medicine, and it’s not unusual to think, hey, without modern medicine, where would I be?  To put it another way, if I lived in the Middle Ages, wouldn’t life suck?

My last foray into modern medicine involved a rotator cuff tear, followed by surgery, frozen shoulder syndrome, and six months of excruciating physical therapy.  If I were a medieval peasant, I probably wouldn’t be able to use my arm at all, right?

Well, no, it turns out my shoulder problems were caused by the modern antibiotics Levaquin and Cipro, both of which I was taking for medically dubious reasons (as many people do) and other antibiotics weren’t available because of my allergy to Augmentin.

Augmentin was prescribed to me when I had contracted a horrible kidney infection, and I actually developed the allergy while taking it.  But hey, modern medicine saved me from a kidney infection, right?

Yes, but since I acquired it in a hospital, I’m going to put this in the medieval column.  I was in the hospital due to kidney stones, which were so big, they wouldn’t pass on their own.  After lithotripsy failed, the more invasive laser surgery was required.

Kidney stones are pretty horrible, and it’s easy to imagine myself in a medieval hamlet, blaming demons or whatever for my bone crunching pain.  However, it turns out my kidney stones were caused by high fructose corn syrup, so it’s more likely I’d be dancing around my medieval hamlet in no pain whatsoever, probably wearing tights, which I understand was acceptable back then.

I’d also been in the hospital to have my gall bladder removed, due to gallstones, which anybody who’s had them can tell you are almost as bad as kidney stones.  Oh no!  My medieval self would be unequipped to deal with gallstones … but (by now, you can see this coming) wouldn’t actually have gallstone problems in the first place.  In an ironic twist, cutting high fructose corn syrup and fat out of my diet to avoid kidney stones led directly to gallstones.

So far, the Middle Ages are beating modern medicine by at least three points, and I’m not even counting the clothes.

Not that I’m anti-modern-medicine, by any means, and I’m not about to revive the medieval practice of buying Head-On headache sticks to ward off brain goblins.  Instead, I’m going to give full credit to modern medicine for Imitrex, which is truly wonderful.

Share

Games of Chance

As somebody with a firm grip on science and statistics, I’ve always had a weird relationship with games of chance.  Generally speaking, I’ll calculate the odds and opt out, being the opposite of a gambling man — not only is there nothing I like better than an iron-clad guarantee, but I’ll view that as somewhat dubious until I see results.

In the fifth grade, I was once motivated to try my luck by a carnival drawing where one of the prizes was a big orange kangaroo that I found compelling, for some reason.  The idea was to pay a quarter, reach one’s hand into a Tupperware cereal-keeper full of tickets, then check to see if one’s numbers matched one of the prizes.  After a few questions and some quick math, I calculated my odds of winning anything to be about one in a hundred, and my odds of winning the kangaroo about 1 in 700.  Not wonderful odds, and I’d be stupid to pay a quarter for the privilege of reading a non-winning number from a ticket, but that kangaroo somehow managed to convince my addled fifth-grade mind that if I rummaged around in there, the ticket would magically find my hand because my desire was so great.

I suspect that a lot of fiction has this same side effect on impressionable young minds, even those straining to be rational.  Intellectually, I knew this was a ridiculous notion, but I wanted it to be true so badly, I almost had myself convinced.  It was just enough so that I handed my last quarter to the lady and rooted around in the Tupperware.

When I unfurled my ticket, a healthy dose of skepticism and anticipation kept me from getting too excited, and I checked the number three times before handing it to the lady — and collecting the kangaroo I had won.  It sat on my bed for years as a loved reminder of how every now and then, long odds do pay off, and it may be worthwhile to loosen up on cold rationality every now and then.

Years later, I got the idea that I would buy a lottery ticket.  The odds of winning are calculated for you (“virtually impossible!”) so I was under no illusions that I’d win anything.  As a test of my mental resolve, I was going to play all ones — which is difficult to imagine ever coming up, but has the exact same odds as winning (“virtually impossible!”) as any other number.  In this case, I justified it to myself because I wanted to see one of the automated lottery tickets at the grocery store in operation.

I put $1 into the machine, which promptly jammed, and went out of order.  What were the odds?  I promptly gave up on the lottery.

I’ll fast forward past counting cards in Atlantic City to being at the zoo with my four-year-old daughter whose attention has been captured by a claw machine with a bin full of tightly-packed stuffed animals.  “I want the tiger!” she says, pointing to a tiger behind the glass.

It seemed like a good time for a harsh lesson on probabilities, so I lectured her at great length about how unlikely it is that we’d win it on the first try, and that those games work because the amount of people money put in trying to grab a prize is always more than the cost of the prizes, and how I didn’t want her to be too disappointed when she didn’t win.  She solemnly took the 50 cents I handed her and promised she wouldn’t beg to play again if she didn’t get the tiger.

We still have that tiger.   I suspect my lecture was instantly forgotten.

Today I decided that I’ve give the lottery another chance, partly because if I don’t win, a significant chunk of the money goes to the schools, and partly just to see what it’s about these days.  While it’s not possible to play online, it’s possible to print out a PDF that allows one to buy tickets by mail, so I figured, what the heck:  if I don’t win, I’m not out much money, and if I do, hey, free money.

My rational mind was immediately assailed by a number of roadblocks, that weirdly reminded me of the jammed lottery machine decades earlier:

  • It took several tries to get the PDF to download.  The first time I got a PDF, it was blank
  • After filling out the form, but before I was able to print, my computer crashed (which never happens.)
  • My printer jammed
  • I was going to use a credit card to pay, but I used it earlier and misplaced it within the house
  • After deciding to just write a check, my pen flakes out, ruining a check.  It takes me 20 minutes to clean and fix my pen.
  • My printer jams when printing the envelopes, which it never does — not just once, but four times, ruining a swath of envelopes and causing me to have to apply for postal refunds

Coincidence?  Gentle fate trying to save me from wasting my money, or cruel fate trying to keep me from winning millions?

I’ll let you know, assuming this letter ever makes it.

Share

Voice Announcements via Modem

We have a PBX system through which it’s possible to make announcements, some of which I find myself making regularly.  Having an old voice modem lying about, I decided to program it to make regular announcements for me.

Rather than dedicate a modem to voice announcements, I decided to share a modem that’s also used for HylaFAX, on the principle that the less hardware to have to worry about, the better.  HylaFAX shares a locking system with minicom, meaning that if I use minicom for the voice announcements, I don’t have to worry about who has control of the modem, or of relinquishing control to HylaFAX.

I located an ancient voice command  manual for my US Robotics voice modem online.  While it took some trial-and-error, I eventually whanged together this script:

#/bin/bash
if [ "$1" = "--help" ] || [ "$1" = "" ] || [ "$2" = "" ]; then
echo 1>&2 Usage: $0 [# to dial] [voicefile.rmd]
echo --help      this message
exit 1
fi
PID=$$
cd /tmp
echo print "starting" > /tmp/minicom.$PID
echo send "ATZ" >> /tmp/minicom.$PID
echo expect { >> /tmp/minicom.$PID
echo \"OK\" >> /tmp/minicom.$PID
echo } >> /tmp/minicom.$PID
echo send "AT#CLS=8" >> /tmp/minicom.$PID
echo expect { >> /tmp/minicom.$PID
echo \"OK\" >> /tmp/minicom.$PID
echo } >> /tmp/minicom.$PID
echo send "AT#VRN=0" >> /tmp/minicom.$PID
echo expect { >> /tmp/minicom.$PID
echo \"OK\" >> /tmp/minicom.$PID
echo } >> /tmp/minicom.$PID
echo send "AT#VRA=0" >> /tmp/minicom.$PID
echo expect { >> /tmp/minicom.$PID
echo \"OK\" >> /tmp/minicom.$PID
echo } >> /tmp/minicom.$PID
echo send "AT#VSM=129,8000" >> /tmp/minicom.$PID
echo expect { >> /tmp/minicom.$PID
echo \"OK\" >> /tmp/minicom.$PID
echo } >> /tmp/minicom.$PID
echo send "ATS46=255" >> /tmp/minicom.$PID
echo expect { >> /tmp/minicom.$PID
echo \"OK\" >> /tmp/minicom.$PID
echo } >> /tmp/minicom.$PID
echo send "AT#VRA=0" >> /tmp/minicom.$PID
echo expect { >> /tmp/minicom.$PID
echo \"OK\" >> /tmp/minicom.$PID
echo } >> /tmp/minicom.$PID
echo send "ATDT,$1" >> /tmp/minicom.$PID
echo expect { >> /tmp/minicom.$PID
echo \"VCON\" >> /tmp/minicom.$PID
echo } >> /tmp/minicom.$PID
echo "sleep 1" >> /tmp/minicom.$PID
# here's the voice part
echo send "AT#VTX" >> /tmp/minicom.$PID
echo expect { >> /tmp/minicom.$PID
echo \"CONNECT\" >> /tmp/minicom.$PID
echo } >> /tmp/minicom.$PID
echo "sleep 1" >> /tmp/minicom.$PID
echo "! cp $2 /dev/ttyUSB0" >> /tmp/minicom.$PID
# end
echo >> /tmp/minicom.$PID
echo sleep 2 >> /tmp/minicom.$PID
echo ! killall minicom >> /tmp/minicom.$PID
/usr/bin/minicom -S /tmp/minicom.$PID
cat /tmp/minicom.$PID
rm /tmp/minicom.$PID

It’s fairly linear — it puts the modem into voice mode, sets a number of parameters, and escapes to the shell to copy a file to the device.  What remained is to create a file in a format that the modem could consume.

Luckily, Ubuntu has a package called mgetty-pvftools which contains all the binary files necessary to make it happen.  (These files are bundled with vgetty on Gentoo, but vgetty conflicts with HylaFAX, and all I need are the audio conversion binaries.)

It’s several steps to convert, but this script does it handily:

#!/bin/bash
PID=$$
if [ "$1" = "--help" ] || [ "$1" = "" ] || [ "$2" = "" ]; then
echo 1>&2 Usage: $0 [from.mp3] [to.rmd]
echo --help      this message
exit 1
fi
echo "mp3->wav"
sox -V --norm $1 -r 8k -c 1 /tmp/$PID.wav
echo "wav->pvf"
wavtopvf /tmp/$PID.wav /tmp/$PID.pvf
echo "pvf->rmd"
pvftormd US_Robotics 4 /tmp/$PID.pvf $2
rm /tmp/$PID.wav
rm /tmp/$PID.pvf

So, all that’s left to do is to set up the first script in an “at” or “cron” job.  However, it turns out that minicom requires an interactive terminal to run, so simply running the first script from an “at” job resulted in this error:

No cursor motion capability (cm)

Since the script will run minicom without being attended, a simple way around this is to use the “screen” program to provide an interactive terminal for minicom to use within cron/at:

screen -d -m announce.sh 111 announcefile.rmd
Share

LED Isolators for HDD LEDs

LED Isolator

LED Isolator

A while ago, I posted a design for a home-made circuit designed to connect multiple hard drive add-on cards (and the motherboard) to a single case LED.  I made a handful of these for the servers around here, and in the three years or so since then, I’ve yet to see anything similar.  It’s possible that nobody but me actually cares if their case light reflects drive activity across all their drives — then again, it’s also possible that the people who actually cared simply made their own.

On the off chance that anybody wants one, I went to the trouble of making some professional-looking boards.  More detail is available here.

Share

Fun with the Secretary of State

A short while ago, I was traveling through New York, and somehow managed to leave my driver’s license with the TSA. This wouldn’t have been so bad, except that I needed to fly out of Chicago the next day, and I needed to rent a car at my final destination, which probably isn’t possible without an actual driver’s license.

My strategy was to go to the Secretary of State’s office downtown (this is the Illinois equivalent of the DMV) before it opened, in what seemed like a futile effort to acquire a license before I needed to be at the airport. Fifteen minutes before it opened, there was already a crowd of fifteen people waiting for the doors to open.

After a moment, a lady with a clipboard came out, carefully locking the door behind her. She announced that she would be coming to each of us in the order that we showed up, and giving us numbers to speed things along. She came to each of us and asked why we were there and confirm that we had the required documentation. Ahead of me in line:

  • A man from Michigan wanting an Illinois driver’s license, who didn’t have his Michigan license because he lost it for driving under the influence. (Sent away)
  • A woman who wanted a state ID, but didn’t have her Social Security card, because it “got wet.” (Sent away, with the suggestion that she replace that first.)
  • A man in a suit with some kind of letter instead of one of the required documents. “They told me over the phone this would be sufficient,” he insisted. “Nobody told you that,” she said flatly, and sent him away.
  • A teenager with no paperwork whatsoever, seeking a state ID. (Sent away.)
  • A man seeking a driver’s license. After looking at his paperwork, she asked, “where do you live?” “Indiana,” he answered. She politely explained that you have to live in Illinois to get an Illinois driver’s license, and sent him away.

After a few variations on the above, she got to me last, and I showed her my paperwork, she handed me the number two. The doors opened, and $5 and 5 minutes later, I was holding a brand new driver’s license. I was utterly unprepared for this jaw-dropping display of government efficiency, which left me with plenty of time to catch my flight — time enough to go home first.

At home, the TSA from New York called, to let me know they had my driver’s license, which they offered to send me immediately. (Since I had to fly in a few hours, I would have needed a duplicate anyway, but I received my old license the next day.)

I contrast this sharply with my experience just a few years earlier at the same office of the same agency. I received in the mail a renewal notice for my license plates that had somebody else’s name on it. I tried calling first, and after an hour on hold, was informed that I’d have to go sort it out in person, and bring the physical license plates from my car.

After another hour and a half waiting in line, I explained the situation to the bored, slow-moving woman behind the counter who didn’t quite appear to be listening. “You want to change your name?”

I explained again that the name on my renewal notice was wrong, and handed her my license plates. She looked at the plates, at my renewal notice, and my driver’s license. After a few minutes of contemplation, she typed something into her computer.

“These aren’t your plates.”

Now we’re getting somewhere. “So, how do I get this corrected?”

“You have to bring in both sets of plates,” she explained.

“This is the only set I have. This is the set I was given… by you guys,” I tried to clarify further. “I only have one set.”

“Well, these are the ones you have to bring in,” she said, and gave me a plate number nothing like the ones I’d placed on the desk.

“So, you want me to find these license plates somewhere in the State of Illinois, detach them from whoever’s car they’re mounted on, and bring them in?”

“That’s right,” she beamed, apparently pleased that she had finally gotten through to me.

“So… Do you think the person whose name is on my renewal form has those plates?”

(blank stare)

“So… Can you tell me where you mailed the renewal notice for my plates?”

She looked this up on her computer, and compared it to the address on my driver’s license. “It doesn’t match your address here, so for security purposes, I can’t tell you what it is.”

“And this is the guy whose house you want me to drive to in order to retrieve the plates you sent him by mistake?”

(blank stare)

“Fine. I just want to renew these plates and correct my name.”

“You can’t do that, these aren’t your plates.”

It was my turn to stare blankly.

“You’ll get arrested if you put these on your car,” she explained slowly.

One of the two state troopers now standing immediately behind me said, “do we have a problem here?”

“If I didn’t have a problem, I don’t think I would’ve stood in line for so long,” I explained. “That’s kind of the whole point.”

Apparently deciding that I wasn’t a threat, they backed up … a little.

“Okay, look, I just want valid plates on my car that I can actually renew and that won’t get me arrested.”

She thought about this for a moment. “You can get new plates for $20 more.”

Unhappy, but with no alternatives, I handed over the money and she gave me a new set of plates.

“Just out of curiosity, are you going to tell the guy who has my plates? So he doesn’t accidentally renew them or whatever?”

“Oh, I’ve already updated the system,” she said languidly, “and there’s a warrant out for his arrest for the guy who stole your plates.”

“Wait… what? He didn’t steal my plates, you mailed them to him.”

“Yeah, but we don’t have a way to put that in the computer. I’m sure he can explain that when they pick him up.”

Epilogue: In an effort to spare some poor guy from being arrested for no particular reason, I called information and what little I knew and tried to call the guy whose name appeared on my renewal notice. The girl who answered the phone said he’d already sold the car “to some guy out of state.”

Share