Digital Copies in the Digital Era

Tell me that I’m romantic, but when I first saw the marking “Digital Copy” on those Blu-ray covers, I thought that the digital era, the one that I was dreaming when I was young, while watching star-trek, was making its first steps.

When someone sane people see this label on disk, it imagines that the box will contain a way to create a digital copy, or will provide a serial number that will allow the buyer, through a sophisticated distribution network, to download the the movie and see it in his computer or any mobile device.

When I first bought one of these, I saw that most of them were bind with the iTunes service. I was thrilled! Loyal customer of the Apple family of products, I imagined the following:

  • The movies will be downloaded with the usage of my iTunes account, and they will be available for download from anywhere. Would be like carrying my personal collection (at least a part of) with me all the time.
  • The service would provide the movie in various resolutions and I will be able to download them freely.

After all, I had already paid for the content, right?

The IPR Problem

The first problem in this situation, was with the IPR. You see I was born and lived in Greece (Hellas), which is not very good in the adoption of the new technologies. So, the “Digital Copy” thing does not exist in their vocabulary or the local Blu-ray disc.

I was buying my stuff from amazon.co.uk, which did not provided a warning that I will not be able to redeem my content, because my iTunes account was in the Greek iTunes store. And how should they know?

So, I had to deal with this irritating situation; I had payed for the content, I had the devices, but I could not redeem it, because I had only a Greek iTunes account.

Asking for Help

I asked Apple customer support for help and indeed they were very helpful and fast. They said that I should open an English iTunes account to redeem my content.

To open it, the system would require a credit card issued by an English bank or a gift card from another account in England. They said, that this could worked.

Luckily, I had a friend in England that agreed to send me a gift card. I registered easily and began to redeem the digital version of the movies.

The Ugly Truth

I started one-by-one redeeming the movies and then I was in front of those sad facts:

  • Most of the movies were not downloaded, but ripped from the DVD (they used iTunes for authentication only). The quality of the video was poor (DVD quality), but remember I had paid for the full thing.
  • The movies where bind with my account, but were not available for digital download from the iTunes store.
  • In some movies, the “Digital Copy” offer was expired, and I could not redeem them. Of course, I have paid for the digital version of the movie. But, it seems that in modern world, it takes only a small inscription in the back of the box to make things right and give the content owner the right to withdraw the digital copy option and never return the extra money of course.

Amateurs

I cannot really understand why the big studios have problem with piracy. Ok, they are stealing, but they are doing the work for them. Maybe they should see how they do it, and try to copy their underlying technologies.

They sure provide the movies with better quality, availability (24/7) and the service is scaling reasonably.

A Glimpse to the Future

I do not support piracy. Actually, I believe that piracy is stealing, but mocking your customer is stealing also. So, next time, when you asking for some people to support your company and buy your products, please RESPECT them.

Do not say that you provide digital copy, and the only thing you have is a DVD-rip quality movie, and for a specific time period.

I know that all these deals are complex, and the delivery networks will be huge, but IT IS YOUR JOB.

Since, you are not doing it properly and charging substantially, you enable the people to download them from pirated sites. So, instead of hunting down the pirates, just get them out of business.

Provide digital copy of the movies for a small price, aim for the planet as your audience, and do the extra mile, give the little extra, the one that will make people to press the button “buy” instead of searching the pirate sites. It is easy, the technology is here, just grab it and use it!

Webapp2 and Appengine 1.6.1 – Bug

One quick bug/tip that might save you lots of time. 🙂 If you use Google’s appengine along with the webapp2 and using the Users module, you might encounter the following problem.

Recently, the ndb graduated and its python module changed from ndb to google.appengine.ext.ndb. Webapp2 is bundled along with the SDK of appengine, but it seems they forgot to update some modules in it, and they still use the previous package.

I encountered it when I tried to debug my application locally, using the webapp2 user & authentication module, the application crashes from the bad import. When you deploy the application to the appengine server, you must provide a version of the webapp2, which overrides this problem (this worked as a workaround for me at least), thus the problem will not occur. But locally, you must go the installation directory of the appengine and delete it manually.

I spotted this bug roughly a month ago (23/12/2011), and there may be some fixes on the mainstream webapp2 release.

Update (18/2/2012): The problem still persists in version 1.6.2 of the appengine SDK for python.

Appengine APIs are Missing C/C++ Implementations

Recently I was messing with Appengine’s pull queue and noticed the following. They did not offer a C/C++ API. All the other usual suspects are there, like python, Java, go, even PHP and Obj-C.

What happened to C/C++? It is not worth offering and maintaining any more an API for these two languages? Or google wants to promote go!, and pat the iOS developers with the Obj-C?

No, you cannot have a native app. That’s it! Maybe, because C/C++ do not offer by definition an HTTP protocol implementation.

Thinking in jQuery

Recently I was doing some heavy-duty Javascript stuff for a web project. It was quite a while since the Firefox plug-in and in many ways, it was rather enjoyable experience (and in some other ways boring 🙂 ).

If you want to do some cool stuff in the web nowadays, the adoption of a Javascript library like jQuery is typical. I had some experience in the past, but the development process showed me that I was not so experienced as I thought. jQuery has good documentation that can be used as a reference, but it is not very usefull, when you want to understand some basic concepts and you are in a hurry of doing some stuff to work.

So, this blog entry has one goal, to transfer my experience of doing stuff with jQuery as a set of rules/advices that will save time to inexperienced users like me.

Rule #1: “When you are using jQuery, forget low-level Javascript functions”

It is a good practice to use always jQuery’s functions to do the stuff you want. Never rely on the low-leve Javascript function. The reason is simple. jQuery offers an encapsulating object for all the elements of the DOM tree. If you select some nodes with the jQuery selectors and then try to access their children with the common DOM function offered by the standard Javascript API, you are done for. You lose that encapsulation and you are back in black.

Rule #2: “Use # for the ‘id’ selector, ‘.’ for the class selector and always use backslashes in front of dots in ids”

No special reason, just remember these three examples:

  • $(‘#theCoolId’) – id selector
  • $(‘.myBigFatClass’) – class selector
  • $(‘#theCoolId\\.With\\.Dots’) – more complex id selector

Rule #3: “When you have to insert code into an element, use html()”

Simple as that, select the node and paste the code:

$('#theCoolNode').html('

Hey Stranger!

');

Rule #4: “By default the ajax() call is asynchronous”

… so if you want to load something, be sure to disable async, or else you will try to access something that is not ready. How can you do that? Simple!

$.ajax({
	type: "GET",
	dataType: "xml",
	url: "data/strings.xml",
	success: function(xml) { /* success */ },
	error: function() { /* error */ },
	async: false /* I will wait to load the XML */
});

Rule #5: “insertBefore() and insertAfter() take the selector as the parameter”

I do not know about you, but I always thought that it is logical for the insertAfter() and insertBefore() to select a node, then append the node. But this is not the way they are implemented. A small example:

$('

Hey Joe!

').insertAfter('#theCoolNode')

Rule #6: “It is always your fault”

Usually it is, accept it and try to understand how things are working :), instead of trying to convince everyone that you are Mr. Right!

Linux Inside Site is Alive

Like the phoenix, from the ashes of Linux Format (Greek version) the brand-new Linux Inside was born. The first volume will be available at 27/1 (Greece only).

Linux Inside is a 100% Greek magazine that is written by the Linux community for the Linux community. It is hosted in http://www.linuxinside.gr/ (in Greek).

Feel free to visit it, tell us your opinion and freely participate in the forums.