Ich Bin Ein Obama Fan

Another beautiful speech from Obama, this one in Berlin:

One line in particular struck a real chord with me:

I come to Berlin as so many of my countrymen have come before. Tonight, I speak to you not as a candidate for President, but as a citizen – a proud citizen of the United States, and a fellow citizen of the world.

This is the exact opposite of everything that our government has stood for in the past eight years, and a complete rejection of the kind of American exceptionalism, insularity, and neo-imperialism that Bush has embraced since he decided he was the decider. It’s a promise to engage with the rest of humanity, rather than bully it into submission.

The right wing has produced its usual stream of daft bullshit in response — everything from complaints about the poster his campaign came up with for the event (OMG it’s got a picture of Obama in profile … just like Hitler!) to his unpatriotic inclusiveness (he said non-Americans also died on 9/11! why does he hate the troops?) to the fact that he gave the speech at all when he should be back home, eating at the Sausage Haus and lying about shit. But all of that is just the reflexive gnarling of a dumb, frightened animal. It’s ignorable, I think1.

What bugs me more is the assertion, from some quarters, that the speech was too light on substance. That’s also bullshit, but it’s a meme that might have legs. Look: it’s true that there aren’t any concrete policy proposals here, but specificity isn’t the point of a speech like this: you don’t go to a different country, as a presidential candidate, and get into details. That stuff comes later. It’s much more important — especially now — to set the tone. What he needs to do, first, is reassure the rest of the world that we can produce politicians who are both charismatic and sane; and, second, that he sees America not as a giant imperialist child swinging reflexively at everything that frightens it, but as a global citizen. As a part of the world’s community.

This doesn’t make him weak, ok? It makes him strong, in all the ways that matter. Him, and us.


  1. And hope. 

I Don’t Know Why This Makes Me Feel The Way It Makes Me Feel

From VALIS:

Save me, protect me, God, in this day of wrath.

Writing Characters

So it took me about twenty years to figure out something pretty fundamental about writing characters. I just finished a story about this kid, his father (who thinks he’s a god) and his mother (a depressed alcoholic). When I first started writing it, the story focused almost exclusively on the boy and his dad; the mother was just a sideshow, a sort of shrill mommy dearest who popped in every so often to inject some arbitrary malevolence.

But she evolved as the story did, so that, by the end, she became — in my mind, at least — a fully-formed, three dimensional person. Still an alcoholic, still criminally neglectful of her son, still shrill — but a real person who arrived at her plight for real reasons. A tragic figure.

Unfortunately, she didn’t quite make the transition on the page. The woman in the story that I turned in a couple of weeks ago is several steps above the cardboard harridan she started out as, but she’s still not much to look at. Still pointlessly vindictive, I think, and still prone to acts whose meanness is either odd or just outright inexplicable.

I didn’t give her a fair shake, and I feel terrible about it. Not because I’ve written something badly. Jobs knows, if I self-flagellated every time I committed that particular sin I’d be a mass of quivering scar tissue by now. I feel terrible because I didn’t give her the respect she deserves. Because I think you have a responsibility to the people you create: you don’t have to go easy on them, or make them sympathetic, or even like them, particularly. But you have to respect them. You have to give them their due, and let them grow into people, and invest the time and effort necessary to communicate who they are.

What’s worse is that I wasn’t just being lazy. There was a part of me that thought the plot would be better served if I left her just a tad undeveloped — if I made her do stuff that she plainly would not. I was wrong about that too. Because character is plot, of course, or at least its most atomic element. If you tinker with that — if you’re at all dishonest with your basic materials — then you warp the whole thing.

I mean, yes, the story may not fall out the way you want if you just let the characters be who they are. But then again, it wasn’t supposed to.

John Hearts George

Behold, again, the horror:

I remember being shocked and nauseated when I first saw this, but it’s taken on a whole new resonance in the past few months, as McCain has steadily jettisoned everything that made him worthwhile and honorable as a candidate, in order to embrace the Bush Way, in all its jingoistic, pitiless incoherence. I still believe he’s better, and smarter, than the things he’s saying — but that just makes his myriad capitulations worse.

I was a big McCain guy back in 2000, so I was crushed when this picture started making the rounds. But these days it looks about right.

In Defense of Quick and Dirty

Came across this post in the Opera developer blog, on why you should never use browser detection in your javascript to work around browser bugs:

The TinyMCE/Opera 9.5 compatibility problem is a textbook example of why browser sniffing should be avoided at all costs. While it may seem like a quick and simple shortcut to work around a bug in the short term, browser sniffing creates a maintenance nightmare further down the road …

Also, whether you develop your own site or write script libraries that will run on thousands of other websites, the chances are that mistakes you make today will stay on the web for years to come, preventing users from upgrading to newer and better browsers because sites they want to use break.

I have to admit, I’ve often been tempted to use browser detection — and, worse, occasionally succumbed to that temptation. Wrestling with the deficiencies of certain browsers (*cough* IE *cough*) is such a horrible, dispiriting experience that eventually you’ll do pretty much anything to make the pain stop. And if relief is just one if (navigator.userAgent.indexOf()) away, then by golly why not do it?

Well, the Opera dudes make a very good case for why not. It seems to me there are basically four things you need to worry about when you’re writing code:

  1. Does it work?
  2. Will it work tomorrow?
  3. Is it reasonably easy to understand, and maintain?
  4. Is it fast enough?

Everything else is a distraction. The TinyMCE fix that the article describes fails test (2), and the alternative solution they propose seems to satisfy all four. So worth doing.

In this case, quick and dirty was a bad idea. But I don’t think it’s always a bad idea. Case in point: CSS layouts. There’s a certain area of dogma in the design community that maintains that all layouts should be handled exclusively by CSS positioning, and never with tables. Tables are for displaying data. CSS is for layouts.

Which makes sense. Tables were certainly not intended to be used for formatting, and you’re sort of committing the cardinal sin of mixing model and presentation if you use them that way — so there’s theoretically very little to disagree with here. But the picture gets murkier when when you descend from the lofty realms of theory into the muck of actual implementation, at which point you run into the raging shitstorm that is CSS.

This isn’t intended to be an anti-CSS diatribe, but any non-gurus who’ve attempted to format their stuff with CSS know what I’m talking about. As soon as you try to do anything even mildly complicated — where by “complicated” I mean more ambitious than changing your background color — you’re suddenly in a scary realm of floats and bounding boxes and content edges and border edges and padding edges and margin edges. I’m not even talking about shitty browser support here — although Jobs know that stuff certainly doesn’t help — I’m just talking about the basic “language”, whose designers appear to have made a calculated decision to sacrifice usability for flexibility. It does seem possible to do pretty much anything in CSS, but the penalty you pay is that everything you do is hard. Which is to say: you have to understand everything if you want to do anything.

I’m certainly no CSS expert, and I’m sure there are several arguments floating around in the vast universe of my ignorance to refute most of the sputtering, incoherent calumny I hurl daily in CSS’s direction. But I honestly don’t think my central point is especially controversial: CSS is really hard to use, and — once there’s a lot of it — really hard to maintain, and it imposes a fund of complexity on your stuff that you shouldn’t have to pay for doing simple things.

Like, for example, laying stuff out in configurations that are more or less … tabular. If you have a layout that doesn’t need to be especially flexible, and really looks a lot like a table, then I’d say make it a table. Tables are easy to understand, easy to write, reasonably fast, and they will always work, in every browser you can think of. Quick and dirty is usually bad. But not always bad.

A Few Words for the Whippersnappers

Back when I was a young pup, before the world decided that it needed “mice” and “keyboards” and “editors” and “compilers”, we programmed by burning tiny holes in ribbons of paper tape with magnifying glasses, and then feeding them into Mastodon, our 80-ton Difference Engine. Mastodon was installed on a small island in the South Pacific — which, sadly, sunk under its weight long ago. But that was a real machine! It used to take us three really sunny afternoons and about twelve reams of calculator paper to write a Hello World program, but it was worth it. It felt like we really doing something. We cherished our hello worlds back then. We’d feed them into Mastodon’s input receptacle — and then, about two days later, it would shriek and shake and belch a giant black cloud of smog and spit out a response tape with the words “Hello Wor” on it (there wasn’t quite enough memory for the whole thing). It was quite a thrill. We’d put on an 8-track and crack open a couple of Tabs and set up tables in Mastodon’s giant shadow and have a little party. Those were the days.

I understand that a lot of you whippersnappers have two and maybe three “monitors” on your desk these days. Pansies, all of you. First of all, a “monitor” is nothing more than a hopped up piece of illuminated, color tape. And not very good tape, at that. When you children “scroll” in your “browsers”, what happens to all that text after it disappears off the top of your “windows”? It’s gone, isn’t it? Well, we didn’t have that problem with tape. Tape doesn’t go away. I still have the output of my first Hello Wor program, somewhere among the 54 metric tons of tape I store in my basement. I have the output of every program I ever wrote, in fact. Where’s the first Hello World you ever wrote, child? Oh, you don’t have it? Oh, it fizzled into the ether after you turned off your “monitor”? Isn’t that a shame.

And that reminds me: ASCII. I’ve never seen such a wasteful standard. Back in my day, we didn’t have your giant, sprawling “bytes”. We didn’t need 8 bits, ok? We made do with what we called “mincing rabbit nibbles”, which had two bits, and two was all we needed to represent our alphabet — which, last time I checked, was the same alphabet that you greedy little bit suckers are using. Sure, we had to eliminate all the vowels, and all punctuation, and, yes, every one of our bits had to represent 6 possible letters, but they represented them proudly! They weren’t ashamed, and neither were we.

And another thing: bits. Whenever I hear one of you higher-language infants sneering dismissively about “ones” and “zeroes”, it makes my blood boil. Because, for one thing, if all you have to do to add two numbers is write “number + number”, then you’re not really programming, are you? You’re just banging on your toy language’s giant color buttons, squealing in delight when the right numbers come out. Well, you may get the same answers we did, and you may get them several orders of magnitude faster, with 3000% less code, predictably, without having to rewire any circuit boards — but you’re not programming. Try building an air traffic control system with nothing but holes burned into a world spanning piece of calculator tape. Then we can talk.

Also, I understand that your newfangled, 21st-century bits have two states. Back in my day, we didn’t need two, ok? Wasteful! All we had was zeroes. Sure, it wasn’t easy programming when you had no way of registering (or generating) state — and, sure, arithmetic operations were more exercises in probabilistic reasoning than “calculation”. But we managed! I’d like to see any of you wet-behind-the-ears adolescents writing one of your “E-MAIL” programs with just zeroes! Good luck with that. And, when the world runs out of ones, don’t come crying to us, ok? It’s not like we didn’t warn you.

Where the Hell is Matt?

I defy you to get to the end of this video without a giant, ear-to-ear grin plastered on your face. It’s pure, distilled happiness:


Where the Hell is Matt? (2008) from Matthew Harding on Vimeo.

(via Nani)

Jimmy’s Roadside Cafe

My story, Jimmy’s Roadside Cafe, just went up on Strange Horizons!

Jar-Jar Binks Makes the Ewoks Look Like Fucking Shaft

A cautionary video about fantasy dogmatism:

I have to say, though — I’m with Tim.

(via Greg)

Yoo Morality

Shorter John Yoo testimony:

Conyers: Is the president allowed to bury people alive?

Yoo: Evade hem haw evade bullshit evade.

Conyers: IS THE PRESIDENT ALLOWED TO BURY PEOPLE ALIVE?

Yoo: He probably wouldn’t want to do that anyway!