We're hiring!

We're actively seeking designers and developers for all three of our locations.

Exploring iOS Core Bluetooth: Read Requests

Apple’s Core Bluetooth Progamming Guide does a good job of explaining how to use Core Bluetooth in an iOS app. And there are countless blog post tutorials that walk through scanning for peripherals, connecting, discovering services and characteristics, and reading/writing values. These resources were great for getting started, but eventually I ran into some questions that I couldn’t answer. Things like:

  • What happens when consecutive requests are made for multiple characteristics without waiting for a response each time?
  • Can read requests be made from multiple threads concurrently?

In this post I’ll discuss some experiments I ran to explore the -readValueForCharacteristic: method of the CBPeripheral class to try to get a better understanding of how it works.

Read More »

Posted in iOS / OS X | Tagged , | Leave a comment

Turning a Sequence of PNGs into a Basic Animation with Flash


On a recent project, I had a team of Atomic developers come to me with an animation problem. They wanted to animate an icon, but they wanted it to be a series of PNGs. This post will review the process we took in finding a tool to create the animations and a few key pointers I learned along the way to improve the look of the animation.

Finding the Right Tools

My first thought was to use Apple’s Quartz Composer, where I have been prototyping most of my interactions and animations lately. I even found a cool patch plugin (Quartz Composer ImageExporter) that would record the animation and save a series of PNGs. But there was a big drawback: I couldn’t change the frames per second. This caused the playback to be choppy like a flip book missing every other page. By this stage in the process, I had a rough mockup of how we wanted to animate the icons, as Quartz Composer make it pretty easy with a few patch libraries like Origami (Facebook) and Avocado (IDEO). Read More »

Posted in UX/Design Techniques | Tagged , | Leave a comment

Test-Driven Infrastructure (TDI)

Atomic really has a passion for writing high quality code and for testing. While our internal server infrastructure has often been maintained in a semi-automated fashion, it has traditionally lagged far behind our development practices in terms of code quality, testing, and continuous integration.

Over the past year, however, Mike English and I have been working to revamp much of our server infrastructure using the Chef configuration management tool. Our goal has become to build a Test-Driven Infrastructure (TDI) in which we first write tests to model and validate the code that we later produce to configure and manage our servers and applications. Read More »

Posted in Development Practices, DevOps & System Admin. | Leave a comment

If Your Users Are Unhappy, It’s Broken


Developers are constantly making new tools that make it easier for us to get our own job done. There’s always a shiny new framework to try around the corner with a rich and well-documented API. There’s a faster, more idiomatic language coming up that’s just about to break the big 1.0 release. There’s a new software development practice, a new way to run tests, a new tool for team communication and code review. There’s a metric ton of failures, of course, but as a general trend, things just keep getting better — I can happily report that I have never looked a punch card in the eye.

But, unfortunately for us, there’s nothing that necessitates that our users are going to have as wonderful experience using a program as we had writing it. (And, perhaps, fortunately, vice versa.) Joe from HR, logging into $ENTERPRISE WEB APP$ every morning, isn’t going to care about whether the code is pristine. He’s not going to care about whether the original developers used TDD. It could be an app hacked together from an unholy combination of PHP and bash scripting by one cowboy coder over the course of three sleepless, Mountain Dew-filled nights. It could use XML-formatted text files for storing persistent data. None of this is going to directly matter, to the end user. He’s only going to care about whether or not it helps him do his job.

And in the end, that’s what really matters. We write software to be used, after all. Read More »

Posted in Evolving the Industry | Tagged , | 2 Comments

Extending Your Network through Groups & Meetups

In my first few months after moving to Grand Rapids, I was a regular attendee at the monthly GR Tester Meetup.  Swapping war stories about the latest bug you’ve found and the new devious way to crash an app was an easy way to meet new people. I’ve continued to try and attend these events as not only have I made friends there, but it’s a good way of learning more about my craft.

I have, however, also tried expanding my horizons and opened up to other disciplines and people — and luckily Grand Rapids offers a lot of opportunities.

Read More »

Posted in Growing as Makers | 1 Comment

Unwind Segues in iOS Storyboards

Introduced in 2012 with iOS 6, Unwind Segues give you a way to “unwind” the navigation stack and specify a destination to go back to. The first time you use them, they can be confusing. In fact there’s no other UI feature of iOS development that has caused more discussion in our office than Unwind Segues. In this post, I’ll help you understand the fundamentals.

Unwind exit buttonEver since I noticed the strange “Exit” outlet show up in Xcode, I’ve wondered what it did. Most people probably did what I did the first time they saw it. I Ctrl-draged from a button to the “Exit” outlet and nothing happened. This is the beginning of the confusion for new developers. How do I get the “Exit” outlet to do anything?

Read More »

Posted in iOS / OS X | Tagged , | Leave a comment

Accessing a .NET Virtual Machine Application from a Host Machine

I’ve recently been working on a .NET web application. We are mainly a Mac-based development shop at Atomic, so I’m working on this application in a virtual machine. My weapons of choice are VMWare Fusion and Visual Studio 2012 (not much of a choice), but that is neither here nor there.

Our application uses the Helvetica Neue font family. This font comes pre-packaged with Mac, but isn’t included in Windows. So, in order to effectively design and preview our application, I needed to make it available from my host machine. Here is how I did that.

Read More »

Posted in .NET / WPF | Tagged , , , | Leave a comment

“Progressive F# Tutorials” |> Reflections

I recently attended the Progressive F# Tutorials event in DUMBO, New York. It was a really great experience, and I think much of that is due to the way it was both a conference and more than a conference. Specifically, many of the talks featured hands-on tutorials, which provided a great opportunity to learn and digest new things.

For example, after opening remarks by Don Syme — F#’s original designer — I went to a session where he taught us about F# Compiler Services by providing a sample project with exercises to complete. He then went around from table to table helping anyone who was struggling. Quite naturally, this also encouraged us to work together with the others at our table, and we enjoyed getting to know each other and working together to solve the exercises. All in all, I found it a much more satisfying learning experience than just slides and a demo.

I also really enjoyed that afternoon, where Jack Pappas talked about writing compilers in F#, and his sample project with exercises even went so far as to include NUnit tests. That really struck a chord with this test-driven developer, to the extent that I got so excited about going from red to green I initially missed one of the exercises that didn’t include a failing test. Read More »

Posted in Growing as Makers | Tagged , | Leave a comment

Get Creative with Rubygems and Cocoapods

A lot of people use dependency management tools such as Rubygems or Cocoapods in their applications. These tools make it very convenient to pull in open source libraries and use them in your project without all the hassle of manually downloading projects, copying files, and keeping track of versions. While using these tools to pull in widely used open source libraries is very nice, don’t forget that you can also use them to manage pieces of shared code between your own private applications.

The last few projects that I have worked on included multiple applications that pass data between them in some non-standard way. In order for each application to correctly interpret data from the other, they each had to have a common definition of what structure of that data was — a protocol.

There are many ways of defining a protocol, and I won’t go into those details here, but once you’ve defined a protocol, how do you share it amongst the various parties that use it? Read More »

Posted in Development Techniques, Uncategorized | Tagged , , | Leave a comment

6 Helpful Sketch Shortcuts

Tablet Portrait 5

The Atomic Designers recently got together to work on an internal project. One of my favorite things was seeing how my fellow atoms used their design tools. In particular, I learned a few new Sketch shortcuts and techniques to use. We have been using Sketch at Atomic for sometime now, and we’ve all come to enjoy using it.

In the spirit of sharing, I have compiled my newly updated list of most useful Sketch keyboard shortcuts.

  • Presentation Mode – cmd + .
  • View all artboards – cmd + 1
  • Group Layers – cmd + g
  • View/hide Layout – ctrl + l
  • Move layers back/front – opt + cmd + arrow
  • Color picker – ctrl + c

Read More »

Posted in UX/Design Tools | Tagged | Leave a comment