Taxing your gigabytes

As reported on Slashdot:

An anonymous reader writes “The Register is reporting that in a few short months a proposal to tax all MP3 players in the Netherlands will become law. The levy taxes 3.28 euros ($4.30 US) for every gigabyte of capacity. This means a 60GB iPod Photo will be hit for an additional 196 euros ($258), all of it going to the record industry’s copyright collection agencies. And they call file sharers thieves?”

In the U.S., about 13 million MP3 players were sold in 2004. (Over 5 million of those were Apple iPods.) If you assume the average iPod held 4GB (a conservative estimate, considering the iPod Mini’s smallest capacity is 4GB), and the average non-iPod held 1GB (again a very conservative estimate), that’s 30.1 million gigabytes of MP3 storage sold in 2004. If you applied the Dutch tax of $4.30 per GB to those conservative estimates, it would amount to about $130 million to record companies — money gained on the sales of products which may or may not be used to store copyrighted material which the bearer has no rights to own.

Such a law would never make it in the United States — at least, not without some heavy legal wrangling. There’s simply too many loopholes. An equivalent strategy would be to tax computer hard drives because they “may or may not be used to store copies of illegal software, movies, or music.” Or, taxing blank paper and photocopiers because they can be used to “make illegal copies of copyrighted materials.”

Well, don’t be so sure. The Audio Home Recording Act of 1992 required that manufacturers of digital audio recording devices (originally perceived as DAT players, but could be easily transfered to include CDs, DVDs, and digital hard drives) must pay “royalty taxes.” The money goes to the U.S. Copyright Office, which then distributes it as it sees fit (after, of course, paying for the additional bureacracy to manage this legislation). It is this legislation that ensured you can’t make “copies of copies” of DAT tapes with the government-mandated creation of what became the Serial Copy Management System. Of course, this system has been extended to cover CDs and DVDs.

How much are these royalty taxes? Apparently, about $3.5 million, at least in 2003, according to the U.S. Copyright Office’s Annual Report for 2003 (PDF). In other words: Why? Is all this legislation, processing, tax collection, tax redistribution, copy protection, and consumer frustration worth $3.5 million to an industry that has revenue of over $30 billion a year? No, it isn’t. But it’s here, and it’ll likely be here to stay, and it is there to open the door for more in the future — like a tax on MP3 player gigabytes.

What’s in a name, tiger?

As reported on AppleInsider and Slashdot:

AppleOnline retailer Tiger Direct has reportedly sued Apple over the use of the Tiger name just one day before the Mac maker is scheduled to roll-out its next-generation Mac OS X 10.4 ‘Tiger’ operating system, according to an article at AppleInsider. TigerDirect, which owns trademarks on the names Tiger, TigerDirect and TigerSoftware, has requested an injunction that could prevent Friday’s launch of the Tiger OS. Tiger Direct is also seeking damages and legal fees. ‘Apple Computer has created and launched a nationwide media blitz led by Steven Jobs, overwhelming the computer world with a sea of Tiger references,’ Tiger Direct’s attorneys wrote in the lawsuit.

Far from the first time Apple Computer has run into alleged trademark infringement – back in the day, they were sued by Apple Records (of the Beatles fame). That suit was thrown out under the following guideline (quoted from an Overview of Trademark Law off the Harvard University Web site):

The standard is “likelihood of confusion.” To be more specific, the use of a trademark in connection with the sale of a good constitutes infringement if it is likely to cause consumer confusion as to the source of those goods or as to the sponsorship or approval of such goods. In deciding whether consumers are likely to be confused, the courts will typically look to a number of factors, including: (1) the strength of the mark; (2) the proximity of the goods; (3) the similarity of the marks; (4) evidence of actual confusion; (5) the similarity of marketing channels used; (6) the degree of caution exercised by the typical purchaser; (7) the defendant’s intent.

No one in their right mind would think that Apple Computer’s latest operating system version has anything to do with a mail-order company that never authored, distributed, or sold its own operating system (i.e. TigerDirect). Now if the name of OS X.10.4 was “Amazon” that would be another story — Amazon is associated almost universally with online sales and products and could cause some brand confusion. However, unlike Amazon, TigerDirect doesn’t have the same household name recognition, and one would venture that the word “Tiger” as used in branding has even less name recognition.

Who wins? The lawyers. They’ll make money at the expense of the companies, their respective shareholders, and, ultimately, you and I – the consumer.

The end of analog TV

As reported on MSNBC in Michael Roger‘s article, The end of analog TV:

Depending on the outcome of discussions in Congress, television as we know it may end at exactly midnight Dec. 31, 2006.

That?s the date Congress targeted, a decade ago, for the end of analog television broadcasting and a full cutover to a digital format… Back when the legislation was written, New Year?s Eve 2006 probably looked as safely distant as the dark side of the moon. But now that date is right around the corner and Congress and the FCC are struggling mightily to figure out what to do…

The really big question: What will happen to all those old-fashioned television sets we?re still buying when the analog transmitters go off the air? To continue to receive free broadcast television via antenna, you?ll have to buy a digital converter box; cost estimates range from $100 or so in 2006 down to $50 by 2008…

The real problem is the 15 million or so U.S. households whose only television service comes over the air. For these people, predominately lower-income and disproportionately black and Hispanic, the cut-off will be bad news indeed…

Congress can ignore the end-of-2006 cut-off if fewer than 85 percent of households have digital television sets…

Most discussions in Washington contemplate some sort of free or subsidized converters for low-income households, paid for by the government, perhaps with the help of broadcasters or consumer electronics manufacturers…

So let’s think about that:

  • Congress obviously came up with some brilliant legislation in 1996 thinking that all U.S. consumers would either buy a new television that had a built-in digital converter, or buy the separate digital converter. They neglected to recognize the practicality or likelihood of this, nor did they encourage the market to advertise this pending need.
  • They decided they could avoiding the pending shutdown of analog television if “fewer than 85 percent of households have digital television sets [in 2006].” In other words, they are willing to abandon the 15 million households that didn’t decide to (or know they had to) upgrade their old reliable TV.
  • A proposed “fix” to this is for the government to subsidize the purchase of converters for “low-income households” who would be left in the dark. If you’re middle class, you have to buy a new television. If you’re “low-income” the government will give you one. Assuming that 10 million of those 15 million households fall into this category, and that these set-top boxes cost about $100, we’re talking $150 million, not to mention the endless administrative and bureacratic costs. I’d estimate it would cost $300 million to “fix” this problem.
  • That same $300 million is about the Federal tax burden of about 50,000 middle-class families – a drop in the bucket that we call the Federal budget. It’s really not a lot of money to an organization that spends trillions of dollars a year. Maybe it isn’t a bad idea?

What a wonderful world Congress has brought us. They made legislation to bring the wonders of high-definition television to the masses, at a cost of $300 million. Odds are if they did nothing the market would have eventually implemented high-definition television on its own, phased it in without alienating its existing customers, and saved us $300 million. No media company would ever look to abandon 15 million customers. Congress thinks it is no problem to do so – because they can bail themselves out by spending your $300 million. Remember, it’s not the government’s money, it is your money. And that $300 million won’t give anyone high-definition television — it’ll just make sure the same old picture they see today will still be there tomorrow. So why bother?

We can only wonder.

IGDA’s Online Games Quarterly focuses on casual gaming

The Online Games Special Interest Group (SIG) of the International Game Developers Association (IGDA) recently published their second Online Games Quarterly, which focuses on casual gaming and who the casual gamer is. Among the articles include:

A worthy read for anyone with a vested interest in casual gaming (as I have).

Patents gone awry: Microsoft’s U.S. Parent 6,882,706

Today, The Register reported that Microsoft patents 911 – more specifically, “a system for accessing data used by emergency services.”
If you read the details of U.S. Patent 6,882,706 and interpret the lofty “patent-speak,” you’ll realize that this is nothing more than a searchable database of emergency information with a user interface and triggers — certainly useful, probably statutory, but not obvious or unique. Apparently, the U.S. Patent and Trademark Office should hire people who understand technology.
Let’s write our own patent…


Method and system of recording and maintaining unique identity information
What is claimed is:
1. A computer-implemented method, comprising:

  • generating a pseudo-random sequence of numbers in a strictly defined format defined by the regular expression \d{3}\-\d{2}\-\d{4};
  • storing personal identifying information in a computer database;
  • storing such pseudo-random number sequence in a computer database;
  • establishing a link between personal identifying information and pseudo-random number sequence in a computer database, utilizing information previously stored in such database;
  • providing a user interface using a unique assembly of open and strictly formatted data entry fields for the purpose of entering personal identifying information into a computer database;
  • providing a user interface to automatically generate aforementioned pseudo-random number sequences and assign to individual personal identifying information, or to such information in groups (“batches”);
  • provide a user interface to query a computer database using a strict query-by-example design;
  • report on the results of said queries.

Congratulations! You just got a patent for a database to store and query on names, addresses, and Social Security numbers.

Where’s my sessions (ASP.Net)?

A former coworker sent me a note asking me if I had any ideas why his ASP.Net sessions weren’t timing out. One thing came to mind: They may be timing out, but his code may be structured in a way that he won’t recognize it. I’ve seen this in the past when people try to take actions in the Session_End event handler using Session object values. The problem is, you can’t access the Session object from the Session_End event, because the Session object for that user no longer exists at the time the event is fired.

There’s a great article on EggGeadCafe: ASP.Net Session State FAQ. Some of the best items in this article are quoted below:

  • “In order for Session_End to be fired, your session state has to exist first. That means you have to store some data in the session state and has completed at least one request.”
  • “Session_End is fired internally by the server, based on an internal timer. Thus, there is no HttpRequest associted when that happens. That is why Response.Redirect or Server.Transferdoes not make sense and will not work.”
  • “Session state is available only after the HttpApplication.AcquireRequestState event is called.”
  • “Q: Will my session state be saved when my page hit an error?
    A: No. Unless you call Server.ClearError in your exception handler.”

Good luck to my friend in solving his problem; if the above tips don’t help him out, I’m sure a subsequent blog entry will have more details.

From Seneca to Douglas Adams in less than ten minutes

It started out innocent enough. A friend e-mailed me a quote from Seneca the Elder, a Roman orator from eons ago:

“It is not because things are difficult that we do not dare; it is because we do not dare that they are difficult.”

I should have left it at that, but I didn’t. I could have read more quotes from Seneca the Elder, but instead, I was reminded of a quote from Yoda, the Jedi Master of Star Wars fame:

“Try not! Do or do not, there is no try.”

To get the exact wording, I did a search, and found a bunch of quotes from Star Wars. One of those got me giggling:

Han Solo: “I think my eyes are getting better. Instead of a big dark blur, I see a big light blur.”
Luke Skywalker: “There’s nothing to see. I used to live here you know.”
Han: “You’re gonna die here, you know. Convenient.”

Han was great with the one-liners. One of his quotes I’ve used in the past:

Princess Leia: “I love you.”
Han Solo: “I know…”

Many a relationship ended with that one. But I digress…

It didn’t take much to make the logical jump from Star Wars to Douglas Adams – author of the Hitchhiker’s Guide to the Galaxy trilogy of five books, the first which is being made into a movie – who is well known for his great quotes. One of the quotes is from a short writing by Adams some ten years ago, Adams on Windows ’95:

“The idea that Bill Gates has appeared like a knight in shining armour to lead all customers out of a mire of technological chaos neatly ignores the fact that it was he, by peddling second-rate technology, who led them into it in the first place.”

Leave it to Mr. Adams to say it better than anyone else. As he would say, “So long, and thanks for all the fish!”

Rendering content using custom server controls in ASP.Net

I’ve got a few Web sites, but one thing I’m not is a Web designer. I typically find a good thing and stick with it. One of those is what I call content panels.

A content panel (in my world) is an area of content on a Web page that is not part of the page template – that is, it isn’t part of the header, footer, or navigation. It allows you to divide your main content region of a Web page into logical blocks. Sounds like a <DIV> tag, doesn’t it? Well, in many respects, it is. It’s actually a <DIV> tag on steroids.

Consider the following:

This is a plain div tag.
This is a div tag with some style.

A <DIV> tag encloses content, but adds no specific style or functionality on its own. A content panel encloses content and adds a specific style and functionality to it.

For an example of my content panels in action, check out EQ2Craft. Notice how the sections in the main body have similar style, layout, and functionality. They’re all created by the same server control: ContentPanel.

The ContentPanel control supports specific functionality:

  • Select one of three colors as defined in a separate stylesheet.
  • Set the title text, or hide the title bar entirely.
  • Turn the expand/collapse feature on or off.
  • Turn the content frame on or off.

All of these are set using public properties:

  • Title (string): Get or set the title for the content panel.
  • ShowTitle (bool): Get or set a flag which turns the rendering of the title bar on and off.
  • ShowFrame (bool): Get or set a flag which turns the rendering of the frame on and off.
  • Collapseable (bool): Get or set a flag which turns the expand/collapse widget on and off.
  • Color (ContentPanelColor): Get or set the color, based on the ContentPanelColor enum, which allows three values: Primary, Secondary, and Tertiary. Each of these corresponds to styles which must exist in your stylesheet:
    • colorPanelTitle (as in PrimaryPanelTitle, SecondaryPanelTitle, and TertiaryPanelTitle) reflects the style of the title bar.
    • colorPanelContent (as in PrimaryPanelContent, SecondaryPanelContent, and TertiaryPanelContent) reflects the style of the content area.

The code for my generic ContentPanel class follows:

    public enum ContentPanelColor
    {
        Primary,
        Secondary,
        Tertiary
    }

    public class ContentPanel : Control
    {
        private string title;
        private bool showTitle;
        private bool showFrame;
        private bool collapseable;
        private ContentPanelColor color;

        public string Title
        {
            get { return title; }
            set { title = value; }
        }
        public bool ShowTitle
        {
            get { return showTitle; }
            set { showTitle = value; }
        }
        public bool ShowFrame
        {
            get { return showFrame; }
            set { showFrame = value; }
        }
        public bool Collapseable
        {
            get { return collapseable; }
            set { collapseable = value; }
        }
        public ContentPanelColor Color
        {
            get { return color; }
            set { color = value; }
        }

        public ContentPanel()
        {
            title = "";
            showTitle = true;
            showFrame = true;
            collapseable = true;
        }

        protected override void OnLoad(EventArgs e)
        {
            Literal startContentDiv = new Literal();
            Literal endContentDiv = new Literal();

            this.Controls.AddAt( 0, startContentDiv );
            this.Controls.Add( endContentDiv );

            startContentDiv.Text = "<div class=\"ContentPanelBody\" id=\"" + startContentDiv.ClientID + "\">";
            endContentDiv.Text = "</div>";

            if ( showFrame )
            {
                Literal startFrameDiv = new Literal();
                Literal endFrameDiv = new Literal();
                startFrameDiv.Text = "<div class=\"" + color.ToString().ToLower() + "PanelContent\">";
                endFrameDiv.Text = "</div>";
               
                this.Controls.AddAt( 0, startFrameDiv );
                this.Controls.Add( endFrameDiv );
            }

            if ( showTitle )
            {
                HtmlGenericControl titleDiv = new HtmlGenericControl( "div" );
                titleDiv.Attributes["class"] = color.ToString().ToLower() + "PanelTitle";

                HtmlImage ecImg = null;

                if ( collapseable )
                {
                    HtmlGenericControl ecDiv = new HtmlGenericControl( "div" );
                    ecDiv.Attributes["style"] = "float:right;";

                    ecImg = new HtmlImage();
                    ecImg.ID = "";
                    ecImg.Src = "~/Images/Collapseable.gif";
                    ecImg.Alt = "Expand/Collapse";
                    ecImg.Height = 9;
                    ecImg.Width = 9;
                    ecImg.Border = 0;

                    ecDiv.Controls.Add( ecImg );
                    titleDiv.Controls.Add( ecDiv );
                }

                if ( title.Length > 0 )
                {
                    Literal titleText = new Literal();
                    titleText.Text = title;
                    titleDiv.Controls.Add( titleText );
                }

                this.Controls.AddAt( 0, titleDiv );
                if ( ecImg != null )
                    ecImg.Attributes["onclick"] = "expandCollapse( '" + startContentDiv.ClientID + "', '" + ecImg.ClientID + "') ;";
            }

            base.OnLoad (e);
        }
    }