STRATO and the Customer-Support-Circle-of-Doom

Why is it so hard to find a good web hosting company?

About one year ago I announced that I moved hosting from WebFusion over to STRATO in the hopes for higher reliability. This was indeed the case for almost a year. I had no problems, until…

Three weeks ago my blog started to suffer problems, as is clear from my analytics data on one of the domains:

The traffic drops off from normal levels down to nothing in the space of about a week. I was away the start of the month (more on this in a later blog post) and thus wasn’t checking the domain. Its only when I received an email from someone informing me about the fact my blog was down that I sat up and took notice.

I immediately tried to access the domains in Chrome but I got timeout for each one. I then tried to remote into my VM. Timeout there too. I then tried hard-resetting the machine from the Strato console, no luck there.

With no other options I decided to call my hosting provider STRATO. It turns out however that their call centres aren’t open at the weekend *sigh* so I sent them a mail:

Hi

A visitor reported that my site was down: http://www.mikecann.co.uk/. I cant access it either. I have tried to remote into my VM but it wont connect. I have logged into the Strato backend and tried to reboot my machine. It says it has rebooted, but I still cant login or access my site.

Can you help please.

Mike

Two days later I get the following reply:

Dear Mr. Cann,

Thank you very much for your enquiry to which I am glad to respond.

I can see that the server is up and running , If you are using Plesk please check the domain setting in plesk. If you cannot reach plesk please  work through the following FAQ Article ID: 1360.

Your opinion about our Customer Service is very important to us! Please take some time for our questionnaire – so we can respond even better to your needs in the future. The completion of the form takes only about 3 minutes.

Link to the rating system: https://www.strato-mailcenter.com/quality?ident=bd391e7c-3c076f-13f18d-47938a-aaafba

With kind regards from Berlin,

xxx xxx
STRATO Customer Care

Well clearly they hadn’t actually read my mail and checked that the domain isn’t up (this is the main domain associated with my account) they also haven’t tried to login to the box else they would have encountered the same issue.

So after some email jousting back and forth and some experimentation with STRATO’s non-functioning recovery console I get the following reply:

Dear Mr. Cann,

Thank you very much for your enquiry to which I am glad to respond.

I have taken your server out of the recovery mode for you .You server could also be slow as it is affected my some major maintenance
that is also going on at the moment on our windows servers, which could be causing your server to run slow at the moment  , I cannot give you a time frame when this will be completed as i do not have one myself.

Your opinion about our Customer Service is very important to us! Please take some time for our questionnaire – so we can respond even better to your needs in the future. The completion of the form takes only about 3 minutes.

Link to the rating system: https://www.strato-mailcenter.com/quality?ident=bd391e7c-39a316-13f846-44189a-8050db

With kind regards from xxxx xxxx
STRATO Customer Care

(Bold added by me)

Okay… I thought to myself… I have just been led round the houses for two days emailing back and forth when only just now they tell me they are having some major maintenance issues, why not tell me that from the start? In fact, more to the point,  why are you performing maintenance, without telling me, that has taken my box down for a week?

I decide at this point, its a good idea to give them a call and find out what is going on. Eventually I get put through to X. X at first tells me that he cannot give me the reason for the maintenance nor how long it will last. I get pretty insistent at this point that I should be told why the service that im paying for is not working. Eventually he relents and tells me it is to do with their licensing for windows.

X explains to me that when Microsoft license the Windows OS to hosting companies they create a child license from their master license. Strato as one of these hosting companies then creates further child licenses for its customers. Apparently something has gone wrong with the master license at Microsoft which has caused every single other license that has been created from it to become invalid.

X explained to me that every single Windows VM that STRATO hosts is down. Not only that, every single Windows VM in the world is down because of this master license issue. I was understandably dubious at this as I would have heard something in the tech-news or blogosphere. I decided however to give him the benefit of the doubt as he sounded honest and it took some persuading to get this information out of him that it must be true.

Before hanging up I pointed out to X that STRATO should have sent an email to its customers to inform them of the problem. At the very least there should have been a press release or something on their homepage to inform people of the outage. X agreed whole heartedly with this and suggested that I send in a complaint detailing all of what had happened thus far, so I do just that.

I get the following reply a day later:

Dear Mr. Cann,

Thank you very much for your enquiry to which I am glad to respond.

We’re aware of the issue where users are unable to connect to their STRATO Windows Servers. Our technical teams has been notified and we expect this resolved by the end of the week. We have raise a credit amount of £10, and it will be paid to your credit card in the next few days.

I will contact you around noon to answer any questions you may have regarding this issue

We appreciate your patience, and apologize for the inconvenience caused.

Your opinion about our Customer Service is very important to us! Please take some time for our questionnaire – so we can respond even better to your needs in the future. The completion of the form takes only about 3 minutes.

Link to the rating system: https://www.strato-mailcenter.com/quality?ident=bd391e7c-a2fc8d-13fff2-44cee9-a53fb3

With kind regards from Berlin,

xxxx xxxx
STRATO Customer Care

Okay so it will be ready by the end of the week. I decided to hang on and see what happened.

What happened? Exactly nothing, I was obviously a little angry at this point:

Hello,

So as its now the end of the week. You promised that my VM will be back up again but low and behold its still not up! Also have you decided not to reply to me any more?
I need a snapshot of my data so I can move my hosting from strato. I also would like the email address of your supervisor so I can speak to them about this.
Mike

Two days later I get the following:

Good Morning Mr. Cann,

Thank you very much for your enquiry to which I am glad to respond.

After looking at your contract, I have seen that your sever has been up and running since Saturday 13.10.2012.

If you would still like me to cancel the Server, this is not a problem. I would therefore need to you to confirm this for me in a reply to this e-mail.

If you do wish to keep your server, you will be able to start ordering your domains within the customer service area.

Once again, I would like to apologise in the setup delay that you experienced.

If there is anything else that I can do for you Mr Cann, please feel free to let me know!

I would therefore like to take this opportunity to wish you a pleasant and successful working day!

Your opinion about our Customer Service is very important to us! Please take some time for our questionnaire – so we can respond even better to your needs in the future. The completion of the form takes only about 3 minutes.

Link to the rating system: https://www.strato-mailcenter.com/quality?ident=bd391e7c-c8411a-140d93-40f3ee-9f18a5

With kind regards from Berlin,

xxxx xxxx

WHAT?!??! Setup delay? Im not setting anything up! I have been with STRATO over a year! Its been up since Saturday, no it bloody hasnt! Its clearly not up now! WTF?

I realised that I was trapped in a customer-support-circle-of-doom.

Well that’s about the point I decided this company really doesn’t care about its customers so im going to move to another hosting provider.

So short of the long, my sites are now being hosted on 1&1 and everything seems to be fine and dandy. Sure it costs twice as much but hopefully that money will ensure a better level of service.

Oh one more thing, apparently STRATO have won awards for their customer service:

*sigh*

</rant>

WWX & Try Harder 2012

I just realised that I still hadn’t posted anything about the Haxe conference, WWX 2012, I attended at in February of this year, how lax of me! Well actually I was waiting for the videos to be released so I could give a link to the lightning talk I gave on my WebGL experiments from last year. (Un)fortunately however, the lightning talks weren’t recorded so you cant see my nervously mumble through my presentation.

I can however link to the videos from all the other speakers that attended the event which were excellent BTW:

http://www.silexlabs.org/?s=wwx

While im here I thought I would mentioned that Im going to be attending try { harder } next month for the second year in a row. As last year the idea is that everyone that attends gives a talk on a topic, it was a fascinating but brain-intensive 4 days last year, im definitely hoping for some more of the same this year!

All New Post To Tumblr Chrome Extension created with Haxe & Robotlegs

I have been working off and on for a while on an update to my popular Chrome Extension ‘Post To Tumblr’ and seeing as Tumblr have just changed thier API I thought it was time to accelerate its development and release it, finally.

First some screenshots to give you an idea of what it does:

You can right-click any thing on a page and “Post To Tumblr”.

A new tab opens where you can format it how you like.

You can change the post type very easily.

When done you just “Create Post”

This version is written totally from scratch using Haxe’s Javascript target. Although not strictly necessary for something as simple as this I thought it was a good opportunity to experiment around with Haxe’s JS capabilities. I must admit I was pleasantly surprised at how well it worked.

Most stuff just worked. There are also plenty of externs out there for the popular Javascript libraries on lib.haxe.org such as the “chrome-extension” library.

Having type-safe Javacript is great for for so many reasons that im not going to get into here. I must admit however there were times when I was lazy and didn’t want fancy creating a type-safe extern class for a library. Fortunately however Haxe has a mechanism for the lazy coder in the form of “untyped”.

An example of this is the way in which you access the “localStorage” object in chrome extensions. localStorage is basically a global object that you can set keys and values in and will persist for the life of your extension. To access it you use: “localStorage[myKey]” to return a value. If you tried to do that in Haxe it would throw an error because Haxe has no concept of global variables (quite rightly).

So to access the localStorage you can use untyped to quickly get access to a global variable, I then decided to wrap this little hack in a Model class to make it a little neater:

[codesyntax lang=”actionscript3″ lines=”normal”]

package models;
import js.Lib;

/**
 * ...
 * @author MikeC
 */

class ChromeLocalStorageModel extends BaseModel
{

	public function get(key:String) : Dynamic
	{
		var val = untyped localStorage[key];
		trace('Getting from localStorage: '+key+" :: "+val);
		return val;
	}

	public function set(key:String, val:Dynamic) : Void
	{
		trace('Saving in localStorage: '+key+" :: "+val);
		untyped localStorage[key] = val;
	}

}

[/codesyntax]

This lets you just just mix and match the type-safe stuff when you need to and just do a little “hack” when you need to 😉

The above example also shows off another cool feature im using in Post To Tumblr, which is RobotLegs. Thanks to the fact that the RobotHaxe library is written in pure Haxe (has no platform specific bits) that means I am able to use it on a Javascript project.

The only problem is the issue with Views and Mediation. Because unlike Flash events don’t bubble up to a central source there is no way to do automatic mediation in the JS target. Instead what you do is implement “IViewContainer” on your context view, then whenever a child is added or removed you call viewAdded() or viewRemoved() that way the MediatorMap can try to make a mediator for that view.

Im not sure if the way I have used RobotLegs is the correct or best way, it was more of an experiment as I went along. The way I have done it is to wrap many of the main HTML elements in my own view classes. So for example I have a “DivView” that represents a “div” and extends BaseView:

[codesyntax lang=”actionscript3″ lines=”normal”]

class DivView extends BaseView
{

	public function new(elementId:String=null) 
	{
		super(Lib.document.createElement('div'));
		if (elementId != null) element.id = elementId;
	}

}

[/codesyntax]

BaseView implements the IViewContainer interface:

[codesyntax lang=”actionscript3″ lines=”normal”]

class BaseView implements IViewContainer
{
	public var viewAdded:Dynamic -> Void;
	public var viewRemoved:Dynamic -> Void;

	public var element : HtmlDom;
	public var parent : BaseView;
	public var children : Array;

....

	public function new(element:HtmlDom) 
	{
		this.element = element;
		this.children = [];
		isLayoutInvalid = true;
	}	

	...

	public function add(child:BaseView) : BaseView
	{
		children.push(child);
		child.parent = this;
		child.viewAdded = viewAdded;
		child.viewRemoved = viewRemoved;		
		if(viewAdded!=null) child.addChildren();
		element.appendChild(child.element);
		if (viewAdded != null) viewAdded(child);
		return child;
	}

	public function remove(child:BaseView) : Void
	{
		if (viewRemoved != null) child.removeChildren();
		children.remove(child);
		child.parent = null;
		child.viewAdded = null;
		child.viewRemoved = null;
		element.removeChild(child.element);
		if (viewRemoved != null) viewRemoved(child);
	}

	...

}

[/codesyntax]

Then say I want to construct the following html:

[codesyntax lang=”html4strict”]

<div id="container">
	<div id="inner">Hello World!</div>
</div>

[/codesyntax]

I would do something like this:

[codesyntax lang=”actionscript3″ lines=”normal”]

class MainPopupContainer extends DivView
{
	private var inner : DivView;

	public function new() 
	{
		super("container");

		inner = new DivView("inner");
		inner.element.innerHTML = "Hello World!";		
		add(inner);		
	}	
}

[/codesyntax]

Then perhaps I want to turn the “Hello World!” red when clicked I would do something like this:

[codesyntax lang=”actionscript3″ lines=”normal”]

class MainPopupContainer extends DivView
{
	private var inner : DivView;

	public function new() 
	{
		super("container");

		inner = new DivView("inner");
		inner.element.innerHTML = "Hello World!";		
		add(inner);

		new JQuery(inner.element).click(onInnerClicked);
	}	

	private function onInnerClicked()
	{
		inner.element.style.color = "#FF0000";
	}
}

[/codesyntax]

What this means is you have a RobotLegs-familiar looking View with a Mediator behind it (thanks to the mediation happening when you call add()) which is nice. What it does mean however is I have quite abit of boiler plate wrapping the HTML nodes, which definitely slowed down my development.

Another thing im not sure about is my mixing of in-line styles and stylesheets. Sometimes I would use the styles in my css and other times I would just set them on the element directly. To be honest, because I was using classes and inheritance and all that good stuff I usually found it easier and more expedient to set the styles inline in my View class rather than go digging through several hundred lines of css to find the selector I was looking for

For example I may have a “HeaderOptionButton” that defines some inline styles then whenever I wanted a button that looked and acted like a header button I would just make and add a HeaderOptionButton. I know im probably going to get flamed to hell and back for that!

As I said, im not sure if im doing it the “right” or “best” way, its just the way that seemed to work at the time 😉

Well that’s a quick overview of where im at. Once I have cleaned the project up a little and added some missing features ill be sticking the source up on GitHub for anyone interested.