Kevin Carmody: machines, media & miscellanea

Elsewhere: Mastodon, Github, Email

Twon - many browsers light cycles

Last year’s jQuery conf was sponsored by BlackBerry and they gave away playbooks, loads of ‘em. This gave us an idea. Why not a game that ran across many of them? So we made a game that you can host and have multiple players join with their own device. You can also attach multiple screen together using hot areas so you can play across browsers across multiple computers. We called this game Twon… cause it’s kinda like Tron… kinda.

Naturally, the tech of choice was Node.js based sockets using Express. This allows some easy subscriptions to events across multiple devices.

Setting up the game is real easy. You can download the source at, run npm install and then fire node app.js at it and you’ve got the Twon server up and running. Then, just visit the host machine with a few other browsers. You’ll see in the /public folder of the repo which pages to visit depending on what you’d like the browser to act as. We find projectors are great as arenas and mobiles as controllers.

Have fun!

Fukushima - The issues, in 'layman terms'

Trying to disseminate information from the news about what's going on at the Fukushima plant in Japan in the aftermath of their recent earthquake and subsequent tsunami is a tricky business. BBC is all about pictures of explosions and worried looking people in paper masks. Sometimes it's interesting to have a little more detail about what trouble they may be having in managing a nuclear fission plant in a critical state. Well as it turns out, I know a nuclear engineer who was kind enough to give me a summary.

Virtualbox Ubuntu Fullscreen Second/Dual Monitor

Virtualbox is an awesome application, allowing you to run multiple instances of operating systems concurrently. But getting full screen guest working on the second monitor doesn’t work by default, it always fullscreens on the primary. This drove me mad for a couple of hours till I figured it out. The answer is through the following steps:

  • Fullscreen (Host+F)
  • Hidden Menu (Host+Home. This only works in full screen)
  • View>Virtual Screen 1>Use Host Screen 2

Voila. Simple once you know.

Eclipse PyDev on Ubuntu

I had a bit of a moment earlier in getting PyDev up and running in Eclipse. Installing is easy enough through Marketplace in Helios, but when I went to open a project I was denied! Anyway, figured it out, just needed to select my interpreter.

When you go to open a new python project hit the ‘Please configure an interpreter..’ link. Then click the Auto Config button. Ok. Apply. Ok. I’m on Ubuntu Lucid 10.04 so my grammar is 2.6 (you can find your version in the terminal via:$ python –version ). Your interpreter is Python. Finish. And you’re done :)

dConstruct 2010 - Brendan Dawes - Boil, Simmer, Reduce

Another dConstruct2010 post, this time: Brendan Dawes - Boil, Simmer, Reduce

Brendan didn’t really have as structured a talk, and one wonders if perhaps he relied more on gimmicks in his slides than the message he was trying to convey. The method he calls ‘Boil, Simmer, Reduce’ is basically his three part plan in creating a product. Frankly it seems a very logical, if not slightly fluffy minded way to work.

Boil This is basically filling your head with stuff. So it’s just about throwing anything and everything in to the ideas pot. When you embark on a development process you are already indirectly thinking about it all the time, whether you are watching a film, reading a fictional book or just contemplating the meaning of life. The premise is just to be grabbing ideas from all over the place and throwing them all in.

He also pointed out when discussing shots from films he likes that symmetry in itself makes things pretty.

Simmer This is looking at all considerations of what you want. It is important that you’re not considering technical restrictions, but rather getting down to the nub of what you’d like to do. As with the Boil stage, there are no rules, you can really just do whatever you like.

Around this point Brendan suggested that good design can breed good behaviour. He spoke of work he did for a tourist information office using Microsoft Surface as a map display. There were discs which they would place on the surface which would represent hotels, and by placing that on the map it would create a ring around that item with dots showing where the hotels are in that surrounding area. By turning the disc it would amplify the area of interest. This was in Manchester and it was quite a rough area of the centre of town - “a high proportion of scallies”. The place was concerned that the discs would get stolen. But it was a beautiful space that they created through design, and nothing was stolen. He argued that this proved his belief that “good design can bring good behaviour”.

Reduce “A design is finished when there is nothing left to take away”. Take the iPhone. It’s such a simple design, one button, an absolute minimum and it’s the sort of thing where anything can be placed on it. It can be anything you want it to be.

You should justify everything shown on a screen. This doesn’t necessarily mean that everything must serve a purposeful action. His favourite thing about the iPhone was that when you scroll up and get to the top, it creates a little bit of space with nothing underneath which simply springs back when you let go. This doesn’t really serve a purpose, bar perhaps a small mental indicator. It is just a little piece of aesthetic satisfaction. It’s just nice. That in itself can justify the feature.

He talked a bit about how he made something for the iPhone which was born out of a need. He wanted to watch a film on a train journey and couldn’t get his iPhone to sit in a good position, so he made a simple piece of cardboard that evening that would just clip onto the side. They thought it was sell-able and went through a few iterations. There was one which was so close to being right but it just wasn’t quite there. They then decided to apply Da Vinci’s Golden Ratio to the position of the cut in the rectangle. That was it. Fixed.

He also mentioned how he thinks the pencil is absolutely wonderful in design. A few of reasons he mentioned were:

1) It has a big arrow pointing to which end you use. 2) Built-in progress bar. 3) You can cut it up, and make many more of the same with it.

New ideas like this still apply to the old and best designed products.

Barcamp Not For Profit Oxford

On Saturday 20th Nov I spent the best part of the day at Barcamp Non-Profits (NFP) at the Oxford University Club. This was my first Barcamp, so I was interested to see how the event and it’s organisation was to unfold. For the uninitiated a Barcamp, often called an unconference, is as the name would suggest an ad hoc organised conference. A timetable of slots is offered and people simply add their name to a box in order to host a talk.

Barcamp Non-Profit timetable

I went to four talks on four very topics, which is perhaps a little surprising considering the focus of the day: Non Profits and Tech engagement

Social Monitoring

This was a two part talk with the focus being on monitoring information within social media. This could take the form of following discussion on a topic relevant to a charity’s engagement, or could equally be applied to monitoring a brand activity. I noted two tools in the first half which I thought could be of use. The first was Social Mention, which is best used for tracking social sentiment on the various social networks (Twitter, et al). The second was Board Tracker, which can be used for checking various forums for keyword mentions. There was also discussion of using the advanced mode of Google search. The second half was a brief discussion of a theoretical Twitter filter that would allow someone to summarise the important points of conversation using an quasi-AI approach. The interested parties of which broke of into a group to discuss the implementation of the project.


This was a talk given by my boss Dave Fletcher. I was involved in the projects inception at the Jailbrake weekend hosted by Social Innovation Camp, so I was very interested to see how the project had progressed. I was pleased to hear that even after talks with various authorities and forthcoming pilot runs, the project had retained its original good ideas; to get friends to help you identify your key skills in a structured and playful format which will hopefully aid you in gaining employment. This is such a promising project and I feel really proud for even the small part that I played in its creation.

Giving What We Can

Well this talk absolutely blew me away. It was one of those ones that starts interesting and makes you chuckle and finishes with you feeling shocked at what you’ve learnt. The presenter, Toby Ord, has actually appeared in various mainstream media publications discussing his project, but as he readily pointed out, it isn’t a message designed for the 140char social conversation. I think it would be difficult for me to do him justice. This is a man who has such belief in the difference he can make to so many peoples lives that he is pledging to donate a significant portion of his income for the rest of his life. His argument is convincing and I sincerely hope you will visit his site, and take the time to read what he has to say.

Music, The Ultimate Non Profit

The last talk I went to was actually more for fun than engagement, but considering my rock background I really can’t be blamed :) This was Ben Walker of Twitter song fame discussing his life as a niche geek semi-celebrity. Fun and quirky.


All in all, I had really fun and interesting time. I will certainly be going to another Barcamp at my next chance. Barcamp Non-Profits will be coming back, perhaps in spring and probably in London next time. You can find out more by going to or by following them on Twitter @barcampnfp. If you get the chance make sure you go.

dConstruct 2010 - Marty Neumeier - The Designful Company

The theme of dConstruct 2010 was Design & Creativity.

Marty Neumeier - The Designful Company

As I’m sure you can imagine, I only made some quick notes as I was listening to the talk, so what you will find here is an amalgamation of the talk and my own thoughts. Please do not consider this as their words or even mine.

I don’t know much about any of the dConstruct speakers - Marty from first appearance was a middle aged gentleman, smart with suit jacket, jeans and shoes.  This seemed to be a common style amongst the new media gang. Fashion aside, Marty’s talk was a discussion on branding and getting a good product within a brand. To this end he reference many tech business luminaries, though like most people there he was an Apple-afficianado. For example, he was fond of a particular Steve Jobs anecdote. ‘After a marked increase in sales, Jobs was asked “how do you intend to keep this up?” To which he replied: “we intend to keep innovating”’. Marty had a theme which he both uses as his opener and closer, very neatly done too, and it is simply this: “If you wanna innovate, you gotta design”.

Marty’s assertion was that Harvard business school teaches by case study, solving problems by looking how they have been solved previously. This is counter to successful tech businesses and brands, as is testament with Jobs’ statement of the importance of innovation.

So he talked about what really gets a product there is where you need to be designing, on that edge between radical and useful, those differences between what’s good and different. He talks about that traditional style brand-development where to go for something different is a risk, and many a CEO wouldn’t take that risk. The problem is if you don’t take that risk, there is a good chance of the brand dropping into obscurity. Consider the ubiquity of swoosh logos and then globe logos and how their commonness means the brand becomes unmemorable.

So, what are some of the most successful brands and how does one get there? Marty presents a path to follow in brand development where you have the vision at one end of the scale, and the product at the other end of the scale. He suggests that to be successful you’ve got to get from one end of that scale to the other. The path to follow has three stages: knowing, making and doing. It is to this end that you need a clear visionary that can manage these stages. One needs a leader who can picture the goal, has the resources available to build the product and impetus to actually put this together without diluting the vision or compromising on the product development.

Marty also talked about how business is speeding up…  I’ll be honest, I’m doubtful, I feel this is a cliche statement that many people make based on regurgitation. Still, he made a fair point and one that is difficult to dispute, but it could do with some kind of citation. “There are now more financial transactions in one day than the whole of 1965”.

So, what do consumers want? Well, we’ve always said these things: Pick two; good, cheap or fast. What he pointed out though, is that consumers have a new demand, they want free, perfect, now. So if you want your product to be successful you’ve got to give it everything. Let’s be honest, this is something we expect when one considers products like Google docs.  He then pointed out that just to be free, perfect and now isn’t necessarily enough! In an ever-cluttered market place you have to be really different, not just a little bit different, but really different. He talked about how we organise information in our mind using categories and compartmentalisation. So what you’re ideally looking for in a product is to get it in one of those compartments by itself.  So take the example of a smart phone - you want to have your product there by itself, like the iPhone, which for some time everyone thought of as the only smart phone. A successful brand is a walled category.

Historically, to make your product a successful one you would have started with factories. By having factories you can product more than anyone else, you can supply for the demand, you’d be at an advantage. When others realised this and everyone built factories, the next step was to get the most capital, allowing you to buy out the competition. After capital was patents. Patents were a means of securing your market. Of course they can only work for so long. So the final stage is where we are at now, brands. This saves a certain amount of process because in people’s own minds they will compartmentalise and protect your brand for you as a consumer. So, to summarise, we are talking about how in the past it was very much physical - factories and a physical present which keeps your product dominant in the market, whereas now it’s a mental thing within the mind of the consumer.

If a brand is good and different, it’s a gut feeling. Your brand is what the consumer says it is and for you to stand out, that’s where you have to be really different. Example - if we have Nike, do we need Reebok? Do we need Wimpy if we have McDonald’s?  A brand has to be truly radical and good, which is indeed a big risk.

I think in all the Apple-loving I heard on this day there is a tech brand that is more ubiquitous than iProducts will ever be: Linux. How different is that? Totally radical, and it’s everywhere. Just my 2p.

Marty presented a scale with which to measure brand success using the variables of good versus different on the z and y axes. He believed a brand generally fell into one of four sectors:

1) good, not different - common, does well in tests, and at first sales, but never really dominates its market. 2) good and different - this is the sweet spot. Often does poorly in tests, which means if often won’t get to market, slow in market, but customers will in time equate the weirdness to good : and eventually it will take a dominant position in the market. Example: Aeron chairs. (btw, I love Aeron chairs :) 3) not good and different - won’t do well in tests, and won’t be successful, people will equate weird to bad. 4) not good and not different - you just don’t want to be here, do you? But, this one often does well in tests because it’s not different, so it’s familiar to people. But it doesn’t challenge.  A surprising amount of products sit here, like Gillette fusion razors. Five blades. Five. Whoop-de-doop. Not exactly going to dominate the market.

As your brand visionary leader man, there are four key things you need: 1) empathy 2) intuition 3) experience 4) judgement

Let’s finish how Marty did. If you wanna innovate, you gotta design.

Fixing Eclipse ctrl+click Problem

Sometimes, for no clear reason, Eclipse’s ctrl+click function to find a methods source fails. This bugs the hell out of me, but is simple enough to fix. Unfortunately it doesn’t happen often enough for me to remember how to fix. And having to search each time with ‘just right’ keywords is also annoying. Anyway, here it is:

Close Eclipse.

Delete:  /path/to/workplace/.metadata/.plugins/org.eclipse.jdt.core

Open eclipse and let it rebuild its indexes. Job done.

All the latest updates

I’ve had many jobs. My full CV is unprintable in a comfortable digest. Though all were useful in their own way, it was still a means to an end. Rock superstardom… so four years ago I decided to retool in what was then a time devouring hobby. So far, things have been going pretty well. I got a decent degree and have had two awesome jobs in a row, the second of which I still happily work at (whiteoctober).

I’ve been keeping my head down for some time now. I’ve really been wanting to get good at what I’m doing before I start to think of other things. But I’m happy to say that recently I’m starting to ‘get it’ with many of the techs that I’m using. I know I still have sooo much to learn, but it’s a good feeling to be making progress.

Oh yeah, I use Ubuntu for both work and play now. Good times :)

Hmm, what else is new… I move in a couple of weeks, to a place in Headington. At the moment there are five of us living in a four bedroom house in East Oxford. It’s fun and communal and all, but I’m really looking forward to moving in with just myself and Emily. You should check her blog by the way:

Actually, I think that’s it for now. Take care.

PHP Script for RSS auto-discovery and OPML file generation

Hey All,

I recently got a reasonable size list of blog URLs. What I wanted was to import all these into a feed reader (via OPML). There seemed to be a lack of conversion scripts for batch URL->find RSS link->feed reader import file (I may be wrong, please let me know if I am :), so I made one in PHP. I guess this is like an automatic-blogroller. I have just used this as a command line script, I’m not recommending you use this in ‘the wild’ as one might say, I have made little concession to security as I had a trusted list of URLs.

There are basically three steps to this

  1. Take an input file of newline seperated URLs, in my case blogs.
  2. Find (auto-discover) associated RSS feed of each blog URL
  3. Output an OPML file that you can use to import into a feed reader What it does:
  • Takes a well formed list of newline separated URLs of blogs and turns it into an OPML
  • If the URL source doesn’t contain a <link> to an RSS feed in the head it doesn’t add it to the OPML
  • Detects the <title> and adds that to the OPML text field, or uses the URL if <title> isn’t present What it doesn’t:

  • Check the RSS feed is validated XML
  • Any other checking really :)
  • Come with any sort of warranty/guarantee Some of the key functions are from Keith Devens work. Thanks. Without any further ado, here is the script:
 * @author @skinofstars Kevin Carmody
 * GPLv3 -
 * this is really a command line app with no flags
 * for turning a bunch ofurls into an OPML file
 * 1.takes input file of newline seperated urls, normally blogs
 * 2.finds (autodiscovery) associated rss of each url
 * 3.outputs an OPML file for you to use in a feed reader

// file config

$inputFile = "/path/to/URLlist.txt";
$outputFile = "/path/to/blogroll.opml";

// OPML config

$opmlTitle = "Some Select Blogs";
$opmlOwnerName = "Kevin Carmody";
$opmlOwnerEmail = "";

/** no need to edit after this :) **/
$inHandle = @fopen($inputFile, "r");//read-only

$outHandle = @fopen($outputFile, "a");//append

if ($inHandle &amp;&amp; $outHandle) {
	$headerOut = opmlHeader($opmlTitle,$opmlOwnerName,$opmlOwnerEmail);

	while (!feof($inHandle)) {
		$buffer = fgets($inHandle, 4096);
		$source = getFile($buffer);
		$rssURL = getRSSLocation($source, $buffer);
		$rssTitle = htmlentities(getTitleAlt($source));
				$entryOut = opmlEntry($rssURL,$rssTitle);
			} else {
				$entryOut = opmlEntry($rssURL,$rssURL);
			//echo ".";//uncomment to print a dot to screen on each success, nice for seeing progress

		} else {
			echo "Fail on: ".$buffer;
	$footerOut = opmlFooter();

} else {
		echo 'not got a handle on input file: '.$inputFile."\n";
		echo 'not got a got handle on output file: '.$outputFile."\n";

echo "\nAll done :)\n";

 * basic opml header
 * @param string $opmlTitle
 * @param string $opmlOwnerName
 * @param string $opmlOwnerEmail
 * @return string
function opmlHeader($opmlTitle,$opmlOwnerName,$opmlOwnerEmail){
	$oheader = "&lt;?xml version=\"1.0\" encoding=\"ISO-8859-1\"?&gt;\n"
	."&lt;opml version=\"1.1\"&gt;\n"
	."	&lt;head&gt;\n"
	."		&lt;title&gt;".$opmlTitle."&lt;/title&gt;\n"
	."		&lt;dateCreated&gt;".date("r")."&lt;/dateCreated&gt;\n"
	."		&lt;ownerName&gt;".$opmlOwnerName."&lt;/ownerName&gt;\n"
	."		&lt;ownerEmail&gt;".$opmlOwnerEmail."&lt;/ownerEmail&gt;\n"
	."		&lt;/head&gt;\n"
	."	&lt;body&gt;\n";
	return $oheader;

 * just returns a test footer
 * @return string
function opmlFooter(){
	$ofooter = "  &lt;/body&gt;\n"
	return $ofooter;

 * creates an XML entry for the OPML file
 * @param string $feedURL
 * @param string $feedTitle
 * @return string
function opmlEntry($feedURL,$feedTitle){
	$outline = "    &lt;outline text=\"".$feedTitle."\" type=\"rss\" xmlUrl=\"".$feedURL."\"/&gt;\n";
	return $outline;

 * returns the page title extracted from source
 * @param string $html
 * @return string
function getTitleAlt($html) {
	if (preg_match('/&lt;title&gt;(.*?)&lt;\/title&gt;/is',$html,$found)) {
		$title = $found[1];
		return $title;
	} else {

 * public domain
function getFile($location){
	$ch = curl_init($location);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: close'));
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_TIMEOUT, 15);
	$response = curl_exec($ch);
	return $response;

 * public domain
function getRSSLocation($html, $location){
	if(!$html or !$location){
		return false;
		#search through the HTML, save all &lt;link&gt; tags

		# and store each link's attributes in an associative array

		preg_match_all('/&lt;link\s+(.*?)\s*\/?&gt;/si', $html, $matches);
		$links = $matches[1];
		$final_links = array();
		$link_count = count($links);
		for($n=0; $n&lt;$link_count; $n++){
			$attributes = preg_split('/\s+/s', $links[$n]);
			foreach($attributes as $attribute){
				$att = preg_split('/\s*=\s*/s', $attribute, 2);
					$att[1] = preg_replace('/([\'"]?)(.*)\1/', '$2', $att[1]);
					$final_link[strtolower($att[0])] = $att[1];
			$final_links[$n] = $final_link;
		#now figure out which one points to the RSS file

		for($n=0; $n&lt;$link_count; $n++){
			if(strtolower($final_links[$n]['rel']) == 'alternate'){
				if(strtolower($final_links[$n]['type']) == 'application/rss+xml'){
					$href = $final_links[$n]['href'];
				if(!$href and strtolower($final_links[$n]['type']) == 'text/xml'){
					#kludge to make the first version of this still work

					$href = $final_links[$n]['href'];
					if(strstr($href, "http://") !== false){ #if it's absolute

						$full_url = $href;
					}else{ #otherwise, 'absolutize' it

						$url_parts = parse_url($location);
						#only made it work for http:// links. Any problem with this?

						$full_url = "http://$url_parts[host]";
							$full_url .= ":$url_parts[port]";
						if($href{0} != '/'){ #it's a relative link on the domain

							$full_url .= dirname($url_parts['path']);
							if(substr($full_url, -1) != '/'){
								#if the last character isn't a '/', add it

								$full_url .= '/';
						$full_url .= $href;
					return $full_url;
		return false;

Though this was really a one time hit for me it may well be useful to others. Please let me know if you can think of ways to improve it and I will update accordingly.

Thanks, Kevin