Feb 2014

SMCalloutView for iOS 7

Check out SMCalloutView on Github.

A while back, I wrote a custom “Callout View” control for iOS that replicated the otherwise-inaccessible system control that you normally only get in MapKit, and even then you can’t customize it directly.

Surprisingly, it became my most popular project on Github by far, even making its way into household-name apps like Evernote. And now I’m happy to announce it’s getting its biggest update yet - full support for the new system callout style introduced with iOS 7!

iOS 7 introduced a brand new style and animation for the system Callout view. The animation is less “bouncy”, the fonts are different, and the layout has been tweaked. Not to mention the new minimalistic background which is no longer composed of multiple images, but instead gets its appearance mostly from layer effects.

Read More

May 2013

Meridian Goes to Aruba: Why Wifi Networks are the Future of Location-Based Mobile

First thing’s first: I’m more than a little excited to announce that our plucky startup Meridian has a new home.

image

You may not have heard of Aruba Networks, but there’s a good chance you’re connected to one of their wireless access points right now. Their customers include the Facebook campus, Venetian resort and H&M retail, and they’re currently #2 in market share (after the behemoth Cisco).

So Meridian is a mobile software company, and Aruba is a wireless hardware manufacturer. How do we fit together?

image

Well for one thing, we have the same customers. Meridian helps enterprise locations like hospitals, stadiums, and retail stores create great mobile apps for their visitors. And Aruba helps these same locations provide their visitors with great Wifi connectivity.

But there’s more to it than that. We believe that intelligent wireless networks are the key to building awesome location-based mobile apps. Here’s why.

Read More

May 2013

Freeing Feeds: From Paid App to Open Source

Check out Feeds on Github, or Download it from the website.

About a year ago, I created Feeds to scratch an itch. I wanted a desktop app that would help me keep tabs on our team’s commits to Github. Designer Eric Grossnickle wanted a way to see his Dribbble activity without having to check the website every day.

So, we built a little app that lives in your Mac menubar and notifies you when things happen on your favorite sites. It provides your notification history, read/unread status, and popover content previews.

image

In building Feeds, we wanted something that other non-developers could use to stay up to date not only with Github, but also with other services people depend on like the CRM tool Highrise or the collaboration app Trello.

Thanks to Eric, Feeds is beautiful. It’s easy to use and supports a decent set of third-party sites, as well as supporting RSS/ATOM feeds directly.

image

But I think we can do better. In order to support more services and keep the existing ones up to date, we need the support of other developers who personally use Feeds.

So we decided that the best way to expand the services Feeds supports is to open it up to the community. Starting today, Feeds is now free for direct download from the official website.

The App Store version will be removed (existing customers will continue to receive support), and the code is now available on Github so that anyone can contribute fixes and add support for new services.

So how did we end up here?

Read More

Oct 2012

A lightweight XML parser for NodeJS/JavaScript

Check out xmldoc on Github or just npm install xmldoc.

Ever need to parse a bit of XML in NodeJS? If so, you may be quite confused by your options. You might initially find an (excellent) callback-based parser, but that results in code like this:

Hm, I’m getting deja vu.

Of course, there are plenty of other libraries that let you deal with the whole document in memory at once. Libxmljs is solid, but requires bindings to libxml2 which means you have to compile it. I wanted a “pure JavaScript” module for simplicity and ease of deployment.

Node-elementtree is pure JS and looks pretty great, but I wanted a “one file” solution.

So, long story short, I wrote one and it’s a single JS file and it suits my needs perfectly. It uses the awesome pure-JS XML parser sax behind the scenes to build up an easily-traversable object hierarchy.

Behold:

You can use it in your Node.js app easily:

npm install xmldoc
…later…
var xmldoc = require('xmldoc');

Or just put it in a <script> tag and use it in the browser if you’d like. You can find examples for both cases in the repository.

As usual, you probably shouldn’t be loading large XML documents with this class if you are tight on memory. But if you’re just parsing little SOAP request snippets like I am, you’ll find it’s much easier to work with than stream-based parsers.

Go try it out and let me know what you think!

Aug 2012

A Custom Callout View for iOS

Check out SMCalloutView on Github.

There’s a great UI widget that’s been on iOS since day one:

Ever wonder what that black pointy bubble is exactly? It’s kind of a strange beast. The way it “bounces” when opening is an animation that I believe is unique across the entire iOS platform. It kind of grows out from the tip of the arrow then springs back like a UIAlertView. I still find it fun and satisfying to watch.

So when we were creating our indoor mapping UI for Meridian, I naturally wanted to use this widget. Unfortunately, it’s considered a private API. Bummer!

There are some existing 3rd-party controls out there that mimic this one, but they aren’t a perfect replica. And I demand perfection! So I made my own version, and dubbed it SMCalloutView.

Read More

Jun 2012

How to create a new file in the editors I use every day.

ME Eclipse, I’d like to do something with this folder.

ECLIPSE You can do lots of things with this folder!

ME Let’s create something new in here.

ECLIPSE There’s all sorts of new things we could make together! How about a Java Class?

Read More

Feb 2012

Feeds

Here’s an app I whipped up with the help of designer Eric Grossnickle. It has one purpose: to live in your Mac menubar and notify you when things happen on your favorite sites. That’s pretty much it.

You also get a little menubar app with your notification history, read/unread status, and popover content previews (Lion only).

It currently supports Dribbble, Basecamp, Highrise, Github, Beanstalk, Trello, and UserVoice.

If you would like us to support a particular service, cast a vote in our UserVoice forum!

Oct 2011

Why Indoor Navigation is so Hard

I wrote a piece for Radar about our company’s approach to indoor navigation with mobile apps.

Remember the days before you could pull your smartphone out of your pocket and get instant directions from your current location to anywhere in the world? It’s kind of foggy for me, too.

Read More

Sep 2011

Git Is Simpler Than You Think

It was about one year ago that we switched to Git. Previously, we used Subversion, through the Mac app Versions, which (rightly) holds an Apple Design Award.

I made the executive decision to leave our comfy world of Versions because it seemed clear that Git was winning the Internet. There was much grumbling from my teammates, who were busy enough doing actual work thank you very much.

But I pressed forward. We signed up for accounts on Github. We learned how to type 'git push' and 'git pull'. We became more confident. Git is just like any other source control system! But it wasn’t long before one of our devs called me over to look at a…situation.

Read More

Aug 2011

An iOS Developer Takes on Android

Recently, we released the Android version of Meridian, our platform for building location-based apps.

We didn’t use one of these “Cross Platform!” tools like Titanium. We wrote it, from scratch, in Java, like you do in Android.

We decided it was important to keep the native stuff native, and to respect each platform’s conventions as much as possible. Some conventions are easy to follow, like putting our tabs on the top. Other conventions go deep into the Android Way, like handling Intents, closing old Activities, implementing Search Providers, and being strict about references to help the garbage collector.

Now, our platform leverages HTML5 (buzzword, sorry) in many places for branding and content display, so we got a fair amount of UI for free. But there was much platform code written in Objective-C that needed translation into Java, such as map navigation, directions, and location switching.

So, we rolled up our sleeves, downloaded the Android SDK, and got to work.

Read More