Tuesday, January 27, 2009

Home Theater



I having been meaning to document my home theater for a while now. Here is a first attempt. Eventually I may have to devote some posts to the individual components. Unfortunately my setup is very outdated at this point, nothing supports 1080p. I bought my TV in 2005, before LCDs really came down in price, so I opted for a CRT HDTV, so even though it is only 26" it weighs around 100 pounds. It is also natively 1080i, which goes against the norm. All in all though, I am happy with the way everything is working. I don't plan on changing for a while, all efforts are currently pointed toward buying a house.

Components:

  • Samsung TXR2678WH 26" CRT HDTV

  • Series 3 TiVo

  • Samsung DVD-HD950 HD Upconverting DVD Player

  • Roku Netflix Box

  • 40GB Apple TV

  • Samsung AV-R601B DTS Receiver

  • Octava SW4A HDMI, Optical and Coax Switch

  • ConnectGear HSP12 HDMI Splitter

  • Sony LocationFree LF-B10 Media Streamer

  • Nintendo Wii





Above is a rough sketch of how everything is connected. As complicated as this looks, it is very easy to control thanks to my trusty Harmony 880 universal remote. The setup is also overly complicated because of certain limitations with individual devices. I had to go with the expensive Octava switch, over just a plain Monoprice HDMI switch because my TV does not support passing through surround sound from the HDMI port, and also because my the DVD player doesn't support HDMI audio. The Apple TV used to be connected to the Octava switch, but once I downloaded the 2.0 Firmware suddenly the Apple TV would become stuck showing the Apple logo when using HDMI. It is much more stable using the component cables. The Apple TV has all sorts of problems with many different HDMI devices, so I don't think the problem is with the Octava switch. In fact, the Octava switch has worked very well. It does a great job of auto-sensing signals and switching automatically.

I am also in a bit of a conundrum going forward because of my SACD collection. I own maybe a dozen or so SACD and DVD Audio discs, including Pink Floyd's Dark Side of the Moon and Nine Inch Nail's the Downward Spiral. Unfortunately at this point it is basically a dead technology. Most Blue-ray players don't support it. Only the first run of Playstation 3's supported SACD, but only through HDMI because it didn't have analog Multi-Channel output. I may have to keep my DVD player around forever because of this.

Another key feature of my setup is that I do not have cable or satellite TV. I use an antenna to pick up terrestrial HDTV channels. At first this wasn't by choice because I live in the one building in all of Pasadena that doesn't provide cable, and I would violate my lease by putting up a dish. However, I am now proud not to have that monthly bill and I am happy with the content that I do receive.

In terms of usage I would say that the TiVo is used 50% of the time, the Roku box is used 20% of the time, the Apple TV, the Wii and the DVD Player are each used around 10%. I am really a fan of the Netflix box. I like the subscription model much more than paying per rental. I pay 17.99$ a month to have 3 physical DVD's out at a time and on top of that I can stream as many movies as I want to my Roku box. We probably stream 2-3 movies per week, which is about 10 movies per month. With the Apple TV model, that would be at least 30$ per month, plus I still have the DVDs to fill in the gaps. I only have rented a few movies on the Apple TV, mainly new release action movies to take advantage of HD and Surround Sound. The only downside to the Netflix box is the availability of content, but it is getting much better. Netflix recently partnered with Starz, and that has brought in a much better selection. As of recently the Roku box supports HD as well, although with a very limited selection.

The Apple TV usage has gone up lately. I recently got an iPod Touch, and it has a nifty remote control application for the Apple TV so that selecting music to listen to is a breeze. I also like the photo screen saver functionality. When I first bought the Apple TV my intention was to convert all of my DVDs to MPEG-4 and make them available to the Apple TV. I was using Handbrake to rip the movies and I was running into all sorts of stability problems. However, Handbrake is much more mature now. It is much more stable. It also now supports retaining the surround sound made possible by the 2.0 version of the Apple TV. However, this introduces another conundrum. Do I rip each movie twice, once for Apple TV compatibility, and once for iPod compatibility? Or do I just live with the iPod quality on the Apple TV. I also wish that iTunes included built in support for ripping movies, because it is fair use. They support ripping CDs, why not DVDs?

Another thing that has deterred me from starting this project are rumors flying around that internet that Apple may soon release some sort of media server product. I want to wait a bit to see if this thing is real before I invest a lot of time converting my DVD collection, because it may influence my decisions. I have also been reading a lot about Boxee lately. Boxee is an application that can be installed on many things including the Apple TV that includes Netflix, Hulu, and much more. I have yet to do it because it is not supported by Apple, and it makes me a little nervous. Hulu may be the tipping point though. If I install it I will definitely write a follow up post.

I am now kicking myself a bit for being an early adopter because it seems that all of my gadgets are slowly starting to converge. I can now watch Youtube on the Wii, Apple TV, and TiVo. I can stream Netflix to my Roku Box, TiVo, and even the Apple TV with Boxee. The TiVo and the Apple TV can both stream video from my computer. Oh well.

Sunday, January 25, 2009

Blog Flower Code

This article is the second in a two part series on the Blog Flower Gadget. In the previous post I described how I created the artwork using InkScape. In this post I will describe the programming behind the gadget.

There are two parts to the gadget. The first part which is the gadget itself is contained in a JavaScript file, the second part contains all of the 'Add to Blogger' submission functionality, it is a combination of an html form and another JavaScript file.

The gadget is built using the Google Data API, which provides the content of a blog as either an XML feed or a JSON feed. I primarily work on a Windows Forms application using the .NET Framework, so this was the first time I had even heard of JSON. It is a data format somewhat like XML, except that it is much more compact, and is built specifically for JavaScript. In fact the Google API returns it as an already parsed collection of JavaScript obejcts, which couldn't be easier to work with.

Here is the first JavaScript file, BlogFlower.js which is the gadget.

BlogFlower.js

// (C)2009 by Peter Noyes
function blogFlower(root)
{
var feed = root.feed;
var entries = feed.entry;
if (entries.length == 0)
return;

var entry = entries[0];
var ds = entry.published.$t;
var d = new Date(ds.substring(0,4), ds.substring(5,7) - 1, ds.substring(8,10));
var days = Math.floor((new Date() - d) / 86400000);
document.write('<div class="blogFlower">');

var flower;
if (days < 5)
flower = 'http://www.geeklounge.org/script/Flower1.png';
else if (days < 10)
flower = 'http://www.geeklounge.org/script/Flower2.png';
else
flower = 'http://www.geeklounge.org/script/Flower3.png';

document.write('<img src="' + flower + '">');
document.write('<br>');

switch (days)
{
case 0:
document.write('updated today');
break;
case 1:
document.write('updated yesterday');
break;
default:
document.write('updated ' + days + ' days ago');
}

document.write('</div>');
}


The blogFlower function is called by the Google API, and the root variable is the JSON object that the API constructs. The blog post is retrieved from root.feed.entry, which is an array of all the entries. Google has a good description of this here. The only real trouble I had with JSON was compatibility with the date format. I did find a Google Date API that may have helped, but it added a tremendous amount of JavaScript to this project, which seemed overkill. In the end I used substrings to pluck the year, month, and day from the JSON date. To find the number of days since the last posting, I subtracted the parsed date from the current date, which returns the time span in milliseconds. The conversion factor of 86,400,000 is built up by 1000ms * 60s * 60m * 24h. The corresponding image and text is then written to the document as HTML.

The submission code uses the syntax described here, in order to add the gadget to Blogger. It also sets up the API call to the Google Data API and provides the callback to the blogFlower function.

First is the submission HTML that I placed in the blog post, it is followed by SubmitBlogFlower.js which is referenced by the HTML. I first wanted the submission code to be in the blog post as well, however the syntax checker in the blog post editor barfed on the JavaScript and wouldn't let me post it.

HTML in Blog Post

<script src="http://www.geeklounge.org/script/SubmitBlogFlower.js"></script>
<form name="blogFlowerForm" method="post" action="http://www.blogger.com/add-widget">
<span>http://<input type="text" name="blogName" onkeypress="return noEnter()">.blogspot.com</span><br><a href="javascript: submitForm()"><img src="http://www.blogger.com/img/add/add2blogger_sm_w.gif" style="border:0px"/></a>
<input type="hidden" name="infoUrl" value="http://peternoyes.blogspot.com"/>
<input type="hidden" name="widget.title" value="Blog Flower"/>
<textarea name="widget.content" style="display:none;"></textarea>
</form>


SubmitBlogFlower.js

// (C)2009 by Peter Noyes
function submitForm()
{
var content1 = '\<script type="text/javascript" src="http://www.geeklounge.org/script/BlogFlower.js"\>\</script\>';
var content2 = '\<script type="text/javascript" src="http://';
var content3 = document.blogFlowerForm.blogName.value;
var content4 = '.blogspot.com/feeds/posts/default?orderby=published&max-results=1&alt=json-in-script&callback=blogFlower"\>/</script\>';
document.blogFlowerForm['widget.content'].value = content1 + content2 + content3 + content4;
document.blogFlowerForm.submit();
}

function noEnter(evt)
{
var evt = (evt) ? evt : ((event) ? event : null);
var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
if ((evt.keyCode == 13) && (node.type=="text")) {return false;}
}

document.onkeypress = noEnter;


The gadget is added to Blogger using an html form. I used all hidden form fields except for a visible text field for the user to enter the name of their blog. When the user clicks the submit button it calls the function submitForm, which dynamically constructs code for the widget.content field. This code first references the BlogFlower.js, and then it references the Google Data API. It builds up the feed URL using the blogName text field. I send the following parameters to recover the JSON feed:

  • orderby=published, This ensures that I will be returned the latest posts.

  • max-results=1, This instructs Google to only send back a single post. When doing research I came across a popular Blogger gadget that shows a list of recent posts. Even though they only consumed a few posts, they omitted this parameter which causes Google to return a feed containing every single blog post. This is a complete waste of bandwidth.

  • alt=json-in-script, This instructs Google to return the feed as JSON instead of XML, and to use a callback.

  • callback=blogFlower, This is the callback function implemented in BlogFlower.js


The noEnter function is used to prevent the user from being able to submit the form by pressing 'Enter' in the blogName text field, because doing so would submit the gadget incorrectly.

To get this to all to work took a decent amount of research. At first I kept stumbling across the Widget Tags for Layouts which is the syntax used to create a Blogger Layout. Some gadgets are written using this API, however I couldn't find a way to create the Blog Flower this way. Once I found the Google Data API the implementation went pretty quickly. Creating the artwork actually took up most of the time.

Thursday, January 22, 2009

Blog Flower Art







In a previous post I introduced the Blog Flower Gadget. I have decided to go into some detail about how I created the gadget, and I will split the information into two posts. In this first post I will talk about how I created the artwork. In the second post I will describe the programming implementation.

First of all, part of the inspiration for creating this gadget is that I am currently doing some work involving bezier curves, and as part of my research I downloaded and played with Inkscape. Inkscape is an open source vector graphics editor. I decided to try and trace something using the Bezier curve feature.

I started by sketching the three stages of the flower on paper. I then took a picture of the sketch using my digital camera and imported it into Inkscape. Once in Inkscape I turned the opacity of the image way down so that I could see what I was doing. The actual tracing using the bezier curve tool was pretty easy. Basiclly single-clicking will place corners, and a drag-click will create control points for a curve. It takes a minute to get the hang of it. For each shape I would create a rough outline, and then I would clean it up by moving the points around. It is also possible to add or remove points.

Once I had completed each stage of the flower, I copied and pasted it into a new document and shrunk it down to a smaller size. I first tried actually using .svg files as the final output format for the gadget. It seemed to work best using the <object> tag in the HTML. However, after I finally got it working in Firefox and Internet Explorer I realized that Chrome doesn't support SVG at all, so I decided to fall back to using PNG files instead. It is not a total loss because in the end the .png files were about half the size of the .svg files, even though logically one would think a vector format should end up smaller than a raster version. Although SVG is vector, it uses a very verbose XML syntax and is uncompressed, which explains the difference in file size.

Anyway, I had fun working on this project. It is my first attempt at doing vector based artwork so I am considering it a success.

Sunday, January 18, 2009

Indie 103.1 and Roku SoundBridge



It is sad to see Indie 103.1 go off the air. As an experiment I just decided to see if I could access it on my Roku SoundBridge. Roku has gained a lot of fame recently by partnering with Netflix to produce a set-top box for streaming movies (I own one of those too), but it got its start with the SoundBridge which allows streaming music from a computer, and more recently internet radio. I was able to search for the station using its old call letters, KDLD. I never could pick up the station very well when it was on the air, I am glad I tried this!

Saturday, January 17, 2009

Blog Flower Gadget





Part of the reason I started this blog was to motivate myself to finish projects. In fact, at one time, a project of mine was to program a blog from scratch as a way to learn ASP.NET. Unfortunately that project didn't get too far. I think that part of my problem with finishing these side projects is that I have always chosen projects with too large of a scope, and I just don't have the extra time. I have many of these projects left unfinished.

However, I am proud to be able to post an actual completed project. I decided to create a Blogger Gadget and the result is the 'Blog Flower'. The gadget is pretty simple, I was able to complete it in about half a day or so. Most of the work was actually creating the graphics. As you might guess the gadget adds a flower to a blog, and it will start to wilt and die if a new post isn't added frequently enough. It can be thought of as a motivator to post regularly, because who wants to see a dead flower on their blog?

To add this to your own blog simply enter in your blog name and click the add to blogger link.



http://.blogspot.com




Friday, January 16, 2009

Netgear WNR834Bv2 Wireless Router

This post is a follow up on my previous post on setting up the Netgear FVS336G VPN. In this "part two" of the series on the trials and tribulations of the setup and administration of Netgear products I am going to describe a bug I found in the Netgear WNR834Bv2 Wireless Router.

Let me begin by recapping that I am the official Wireless Administrator at the company I work for. I decided that for security reasons it would be best to use MAC Address Filtering. Ever since the iPhone and iPod Touch came out I have been busy adding those MAC Addresses.

One morning I came to work and was met with a bit of panic because the wireless network went down. The usual solution to this problem is to simply reboot the router, but in this case it didn't work. I racked my brain trying to figure out what was going on. I updated the firmware, I reset the router to factory defaults and restored a backup of our settings, and I scoured the internet for any clues about what might be wrong. Finally I remembered that the night before I had added a new Mac Address, it had completely escaped my memory.

I deleted that last added Mac Address and suddenly everything magically started working. I thought to myself, how could a particular Mac Address kill the router? It didn't make any sense so I decided to count the number of devices in the address table. My jaw dropped when I finished the tally. The number was precisely 32, one of those magic numbers in computer science. Earlier, when it wasn't working the count was 33. The router has a bug where if the table has more than 32 entries the router stops functioning.

I admit that this particular router is consumer grade and no home user would probably have 32 devices. However, if a product is going to have a limit, please enforce that limit with the user interface! If the Netgear configuration website had done a simple range check I would have hours of my life back!

Wednesday, January 14, 2009

Netgear FVS336G Gigabit VPN



The company I work at is small, so we all have to wear different hats from time to time. Even though I am a software engineer, I find myself helping out with IT issues every once in a while. In fact, I am the official Wireless Administrator! We have made some infrastructure changes recently and I feel compelled to write about the obstacles that we encountered. This post will be the first of a two part series on the trials and tribulations of the setup and administration of Netgear products.

We recently moved offices and we took it as an opportunity to upgrade our VPN. We spent a fair amount of time comparing specifications and reading reviews. Eventually we settled on the Netgear FVS336G Gigabit VPN. It is the only unit in its class that had a built in Gigabit switch, which is nice. It claims to not need any special client software, it is an order of magnitude faster than our previous VPN and it had decent reviews on Newegg.

Once I began setting it up I immediately encountered obstacle number one. The statement that it does not need any client software is only partially true. The SSL VPN mode does not require any special software, but the IPsec VPN requires the Netgear ProSafe VPN Client. Because we require using the IPsec VPN I reluctantly went down the path of purchasing the VPN Client software.

From the buynetgear.com website it wasn't clear if the software was going to be shipped, or if it was available as a download. We really wanted to be able to buy the software and download it immediately because we needed that VPN up and running ASAP. I called Netgear to verify that I could download it. The support agent assured me that I could download it, and then she rushed me off the phone.

Well, as I quickly found out, she was wrong, you can't download it. I had to wait for it to arrive via the mail system. After many days I finally had the clients in hand and within minutes obstacle number two was discovered. Even though the Website claims that the VPN Client is Windows Vista compatible, it would not install on Vista. Through some research on the forums I discovered that the software in the box was really old, and that a much newer version exists. There is no information that I could find on the internet about how to acquire the new version, so I called Netgear a second time.

I had to get transferred several times before I finally reached a technical support person who could help me. But before he would help me I had to prove to him that I purchased the software. I actually had to forward him a receipt from my e-mail, he had no way of looking up my information. Once he was satisfied that I had purchased the software he e-mailed me a special link through a 3rd party download service so that I could acquire the latest version of the software.

The whole process was completely asinine. I don't understand why the client software isn't included with the VPN hardware! The technical support agent actually told me that the software is difficult to acquire on purpose! The reasoning is that there is no software protection built into the software so they are worried about piracy. The client software has no way of informing the user if an update is available, nor will they publish any information on the website about new updates. The only way to make sure I stay current with the software is to call Netgear every few months and ask! This was the agent's advice! Unbelievable.

Now that I was able to install the client I encountered the final obstacle. The Reference Manual is no longer in sync with the current version of the firmware. In the latest documentation it describes this crazy scheme where the users' ID should be of the 'Domain Name' form and should be constructed like "[name][XY].fvg_remote.com" where XY is a unique two digit number. Well, this functionality no longer appears to work in the latest firmware. I finally realized that the right way to configure the VPN is to use Extended Authentication where each user has a username/password managed by the hardware, which is much better. I understand why they moved away from that crazy scheme, it is completely unmanageable, the administrator would have to keep a separate spreadsheet to manage those unique two digit numbers.

Even though it was such a bear to get up and running, it has been working well. It is much much faster than our previous Symantec unit. If they made it easier to acquire the client software, had more accurate documentation, and was a little more honest in the marketing materials then I would definitely recommend the product.

Sunday, January 11, 2009

Blogger Image Bug

There is a very frustrating "bug" with Blogger and Picassa. Some images when uploaded get rotated by 90 degrees and cannot be fixed. This only happens with images wider than they are tall. It also only happens with images that contain digital camera metadata. Furthermore it only happens with images that have oval like characteristics. From my previous post the Man o' war and Stone Crab images came in rotated incorrectly. My theory is that Google has a "feature" where it attempts to identify images of a face taken with a digital camera on its side and auto correct the rotation. I am sure that this is a great feature for some users, but it is an absolute hindrance for others. The Picassa Web Album allows users to rotate images once uploaded, and furthermore Blogger images now show up as a hidden album in Picassa, but for whatever reason you can't rotate images in the Blogger album! There is absolutely no way to fix the image once uploaded! When uploading an image from Blogger there is a confirmation screen with a preview of the image, they really need to add some rotate buttons to this screen. For now my workaround is to first open the picture in Paint and then save it as a .png which strips the metadata.

Update
I discovered the source of the problem. My camera is storing camera orientation information in the EXIF data of the jpeg files. Right clicking a jpeg in Windows Vista doesn't show the orientation field, which is why I didn't discover this earlier. Picasa is rotating the image when uploaded based on the stored orientation. This doesn't seem like the correct behavior, especially because the behavior is not consistent across browsers. I am hoping Google fixes this, or at least provides a way to change the rotation once uploaded.

Update #2
I have been involved in a discussion about this issue in the Blogger help groups. A Blogger employee just followed up on that discussion hinting that they are hopefully going resolve this issue!

Peter Noyes,

Thanks a lot for investigating; it looks like you have stumbled into a solution for some of the photo issues that have arisen in the past here. I'll pass your feedback along to the rest of the team and we'll see if we can make this better.

And thanks to Mishka for the heads up!

Gatsby
The Blogger Team

Florida 2008 - 2009

My Mother-in-law lives in Florida, and it has become a family tradition to spend the time between Christmas and New Years visiting. They live in an active adult residential community in West Palm Beach. It is a great place to relax. The water table in Florida is very high, so to build the community they build up mounds of earth to construct the houses on, and in the process they create a series of lagoons that are all connected. Their house is build right next to one of these lagoons so fishing is possible from the backyard. This year I did very well fishing, I caught a total of 7 fish. However, even though my wife only caught 1 fish, she caught the biggest by far, so I guess she wins.



There is a lot of wildlife the exists in these lagoons. The fish are large mouth bass for the most part, but there are also sunfish. The lagoons are also full of turtles. There area all sorts of birds too. The coolset bird by far is the osprey, too bad they are hard to find. But the place is full of horrible looking ducks. Everyone seemed to call them "Turkey Ducks", but they are really Muscovy Ducks, they do not fear humans, hence the close up picture.



The Mother-in-law also lives close to Okeeheelee Park which is another great place to relax. We ended up taking our niece there several times. There is kayaking, fishing, trails and even a bmx course. Unfortunately the only activity my wife and I were able to do this year was take a nice walk, we really wanted to go kayaking but it didn't happen.

Another big part of our vacation is eating. Back east the bagels and lox are so much better. We ended up having breakfast from Strathmore bagels many times. We even brought back a dozen bagels. I also had some great ribs while we were out there, and I had Stone Crab for the first time!

Usually we stay in West Palm Beach but this year we were able to say a little longer than usual so we were able to take a day trip down to Miami Beach. The drive wasn't too bad because we took a toll road, the Florida Turnpike. Miami Beach is an island just east of Miami and it is connected via several causeways. We parked near Lincoln Road which is the north end of Miami Beach and it is where the high end shopping is. We then walked along the beach all the way to the southern end up Miami Beach. On our walk we saw a Man o' war (a poisonous sea creature) washed up on the beach.





At the end of our walk we went to Joe's Stone Crab for lunch. Joe's Stone Crab is located at almost the most southern tip of Miami beach, it is probably the first restaurant in the area, opening in 1913. My Grandmother gave me $100 for Christmas and we used it here. It was by far our nicest meal of the trip, the Stone Crab was awesome.



On our way back we did some shopping, and then we grabbed some Starbucks coffee for the ride home. At the Starbucks I was surprised to see a Clover! The Clover is a super high end coffee breweing system where you can very accurately specify temperatures, amount of grounds to use, breweing time, etc... I had heard that Starbucks had purchased the company a while back in Wired, but this is the first time I have seen one of these in a Starbucks. However, my wife and I were lucky enough to experience the Clover at Trabant Coffee in Seattle before Starbucks bought the company. This time we didn't go for it, 7$ for a cup of coffee is too steep, no matter how good it is.





Another first for our trip was visiting a Wetlands Reserve. We went to the Green Cay Nature Center where we saw even more wildilfe, including an alligator. We also disovered that there is a species of turtle named the "Florida Cooter" which we thought was hysterical. This place was gorgeous. There is a giant wooden boardwalk built on top of the wetlands that is at least a mile to walk all the way around. There is also a nature center where they have an exhibit with turtles, frogs, and baby alligators. I have never been to Florida in the summer, but apparently it is absolutely covered with these frogs.









In total we ended up spending 10 days in Florida. It was a great trip. Work is about to pick up because we are going to be releasing the next version of our software pretty soon so it was nice to have a chance to relax and recharge.

Thursday, January 8, 2009

Steak



On the plane ride home from Florida I watched a steak cooking competition on the food network and it inspired me to cook up a rib-eye. I decided to pan fry this particular steak because the broiler ends up being too messy and I am not really set up to barbecue. I first marinated the steak in butter, beer, worchestire sauce, fresh garlic, kosher salt and freshly ground black pepper for about 10 minutes on each side. I then pan friend the steak for 3 or so minutes per side in some oil. Although probably not the healthiest way to prepare a steak it sure was good!

Wednesday, January 7, 2009

Bonus Digital Copy


I recently returned from vacationing in Florida. I need to settle in a bit before I get to writing a nice long post about Florida, but for now I feel like I need to describe the trials and tribulations of getting the Bonus Digital Copy of the Dark Knight to work that I received as a Christmas present.

First of all, there is an information card inside the DVD case that has an authorization code. This card says to visit www.wbdigitalcopy.com/thedarknight in order to download the movie. After visiting the site I was appalled to see that they are charging 1.99$ for the download. After scouring the internet I learned that the digital copy is actually on Disc 2 and that it is possible to import the movie using iTunes. I wonder how many people they dupe into coughing up an additional 1.99$.

I inserted Disc 2 into my computer and iTunes presented me with a special page branded for the Dark Knight that prompted me for the authorization code. I tried and tried to enter the code and it kept saying 'The code you entered is not recognized as a valid code.' After I finally convinced myself that I was typing it in correctly and that the problem must be with iTunes I went down the path of contacting both Warner Brothers technical support and Apple technical support. (Keep in mind that by now I am approaching an hour into this process and using Handbrake I would have been done at this point).

To Warner Brother's credit I received a response within a matter of hours. They provided me with a new magical code that didn't even have the same number of characters as my original code, and thankfully it did the trick. iTunes succesfully imported a 1.6 GB version of the Dark Knight and I now have it on my Apple TV and my iPod.

I am concerned in that if I ever own another movie with this Bonus Digital Copy will I have to go through the same rigmarole or did I encounter a fluke with the one movie. Overall though I am impressed with the quality of the movie on my iPod now that it is working.