Category Archives: Uncategorized

SimCity – A(nother) tale of woe

Those who know me will wonder what I’m posting on this subject for. I’m not a big gamer so maybe I am missing something with the rollout of this game. I doubt it, though.

The tale starts with me pre-ordering the new SimCity game from EA – I’d played ealrier versions years ago and actually enjoyed playing. When the new version was released I thought I’d take time out to give it another try. Was it as good and enjoyable as I remembered? Was it going to be worth the 40-odd pounds it would cost? I was happy to wait and see.

And then the game had it’s UK release yesterday. I went online, downloaded the game I had pre-ordered and started it up.

Or at least, I tried to.

You see, it is by now well documented that EA massively underestimated the level of demand for this game, and the server infrastructure they put in place to deal with it crumbled under the load. Out of the dozen or so servers available, only one was listed as having any capacity. “Never mind”, I thought, “at least there is one server I can play on”. Well, that ambition was crushed pretty quickly as well. This is a screenshot I took while trying to connect.

20minutes

Yes, you’re reading that right – just short of 19 minutes until the game would even attempt to connect to the server again. Wow!

So, I wasted quite a while trying other servers, and attempting to reconnect. Every now and then I would be allowed to hit the “start” button, but each time I did I was greeted with a message saying all servers were busy. Not a great experience, EA. If I wait patiently for a place on a server, the least I’d expect is to be able to make use of that space when it is granted.

So, a few hours, a lot of waiting, and several choice swear-words later I finally manage to get in and start playing. (I realise that I am lucky and there are many, many others around the world who didn’t manage to get this far).

So, I went through the tutorial (I don’t see a way to skip it – am I missing something?) and all was well. Until the tutorial got to the point at which it had to connect to the servers again (for reasons I frankly don’t understand, or care about for that matter). This was a step too far for the fragile systems, and the game kicked me out. More swear-words.

Back to square one. I went through the whole thing again (hey, I’m nothing if not persistent) and this time actually managed to get through the tutorial and into actual game play. I spent a couple of hours building a city – not a very good city, but a city all the same. Got to a point where I was ready to call it a day, and exited the game through the menus, and turned in for the night.

This morning, I wanted to go play some more, so I booted my laptop, connected, was astonished to see that I was able to connect to a server within half an hour and went to look for my city.

Nothing.

The save had apparently failed. My “work” was gone, my city reduced to electrons and its citizens returned to being the stuff of memory.

So this brings me to a very important question. Actually, a series of important questions, but the one I want to focus on for now is this.

How did this game get released to the paying public in such a crippled and infuriating state? The answer, it seems, is in DRM.

I can understand that a games company such as EA loses millions each your to pirated software. I can understand that they would like to put something in place to prevent the wholesale theft of their intellectual property. I can’t, on the other hand, understand why they had to make the game so dependent on having an always-on connection to the ‘net. I mean, if I wanted to while away one of my regular 2-hour train journeys by playing a little SimCity, I would be out of luck. If my net connection were to disappear I wouldn’t be able to play. If the company massively underestimates demand and fails to provide enough server capacity to cope, I am similarly out of luck.

Why EA didn’t decide to give this game the ability to work offline with a periodic anti-piracy check by “phoning home” is beyond me. Isn’t it reasonable, even in the 21st century, for someone to want to play a game they paid for without being subject to this kind of heavy-handed security? “Of course you can play, but only if big brother is watching because we don’t trust our customers”.

Anti-piracy measures are not to be taken lightly. It’s a tightrope walk between protecting your IP and risking alienating your customer base. As an example of the completely opposite approach to IP protection, you only have to look at the Reaper audio production software. Rather than waste time and effort on implementing more and more obnoxious and intrusive anti-theft protection into their software, they didn’t bother adding it in the first place and charge a very reasonable fee for their product. Result? Consumers are happy that they know what they’re getting, and the company is happy because more people are willing and able to hand over the requested fees. Possibly not the best way to become millionaires, but a good, open and honest way to run a software company.

EA, on the other hand, have released a game that doesn’t work for most people right now, and to add insult to injury will not even entertain the idea of refunding anybody’s money. At all. The best they have managed to come up with so far is an offer of a free game from the EA catalogue. All very well for someone who plays a lot of games, or is happy to accept this as an acceptable alternative to getting the game they actually wanted. Personally, I’d be happy with a game that works as described in accordance with the Sale of Goods Act here in the UK. That, or a full refund after which I will walk away secure in the knowledge that I don’t have to have anything further to do with EA.

It is my opinion that EA have failed massively. This game that I was looking forward to is crippled to the extent that I can’t play it. I am very unlikely indeed to entertain the idea of giving them any more of my money. Well done, EA. I hope you are able to use the money that you gained from this episode to good use. Maybe you’d like to invest in some market research to see why your failed product launch alienated so many people? That, or you could read your own forums.

Bandwidth Throttling – WP7

I have been chasing down a defect in a Windows Phone 7 app that I’m involved with, but it seems to be bandwidth related. I really need to find a way to limit the bandwidth that the phone emulator is able to use.

On suggestion from some respected colleagues I used Fiddler to try to limit the bandwidth. There are a few extra steps you need to take to enable the emulator’s use of Fiddler, but once it is up and running you can use the “Simulate Modem Speed” option under Rules » Performance to limit the rate of data transmission. Sadly, though, in my instance the way fiddler handles this is not eally sufficient for me.

The config file for the rule lists the following section :

var m_SimulateModem: boolean = false;

if (m_SimulateModem){
  // Delay sends by 300ms per KB uploaded.
  oSession["request-trickle-delay"] = "300";
  // Delay receives by 150ms per KB downloaded.
  oSession["response-trickle-delay"] = "150";
}

Looking at the comments, it implies that it will add a delay of 150ms to each KB of data returned. Sadly, the amount of data I’m working with is so small that the bandwidth limiting isn’t able to make any difference.

So, now I’m looking for alternate ways to achieve my goal, preferably to limit the data coming back on a byte-by-byte basis rather than per KB chunk. If you have any ideas, please either leave a comment here or get in touch through Twitter (@ZombieSheep)

Thanks a lot. :)

Barenaked Ladies – Leeds (17/10/10)

OK, first thing’s first – I am not what you’d call a Barenaked Ladies fan. I have a copy of “Stunt“, and I know “One Week” (in fact, my band have been trying to work out how to adequately cover it for a while now), but that’s not the point…. I went to see them on Friday night in Leeds and was pretty much blown away by them.

Obligatory photo from a camera phone
Barenaked Ladies - Leeds 17/10/2010

I can hear you asking yourself now “If you’re not a fan, why did you go see them?” Well, that’s a fair question, and the answer is simple. One of my mates *is* a big fan, and won the chance to go meet the band at the pre-show meet-and-greet. Once again, though, the answer gets a little more complicated – I didn’t go along with her, because she’d already promised the second ticket to another of out mutual friends. I did, however, offer to drive to take them and pick them up after the show (hey, I’m a nice guy!). Anyway, the suggestion was made that I may as well get a ticket and join them, so I did. (Although quite why I dedicated a whole paragraph to that little story is beyond me)

Anyway – the gig. I could ramble on for a while about the support acts, who were great, but I’m not going to. I’m just going to focus on the main event.

As I’ve already said, I was aware of the band, and some of their work, but in all honesty a lot of the material was new to me. Did that matter? Not a bit! The songs I did recognise were performed exactly as I’d have wished to see them, and the ones I didn’t know were catchy enough for it not to matter that this was the first time I’d heard them. The standard of musicianship was excellent, as you’d expect from the headline act. What I really wasn’t expecting, though, was the level of engagement with the audience, and the level of humour with which the whole show was presented. Not “we’re trying to be funny” kind of humour, just a gentle background feeling that I was watching a bunch of guys who were having a whale of a time on stage. I was standing fairly near the back (right alongside the sound engineer, actually – the sound is always great there) but I felt drawn in to the show, felt a part of the good feeling in the room, and felt as if I was the one they were here to entertain. No mean feat, as anyone who’s been up on a stage will tell you.

So, what’s the point of this rambling and unfocussed post? Well, just to tell you that if you get a chance to go see these guys perform you should take it and get out and have a great night’s entertainment. Next time they’re around these parts, I’ll be going again. Maybe I’ll see you there too.

**EDIT** Seems my tweet about this post was re-tweeted by Tyler. Another example of the band’s accessibility, I guess. :)

Marshaling – How I got involved (Part 2)

I left you last time having completed my morning at Donington, looking around the circuit and behind the scenes. The afternoon was where my marshaling career really began – out “on the bank”.

I’d been allocated a position on post 12, on the outside of the Craner Curves. To get to the post, I had to drive around the service road that runs around the circuit. When I eventually found where post 12 was located (after a lengthy detour, almost all the way round to McLeans) I parked up and went to meet my colleagues for the afternoon. I was on post with two more experienced marshals, and another of the trainees. (This is where it all gets a bit embarrassing – I’ve met the others several times since that first day, but my memory for names has completely failed me. When I remember them I shall come back and redress this injustice, but until then please bear with me.)

The first thing that happened in the afternoon was an on-post briefing covering safety and general behaviour while on post. Essentially this boils down to the following rules.

  1. Always keep an eye on oncoming traffic on track. This may seem like a very trivial thing to say, but when you are standing trackside you absolutely have to know what is coming toward you. Marshal posts are positioned according to where they are most likely to be needed and often this is where the cars are most likely to lose grip and spear off the track. The last thing you want to happen is to get hit by an out of control vehicle because you weren’t watching what was going on.
  2. When there are cars on track, don’t sit or kneel down. Again, you never know when you might have to run.
  3. When there are cars on track, don’t eat or drink. This is an extension of the first two rules. Keep your focus where it needs to be.

So, with the basics covered we were ready for an afternoon of racing. Although I love watching the racing, I’m not going to bore you with a rundown of what was out on track when. Instead I’ll just tell you that after a couple of hours of various qualification sessions, the heavens opened. When I say that the heavens opened, it really doesn’t do justice to the amount of rain that fell. Racing was suspended for the duration of the rain storm because the track was simply unable to clear enough water for safe racing.

This brings me onto a very important lesson that I learned that afternoon – appropriate clothing. Obviously marshals are famed for (in most instances) wearing orange overalls so they stand out from the background. Just as important as high-vis clothing is a really good set of waterproofs, good quality waterproof boots and a hat. I was fortunate that I was reasonably well-equipped in the hat and waterproof jacket/trousers stakes, but my boots just weren’t up to the job. Lesson : buy some decent boots.

I’m afraid to say that that pretty much wraps up my first afternoon on the bank. When the rain stopped, the superkarts came out for a few laps, until it was discovered that the amount of water falling from the sky had caused some subsidence along side the track (actually, a part of the newly built tunnel had collapsed*) and the decision was taken to halt activities for the day.

Was I disappointed to have my first day cut short? You bet. Did I regret having driven the hundred or so miles to stand for three hours in the rain? Not even slightly. You see, the thing about marshals is that we are a very friendly bunch. In adverse conditions we all make the effort to keep each others spirits up. On this occasion the opportunities for entertainment were a little unusual. If you were watching the Eurosport coverage of the day you may have seen four mad people racing rubber ducks down the river that was the hill at Craner Curves. That was us. I don’t for a second recommend using a racing circuit as a playground, but in this instance there were not going to be any vehicles out for the foreseeable future and it was better than standing around looking glum.

So, that was the first day over with. In the next part, I’ll talk about the benefits of joining the BMMC, what you can expect to pay to equip yourself as a marshal, and generally flesh out the details of how you take the next steps.

* I swear the following radio transmission about the subsidence was real. From one of the posts near the affected area : “Race Control, this is post xx. A hole in the ground has appeared trackside – we’re looking into it!”

20110409-083923.jpg

WCF Restful interface

For one of the projects I am working on, I needed to be able to self-host a WCF service. That in itself is a fairly simple task. It was, however, complicated by the need to allow a SilverLight 3 application on another domain access to the service. I kept getting errors relating to cross-domain permissions.

A little search on Google led me to the solution (adding the file crossdomain.xml to the root of the hosting site) but it was not the full solution. Self hosted services don’t have a site, so they don’t have a root path since there is no site.

The answer was to implement a restful interface on the service. The original posts that told me what I needed top do are here and here.

Essentially, I had to set up a new interface to allow restful communications. A stripped-down example is as follows.

using System.ServiceModel;
using System.ServiceModel.Web;
namespace TestPOCService
{
[ServiceContract]
public interface IRestfulData
{
[OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
Stream GetSilverlightPolicy();
[OperationContract, WebGet(UriTemplate = "/crossdomain.xml")]
Stream GetFlashPolicy();
}
}

The implementation included the main service interface I had defined for other purposes (and which won’t be included here) as well as the implementation of the IRestfulData interface, as follows.

using System.IO;
using System.Linq;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;
using System.Xml.Linq;
namespace TestPOCService
{
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1 : IService1, IRestfulData
{
static string CONTENT_TYPE_HTML = "text/html";
static string CONTENT_TYPE_XML = "application/xml";
static string CONTENT_TYPE_APPLICATION = "application/octet-stream";
// IService1 implementation
public Stream GetSilverlightPolicy()
{
WebOperationContext.Current.OutgoingResponse.ContentType = CONTENT_TYPE_XML;
return new MemoryStream(File.ReadAllBytes("Content/crossdomain.xml"));
}
public Stream GetFlashPolicy()
{
WebOperationContext.Current.OutgoingResponse.ContentType = CONTENT_TYPE_XML;
return new MemoryStream(File.ReadAllBytes("Content/clientaccesspolicy.xml"));
}
}
}
<div>
As you can see, This relies on the files themselves being hosted in a folder called “Content” beneath the service’s host file structure.

20110409-060908.jpg

Renault and the Future of Formula 1

As some of you already know, I’ve been volunteering as a motor sport marshal for a few months now, and so I wanted to share my thoughts about today’s announcement that Flavio Briatore and Pat Symmonds of Renault’s Formula One team have decided to stand down.  This follows allegations of race fixing during the 2008 season, specifically in the team allegedly asking Nelson Piquet Jr to deliberately crash in order to bring out a safety car. A fuller picture of the story can be found here.

From my point of view, I find the idea of deliberately causing an accident to be completely abhorrent.  I am one of a group of people who regularly turn up at motorsports events and put our safety at risk to ensure that the events run as safely as possible, for us, the drivers, other officials and the public.  We do it unpaid, and often unthanked by the teams and drivers.  We do it because we love motor sports, and want to ensure that the spectacle may continue to be enjoyed by the public, and everyone involved.

In the short space of time in which I have been a marshal I have made some very good friends within the community.  I cannot begin to express my displeasure at the thought that someone may go out of their way to cause an accident, let alone one in which innocent people’s lives are at stake.  If I was involved at a race meeting where the life of one of my friends, or that of an innocent bystander was put in jeopardy by the irresponsibility of a team or a driver purely for the sake of a larger slice of the prize money I would be incredibly angry.

Although I will miss TV coverage of Flav being the eccentric character that he undoubtedly is, I will not miss his presence if it actually turns out that the allegations are true.

The other consideration is how much punishment Renault themselves should be given.  If they get off lightly since the departure of the two remaining team members at the centre of the allegations, then surely that will leave the door open for similar acts of stupidity from other teams.  It should not be enough to be able to say “Yes, we were wrong, but the people concerned have now left”.  The team as a whole should bear the responsibility for their actions.  I realise this will probably put the jobs of many people in jeopardy, but rather that than compromised safety.  The bulk of the Renault team will have enough contacts and respect within the Formula One paddock to be able to find work at other teams – maybe one of the newly signed-up teams.

The bottom line here is that safety is vital, and the allegations are that this fundamental fact has been ignored.  Formula One will more-than-likely survive the scandal, but it should not pass unmarked.

New comment added to a stored procedure

Today, I had occasion to add a comment to a stored procedure. Can you tell exactly how happy I was about it?

--
-- IMPORTANT!!!!!
--
-- This procedure has been replaced with **name witheld**
--
-- Any modifications made to this procedure will not take effect in the live
-- system.  You'd be wasting your time, just like I did today and let me tell
-- you, it's really, really annoying to put the effort into changing a
-- deprecated procedure becuase nobody though to put a comment in, or better still
-- to remove the procedure altogether.
-- Of course, the logical thing to do would be to make the changes to the
-- existing code rather rather than complicate matters with a new procedure,
-- but then that would be too sensible, wouldn't it?
--

Who says .Net can’t be fun?

or at least, mildly amusing on a dull afternoon…

“The CLR has been unable to transition from COM context 0x21b378 to COM context 0x21b4e8 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.”