How the WWDC Inspired Me

This year’s WWDC has come and gone. However, the inspiration and impressions that were taken away from my experience there will be long lasting. I’ll break down the source of this inspiration into three areas:

  • Labs and Sessions
  • The Human Factor
  • iWalk

Labs and Sessions

I have attended, virtually and in-person, many technical talks and presentations over the course of my career, but Apple sits at the top of the podium. Some developers made the (good) argument that iOS6, under the covers is an incremental upgrade for developers. Many of the sessions were summarized as:

Yea, you know all that manual code you had to write in iOSx…we went ahead and took care of that for you. Oh and this cool feature is now only less than 10 lines of code pops collar.

While this statement is pretty accurate I took away far much more. Though I can’t go into specifics because of NDA on the particular talks, what I can say is that the awesome engineers made a lot of effort to not just handle repetitive and vastly differently implementation of code, but also think of numerous edge cases and handle them with grace. The added layer of pazzaz was that if you need to override anything and “truly” customize a framework component then you have that option. I can’t express what an accomplishment that is…to be given a framework/set of tools that does all of this. It is an excellent example to develop my own code. It is no secret that good/great iOS developers aren’t cheap. We shouldn’t be. This is a highly sought after skill that requires a ton of work to pull off correctly. But where do the experts go to get advice or help? We go to the source…Apple! In most cases this is done through Developer Support, but during the WWDC you can take your code, design or ideas and sit with an Apple engineer to go over what you have written. In order to maximize my time during the labs I picked two very specific topics that I wanted to discuss. The first dealt with CoreGraphics, CoreAnimation and MapKit. A lot of people will bring code that is breaking to the table. My particular questions didn’t have to deal with a specific problem. but more of design pattern implementation. It was good to hear that my methodology and usage is how the engineers themselves would have approached it as well. I was really amazed and grateful to their willingness to help and the general attitude from all the Apple engineers. If they thought they weren’t the best person to answer your question they didn’t just say, “Sorry…good luck”, they went and found someone who could. Just another example to follow from Apple for all developers. This type of attitude is generally found with Mac/iOS developers in the community I am happy to say.

The Human Factor

It was my experience that at the WWDC there were no strangers. It was one of the most welcoming communities/gatherings of like minded people I have been to. I talked with complete strangers while standing the MANY lines, exchanged notes and ideas while in sessions and finally got to meet up with people who I had only conversed with online. This was a great experience. I was blown away when reading my twitter feed with the #wwdc2012 hashtag and seeing the number of tweets from people and organizations who would welcome to public to come and join them at a bar, Denny’s, area of a park or shared office space. When was the last time anyone in any career or social space experience that! Though the #wwdc2012 is an event and experience unto itself #altwwdc had just as much camaraderie. I decided to walk down there on Friday and spend sometime with Appsterdam at StackMob’s HQ. I didn’t know anyone when I arrived, but when I left 2 hours later I had talked with half a dozen developers, met Jana Boruta in person (we had talked over email a number of times), ate some of the best burritos ever and befriended the best French Bulldog ever, Boadie. I loved listening to Victor from TUAW speak, but I think the most influential and lasting moment of the visit lasted just 2 minutes (I had to leave to catch my plan). Mike Lee got up to start a round table discussion about…well anything. As I walked away from the StackMob office I kept going back in my mind to certain words that Mike said. Community, sharing, helping, kindness, positivity. It brought a big smile to my face because it shows the attitude and culture that exists in the Apple community and Apple itself. Everyone in your life you meet, no matter how brief, as an impact on you. Lots of people left lots of small impacts on my life last week. Even the TSA agent leaving SFO. He told me a funny joke

iWalk

One of the earlier days I was there I had a free afternoon so I walked across the street, bought a huge bottle of water and just took off around the city. My dad lived in San Francisco for a bit when I was young so I walked down memory lane and saw a few tourists sites, but I also purposely got lost at least twice. Why? Because that is the only way to find new ideas and experiences. I would stop at random cafes and bars to get a bite to eat and just chat for a minute or two with a random stranger or shop owner. After about 4.5 hours I made it back to my hotel and was absolutely exhausted, but a walkabout that I’ll never forget. Many people have the misconception that developers are just wrench turners who are are emotionless and work in a field that doesn’t have depth. Oh little do they know that those called to this service, and that are passionate about true software development, are in themselves artists who can create beautiful, while functional, aides to our lives. Especially Mac/iOS developers. Yes I said it and will defend that stance with extreme prejudice Walking around and enjoying the solace of the city all to myself helped me think through major design considerations and upcoming app functionality…this wasn’t inspired or given to me by a forum or tech talk, but just being in the city and separating myself from my usual surroundings. Growing up my dad always taught me to be adventurous. Do things that frighten you. Explore places that seem distance or that don’t have a clear path. Though I haven’t been able to be take the unknown path as often I would have liked in my life I took as many as I could in San Francisco while at the WWDC.

Things End Up How They Start Out

It is a truism that I live by. Things end up how they start out. During Tim Cook’s keynote he talked about about the amazing accomplishments that Apple has had over the past year in regards to sales and engineering, but you could tell that wasn’t Apple’s intrinsic motivation. The focus is, and has always been humanity. Creating beautiful products and services that enrich our lives. For some of us it is implicit and helps our daily lives be a little more productive, but for others showcased in the video it is very EXPLICIT. With the products that Apple has created they get to experience life in a tangible way that medicine, science, government or most other technologies companies haven’t to date. When you think about that in terms of humanity, what Steve Jobs and the rest of Apple have done really did change to world….one small dent in the universe at a time. There are many people that I didn’t get to meet that I really wanted to because of time and schedules. I wanted nothing more than to shake their hands and say thank you. Thank you for all that you give to Mac/iOS developer community through assistance, open-source projects and amazing apps. Maybe next year! It is truly inspirational.

Traveling to WWDC 2012

When prepping for my travel to and from San Francisco I made some very important decisions that cost me a little more upfront but totally worth it to make my flight out much more enjoyable. Last time I went to the WWDC, my then employer, made all the travel arrangements and I had to fly to Utah, have a two hour layover and then puddle jump over SFO. I vowed that no matter what it would cost I would take a direct flight next time. Traveling domestically in the US is a pain the ass so getting on and off plans and hanging around airports as less possibly is ideal. Even with the two hour travel from Chattanooga to Atlanta was worth it just to have a direct flight. There are plenty of car and shuttle services that run between the Scenic City and Atlanta that are reasonably priced. The MegaBus even offers decent wifi. I opted for a private car. I had to leave by 5am to give myself plenty of travel and security time. The second amenity that I opted in for was paying for Gogoair wifi. It was 12 bucks for a 24 hour pass (I got one for going out and returning….I am writing this blog at 40k feet). All in all I’m pretty satisfied with the service. It was spotted at times, but what do you expect being on a plane. Lastly, I called the hotel I am staying at to check on which Bart station I should get off on walk to the hotel. I prefer to stay about a mile away from Moscone for a few reasons. Mainly I enjoy walking around San Francisco in the morning time, but also there are lots of activities surrounding the conference and sometimes I just need a break to decompress.

The only real downside to traveling thus far has been the plane and traveling from the SFO and the hotel. I attempted, for the first hour or so, to work on a project, but there just isn’t a lot of room to maneuver my arms due to the tight quarters and because of the graphics and compiling that I am dealing with my battery ran low without a charger. Taking the BART is by far the cheapest mode of transportation, but one of the trains was running 15 minutes behind schedule on top of an already 30 – 35 minute ride to my station. Depending on how long you have been traveling it might be worth taking a taxi, but it is much more expensive.

All the amenities, retail and nutrition are within a 10 minute walk…which is probably true for most hotels near Mascone.

Though I have been going since 4:45a.m. EST it has been a great travel experience and I can’t wait for the festivities to kick off tomorrow.

WWDC 2012 Expectations and Plans

Why is the WWDC better than Christmas??? Because it lasts for a freakin’ week, major product announcements, hardware AND software are inevitably revealed and as a developer and attendee I get first crack at all the new stuff…not to mention being surrounded by the best/friendliest individuals in the world.

My first WWDC I attended was back in 2009. I had been developing iOS for a little while, but was still new to the platform, Objective-C and CocoaTouch. When I was there I did everything that I could to attend every session that even slightly interested me. After I was done for the day I would take my notes and laptop back to the hotel, woof down some food, try and review the firehose of information I had received that day, do a little bit of coding and then get some sleep and repeat. By Friday I was more exhausted than I had ever been and decided to just explore the city with my wife and 9 month old daughter (at the time). It was a welcome mental break. Since that conference I have never been to anything else that could rival WWDC’s production, the camaraderie between Apple and the attendees and the sheer atmosphere of what makes Apple such an amazing company.

This Sunday I will head out west for another grand week long adventure. I expect the conference to exceed all my expectations. I also plan on taking a different approach to my week’s activities. Last time I tried to do EVERYTHING. This time I am being very selective as to the sessions I attend. Apple will post the session videos to the public shortly afterwards so I’ll just catch up when I return. One of my most important goals is to spend much more time in their labs. As to get the most out of labs I’m prepping two different applications with specific functionality to discuss with the engineers. Lastly, and almost as important as the development and learning portions of the week, is to socialize more. There are handful of developers and companies that I converse, help, admire or who have helped me in numerous ways that I making sure I get to meet in person and probably by them a drink or two. They deserve it.

WWDC 2012

Taming Core Location

In today’s mobile development environment using the device’s GPS in some shape, form or fashion is a given. Apple provides a great toolset for developers to access and utilize this functionality, but this is often done carelessly. I am not talking about privacy concerns or the misuse of the data, but many developers, myself included early on, had a poor code design implementation. The characteristics of such are usually:

  • CoreLocation implementation that was always tied directly to a particular UIViewController
  • Set the accuracy to kCLLocationAccuracyBest
  • Set filtering to kCLDistanceFilterNone.
  • Requests way to many location updates

Let’s examine each reason why these are not the best practice

Tight Coupling is Wrong

This is a more of a development practice that developers should always attempt to achieve in their code. There are always examples and uses cases as to why you would have to break this paradigm, but is still goal none the less. What we generally see, and most tutorials on the topic do this, is that the UIViewController sublcass will conform to the CLLocationManagerDelegate protocol, setup the manager and properties and listen for callbacks. I guess that is OK if you have only one use case and user interaction that requires CoreLocation, but in most cases you need to access CoreLocation more than once, thus you have to duplicate the same code. The “C” in MVC has now broken it’s intended contract and you have tightly coupled code.

Less Accuracy is More

This lesson is pretty simple. The more accurate the location you request, the longer it takes to get and the more battery power is drained. The faster the battery is drained the faster the iOS user gets pissed. The simplest example is a weather application. There is NO need to request such a detailed location. By setting your accuracy to kCLLocationAccuracyThreeKilometers you save yourself, and most importantly the user, time and end up with same information. Weather is usually shown based on a region area. i.e. zip code or city.

“For example, setting the desired accuracy for location events to one kilometer gives the location manager the flexibility to turn off GPS hardware and rely solely on the WiFi or cell radios. Turning off GPS hardware can lead to significant power savings.” – CoreLocationManager Reference

Filters are For Your Protection

Unless you are creating a turn-by-turn navigation app set a filter. Getting a location updates every half step or every second doesn’t add any value to the task of the application, but does have the same downsides as mentioned above. Poor battery life and horrible user experience.

You Don’t Need Updates Every Two Feet

This error is really an error in judgement. Apple provides developers with the fine grained control via distanceFilter and desiredAccuracy, but should be used sparingly and with apps that require multiple checks throughout the app session for location updates.

This service is most appropriate for applications that need more fine-grained control over the delivery of location events. Specifically, it takes into account the values in the desiredAccuracy and distanceFilter property to determine when to deliver new events. The precision of the standard location services are needed by navigation applications or any application where high-precision location data or a regular stream of updates is required. However, these services typically require the location-tracking hardware to be enabled for longer periods of time, which can result in higher power usage.

For apps that don’t require a constant stream of updates it is best to use start/stopMonitoringSignificantLocationChanges.

This method is more appropriate for the majority of applications that just need an initial user location fix and need updates only when the user moves a significant distance. This interface delivers new events only when it detects changes to the device’s associated cell towers, resulting in less frequent updates and significantly lower power usage.

Better CoreLocation Pattern Options

The first issue to tackle when implementing CoreLocation features is how to create your own manager that can be used and called throughout the app. The second issue that has to be addressed is how to allow other classe, regardless of type, UIView, UIViewController, NSObject, get notified of updated location information.

Issue One

The basic approach is to create subclass of NSObject that conforms to CLLocationManagerDelegate and implements the appropriate delegate methods. In my particular case I do have to listen for a stream of updates so I will be setting the desiredAccuracy and distanceFilter properties.

Issue Two

In order to tackle issue 2 I go one of three ways: NSNotification, Target/Action or KVO.

NSNotification would solve this problem, however it is seemed too decoupled and I personally feel that NSNotifications should be reserved for OS level notifications not service layer/domain model context changes. Finally, there are performance considerations when it comes to using notifications. No matter if the post to the notification center is done asynchronously or synchronously it is dispatched to the object synchronously. If there are a number of observers or if there is an instance where an observer must do a lot of work then your app could experience a significant delay.

Next on the list is the target/action pattern. While NSNotification was too decoupled from listeners, using target/action has now added a level of coupling that I felt a little unnecessary. In our custom manager class I would have to set a property, either NSMutableArray, NSSet or id that would hold the target instance, in addition, a property for the SEL, and when the location manager’s delegate method received a valid location update I would have to call something like:

`//NSMutableArray or NSSet

[clmListeners makeObjectsPerformSelector:@selector(methodToPerform)];`

`//id target

[target performSelector:@selector(methodToPerform)]`

There are two issues with doing the above proposal:

  1. You have the manager class now responsible for another class’s implementation without a contract.

  2. You are getting really close to having a delegate pattern which brings us closer to a one-to-one coupling between our classes.

The final option that we come to is Key Value Observing…which is the solution that I have gone with. Not only does it keep our manager class independent, but we also are also able to write our location code once while allowing our other classes to handle any UI or model manipulation as they see fit…independent of any other implementation or logic.

Custom Core Location Manager Class

gist.github.com/2421914

View Controller Observing Change to Current Location

gist.github.com/2421928

Applicasa As Your BaaS

The New Comer – Applicasa

Last month I wrote a quick review of the two BaaS providers that I had used, StackMob and Parse. A few days later I received an email from Tzvi Kopetz, COO and co-founder of Applicasa, a backend solution provider who, even in it’s infancy, is filling in some of the feature gaps that Parse and StackMob have left open. Three of the biggest ones are managing AdHoc builds, a dedicated CMS and custom app framework.

Adhoc Builds

Seeing Applicasa getting closer and closer to provide the Adhoc capabilities of HockeyApp or TestFlight is an evolution that all mobile developers should pay attention to. I currently, have to manage my data/backend api with another provider while managing adhoc builds with TestFlight. Having everything centrally located would be a huge win.

CMS

I am a developer and really don’t want to worry about creating content. At a minimum someone could talk me into writing a script that populates schemas via script or upload. However, most other platforms don’t provide the necessary environment for a content editor role and a CMS that doesn’t have the unnecessary bloat of a traditional CMS.

With Applicasa you are able to create content editors that have a completely separate role from developers so they have an easy and intuitive console for managing the content. Both Parse and StackMob have content consoles with some management capabilities, but they aren’t as featured and you can tell they want you to populate your data via the API.

You can use backend service to send versions (updates) to different clients, use our CMS. I think our CMS is quite a > different approach from the other providers. We actually give you a complete solution so you don’t have to build a CMS, you don’t have to build a complete system for your clients (users). You can actually invite clients to use the system with the developers. – Lior Malenboim, CEO

Source

Custom Framework

When it came time to actually integrate their framework into my test app I kept looking for a github repo or direct framework download from their site, but couldn’t find it. The reason being is that the framework is generated, by the developer on the fly based upon your database schemas and relationships. This is a feature that I never really thought about. Probably because I haven’t seen anyone do this. Parse and StackMob do a great job with their frameworks in regards to abstracting models on the client, however, they don’t give this fine grained control. The ability to have this type of control over the framework, particularly the models, is because the Applicasa framework is generated by the developer and stubbed out based upon your exact data structure.

Summary

Applicasa is a great backend provider with amazing features and support who is truly shaping up to be a “one stop shop”. I have talked with their founders and developers a few times over the past month and they have answered all my support questions promptly and notified me of fixes to any issues I discovered. Over the past month they have rolled out and/or updated their customized objects and iOS SDK, CMS, Webservice with code snippet, Push Notifications, Ad Hoc beta versions, Users management and tickets management system. I am looking forward to seeing what they come out with next.

Forward Geocoding in iOS4 and iOS5

Forward Geocoding

It is a common scenario that every developer has run into.

Locate places near me based upon a particular address and/or zip code.

In order to get the correct results the address needs to be converted to a lat/long coordinate. With iOS5 Apple has provided us with CLGeoCoder class which has convience methods for reverse/forward geocoding. Unfortunately, there isn’t really any built-in functionality for iOS4. Most current apps still have to support iOS4 so what are developers doing to fill the gap? Write their implementations for multiple OS support. Below is what I use.

** Note: I did use Sergio Martínez-Losa Del Rincón article as a starting point for the iOS4 support.

Techniques

  • Google’s Map API
  • CLGeoCoder
  • Objective-C blocks for callback
  • Grand Central Dispatch

Implementation

iOS5

I tackled the easiest solution first. Utilizing iOS5’s CLGeoCoding geocodeAddressString:completionHandler: . However, when I first use the method I kept getting back a location of {0.0,0.0} in my log. The reason being that I was neglecting the fact that the method executes asynchronously and doesn’t return its value. Hmmm….

Not too much of a hurdle thanks to the implementation of block handling. By adding a completionHandler to my own method I was able to provide a callback with the appropriate coordinate that I need after the request had finished.

iOS4

Duplicating the ease of the iOS5 functionality was a bit more involved. I created a category method on NSString (see the above referenced article for code origin. I did make updates to it.) for making a call to the Google Maps API and return their forward coding result. The method itself isn’t asynchronous because I wanted to leave the decision of whether or not to call the method async or sync up to the developer. To provide asynchrous support was easy just by utiliizing GCD.

Decision Time

Deciding which code block should the calling method execute was the final task to finish. Once again this was extremely simple.

if (NSClassFromString(@“CLGeocoder”)) { // ios5 } else { // everything else. in this case we are assuming there isn’t support for iOS3.x }

Code

Creating a Universal iOS Framework Sample Project

Evolutionary Not Revolutionary

It is evolutionary, not revolutionary, for most iOS developers to go from copying the same set of “library” files from project to project, to creating a static library which is then shared between projects to finally creating a universal framework.  From my humble point of view the universal framework is the ideal solution because it gives you the ability to just hand off a single framework (which is really a directory), which keeps code implementation hidden, and still have access to a static library that can be edited and shared within a shared workspace.

Having read a few different tutorials on creating a universal iOS framework the task seemed quite daunting and quite honestly over engineered.  However, with a project that I am going to be working on shortly I needed to be able to have both options: static lib and framework. So I dove back into the documentation.  Of all the blogs and tutorials that I came across the one that helped the most was written by Justin DeWind over at Atomic Object.

The instructions were very straightforward and setting up a project was extremely easy. However, when I went to build the framework I got the following error

lipo: can’t open input file: /Users/cwiles/Library/Developer/Xcode/DerivedData/StaticFramework-akqynrxfwazyswaujkdqvysbbznj/Build/Products/Release-iphonesimulator/libStaticFramework.a (No such file or directory)
Command /bin/sh failed with exit code 1

I checked and rechecked my steps and Xcode project settings, but I kept getting this damn error message.  24 comments and a sample project later, Justin tracked it down.  The issue was in the original bash script for building and moving files around assumed that there was a custom build directory inside the project and not using the standard DerivedData directory. Justin kindly updated his scripts and everything ran great. The benefits of using the standard DerviedData build directory is that you can run clean the directory for a specific target for a given project.  The benefits of using a custom build directory are:
  1. Makes it consistent between xcodebuild and Xcode
  2. The directory is always known
  3. It is configurable
With the sample project now compiling for me using the DerivedData directory I wanted to see if I would make it work no matter what the setting was for an individual’s needs.  As I started looking at the different preferences and settings that could be made at the project and target level the rabbit hole went pretty deep and I could see how someone, including myself, could make a mistake and screwing up the process.  I decided to step out of my comfort zone and look into xcconfig files.  The configuration files are text based and allow you the same flexibility and micro tweaking of your projects as using the standard project setting panes that you are used to.

The way the order of importance works is this:

“GUI” Project Build Settings overwritten by “GUI” Target Build Settings” and “Config” Build Settings
“Config” Build Settings overwritten by “Config” Target Settings

The basic setup I implemented for using the xcconfig files is creating a Project-(Shared, Debug, Release) and Aggregate-(Shared, Debug, Release).  This might have been overkill or not have followed best practices, but it did allow for a large range of flexibility for the project and targets.

Two of the most recognizable customizations that are in direct relation to this project are the target’s name and build directory. You can set  them in the project level configs or the target level configs. I have set in the target level so that if you create other targets then they those can inherit project level settings or have specifics just for that particular target.

Canonical list of Xcode variables

Summary

A huge thanks for Justin DeWind and the rest of the Atomic Object crew for the original post and taking the time to help me troubleshoot this. I hope my sample project is a welcomed addition.  If you haven’t you should check out the rest of their posts...lots of great stuff.

If you have a feature request, find a bug or have a tip, especially with the xcconfigs PLEASE let me know.

Sample Project

StaticFramework-Sample-Project

Efficient String Manipulation With Objective-C

One of the best interview questions that I have ever been asked, and now ask myself to potential candidates, is create a function that will transform any set of words into an acronym.  The reason why I like this question is that it shows how well the candidate understands basic string manipulation, problem solving and how efficient their technique is for the string manipulation.  Regardless of the language that is chosen the two techniques use by most are to either use some sort of regular expression or split.

Regex techniques with PHP, Javascript, Python and Ruby are the most popular (I did it using PHP), but I was curious as what an implementation would look like using Objective-C.  It was my theory that using regular expressions would incur more overhead and than using a “string split” technique.  Apple does a fantastic job with making their framework api’s pretty darn efficient, but I had a feeling that with this type of simple manipulation using a regular expression would be like lighting a grill with an atom bomb.  The results weren’t so dramatic, but none the less it does turn out that using componentsSeparatedByString is a better use of resources....for a single manipulation. When iterating and manipulating multiple strings I prefer to use regex.

When I iterated over the string 1000x the time to execute was almost the exact same.

I even tested two different regular expressions to make sure I wasn’t being to liberal with my pattern.  The difference was negligible.

Test String: "hEll0 WoRLD please hElP me"
Standard Regular Expression: "(\\w)+\\s?"
Boundary Regular Expression: "(\\b\\w)"

Single (regular regex)
Time to parse using regex: 0.003947
Time to parse using componentsSeparatedByString: 0.001246

Single (boundary regex)
Time to parse using regex: 0.003747
Time to parse using componentsSeparatedByString: 0.000668

1000x (Regular)
Time to parse using regex: 0.511170
Time to parse using componentsSeparatedByString: 0.538784

1000x (Boundary)
Time to parse using regex: 0.555807
Time to parse using componentsSeparatedByString: 0.485708

Here is the test project

Export SimpleGeo Layers with Python

Urban Airship has decided to shut down the SimpleGeo services that it acquired by March 31st, 2012. I personally see this as step-backwards for the services that they offer and to the SimpleGeo customer’s who rely on the data.

* stiQRd (I am lead developer) uses it for all of our location information.

What was most shocking to me after their announcement wasn’t the cut-off date or the fact that Urban Airship had decided to sunset the service but the fact that they “punted” the solutions for helping existing customer’s migrate their data.  Granted they did offer semi-replacements for Storage, but it basically amounts to you rolling your own solution.  That is why we were using SimpleGeo in the first place...because we didn’t want to roll our own because of limited time and resources.  

SimpleGeo was so easy to use and the company had great support. It was a no brainer.

In order to prepare and update the stiQRd app before the sunset date I need to get an export of my data.  Unfortunately, there isn’t an easy way to export layer data programmaticly or through the console.  I posted a question to the Google Group and got some half-ass response that didn’t help whatsoever. Not to be derailed I was hacking together a few solutions, none of which I really liked.  I then came across this gem (I know...it is bad) of a Ruby script that will iterate through all of your layers and export that data to csv. Score!

The tips to retrieving all your data from a particular layer are two fold. SimpleGeo’s API doesn’t have a “get_all_records(layer_name)” type of method, but they do have “get_nearyby”, which at face value doesn’t look like it will give you the necessary results, but it does when you use (0,0) as the lat/lon and add in the “bbox” (boundary box) parameter values of ‘-90,-180,90,180’.

Unfortunately, I don’t know Ruby very well and I am spending a lot of my free time sharpening my Python skills. Since there wasn’t an implementation for export in Python I decided to port the Ruby script.  With the help of Bob “I am a PEP freak” Waycott, we have a pretty elegant solution.

I am also happy to repost that Parse has taken it a few steps further and offered up the simplest/elegant solution for migrating this data over to their backend service.  If you are looking for a turnkey solution then head over their for their migration tool.

If ANYONE has suggestions or updates please let me know.

Python Migration Script: (written by Cory D. Wiles and Bob Waycott)

From Months to Minutes - Mobile Ready Backends

98% of my time is spent developing iOS apps and most of them talk so some sort of web-service. Most of the web frameworks that exist today written in PHP, Python and Ruby abstract a lot of “boiler-plate” code the is tedious and error prone. They saves us valuable time and headache. However, many mobile developers still had to setup a server, database, security and create the endpoints for their app to communicate with.

This is not fun to say the least.

Below is a short, but excellent list of available mobile back-end solutions that allow users to setup, in most cases 5 minutes, a mobile back-end with out-of-the-box solutions for model relationships, PUSH notifications, user management, ACL and geo-location.   I have used all of them at some point or the other and have saved me HOURS and HOURS of setup, server side coding and maintenance.  In addition, any questions, comments or bugs that I sent to their support were answered promptly and with an adequate fix or recommendation.

Unless there is a pressing need for you to roll your own back-end solution I highly recommending using any of these services.

Parse
Parse is the new kid on the block and though it doesn’t have as many features compared to StackMob, what it does excel in its simplicity, outstanding support and turn key solutions for common tasks such as table lists views.  There are still some features that needed to be added, such as cache invalidation, model archiving and better console management, but I have spoken to their support staff and the was told that these will be added in soon.

If you have a straightfoward model structure and need a backend setup ASAP then Parse is by far the best solution.  Though they have some growing to do, but they are well are there way and their service has been a pleasure to use.

Features:
  1. User managment
  2. Relational Queries
  3. iOS/Android SDK’s
  4. Facebook Integration Wrapper
  5. Push Notifications
  6. GeoLocation Services
StackMob
I wish that StackMob had been around a few years for some of the larger projects that I worked on because it would have been the back-end solution I would have used...hands down.  Besides all that standard features that most back-end service platforms offer they also provide tremendous additions such as API versioning, phone support, API extensions and dev/production environments for your API just to name a few.

StackMob’s solutions are where you need to me be for larger API needs.  The setup is easy and the service is feature rich.

Features:
  1. API Extensions
  2. API Versioning
  3. Push Notifications
  4. Social Networking Integration
  5. Analytics
  6. S3 Support
Summary

No matter if your backend requirements are larger or small there is no need for most cases anymore to roll your own.  Services such as Parse and StackMob have really positioned themselves as the frontrunners in the PaaS and SaaS solution providers.  The advantage that they have is that they came in and built their companies from the ground up tailored for mobile, but flexible enough to server any data client.