• "In the 14 months since [TeamFortress 2] shipped, the PC version of the game has seen 63 updates – “that’s the frequency you want to be providing updates to your customers,” [Newell] adds. “You want to say, ‘We’ll get back to you every week. The degree to which you can engage your customer base in creating value for your other players” is key, says Newell. “When people say interesting or intelligent things about your product, it will translate directly into incremental revenue for the content provider.”" Great write-up from Chris Remo of Gabe Newell's DICE talk.
  • "This is a sort of thorough, empirical, sociological study of art students at two British art schools at a very interesting moment, the late 1960s (a moment when, as the book says, anti-art became the approved art, bringing all sorts of paradoxes to the fore). I find it fascinating that such a subjective thing as developing an art practice can be studied so objectively, but then I find it amazing that art can be taught at all. The book shows the tutors and students circling each other with wariness, coolness, misunderstanding, despair, appreciation." Some great anecdotes and observation.
  • "Busker Du (dial-up) is a recording service for buskers through the telephone (preferably public payphones hidden in subway stations). Audio recorded will be posted to this audio-blog and made available to all who cherish lo-fi original music. Try it out at your favorite subway station or street corner." Dial-A-Song comes full circle.
  • "Poole – HAL 9000 is a fictional chess game in the movie 2001: A Space Odyssey. In the movie, the astronaut Frank Poole is seen playing chess with the HAL 9000 supercomputer… The director Stanley Kubrick was a passionate chess player, so unlike many chess scenes shown in other films, the position and analysis actually makes sense. The actual game seems to come from Roesch – Schlage, Hamburg 1910, a tournament game between two lesser-known masters."
  • Lovely demo – some interesting interfaces that feel quicker than current alternatives, as well as experimental ones that, whilst slower and clumsier, represent information a bit better. I mainly like the form-factor, though – but what's the unit cost? These things get a lot better the more you have.
  • "Something like: Trying to create a reading list that gives the best introduction to everything. This may change." Phil is trying to collect the Good Books in many fields. It's an interesting project, for sure; it'll also be interesting to see how it pans out.
  • I was a little excited from the ongoing Offworld love in, but Oli Welsh's review suddenly makes me insanely excited about Keita Takahashi's new plaything. Why is it that all the reasons for me wanting a £300 PS3 are £3 PSN titles?
  • "…the biggest consequence [of a universal micro-USB adaptor] will be the ease of transferring data/content from street service provider to consumer, and consumer to consumer… There is a place at the edges of the internet where the level of friction makes content and data grind to a halt. It's largely unregulated. And it just got seriously lubed."
  • "30 Second Hero is an action RPG which consists of really short battles that require no interaction, as players race against the clock to save the kingdom from an evil wizard's wrath. As indicated by the title, you only have thirty seconds to level up your character sufficiently for the final battle, although additional time can be bought from the castle at the cost of a hundred gold pieces per increment of ten seconds." Hectic; the entire early JRPG genre (FF1, et al) condensed into a minute-long rush. Grinding as poetry.
  • "I was convinced that it was a spoof. As if there’d be a genre called Donk. Everything is wrong about the video. The knowing subtitles over subtle Northern Accents. The presenter’s slight grin when he’s chatting to folk. The funnily named shops. Everything. There’s no way I’m falling for a prank like that. It reminds me heavily of the episode of Brass Eye where they whang on about Cake (the made up drug). And all the characters and the interviews look like they could be setups or clever edits." But no, it's real. Iain Tait discovers Donk.
  • "…with that sad note from Sarinee Achavanuntakul, one of the most enduring (if illegal) tributes to gaming history came to an end." Home of the Underdogs is no more; just gone, like that. It wasn't that it had the best games or the worst games, or that they were illegal, or free; it was history, and childhood, and the smell of cardboard and boot disks, all wrapped up in one giant cathedral to Good Old Games. Most things I played on my old DOS machine were there. A shame; I hope they're elsewhere. This is why we need proper game archives.
  • Tweaking a game five months after launch to make it both more playable, and also more realistic; understanding that realism is key to NHL09 fans, and delivering on that as an ongoing promise.
  • "Warcraft’s success has always been substantially due to the extraordinary physicality of Azeroth, to the real sense of land transversed, of caves discovered, and of secrets shared. Players old and new bemoan the endless trudging that low-level travel requires, but it’s crucial for binding you to the world." Yes. Despite QuestHelper, I'm always in awe of the new areas. I just wish more people were playing the game as slowly and badly as me. Another beautiful One More Go, and one that resonates a lot right now.

Stripes and Surrealism: Playing with the Moo API

05 October 2008

Making things is fun. It’s satisfying to watch things spring forth from nothing, made by your own hands.

The greater the gap between your own capabilities (or your perception of them) and your output, the more satisfying – not to mention bemusing – the process is. That’s why Moo‘s public API is so exciting – using nothing but code, you can create real, physical, things. Imagine that! Objects you can hold that sprung forth out of bits and bytes.

I mentioned last week that I’d worked on extending Ruminant, a Ruby library for interfacing with Moo’s API, to also handle the creation of stickers. I wasn’t doing so purely out of generosity, though; I had a project up my sleeve that I wanted to work on.

I can now show you the results of that project. Why only now? Because now, I have the physical products in my hands. I think it’s really important with something like the Moo API that you only talk about what you’ve made when it’s actually real – no showing off code and saying “oh, they’ll be here soon“. You’ve got to make the things.

Anyhow: now I can tell you what I was up to.

moostickrs.jpg

These are two books of stickers, made from of my most recent photos on Flickr. They’re built by taking data from the Flickr API, processing it on my computer, uploading it to the web, and sending it to Moo’s API. This is a single shell command. You fill out a configuration file with the important details – such as your API keys for both Moo and Flickr – and run the file. A short while later, you’ll be asked to pay for your stickers, and off you go.

The fun part of this isn’t the whole one-step thing; it’s what goes on when we process the images. We don’t just print them straight, you see.

Another short aside: making real things out of code is fun because you don’t think it should be possible, and image-processing is actually similarly entertaining, just because it feels like it should be harder than it is. Most “easy” programming comes down to processing text in, and text out. Images seem like they should be harder. In fact, images are now much easier than they used to be thanks to things like GD and ImageMagick. I had a lot of fun playing with RMagick, and it wasn’t difficult at all.

So, what did I make?

dadist-moostickrs.jpg

The first are what I called Dadaist Photographs. Moo stickers are small; it’s quite hard to see a proper photo on their small dimensions. So why not make something at once very vague, and yet also entirely precise? That’s what these are. The background of the image is the average colour of the photo, determined by summing the red, green, and blue values of each pixel in the image, and then dividing each of those by the area of the image to get the average red, green, and blue values – and then making a colour out of those. In the foreground, we super-impose the title of the photograph in text. This is, as you can tell, somewhat silly. But! It’s a hyper-realistic single-pixel photograph, and ideal for Moo’s stickers. (A quick note – I didn’t quite add enough padding to the text on these. I’ve learned my lesson for next time).

Whilst I was working on that, I had another fun idea. It turned out to be just as easy to build, as it resuses most of the same code as the Dadaist Photographs. This let me abstract lots of things out, and at the same time learn how to write slightly tidier object-oriented Ruby. Anyhow, a short while later, and we had these:

stripy-moostickrs.jpg

These are less silly, and to my mind more beautiful – they render wonderfully on paper. They are very simple to make. First, we squash the photo down to being a 500×500 square. Then, we take the middle row of pixels in the image, and replace every row of pixels in the image with the middle row. The net result is essentially a “stretched” image, based on a single row from the image. RMagick made this very easy. Like I said, I think the results are very beautiful, and it’s amazing how easily identifiable they all are.

I wrote these by first creating the image processing code. That’s the stuff I was least familiar with, and took the longest to get my head around. Once that was done, it was relatively easy to bolt proper Flickr API import on (thanks to the Net::Flickr gem), and subsequently take my processed images and throw them directly at Moo’s API, thanks to Ruminant. A small amount of tidying, abstraction, and the creation of simple config files later, and we were done.

The only slight catch is that Moo need to get pictures from the public web. I’m running my script locally, because it’s quite processor/memory intensive, so the script SFTPs the pictures to a destination of your choosing before sending them to Moo.

But that’s it. It’s one click. It works most of the time (but with 90 images sometimes chokes a little; still, it’s not hard to salvage that by generating the XML for the order yourself). Because of the processor/memory overhead on rendering the images, I haven’t put this online as a web tool – I’m still thinking if there’s an easy way to do that. This could end up on EC2 one day.

What I’ve done instead is to put it on github, so you can at least see the code to learn from it, and, if you want, download and run your own copy. (If you’re not sure what to do: install git, and then click “clone” on the github page to get the command to type to clone the repository), I can’t guarantee it’ll work on your machine, and I can’t offer any support to help you get it running, but I hope you have fun with it regardless.

So there you go. First, an idea; then, the physical product; finally, the code that makes it all work. This doesn’t serve much real purpose, I’ll admit, but it was a fun making project, and it’s hugely satisfying to see how easy it is to make things out of pictures and paper with code, starting with a simple idea.

I’m not sure if I’ll take this any further – it stands alone quite nicely – but for starters, I’m going to see if I can extend Ruminant to handle other product types – though for various reasons, that might take a little while. If I do anything with it, you’ll hear it here first. In the meantime, I hope this serves as a little inspiration for how easy it is to make fun stuff with Moo, and perhaps that my silly, surreal stickers raised a smile.