The Movies of 2010

I’ve mentioned in the past that I like to watch movies. I watch a lot of movies at home (on DVD/Blu-Ray, TV, Netflix streaming, Amazon Video on Demand, Hulu, etc.), but the home experience just can’t match seeing a movie on the big screen. Fortunately, I live in Austin, TX, which is the home of the Alamo Drafthouse cinemas, some significant film festivals (including SxSW, Fantastic Fest, and Austin Film Festival), and a decent arthouse theater. This means that I have plenty of opportunities to see a wide variety of movies, and I take advantage of them. Last year, I saw a little over 100 movies in theaters. Back in 2007, I saw nearly 130. But this year, a combination of factors made the number a bit higher. I expanded the range of theaters I attended on a regular basis, I was a badge holder at Fantastic Fest for the first time (and took full advantage of that), and I started watching less TV. But all that together still doesn’t quite account for my final in-theater movie count for the year. I really don’t know how, and I’m kind of embarrassed to admit it, but I attended 512 theater showings in 2010.

Some basic statistics about the movies that I saw this year:

  • I saw 254 different movies during or before what I consider to be their initial theatrical run. I wrote up my thoughts on nearly all of them at http://www.witamis.com/.
  • An additional 43 showings were repeats of those first-run movies.
  • An additional 3 showings were repeats of first-run movies I first saw in 2009.
  • I saw 97 additional movies that were not in their first theatrical run but that I had never seen before.
  • I saw 39 different movies at Fantastic Fest, which is the most a non-press attendee was able to attend.
  • I saw 26 different movies at Austin Film Festival, which I believe to be the most an attendee was able to attend.
  • 98 of the showings (nearly 1 in 5) included someone directly involved with that movie (e.g., an actor, writer, director, producer, or other crew member) in attendance.
  • I attended 20 other showings with some other notable guest who wasn’t directly involved in making the movie but added significantly to the experience.
  • I attended 20 Master Pancake presentations (a showing in which the movie was mocked by comedians in the style of Mystery Science Theater 3000).
  • I attended 22 quote-along presentations, in which the audience is encouraged to recite key lines from the movie at the same time it’s said on screen.
  • I attended 39 Terror Tuesday showings and 20 Weird Wednesday showings.
  • I attended 2 Alamo Drafthouse Rolling Roadshow presentations, in which a classic movie was shown in a symbolic location.
  • 61 of the movies I saw were primarily in a language other than English.

My Favorite Movie of the Year

This one is easy: Scott Pilgrim vs. the World. This is the only movie that I’ve ever seen twice in the theater on the same day, and it’s the only movie I’ve seen in the theater seven times during its initial run. The first time I saw the movie was a special presentation with writer/director Edgar Wright, co-writer Michael Bacall, and cast members Michael Cera, Mary Elizabeth Winstead, Anna Kendrick, Brandon Routh, and Jason Schwartzman, and that was my favorite single showing and favorite Q&A of the year. I got the Blu-Ray/DVD set on the day it was released and have seen it many times, including all four commentaries, and most of the other extra features. I bought the soundtrack and have listened to it many times. I bought and read all six graphic novels on which it was based, and it may be somewhat sacrilegious to say but I actually think that the movie is better than the comic (despite a line in the movie which states otherwise).

I was extremely excited about this movie before it came out, and my expectations were greatly exceeded when I saw it. The more times I see it, the more I’m impressed by the tiny details that the vast majority of people will miss. It has a truly unique visual style that’s impossible to adequately describe without actually seeing it. It’s an absolute travesty that it didn’t even make back its budget, but for some reason people just didn’t go to see it. Hopefully it will make a ton of money from people buying it on DVD and/or Blu-Ray.

The Overall Best Movie of the Year

This one is also easy: Bedevilled. I saw it at Fantastic Fest and was blown away. I love Korean vengeance movies, and this is one of the best. It’s the first effort from director Jang Cheol-so (who was in attendance to introduce the movie and provide a Q&A afterward), and I can’t wait to see what else he has in store in the future.

Although neither The Man From Nowhere nor Kidnapped were quite as good as Bedevilled, they were both better than any other new movie I saw in 2010. Incidentally, I also saw both of them at Fantastic Fest.

The Best Mainstream Movies of the Year

Unfortunately, many of the movies that I consider among the best of the year were ones that only played at arthouse cinemas (and were therefore available only to people fortunate enough to live in a city with such a theater) or film festivals (and were therefore only available to an even smaller population). However, there were still a number of very good movies that I consider to be more “mainstream” and widely available. In my opinion, the following are the ten best movies that grossed at least 10 million dollars at the US box office and that I first had the opportunity to see this year:

There are a couple of honorable mentions that would have been on this list if they hadn’t fallen just short of the $10M cutoff. They include 127 Hours (which made $9.86M) and Get Low (which made $9.11M). And if The King’s Speech had been released a little earlier it might have also crossed the threshold before the end of the year. But I am both shocked and happy that The Girl with the Dragon Tattoo did make the cut with just over $10M in the US (and another $100M worldwide) despite a runtime over 2 and a half hours and being entirely in Swedish with English subtitles. Incidentally, it is available for streaming on Netflix, along with its sequel The Girl Who Played with Fire, and the third movie of the triology The Girl Who Kicked the Hornet’s Nest should be available for streaming by the end of January 2011.

Other Movies Worth Mentioning

All of the following movies made far less than they should have and/or weren’t as widely available as they deserved to be, but are still worth checking out if you get the chance. Many of them are already available on DVD and/or Blu-Ray, and a couple of them (Mother and The Good, the Bad, the Weird) are available for streaming on Netflix.

UnboundID LDAP SDK for Java 2.0.0

We have just released the 2.0.0 version of the UnboundID LDAP SDK for Java. It is available for download on the UnboundID LDAP SDK product page or on the SourceForge project page.

This is a major new release that includes significant new functionality, including:

  • A persistence API that makes it easy to interact with entries in an LDAP directory as Java objects. Annotations are used to establish mappings between LDAP attributes and content in Java objects, and the data is stored in a format that makes it easily accessible by other APIs as well. Tools are provided to help you generate source code from existing schema, or generate LDAP schema from annotated source.

  • A listener API that makes it easy to develop applications that can listen for communication from LDAP clients (i.e., applications which act as an LDAP server). A new tool is provided which makes use of this API to act as a simple LDAP proxy that can intercept and decode LDAP communication as it passes between an LDAP client and server.

  • New types of command-line arguments, including Boolean value arguments, duration arguments, and search scope arguments. The file argument type has also been updated to allow you to specify a base directory for relative paths so that non-absolute paths will be relative to a specified location.

There are also a few other minor enhancements and bug fixes.

The Movies of Fantastic Fest 2010

Aside from writing code, one of my favorite pastimes is watching movies, and that’s something that I do quite a lot. So far this year, I’ve seen just under 350 movies in a theater, and I have no idea how many I’ve seen on TV, DVD/Blu-Ray, Netflix, Amazon, Hulu, or some other format.

From September 23-30, I attended Fantastic Fest, a film festival sponsored by the Alamo Drafthouse and Ain’t It Cool News that focuses primarily on horror, thriller, and sci-fi movies. During this eight-day period, I saw a total of 39 different movies (five movies per day for the first week, and then four on the last day). They were all movies I had never seen before, and with the exception of the 1960 version of The Housemaid (which I wanted to see before watching the 2010 remake) they were all new movies that haven’t had any kind of wide release (and in many cases, they won’t ever get one).

Below, you will find a list of all the new movies that I saw during this festival, in order of what I consider to be most enjoyable to least enjoyable. Each is linked to a very short write-up in which I provide a description about the movie and what I thought about it.

  1. Bedevilled (10/10)
  2. The Man From Nowhere (9/10)
  3. Kidnapped (9/10)
  4. A Somewhat Gentle Man (9/10)
  5. Undocumented (9/10)
  6. Drones (9/10)
  7. Golden Slumber (8/10)
  8. Bunraku (8/10)
  9. Richard Garriott: Man On a Mission (8/10)
  10. Nevermore (8/10)
  11. Julia’s Eyes (8/10)
  12. The Housemaid (8/10)
  13. Mother’s Day (8/10)
  14. A Horrible Way to Die (7/10)
  15. Sound of Noise (7/10)
  16. Carancho (7/10)
  17. Red Hill (7/10)
  18. I Spit On Your Grave (7/10)
  19. Stake Land (7/10)
  20. Fatso (7/10)
  21. Hatchet 2 (7/10)
  22. In The Attic (7/10)
  23. Rammbock (7/10)
  24. Cold Fish (6/10)
  25. Agnosia (6/10)
  26. Outrage (6/10)
  27. Corridor (6/10)
  28. Rubber (6/10)
  29. Primal (6/10)
  30. Fire of Conscience (6/10)
  31. Transfer (6/10)
  32. Norwegian Ninja (6/10)
  33. The Dead (6/10)
  34. Gallants (5/10)
  35. 14 Blades (5/10)
  36. We Are What We Are (5/10)
  37. The Violent Kind (4/10)
  38. Tetsuo: The Bullet Man (1/10)

UnboundID LDAP SDK for Java 1.1.6

I have just made a new 1.1.6 release of the UnboundID LDAP SDK for Java available for download. You can get it on either the UnboundID LDAP SDK product page or on the SourceForge project page. It should also be available in the Maven Central Repository in the near future (probably within the next day or two).

There are only a couple of minor changes in this release over the previous 1.1.5 version, including:

  • I corrected an error in the documentation around the use of the content synchronization request control that incorrectly recommended using a response timeout of -1 rather than 0. A value of 0 indicates that no timeout should be used, while a value of -1 means that the connection-level timeout (which is 5 minutes by default) should be used.

  • I fixed a problem in the way that the string representation of RDNs was generated when a DN was parsed from a string. Previously, some extra spaces could have been removed. The resulting string representation was technically equivalent to the version that was originally provided, but the original formatting should have been preserved.

  • I updated the source for the Android LDAP client to match what was published as version 1.1 in the Android market.

Minor Updates to the Android LDAP Client

I have just uploaded a new version of the UnboundID LDAP client to the Android market. It’s kind of embarrassing that it took this long to put out such a minor update, but I had visions of a much more significant update that I never got around to coding and I kept putting off some simple stuff. Hopefully the minor improvements are worth the update, and maybe I’ll get around to the bigger version at some point in the future.

The changes included in this update are:

  • I’ve updated the application to use the latest version of the LDAP SDK. This includes several bug fixes over the version used in the previous release of the LDAP client, including some fixes around SSL and StartTLS.

  • It is now more liberal with what it considers a user entry (and will therefore allow special treatment for things like telephone numbers, e-mail addresses, postal addresses, etc.). Previously, it would only work for entries with an object class of “person”. It will now work for any entry that has a “cn” attribute and at least one of the following additional attributes: mail, mailAlternateAddress, telephoneNumber, homePhone, mobile, pager, and facsimileTelephoneNumber.

  • It should now be usable on devices with any screen size. Previously, it was only available for devices with what was considered a “normal” screen size, and it might not have been available on some devices with a very low resolution, or on devices with much higher resolutions. I don’t know how it looks on any of those other devices, but hopefully it’s at least usable.

  • It should now be possible to move the application to the SD card on devices running Android 2.2.

I’ve tested the application in the emulator for Android versions 1.5 and 2.2, and on actual phones running Android 1.6, 2.1, and 2.2, and I haven’t encountered any problems on any of them. If you run into a problem, please let me know.

LDAP Password Changes in Active Directory

I’ve never really been a big fan of Active Directory. Microsoft tends to treat standards more like suggestions than rules, and Active Directory has some good examples of that. I was recently asked a question about how you can change a password in Active Directory over LDAP. In most directory servers, you would either use the LDAP password modify extended operation (as described in RFC 3062), or you would perform a simple modify operation to replace the userPassword attribute with the clear-text password (and the server would automatically perform any necessary encoding to obscure the value). However, Active Directory has a number of very unusual requirements, so it’s probably worth making a note of them. They include:

  • Active Directory doesn’t appear to support the password modify extended operation, so you must change passwords using a normal LDAP modify operation.
  • Active Directory stores passwords in the unicodePwd attribute, rather than userPassword.
  • Active Directory will only accept password changes over secure connections. I have only ever used SSL. It may be that you can also use StartTLS, or perhaps SASL with confidentiality, but I’m not sure about that.
  • The new password must be enclosed in quotation marks, and it must use a UTF-16 little-endian encoding.
  • Active Directory may impose some strength requirements on the password, although exactly what those requirements are may vary from one instance to another.

Knowing these requirements, you should be able to write code using any LDAP API that will allow you to perform password changes in Active Directory. The following code demonstrates how to do it using the UnboundID LDAP SDK for Java:

import java.io.UnsupportedEncodingException;
import javax.net.ssl.SSLSocketFactory;
import com.unboundid.ldap.sdk.LDAPConnection;
import com.unboundid.ldap.sdk.LDAPException;
import com.unboundid.ldap.sdk.Modification;
import com.unboundid.ldap.sdk.ModificationType;
import com.unboundid.ldap.sdk.ResultCode;
import com.unboundid.util.StaticUtils;
import com.unboundid.util.ssl.SSLUtil;
import com.unboundid.util.ssl.TrustAllTrustManager;
/**
* This class provides a simple utility method that may be used to change the
* password of a user stored in an Active Directory server instance.
*/
public class ADPasswordChange
{
/**
* Perform the complete set of processing required to change a user's
* password in an Active Directory server.
*
* @param  adHost        The address of the Active Directory server.
* @param  adSSLPort     The SSL-based port of the Active Directory server
*                       (typically 636).
* @param  bindDN        The DN to use when binding to the Active Directory
*                       server instance.  It must have sufficient permission
*                       to change user passwords.
* @param  bindPassword  The clear-text password to use when binding to the
*                       Active Directory server instance.
* @param  userDN        The DN of the user whose password should be changed.
* @param  newPassword   The clear-text new password to assign to the user.
*
* @throws  LDAPException  If a problem is encountered while performing any
*                         of the required processing.
*/
public static void changePasswordInAD(final String adHost,
final int adSSLPort,
final String bindDN,
final String bindPassword,
final String userDN,
final String newPassword)
throws LDAPException
{
// Properly encode the password.  It must be enclosed in quotation marks,
// and it must use a UTF-16LE encoding.
System.out.println("Going to encode the password.");
final byte[] quotedPasswordBytes;
try
{
final String quotedPassword = '"' + newPassword + '"';
quotedPasswordBytes = quotedPassword.getBytes("UTF-16LE");
}
catch (final UnsupportedEncodingException uee)
{
throw new LDAPException(ResultCode.LOCAL_ERROR,
"Unable to encode the quoted password in UTF-16LE:  " +
StaticUtils.getExceptionMessage(uee),
uee);
}
// Create an SSL socket factory to use during the course of establishing
// an SSL-based connection to the server.  For simplicity, we'll cheat and
// use a trust manager that will trust any certificate that the server
// presents, but in production environments you should validate the
// certificate more carefully.
System.out.println("Going to create the SSL socket factory.");
final SSLSocketFactory socketFactory;
final SSLUtil sslUtil = new SSLUtil(new TrustAllTrustManager());
try
{
socketFactory = sslUtil.createSSLSocketFactory();
}
catch (final Exception e)
{
throw new LDAPException(ResultCode.LOCAL_ERROR,
"Unable to create an SSL socket factory to use for establishing " +
"a secure connection:  " + StaticUtils.getExceptionMessage(e),
e);
}
// Create a secure connection to the Active Directory server.
System.out.println("Going to establish the secure connection.");
final LDAPConnection connection = new LDAPConnection(socketFactory, adHost,
adSSLPort, bindDN, bindPassword);
try
{
// Attempt to modify the user password.
System.out.println("Going to replace the user's password.");
final Modification mod = new Modification(ModificationType.REPLACE,
"unicodePwd", quotedPasswordBytes);
connection.modify(userDN, mod);
}
finally
{
System.out.println("Closing the connection.");
connection.close();
}
}
}

UnboundID LDAP SDK for Java 1.1.5 and 2.0.0-rc1

I have just released a new 1.1.5 release of the UnboundID LDAP SDK for Java. It is available for download from the UnboundID LDAP SDK product page, as well as from the SourceForge project page. It should be available in the Maven Central Repository in the near future.

This release has only a few changes over the previous 1.1.4 version, including:

  • I have fixed a bug which could cause problems when using SSL or StartTLS over high-latency networks.

  • I have fixed a bug which could cause LDAPConnection.close to close the connection without an unbind request if the connection had previously been closed and re-established.

  • I have added support for the content synchronization operation as defined in RFC 4533.

I have also released a new 2.0.0-rc1 build of the LDAP SDK, which is available on the SourceForge project page. This is hopefully the last build prior to the official release. It includes the above changes, as well as the following additional changes:

  • The default object encoder in the persistence framework now provides support for URL, URI, and enum objects.

  • Java source code generated by the persistence framework now includes static getPersister and decode convenience methods which make it easier to interact with objects using the persistence framework.

  • LDAP command-line tools now provide an option that allows you to specify the format for the key store and/or trust store when using SSL or StartTLS. It still uses the JKS format by default, but you can request an alternate format like JCEKS or PKCS12 if desired.

  • The LDAP assertion control implementation now includes a generate convenience method that makes it easy to generate an assertion request control based on a provided entry. It can be used to make it easier to ensure that some or all of the attributes in the entry have not been updated since the entry was last retrieved.

  • I have added a new BooleanValueArgument class, which is similar to the BooleanArgument class except that it takes an explicit value (e.g., “true”, or “false”, although it will accept other strings as well, including “yes”, “on”, and “1” for true, and “no”, “off”, and “0” for false) rather than inferring the value based only on whether the argument is present.

  • I have added a new DurationArgument class, which combines an integer with a time unit (e.g., “10ms”). It can be used to specify lengths of time.

  • I have updated the FileArgument class so that it is possible to specify a base DN for relative paths. By default, relative paths will be relative to the current working directory, but you can indicate that they should instead be relative to a specified parent directory.

UnboundID LDAP SDK for Java 1.1.4 and 2.0.0-beta1

I have published two new builds of the UnboundID LDAP SDK for Java. The 1.1.4 build is an official release that contains a number of minor enhancements and bug fixes over the previous 1.1.3 release. The 2.0.0-beta1 build is a preview of our next major release and includes significant new functionality, including frameworks for persisting Java objects in an LDAP directory and for more easily creating applications which accept communication from LDAP clients. The 1.1.4 version is available for immediate download on the UnboundID website, and both the 1.1.4 and 2.0.0-beta1 builds are available for download from the SourceForge project page. The 1.1.4 release is fully supported for production use and has a stable API that will not change in incompatible ways in the future. Although we also believe that the 2.0.0-beta1 build is also production ready, we do reserve the right to change any of the new APIs prior to the official release if there is a compelling reason to do so.

Some of the most notable changes between the 1.1.3 and 1.1.4 releases include:

  • I have fixed a bug that could cause problems when trying to use SSL or StartTLS in conjunction with synchronous communication mode. This problem primarily occurred in deployments in which the client and server were not on the same network and there could be a significant delay between phases of the negotiation.

  • A new search-and-mod-rate command line tool has been added that can be used to test LDAP server performance under a combined load of search and modify operations. The searches will be performed in much the same way as with the searchrate tool, but each entry returned will also be modified.

  • The ldapsearch tool has been updated to provide an option to repeat the search multiple times at regular intervals. This can be useful, for example, if you want to periodically retrieve monitor information from the server.

  • The traditional and thread-local connection pool implementations have been updated to provide an option to avoid closing and re-establishing a large number of connections in a short period of time in the event that a maximum connection time limit has been configured. It is now possible to specify the minimum length of time that should pass between closures of expired connections.

  • If a problem is encountered while trying to decode a response read from the directory server, the exception that is thrown now includes better information about the problem that actually occurred to make it easier to diagnose the problem.

  • The searchrate, modrate, and authrate tools have been updated to better handle the case in which the target directory server becomes unavailable during processing. The tools are now better able to re-establish connections to that server when it becomes available again.

The 2.0.0-beta1 build includes everything in the 1.1.4 release, as well as additional new functionality. In previous blog posts, I have discussed some of the features added to the LDAP SDK persistence framework, and that functionality has been further improved in this new version. Some of those changes include better support for operational attributes, the ability to use lazy initialization for a specified set of attributes, and adding support for simple bind operations. It also includes a new listener API, which makes it possible to easily create applications capable of accepting communication from LDAP clients. A new ldap-debugger example tool makes use of the listener API and can serve as a simple proxy which decodes all LDAP communication that passes through it.

We are very interested in getting feedback on the new APIs included in the upcoming 2.0.0 release because we are committed to maintaining compatibility once they have been officially released. If you are interested in either the persistence or the listener APIs, please at least look over the javadoc and let us know what you think.

How Hard is LDAP?

I’ve recently seen a lot of traffic referencing an image depicting the history of a number of LDAP-related RFCs. That image is available in a number of locations, including http://commons.wikimedia.org/wiki/File:LDAP_RFC_Hist.jpg (I don’t generally like wikipedia, but it seems to be the most professional/reputable of the sites containing the image). Most of the comments associated with this image are along the lines of “look at how hard LDAP is to understand”. While it’s certainly true that you need to read a few RFCs if you want to become an expert in LDAP (especially if you want to write your own fully-compliant directory server), I do think that this is a bit of an unfair conclusion to draw from this image.

First, the sheer number of RFCs pertaining to a topic is not necessarily a direct indicator of how complex that topic is. For example, most people don’t consider telnet to be a particularly complex protocol, but according to http://www.faqs.org/rfcs/np.html there are 105 different RFCs pertaining to telnet versus 89 for LDAP, and both of them are dwarfed by the list of 207 RFCs pertaining to DNS. I’m sure if you created a similar diagram showing the relationships between those telnet or DNS RFCs you’d probably come up with something that puts the LDAP version to shame, however I don’t hear anyone complaining about how hard they are.

Second, I think that the diagram illustrates how LDAP is evolving over time. The arrows in the diagram show changes over time, so it’s not like all of those RFCs cover completely different topics. For example, the LDAPv2 protocol was originally described in RFC 1487, and then revised in RFC 1777, then updated again in RFC 2251 for LDAPv3, and once more in RFC 4511. If you want to understand LDAP at the protocol level, you only need to read RFC 4511 since it is the most comprehensive and up-to-date of the protocol specifications. In fact, reading just RFCs 4510-4519 would provide a pretty comprehensive understanding of most LDAP-related concepts.

Third, the relatively large number of LDAP-related RFCs is a good demonstration of the openness that LDAP exhibits. A handful of RFCs provide me with all the information I need to write a standards-compliant LDAP client, which should be capable of talking to any standards-compliant LDAP directory server, or I could even write my own LDAP server. Contrast that with something like the relational database world. I can’t write my own client for talking with an Oracle database, and even if I could, it wouldn’t be able to communicate with DB2 or MySQL or any other type of server. It’s true that there is an ANSI SQL standard, but even then it’s kind of a crap shoot about which parts of that standard a given database follows.

Ultimately, I think that the number of LDAP-related RFCs and the relationships between them has very little to do with how easy it is to understand, and beyond that how easy it is to use or write an LDAP client or server. It’s definitely true that some directory servers or client APIs are easier to use or more full-featured than others. I spend a lot of my time working to make sure that the UnboundID products are as easy to use as possible, and ensuring that we do so without sacrificing performance, scalability, or functionality, and I know that other vendors have people trying to do the same for their products. There are definitely some poorly-written applications out there that use LDAP, and it’s unfortunate that they can give people a bad impression of LDAP itself, but hopefully that will also improve over time.

Please End MLB Blackout Restrictions

I’m a big baseball fan, and I love the St. Louis Cardinals. Since I live in Austin, about 900 miles away from St. Louis, I only get to Busch Stadium about once a year while I’m visiting family in Illinois. Whenever the Cardinals play the Astros (which was twice last year, and twice again this year), I make the trip to Houston to see them there. But that’s about the extent to which I can see them in person. Since their games aren’t televised around here as much as they should be, and since I’m often at work during most of the games, I don’t get to see them on TV much more than I do in person.

For the last two years, I’ve also subscribed to MLB.TV, which provides live video of the games while they’re in progress, and there’s an archive that gives you access to any all games played so far in the season (although it’s definitely not as fun watching a game that’s already been played because it’s impossible to keep from finding out who won). They also have a deal with Roku, so I can use it to watch the games on my TV, either live or already completed. At $120 per year, it’s expensive, but most of the time I think that it’s worth it. This week isn’t one of those times.

In my opinion, the only real down side to MLB.TV is the blackout restrictions that they impose. In theory, the blackouts are supposed to encourage people to go to the games, but in reality they’re just plain stupid. I can’t think of a single good reason for them to exist at all, and especially not when I’m already paying so much for the streaming service. However, it seems like their restrictions go far beyond what is reasonable. The restrictions include:

  • All games on Saturday afternoon are blacked out, no matter what.
  • All games on Sunday evening are blacked out, no matter what.
  • Some additional games are blacked out based on your location.

The first two of these are pretty frustrating, and I’ve been bitten by both of them already this week because the Cardinals played on both Saturday afternoon and Sunday evening, and I couldn’t see either one. However, the location-based restrictions seem to be even more frustrating. For me, because I’m in Texas, they basically prevent me from seeing any game in which a Texas team is playing. This week, the Cardinals are playing the Houston Astros, so I can’t see them. This is despite the fact that the game isn’t taking place nearly a thousand miles away, so there is no reasonable opportunity for me to see it in person (and even if they were in Houston, that’s still over three hours away from where I am).

I guess I’m one of the “lucky” ones, since I don’t live anywhere near my favorite team. If I did, then I might not ever be able to see them live, and I can’t see how anyone would justify the cost of MLB.TV if they couldn’t ever see their favorite team play live. And apparently these restrictions are even worse for people who don’t have any reasonable access to see any games at all. For example, people living in Des Moines, Iowa can’t see any games in which any of six teams is playing (Brewers, Cardinals, Cubs, Royals, Twins, or White Sox), despite the fact that Iowa doesn’t have any professional teams and Des Moines is over three hours away from the nearest of those cities and nearly seven hours away from the farthest.

Major League Baseball: I beg of you, please get rid of these restrictions. I promise you that you’ll make more money, and you’ll have happier customers. There are definitely people who won’t subscribe at all because of these restrictions, and others who opt for a much cheaper audio-only subscription since they aren’t subject to blackouts. It’s also a lot easier for people to support their teams (and spend money doing so) if they can actually watch them play. There are a lot of really good reasons to get rid of the blackouts and no good reason to keep them.