Skip to content


I’m glad I’m not alone in condemning EA’s marketing

These guys had a much bigger production budget than I did to make basically the same point.

Posted in Advertisements, Games.


Thanks for elevating your art form, EA

This advertisement for Dead Space 2 is making the rounds on the internets:

I’m glad to see that EA’s marketing department thinks so much of their product that they feel the need to tell me how much playing it will piss off my mom. I understand that, 17-and-up rating notwithstanding, they’re marketing to a younger demographic, but come on. When your medium is near universally dismissed as a pursuit for basement-dwelling man-children, maybe you should consider a little sensitivity with your ad campaign.

Today I learned that Firefox’s spellcheck considers both “Internet” and “internets” to be valid words, but scorns “internets.”

Posted in Advertisements, Games.


This old thing again?

I’ve come to dread someone in the media or the wide blogosphere talking about women (or the lack thereof) in science and engineering, particularly in the “hard” sciences and computer programming. Inevitably, someone will make a comment like the first one on this relatively bland essay about being a woman programmer:

it is actually only partly because of our culture. genetics found out many years ago that male and female brains are sort of preprogrammed trough evolution. man are stronger therefore they were more likely to survive risky endevors like hunting and in general experimenting. females in return had to cover the more manual, monotone and mostly repeating tasks without taking risks (collecting berries).
through this evolutional behavior men just have no fear “breaking” things and women are rather scared of breaking things and try to handle situations on the emotional level instead of putting in risk. a good example is that women are prefered in factories doind repeating work. our brains are just wired like that.

Just as inevitably, someone will reply to that guy like so:

Wow. And the fact that this sort of gender-essentialist, ev-psych nonsense is the VERY FIRST RESPONSE to an extremely thoughtful post? Oh, yeah, the constant messages that women should go back to their “natural” work (read: taking care of men and children) definitely have nothing to do with women’s challenges in technology. Nuh-uh, it’s all about our genetic adaptations to pick up berries. Go check the research, because you’re quoting a bunch of debunked bullshit.

This fight just won’t go away, and the reason it persistently avoids resolution is because the two sides of the argument represented above — I couldn’t have found a better archetype of it if I’d made it from whole cloth — are just talking past each other. Or maybe, to the members of their respective choirs. I’ll paraphrase these two sides, reducing them to absurdity.

Guy: There exists evidence that men and women are different when it comes to logical reasoning and mathematics. I have misplaced my references on this evidence. Women are inferior and nothing will ever change that.
Girl: Your evidence must be “bad science” because its conclusions contradict my very pleasant, egalitarian beliefs. You are obviously a sexist. [To be fair, the dude often is a sexist]

What really bothers me about this repeating argument isn’t so much the often blatant sexism expressed, but that it’s always immediately derailed by emotional rhetoric into a conversation that’s no longer about evidence. After all: it’s a scientific question. Without evidence, it’s just a particularly nasty sort of philosophy. I said as much when I wrote about the Larry Summers debacle back in 2005:

What is really at stake here is academic freedom. The job of a scientist is to discover and present facts, not to dictate which facts should and should not be presented. When the president of a prestigious university suggests a venue of research and is silenced and forced into retreat by ideologues, there is cause for concern.

I was taking poetic liberties in that opinion piece — Summers didn’t so much “suggest a venue of research” so much as talk off the cuff about his own personal beliefs, which include the probability that innate differences between the sexes plays some role in gender imbalances in various occupations. As evidence, he cited the much wider distribution of SAT math scores among men relative to women, despite a similar mean. In other words, many more men than women score very high or very low on the math SAT, although the average scores for each gender are relatively close. For scores above 700, it’s a ratio of 2:1.

What happened to Summers was a case study for everything people hate about the Political Correctness movement — the privileging and presupposition of certain thoughts over others. A torrent of media voices, his peers, and fellow academics called for his censure or resignation. A blog kind enough to link to my opinion piece paraphrases their outbursts:

The speech of Lawrence Summers was outrageous – everyone who has heard it should either black out or throw up. He has no right to speak in this way. Women are discriminated. You can see that they have a smaller representation in various professions – and most people (both men and women) believe that men are more likely to be successful in these professions. This proves that discrimination is everywhere around us because everyone with the right opinions about the world knows that the women are identical to the men, perhaps except for one organ. Note that this is not a circular argument because it is not a circular argument.

Several commentators at the time pointed out the irony of feminists shutting down a debate about the rational abilities of women with an emotional outburst, such as this lady.

I can think of few things more discouraging to any woman who lives by her intellect than the sight of some of the nation’s most highly credentialed female scholars attempting to use their emotions to cut off argument, rather than focusing on winning the debate. Political correctness is the opposite of thought. It proceeds by moral condemnation and emotional outrage: Anyone who can imagine such a thought must be a bad person, or a crazy one.

Because here’s the thing: when you disagree with someone about a potentially falsifiable thing they said, you’re supposed to disprove them with contradictory evidence, not angry rhetoric. That people agree to do so is the only reason the scientific community can function.

It saddens me to see people scorning evolutionary psychology because some of its findings reinforce gender stereotypes from the fifties. Evolution is the guiding light of biology, which is the root of psychology and behavior. Just as I didn’t really understand the unifying principles of life on earth until I understood evolution, I didn’t really get the unifying principles of the people around me until I understood evolutionary psychology and cognitive science. It probably says a lot about my own propensity for engineer-thought that I needed a formal, math-based framework to understand other people’s motivations, but there it is.

Of course, that’s not to say that out culture isn’t responsible for some part of the gender imbalance in science and engineering (but not all of it). The driving force behind these social pressures is illustrated nicely by the aforementioned bland essay, and is something I’ll call Male Privilege.

Most of my classmates were not that extreme, and from my experience, most mean well but are just socially awkward. They can say something so simple as “Oh don’t you know that command?” but in an inadvertently condescending voice that makes you feel like you’re the only person who doesn’t know it. As someone just testing out the CS waters, that type of experience in every class can be very daunting. I think women are more susceptible to these feelings of inadequacy, and it can deter some potential CS concentrators from the department. From my limited experience, the ones that stayed with it were pretty strong-willed and generally kept to themselves.

White Privilege means never having to worry that your apparent race is the cause of your inadequacy in the eyes of others. Male privilege is never having to worry your gender is the cause. Anxiety caused by such worries is a measurable demotivator and performance killer in academic contexts, so we know objectively (at least in the case of race) that it’s a real problem that we should try to correct. Note that I have absolutely no idea how to do so short of quotas in CS schools and corporate jobs, and good luck getting that one past the Fourteenth Amendment. Still, plenty of people want to fix the problem by doing exactly that, applying Title IX to the sciences. Yes, they are serious.

I think a large part of putting this fistfight to bed, or at least making it marginally more civil, is for the proponents of innate gender differences to stop referring to “ability” and start referring to “preference,” turning the argument from one about superiority into one about empowerment and choice. It’s not a misrepresentation — the data are entirely sensible in this light — and it reframes the debate to not sound so confrontational. Susan Pinker does so very eloquently in the same Times article about Title IX:

Ms. Pinker, a clinical psychologist and columnist for The Globe and Mail in Canada (and sister of Steven Pinker, the Harvard psychologist), argues that the campaign for gender parity infantilizes women by assuming they don’t know what they want. She interviewed women who abandoned successful careers in science and engineering to work in fields like architecture, law and education — and not because they had faced discrimination in science.

“Creating equal opportunities for women does not mean that they’ll choose what men choose in equal numbers,” Ms. Pinker says. “The freedom to act on one’s preferences can create a more exaggerated gender split in some fields.”

I don’t think the argument will get anywhere close to settled anytime soon, and sadly I see it getting worse in the face of more empirical evidence, but I do wish people would quit saying it was all my fault.

Posted in Coding, Musings, Politics, Science.


Specific things I remember about high school, in the order they occurred to me while doing laundry

  1. The Legend of Zelda: Ocarina of Time
  2. Kjelene Martin feeling herself up with my hand in the Gig Harbor movie theater during You’ve Got Mail
  3. Acne
  4. Mrs. Shanafelt announcing to her sophomore chemistry class that she had thrown out my exam score when computing the curve, and that as a result I would be receiving a grade of 116%. Thanks for helping me keep a low profile, Mrs. S.
  5. Being told by Josh Deceuster that the secret to dancing was to move my hips, while at a dance, dancing badly.

Sometimes it seems like I remember Ocarina of Time better than most of high school.

Posted in Musings.


Everything is fucked, but it doesn’t matter that much

Compared to the all-night street party that attended Obama’s election in every liberal stronghold in the country, the left’s reaction to the Republican takeover of the House on Tuesday has been surprisingly muted. True, there was gnashing of teeth and tearing of hair from the expected pundits, as well as lengthy analyses of why the country had voted the way it had, couched in desperate, weaselly turns of phrase like “referendum” and “wave election” to avoid sounding condescending and liberal to those honest, patriotic Americans that had seen fit to restore to power the exact same group of individuals who had created most of the immediate problems the polls said voters were concerned about. But even Colbert and Stewart were eager to portray the most sensational election cycle in the nation’s history, in which the most money was spent with the least accountability and least transparency (one guess for which side), as a battle between two equally guilty, equally shrill and irrational ideologies. To quote Stewart, he and Colbert brought an NPR tote to a knife fight.

Apologies to Mr. Colbert and Mr. Stewart, but saying that Republicans want what’s worst for everyone isn’t insane partisanship; it’s called being informed. How many chances are we obligated to give Reaganomics before acknowledging that maybe it’s not working so well? Is thirty years not long enough?

I’ll do what mainstream pundits dare not and lay the blame for this flaccid outcome right at the feet of the ignorant, selfish, amnesiac public. I’m not saying their anger over the country’s direction isn’t righteous; I’m saying that they lack the temperance and knowledge of history (as recent as two years ago) to make an informed decision about what to do with it. In this case, they decided to cut off their own nose to spite their face. Their face being Democrats, I guess? Or maybe their nose is the job at the plant they lost eighteen months ago and blame Obama for? I’ll quit torturing this metaphor by eliding the rest of my rant and saying, without apology or equivocation, that Americans are stupid and we got exactly what we deserve.

Nowhere is this more obvious than in Washington State, where we had the rarefied privilege of voting on a large number of ballot initiatives, almost every one of which demonstrated the single-minded avarice and ignorance of the public. Do you accuse me of exaggeration? Let’s do a quick recap.

  • Initiative 1098, establishing a state income tax, was rejected 65% to 35%. Given that it lowered taxes for 98% of households and raised them for the 2% making more than $400K per year, this is a surprising outcome. It’s even more surprising given that the proponents far outspent the opponents. You could explain this result with fears of a slippery slope of income taxation, but personally I think it comes down to the old adage: that a poor man would rather have the chance to be rich than admit he’s poor.
  • Initiative 1100, ending the state liquor sales monopoly, was rejected 52% to 48%. If you think that a state monopoly on anything is good, what kind of conservative are you? But then, if you’re a conservative, what do you care about the income generated by liquor sales, or about the right of a person to get drunk in the first place?
  • Initiative 1107, repealing the recent sales tax on soda and candy, was approved 63% to 37%. This one’s pretty simple: we’re in the middle of a tax revolt, and Coke spent $16 million to put this on the ballot and pass it. It’s possible for reasonable men to disagree about whether governments should use tax policy to shape society; but if you’re on the other side of that disagreement, I suggest that you repay the Feds your mortgage deduction.
  • Resolution 4220, amending the state constitution to deny bail for violent offenders, passed 85% to 15%. Tough-on-crime legislation is always popular, even when it means that an innocent person can be locked up for months or years without having been found guilty. Violent crime is perceived as an eminent danger of modern life, despite the fact that it’s declining and is now less common than any time since 1970.
  • Initiative 1053, requiring a 2/3 legislative majority or voter approval for tax increases, passed 65% to 35%. This is perennial jackass Tim Eyman’s latest electoral stillbirth, likely to be struck down by the State Supreme Court, as it was when it passed in 1999, hidden in a ballot initiative about car tab fees. 12 years later, the citizens of the state still won’t acknowledge that taxes are necessary to run a massive industrial society. I saw a lot of ads about 1098 and 1053, all some variant of “We don’t trust Olympia with our tax money.” Yeah, they’d probably fill some potholes or pay a schoolteacher.

To be fair, citizens also declined to privatize worker’s compensation insurance. But on the whole, Washington residents continue to reap the benefits of their parents’ and grandparents’ investments in the Commons while feeling absolutely no responsibility to give any of that wealth back.

As for Congress: things aren’t that bad. Really. Republicans know they can’t roll back health care reforms, despite talk to the contrary, and even the most cynical part of me can’t fathom what they think they can gain by taking on the scientific establishment over global warming. What we’ll have is two years of total deadlock with mounting voter frustration, hopefully followed by a rueful admission that maybe, just maybe, the GOP doesn’t have anyone’s best interests at heart, no matter how quavering, corrupt, and ineffectual the Democrats happen to be. In the meantime, it’s not like there’s anything to fix in our society.

Posted in Politics.


Novel use of material sciences: immersion cooling

Immersion-cooled computers have been around forever. All it takes it some non-conducting liquid and a willingness to condemn your hardware to a sopping mess for the rest of its life. Problem is, until recently the non-conducting liquid in question has always been mineral oil, and it’s just not that glamorous to use.

But there are a variety of more exotic non-conducting liquids out there that make your immersion-cooled system much more interesting. 3M just developed one they’re calling Novec, an inert, colorless liquid which boils at 93F. The downside is that your system needs to be airtight to prevent the vaporized coolant from leaking, and it probably still requires a fan to dissipate the heat completely. But it sure is pretty to watch.

As the cost of these materials drops, I could see this technology moving from ulta-niche to general hobbyist, maybe with the participation of a case manufacturer like Antec. I wouldn’t mind having to top off my bubbling computer once in a while, especially not if it meant I could squeeze a 40% performance boost with the added heat dissipation. For data centers, where the cost of electicity is quickly eclipsing the cost of the hardware itself, and where every watt pumped into the building must be pumped back out by air conditioners, this technology is even more attractive. But without major support by rack-hardware vendors, it’s difficult to imagine it taking off, no matter the cost benefits.

Posted in Technology.


Zed Shaw is a parody of himself

Zed Shaw is about as close as computer programmers get to being stars without first becoming billionaires. People in my industry know who he is and respect what he does. Unfortunately, they also listen to what he has to say about things like software usability, and he’s so far off the mark it’s almost tragic.

The first thing you have to understand about Shaw is that he accomplished something that most people thought was impossible at the time — wrote a scalable web server in Ruby — and that this has made him justifiably famous among people who care about that sort of thing. The second thing you have to understand about Shaw is that he personally believes himself to be the greatest human being who has ever lived. And honestly, I can’t really blame him.

I’m not being ironic right now: he really does seem to be an incredibly intelligent and accomplished person. Speaking as another intelligent and accomplished person (not to the same degree), I’ve always secretly believed that all humility is false, that humility is actually the greatest possible conceit. It seems unreasonable to me to expect intelligent people to somehow not be aware of their own gift, or to at least feign obliviousness in polite company.

But even with that outlook, at first I thought that Shaw was a braggart. He titled his old blog “Zed’s so Fucking Awesome” (now offline). He wrote an essay about the Ruby community called “Rail is a Ghetto,” in which he posted a chat transcript where he was rude to a fellow developer, who then called him a dick (because he was kind of being a dick), as evidence of the immaturity of the community (post now offline, although mirrors can be found). He complains about the burden of his fame, while at the same time lamenting the fact that he’s not as famous as he deserves to be. He casually drops facts about how many martial arts he has studied:

These days I’m not as into working out and studying martial arts as I used to be, instead focusing on yoga, meditation, and simpler activities. When I was younger I was incredibly fit, and still am because of habits and practices I ingrained in myself from an early age.

First a quick list of martial arts I’ve studied for various periods of time: Ninjitsu, Aikido, Judo, Muay Thai, Wing Tsung, Capoeira, and Arnis in no particular order. I would say only Muay Thai is the one I studied most consistently, for probably about 6 years. The others I studied for about 1 or 2 years if I could.

The thing is, though (and it took me a while to realize this): Shaw isn’t bragging. He’s just stating the facts as he sees them, whenever he feels they are relevant to the opinion he’s trying to express. He has an incredibly high, mostly justified, opinion of himself, and he doesn’t see anything wrong with letting his audience know that. And if I’m being completely honest, the largest part of me cheers him on for having that courage.

But in his latest post, his own sense of self-worth seems to get in the way of his faculties for reason. Titled “Products For People Who Make Products For People,” it’s a passioned rebuttal of the idea that programmers shouldn’t do UI design. He reserves the lion’s share of his ire for a book I recently read by Alan Cooper called The Inmates are Running the Asylum. You can read my complete review here, but the basic thesis of the book is that user interaction design and software development are two discrete skills that should be performed by separate individuals, in that order. I’ve read a lot of criticism of this thesis, and Shaw’s is pretty representative:

… the assumption (either explicit or implied) that if you could code hard core stuff like web servers then you couldn’t make a decent product. There was even an implied offensive insult that technical competence meant you had autism. You didn’t know people and it’s only the Product People who deserve the rewards and credit for anything, not nerds.

In other words, Cooper dared to imply there was something that Zed Shaw wasn’t great at.

A lot of programmers reacted negatively to Inmates, taking it as a hit job blaming them for all the evils of bad interaction. I get that sentiment, but it misses the point. To return to Cooper’s thesis, it’s that 1) software production needs to begin with interaction design, done by professional designers, then move on to development, and 2) when this doesn’t happen, the “design” which takes place is done after the fact by engineers. In other words, Cooper is on the side of the nerds, and argues that they are being ill-served by the lack of resources dedicated to interaction design.

Shaw too takes offense at being made to take the blame, complaining that in many cases programmers are just following orders and have no real control. But he even admits, in the same section, that professional designers aren’t part of the process.

Alright, where’s your designer? In every mega-corp and government agency I’ve worked for there has never been a staff designer of any kind. If there was one he or she was barely capable and totally out of touch with modern design. How can a programmer possibly make a good visual design without any help from a professional designer?

Shaw seems to be saying, look, it’s not the engineers’ fault, we were just following orders. It’s the business’s fault because we didn’t have access to a professional designer or else they were incompetent. And that’s basically Cooper’s point. I have to wonder if Shaw even read the book. Or maybe he did, but he’s so entrenched in the business of writing software for other software developers that he cannot fathom what it’s like to be a normal human being that has to use difficult software. He doesn’t seem to understand the difference between writing a web server to be used by other engineers and writing a GUI for non-technical end users that want to accomplish a particular task. And again, that’s kind of Cooper’s point: if you’re too close to the problem of producing software, you’re literally incapable of placing yourself in the shoes of the poor schlub who will have to use it. You’ll write a brilliant but unusable mess that makes perfect sense to you and infuriates almost everyone else — but not engineers, who happen to think the way you do.

This is what Shaw thinks is meant by “usability”:

Here, take a look at Paypal and compare it to Heroku. Paypal looks like ass compared to Heroku, but back when Alan Cooper wrote his book, Paypal was the height of sexy product interfaces. Now it looks like junk compared to today’s graphic design, but today’s design is only possible because browsers got better and competitors to IE6 came out.

[When reporting an error] I also try to include the file:line location so people can hunt down exactly where the error is and possibly fix it.

So, “sexy” looking GUIs and error messaging that is only useful to software developers. To be fair, he’s talking about his experience writing a backend software product whose users are themselves software developers. And, once again, that’s Cooper’s entire point: that software developers make terrible judges of what normal people will find usable.

It seems like Shaw’s real motivation for writing this screed is that he feels slighted by “Product People,” that the software he makes doesn’t “count” to them:

… to them a web server isn’t “product”, it’s infrastructure. It’s not even a toilet, it’s the rusty pipe that feeds water to the toilet.

To a Product Person the things I make are laughable. They aren’t products because people don’t use them, only programmers. To make a good web server you just have to code. There’s no design, no usability, no human elements at all. The all superior Product(TM) has design, usability, and is used by humans. “Your web server is just used by geeks and it’s just code.”

The crux of the Product Person’s belief system is this idea that unless the product has a graphic component then it’s not a product and it has no elements of usability.

There’s a good reason software developers have long been divided into “plumbers” and “painters.” The analogy with a sewer system is apt: with backend software, like web servers or Java, the only time an end user cares it exists is when it breaks. As an author of backend software, maybe that reality makes you sad, but it’s the truth. As a plumber myself, I find users’ ignorance of my work incredibly liberating — but then, I don’t put as high a premium on recognition as Shaw seems to. I mean really: who cares whether interaction designers deem your backend code worthy of recognition? At the end of the day the business can’t run without it, no matter how intuitive and easy to use the frontend is. That’s why we make as much money as we do, despite the fact that most of us can’t design a usable product to save our lives. Cooper has real respect for the difficult task of software engineering, although you wouldn’t know it to listen to Shaw.

Maybe I’m way off base here and Shaw is actually an interaction design expert, in addition to his extensive musical ability and martial arts training. I wouldn’t be that surprised. But for the rest of us mere mortals in the trenches of software development, I think it’s downright insane to toss Inmates to the curb for the sake of pride.

Posted in Coding.


What’s in a game? Would Samus Aran in any other genre still be as sweet?

I liked Metroid: Other M, but it isn’t a Metroid game. It’s a pretty good action game starring Samus Aran.

To explain what that statement could possibly mean, I’ll have to break down what makes a game a “Metroid” game. It’s more complicated than you, or Team Ninja, might think. Upon first glance, Other M seems to have many of the functional elements of Metroid in place. These include:

  • Samus Aran in her battle armor, morphing into a ball
  • Upgrades for weapons and equipment
  • Shooting energy beams and missiles at space monsters (many from past games in the series)
  • Secret passages and other basic environmental puzzles

On the third point above, Other M really shines: I would argue that Team Ninja elevated the combat, traditionally on the easy side, to the same level of challenge and engrossment as other modern, “hardcore” action games. On the other points, Other M seems be going through the motions without any real enthusiasm or clarity of purpose. I wouldn’t be surprised if, somewhere early in development, someone wrote a variant of the above list on a whiteboard somewhere, and the developers dedicated themselves to checking off every item before shipping a game.

But Metroid, like many Nintendo properties, is more than the sum of its parts.

Imagine that someone who had never played Super Metroid was given the task of watching a speed run of the game on YouTube and taking meticulous notes to figure out what made the game such a beloved classic of the 16-bit era. Their final analysis might be a more detailed version of the above list, including such elements as:

  • Different suits for resisting heat and the effects of water
  • An ice beam that will freeze enemies in place and allow you to touch them unharmed
  • A wave beam that passes through walls
  • A speed booster that lets you run faster and break through certain barriers
  • A grappling beam that allows you to swing from special hooks

And so on, ad nauseum, until they had cataloged every functional element of the gameplay and design. They would still be missing the point. As I mentioned earlier, Team Ninja faithfully reproduced all these elements, but they still ended up with a poor Metroid game. This paint-by-numbers approach to game design is an attempt to gloss over a fundamental failure to understand what makes Metroid fun.

fuck yes

It’s exploration, idiots.

Metroid games have always featured twitch-reflex gunplay and big, over-the-top boss encounters, but it’s no more “about” this combat than oil painting is about covering the white part of the canvas with colors. You do it, sure, but it’s not an end in itself — it’s in the pursuit of an auxiliary goal. In Metroid, the space critters that get in my way aren’t there because they’re fun to kill (although they often are). They’re there to impede my progress through the vast alien wilderness I’m mapping, and my reward for becoming better at fighting them (and for collecting power ups) is that they impede me less.

Super Metroid is my favorite game, even all these many years later, because of the clarity of its design around the theme of exploration. Every other functional element of the game is subservient to this dominant theme: the penalty for dying is lost progress; the responsive and flexible movement controls encourage experimentation to get around the environment more efficiently; collecting power-ups grants access to new, unexplored regions (often through ingenious mechanisms); hidden power-ups encourage prying into every nook and cranny. All these elements reinforce one another, and all of them reward the player’s skill with new places to explore.

I should give team Ninja a little more credit — they do seem to understand the importance of exploration, but rather than designing a game around it they tried to staple it onto a quick-paced, linear action game. The net result is lots of locked hatches that the player knows they can’t get into until later, once they’ve collected an upgrade. Behind these hatches there are no new regions of the ship to explore, only a little cubby hole containing a feel-good missile expansion. Even worse, the game has an obnoxious tendency to corral the player toward their next linear goal by conveniently locking doors that aren’t on the current main path, reducing the player’s freedom whenever it becomes inconvenient to the story progression. Call it Metroid on Rails — just don’t call it a Metroid game.

I have some other gripes about Other M, but they’re minor compared to its basic design flaw. For example, Samus starts the game with all the power-ups she earned by the end of Super Metroid, but then disables all of them out of respect for her ex military commander. She re-enables them at key points in the story, as he orders her to do so. Besides being out of character (and vaguely misogynist), this tactic robs the player of the satisfaction of having discovered these upgrades on their own in some twisted, labyrinthine passage.

Maybe I’m too old; maybe today’s player needs their hand held or they quit in frustration, and any game that dares to buck this trend, offering the player an entire world to explore at their leisure, is begging for bad reviews and poor sales. But I still hold out hope for a new generation of action-exploration games, beautiful modern creations that learn from the mistakes of their ancestors but retain the respect those old games had for the player, their skill, and their curiosity. Shadow Complex was a bright, shining promise of what the genre could be, but Other M is a big step backwards. I’m waiting.

Posted in Games.


My T-Mobile bill and what’s wrong with American democracy

It’s 2010, and that means that a hip yuppie like myself doesn’t bother to open, let alone read, something as mundane as my cellular phone bill. Why would I, when I can establish automatic recurring billing from my checking account with around five clicks? They still send the paper bills, though — I haven’t opted out of them yet, because for some reason I can’t shake the feeling that paper is somehow more authentic and reliable than an electronic record (although my entire livelihood depends on this not being the case). Today I finally sifted through the drift of these bills and similar detritus on my desk, and upon reading one of them became so incensed that I felt moved to write this post. Below is an excerpt from the bill in question, on which I have helpfully outlined the object of my anger in red:

what's wrong with this picture?

Let’s leave aside, for now, the fact that T-Mobile feels justified in differentiating text-message data from all other types of data, and charging separately for it. Enough has been written about that elsewhere (although I’ll return with my own screed later). I want to concentrate on the bottom weasel-text, reproduced here for the googles of the internet, which as of this writing don’t search inside images for text.

Fee we collect and retain to help cover our costs related to funding and complying with government mandates, programs, and obligations. [Oxford comma mine]

Let’s get something straight: despite the best efforts of Ronald Reagan and his idolaters of the last 30 years, every company must comply with government mandates, programs, and obligations. I’m talking about wasteful and oppressive regulations that cripple our job-creating small businesses, such as:

  • Don’t dump carcinogens into rivers (ok, but not too much or we’ll fine you)
  • Don’t charge an interest rate above 300%, no matter how dumb your mark (or if you do, at least call it a “payday loan” and make sure they’re a poor racial minority)
  • Don’t employ children to mine coal (we know, their small hands can get more places, but people kind of hate child labor)

Every company must find a way to deal with the increased cost of doing business that regulation imposes, which may include passing the bill onto customers in one form or another. But few companies would be so gauche as to bill me a line-item for it. And it really does make my blood boil. In one asterisked footnote, T-Mobile has managed to neatly invoke 30 years of discredited free-market claptrap, that zombie ideology that just won’t die, no matter how many bullets to the head it takes. Their buck-passing reinforces this ideology’s central tenet, that government regulation of any sort is an unnecessary evil that raises prices for customers and fetters business. And of course, as with all invocations of this ideology, the potential benefits of such regulation aren’t mentioned, and certainly not in the same paragraph as the costs.

I don’t exactly envy T-Mobile and the other telcos their fate as the maintainers of expensive data lines with cutthroat operating margins, but that doesn’t excuse this kind of behavior. And in any case, their billing practices makes it hard to sympathize with them. Consider what I paid for voice, text, and data last month:

texts are expensive

So for 138.37 MB of data (internet access), I paid $30.00. That comes out to $0.22 / MB. For the voice, assuming the most generous audio codecs in existence, I paid $39.99 for 222.89 MB of voice data, a rate of $0.17 / MB. For texts, I paid $10.00 for 0.015 MB of data (98 messages at 160B each), a rate of $668.73 / MB. It should be noted that since I spend nearly every waking moment in easy reach of a broadband connection and don’t have any friends, I use far less voice and data than most smart-phone owners, so the typical rates for those two types of data would be even lower. In summary, T-Mobile has no problem charging me:

  • $0.17 / MB, if it’s a phone call
  • $0.22 / MB, if it’s a webpage
  • $658.73 / MB, if it’s a text message

Yessiree, nothing illogical or unethical about this pricing scheme, government regulators! Now go pick on the logging industry before we add some more anti-government propaganda to our next billing statement.

Posted in Politics, Technology.


Coding corner

I ran in the Beat the Bridge 8k today, and I was getting frustrated waiting for the online results to get posted. So I fired up a little script.

#!/usr/local/bin/perl

use strict;
use warnings;

while (1) {
    eval {
        system ("wget 'http://onlineraceresults.com/race/view_race.php?race_id=14261' -O race");
        my $results = system ("grep 'There are currently no results posted for this race' race");
        if ( $results ) {
            system("/usr/bin/mail -s 'Race results' xxxxxxxxxx\@tmomail.net < /home/zachmu/results") and die "can't send mail";
            exit 0;
        }
    };
    sleep 60;
}

By the way, if you know my mobile phone number, you can use the email address template above to send me text messages via email. Please don’t script this.

Anyway, the above didn’t work because of a subtle bug. See it? I didn’t, and so I didn’t get a text when the results were posted. Turns out that wget -O file won’t overwrite an existing file, so after the first one it was a no-op. Grr. Always read your man pages! This can be fixed with a little call to rm inside the loop.

Next I wanted to see how I did compared to the rest of the pack, and wanted to view a histogram of times. The online results site doesn’t support such a thing, of course, so I ginned something up:

#!/usr/local/bin/perl

use warnings;
use strict;

use Data::Dumper;

my $seenDiv = 0;
my $runner;
my $cell = 0;
my $runners = [];
my $cellProcessors = [
                     simpleFieldExtractor('link'),
                     simpleFieldExtractor('first'),
                     simpleFieldExtractor('last'),
                     simpleFieldExtractor('division'),
                     simpleFieldExtractor('place'),
                     simpleFieldExtractor('divplace'),
                     simpleFieldExtractor('genderplace'),
                     timeExtractor('guntime'),
                     timeExtractor('time'),
                     timeExtractor('pace'),
                     ];

while (<>) {
    my $line = $_;
    chomp($line);

#    print "DEBUG $line\n";

    if (!$seenDiv && $line =~ m/DIVISION:/) {
        $seenDiv = 1;
    } elsif (!$seenDiv) {
        next;
    }

    if ($line =~ m/tr class/) {
        $runner = {};
        push @$runners, $runner;
    } elsif ($line =~ m/td class.*>(.*)<\/td>/) {
        $cellProcessors->[$cell]->($runner, $1);
        $cell = ($cell + 1) % scalar @$cellProcessors;
    } elsif ($line =~ m/block-footer/) {
        last;
    } elsif ($line =~ m/<\/tr>/) {
        $cell = 0;
    }
}

my @filteredRunners = grep { defined $_->{'time:sec'} } @$runners;
$runners = \@filteredRunners;

analyze();

sub analyze {
    my @sortedByTime = sort {
        $a->{'time:hrs'} <=> $b->{'time:hrs'}
        || $a->{'time:min'} <=> $b->{'time:min'}
        || $a->{'time:sec'} <=> $b->{'time:sec'}
        || 0;
        } @$runners;

    my $bucket = 0;
    my $bucketCnt = 0;
    my $STEP = 60;
    foreach $runner ( @sortedByTime ) {
        next if (not defined $runner->{'time:sec'});

        my $totalSec = $runner->{'time:hrs'} * 3600
            + $runner->{'time:min'} * 60
            + $runner->{'time:sec'};
        if ($bucket == 0 || $totalSec > $bucket + $STEP) {
            use integer;
            my $label = "";
            $label .= $bucket / 3600;
            my $min = ($bucket % 3600) / 60;
            $min = "0$min" if ($min < 10);
            $label .= ":" . $min;
#            $label .= ":" . $bucket % 60;
            print "$label:";
            for (my $i = 0; $i < $bucketCnt / 10; $i++) {
                print "*";
            }
            print " $bucketCnt\n";
            $bucket = $totalSec - ($totalSec % $STEP);
            $bucketCnt = 1;
        } else {
            $bucketCnt++;
        }
    }
}

#print Dumper $runners;

sub simpleFieldExtractor {
    my $fieldName = shift;
    return sub {
        my ($runner, $field) = @_;
        $runner->{$fieldName} = $field;
    };
}

sub timeExtractor {
    my $fieldName = shift;
    return sub {
        my ($runner, $field) = @_;
        my ($hrs, $min, $sec) = split(/:/, $field);
        if (not defined $sec) {
            $sec = $min;
            $min = $hrs;
            $hrs = 0;
        }

        $runner->{"$fieldName:hrs"} = $hrs;
        $runner->{"$fieldName:min"} = $min;
        $runner->{"$fieldName:sec"} = $sec;
    };
}

When you feed this the race results page, it spits out the following histogram. Each asterisk represents 10 finishers with the time indicated, discarding seconds.

0:24: 2
0:25: 7
0:26:* 14
0:27:* 12
0:28:* 12
0:29:** 20
0:30:** 28
0:31:*** 38
0:32:**** 41
0:33:***** 51
0:34:******** 83
0:35:********* 90
0:36:************ 128
0:37:************* 137
0:38:****************** 180
0:39:********************* 216
0:40:********************* 210
0:41:********************** 228
0:42:************************ 243
0:43:***************************** 296
0:44:************************* 257
0:45:*********************** 238
0:46:****************** 187
0:47:********************** 221
0:48:************************ 241
0:49:******************** 209
0:50:******************* 192
0:51:*********************** 231
0:52:******************* 190
0:53:****************** 187
0:54:************ 129
0:55:*************** 151
0:56:************ 126
0:57:*********** 111
0:58:********* 98
0:59:******* 77
1:00:********* 97
1:01:****** 66
1:02:***** 55
1:03:***** 54
1:04:****** 66
1:05:*** 36
1:06:** 27
1:07:*** 32
1:08:** 27
1:09:* 17
1:10:* 18
1:11:** 26
1:12: 8
1:13: 7
1:14: 8
1:15: 8
1:16: 6
1:17: 9
1:18: 8
1:19: 7
1:20: 1
1:21: 3

So, my 37 minute time puts me well above the modal hump there. That’s what I wanted to know!

I should be able to use these same tools on other race results posted on that site, provided they don’t change their format significantly and break my screen scraping. Provide an API, you yokels! I hereby release the above software into the public domain, so if you’re of the running and coding persuasion feel free to use it!

Posted in Coding.