Bongo US / Bongo International service & customer support battle

I am having a few problems with Bongo International's customer service at the moment - most notably their refusal to escalate my case to a manager.

So, I decided to go straight to the top to find someone who might actually care about customer perception in Europe.

I selected *********** and sent him an invitation to connect on LinkedIn with this message:

Dear ******,
I am having a shocking experience with the service & customer support provided by Bongo. Before resorting to complaining to your customer, Dutch authorities and publicly online I wanted to give you an opportunity to put me in touch with someone who can help. Thanks.

If this doesn't work out, I will post the complete history plus email thread here and everywhere else I think it might be found by prospective Bongo customers.

[UPDATE] May 9th 2012 @ 21:00

My gambit appears to have worked. My case has now been picked up by a member of senior management and I have some confidence that it will be dealt with properly and promptly. I have accordingly removed the names of any individuals I have spoken to from this article. I have been told that the issues were caused by teething problems with integrating a new payment handler. While this is hardly an acceptable excuse for a consumer, as a software developer I feel I can extend some sympathy or at least relate.

Posted in Uncategorized | Leave a comment

1989 Jeep Wrangler YJ radio / stereo wiring

My '89 Jeep had no wiring harness / block so I needed to research how to connect it up to a modern ISO head unit.
For anyone else in the same situation, here is what I found:

removing the dash fascia to remove / install the head unit
Source: Autozone free repair docs (free site membership required).

* Disconnect the battery ground cable.
* Remove the gauge cluster bezel as outlined under Gauge Cluster removal and installation.
* Remove the control knobs, nuts, and bezel.
* If equipped with air conditioning, remove the screws and lower the assembly.
* Disconnect the radio bracket from the instrument panel.
* Tilt the radio down and remove it toward the steering wheel.
* Detach the antenna, speaker, and power wires.
* Reverse the procedure for installation.

removing a Jeep YJ dash / fascia

removing a Jeep YJ dash / fascia


1990 Jeep Wrangler Car Stereo Radio Wiring
Source: http://www.modifiedlife.com/1990-jeep-wrangler-car-stereo-radio-wiring-diagram/

Car Radio Constant 12V+ Wire: Pink
Car Radio Switched 12V+ Wire: Purple/White
Car Radio Ground Wire: Black
Car Radio Illumination Wire: Blue/Red
Car Radio Dimmer Wire: Red/Black
Car Radio Antenna Trigger: N/A
Car Radio Amp Trigger Wire: N/A
Front Speakers Size: 4″ x 6″ Speakers
Front Speakers Location: Dash
Left Front Speaker Wire (+): Gray
Left Front Speaker Wire (-): Yellow
Right Front Speaker Wire (+): White/Red
Right Front Speaker Wire (-): Black/Red
Rear Speakers Size: 4″ Speakers
Rear Speakers Location: Rear Roof
Left Rear Speaker Wire (+): Gray/White
Left Rear Speaker Wire (-): Brown/White
Right Rear Speaker Wire (+): White/Black
Right Rear Speaker Wire (-): Brown

OR…

1988-89 Jeep Wrangler Stereo Wiring
Source: http://www.the12volt.com/installbay/stereodetail/1232.html

Constant 12V+ Red/White
Switched 12V+ Purple/White
Ground Black
Illumination Blue/Red
Dimmer Red/Black
Antenna Right Front
Front Speakers 4" x 6" Dash
Left Front (+) Gray
Left Front (-) Yellow
Right Front (+) White/Red
Right Front (-) Brown/Red
Rear Speakers 4" Rear Roof
Left Rear (+) Gray/White
Left Rear (-) Brown/White
Right Rear (+) White/Black
Right Rear (-) Brown


In case yours does have the wiring block, here is the pinout for a YJ radio connector:

Jeep Wrangler YJ radio pinout

Jeep Wrangler YJ radio pinout

(source: some forum post I have now lost - will try to find it back)


And here is the ISO pinout (viewed from the back of the plugs that go into the head unit - the side the wires go in):

ISO radio / stereo pinout

ISO radio / stereo pinout

(source: http://en.wikipedia.org/wiki/File:ISO_10487_connector_pinout.svg)


And finally, the standard ISO colours:

Power plug
Yellow - Permanent power
Red - Switched power
Orange - Illumination
Blue - Remote (electric aerial/amplifier switch on)
Black - Earth

Speaker plug
Grey - Front right speaker
White - Front left speaker
Purple - Rear right speaker
Green - Rear left speaker

These wires are in pairs. The speaker wires with the tracers are usually the returns.

Note that these colours might not be adhered to by all manufacturers, so be careful!
The wires themselves often have their purpose printed on them in small text, otherwise RTFM!

Posted in Uncategorized | Leave a comment

Go and support Double Fine Adventure!

Tim Schafer and Double Fine are making a new point-and-click adventure.
Rapturous joy :)

They are funding the project through public donations... click here to head to their kickstarter page and support them!

Posted in Uncategorized | Leave a comment

Last day at Philips

A special task sticky added by my team for my last day.

I am going to really miss all these people.

Posted in Uncategorized | 2 Comments

What? You tattooed code on your arm?

[OPPORTUNISTIC UPDATE]
Since I'm seeing so many hits for this page, and since most of you are developers, I thought it might be worth trying to do a little blatant recruiting :)
If you are an exceptional, passionate front end developer (HTML, CSS, JS) and you want to work in an awesome SCRUM team at a huge multinational company in the South of the Netherlands, please drop me a line (DM my Twitter account).
There are also opportunities for developers (front and/or back end) and UNIX gurus at another brilliant company (Competa) in the Randstad. Basically, if you love tech and you're looking for work in Holland, get in touch!

[UPDATE]
This code isn't meant to do anything - it's purely symbolic.
And yes, I know it will cause a stack overflow if you run it - that's the point that I die, "run out" of memory or suffer some other system failure. Clearly I'm not immortal, so there needs to be some end to the recursion eventually :)

(function(){var k=[];return function j(){k.push(i);j();}})()();

That's what I got tattooed on my forearm last week. Reactions have ranged from incredulity to hilarity, but I love it.

So why did I decide to spend the rest of my life with an obscure snippet of JavaScript on my body? Well, because I wanted a tattoo that meant something to me, not anyone else. I wanted something linked to my work and my passion: web development. And I wanted something no one else would have.

I briefly Googled "developer tattoos" and "programmer tattoos" looking for inspiration, but the only good thing that came up was the (admittedly brilliant) </head> <body> tattoo that you've doubtless already seen:

head-body-tattoo

ingenious

Having been let down by the Interwebs, I thought "how better to commemorate my love for code than in code?".

The obvious choice of language was JavaScript. It's the language I've been using the longest (although I've only been seriously into it for the past year or so since I got to work on JigLibJS). JavaScript is also one of core foundations of the web, and looking at recent developments that's not likely to change anytime soon. Also, it's an open standard, which is what I believe the web should be all about.

So, what should I say with my code? I decided I wanted something to remind me of the values and philosophies I strive to apply every day in my work, and in my life.

(function(){var k=[];return function j(){k.push(i);j();}})()();

This code structure is called a closure. If you don't know what a closure is, you can read about it here: via Wikipedia. The short version: it's a function that returns another function. The returned function has access to anything created in the scope of the parent function - just like private class members in full blown object oriented languages like C# or Java. I decided to go for this structure for 2 reasons: firstly because I find it very beautiful, and secondly because I wanted the code to support growth or accumulation in some way.

(function(){var k=[];return function j(){k.push(i);j();}})()();

The k array represents knowledge or experience.

(function(){var k=[];return function j(){k.push(i);j();}})()();

The function j returned by the closure is recursive. This is to remind me that I should maintain my own drive and motivation - that I should always expect more of myself.

(function(){var k=[];return function j(){k.push(i);j();}})()();

On every call, the function j attempts to add the contents of variable i out of the global scope to the enclosed array k. The eagle eyed will notice that I have not included a safety check here so that if i is undefined, the code will error out and the recursion of j will fail. This is intentional. The variable i represents input from other people, and I want to remember that I should always seek the advice and opinions of those around me. I know that I cannot grow in isolation, hence the catastrophic consequences of failing to garner the contributions of others. As I mentioned above, the k array represents knowledge or experience, and this part of the code also reminds me that I should always learn from the input I elicit. This doesn't mean to say that I should always accept or act upon advice I receive, just that I should learn from it. Even poor opinions can teach us a lot about the people who offer them ;)

(function(){var k=[];return function j(){k.push(i);j();}})()();

Both the closure and the returned function j are self invoking. That means that the code will run itself: the functions do not need to be invoked from elsewhere. This is to remind me that I should take the initiative in my life and work, not rely on external influences for the impetus to start new things.

So, that's it. Every time I look at my arm I will be reminded of the values that are important to me, and of my love for code.

Much better than some Chinese characters that may or may not mean "luck" or "strength" I think, and every bit as cryptic.

My new tattoo

I wear my geek-ness with pride

Posted in Uncategorized | 77 Comments

IE, images and labels

Internet Explorer doesn't handle clicks on images in labels:

<label for="someCheckbox"> 
<input name="someCheckbox" type="checkbox" />
<img src="aPrettyPicture.png" />
</label>

So, I did a quick Google to see how others have solved this issue, and the first hit was this site which included this reader-submitted jQuery solution:

$("label img").live("click", function() {
	$("#" + $(this).parents("label").attr("for")).click();
});

This solution was pretty buggy for me (required double clicks on the images) and uses jQuery.live() which seems overkill to me since the problem presented in the original article does not specify a need to support dynamically added labels. Also, use of jQuery.live() can be considered inadvisable, especially if it's not actually necessary to achieve the required behaviour. Finally, I didn't understand why the code didn't just select the image's direct parent.

So, I settled on this simplified version which works perfectly for me:

$("label img").bind("click", function() {
	$(this).parent().click();
});

Posted in JavaScript | Leave a comment

Can Google see JavaScript content?

I made this simple page to test if Googlebot can parse content loaded or generated via JavaScript.

There are two divs on the page - one has it's content loaded via AJAX using jQuery.load() and the other using jQuery.html().

[update] I have added an extra content block whose AJAX request is triggered by a link in case Googlebot treats onload JS differently to onclick.

I then used Google's Fetch as Googlebot tool to see if the content would be visible during spidering.

This is how Googlebot saw the page:

HTTP/1.1 200 OK
Content-Length: 639
Content-Type: text/html
Content-Location: http://www.sangwine.net/js_seo_poc/index.html
Last-Modified: Thu, 14 Jul 2011 17:53:30 GMT
Accept-Ranges: bytes
ETag: W/"ec7d4f14e42cc1:7d83e"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Thu, 14 Jul 2011 17:54:16 GMT
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
	<title>Sample Title</title>
	<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
	<script type="text/javascript" src="script.js"></script>
</head>
 
<body>
<h1>simple AJAX content loading (jQuery.load();):</h1>
<div id="contentBlock1"></div>
<h1>Dynamically built content:</h1>
<div id="contentBlock2"></div>
 
</body>
</html>

So, it would seem that Google cannot spider content created after the original HTTP response.

I will be reviewing how Google really spiders my test page in a day or two to confirm if the "Fetch as Googlebot" tool is really accurate.

If anyone can shed any light on techniques for writing SEO client-side dynamic content, please shout out in the comments!

Posted in Code Snippets, JavaScript | Tagged , , | 2 Comments

MacBook Pro SSD Upgrade: is it worth it?

I've been trying to find ways to make my late 2008 unibody MacBook Pro run faster because I want to hold out on upgrading at least until the end of the year, and preferably after the next range refresh.

I run a lot of applications simultaneously, especially at work. I also use Windows virtual machines a lot for cross-browser testing (I'm a web developer), and so a lot of my day is spent waiting for stuff to load.

I also run a lot of persistent menubar widgets for everything from managing my VPN connections to quickly accessing my code snippets:

My menubar

My menubar

The first step was to up my RAM to 6Gb (Apple says it will only take 4, but 6 has been found to be the real stable maximum by the community). This helped a little, especially when running VM's, but I still found myself spending way too much time on the Apple site with my cursor hovering over the buy button for the 17 inch i7.

The next obvious upgrade was an SSD drive, and after seeing this video I decided to take the plunge:

After quite a bit of research I settled on the 240Gb OCZ Vertex 2 as my drive of choice. Big enough to not need a second internal drive (I didn't want to trade the increased battery drain and heat for extra space) but not so big as to break the bank. It still wasn't cheap (£285 GBP / ~ €325 EUR from Amazon UK), but having installed it this morning and used it at work for a day, I have to say it was money well spent!

In fact the results are nothing short of stunning. I will never go back to rotational media again for my main workhorse machine.
I put together a series of tests while I was waiting for the drive to turn up so I could empirically compare it with my old 5200rpm stock drive.

First, the specs of my system and the two drives:

My late 2008 unibody MacBook Pro specs

My late 2008 unibody MacBook Pro specs

my original 320Gb 5400RPM hdd

my original hard drive

OCZ Vertex 2 SSD specs

OCZ Vertex 2 SSD specs


cold boot test

HDD:
Dock appears: 1:20
Desktop loads: 1:40
Finder and menubar loaded: 2:10

SSD:
Dock appears: 0:30
Desktop loads: 0:31
Finder and menubar loaded: 0:36


Multiple application loading test

I made a simple AppleScript that loads a selection of my most commonly used work apps: Photoshop CS5, iTerm2, CSSEdit, Espresso, Versions, EclipseJEE and Firefox.

HDD: 1:15
SSD: ~ 14 seconds


grep test

I recursively grepped for "wp" in the root of a WordPress site

grep -ri "wp*" ./

HDD: ~ 9 seconds
SSD: ~ 5 seconds


tar test

I timed how long it took to tar up a joomla application (5283 files, 69.2Mb) from the commandline.

tar -cvf testdump.tar sangwine.net_2010

HDD: ~ 13 seconds
SDD: ~ 5 seconds


XBench test

XBench results with the original hdd

XBench results with the original hdd

OCZ Vertex 2 SSD XBench results

OCZ Vertex 2 SSD XBench results


The test results really don't convey the feeling of working on a system that loads applications and accesses data so fast.

To put it in perspective, here are a few application load times I am getting with the new SSD drive:

  • Mac Mail: < 1 second
  • Outlook 2011: ~ 2 seconds
  • Windows XP VM running under Parallels: ~ 30 seconds

I downloaded a tarball earlier today, and Archiver unpacked it so quickly that it didn't even get a chance render to the screen.

If you are considering making the switch, I highly recommend it.

Posted in Hardware | 3 Comments

Really? A glory hole?

I have just encountered my first (and probably last) video game glory hole. And not just any glory hole... one surrounded by graffiti depicting a woman (the hole is in her mouth) along with the words "yum" and "slurp".

And yes, it's interactive.

What game hero would dare openly use a glory hole? Why Duke Nukem of course!

What is less Duke-ish is the fact that when you peek through the hole it is a man you see sitting in the neighboring stall, although the voice is a woman's. Bizarre. Is this some kind of hidden hint that Duke's bread is buttered on both sides, or just another symptom of an incomplete game?

Regardless, it kind of puts GTA San Andreas' infamous hot coffee mod in perspective.

Posted in Games | 1 Comment

if this then that

ifttt.com - short for if this then that - is a web app I am pretty excited about.

They are still in BETA, but already looking absolutely fantastic.

The concept is simple but ingenious - you can trigger actions from and in the web apps you use every day... actually this is harder to explain than I thought. Let me give an example.

ifttt has channels - essentially these are things that can either trigger or carry out actions. For example, time can be a trigger, as can a tweet. Likewise, web apps can perform actions like posting to Facebook, or adding bookmarks to Delicious.

The ifttt BETA channels

The ifttt BETA channels. The ones in colour are the ones I have enabled in my account.

So, for a simple test I set up two actions. First, when I post a link via my Twitter account, I have ifttt automatically add it to my pinboard account. Then I added a second action that duplicates links into my ZooTool account whenever they are added to my pinboard.

My first two ifttt tasks

My first two ifttt tasks.

Seriously cool huh?

This is the most original, and definitely the most useful idea for a web app I have seen in a long time. I really hope these guys succeed in getting the attention and userbase they deserve. I for one will be more than happy to sign up for any paid service they introduce after they go public.

I got my BETA invite by signing up on their site, and I have 5 more to give out - let me know in the comments if you want one.

Posted in Apps | Leave a comment