The StorageFolder class does not contain any method to determine if a file with given name exists in that folder. There are at least two ways how to implement such method, let us call it ContainsFileAsync.

The first method could take advantage of the GetFilesAsync method that returns a readonly list of all the files in the folder as StorageFile objects. The StorageFile contains a property called Name that you could compare with the given filename. The whole code would look like this

public async Task<bool> ContainsFileAsync(this StorageFolder folder, string filename)
{
    var files = await folder.GetFilesAsync();
    return files.Any(l=>l.Name==filename);
}


This method looks fairly simple, elegant and works fast if the folder contains only a few files. When the folder contains tens or hundreds of files, this method gets very slow. In a folder with approximately 100 files the method takes about 1.5 seconds to return the result.

There is faster way, that works in constant time (about 50ms) even in folders with hundred files, but it is not so elegant. The idea is simple, try to access the file and if you get an exception, just return false.

public async Task<bool> ContainsFileAsync(this StorageFolder folder, string filename)
{
    try
    {
        var f = await folder.GetFileAsync(filename);
        return true;
    }
    catch
    {
        return false;
    }
}


Although I am a big fan of elegance and readability when coding, I prefer and use the second method.

Semantic zoom is an important part of all Windows 8 apps, it is a distinctive feature that differentiates them from other platforms. The SemanticZoom component works fine if you want the default experience, but if you want some customization you have to try a bit harder.

The problem with the SemanticZoom component is, that as a child of it's Semantic­Zoom.ZoomedIn­View and SemanticZoom.Zo­omedOutView elements, displaying the two states, you can use only two standard components; GridView and ListView. You cannot use the Grid and show mixed content. If you use one of these components, then clicking on any item in the zoomed out state shows you the group in the zoomed in state. You cannot implement any custom behaviour, the ItemClick event gets completely ignored. So how do you customize the SemanticZoom component?

The key is to notice that both the GridView and the ListView components implement the ISemanticZoomIn­formation interface. Any component implementing this interface can be used as a child of the SemanticZoom.Zo­omedInView and SemanticZoom.Zo­omedOutView elements. So lets implement an component called SemanticGrid that inherits from Grid and implements ISemanticZoomIn­formation

public class SemanticGrid: Grid,ISemanticZoomInformation
{
    ...
}


Let Visual Studio generate stubs for all the methods and properties in the ISemanticZoomIn­formation inteface. You do not need to implement them, just comment out the throw new NotImplemente­dException(); from all the methods and change the properties to

public bool IsActiveView
{
    get;
    set;
}
 
public bool IsZoomedInView
{
     get;
     set;
}
 
public SemanticZoom SemanticZoomOwner
{
     get;
     set;
}


And you are done. You can use this component with the SemanticZoom component instead of the GridView or the ListView and customize the semantic zoom according to your needs. Also if you wrap a GridView in this SemanticZoomGrid and place it in the SemanticZoom.Zo­omedOutView element, the ItemClick handler in the GridView will work and you can implement custom actions.

Did you like this post? Follow @inmite on Twitter!

Bringing Our Own Ideas to Life

Ondra Zahradník 18.9. 2012

When people hear that we develop mobile applications, many conversations start like this- “Listen, I was thinking about a really interesting application, which surely doesn’t exist yet!” or “Let’s meet…I have a great idea for an application, we can become billionaires! But don’t tell anyone!”.

There are of course tons of applications which haven’t been developed yet but are very much needed. However, most of the time these conversations remain only conversations without any further action. Since we are a team of open-minded developers, we have started compiling a list of ideas for mobile applications which could make life easier and happier for mobile users, and we have told the Inmite mates about them!

Should any member of our team have an idea for an application, they write it down on a common list of ideas. During normal working hours one never has the time to elaborate on all those great little thoughts and ideas one has about different kinds of mobile applications. However, we were certain that some of the ideas listed may just be golden. We therefore organised an internal Dragon’s Den, where anybody can present their ideas and get feedback from the others. The outcome of these private pitching shows have produced top projects Inmite wants to support. As a result, people organically created teams interested in developing these apps and literally went wild! Ehm, went into the wild.

The three projects we are currently testing are a result of our two day adventure in nature. Yes, we literally met at a little Bed & Breakfast outside Prague, created our own wireless network, and spent hours upon hours of non-stop brainstorming, simulating, eating, programming, eating, designing, programming, sleeping, and eating. Our very own “Inmite Hackathon”.

We are proud of the Hackathon’s ou­tcomes, they are our three little babies. Keep your fingers crossed for the festivals and conference organiser’s aid Conferoo, indoor navigation system and Intapek which distributes beta-builds of Android and iOS apps among Inmite staff and our customers.

Of course, there is more to come…we still have plenty of ideas! Just don’t tell anyone :)

The Guts to Have “Freedom at Work”

Michal Šrajer 29.3. 2012

We at Inmite are aware of the great potential in the Freedom at Work concept. However, as tempting as the idea sounds, we have to say that it’s not that easy. One needs to have guts to embrace freedom at work because freedom never comes without responsibility, responsibility for your own decisions.

So, how does it work at Inmite?

Bossing Around

We never had strict rules or directives for anything, and we don’t pretend to have bosses who are always right, with employees with no responsibilities. What we do have is interaction and discussions between real human beings.

Freedom and Responsibility

We want everyone on our team to be (and be able to be) a free and responsible person. We see freedom and responsibility as two sides of the same coin. The more responsibility you are willing to take for yourself and the projects you are involved with, the more freedom you get. And of course – we don’t have a rule for this either, it just works out naturally :)

Working Hours

We don’t care when or where someone is coming or going to work. What is important is to fulfill your commitments to your fellow colleagues (and yourself) and not interrupt other people’s freedom. If it seems that a problem is imminent we talk it out (and believe me, both sides always come up with a solution that suits them).

A Life Experiment!

We would like to build an environment where teams grow organically, proactively looking for new projects to work on together. We want to let the team have full responsibility for all aspects of the project (including the division of rewards) and achieve the ultimate advantage this brings – freedom.

We recently started an internal ‘ideas incubator’, inspired by the Dragon’s Den. We are encouraging people to bring forth their own ideas and to convince others it would be a great product. If the product seems like it will work business wise and excites enough people to build a team, they are free to work on it from the initial idea to its public release.

Did you like this post? Follow @inmite on Twitter!

How to validate SSL certificates on iOS

Petr Dvořák 14.3. 2012

Well, this is yet another post on the subject “Handling SSL certificates on iOS”. It is worth emphasizing that this article is a great proof that there is no excuse for performing this task poorly in any iOS application.

Now, what do I mean by poorly?

The Problem

The default handling of the SSL certificates on iOS is not totally horrible. Whenever an “HTTPS” scheme is used in the URL, the SSL certificate is checked by the URL loading system and if it was not issued by a trusted certificate authority (CA), the communication is rejected by default.

However, if the certificate was released by a trusted CA installed on iOS (which does not necessarily have to be a CA in the default list of CAs on iOS) and if the certificate was not revoked (as described in my previous post on OCSP), the connection is established.

This flow is not good enough if you really pay attention to the secure communication.

An attacker is still able to perform a man-in-the-middle attack by setting up the following scenario:

  • Installing his own CA on the attacked device Keychain (tainted SSL certificate will pass the validation now)
  • Setting the connection's proxy server to his own server on the attacked device (attacker is able to monitor the communication via the proxy server)

There are commonly available tools that enable an attacker to perform this scenario. An attacker can easily catch the communication payload, including session cookies, passwords/password hashes, and if there is no application level signing implemented in the app (such as OAuth 1.0a) an attacker is also able to replay/modify the requests made to the server.

Solution

In order to make your communication safer, explicitly compare the SSL certificate used for the connection with an expected client-side certificate. In order not to bundle the certificate in the app directly, you can compare only certificate data hashes (use SHA256, to keep it simple and still reasonably secure).

Implementation

First, we need to implement the SHA256 function – IMO the best way to do this is to extend the NSString class with an Objective-C category.

#import <CommonCrypto/CommonDigest.h>
 
// Create a new NSString category to have SHA256 method on NSString
 
@implementation NSString (Crypto)
 
/**
 * Computes a SHA256 hash of the string.
 * @return A SHA256 hash in hexadecimal representation (64 chars)
 */
- (NSString*) SHA256 {
    const char *cStr = [self UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(cStr, strlen(cStr), result);
    NSString *s = [NSString  stringWithFormat:
                   @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
                   result[0], result[1], result[2], result[3], result[4],
                   result[5], result[6], result[7],
                   result[8], result[9], result[10], result[11], result[12],
                   result[13], result[14], result[15],
                   result[16], result[17], result[18], result[19],
                   result[20], result[21], result[22], result[23], result[24],
                   result[25], result[26], result[27],
                   result[28], result[29], result[30], result[31]
                   ];
    return [s lowercaseString];
}
 
@end


Second, we need to implement following method in the NSURLConnection delegate.

We will need a certificate hash that we compare the data against – for the sake of simplicity, we will include it as a #define (first, we take the certificate data, then we encode them using base64 and we hash the result using SHA256). Generally, it is a good idea, since the hash will become a part of the binary file, which is better than storing it anywhere else in the package, IMO.

Note: In order to make this piece of code work, you must include the Security Framework in your project, in case it's not already there. Also, you need to download some base64 implementation that is implemented as an NSData category (or you need to modify the code slightly).

#define EXPECTED_CERTIFICATE_BASE64_SHA256 @"fc70b13e805d4b60174c45ccbaf8d366f2218ae90daddb87b90a801b605312da"
 
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
    SecTrustRef trust = [protectionSpace serverTrust];
 
    SecCertificateRef certificate = SecTrustGetCertificateAtIndex(trust, 0);
 
    NSData* serverCertificateData = (NSData*)SecCertificateCopyData(certificate);
 
    NSString *serverCertificateDataHash = [[serverCertificateData base64] SHA256];
 
    [serverCertificateData release];
 
    // Check if the certificate returned from the server is identical to the saved certificate in
    // the main bundle
    BOOL areCertificatesEqual = ([serverCertificateDataHash isEqualToString:EXPECTED_CERTIFICATE_BASE64_SHA256]);
 
    if (!areCertificatesEqual)
    {
        NSLog(@"Bad Certificate, canceling request");
        [connection cancel];
    }
 
    // If the certificates are not equal we should not talk to the server;
    return areCertificatesEqual;
}


From now on, anytime you try to connect to a server, a certificate is explicitly checked and the scenario mentioned above is no longer valid.

It wasn't that hard, or was it?

Did you like this post? Follow @inmite on Twitter!

For one of our sleek iPhone banking apps, we needed to verify details of the SSL/TLS certificate handling on iOS. Specifically, we were interested in the matter of the certificate revocation mechanisms (CRL, OSCP) in the NSURCConnection when using the HTTPS protocol.

If you start digging into the problem a bit, you get only a vague information about the fact the OCSP is used for the certificate revocation on iOS.

However, this was not good enough for us. We needed to be absolutely sure about how the things work under the hood. Therefore, we asked Apple engineers for an assistence with this issue.

In a blazing fast pace, we received a perfect, qualified response from an Apple engineer (a complete answer – read it all!):

Currently there is no way to configure the OCSP policy on iOS. This would make a good enhancement request IMO.

OCSP checking is done by the trust object (SecTrust). The checking is enabled by the policy object (SecPolicy) that you pass in when you create the trust object. The generic X.509 policy (SecPolicyCre­ateBasicX509) does not do OCSP checking; the TLS security policy (SecPolicyCre­ateSSL) does. It's this policy that's used by high-level TLS frameworks, including CFSocketStream, CFHTTPStream, NSURLConnection and UIWebView.

Currently all OCSP checking is “best attempt”. That is, when you, or the system, evaluates a trust object (by calling SecTrustEvaluate) the trust object will attempt to contact the OCSP server. If it can contact the OCSP server and the server indicates that the certificate has been revoked, the trust evaluation will fail. If it can't contact the OCSP server, the trust evaluation will not fail (unless it fails for some other reason).

This implies that SecTrustEvaluate is a blocking network operation; it's probably not a good idea to call this on the main thread. At this point there's no equivalent to Mac OS X's Sec­TrustEvaluate­Async, although that would also make a good enhancement request IMO.

To prevent trust evaluation taking too long, it uses a short timeout for network operations (currently 7 seconds). This timeout applies to each network operation it makes; it can multiple network operations (for example, there could be multiple OCSP responders, or it might need to fetch intermediate certificates referenced by the Authority Information Access extension, as described in Section 4.2.2.1 of RFC 5280)), so the overall timeout might be much longer.

Finally, there's one critical wrinkle here. Currently the trust object will only do OCSP checking for Extended Validation (EV) certificates.

Did you like this post? Follow @inmite on Twitter!

Media Marathon

Inmite 16.2. 2012

There is almost one million smart phones in our tiny Czech Republic. Every other phone sold here is now the smart one. The trend is clearly set. And no one can change it.

More phones, more developers and more applications. No wonder, the media are becoming more attracted by our emerging field of business.

Inmite has already been covered by various magazines, dailies and online media since its foundation in 2008. However, Wednesday of February, 8 will mark our history!:)

In one day, our Chief Happiness Officer Michal managed to talk on the Czech public service radio Radiožurnál (talk starts at 37.09) and, five hours later, he appeared live on the national TV broadcaster ČT24 as a guest speaking about the latest development and future trend in the mobile applications business (Michal appears at 28.30).

Well, we’ve tried a life of celebrity for one day and now back to our business as usual.

We don't share your contact information

Petr Dvořák 8.2. 2012

You have already read about this – Path uploads your entire iPhone address book to its servers.

This issue didn't make my day very pleasant, since this unnecessary incident will make our work more complicated in couple next days. It will be very difficult for us to “sell” a cool feature we just implemented to one of our new apps to the users (it should be available soon, stay tuned).

What is the feature?

Now, let me explain what we wanted to accomplish in our app…

1. User downloads the app
2. User taps a button to add users to an event
3. By a pure magic, the users she knows from her contact list (who already use our app) are listed

Wow! What a nice feature…

How does Path do it?

They send your whole address book as it is to the server for comparison, relying on secure channel (HTTPS communication).

The problem (in my opinion, based on the issues I found in various apps earlier this year):

  • Innocent people may be hurt. Path users share contact details of the users who are not registered at Path. Well, this could be “fixed” in some paragraph of the license agreement… but is that enough?
  • The HTTPS channel is usually not long enough – usually, it stops at the load balancer. Anyone behind the end of the dark TLS tunnel can read the data being sent…
  • If not relying on the trusted CA and EV certificates (because of OCSD – I will blog about this later), the method may be insecure by design.
  • Even if Path doesn't store the user list in the database in the end (if they just process the list and return the results), are they sure the requests/responses aren't in the server logs in some readable way? Logging can be pretty tricky in large systems. Logs last are backed up and can last very long.

How do we do it?

How do we go about this feature in our app?

1. We take the user's phone number and e-mail and we normalize it (we add country code to the phone number, for example)
2. We compute the phoneHash and emailHash as a SHA1 of normalized phone number and email
3. We send the list of hashes to the server
4. The hashes (!) are compared on the server side
5. Server returns a TRUE/FALSE values for each hash to the app
6. App displays only the right users

Since we hash 12–16 digits of a phone number or ~20 alphanumeric ASCII chars of an e-mail address to a 20 bytes long hash, the probability of collisions is very low. Furthermore, collision causes a user who does not use our app to be suggested, not a big issue, IMO. Therefore, the success rate of our solution is very high – at least with respect to what we are aiming for…

This way, our server never gets any contents of your address book.

I strongly believe the Path could have used a very similar concept…

Why do we care?

Because now we have a problem… How do we communicate this super nice feature to our users, who don't understand the subject on the technical level and who didn't know there might be a problem until an incorrect implementation occurred and the problem came out?

The users will see the same feature as they did in Path and they will immediately give us a 1 star angry review because they will associate the feature with the security incident.

What a pity…

Quality human tester needed

Michal Šrajer 13.10. 2011

Booming as we are, once again we are calling out to those with a keen interest and devotion to mobile applications. You are a young ambitious student with some time still left on your hands in between lectures and pub weigh lifting. We are number one and growing mobile application developer improving its services by conducting extensive tests on brand new applications to be launched on the app store. Shortly, we need some good testers :).

Toys we play with at Inmite HQ.

If you think you have a critical mindset and can use your fingers, you might be just the person for us. We will provide you with the privilege to see the hottest upcoming apps in our field and much more!… such as lovely tablets, iPads, iPods, or whatever your heart might desire. Beside what can be more fun than criticize somebody else’s work? :)

If interested, please do not hesitate and get in touch with us.

Take off sky-high with WebExpo

Michal Šrajer 20.9. 2011

There is hardly a better way to start the new academic year than attending some top notch conference and sharing some of the know-how we have.

Education is the cornerstone of success, especially in our field and having the latest information is no less than a matter of survival. Therefore Inmite takes pride in organising and participating in events covering all the hot trends in smartphone application development. Such as WebExpo,, the largest gathering of web developers, web designers and Internet entrepreneurs in Central Europe that will take place in Prague on Sept 22–24, 2011.

Michal put together a talk about native apps for smartphones – he will talk about about native applications and why we should care about them. He will also go through a brief introduction to development on all major smartphone platforms (including Android, iPhone, WindowsPhone 7 and some others).

If you can’t make it to Webexpo, don’t worry, this autumn is literally full of conferences. You can also meet us at Mobile Internet Forum, and at the Google Developer Day mid-October.

So weather you just want to make yourself feel good by starting this academic year on the proactive foot, want to come to cheer for our guys, or you are simply interested in the conference topic, don’t hesitate.

How to make oneself feel good

Michal Šrajer 5.9. 2011

Wanna make yourself feel good? Join in for a good cause :) We can not all be billionaires and save the human race with multimillion donations, however, as much of a cliche as it is, we can all do something. We are proud to say that one such event has been initiated by our Inmite colleague Petr Dvorak.

Guess there is no dispute about the good effects of blood donation, but it takes guts to go there (at least we do not know many people in love with needles :). Some small incentive is then perhaps the right way to go. How about we tell you you meet your friends, perhaps some new faces, share an exhilarating experience and do something good?

Moreover, if we guarantee that the people you will be meeting are most likely highly intriguing and interested in the same things as you are? Would not little a needle pinch feel more like sealing a brotherhood then? :)

And that is what Binary Blood Day is about. About us, geeks, joining together in several towns all over the Czech Republic to go and donate their blood. Don’t stay behind. More info at Binary Blood Day. See ya on September 9!

Every donor will receive this nice badge. Isn't only this worth joining us? :)

Wanted Alive!

Michal Šrajer 23.8. 2011

We are growing, growing, growing! Good news you may say, however, this good news is also connected to some severe headaches like headhunting.

If you happen to be a mobile developer you should celebrate, since you chose the profession of the future and are very likely to receive several job offers even before wrapping up your studies. Here is a typical example of this job offer: Inmite is now in urgent need of iOS and Android developers, but would also love to hire one of those creative minds that can realize fantastic images for our no less than fantastic programming.

So, we are calling out to you for help-our supporters, fans, families, business partners or whoever you may be. If you know someone who would be interested in working for the fastest growing (probably) and the coolest (for sure ;) company in the field of smart-phone application development, please let us know. A sweet reward is guaranteed!

Birds waiting to meet you at Inmite HQ…

Application of the Year

Michal Šrajer 12.6. 2011

They say that we shouldn’t blow our own horn. But “praise yourself, nobody else will do it for you” is also true. So I’ll stick with the second saying and announce that it gives me great pleasure to let you know that last week Inmite won the Application of the Year award for ČT24 for iPhone and Android. Approximately five thousand users voted in the poll and we crushed 26 competitors in the media application category.

Michal giving his thank-you speech.

People most appreciate the live broadcast of ČT24 and – of course – the perfect news service. We also programmed notifications of selected news and their sharing via social networks into the application. Over 80,000 thousand people have downloaded the app as of today almost 80% are actually using it daily. That’s what I call an application in permanent use!

Also successful was Carnero, one of our co-workers, who won another prize for his own application c:geo. The Radio Tycoon application also made it into the top three in the games section.

Know that starting today these and similar accolades will decorate the walls of our brand new office, so that we make the right impression on all visitors. You’re invited!

Android Devcamp

Michal Šrajer 2.6. 2011

One hundred and fifty enthusiasts with a small green robot in their pockets, who instead of sun tanning by the lake spend a sunny Saturday in a dark auditorium in order to pick up new skills and knowledge so that they can improve their mobile applications? Yes, that’s exactly what last Saturday looked like as the first Czech conference for Android developers, the Android Devcamp, was held in Prague.

More than 150 Android developers in one room.

The idea to hold such an event was already around for a long time, but only the Google Developer Day 2010 conference turned out to be the right impulse to actually launch organization efforts. There was a huge amount of interest at GDD 2010 in Android presentations as well as in the exhibition of Android phones, and from discussions with the participants it became more than obvious that many of them would appreciate an event focused on Android developers.

We’ve been developing Android applications at Inmite since the very beginning, and we are always very glad for every opportunity to pass our experience on. Moreover, the conference was an excellent opportunity to meet many other developers who are just as enthusiastic about the little green robot as we are. We were joined in the organization of the event by the well known Czech blogger and also organizer of many geeky events, Martin Hassman.

Organizing such an event was a big challenge for us and we were surprised by how many things must be arranged and decided. If you ever embark on a similar adventure, here are a few tips on what to keep in mind: selecting a suitable venue, arranging equipment (cameras, visualizer), coordinating with the event partners, preparing the conference microsite (ours is at http://www.adevcamp.cz/), selecting a registration system (of course we developed our own customized solution, but it was a ton of work), arranging catering, preparing the afterparty, and – above all – putting together an interesting program and inviting awesome speakers…

Android mascot who attended the conference as well :)

For the main set of presentations we invited the leading Czech and Slovak developers: Pavel Petřek from Inmite talked about his experience in the professional development of Android applications acquired during three years of active development, Tomáš Zvěřina took his listeners on a dive into the dark recesses of several unknown Android API’s and Martin Hejna demonstrated during the morning segment what developing in Android NDK looks like. Just before lunch, our colleagues from Vodafone (the conference’s main partner) made a brief presentation and introduced their big competition for Czech developers.

Lunch was followed by Juraj Michálek’s pre­sentation on Air as well as by probably the most eagerly anticipated speech of the day: Martin Adámek’s talk about monetizing Android applications (Martin is one of the most qualified developers to speak on this topic, as his APNdroid application has already been downloaded by more than one million users worldwide). In order to make the program of the full-day conference as attractive as possible, we also decided to include two special segments in the afternoon program in addition to standard presentations:

Enthusiastic discussions after Martin's talk about monetization.

Lightning talks – during which 6 different speakers made 6 ten-minute presentations, so in quick succession we heard about the automatization of Android builds, the QT framework, developing one’s own activity chooser, writing location based services, the ObjectForms framework as well as about foundations of Android GUI design.

App Contest – competition for the best Android application. Already before the conference developers had the opportunity to enter their applications into the competition. During the event, seven authors had the opportunity to present their applications to other developers in the audience and, in addition to presenting their work, they also always showed something interesting from their developer kitchen. The public then selected David Vávra’s Settle Up application as the very best one, and David was awarded an Android tablet by the Samsung company.

But there were also other interesting things happening at the conference in addition to the presentations. Our friends from the SvetAndroida.cz portal prepared the accompanying program, and they managed – for example – to get the Android controlled AR.Drone “quadricopter” (officially not yet supported by Android, but with a little bit of effort it is possible to get the drivers going :) for the event, as well as several attractive Android devices (including the new hot Samsung tablets).

And how did it all turn out? Over 150 developers hungry for new information met in the full auditorium, many interesting discussions were held during the breaks and the community of Czecho-Slovak Android developers was thus perfectly united. The whole event received very positive feedback that has already convinced us now that we will definitely consider organizing another event next year.

Closing panel discussion (and partner logos on the wall – Big Thanks!).

Google Developer Day 2010 in Prague

Michal Šrajer 24.11. 2010

Before we dive into the story though, let us send a BIG THANKS to Czech Googlers! Those guys are awesome – putting together such a great and overall perfect conference with just two people is unbelievable. We still don’t understand how Martina and Filip managed to do this. And yes, we have to say this: GDD 2010 was legen…wait for it…dary!

This year’s GDD was the third one in Prague and also the third one for us. The first year we had a big presentation about Android, and the second year we had a couple of presentations and helped with some organizational aspects. This year we worked with our friends at Google on even more entertaining things for the attendees.

Everything started for us a couple of months ago – brainstorming about possible content, interesting guests, and about what Czech developers really care about. We thought about supporting program, interesting and cool things to put into relax room… and so on. A lot of thinking, lots of great ideas, and lots of excitement. But it’s a long way to go from having just an idea to it’s realisation. At the end of all brainstorms, we had reduced all ideas to a few we were able to deliver on time and in perfect quality: mobile conference app with integrated QR Hunters game, twitter-wall, Android devices showcase and of course our presentations.

Audience at Google Developer Day 2010 opening keynote.

Mobile conference app

Mobile conference app (also called mobile navigator) is a tool that can be used by every attendee during the whole of a conference – it allows one not only to review the agenda and read about speakers or sessions, but also to build a personalized schedule, follow the news throughout the day or send feedback after each session. Because we’ve decided to implement this tool as a heavily optimized mobile website (more about the technical side of it in some of the following articles), it was available to all attendees independently of a phone. Our app was optimized for all kinds of Android phones, iPhones and iPads, big desktop browsers like Firefox or Chrome, and even old phones without good JavaScript and/or CSS support.

However, this wasn’t all. We integrated one more nice feature, the 2nd edition of our QR Hunters game. Attendees were able to collect awards in the form of QR codes throughout the day. As rewards for great technical question, correct answers, or for just having a nice chat with one of the presenters. Codes were valued based on a different number of points and the only thing one had to do was add these points to his/her game account by scanning it via any QR reader app in the phone. Simple and effective. Actually, exactly 839 QR codes were scanned at the end of a whole day!

Lots of work but definitely worth it! Watching attendees actively using the app during the entire conference convinced us that our decisions were right! It was a great, warm feeling. By the way, if you’d like to have the same conference app – which is well tested and worked perfectly for an event with 1,200 attendees – let us know!

Twitter-wall (with Foursquare twist)

Twitter-wall was another fun item we really wanted for “our” conference. To help us with the implementation of the wall, we called our friends at AppSatori who worked on the code, while we focused on other apps and the UI of the wall. We had seen twitter-wall at a few conferences in the past, but we wanted to make it right, unlike some other guys. What did we need for it?
1) To have a huge screen (we had an enormous projecting screen)
2) A visually appealing and well readable UI
3) Something more than just a wall of text

The first two points are clear, but what about the third? Well, together with the guys from AppSatori and unofficial Czech Foursquare evangelist Eliska, we come up with great idea, “foursquare wall”! Why not show not only tweets, but also 4sq checkins?

The result was great – people were using twitter the whole day like crazy (of course not only because of our wall, but we believe it had a great influence). More than 1,200 tweets went across that huge screen, which lead to lot of conversations, fun and even an attempt at a reality hack :) Success!

Android showcase

Android devices showcase was a whole different challenge. Actually, most of the work was done with friends from our partner portal SvetAndroida.cz (or “the World of Android” in English – the biggest Czech Android portal). Fortunately, we were able to “practice” for this one. We had a very similar (but smaller) showcase on Google Day, a business conference a few weeks before GDD.

Showcase of Android devices.

Getting through 30 Android devices from all types of different manufacturers is much more difficult than one would expect – it’s not only about convincing these guys to lend us devices, but we also had to borrow special security stands for all phones, prepare information about every device, and finally, put all the pieces together before the event (and find the right box for each device afterwards, which was even more challenging :). But the result was more than worth all the phone-calls, e-mails and sleepless nights. Interest in our Android corner was enormous! Everyone wanted to see the large scale of different Android devices offered almost exactly 2 years after releasing the very first T-Mobile G1 phone.

Tech talks and a big Keynote

And finally, a few words about the presentations we prepared for GDD 2010. The plan was to do 2 guest talks this year – Michal about AppEngine, and Pavel about Android – two very important platforms we use for writing scalable mobile apps at Inmite. But, plans are meant to be changed – and that is exactly what happened just a few days before the conference.

Michal talking at opening keynote.

Pavel’s co-speaker changed at the last minute – instead of speaking together with Reto Meier (his friend from past GDD’s and Google I/O events), he had a session with Justin Mattson, another Android guru from Google. No big deal for these guys, all of them are skilled speakers with a lot of experience. The only downside was Pavel’s sleepless night preparing perfect slides. He made it, and was able to give an enthusiastic talk even though he had slept just 45 minutes that night. Our CTO is a crazy guy :)

BTW if you missed Android talks on GDD or would like to see even more, check out the Android conference we are preparing together with Martin for Spring 2011: Android Devcamp .

An even bigger change was waiting for Michal. Instead of having a technical talk about AppEngine with AE guru Fred Sauer, he agreed to do something much bigger – a keynote talk! Preparing for such a huge keynote was an excellent experience. When looking at it from the outside you don’t realize the many things that have to be sorted out before a live performance. Rehearsals started a day before GDD at the Google offices. Michal threw away old slides and created brand new ones with huge images instead of huge blocks of text; fine-tuned slides with Eric Tholome (Google Products Director and the main keynote speaker); did a dry-run of the presentation and had only reached the half-way point! The night before the event there was a big rehearsal on stage in the conference center (to test sound, microphones, etc.), and one more rehearsal early in the morning on the day of the event to also test the cameras, lights and fine-tune the last technical details.

As we said, there is surprisingly a lot of preparation that goes into this but it’s definitely worth it – you don’t want to flub in front of 1,200 people watching your every move! The keynote went smoothly, everyone knew when and where to be, how to operate the microphones and clickers, and what to say. And what was even better? The feedback we received from excited attendees. Perfect!

Wrap-up

This year’s GDD was a lifetime worth of experience for us at Inmite. After the many conferences we’ve attended in the past we thought we had seen everything, but this one was very special for us. It was exactly the same place where we had our first big conference experience two years ago and where we met most of our Google friends, at GDD 2008, which took place in exactly the same conference center (but was half the size of this year’s event). Lots of great memories!

Google Developer Day is a very important event for Inmite. Who knows where we would have been if we weren’t lucky enough to meet the right people at this event 2 years ago? We are really thankful for this awesome opportunity and we’re looking forward to GDD 2011 already – see you there!

All speakers and organizers of GDD 2010.

[Nice pictures were taken from official photogallery of GDD 2010 ]