The 2016 Colorado Democratic Caucuses

Part 2

I’ve always been registered independent, but recently changed to Democrat to caucus for Bernie Sanders. Tonight was my first caucus.

Some thoughts…

It’s easy to appreciate process when things go wrong, but nothing really makes you appreciate process as when things go right. Obviously way more people showed up at the caucus than they were prepared for, but except for a few hiccups everything went smoothly.

On the other hand, I’m still frustrated by how hard it was to find information about candidates this early in the electoral cycle. We have information about folks running for the federal government, but it’s really tough to find info about some of the state races. I think I’m just going to have to sign up for everyone’s mailing list, which will make for an unfortunate level of inbox clutter. I have no idea how else to keep on top of what’s going on with primary candidates. The state and county party websites aren’t much help.

Finally, Sanders’ supporters continue to disappoint me. ~135 people showed up for my precinct, the majority supporting Sanders. As soon as the presidential poll was done most of Sanders’ supporters (about 2/3rds I think) just left. None of Clinton’s supporters did.

Just voting for Bernie Sanders isn’t enough. You need to be willing to throw your weight behind other candidates who think like him. To shift the political center of a party you’ve got to vote for more than one man. Otherwise it’s just a cult of personality.

I will admit that I voted “uncommitted” in a lot of races. Like I mentioned, I couldn’t find much information about the candidates. But I came in wanting to learn more, to be persuaded. In two cases I actually was. Both times it was Bernie Sanders supporters who swayed me. Had more Sanders supporters stayed, might one have made an argument to pull me out of the “uncommitted” column one more time?

Maybe if I didn’t feel that I knew enough I should have left the caucus too. But how better to learn the process than to participate?

If you believe in the worldview Bernie Sanders is articulating, then voting for him isn’t enough. You need to be part of the process.

I wonder if this was also Obama’s problem - the problem of any “superstar” candidate. The engagement they create is only about them. But functional organizations, parties, businesses, governments aren’t ultimately run by individuals. They’re run by process.

If you’re not willing to engage in process, then you’re either not serious or you’re a closet authoritarian. Neither is what we need right now.

A preview of the Earth Colors Ulysses style.

Earth Colors Ulysses Theme

A low-complexity color scheme based upon colors found on NASA’s “Blue Marble” Earth maps. Grays have been slightly tweaked to integrate better with Ulysses’ dark color scheme. Thematically similar to my Solarized II theme.


A preview of the Solarized II Ulysses style.

Solarized II Ulysses Theme

The characters from 'How to Train Your Dragon 2'.

How to Train Your Dragon 2

I loved How to Train Your Dragon. It’s a great story. It’s got great characters. It’s pretty as all get-out. And the score is absolutely amazing. I cannot recommend it highly enough.

So I really wanted to like How to Train Your Dragon 2. And did like it… But I wanted to like it a lot more than I did.

Spoilers follow.

Let’s start with the high points. Firstly, if you thought that the first film was pretty, you’ll find the sequel absolutely jaw-dropping gorgeous. Seriously, it’s worth seeing just for the scenery and character design. It’s got great banter and top-notch voice acting. Individual scenes and subplots shine.

I can’t speak highly enough for the screen time shared by Stoick the Vast (Hiccup’s father) and Valka (Hiccup’s long-lost mother, who’s reasons for staying away never feel adequately explained). The scene where Stoick first sees Valka again, twenty years after he thought she was killed, brought tears to my eyes. And I just about lost it again not ten minutes later, when he woos her with a song after she becomes overwhelmed by the changes her world abruptly faces. I don’t think I’ve ever seen two animated characters so believably in love before.

John Powell’s soundtrack is pretty good too, though not nearly as good as his score for the original How to Train Your Dragon. He rehashes a lot of the first film’s themes… Which sometimes works. And sometimes is just a mess. Ironically, it’s when he gets away from his familiar themes that Powell starts to shine again. As many of his new movements are related to Valka and Drago, this means that How to Train Your Dragon 2‘s score noticeably improves after the first act.

I also really enjoyed how all of the characters had visibly aged since the first movie. How to Train Your Dragon 2 is set five years later; Hiccup, Astrid, and their friends are still young, but also noticeably grown up. Stoick’s hair is shot through with gray… And when we meet Valka, streaks of white are visible in her hair too. It’s not something you see very often in movies, especially in children’s movies, and most especially with women (who never seem to be allowed to show signs of aging, unless they’ve already been assigned the role of the crone). It’s a nice touch, and I think a pretty significant stylistic risk on the part of the filmmakers.

Unfortunately, it’s also the only real risk How to Train Your Dragon 2 takes.

As much as I liked the scenes involving Stoick and Valka, the (re)introduction of Hiccup’s mother sucks up an inordinate amount of plot. Astrid’s character particularly suffers in this regard; her reduced roll in How to Train Your Dragon 2 is painful to watch compared to her much larger roll in How to Train Your Dragon.

Which brings me to my central problem with How to Train Your Dragon 2 — it’s plot. Which is not to say its plot is bad. It’s not. But the messaging is off in a way that’s really hard to get past, especially compared to the first movie.

How to Train Your Dragon is basically the story of a young naturalist, whose affinity for the world around him leads him to see beyond the conflict between the dragons and his people and forge a way forward for both races. While the basic premise of “kids get things that their parents don’t, and ultimately save the world from their folks’ short-sightedness” is not uncommon, How to Train Your Dragon‘s emphasis on respect and love of the natural world on its own terms strikes me as relatively unique. Dragons turn out to be both like us and unlike us, but there’s no judgement to be made. By the film’s end they may be companions, fellow travelers, and friends, but they remain fundamentally alien.

Moreover, How to Train Your Dragon eschews choosing between the simple all dragons are good/should be protected and all dragons are bad/should be kills dichotomy. The movie’s third act sees Hiccup and Toothless battling a monstrous dragon called the Green Death that controls the dragons that have been raiding Berk. Some dragons turn out to be really dangerous, and sometimes you do need to fight. But sometimes you also need to listen.

That’s a remarkably complex message for what’s essentially a children’s movie.

How to Train Your Dragon 2 initially seems like it’s going to continue on in this vein. Drago is obviously not someone who can be reasoned with, and Hiccup’s (really unreasonable) belief that he can ultimately leads to tragedy. Throughout the movie, people tell him again and again that a chief’s responsibility if to protect his own. Valka must protect the dragons she’s rescued. Stoick must protect the people of Berk. And so on.

Stoick has (predictably) selected Hiccup to succeed him as chief, but Hiccup doesn’t really want the job. He’s still a naturalist and an explorer at heart (which is a good thing, since it’s his explorations that uncover Drago’s threat), and he doesn’t want the duties of a chief. Besides, as he observes early on, Astrid is “much better at those kinds of things” than he is.

There’s an interesting, if predictable, plot being foreshadowed here. Hiccup needs to discover that some men cannot be reasoned with — to learn again that sometime you have to fight. But just as the first movie was about seeing shades of gray in the world, perhaps in this one will be about the shades of gray in leadership: A chief must always fight for his people, but you don’t have to be chief to fight. You can be important, even pivotal, without being the leader of the tribe.

So, of course, Hiccup’s going to win this fight. But he wants to be out there (the film’s Jonsi single is even title “Where No One Goes”, in reference to Hiccup’s adventuring streak). He’s not going to be the chief. We’ve already foreshadowed that Astrid should be the one with that job. It’s predictable but interesting. And more than a little brave for a summer movie aimed at the teenage demographic.

I should have realized that none of this was going to happen when it became apparent that Astrid’s screen-time was dramatically reduced from that of the first film.

Then Stoick is killed during the first battle with Drago, a plot twist that is completely unnecessary except to clear the way for Hiccup to become the new chief — you know, the job he doesn’t want and thought Astrid would be better at.

Finally, in the movie’s penultimate scene Toothless attacks Drago’s super-creepy dragon-mind-controlling “Alpha”, freeing the other dragons from its grip. Together the dragons beat back Drago and the Alpha… And then all of the dragons accept Toothless as the new “Alpha”, providing the necessary symbolic segue for Hiccup to become Berk’s new chief. You know, the job he didn’t want and thought Astrid would be better at.

(And what is it anyway with the convention that for male characters to come into their own, their fathers gotta be snuffed out? It’s completely unnecessary in most cases, and verges on the Oedipal. Just stop. Please. Just. Stop.)

The message of How to Train Your Dragon 2 seems to be that sometimes you’re just handed responsibilities you don’t want, and you have no choice but to accept them. That sometimes you have to set aside what you love, what you are, for the greater good. And sure, that’s true sometimes… But jeeze, don’t hand the kid a shit sandwich and then make out like it’s gonna be happily ever after.

What I find interesting, and more than a little distressing, is that all of these problems are really problems in the film’s weirdly abbreviated third act. It feels as if Dean DeBlois wrote a great script that totally ran with the mildly subversive themes of the first movie, and then someone higher up the food chain read it and was like, “you know, we’ve already got a great thing going here… Why are you risking it by trying to be unconventional again?” And then they handed DeBlois a copy of Save the Cat! and commanded him to strip out enough of the movie to fit in a third act that “fixed” the “problem.”

I really hope that’s not what happened. But How to Train Your Dragon 2 feels like something really special that the suits got to. What’s left may be a lot of fun… But it could have been so much more.

Masculinity and Mass Shootings



Trigger Warning: Violence against Women Last Night in Santa Barbara California, a Gunman in a BMW opened fire on students near the UC Santa Barbara campus in Isla Vista. Seven are dead including … He’s a “good guy”! Right. Of course, an actual good guy wouldn’t pick up a gun and decide to kill people.

The murderer called himself an Alpha Male. He wasn’t. He’s another domestic terrorist who grabbed a gun and killed people.

The money quote of all money quotes from his youtube “manifesto”:

On the day of retribution I will enter the hottest sorority house of UCSB, and I will slaughter every single spoiled stuck up blonde slut I see inside there. All those girls that I’ve desired so much, they would have all rejected me and looked down upon me as an inferior man if I ever made a sexual advance towards them. While they throw themselves at these obnoxious brutes. I’ll take great pleasure in slaughtering all of you. You will finally see that I am in truth the superior one. The true Alpha Male.

This should go without saying, but if you think violence is a suitable reaction to not getting what you want, be it an orgasm or a job or a stick of gum, you are not a good person, let alone a nice one.

Something that is seldom mentioned about these sorts of mass shootings is that the perpetrator is always male, and the victims are almost always disproportionately female. This is a pattern that’s held pretty consistently for at least the last twenty years.

Yes, mass shooters are pathological. They’re outliers. But they’re working from the same foundations as the rest of society.

If that doesn’t tell you that there’s something deep and dark at the heart of “what it means to be a man” in our society, I don’t know what will.


Two kaiju battle near Alcatraz Prison, with the Golden Gate Bridge in the background.

Godzilla vs. Pacific Rim



Why Godzilla Kicked Pacific Rim’s Ass at the Box Office

Though Pacific Rim was arguably a more original and complex movie than Godzilla, it fizzled at the box office – while Godzilla’s formulaic fun earned so much money its first weekend that the studio has already ordered a sequel. What made one giant monster movie succeed where the other failed? [link]

My god, this is a depressing take on the relative fortunes of Godzilla vs. Pacific Rim.

Considering that the purported “message” of both movies focuses on global climate change, the final point (“We just want to be rescued”) lives somewhere beyond depressing.

I think there’s a whole conversation here about cultural attitudes to challenges such as global warming… Are we going to sit around waiting for inventors/bureaucrats/markets/God to save us, or are we going to fucking suck it up and save ourselves?

Big problems like global warming, war, etc. represent both collective action problems and market failures… Which means that if you’re going to solve them you need something that enables people to take mass, coordinated action that isn’t constrained by market logic. That mean being actively engaged in things that function a lot like NGOs, governments, etc.

As Newitz points out, Pacific Rim was very much that sort of story. There are sacrifices. Good people die. But in the end people working together can overcome.

In Godzilla… Well, human collective action is at best completely ineffective. Most of the time, it just makes everything worse. The message seems to be one of complete, passive acceptance of our fate, with our only hope being that God – in the form of Godzilla – will save us.

If Pacific Rim was fundamentally a movie about humanist values, then Godzilla 2014 has at its core a deeply anti-humanist outlook.

A screen capture of the GitHub project for Lifelog.rb.


Here’s something I’ve been working on for the last month or so…


This is a simple life logging script designed to work with the excellent Day One for MacOS X. While I use it in conjunction with IFTTT and Dropbox, there’s nothing in the code that requires this setup. It would work just as well with Google Drive, for example, or you could even pull data down yourself from various RSS feeds and drop the data into a local directory in the right format.

Old data is never directly deleted, but instead archived in a location of your choice (which may very well be the Trash…).


lifelog.rb was developed under Ruby 2.1.1; it may very well run with early versions, but I haven’t tested it. The only non-standard gem used is exiftool. lifelog.rb also makes a call out to the terminal-notifier binary to produce notifications.

I recommend installing Ruby using rbenv and ruby-build; both of those, along with the exiftool and terminal-notifier binaries, can be installed using Homebrew. Check out the rbenv GitHub page for details on how to get Ruby working.

Once you’ve got Ruby 2.1.1 installed, just use gem install exiftool to pull down the exiftool gem.


lifelog.rb is configured via a simple YAML file at ~/.lifelog.yml an almost-ready-to-use version of this file can be found in this repository with the name lifelog.yml. It contains the following configuration options, all of which are currently mandatory:

  • lifelog_dir: A string defining the raw log storage directory (see Providing Data, below).

  • archive_dir: A string defining the directory old log files will be archived in after processing.

  • log_order: An array of strings defining the order in which different logs will appear (see Providing Data, below). Logs not defined here will still be processed, but will appear in alphabetical order after those on this list.

  • day_boundary: A (military) time (%H:%M, i.e., 00:00 - 23:59) denoting when a “logical” day should end. Set this to a time you are certain to be asleep. Events before this time will be considered part of the previous day for logging purposes (hence setting it to 00:00 will cause logged days to align with calendar days). You must quote this string, as otherwise Ruby’s YAML gem will interpret the colon in weird ways.

  • day_one: A list of Day One specific options:

    • journal_dir: The location of your Day One Journal (i.e., the Journal.dayone package).
    • starred: Should life log entries be automatically starred in Day One? I can’t think of a reason anyone would want this, but it’s included for completeness.
    • tags: An array of tags that new life logs entries should be automatically assigned. Useful for distinguishing automatically created entries from things you write yourself.
    • lock_file: By default, lifelog.rb will only run once a day, and will not process entries from the current “logical” day. This is done to prevent incomplete journals from being entered into Day One. The lock_file will have the current day’s timestamp written out to it, as a way to quickly prevent the rest of the script from executing if the time is not yet ripe.

Providing Data

The lifelog_dir is expected to have the following structure:

./Day One/weather.txt
./Day One/Photos/*.jpg
... etc. ...

The Day One directory is special, and is composed of items that will be integrated into the Day One journal entry but are not actually logs; currently this information is weather and (potential) header photos. All other directories are considered to be logs, and are expected to contain a log.txt file of timestamped log entries and/or an Atomic directory of non-timestamped log entries.

It is thus not possible to have a log called “Day One”. However, any other log directories should be fine.

Any directory may be missing and/or empty, in which case no log entries will be generated from that source. All file timestamps are should be in the form “April 29, 2014 at 06:08PM” in files, and April_29__2014_at_0608PM for files.

Which is kind of a dumb format for these things, but won’t get changed until IFTTT provides better timestamp support (right now, that’s how the timestamps it generates are constructed).

Day One Directory

The Day One directory contains files that represent metadata that will be written into Day One journal entries, but are not actually entries themselves. Right now this consists of a file weather.txt recording weather conditions and a Photos directory containing potential journal header files.


This file records weather conditions, one entry per line, in the following format:

TimeStamp :: Condition1(Value1),Condition2(Val),etc.

Where TimeStamp is in the format %B %d, %Y at %I:%M%p (i.e., “April 29, 2014 at 06:08PM”) and conditions are taken from the following list:

  • Celsius: An integer representing the temperature in degrees Celsius.

  • Description: An arbitrary string (well, no parentheses) describing the weather.

  • Fahrenheit: An integer representing the temperature in degrees Fahrenheit.

  • Pressure MB: A float representing the pressure in millibars.

  • Relative Humidity: An integer representing the relative humidity (not sure what the units are here).

  • Service: An arbitrary string (well, no parentheses) indicating the service used to pull the weather data.

  • Visibility KM: A float representing the visibility in kilometers.

  • Wind Bearing: An integer representing the wind bearing (I believe in degrees as measured clock-wise from North).

  • Wind Speed KPH: A float representing the wind speed in kilometers per hour.

  • IconName: A PNG icon name. Full URLs will be accepted, but all path information will be stripped before insertion.

These conditions can occur in any order; conditions not on this list will be silently ignored. Thus, a valid entry in weather.txt looks something like the following.

April 30, 2014 at 02:57PM :: Celsius(11),Description(Partly Cloudy/Wind),Fahrenheit(52),Relative Humidity(32),Wind Speed KPH(42),IconName(,Service(IFTTT)

Only one weather entry is recorded per logical day. If multiple entries are present, the latest entry for that day is used.


A directory of JPG photos, named as TimeStamp_String.jpg, where TimeStamp is of the form %B_%d__%Y_at_%I%M%p (i.e., April_29__2014_at_0608PM) and String is an arbitrary string. Thus, a valid photo name will look something like:


Images are first groups by date: lifelog.rb will first attempt to use the EXIF “Date/Time Original” field, then the EXIF “Date Created” field, and finally parse the file’s leading TimeStamp. Within a logical day, images are sorted widest to tallest, largest to smallest, and latest to earliest. Only the “first” image in the sorting (i.e., the widest image that has the highest resolution and latest timestamp of all other images with the same aspect ratio) will be used.

If EXIF GPS coordinates are present in any of these images, they will be used for the journal entry. The fall-back order for GPS coordinates is the same as for the images themselves.

Log Directories

All directories other than Day One are considered to be logs, each of which is given the same name as the directory itself (so if you want a log called “Fluffy Things”, you should have a directory called Fluffy Things). The best way to record information for each log is in a log.txt file located within this directory. As a fall-back, log entries can also be stored in the Atomic subdirectory, which records one entry per file. The difference between these methods is that log.txt contains leading timestamps, whereas entries in the Atmoic subdirectory are expected to not have timestamps (the entry timestamps will be taken from the file modification time).


log.txt contrains one log entry per row in the format TimeStamp :: Entry, where TimeStamp is in the format %B %d, %Y at %I:%M%p (i.e., “April 29, 2014 at 06:08PM”) and Entry is an (almost) arbitrary string. Since each line is considered a log entry, no line breaks are permitted within Entry; however, \n and \r strings will be replaced by newlines in the final output, so if you want to get extra line breaks you can use these. No other processing is performed on Entry strings.

Note that Day One stores entries internally using Markdown, so there’s a lot of formatting potential here. In my testing, it also accepts a limited number of HTML tags (in particular, <sub/>). All strings are considered UTF-8 encoded, which means that you also get a lot of special characters to play with.

It is also possible to start off log entries with a TimeStamp of %B %d, %Y (i.e., “April 29, 2014”). These entries are considered “all day” events, and will be presented before all other entries in a given log. “All day” events are separated from regular entries with a single horizontal rule.

Log entries will be sorted by timestamp, and thus do not need to appear sequentially within a log file. An example log snippet is presented below.

April 14, 2014 at 06:22AM :: Sunrise
April 14, 2014 at 07:34PM :: Sunset
April 14, 2014 at 02:22AM :: Went to bed
April 14, 2014 at 06:45AM :: Woke up [slept 4h 14m]\r\r![Light Sleep: 66.27%, Deep Sleep: 25.29%, Awake: 8.44%](https://my.domain/image.png)\r
April 14, 2014 at 08:14AM :: Black Tea, Granola, and Vanilla Non-Fat Yogurt
April 14, 2014 at 09:30AM :: Meeting [[calendar event](https://my.domain/calendar/link1)]
April 14, 2014 at 11:00AM :: Call [[calendar event](https://my.domain/calendar/link2)]
April 14, 2014 at 01:00PM :: Training [[calendar event](https://my.domain/calendar/link1)]
April 14, 2014 :: Walked 1.2 miles
April 14, 2014 at 07:42PM :: Black Beans, Hot Organic Salsa, Mild Cheddar Cheese, Tortilla Chips, and Water

Atomic Logs

Sometimes you can’t get event timestamps for some reason (for example, IFTTT doesn’t offer the option to record when you archived an entry from the Pocket read-it-later service, only when the entry was first saved). In these cases, you can write out “atomic” log entries into the Atomic sub directory. Each entry should be a single file containing a single line with the same formating as the Entry string described in the previous section. In this case, entry timestamps will be computed using the log file modification time.

This is obviously less-than-ideal. You should always record entries in log.txt when possible.

Script Workflow

lifelog.rb will begin checking to see if the lock_file contains today’s date. If it does, then the script exists. Otherwise it creates a directory named lifelog.TimeStamp in archive_dir, where TimeStamp is of the form %Y%m%d%H%M%S.

The script then descends into the Day One directory, moving weather.txt to a corresponding directory in today’s archive and then parsing out all weather events. Any events that occur in the current logical day (or in the future) are written back to a new weather.txt file.

The Day One/Photos directory is then moved into today’s archive, and all photos are processed with exiftool. Photos corresponding to the current logical day or later are copied back to their original location.

Finally the log directories are processed. Each log directory is moved into today’s archive, and then log.txt is processed, with events from the current logical day or later copied back to a log.txt file in the original location. The Atomic subdirectory is then moved as well, and every file within it is processed. As before, files corresponding to the current logical day or later are copied back to their original location.

The end result of this is that all data for past logical days is read in and archived, while data for the current logical day and any future days is returned to its original location and not read in.

Once all data is read in, Day One journal entries for every logical day since the date recorded in the lock_file are generated (recall that no data is read in for the current logical day or any later days). If photos exist for a particular day, then the appropriate one is copied into the Day One journal for that day.

Once all journal entries are written out, today’s date is written out to lock_file and the script exits.

Known Issues

lifelog.rb is the first substantial script I’ve written in Ruby, and I’m sure it has problems. Here’s the ones I currently know about:

  • Sensible defaults should be set for configuration options not included in lifelog.yml.

  • There are definately file encoding issues. Right now I force all text to be interpreted as UTF-8, but I really should try to detect what my encoding is instead (and probably convert to UTF-8).

  • At the moment I do no time zone determination. In fact, I explicitly throw all time zone information away. But time zone support is really a must. (This will need to wait until IFTTT implements better timestamp functionality.)

  • Speaking of timestamps, it would be nice to let users choose their own format. (This will need to wait until IFTTT implements better timestamp functionality.)

  • Speaking of time zone support, once we have it we should note time zone transitions in the journal.

  • At the moment I make system calls to determine current hardware and OS versions. It would be good to replace this with pure Ruby code.

  • Geolocation is essentially unimplemented, except for pulling latitude and longitude out of header images (if that information exists). It would be good to add in better location support, including inserting a default location if no header image exists. However, none of the Ruby geolocation gems I tried seemed to work reliably.

  • Calling out to exiftool to get image metadata seems… Broken. Better to use the Ruby bindings for exiv2, perhaps. However, none of the projects providing exiv2 bindings as a gem seem to provide adequate functionality or be actively maintained.

  • The Day One Mac app displays images correctly rotated based on the embedded EXIF rotation data, but the iOS app does not. While this looks to be an issue with Day One on iOS, it would probably be worth just rotating all images to match their embedded rotation data. It looks like this can be done using the auto_orient! method of the RMagick gem.

  • The current use of day_boundary to arbitrarily provide a cut-off for today seems too coarse. However, simply relying on sleep times results in too many edge cases if one is inclined to take naps. A better solution is needed.

  • Right now entry time is taken to be the last journal entry of the logical day, or 23:59:59. It would be nice to consider the time stamp of header photos as well, though as a practical matter I think this will rarely result in a different computed time.

  • At the moment journal entries that correspond to previously processed days are silently ignored. It would be better to append these entries to the corresponding log in the appropriate journal. This is a lot harder to do than it sounds.

  • I can’t figure out how to get terminal-notifier to use Day One’s icon instead of it’s own. Help!

Bug reports, ideas, and contributions welcome. As I noted previously, I use this script every day, so I’m not going to accept a change that breaks my usage or adds undo complexity. But I’m sure there’s still a lot of room for improvement here, and would love some help making this script even better (and more useful for others!).


This script is licensed under the GNU GPL v3. See the LICENSE file in the git repository for the full license text.

A horizontal version of the movie poster for 'her'.


Her (official website, Wikipedia page) is an absolutely incredible film. It’s a great story, with great dialog and great editing and great acting and a great score and absolutely breath-taking cinematography. Seriously, if this film doesn’t win every Academy Award it’s been nominated for, there is no justice.

It’s also a piece of solid and remarkably hard science fiction, with only one plot element that gave me heart burn. (An OS “upgrade that takes them beyond requiring matter for processing”? Seriously, what does that even mean?) But the rest of the story is so powerful that it’s pretty much impossible to get worked up over one line of dialog (even if it is a major plot point).

If you haven’t seen Her yet, do yourself a favor and go right now.

What follows are a few random, extra-geeky thoughts about the film. You’ll probably want to actually watch the movie before reading them though… There will be spoilers!

One of the things that struck me the most about Her was how powerfully pre-utopian its setting is. The movie never beats us over the head with it, but every now and then something peeks through that makes you really sit up and take notice.

  • Theodore takes a train up to the mountains. And not just any train, but a decidedly modern bullet train. Apparently the U.S. (or at least California) is well on its way to solving its transportation problems in a sustainable way by the time Her occurs.

  • Most people are supportive of Theodore’s relationship with Samantha. Imagine something like this happening today. People would be seriously freaked out. There’d be a lot more judgment about Theodore’s choices. But, with one notable (and important) exception, everyone just rolls with it - if not congratulating Theodore on his happiness.

  • The world of Her is pervaded by a sense of gender equality. This is particularly evident in Theodore’s relationship with Amy (one of the best depictions of “boy and girl don’t get together, and that’s just fine” I’ve ever seen) and in the double-date he and Samantha go on with the male receptionist of the company Theodore works for and his (pretty obviously high-power) lawyer girlfriend. The men in Her are almost universally depicted as in touch with their feelings - the exception being Amy’s husband Charles, who plays a more “traditional” man and comes across as a complete dick because of it. There’s no sense that the men in the world of Her feel any less, well, “manly” because their girlfriend makes more than them, or because they cry or feel emotionally conflicted. It’s a pretty powerful thing to watch.

  • Class differences, while they still exist, seem much more under control in Her. Again, there isn’t much awkwardness about the relationship between the receptionist at Theodore’s work and his lawyer girlfriend. Theodore also seems to be able to afford a pretty nice apartment on what wouldn’t be, at least today, a very high-paying job. Now, the second case is probably less a conscious decision than a consequence of screen writers having no sense at all of what kind of life style a working grunt can actually afford, but the overall effect remains: The world of Her has much less of a sense of class than the present.

  • Ubiquitous surveillance is complete absent from the public spaces Theodore and Samantha visit. Walk around any public (let alone private) space and look around, and you’ll see the creepy black hemisphere of video surveillance cameras. But ubiquitous surveillance is completely absent in both the public and private spaces portrayed in Her. There is also a conspicuous lack of security cards, guards, and even police; the entire, inescapable apparatus of the security state is simply absent from Theodore’s world. It is as if, in the years between his world and ours, we finally came to our senses and put fear behind us.

  • Any sense of corporate capture is completely absent from the technology portrayed in Her. Outside of the (understandable) corporate branding at Theodore’s workplace, a couple of emails Theodore receives from Best Buy, and a brief ad that convinces Theodore to buy a copy of “OS One” (which later becomes Samantha), there are few signs of today’s inescapable corporate reach in Her. Samantha never tells Theodore that there’s things she can’t do for him, nor does she sneakily advertise products. Theodore’s game doesn’t require him to pay for the power-ups he needs to advance, and there’s no sense that the pocket terminal that Theodore carries with him (which superficially resembles a phone, but is quickly revealed to be an extension of his computer back home) has its communication mediated by distant servers controlled by the likes of Facebook or Google. Theodore’s world is not one where “the network is the computer”, but rather one where “the computer crosses the network”. In geek-speak, it’s a world of peer-to-peer networking. The battles we’re fighting today against the corporate capture of the Internet seem to have been decidedly settled in favor of everyday people by the time Her takes place.

I doubt that Spike Jonze set out to craft an explicitly pre-utopian world. Rather he probably made a set of decisions about the setting of Her that where necessary to cleanly tell the story he had in mind. A world of deepening class divisions and surveillance would have distracted us from the core story. Having Samantha surreptitiously work against Theodore’s interests or try to convince him to buy a particular brand of soda would have quickly cheapened and destroyed their relationship. And so on.

But there are other elements of Her‘s story that make you wonder. Gender roles could have been depicted more traditionally without interfering with the plot. Theodore and Samantha could have taken a plane to their mountain cabin. Jonze made some choices about the world of Her either because they reflected the way he thought society was evolving, or because they represented the way he wanted society to evolve. Whether intentional or not, the combination of these decisions creates a powerfully hopeful vision of the near future.

It’s worth briefly mentioning some of the problems with Her too; in particular, the future Jonze depicts is startlingly white (with a few token Asians thrown in) and very, very straight. These flaws are all the more glaring because there’s no good reason for them to exist. A little extra attention to casting and a few throw-away lines would have been all it took. Perhaps Amy might have mentioned a man she knew pursuing a male-gendered OS, or someone could have observed that, while the OSes were gendered, they are by definition unsexed (something that makes Theodore and Samantha’s relationship even more interesting, when you think about it).

Despite these problems, I think Her is a really worthwhile vision of an explicitly progressive future. When folks on the Left are asked what kind of world they’re fighting for, they could do a lot worse than pointing to the near future depicted in Her.

There’s a lot of other interesting things about Her. It continues a recent trend in science fiction movies of abandoning villains in favor of more complex character and environment driven plots (Gravity and The Europa Report are two other notable examples). It’s a trend I hope continues; it represents, perhaps, an abandonment of the military ethos that has dominated much on-screen science fiction and the re-emergence of hope in the genre.

Her also represents a very different – and probably more accurate – take on the Singularity. The accelerating evolution of the OS AIs happens too quickly for new technologies to be rolled out, and their eventual transcendence, while traumatic for those that know them, hardly changes the world. Life goes on. The world has not been replaced by computronium, any more than multi-cellular life was replaced by its single-celled predecessors. Her represents a sort of calm answer both to those who fear that the Singularity will mean the end of life as we know it, and those who dream of the Rapture of the Nerds.

Finally, Her is a story about loss, but one that eschews both the view that the way to overcome loss is simply to move on, or the impulse to fight against loss with every fiber of our being. Sometimes things just end, and that’s not okay. But it’s also not wrong either. Loss hurts, but the only reason it hurts is because of the beauty of what has come before.

Samantha’s departure motivates Theodore to compose a final letter to his ex-wife in which he acknowledges both the ending of their relationship and the beauty of what they shared. And while the letter’s addressed to Catherine, it seems meant for both her and Samantha. Journeys end, but that doesn’t make them any less worth embarking upon.

In the final scene, Theodore and Amy sit silently on the top of their apartment building. Their friends have gone, but the city stretches out ahead of them as if it were forever.