• About ▾

I’m : a programmer, writer, podcaster, geek, and coffee enthusiast.

“Political Views”

My thoughts on the anti-gay-marriage Mozilla CEO controversy got mostly positive responses in agreement. All others had the same argument: that Brendan Eich should not have lost his job because of his “political views” or “free speech”.

Even Andrew Sullivan took issue with the controversy:

If we are about intimidating the free speech of others, we are no better than the anti-gay bullies who came before us.

His right to free speech entitles him to express any opinion he pleases.1 But it does not shield him from the personal and professional repercussions of what he says.

Our right to free speech entitles us to be vocally outraged, to encourage others to boycott Firefox,2 or to call for his firing. What Mozilla pressures or forces him to do as a result is solely their decision and their problem, and has nothing to do with anyone’s free speech — it’s a business decision.

So let’s knock that argument right out. This is not a free speech issue, period, and it’s incorrect, misleading, and naive to attempt to make it one. Such distortions are the fastest way to pervert and derail an argument, as we often see from our politicians, and I expect better from intelligent people like Andrew Sullivan.

Let’s move on to “political views”.

Suppose, rather than fund an anti-gay-marriage bill, Eich had instead funded a fringe bill that prohibited black people from getting married. Or suppose he said during a press conference that he believed women shouldn’t have the right to vote.

Would it be reasonable for the public to be outraged and call for his firing then?

Assuming your answer is yes (I don’t think I can really help you if it’s not), why is that different from funding an anti-gay-marriage bill?

Opponents of gay marriage (and other equal rights and anti-discrimination protections for LGBTQ people) consider their opposition a valid “political view”, appealing to the already completely wrong and extremely destructive idea that all opinions on an issue are equally valid and deserve equal time and representation in media and public discourse.

“Beliefs” and “views” deserve no inherent protection, validity, or value to the rest of society simply because they’re political or religious. They’re just opinions, and just as many opinions are worth considering and discussing, many others are offensive, crazy, ignorant, or bigoted.

A hundred years ago, saying that women shouldn’t be allowed to vote was a “political view”. Now, that would be a ridiculous and highly offensive opinion regardless of what any religion or political party said on the topic. Most discriminating “political views” of this sort eventually become widely recognized as unacceptable, barbaric bigotry with no place in civilized society — it’s just a matter of time.

As much as gay-rights opponents would like to believe otherwise, that time has come for their “political views”.

  1. Unless they caused him to do something that is illegal, such as hiring discrimination. (There are many more exceptions and limitations to “free speech” that actual lawyers can tell you about.) 

  2. Much of the world was actually doing a pretty good job of inadvertently boycotting Firefox before this controversy. 

Throwing K-Cups In Glass Houses

People keep sending me this article and its derivatives, looking down on Keurig and other single-cup one-button brew systems that serve mediocre, stale coffee to people who don’t care about coffee quality to the ridiculous degree that “we” do.

While throwing away a little plastic cup for each brewed cup of coffee from these systems is indeed wasteful and should be an environmental concern, let’s not rush to judge.

Photo by Clint McMahon

We’re the ones who have made drip coffee, something that was cheap, easy, and available to everyone, everywhere, immediately for decades, into an ever fancier, more time-consuming, more expensive, and more exclusive obsession over gear and technique.

Photo by Gabe Rodriguez

We’re the ones who keep creating, replacing, Kickstarting, and spending top dollar on ever-more-specialized equipment, even when it differs from established products only in arbitrary or purely decorative ways that have no discernable effect on the actual coffee (except maybe prolonging the process of making it).

We’re the ones who obsess over every little detail of brewing technique as if they matter much more than they really do, making good coffee ever more alienating and confusing to casual coffee drinkers who don’t have time to study and fuss over it as much as we do.

Photo by Pål-Kristian Hamre

Can you blame people for enjoying a simple, automatic, one-button system, considering the alternatives that we keep making ever more complicated, fussy, and demanding of their time and technique?

Photo by Mathieu Thouvenin

The alternative that we present sends a clear message: “We are cool, this is fancy, and your coffee is crap.”

The latter is true, but at what cost?

Photo by David Lytle

We certainly pay for it. Not only is our fancy coffee much more expensive than regular automatic drip at retail, but we also pay massively in our time, and we ask the public to do the same. That’s why specialty coffee shops often have a huge line: it takes much longer to make an individual pour-over cup than almost any other well-known method of making hot coffee except a siphon brew.

Photo by Jonathan McIntosh

Our methods aren’t environmentally sound, either. We’re not throwing away a little plastic cartridge with each cup we brew, but we’re often throwing away big paper filters with each one. We’re almost certainly heating the water less efficiently, and often to a higher temperature, than any automatic brewer.

Photo by Munir Squires

And then our fancy coffeeshops brew our fancy coffee into a disposable paper cup, usually wrapped in a disposable paper insulator, and topped with a disposable plastic lid — but not before many customers add sugar from a paper packet and stir it with a disposable stick of plastic or wood.

Maybe we’d get some of the Keurig fans to use our methods if we weren’t so pretentious, wasteful, expensive, and inaccessible ourselves.

Maybe we need to tone down our obsession on the hand-crafted, hand-made, artisanal, and ritual. Sorry, your coffee isn’t an artisanal ritual. Making great coffee is not inherently romantic, noble, or even difficult. There’s nothing wrong with using a $30 French press, a $25 plastic plunger, or a $35 cold-brew basin in the boring, simple, as-directed ways. Plenty of people don’t have burr grinders and are perfectly fine with the spinning-blade ones. Your kettle doesn’t even need to look like a beehive.

Our obsession with gear and “rituals” is only distracting them — and us — from the real problem: old, mediocre, or badly roasted beans.

We’ll only fix the real problem and get more people back to our side if we drop the pretention, ritualization, and gear obsession and recognize why so many people opt out of our fancy coffee methods and into Keurig’s.

Web Hosting For App Developers

Justin Williams captures much of the complexity facing modern app developers in The Parts of Your Platform:

Ignoring the cloud or web services because they are out of your comfort zone is no longer an option.

But we need to sit down and have a talk about web hosting. Seeing well-meaning developers get burned, abandoned, or ripped off by unexpected changes, limitations, and costs in the cloud-service landscape is too painful for me to watch in silence.

The common wisdom, which Justin suggests, is to go directly to a highly abstracted, proprietary cloud service or a higher-level hosted back-end — the kind that are so high in the clouds that they call themselves “solutions”. But the “BaaS” landscape is still very unstable with frequent acquisitions and shutdowns likely, and hosting on VPS-plus-proprietary-services clouds like Amazon Web Services or higher-level services like Heroku or App Engine can get prohibitively expensive very quickly.1 Developers who build everything on these services by default would probably be shocked at how cheaply and easily they could run on dedicated servers or unmanaged VPSes.

Running your own servers really isn’t hard. Most developers reject the idea outright without even trying because it’s unfamiliar and intimidating. It’s considered an extreme, horrible, unfathomable situation that must be avoided at all costs, usually by people who have never tried it.

But that’s a fallacy. There’s a learning curve and necessary integration work for every back-end option, from iCloud and Dropbox to your own colocated servers. AWS, Azure, Heroku, App Engine, Parse, and similar services aren’t free, easy, or automatic. (Neither is “scaling” with them, regardless of what you’ve heard.) Hosted infrastructure is like sync: it has a minimum, unavoidable level of complexity to accommodate. You can’t just check a box or set a BOOL and have it all taken care of for you.

If you’re going to invest your time into learning any of these options, you might as well learn the timeless one that’s most likely to survive every acquisition, language, trend, and paradigm shift: basic Linux server administration.2

Wait! Don’t leave! Hang in there.

Modern Linux server administration is much easier than you think. If you can write a halfway decent app, you can manage a Linux VPS in your sleep.

You don’t need to compile kernels, build anything from source code, partition any disks, or deal with iptables in most cases. The defaults of good distributions and packages are almost always very secure. And once you set everything up, you can leave it running largely untouched indefinitely. You’ll probably never be woken up at 3 AM to reboot anything or delete log files.

Take the weekend to open a Linode account, create the cheapest instance ($20/month, billed hourly), and plow through initial setup of something substantial, like your own basic Ruby, Python, PHP, or Node app with a boring old database (MySQL or Postgres) and webserver (nginx or Apache) if necessary.3 If you mess up so badly that Google can’t help you, just delete or restore the instance and start over. Cheap VPSes have made it easier than ever to experiment and learn.

Want a scalable setup? Make three ($60/month). Two are your webservers and one is your database.4 Put a virtual load balancer in front of the two webservers ($20/month).5 At any time, you can then easily take either of the webservers down for a few minutes to upgrade to a higher-powered instance without taking the whole service down. If you get an influx of traffic one day, just clone a few more webservers behind the load balancer. After the load subsides, delete the ones you don’t need anymore.

Self-managed VPSes are the best option today for most developers hosting web apps. Good VPS services provide many of the benefits and easier scaling of higher-level services, like easy cloning, easy backups, fast upgrades and downgrades, and elimination of most tedious hardware management.

If you end up getting so big that you need more horsepower than VPSes can practically or affordably offer, you can switch from standard Linux VPSes to cheaper, faster dedicated or colocated servers very easily using most of the skills and tools you already have. You can even mix and match VPSes and dedicated servers at some hosts.

If any particular host starts going downhill or is no longer price-competitive, you can take all of your skills, tools, and infrastructure and move them to another host. Unlike proprietary cloud platforms, regular VPSes and servers are a competitive commodity market. Linode sucks? Try DigitalOcean, which offers effectively the same product at similar prices. Rackspace too expensive? Try SoftLayer or Limestone Networks. Simply avoid all hosts’ proprietary, hard-to-replace products and stick to their standard VPSes and servers, and your service and knowledge become portable and resilient.6

Tumblr taught me by necessity, especially in the early days when we had no staff and very little money, how to develop and host a high-traffic web service cheaply, easily, and sanely. I couldn’t let the servers require too much maintenance because server administration wasn’t my main job — we didn’t have a dedicated server administrator for the first few years, so I just had to set things up such that they didn’t need much administration.

In 2006, that was a rarely-needed specialty. Even when I launched Instapaper in 2008, hardly anyone making consumer apps needed those skills. But if I hadn’t learned them at Tumblr, Instapaper could never have grown independently, The Magazine wouldn’t exist, and Overcast would be much more limited.

Today, the ability to sanely and economically run a web back-end is a basic requirement for a lot more developers, and it’s only going to become more necessary in the future. Many apps are already expected to have sync, connectivity, and web features, and those expectations will only spread to more categories in the future. Refusing to embrace this shift will severely limit your apps and may cost you your business.

Start building those skills now.

  1. “Cloud” is such a buzzword these days because cloud hosts, continuing the web-hosting tradition, have very fat margins, low barriers to entry, and high barriers for customers to leave.

    Virtualized cloud services are web hosts’ dream: there’s much more opportunity for branding and hand-wavy products with ambiguous benefits and unverifiable claims, less focus on numbers that could be comparison-shopped (what, exactly, is “4 CPU”?), highly profitable usage of old hardware (often running an undifferentiated mix of hardware up to 5 years old or more), and more room for proprietary lock-in. And they can still price their services as if RAM was expensive: the biggest con in the history of web hosting. It’s high-profit wins all around. 

  2. Linux distributions are an unfortunate oversupply of paralyzing choices. The easiest path is to learn one major distribution very well and use it everywhere. You want conservative, slow-moving, and very popular: that way, updates almost never break anything and it’s all very stable (conservative), you don’t need to re-learn the basics and tools constantly (slow-moving), and there are tons of Google results and tutorials for every question you’ll have (very popular). I chose CentOS in 2005 with no regrets: it’s basically a free version of Red Hat Enterprise Linux that exceptionally satisfies all three conditions. I’ve heard Debian is also a solid choice. Always deploy the latest official (stable) 64-bit release. 

  3. Boring old is the key to server-administration happiness. Stick to the boring and the old, and you’ll rarely need to deal with anything. The lower down the stack, the more important that becomes.

    This is why I still very happily use MySQL (InnoDB-only) instead of a trendier, newer database: it’s very fast when used properly, and I’ve never seen it crash, corrupt data, or perform irregularly. And I’ve run a lot of heavily-used MySQL servers. Not a single crash, ever. The only other heavily used server tool I can say that about is HAProxy

  4. Don’t forget to schedule automatic database backups, since the host’s backups probably won’t be consistent for the database files. For MySQL, mysqldump is fine until your database gets huge, at which point you should consider xtrabackup.

    My favorite option: make a replicating slave database server (another $20/month) whose sole responsibility is backups. Every day, have it shut down MySQL, tar-gz the entire /var/lib/mysql data directory with the binlog number and position in the filename, encrypt it, upload it to a S3 account dedicated to this purpose, and restart MySQL. This is by far the most reliable and fastest-to-recover MySQL backup method that I’ve ever used.

    (Bonus points: between backups, every few minutes, rsync the binlogs somewhere. Then you have point-in-time, query-level recovery to any point up to a few minutes ago.) 

  5. If a virtual load balancer isn’t available at your host or you don’t want to use one, just use a software one, like the excellent HAProxy, running on the cheapest VPS available. (They’re very low-needs.) 

  6. I also maintain a giant shell script that configures everything I need on a clean install of CentOS. Once you’re comfortable with the basics, I suggest doing this, as it makes it easier to set up new servers or switch hosts.

    Making such a script is much easier with VPSes, where you can start a new one, test it out, change it as needed, delete the instance, and try again on a clean one.

    Ideally, your servers should be disposable and easily recreated. The only backups you should need are your source code (which should include any required server-setup scripts) and your database’s data. 

Toddler Stuff Review

We got an amazing response from our huge baby stuff review last year. Adam is now almost 2 years old, and these are some of our favorite and most useful products that we recommend for toddlers and their parents.

Adam stomping puddles in his Crocs rain boots. Photo by Tiff.

Britax Pavilion car seat (newer version): We wish we switched to this earlier — we didn’t realize that we didn’t need to wait for our kid to outgrow the mediocre, frustrating Graco SnugRide infant seat. In practice, the convertible seat wasn’t very useful after about 6 months because carrying our kid in it became prohibitively heavy. The Britax Pavilion is a noticeable step up in quality — it’s very nicely padded, it’s easy to move between cars (much easier than removing the Graco bases), the straps hardly ever get tangled in use, and it adjusts to child growth without needing to be taken apart. The “Click and Safe” ratchet on the main tightness strap is very nice, too.

OXO Tot plate and silverware set, divided plate, and bowl set: All of these are great. The fork and spoon are very easy for the kid to hold, with thick, rubberized handles and intuitive curves. The fork is almost spoon-shaped, but it still has useful enough tines to pick up food. All of the plates and bowls have rubbery bottoms to prevent sliding, so they stay in place on high-chair tables until your kid learns to pick them up. The curved lip on the plates is nice for certain foods, but it’s detachable for when it’s not needed. The bowl lids snap tightly for transporting snacks in diaper bags or storing leftovers in the fridge. All of this stuff is dishwasher-safe, and also easy to clean by hand.

OXO screw-top snack cup: Great for Cheerios or the overly natural Cheerio alternative that we buy at Whole Foods (of course). Kids can reach in and grab a handful, but they can’t easily spill the whole cup — at worst, they lose a handful at a time. We previously used the Munchkin snack catchers, which we loved until our son figured out how to remove the friction-fit lids. He hasn’t figured out the Oxo screw-on lid yet, and the Oxo also has a nice sealed lid to attach when you want to bring this in a diaper bag or stroller pack.

Green Sprouts Eva plastic bibs: These are much easier to clean than cloth bibs once your toddler starts using silverware unassisted. Compared to fancier rigid plastic bibs, these are flexible, foldable, easily packed, and nearly weightless. You don’t need many — we’ve been fine with just one 5-pack for over a year without wearing any out yet. Pro tip: Turn the pocket inside-out. This makes the pocket stay open wider, so it catches more food.

Planet Wise and Itzy Ritzy small/large wet/dry bags: A washable, reusable alternative to using a million plastic bags. We’ve used ours for transporting snacks, diapers, and wet or dirty clothes inside bigger bags to keep them separate. The lining is waterproof, but the zippers aren’t — moisture won’t soak through the bag, but they will leak if you spill a drink inside and turn it over.

Petunia Picklebottom Weekender diaper bag: We wanted a larger diaper bag when our toddler started needing more clothes changes, snacks, and toy diversions, and stopped breastfeeding. Tiff wanted “a girly bag that looked less like I was just lugging baby stuff all the time”. This one is very useful, has tons of pockets, and is very spacious — it opens very widely, and some sections expand, so you can see the entire interior when packing, and you can always find what you need without much digging. It’s also still fashionable enough that it’s not just a “diaper bag” — it’s just a really nice bag, and it will be useful long after we stop needing it for this role. Go see one in a store if you can. Some of them have a “wipeable exterior”, but ours doesn’t, and it hasn’t been a problem.

Fisher Price Music Parade ride-on car: This thing looks so cheesy, we didn’t think he’d like it. But he loves it. He pulls it all around the house and has been consistently amused by it for almost a year so far. He can push, pull, or ride on it. The seat opens and can store stuff. There’s lots of buttons that play music and sounds. It’s a 1-year-old’s paradise. This might be his favorite toy.

Melissa and Doug cardboard blocks (or a bigger set): You’ve probably seen these in every preschool (including your own). We got our set at a yard sale for $2, thinking it was a risky purchase that our son might not like. The moment we brought them home, he was hooked and started instinctively building towers. They’re exactly how you remember: strong, light, harmless, and cheap (even if you pay more than yard-sale prices).

Radio Flyer Walker Wagon: We got this to help our kid learn to walk. It’s very sturdy and worked well for its purpose: since the wheels don’t swivel, it only goes straight, making it easier to keep control. Now, over a year later, he still plays with it, sits in it, and pulls it around. And whenever other kids come over, they all want to play with it, too. The sides are easily removed, as they’re only held in by gravity, so it’s very versatile.

Step2 Whisper Ride push car: A fun alternative to a stroller for short walks: up and down the driveway, or at most, around the block. The handle folds down for easy transportation. The adult and kid each get a cup holder, and the kid loves opening the hood and putting stuff inside. And as he turns the wheel and squeaks the horn, he might feel like he’s driving — whatever he thinks, he sure likes it.

Uppababy G-Lite portable stroller: Extremely lightweight collapsible stroller. We got it as a more portable alternative to our big Bugaboo, but most umbrella strollers didn’t feel sturdy enough, and we’re very happy with this choice. It collapses very small (although long), and it’s easy and quick to open, yet it has most of the nice features of other large strollers, including a full sun-shade, a mesh carrying basket underneath, and a cup holder. In its folded position, it can stand upright, which is convenient when unpacking it. It’s very maneuverable, and with the attached carrying strap, you can carry it on your back if you need to. Its many well-thought-out functions and its light, sturdy construction made this stand out from other similar models. We also got the optional case to keep our car trunks clean when the stroller wheels get dirty, and it’s nice and very functional.

“i play” plastic summer shoes: These look like Crocs, but more stylish and with a full back. (We tried baby Crocs, too, but our son was able to walk in these more easily.) Socks are optional: they can be used like regular sneakers or water shoes. These were great all summer, as he loved playing with the hose in the front yard, and always found every puddle available for stomping while walking. We plan to get another pair this summer. We also recommend the Crocs rain boots for springtime puddle-stomping: they have no seams so water can’t get in, they’re very easy to put on, and the sole isn’t too thick so they’re easy for toddlers to walk in.

Zoli BOT sippy cup: When they’re clean and fully sealed, these are the best sippy cups we’ve found. We’ve had a few of these (and many others), and unlike others, these have never broken or snapped open when they’ve been thrown or dropped. The clever weighted-end straw is also great: liquid comes up through the straw at nearly any orientation that the cup’s being held in. And the straw’s valve-like tip won’t leak when tipped over. But it’s not perfect: the straws are hard to clean and eventually need to be expensively replaced, it’s very unforgiving if the lid’s not screwed on perfectly straight, and there’s a weird issue with fluid dynamics: if there’s a large temperature difference between the liquid and the surrounding air, the pressure change as the temperatures equalize often forces some of the liquid out of the straw in a slow leak. So they’re imperfect, but they’re the best we’ve found in an otherwise miserable category.

JJ Cole Urban Bundleme: Effectively, a sleeping bag for strollers so you can walk in cold weather and your kid stays warm. It’s much easier than wrapping a blanket around your kid and hoping it stays in place, doesn’t get kicked off, and doesn’t drag on the ground or get caught in the wheels. The Bundleme has slits in the back for passing the straps through, which keep everyone and everything securely in place, and it can completely unzip for easy removal of accumulated lint and Cheerios at the bottom. (It even unzips entirely if you want to only use the back half.) The outside is water-resistant and there’s a little pocket on the side. We chose the Toddler size, which also fits our friend’s 6-month-old perfectly well, so it’s probably worth skipping the Infant size.

Safety 1st pinch/door-slam preventer: We don’t know if all kids love closing doors, but ours sure does. These are surprisingly good: they can go on either the outside or inside of the door to protect against slams or hinge-pinches, they’re small and subtle, and they hang nicely on the doorknob when not in use.

Skip Hop big animal bath towels: Bigger and better than most baby or toddler towels. Our kid quickly outgrew most others, but these still wrap completely around him. The hood is both adorable and convenient for alignment and hair-drying. They dry quickly, and they’ve held together through almost two years of heavy use so far — they haven’t faded at all, and not a single animal piece has fallen off in the wash. The included washcloth-mitts are just as good, too.

Aden + Anais big washcloths: Big, thick bath washcloths that hold a lot of water. They’re much softer than terrycloth (great for face-washing), and they’ve proven extremely durable. Highly recommended.

Pampers Cruisers diapers: We’ve tried most diaper types (including a brief cloth attempt), and these have always worked best for us. They’re soft, they fit well without much bulk, and they hardly ever leak (as long as you don’t forget to pull out the leg ruffles). The Extra Protection overnights are especially great, too. Our strategy for sizing is simple and has served us extremely well: if there’s ever a leak, especially at night, we go up to the next size.

North States “Superyard” (jail): This wooden jail is great-looking, heavy, sturdy, and secure. We always get compliments on it. The wood is high-quality and hasn’t chipped or cracked at all, and it was extremely well-packaged on arrival. Our kid was able to climb out of his crib at its lowest setting, but still can’t climb out of this because there aren’t any horizontal foot supports: it’s all smooth vertical bars. (He also just likes being in it, so he doesn’t usually try.) The door is a great feature, although you’ll need a toy-clip rope if you want to hold it open. It’s not portable, and is for semi-permanent setups: it’s heavy and doesn’t collapse easily. (This plastic one is portable and lightweight, but not nearly as good. Suitable for leaving at grandparents’ houses.) And we recommend the 2-panel extension: it gives much more room inside.

Once again, if you have any questions about what we liked and didn’t like about these or any other baby or toddler products, you can email Tiff and she’ll be happy to help.

Ads via The Deck