Facebook Petitions

March 23rd, 2009

There's a constant rumour on Facebook that the site is going to start charging users to use the site. And every time this rumour pops up, there are a bunch of groups started with names like "If Facebook becomes a paysite - I'm gone!". This group currently has 425,868 members.

That's 425,868 people who don't get the absurdity of what they're saying.

Facebook wouldn't start charging unless they needed to, because they're not stupid. They know they'd lose a lot of users. So if they start charging, it's because they have to. It costs them money to provide the service they're providing. You can choose not to pay for it, and that's fine; that's your choice.

But a petition?

Let's try some word substitution.

"If my cable company starts to charge - I'm gone!"

"If I have to pay for electricity - I'm gone!"

"If this restaurant wants to charge me for my meal - I'm gone!"

Seems a little absurd doesn't it?

boost::excessive_syntax

March 21st, 2009

Apologies to the majority of people who have no idea what this is about.

class YourBrain
{
public:
      YourBrain();
      virtual ~YourBrain();
 
      YourBrain* Get()
      {
            return this;
      }
 
      static YourBrain* Create()
      {
            return new YourBrain();
      }
};
 
class YourBrainDerived : public YourBrain
{
public:
      YourBrainDerived *Get()
      {
            return this;
      }
 
      static YourBrainDerived* Create()
      {
            return new YourBrainDerived();
      }
};
 
std::vector<YourBrain *> GetListOfYourBrain()
{
      std::vector<YourBrain *> oList;
      oList.push_back(YourBrain::Create());
      oList.push_back(YourBrainDerived::Create());
      return oList;
}
 
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
 
class YourBrainOnSharedPointers : public boost::enable_shared_from_this<YourBrainOnSharedPointers>
{
public:
      YourBrainOnSharedPointers();
      virtual ~YourBrainOnSharedPointers();
 
      boost::shared_ptr<YourBrainOnSharedPointers> Get()
      {
            return shared_from_this();
      }
 
      static boost::shared_ptr<YourBrainOnSharedPointers> Create()
      {
            return boost::shared_ptr<YourBrainOnSharedPointers>(new YourBrainOnSharedPointers());
      }
};
 
class YourBrainOnSharedPointersDerived : public YourBrainOnSharedPointers
{
public:
      boost::shared_ptr<YourBrainOnSharedPointersDerived> Get()
      {
            return boost::dynamic_pointer_cast<YourBrainOnSharedPointersDerived>(shared_from_this());
      }
 
      static boost::shared_ptr<YourBrainOnSharedPointersDerived> Create()
      {
            return boost::shared_ptr<YourBrainOnSharedPointersDerived>(new YourBrainOnSharedPointersDerived());
      }
};
 
std::vector<boost::shared_ptr<YourBrainOnSharedPointers> > GetListOfYourBrainOnSharedPointers()
{
      std::vector<boost::shared_ptr<YourBrainOnSharedPointers>> oList;
      oList.push_back(boost::shared_ptr<YourBrainOnSharedPointers>(YourBrainOnSharedPointers::Create()));
      oList.push_back(boost::shared_ptr<YourBrainOnSharedPointersDerived>(YourBrainOnSharedPointersDerived::Create()));
      return oList;
}

Any Questions?

(If the post just looks like an unreadable pile of punctuation, that's kind of the point).

Xbox 360 Hard Drive Missing Space

March 19th, 2009

My Xbox 360 came with a 20gb hard drive, but it seems to have shrunk over time.

Yes, I know the drive really only ever had about 13 gig of usable space, thanks to Microsoft taking up the rest of it for who-knows-what. But it's worse than that.

The Memory page of the dashboard shows that I'm using 4.7gb for Games, 14mb for Gamer Profiles, 0kb for Demos, 569mb for Videos, 51mb for Themes, 7mb for Gamer Pictures, and 6mb for "System Items". That adds up to about 5.4gb. I have no music on the system.

The system says I have 3.4gb free. 5.4gb + 3.4gb = 8.8gb. I'm missing about 5 gig of space.

So I have 3.3gb free, and I need over 6 gig to copy Call of Duty: World at War on to the hard disk. Where did the rest of my space go?

CIRA Survey

March 19th, 2009

CIRA is the Canadian Internet Registration Authority. They just sent me a survey asking me for my opinions about them.

Some of the questions on the survey were a bit strange. It sounds like they consider part of their mandate to be promoting the ".ca" registry.

If you look at their site, it says in big letters "nothing says Canadian like dot-ca". Well, yeah, but for most people, nothing says "The .com was taken, wasn't it?" like dot-ca.

Then there's things like laconi.ca and identi.ca that have .ca names, but nothing to do with Canada (at least, I don't think they do).

But I guess the CIRA folks want to promote the .ca identity, apparently (based on some of the survey questions), to make it seem more secure, more reliable, and more Canadian.

To me this seems about as useful as post offices competing for which station you choose for your PO Box. "Choose PO Box 1322, Station R. The R stands for Reliable.". Is your TLD really that much a part of your identity?

One problem with companies having unique sites based on the domain, is that the local sites tend to either get forgotten, or be a subset of what you can find at their main site. Look at microsoft.ca versus microsoft.com. The .com site has IE8 downloads all over it; the .ca version to me doesn't look like it's been updated in a while. This is typical. The best sites link the Canadian version into the US one, with a hint to the server that you came from Canada. Look at apple.ca redirects to http://www.apple.com/ca/ and shows the same content as http://www.apple.com, but with Canadian pricing in the store. Nice.

The CIRA, like any other entity I suppose, is trying to promote .ca because the more .ca domains there are registered, the more money CIRA gets.

I used www.ottawaevents.org instead of www.ottawaevents.ca, or even events.ottawa.on.ca (which would have made the most sense) because it was easiest and cheapest. These days it's easier to get a .ca domain, and not as expensive as it used to be. And I don't even know how I'd get a *.on.ca much less a *.ottawa.on.ca. I doubt I can.

There are one million .ca domains registered. That's about 1 for every 2 adults in Canada.

Revenue Recognition

March 16th, 2009

You know what sucks? Revenue Recognition rules, and their application on software products.

Here's how it works. You spend $1000 making an app, and you sell it for $10. You sell it to 200 people, yielding revenue of $2000.

What most companies do is declare that revenue, so it shows up on their balance sheet as that they spent $1000 and made $2000. So far so good.

If this were power tools or hockey pucks, that'd be the end of the story. But with software, there's probably still some people at that company working on that product. Working on bug fixes, and maybe even updates.

You can't release a patch for a power tool, but you can for software. So a few months later, the company has improved the software a bit, and wants to give this away as a free update to Version 1.0.

Now they're in a pickle, accounting-wise. They are spending money, but not getting anything for it. They declared the revenue the previous quarter, and for some reason, accounting rules prohibit them legally from giving away an update to something that has already been bought and paid for, without getting anything for it.

If your product involves a subscription or continuing revenue stream, like the iPhone, or Xbox Live, then you can keep releasing updates that add functionality. The Genius feature for the iPod probably uses this rationalization, since it's really a way to sell more iTunes Store product. But could Apple take a feature from a new iPod and port it back to an older one, and give that away for free? Probably not, legally.

Many companies do it anyway. Sony is constantly releasing new features for the PS3, and I don't understand how they can do so, since they're not getting any additional revenue for that product through any sort of subscription or update service. It could be they know some loophole that lets them do it. It could also be that they're just ignoring this restriction.

Apple, meanwhile, charged $1.99 for the 802.11n updater for the Macs that were sold with this capability but without the driver. It's not that they needed the two bucks; they just couldn't legally give it to you for nothing.

I probably simplified this more than I should have; I'm not an accountant, I'm a software developer, one of the guys who has to make sure that when we're working on a patch, we don't slip any new functionality into it. If you want to read more about the rules, check here.

The goal of these restrictions is to keep companies booking revenue in a responsible manner. You can't, for example, get a product 90% done, sell it, book the revenue, but then continue to work on the product and give the rest of it to the customers when it's done, because you're still paying costs for revenue that you got in the past. This is probably good in some accounting way.

But I don't like it.

The nature of software is that sometimes it's easy to add new functionality to shipping software, and doing so is an act of goodwill that customers appreciate.

Maybe that's a way around it. Look at the update as a marketing cost, not a product development cost.

Windows 7 Performance

March 11th, 2009

Here's some great news: Benchmarks of Windows 7 show that it's not only faster than Vista, but faster than Windows XP.

SmugMug Uploader Take 2

March 11th, 2009

I posted my AIR-based SmugMug Uploader about a year ago, and back then, I had rolled my own version of a SmugMug API client.

Then I found the as3smugmuglib project on Google Code. I changed the app to work with that API instead of my own code.

Because I used Cairngorm when I built the original app, the protocol code was isolated into the business classes (org.stevex.smug.business). The refactoring had little impact on the rest of the project.

I cleaned up a couple of minor bugs as well, so here's a new release. It still doesn't have any of the features that I wanted when I started this project (like a way to automatically upload new photos, or even batch uploading) but as usual I'm hoping to get back to it soon.

Here's a zip file with the complete source: Smug1.zip.

Spam is now passing the Turing Test

March 6th, 2009

The Turing Test is supposed to be a way to distinguish a machine from human intelligence. When I say spam is passing the turing test, I mean it's difficult or impossible for me to tell, from looking at some of the spam that I get, whether it's a human that typed in a comment on something I wrote, or a spam bot.

I don't know what the spammers are up to, but I have a couple of guesses.

Some of the spam is targeting certain kinds of common comments. There are a lot of posts on the internet about the Xbox 360's Red Ring of Death problem, for example. A spam bot that searches for blog posts that mention this, and then post a spam comment that's written from the perspective of a user who had the same problem and found a solution makes for a comment that is hard to tell at a glance whether it's spam or not.

And there's other spam that really is commenting on what I wrote, but not in a deep or useful way, and which links a personal blog which links to spam. Again, there's no way to tell at a glance if it's spam or not. If it's autogenerated, those bots are smart. But I think it's more likely that some spammers are simply employing users, somewhere labour is cheap, to write spammy comments.

And in that case, of course the spam passes the Turing Test, because it is written by humans.

Unfortunately for bloggers, it means every comment needs to be scrutinized. It takes time to them, click the links and make sure it's valuable before approving it. But I don't think this is something we're going to be able to automate. It's become part of the cost of blogging.

Rogers DNS hijack

February 13th, 2009

I'm a Rogers Hi-Speed Internet customer. A few months ago, Rogers stopped returning failed DNS queries, and instead many DNS queries (but not all of them) redirect to *.rogers.com.

Check this out:
stevemac:~ stevex$ ping digg
PING digg.rogers.com (8.15.7.107): 56 data bytes
64 bytes from 8.15.7.107: icmp_seq=0 ttl=48 time=82.954 ms
^C
--- digg.rogers.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 82.736/82.845/82.954/0.109 ms
stevemac:~ stevex$ ping yahoo
PING yahoo.rogers.com (67.202.252.72): 56 data bytes
^C
--- yahoo.rogers.com ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
stevemac:~ stevex$ ping msn
PING msn.rogers.com (8.15.7.107): 56 data bytes
64 bytes from 8.15.7.107: icmp_seq=0 ttl=48 time=82.392 ms
^C
--- msn.rogers.com ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 82.392/82.392/82.392/0.000 ms

In other words, when my computer asks for the address of "digg" (not "digg.com"), Rogers says "yeah, redirect that to digg.rogers.com".

Now, if they were doing this to help me in some way, it might not be so bad. But when I type "cnn" into the address bar, and they redirect me, here's where I end up:

200902132112-1
Yeah, according to this helpful Rogers result page, if I typed CNN into the address bar I'm probably looking for "Jack Canfield Life Coach". I don't think so.

They do identify it as a sponsored link, but it looks exactly like the regular links.

This is just a slimy thing for Rogers to do. I wonder if they make enough off the ads to pay for the loss in goodwill?

Google Maps in Flex

February 8th, 2009

There is an entry on the Australian bush fires on the Google LatLong blog, which links to a map of the fires.

Looks like Google Maps, but right-click on it, and you see the usual Flash menu. This particular Google Maps page is built using Adobe Flex.

How can I tell it's built with Flex? View Source on the page, and you'll see:

Smart developers always View Source.

This application was built using Adobe Flex, an open source framework
for building rich Internet applications that get delivered via the
Flash Player or to desktops via Adobe AIR.

Learn more about Flex at http://flex.org

Cool.