Tate Trumps Anywhere

We're delighted to see another app we worked on last year has just launched: the new version of Tate Trumps by Hide & Seek and Tate Modern, Tate Trumps Anywhere.

tatetrumps.gif

The original Tate Trumps (which predates not only Digital Flapjack's involvement, but also Digital Flapjack!) was a game that you played whilst in the Tate Modern gallery, letting you pit artworks against one another using a fun card game mechanic. However, when you left Tate Modern, the game no longer worked, as you needed to key in the codes on the wall in the gallery to collect artworks.

In this new version, which we were honoured to be asked to work on, having been fans of the original, we've added the app's own artwork gallery, giving you a random selection of art from Tate's permanent collection each time you play, meaning you can play the game anywhere you like.

So if you fancy a game that's both fun to play and will let you explore a bit of Tate's collection, then over to the app store and get Tate Trumps.

A new year, a new look for PlaceWhisper.com

It's the new year, so time to release some things we've been working on for the last month or so - the new look PlaceWhisper website, and our new features: collections and embeddable maps.

When we first released PlaceWhisper 2 website back in August we enabled you to log in to the PlaceWhisper website and explore the things you'd created and collected on the web. However, it didn't add much to the experience of PlaceWhisper other than a larger canvas on which to view things. We said it was still being worked on, and here's the first fruits of that effort.

Welcome-to-PlaceWhisper!.png

The new look

The first cut of the PlaceWhisper website initially tried to pack too much in, then when we released we removed unfinished features, and it left a website that was functional, but didn't hang together quite right. So we've gone back and simplified and cleaned up the website, so now it's a lot more functional and practical.

When you log in you'll be presented with an event list of what's happening in your bit of PlaceWhisper: who's been collecting your Whispers, what your friends have been creating for you to find, and so on. From there you can find a map of everything you've created and collectioned, and view those things in detail, and from there share them with your friends via Facebook, Twitter, and Google Plus. You can now more readily manage your contacts and your own account too.

Collections

If you're a PlaceWhisper subscriber then you'll be able to create Collections - this is a new way to organise your Whispers. If you create a series of Whispers around a single theme, but they don't fit the notion of a trail, then you can put them together in a Collection. Collections will show up in the PlaceWhisper app's "what's local" menu, so they're a great way to get your content noticed by people, and people can then filter the PlaceWhisper app's view to just show the contents of a given collection.

Collections currently can only be managed and modified by you, but in the new year we'll be expanding that feature so that you can share your Collection with friends, and so you can build up the contents of a Collection as a team rather than as an individual.

Embedding your collections

One important new feature of collections is you can optionally turn them into a map that you and others can embed in your own website or blog. When you enable embedding for a collection, you'll be provided with the HTML code to place the map in another website. This map will then show all the Whispers in that Collection on the map, and people can click on the Whispers and read their contents.

This makes PlaceWhisper an excellent way to build up location content not just for mobile access, but also for the web.

Looking forward to the new year

2011 saw lots of development on PlaceWhisper, and we're really pleased with where we've got to, but there's still more to come. We hope you'll join us as we grow in 2012, but until then, we hope you have a merry festive period and new year!

Christmas treats from Hide & Seek

We're pleased to spot those nice folk over at Hide & Seek have made the iPhone version of their Boardgame Remix Kit, which we helped build, free for the xmas period!

bgrk.gif

The Boardgame Remix Kit provides a set of fun alternative rules for common boardgames, which make for an excellent way to pass the time over the festive period. No matter how many of you there are, what kind of mood you're in, or whether you want a quick game or a long one - there's bound to be a few games in there for you.

So as you prepare for family gatherings over this holiday, why not[head over to the app store and make sure you pack the Boardgame Remix Kit onto your phone?

Tickets 1.1 is out!

Tickets, our Lighthouse based issue tracking app for the iPad, has crept up to version 1.1. There's no new functionality in this release, but it does represent a big leap forward in terms of performance for those of you with large projects.

Having got functionality to where we wanted it in the first couple of releases, we went back to the networking and storage code and gave it a good going over to improve performance (Apple's amazing profiling tool, Instruments, was used in anger a lot!). Now even those with a number of really large projects are reporting that Tickets is as snappy as it is for those with just a few issues in their Lighthouse system. This means that no matter the size of your projects and the number of them, Tickets is the tool you need to keep track of things on your iPad.

So those of you with Tickets should go grab the update, and not and you're looking for a great way to manage your Lighthouse projects from your iPad, then head over to the app store now!

PlaceWhisper 2.2 update

Over the weekend PlaceWhisper 2.2 quietly slipped into the app store. It's a sort of mixed bag releases, with a number of small changes to different aspects of PlaceWhisper, so we thought we'd quickly run through them with you.

The most important tweak in the 2.2 update is to do with subscriptions. PlaceWhisper has a basic access level, which lets you collect as many Whispers as you want (or can!), and create a limited amount of content that you can only share to your followers; and a subscription level where you can both collect and create as many Whispers as you can. In 2.2 we've changed the following:

  • At the basic level the cap on the number of Whispers you can create resets each month
  • We've dropped the price of the monthly subscription to £0.69 a month
  • We've introduced an annual subscription level, priced at £6.99 a year

So now, if you don't want to subscribe but want to create more content, you just need to wait until the start of the next month and you'll be good to go again. But if you do want to subscribe, or already have, then these changes also make it easier to manage your subscription, thanks to the annual subscription option, and make subscribing to PlaceWhisper better value than before! If you've already subscripted, iTunes will automatically update to reflect the new price when your next billing period expires. If you want to switch from monthly to annual subscription, then you should cancel your current subscription, and when the current period expires, resubscribe.

Moving on from the subscriptions, another nice change in the 2.2 release is we've made it easier to try and find your friends. Not only can you still search for users based on user name or by comparison with your address book, you can now also find out who other people follow or are followed by, which is often a convenient way to find friends who are already signed up without having to search for each one. Finally, we adjusted the map to show more footpaths and fields, making it better for hunting down things in rural areas.

We said when we launched PlaceWhisper 2.0 back in August, it wasn't finished but rather the start of a journey, and the 2.2 release is a great example of the steps we're taking to helps us get PlaceWhisper to where we want it. And we're particularly pleased we managed to make the subscription model more workable for users. We're also trying to work in as much feedback as we can in each update, and we're always very grateful when you let us know how PlaceWhisper works for you. So if you have anything to share, or just want to say hello, why not drop us a line.

PlaceWhisper - more than a mobile app

lthough PlaceWhisper is first and foremost a mobile application designed to help you enrich and explore the world around you, there are some times you want to just see things on a bigger screen. To that end, PlaceWhisper the app has a sibling website over at http://placewhisper.com/, where you can quickly see the things you've created and collected on the web.

PlaceWhisper.png

The website lets you log in with the account details you entered in the mobile app, and from there gives you access to your content on the web. From within the website you can find a map view where you can find all your Whispers and Trails. You can access the text, images and audio on a particular Whisper, see when they were created, and how many times they've been discovered. As good as mobile map interfaces are, at times it's just quicker and easier to explore large amounts of data on a bigger screen, and that's what the PlaceWhisper website is there for.

If you'd like to display the Whispers and Trails you've created on a bigger map, then how about using the excellent Google Earth? From the PlaceWhisper website you can export all the content you've created into a KMZ file that can be loaded into Google Earth, which will preserve all your content, including images and audio, and trail paths.

You can also use the website to manage your contacts in PlaceWhisper, searching for people, seeing what they've created and collected of yours. You can also edit your own details and change your password.

So, although PlaceWhisper is primarily a mobile app, the website is there to help make it easier to access your PlaceWhisper content when away from the phone. And we're continuing to expand on the contents of the PlaceWhisper website all the time,  trying to make it ever more useful for you Whisperers out there, so keep an eye out for updates here on the blog about future updates.

Tickets made faster (in many ways)

It's been barely a week since the last update to Tickets, our iPad client for the Lighthouse issue tracking system, was released, and now here's another update already. Oh my!

The latest update, which goes under the catchy monicker of 1.0.2, is mostly a performance increase over the previous release; we put in a bunch of effort to optimise the processing of data as it comes in from the Lighthouse web server. In addition, we discovered a couple of visual elements which weren't as we meant them under iOS 5, and those are fixed in this release also.

mzl-1.acqbampf.480x480-75.jpg

The design of Tickets is that it should be usable whilst it's processing updates it's downloaded from Lighthouse - we don't want to stop you working whilst you wait for things to be downloaded and processed if you don't depend on those particular updates - so all the update processing is done in the background. However, if you had really big projects, then it'd start getting a little sluggish as things were processed in the background. In this update we've improved the data processing side of things, so Tickets is now much more responsive whilst that background processing is going on.

It was a bit of a pleasent surprise that this release came out so quickly after the last update. Typically it takes a week from submitting an update to the app store for it to pass through review and be released. Tickets 1.0.2 sailed under a lucky star, and made it through in half a day! Our many thanks to the superstar reviewer who shepparded Tickets on this release.

All of which is wonderful news, as the performance increases really make this a useful update, and we're delighted we can get it to users sooner than we anticipated. So head over to the app store and snag the update if you're already using Tickets, and if not, then why not treat yourself to one of the nicest/easiest/most beautiful way to keep track of your projects on your iPad by downloading Tickets today?

PlaceWhisper 2.1

We're happy to announce the PlaceWhisper 2.1 update is live in the app store, which fixes a bunch of issues for iOS 5, and incorporates a bunch of user interface improvements based on feedback from users, trying to make it easier to explore the world around you.

First up, we've changed the behaviour of the "centre on me" button, in the top right of the map. Before, if you tapped this button, the map would move to your location and a fixed zoom factor, but this meant if there were things intersting nearby they might be off your map.

In PlaceWhisper 2.1 tapping this now tries to position the map so that it shows you and any whispers that are within a kilometer or so. So if you want to find out if there's any collectable whispers nearby, or even ones you collected or created, then hitting center on me will quickly let you find out.

nearby_map.jpg

Secondly, we've tweaked the filter list to show you more details about what's in your local area. Now, for the "Everything" option and any collections, it tells you how many items are nearby, so you should immediately know if you're in a Whisper rich environment or not (and if not, perhaps it's your opportunity to correct that!).

If any trails pass nearby your current location, the list tells you how far it is to the next Whisper for you to collect on the trail and in what direction you should head to find that Whisper. Even if you're not close enough to see any of the points in your local map, you'll be aware of where you need to head to find the start.

nearby_filters.jpg

he final user focussed update is somethat that was in PlaceWhisper 1.0, but didn't make the cut in time for our 2.0 release, but we're pleased to reintroduce - when new users sign up for PlaceWhisper, the hyperintelligent PlaceWhisper server will drop a Whisper just for you near your current location, so new users always can find their first Whisper nearby, and the contents of that Whisper will tell you where to go to find your next one!

We're really grateful to all the feedback and encouragement we've received since PlaceWhisper 2.0 launched, and  here we managed to address some of the things people have asked for, and we'll be looking to keep tailoring the PlaceWhisper experience as feedback comes in, so if you have any thoughts, let us know by writing on our wall at Facebook, @ us on Twitter, or just drop us a line by email.

Mocking up

I typically use Balsamiq for doing UI mockups for iOS devices, but, although I like the output, at times the lack of native UI means I just end up frustrated as the app doesn't quite work the way I expected, causing me to fight it rather than just getting on with the job at hand.

So this week when producing some new mockups I tried something different and went with OmniGraffle and the excellent iPad and iPhone design stencil, and was quite pleased with the results. I used the outline stencils (as in the example below), and the result was clear, easy to understand, and doesn't falsely convey the notion of "complete design", which I think people tend to get if you give them something mocked up with actual graphical widgets.

example.png

If you like OmniGraffle, then it's well worth a go. That said, I find some things in OmniGraffle equally frustrating (like how it's paper size based, when nothing I'm going doing is going to remotely go near a printer), but it made a nice change, and now I have another approach I can use when Balsamiq's cartoony feel doesn't quite suit the project. A hat tip to Kim Plowright who I think was the first to point me at these templates a while back.

In a related note, I was pleased to see Teehan+Lax have produced a new version of their iOS/iPhone Photoshop templates, updated for iOS5 and the iPhone 4S. Lots of new stuff in there, like Notification Center, the new toggle widget, and so on. When it comes to building the UI for production, I always tend to start in Photoshop and not in code (assuming a designer hasn't already done this for me), and this template is just perfect for filling in stock components and providing a device frame to put everything in context (which is very important I feel). The hat is tipped once more to Matt Gemmell for alerting me to the update.

Some update updates

We just released a small fix to Tickets on the app store, which fixes a small locking issue that seemed to occur under iOS 5. So, if you're using Tickets and on the latest OS, then we strongly recommend snagging the update.

In other update news, work is apace on PlaceWhisper 2.1. There's a couple of iOS5 issues, but they're purely cosmetic and don't affect functionality, so rather than rush out an update just for that, we hope to submit the 2.1 update to the app store for approval this week which includes not just fixes for iOS5, but a whole bunch of things people have asked us for since 2.0 came out. Watch this space for more info soon!

The Story Behind Tickets

As a developer, every once in a while you go to find a piece of software to achieve some task or another only to discover it's missing - no one has yet made the thing you wanted. Typically you then resolve "I shall fix that need!", look at your pile of work that you need to do, and then add "...one day". So you add it to a little todo list of apps that you'll one day write.

But that list is important - as at some point you'll either find yourself with a little spare time, or just in need of a little project to work on to allow you to take a break from whatever you're meant to be doing. After a year of hammering on a particular project it can be good to just step away for a short period, do something completely different, and then come back with a fresh outlook and with some new skills and knowledge under your belt.

As I aluded to in my recent blog post, after almost a year of development on PlaceWhisper and still struggling to get it to where I wanted (i.e., to perfection), I started to find myself a little dulled. My enthusiasm wasn't at its peak, and I frankly just needed to step away for a little bit.

At that point I decided it was time to tackle a fresh project, but nothing too big that couldn't be wrapped up and shipped within a month or so. The aim was to learn some new things - there was a pile of cool bits of code I'd wanted to prod, and to force myself to try and design an app that didn't look like a native app but felt like a native app. So I reached for my todo list of apps, and selected one to work on.

And the results is Tickets, a little iPad app for developers that lets you access and manage the issue tracking webservice Lighthouse. Although there's the excellent Lighthouse Keeper for the Mac, and a couple of iPhone apps for accessing Lighthouse, no one had seemed to do one specifically for the iPad, which struck me as strange, as the iPad is a nice format for such a tool. It means your away from computer, so in a different frame of mind from where you might just accidently start coding rather than planning, and it's a better screen size for planning than the iPhone.

The development process was not my usual process, as this was as much an opportunity to learn as it was to build something. I went through a number of UI revisions with different interface libraries that I'd wanted to understand - initially it worked like the Twitter app, before being replaced with the current grid view interface, for example. After trying these new approaches, and having learned how they worked, I focussed on the one that felt most natural.

Visually it was also an experiment to play. I've no delusion that I'll ever be a top notch designer, but to understand how a design works and try and quantify what I like/dislike about designs it is useful to have at least tried myself. So Tickets was a playground for me to experiment at designing and the design process. In the end, after various iterations, it ended up with the ticket based visual motif it has today. The idea of trying to take a single metaphor throughout the app without straining it was the key here. Early designs tried to shoehorn the ticket metaphor into everything, but that didn't work. For instance, the ticket editing dialog originally looked like a ticket that you filled in, but that meant that there was too little space for actual content. It was a nice practical reminder that functionality comes first, and the theme, no matter how unifying, has to come second.

The end result of all this playing was an app that I now use day to day to keep up to date on my projects, and I hope others will find similarly useful. There's more I could add to it, but as I discussed in my recent post on shipping PlaceWhisper, it's important to draw a line at some point and get it out into people's hands. I was pleased to discover the design, which had been largely an experiment for me, received positive feedback from testers (along with some useful suggestions for tweaks too).

And, now with Tickets 1.0 in the app store, and after last week's re-evaluation of the why and what of what we do, I'm back on PlaceWhisper feeling refreshed and excited again, and the todo list goes back into the draw until next time.

Tickets

As is often the case, we have no releases for ages, and then two come out at once! We're pleased to announce Tickets, an iPad client for the excellent issue tracking webservice Lighthouse.

tickets-screenshots-for-website.gif

Tickets is a simple application that lets you keep track of and manage your project ticket list in Lighthouse from your iPad. Although you can use Lighthouse in the iPad's built in web browser, Tickets provides a more natural way to work, and by providing just a focussed subset of Lighthouse's many features, lets you concentrate on the things that matter day to day when delivering a project: being alerted to when tickets are updated, and letting you create and update tickets quickly.

You can:

  • View all the tickets for all your projects.
  • Filter ticket lists based on milestone, creator, assignee, and current state.
  • Create new tickets, and update existing ones.
  • View ticket attachments and web links in the app.
  • Use Tickets offline so you can review where things are up to even when you're away from the internet

We wrote Tickets to fill a need we found in our project management flow - and we hope that it'll fit into your development flow too, making it easier for you to keep on top of what's happening in your projects. Head over the the app store now and give it a go.

Creating a city guide for friends with PlaceWhisper

PlaceWhisper is designed to be a platform that puts you in control of creating your own located content experiences to share with others. There's a huge range of possibilities for what you could create, and over the next couple of weeks we're going to take a look at some examples of what you could create and share with your friends and the world using PlaceWhisper. First up - a personal guide to where you live.

Getting started

I'm going to create a guide to the city where I'm based, Cambridge. Cambridge is a somewhat famous University town just north of London, and my plan is to create a guide of things I think are interesting to guide your from the train station, which is how a lot of tourists get to Cambridge, into the city centre, via a bunch of interesting things. This hopefully will mean if I have friends who come to visit they can at least guide themselves from the train station to civilisation if I'm not available to pick them up immediately :)

So, how do we go about this?

The first thing is to get to the start of the tour that I want to create, thus to Cambridge rail station. Once here, I can fire up PlaceWhisper and create the first waypoint on my tour. This first point will have a bit of text explaining what the tour is about, and where it's going to take you.

So, step one - having got to the rail station - I load up PlaceWhisper on my phone, check that the GPS has me in the correct location, and then click the speech bubble icon in the top right of the screen to create my first Whisper. At this point I'll get the "Build Your Whisper" screen, like so:

tour1.jpg

The first thing I should remember at this point is by default PlaceWhisper will just make a single stand alone Whisper, but I want to make a trail, stringing together a bunch of Whispers. So, to do that I need to click the "Change" button next to the "Available to:" label - from here I can change who can see the Whisper I'm about to make, or alternatively, place it on a trail. I select the option to make a new trail, I give it a name, and opt to make it public to anyone can see it. I set the trail type to Tour - this means that when someone collects a point on my tour, the next point on the tour will be immediately added to their map, so they can easily follow the trail points one by one.

tour2.jpg

Once I click "Create Trail" I can go back to the "Build your Whisper" screen, and see that it's now set to add the Whisper to my new trail:

tour3.jpg

Now that the trail is set up, I can add the content I want to be at this location. I can add text, a picture, or some audio, or any combination of the three. Here I opt for text - although I could speak into the phone to record text, I'd just "um" and "ah" a lot, so I think text is right for me here. So I type in my introductory text like so:

tour3.5.jpg

Once I've got the words written, I click the "Submit" button, and my Whisper appears on my map! That's the first Whisper placed, so now it's time to set off on foot to the next point of interest on my tour.

Keeping going

As you build up a tour like this, it's important to try and keep in mind what it'll be like for people following your tour. As I want to make it easy for people to find their way without knowing Cambridge, I'm going to make a point at each major intersection along the way. Thankfully in Cambridge there's usually something interesting near by, so I can be liberal with my points of interest, so there's always something to read, but more importantly people will feel like they're being lead rather than abandoned.

So at the end of Station Road in Cambridge, where I need to guide people to turn right, I create another Whisper, and mention that the Botanic Gardens are just across the road, and that we'll turn right and head into town.

With the second point on our guide done, we can now see the trail start to build up on the PlaceWhisper map:

tour4.jpg

One thing to note there is that I've set the map filter in PlaceWhisper to show just my guide. This is usually something you do when following trails, to stop you being overwhelmed by other content in the area. But it's also something useful to do when creating your own content for exactly the same reason. You can access the filter options from the radar button in the bottom left of the screen.

As I head into the city centre, I keep stopping and creating Whispers where I think there's something interesting to see, or where I think I need a waypoint just to guide people. Quite soon, my trail starts to look quite nice:

tour5.jpg

Here I've stopped at the Scott Polar Institute, where they have an interesting museum that's open to the public.

At some of the locations I add a picture to the Whisper just to make sure the person following my trail knows exactly what I'm on about. If you're in a crowded environment like a city, and you're trying to describe a building of interest, then a picture can often help single out that one building better than a paragraph of text will. Or, in the case below, which of the cafe's famous cakes they should try!

tour6.jpg

The things I do to help guide people around Cambridge...

Wrapping it up

And that's all there is to it - I can keep adding points to my tour for as long as I want. In this case I ended up with a tour that was 16 points long, taking in some of the more famous bits of Cambridge, and nicely guiding people from the Train station to town.

montage.png

And that's all I have to do to create a digital guide to my town. Now anyone visiting Cambridge that has PlaceWhisper installed on their phone will be able to find the starting point for my tour at the Cambridge rail station, and then follow it. Here's the trail in full:

map.png

So, now you know how to create your own sharable tour guide using PlaceWhisper! You can create a historic guide to your village, or your own personal tour of the metropolis you live in. Once created, you can share them with your friends, or the world in general.

Welcoming PlaceWhisper 2

After much work over the last year, we're pleased to announce the launch of PlaceWhisper 2.

welcome.png

PlaceWhisper, for those of you who haven't used it before, is a mobile application that lets you place information such as pictures, audio, and text, in a physical location that can only be accessed by someone when they're in that self same physical location. Think of it like leaving chalk messages on the sidewalk for your friends to find when you were a kid, but without the chalk, and with lots more information than you could ever chalk onto the sidewalk. Whispers can be linked together to form trails, letting you structure a journey to guide people around areas both small and large.

There's lots of things you can do with PlaceWhisper - you're limited only by your imagination. You want to create a treasure hunt around your local park for your friends to find? Create a historic tour around your village for visitors? A tour around your favourite coffee shops? Leave reviews of restaurants right at the restaurant? PlaceWhisper can let you do all these things and more.

What's new?

map.png

When PlaceWhisper came out originally you were limited to leaving just short bits of text in your Whispers, and there was just one type of trail you could create. With PlaceWhisper 2 we've enhanced it so you can leave pictures and audio in addition to text in a particular location, and we've added two new trail types to make it easier to create games, tours, or whatever you want.

PlaceWhisper 2 is also much more sociable. In the original PlaceWhisper there was no way to share your creations, other than telling people to go hunt around a particular area and hope they remembered the right place. With PlaceWhisper 2 you can share links to your Whispers and Trails using email, Twitter, Facebook, or Delicious. When you access these links on your iPhone a pin will be added to your PlaceWhisper map, allowing you to easily find your friends' latest creations - but you'll still need to go there to find out what they put there!

Another useful new feature is the ability to filter what you see - if you're trying to find a particular thing in PlaceWhisper in an area with lots of content it can be overwhelming to find just the things you want on the map, so on the bottom left of the screen you'll find a filter button that tells you what's nearby and allow you focus just on that.

More than a mobile app

PlaceWhisper-1.png

Starting with PlaceWhisper 2 you can now examine everything you've created over on the PlaceWhisper website. From here you'll be able to quickly find everything you've created or collected, grab that sharable link, and manage your contacts. This is just the beginning of what the PlaceWhisper website can do - we've got lots of exciting new features in development for the website that we're not yet ready to reveal yet, so watch this space.

How much is all this?

The original PlaceWhisper was free for both collecting content and creating content, and for PlaceWhisper 2 we've had to revise that a little to help sustain PlaceWhisper.

Collecting content continues to be free, so when you create content there's no cost to those who access that content. This means you can create that game or village tour or whatever you want, and people can download PlaceWhisper 2 for free and access your creation without paying - there's no barrier to accessing the content that you create.

Similarly, if all you want to do is create a little trail around your local park for your friends, then you get a small amount of Whisper creation for free.

If you want to do more than that then you can sign up as a PlaceWhisper Pro user from in the application. This will let you create as many whispers as you like, use rich media in your Whispers, and make them public for everyone to find. A PlaceWhisper Pro subscription costs just £2.99 a month. The subscription, if you opt to sign up, is paid for in app using your iTunes account - making it easy for you to sign up and manage straight from the phone.

Whilst I'm sure it'll disappoint some that we're not longer offering everything for free, PlaceWhisper has to be funded someway to keep the servers going, and we feel is a better approach than placing advertising all over the map or in your Whispers. This way, you can be sure that people see what you want them to see, not what someone else has paid for them to see. That said, we really welcome your feedback on the topic, so drop us a line if you have any thoughts.

Just the (second) beginning

This we're hoping is just the beginning of PlaceWhisper's future. This launch is almost a total reworking of the original PlaceWhisper, but it's been designed with a lot of future ideas in mind, so you can look forward to new features coming online over the next few months, all of which we're really excited about over that the Digital Flapjack bakery. Our mission is to put you in control of location based content - so rather than just finding location based apps in the app store you can go create your own and share them with your friends and the world.

So, what are you waiting for? Head on over to the app store and start exploring a new way to interact with the world around you.

Taking stock

Today the Internet is mourning the loss of Steve Jobs, a great visionary, and someone who inspired many of us, myself included, in how we looked at technology and its relationship to the world. He certainly influenced how I've tried to develop products over the last half decade. But rather than dwell on the loss, the thing I'm taking from today is a reminder of why we do what we do, which I think I lost a little of over the last while, and today has been a reminder not only of that, but also that we don't get infinite goes.

It's almost been a year since I set up on my own to try and make something I thought was good and useful and people seemed to engage with. When I did the first version of PlaceWhisper I got some wonderful feedback and lots of encouragement, and I'd reached a place at Camvine where I'd achieved a lot and couldn't see a way to challenge myself further in that environment, so it was time to take a big jump and work for myself and try and grow PlaceWhisper into something that would enable lots of people to make the world of location their own.

In that time I've worked quite a lot, and I've shipped a bunch of products both for myself and for others, but the grand vision I had when I left was to ship a new version of PlaceWhisper, and on that I've not really delivered on.

It's quite hard to keep momentum going when you're a team of one. I did the classic 2.0 mistake of trying to cram in everything I thought was awesome into one release. So I worked and worked and it was never quite done. I've done some awesome stuff, but is it really that awesome if no one uses it? Having made my big risky jump to start on this path, I got trapped into thinking everything needs to be perfect before I can make a move. For me one of the poignant quotes that's been doing the rounds today is this one:

"Remembering that I'll be dead soon is the most important tool I've ever encountered to help me make the big choices in life. Because almost everything -- all external expectations, all pride, all fear of embarrassment or failure -- these things just fall away in the face of death, leaving only what is truly important. Remembering that you are going to die is the best way I know to avoid the trap of thinking you have something to lose. You are already naked. There is no reason not to follow your heart."

I succame to analysis paralysis, succame to fear of failure. So it's time to fix that.

PlaceWhisper 2 is coming out, as it stands today. It's been in the app store quietly for a little while, but I wasn't telling anyone as I'd not figured out the perfect announcement plan, whatever that might be.

Is it what I wanted it to be? No - there's lots more to do, and lots done that isn't in this release as it just needs some more polish. Is it much better than what went before? Hell yes. PlaceWhisper 2 does a lot more than version one ever did, and I'm proud of that. So despite it not being what I wanted to be, it's time to ship it, and put it in your hands. It's not perfect, but hopefully we can work together to make it so over time.

Sitting on something is good for no one, and today's events have helped me regain some focus on that, so thanks Steve.

Using TypeKit with Cappuccino

On one of the projects we're working on we're using Cappuccino for the more involved bits of the website, as it takes out a lot of the grunt work for building desktop caliber GUIs in a browser. The flip side is you're then left pondering how to tweak some bits of the Cappuccino interface to make it match the rest of your website.

One example of this is fonts. The project in question makes good use of TypeKit to provide nice fonts for the website. Normally with TypeKit you select the fonts you want to use and then specify a bunch of CSS selectors you want them to apply to. This is fine for regular HTML, but goes against the Cappuccino flow, where you essentially write your front end like you would a Mac app. In Cappuccino you should be writing code like this:

   label = [[CPTextField alloc] initWithFrame: CGRectMake(10, 142, 80, 24)];
   [label setStringValue: @"My nice label"];
   [label setFont: [CPFont boldFontWithName: @"Helvetica" size: 14.0]];
   [container addSubview: label];

I was all ready to hack a subclass of CPFont and get dirty with making it work with TypeKit when it turned out the solution was in fact very simple, and no hacking was required. Phew!

When you use CPFont the name provided essentially ends up the in the style attribute of the div created for the label. So, the underlying HTML looks like this:

   <div style="position: absolute; z-index: 200; font: normal normal bold 14px/normal Helvetica, Arial, sans-serif; 
    overflow-x: hidden; overflow-y: hidden; text-overflow: clip; white-space: pre; word-wrap: normal; 
    top: 0px; left: 0px; width: 76px; height: 20px; ">My nice label</div>

The first entry in the font list on that div is taken from the CPFont that we specified in our Objective-J. So, you can just put in any font name you like there, and as long as the browser can find it, it'll work out okay. However, if you look in TypeKit you'll see that as part of their copy protection mechanism they split individual fonts up into several sub-fonts. So, I'm using Ratio, but the actual font names used are "ratio-1" and "ratio-2". Fortunately, as CPFont just passes font name straight through to the underlying HTML, you can specify your fontname with both fonts in, like so:

   # globally declared constant to save on typing
   var PWSystemFont = @"ratio-1,ratio-2";
   label = [[CPTextField alloc] initWithFrame: CGRectMake(10, 22, 80, 24)];
   [label setStringValue: @"My nice label"];
   [label setFont: [CPFont boldFontWithName: PWSystemFont size: 14.0]];
   [container addSubview: label];

And that just works. Similarly, for any TypeKit font you just need to check for the CSS names used, which you can find in your kit editor by clicking the "Using fonts in CSS" link, which will show you the names like so:

Typekit CSS.png

The only other thing you need to do is put the embed code that TypeKit give you at the top of your Cappuccino app's root HTML file, and your Cappuccino apps will be looking beautiful before you know it.

Watch The Water

I'm really excited to announce there will be a bit of Digital Flapjack at the Edinburgh Art Festival this year, in the form of Watch The Water, an ambient audio work contemplating the gothic soul of the streets.

Watch The Water is a collaboration under the banner of Coney between Sophie Sampson, Annette Mees, Richard Hammarton, and ourselves, commissioned by Trigger allowing people to explore the creepier side of Edinburgh's past in and around the galleries of the Edinburgh Art Festival, and launches on the 20th August.

As an ex-resident of Edinburgh I'm hugely excited to have worked on something for the Edinburgh Festival - not something I could have dreamed of back then when I was mostly doing low-level circuit hacking. I've been very fortunate to work with Sophie once again and the rest of the Coney crew on this - the audio work is really amazing, I'm looking forward to hearing what you all thing of the experience! On of the aims when starting out in Digital Flapjack was to find projects that were in fields I'd not normally work on, and this has been a great example of that in action.

Similar to Time*Trails, the history game we ran on the South Bank earlier in the month which was also a collaboration between Sophie and me, Watch The Water is build on the new PlaceWhisper 2.0 platform, of which you'll be hearing a lot more in the coming months. But for now, if you're in Edinburgh for the festival (or indeed afterwards) then give Watch The Water a listen and let it guide you around the city, if you've looking for a platform on which to build your own location based app, then do drop us a line!

Come join us for fun and games

Last year, along with writer Sophie Sampson, we ran a fun little game at the Hide & Seek Weekender games festival on the South Bank, called Time*Trails.

time_trails_sign.jpg

Time*Trails let you explore the history of London's South Bank, finding geo-located bits of history. There were 50 random bits of history from the 1940s and 1950s, and a bunch of trails where you could follow characters from the past exploring the Festival of Britain. We had a nice scoreboard, and handed out stickers to people like these if you scored enough:

fruitbat.jpg

If you missed your chance to play it last year, then fear not, we're running it again at the upcoming Sandpit evening. The Sandpit will be on Thursday 4th August in the evening at Royal Festival Hall, and there'll be loads of different games to play in what promises to be a fun evening, so we hugely encourage you to come along and take part.

We'll be running Time*Trails again, this time with its own custom built iPhone app and a bunch of updated content, and are looking forward to sending people out to explore the local history. This year it's particularly pertinent, as it's the 60th anniversary year of the Festival of Britain, and you'll be able to get a feel for what it was like in the context of all the anniversary pomp that's spread over the South Bank today.

Hope to see you there!

Using nib2cib with Xcode 4

The general wisdom if you're using the excellent Cappuccino web framework is that you needed Xcode 3's Interface Builder (IB) to build xib files for use with Cappuccino. The reason being that in IB you could define the inlets and outlets on the controller class in the xib file. So Cappuccino could create you a template xib, you can open it up in IB, add the controls, define the inlets/outlets on the AppController class, and then save it all and run nib2cib to generate the cib file cappuccino will load.

Come Xcode 4, there is no longer an independent Interface Builder, it's all in the same IDE as your code. As such, to define inlets/outlets on a class you do that in code now, rather than in the integrated equivalent of IB. So all is lost - you can't just definite everything in a stand alone xib. At least, as a new comer to Cappuccino that's what I hear a lot of.

But it's not true - although the process is a bit messier, you can create Xib files in Xcode 4 and have them work with Cappuccino. All that you need is a little more effort. Here's the steps I've taken to demo this:

Step 1: Create the template code

Using the terminal, create a directory to hold both your cappuccino project and your Xcode 4 project you'll need to make:

% mkdir ProjDir
% cd ProjDir

Now create your Cappuccino project:

% capp gen -t NibApplication MyApp

In Xcode 3 world that'd be all you need to do, but in Xcode 4 world we need to have an Xcode 4 project in which to work with our xib file, so let's create a place for that:

% mkdir xcode4

The next step is to fire up Xcode 4, and create a new Mac OS X Cocoa Application project. So open Xcode 4, select File -> New -> New Project... and the select "Cocoa Application" under the Mac OS X section and click Next. Call the Product Name "MyApp", and turn off pretty much everything like Core Data and Unit Tests - you'll not be needing them, so why clutter our project? Once you've done that, click Next again. Now you'll be asked to pick a folder to save your project in - pick the xcode4 folder we created above, and click Create.

Now we've created all the templates we need, we need to do a little rewiring to make things work.

Step 2: Making links to make us happy

Now, both the cappuccino project and the Xcode 4 project have a xib file in them, but we only need one. My first approach was to remove one and start using links in the file system to have cappuccino reference the one in the xcode project, but between them nib2cib didn't like symbolic links and Xcode 4 defeated my hard links, so I resorted to copying the xib file into the right place each time and building it.

Go back to the terminal you had open (or if you closed it, go back to the ProjDir directory). Then find and remove the Cappuccino project's xib file:

% cd MyApp/Resources
% rm MainMenu.xib

Now each time you want to compile the xib into a cib file do this:

% cp ../../xcode4/MyApp/MyApp/en.lproj/MainMenu.xib .
% nib2cib

I've put this into a shell script to automate it. It's not pretty, but it works reliably. If you look in the Resources directory you should now see the newly generated cib file.

That's all the file system munging we need to do. From now on, whenever you update the xib file in Xcode 4, change into the ProjDir/MyApp/Resources directory and run nib2cib.

Step 3: Matching the app delegate class in Cappuccino and Xcode 4

The last bit of fiddling you need to do is in code. You need to make sure the application delegate class used in the xib has the same name in both Xcode 4 and your Cappuccino project, so that when the cib is loaded in Cappuccino the run time can find the right class. The easiest way to do this is just to rename the AppDelegate class in Cappuccino to match the one in Xcode 4.

If you look in Xcode 4 you'll see that the app delegate class there is called MyAppAppDelegate - copy that name and find AppController.j in your Cappuccino project, and then rename the AppController class to MyAppAppDelegate. You'll also need to rename the "theWindow" variable to match the outlet used in the xib, which has the name "window". The resulting class declaration should look a little like this:

    @implementation MyAppAppDelegate : CPObject
    {
        CPWindow    window; 
    }

You'll also find "theWindow" used otherwhere in the code, so make sure you correct those instances too.

And that should be it. If you remembered to run nib2cib earlier, you should just be able to open index.html and you'll find the app starts with a menu bar and empty window in it.

MyApp.png

I've commented out the setFullPlatformWindow: call in awakeFromCib: for that screen shot, so as to make it more obvious what's happening here.

Step 4: Making things more interesting

Now we want to add some more functionality to our app, so let's add a text field and button, and get them working in Cappuccino. To do this you're going to have to update both MyAppAppDelegate.h in Xcode 4 and AppController.j in Cappuccino to have the outlets you want. This is where in IB you'd have just added the inlets/outlets to the class in there, but in Xcode 4 you need to do it by hand. But the end result is the same.

Head over to Xcode 4, and add a NSTextField outlet and an IBAction handler to the MyAppAppController definition in the header file:

    #import <Cocoa/Cocoa.h>
    
    @interface MyAppAppDelegate : NSObject <NSApplicationDelegate> {
    @private
        NSWindow *window;
        NSTextField *textField;
    }
    
    @property (assign) IBOutlet NSWindow *window;
    @property (assign) IBOutlet NSTextField *textField;
    
    - (IBAction)buttonPressed: (id)sender;
    
    @end

Now click on MainMenu.xib, bring up the Window, and add your text field and a button. Once you've added them, link them to the respective inlet and outlet on the app delegate object, and make sure you've saved everything.

Having done that, we now need to rerun nib2cib. Go back to the terminal, make sure you're in the Resources directory, and rerun nib2cib.

Finally, let's make something happen in the Cappuccino work.

First, we need to add the text field outlet on our MyAppAppDelegate class, and the result should look a little like this:

   @implementation MyAppAppDelegate : CPObject
    {
        CPWindow    window; 
        CPTextField textField;
    }

Once you've done that, add a method to handle the button press. We'll make it write some obvious text into the text field:

   - (void)buttonPressed: (id)sender
    {
        [textField setStringValue: @"Hello, world!"];
    }

Now reload your index.html and hit that button :)

MyApp 2.png

Wrapping up

So, that wasn't as pretty as under Xcode 3, but once set up all you need to do is keep the app delegate header file in the Xcode 4 project up to date, and you're able to crack on. And for all the setup effort, it's better than specifying everything with CGRectMake everywhere!

Unit testing for Google App Engine with Python

I recently inherited a python project that used Google App Engine, and didn't have any unit tests setup, which is something I wanted to fix. My main aim was to get to the point where I could test it like I did any Django app I've built (this GAE project does not use Django) - basically I wanted to be able to do tests where I can:

  • Query the database to check what I expect to be in it is
  • Call URLs on the app to check that the external interface works as expected

There's a little documentation on getting started with local unit testing for Python, but it's not clear from that how to run the tests, and there's no help on how to call URLs on your app that I could see. Thus, I thought I'd document how I got setup:

Infrastructure

First get setup to run the tests. I'm assuming you already have the GAE SDK for Python installed. Next I installed the following:

  • Python nose - testing framework for python, can be installed with "easy_install nose".
  • Nose plugin for GAE - a plugin that adds support for GAE. I downloaded and installed from tarball.
  • webtest - a framework that makes it easy to test WSGI apps. Can be installed using "easy_install webtest".

That's all the pieces. Once installed we're ready to start writing our unittests.

Writing tests

Nose, if you've not used it before, will look through your project for unittests and run them. That said, I still like to have them in an easy to find place, so I create a "tests" module in the root of my GAE project director.

   % cd [path-to-my-project]
   % mkdir tests
   % touch tests/__init__.py

In the tests directory I create a python file for each test class, and in __init__.py you should import that that class. So, if you had a myfirsttest.py that had a test class in it called MyFirstTest then your __init__.py would look like:

   from myfirsttest import MyFirstTest

Now, what does that class look like? Well, lets write a test that will test loading the root path on our GAE server. The code for that would look a little like this:

    import unittest
    from webtest import TestApp

    from google.appengine.ext import db
    from google.appengine.ext import testbed

    from my_gae_app import application

    class MyFirstTest(unittest.TestCase):

        def setUp(self):
            self.testbed = testbed.Testbed()

            # Then activate the testbed, which prepares the service stubs for use.
            self.testbed.setup_env(app_id='my_gae_app_id')
            self.testbed.activate()

            # Next, declare which service stubs you want to use.
            self.testbed.init_datastore_v3_stub()

            # create a test server for us to prod
            self.testapp = TestApp(application)

        def tearDown(self):
            self.testbed.deactivate()

        def testFetchRootURL(self):
            result = self.testapp.get("/")
            self.assertEqual(result.status, "200 OK") 

That gives you some idea of how to structure the test. The import of application is the application you create as part of your GAE project. You should have some code somewher that looks like:

   application = webapp.WSGIApplication([ bunch of url handlers specified here])

   def main():
        util.run_wsgi_app(application)

   if __name__ == "__main__":
        main()  

That's the application you give to webtest to wrap.

Also note that you import your data models and start using them or db.GqlQuery etc. in your tests.

Having written all that, you then go to the root director of your project and run it like so:

    % cd [path-to-my-project]
    % nosetests --with-gae
    .
    ----------------------------------------------------------------------
    Ran 1 tests in 0.396s\r\n\r\n    OK

Hopefully this'll help you get started at least - it took me a lot of head scratching to get that far, so I hope it can be of use to others and save them that head scratching time :)