All Shiny and New

We’re now running on a faster virtual machine hosted in Boston, which seems to have excellent uptime. I’ve also taken this opportunity to upgrade to the latest WordPress. The main page is gone for now, but it avoids the total lunacy of a Ruby on Rails application running for the main page, with PHP for the rest of the (WordPress) site with about 100 lines of mod_rewrite insanity to glue it all together. It’s nice and simple now, like it should be.

Facts about K-Mart

Don’t ask why I was spending my Friday night this way, but I was just reading about Juno, the ISP that I assumed went out of business a decade ago. It turns out that they merged with NetZero (another ISP I forgot all about), and formed United Online. (The interesting thing about their merger is that they were in a ferocious legal battle, and somehow decided that, rather than continuing to sue each other, they were better of merging into one company. That seems like the least likely outcome.) Wikipedia mentioned that United Online also holds a third Internet service — Kmart’s BlueLight ISP. This “WTF” sentence led to me reading a lot about Kmart.

So first things first, Kmart is still in business. I was surprised to learn this. I asked my roommate and he was too. We both just kind of assumed that, like Juno and NetZero, they had gone out of business when their names faded from our memory years ago. It turns out that Kmart has about 1,300 stores in the United States.

I glossed over the company’s history, but it’s interesting to note that the company was started by Sebastian Kresge — then working as a traveling salesman selling to Woolworth’s — in 1897. In 1912 he incorporated S.S. Kresge Corporation. In 1918, the corporation was listed on the NYSE. In 1924, Kresge’s personal net worth was estimated at $325 million. (In 1924 dollars.) It wasn’t until 1977 that S.S. Kresge Corporation was renamed to Kmart.

But back to random facts about Kmart. It turns out that, between 2004 and 2005, Kmart bought Sears. I apparently failed to notice this at any point in the past 6 years. The purchase was a mere $11 billion. The name was changed to Sears Holdings Corporation. (So it’s interesting to note that Kmart bought Sears, but Kmart is now a brand of “Sears Holdings Corporation,” which gives a confusing sense of who bought who.)

It also turns out that Sears Holding Corporation owns a lot more than I was aware of.

For example, Kmart bought Waldenbooks in 1984, and in 1994, Borders and Waldenbooks merged.

The Kmart-OfficeMax lineage hurts my head, but Kmart more or less bought OfficeMax in 1990 before taking it public in 1995 and then selling off its remaining shares.

Also in 1990, Kmart bought Sports Authority. Like with OfficeMax, Sports Authority was spun off from Kmart proper in 1995.

And as for Kmart’s ISP? It, too, has a confusing history. They started it as a dialup ISP in 1999, as a free service supported by in-browser ads. The company was later spun off from Kmart. In 2001, after becoming a paid service, Kmart bought BlueLight back. In 2002, Kmart filed for bankruptcy, and that’s when United Online stepped in to purchase BlueLight. (It seems that Kmart filed for bankruptcy protection in 2002. It emerged from bankruptcy in 2003, and in 2004 it purchased Sears.)

Okay, so maybe I’m a little weird… But I found this moderately fascinating.

IMAP Search Musings

I think most geeks get a ton of email. I’ve been rather selective in what lists I join (and what mail I just auto-delete at the server level), so I only get perhaps a couple hundred emails a day now.

For various ridiculous reasons, searching a mailbox is hard. Most of my mail clients will do it, but sometimes I really want to do it myself because I want to be more exacting. Lately I’ve been tinkering more and more with using IMAP from the command line. Partially it’s that IMAP is really just a little bit unusual and kind of intriguing. But mostly, it’s just that, from time to time, it’s easier for me to just send some manual IMAP commands if I know what I’m doing. (For example, I have absolutely no idea how to subscribe to a particular folder in any of the mail clients I have available. I could wade through the menus and maybe find it, but it’s easier for me to just use Net::IMAP to subscribe to the folder.)

Like most implementations, Ruby’s Net::IMAP library provides a search method. And, like most implementations, it does a very poor job of documenting what is supported. At the risk of sounding like I’ve lost my mind, I actually found the IMAP RFC (3501) to be the easiest bit of documentation to understand. Below are some examples:

You can chain keys, so the following is a valid search command:

FROM "matt" SUBJECT "bacon"

But what isn’t abundantly clear is that search terms are combined with a logical AND, so the above will only match mail from Matt with “bacon” in the subject line.

This appears to be the way to get a logical OR instead:

(FROM "matt") OR (SUBJECT "bacon")

After spending a while trying to get all possible keys for a text search — e.g., (FROM "foo") OR (SUBJECT "foo") OR (CC "foo")... — I realized that there’s an easier way: the TEXT key, which searches headers and the body. So for my generic search method, the search simply became TEXT "foo".

You may also find some of the other keys interesting, like the ability to search for RECENT or FLAGGED. I don’t intend to provide an exhaustive list here, however.

Gay Marriage

There are a lot of things in politics that I believe but don’t feel too strongly about. But one thing that makes absolutely no sense to me is trying to ban gay marriage. North Carolina has become the latest state to put forth a constitutional amendment banning gay marriage.

So first of all, the concept of amending the constitution to take away a right is unfathomably misguided. Even if gay people were actually some sort of menace to society, the constitution is what gives rights.

But here’s what’s always bugged me. I’m a Christian. I went to Catholic school. But this is one of the reasons I don’t go to church anymore. What the church teaches and does are so wildly incongruous from what the Bible says. True, you can find verses that reference homosexuality being a sin. But alongside them, you’ll find verses that use equally-harsh language against fish “that do not have fins or scales.” No one argues that we should amend the Constitution to ban eating shellfish.

What I took away from the Bible wasn’t a handful of verses. But I can sum it up in a couple.

First, “Love your neighbor as yourself.” Unlike most of the Bible, this is actually a quote from Jesus. (And, in fact, in Mark 12:31, Jesus states that, between this and that there is only one God and Savior, “There is none other commandment greater than these.”) Besides the fact that Jesus appears to make a rather big deal of this point, it seems to me like it’s also one of the over-arching concepts that Jesus tried to get us to understand.

Second, when Jesus happened across an adulterous woman — a sin punishable by death in the Bible — Jesus left us with some more pretty clear guidance: “He that is without sin among you, let him first cast a stone at her.” Elsewhere, there’s further indication that we should leave the castigation and judgment of others to God, and focus on trying to lead righteous lives ourselves.

If I were to attempt to summarize the Bible in a paragraph, I think both of these verses would make their way in. These are perhaps the most well-known verses on the two subjects, but there are countless other times the same concepts are expressed in the Bible. To me, they’re fundamental to what Jesus taught.

So it boggles my mind that someone who read the same book as me could come away and say, “This book is all about how we should amend our constitution to take rights away from gay people.” Maybe the version I read was a misprint?

Fun with Bundler

On Aeolus Conductor, we’re using Rails 3. Although I’ve been using Rails for years, some part of Rails 3—namely, Bundler—are still relatively new to me.

The problem I ran into is that we have a :development, :test group defined, but it’s being installed in all environments. This is as described, but inconvenient when you’re trying to ship two separate RPMs—one package for end-users, and a -devel version for developers that depends on the gems in the :development and :test groups.

It turns out that, by design, bundle install will install all gems in all groups, but Rails will only load those in the relevant environments. They have a good reason for doing this, but for certain use cases, this is inconvenient. It’s easy enough to skip this: bundle install --without=development test does the trick.

But what trips me up is that it’s a “remembered setting,” something which is poorly-documented as far as I can tell. (But maybe I’m looking in the wrong places.) The problem is that there’s no apparent way to un-remember these flags, which is the subject of #867. Right now, you’re left manually editing .bundle/config to remove them. This works, but is really annoying. (#1006 argues that the whole “remembered options” feature is counter-intuitive and should be excised.)

Dear Microsoft

Dear Microsoft,

I’ll admit that, as a Mac user who develops software for Linux at an open-source shop, I’m not exactly predisposed to being your biggest fan. But I think you’re mostly okay. You’re like Scott Brown — I wouldn’t vote for you, but I’m surprisingly okay with you.

There’s just one little thing… Outlook Web Access 2003. What happened there?

Did you ever realize that you’d leave people finding this as their best option for searching their email?

$ irb
>> require 'net/imap'
=> true

>> imap = Net::IMAP.new('mail.example.com')
> # snipped...

>> imap.login('user', 'password')
=> #<struct Net::IMAP::TaggedResponse tag="RUBY0003", name="OK", data=#, raw_data="RUBY0003 OK LOGIN completed.rn">

>> imap.select('INBOX')
=> #<struct Net::IMAP::TaggedResponse tag="RUBY0004", name="OK", data=#<struct Net::IMAP::ResponseText code=#, text=" SELECT completed.">, raw_data="RUBY0004 OK [READ-WRITE] SELECT completed.rn">

>> imap.search('SUBJECT "top 25"')
=> [1160, 1161, 2755, 2834, 2857]

>> imap.fetch(1160, "BODY[HEADER]")
...

Yeah. That really wasn’t cool. And the thing is, search is a server capability (that Exchange supports!), so it’s not like it was something that webmail couldn’t support. (In your defense, though, Outlook Web Access 2003, every IMAP mail client I’ve ever tried wants to index gigs and gigs of email in that mailbox before I can use it, so you’re only a part of the problem. The fact that no one has ever made a good email client isn’t your fault.)

Sleepless Nights

Some people can’t sleep because they’re excited or anxious about the next day. Other people can’t sleep because they’re sad or glad or guilty or proud, or because the birds outside are addicted to methamphetamines and never quit chirping. But here’s why I can’t sleep tonight:

What do you think would be involved in getting NTP (or a reasonable facsimile thereof) written in JavaScript and using HTTP? And how accurate do you think it would be? Not a lame thing where you take the time from some random webpage and claim that as current time, but an implementation of Marzullo’s algorithm in JavaScript for sourcing time from multiple servers, a means for calculating round-trip latency, a means for tracking clock drift between requests, and something like a little Sinatra app to just serve Time.now.utc.to_f and set no-cache headers? (Actually, time.to_f isn’t terribly precise, though I doubt you’ll be troubled by this in the real world.) How accurate could you get it? I doubt you could rival NTP, but could you get to the millisecond level? Within 10 milliseconds? Surely within 100 milliseconds?

If you’re willing to sacrifice sub-second accuracy in favor of not needing a list of special “time webservers”, HTTP headers indicate the time, and any webserver worth its salt should be synced to NTP. Though it seems many aren’t, so I wouldn’t count on this for anything remotely important. Plus it requires you to be able to parse HTTP headers that many frameworks might not expose.

Non-Evil Internet

As those of you who read my blog, follow me on Twitter, or are my friend on Facebook surely know, I’m feuding with Verizon FiOS. They randomly decided to start charging me more money, and have been impossible to get ahold of, and absolutely indifferent when I finally got someone on the phone.

Really, I want to start my own ISP. Our motto would be “We’re not out to screw you.” Here are some of the things I’d like to do:

  • Only offer service where last-mile fiber-to-the-home is available, or trivial to run. (Note WiredWest, which is running muni fiber to about 50 towns in Western Massachusetts!) An all-fiber network is key.
  • Offer some traditional-ish plans (perhaps 10/10 Mbps), but also offer plans that are simple 100 Mbps Ethernet with various download caps. We’d be completely upfront that it wasn’t a guaranteed 100 Mbps, and what the cap was. But you could then get, say, a 100/100 Mbps plan with a 100GB cap for $50/month if you really didn’t use the Internet that much, or a 100/100 plan with a 1TB cap for $150/month if you were a heavy user.
  • Since we have fiber to everyones’ homes, offer some less-traditional services, like “cloud backup”. Or just a network file server. You could pay us for a 1TB network share over Gigabit Ethernet into your home, supplementing whatever you have for Internet, and set it up as a traditional SMB/CIFS/AFP share, or use our web GUI to access it remotely.

But some of what I want to offer is non-technical, and I think this is even more interesting, if only because no one offers it today:

  • The price you sign up for is the price you will pay. Forever. After 14 months, we won’t randomly raise your rate and force you to sign a new contract at a higher price. If you decide you want to change your plan — up or down — you can do so with nary a headache. If you die, we’ll stop billing you. (Though you could also just call us up and ask to cancel.)
  • If you call us on the phone, a human will pick up and speak with you. There will be no AVR. They will be down the street. You won’t have a 16-digit customer code, just your name.
  • If we can’t keep 99% uptime, we’d give you a hefty discount. (99% actually sounds really pathetic.)
  • Our installation tech will be there within 90 minutes of the quoted time, or your first month is free.
  • Your personal information will be stored encrypted and with the highest protection practical. We won’t keep it on a laptop and leave it in a coffeeshop. (How does this keep happening?!)
  • You won’t have to sign away rights in your contract. You won’t have to agree to arbitration clauses. If your personal data is subpoenaed, we’ll fight it in court.
  • If your home is destroyed by a tornado, we will not fine you for damaging our cable box or modem.

Two UI Features I Can’t Live Without

I jump between a Mac at home and Linux (GNOME) at work, but there are two features (unknown to far too many people!) on both platforms that I can’t live without:

  • The ability to “zoom out” all my windows and display smaller versions of them so I can rapidly jump around. On the Mac, this is called Expose, and I access it by pressing F9. In GNOME, I have it mapped to Ctrl+Shift+Up (non-standard IIRC), and it’s provided by Compiz Fusion. This is a pointless feature if you only have a couple windows open, but when you’re really getting into something and you have a dozen or more things going on, this makes switching so much less painful. It’s especially good if you need to switch to an application that has “fallen to the bottom” of your window stack, or if you won’t recognize it by window title (because you have five terminals open and want the one with all the red prompts which you’ll recognize as the production database server).
  • A launcher. For a long time, I’d launch most programs from the terminal, just because it was easier for me. If I wanted Firefox, I didn’t want to have to mouse over to the start menu and try to find it in a long list. I wanted to type “Ctrl+R, fir, Enter” and re-launch “firefox-bin &”. (Sure, I could keep an icon on my desktop, but that implies that I don’t already have windows covering my desktop.) On the Mac, I use Alfred for this, replacing Quicksilver. In GNOME, it’s Do. In both cases, pressing Alt+Space pops up the launcher window. I type a few characters to match the program I want and press Enter. All of these launchers are capable of far more than this, but the mere ability to do this makes these apps worth their weight in gold. (Figuratively. Literally, they have no weight, which would make them worthless.)

Don’t Sign Up for FiOS

I’ve been a loyal FiOS customer for about a year and a half. I pay $69.99 a month for a 25/15 Mbps pipe. Aside from one absolutely miserable experience trying to speak to someone in billing who was able to update the expiration date on my credit card (it took four people, one of whom literally did not speak English, and about 45 minutes), I’ve been pretty happy. The connection is pretty reliable.

But then they randomly raised my rate from $69.99/month to $79.99/month. No idea why, no explanation given. Worse, if you visit their site, $69.99 is the rate advertised, with no fine print about $79.99/month. They just randomly jacked up my rate to see if they could.

So I just logged into my Verizon account, intent to do something about this. And lo and behold, I found this:

So there are actually two problems here. One is that the $69.99 plan — the one I signed up for and have been paying for all along — randomly jumped in price on me, but is still being sold. It’s not a case of the rate rising to meet inflation or something; it’s a case of them suddenly charging me more money for the same service. Second, this isn’t even accurate. It states that my plan is $74.99/month. It’s actually $79.99/month:

(My history actually goes back much further. In total, I’ve paid Verizon nearly $1,250.)

While scratching my head over this discrepancy and what could be going on, a Live Chat window popped up. Perfect, I thought!

They hung up on me:

So now I’ve gone from being a little confused about why my rate went up to being incensed. They’re overcharging me, and when I asked them about it, they disconnected.

More confusing still, when I went back and selected the 25/25 plan for $69.99, it implied that I was signing up for a one-year contract, when the drop-down on the page indicated I was viewing a month-to-month plan.

So I really like the fast 25 Mbps download speed, but I really can’t understand paying more than $70/month for Internet. RCN and Comcast both send me several offers in the mail, and can greatly undercut the prices Verizon is offering, albeit for slightly slower service. I think Verizon has just lost me as a customer.