Apple Campus 2 - Dejà Vu?

I've been following the construction of the Apple "Spaceship" in Cupertino for some time.

The major feature of the new Apple 2 campus is the huge circular main building.  It' diameter would nearly encompass the Pentagon.

Ever since I saw the plans, they reminded me of another building where I was privileged to work for some time in the early 1980s.  The IBM Thomas J. Watson Research Center in Yorktown Heights, NY. This building opened in 1961, and was designed by Eero Saarinen and was in the form of a bit more than 1/4 of a circle. I might be misremembering, but I believe that it was designed to be expanded to a full circle, but IBM never pursued those plans. 

The new Apple Spaceship looks like that planned expansion of TJ Watson.  I'd long suspected that the radii of their two circles were similar.

Today, I got the notion to look at satellite images of the two buildings on Google Maps.  I took screenshots, and used Photoshop to scale them so that the map scales matched.  And then I masked out most of the grounds of Watson and overplayed them.  Here is the result:

So, it actually looks like the radius of TJ Watson is slightly larger than that of the Apple Spaceship, although the width of the building might be slightly less.


Finally, I'm an official iOS App Developer

After 6 months or so I finally have a iPad App for sale in the Apple App Store.

You can read more about Imitation Enigma here. 

I started at the beginning of the year, inspired by the move "The Imitation Game."  

I learned Swift and iOS 8 along the way, found a few beta testers, and used Crashlytics fabric to manage that.  By early April I was ready to submit, and started to discover that the hard part of this isn't learning a new language or framework, but learning how to use iTunes connect.

One of the app features is a simulated code book, which I intended to sell as a auto-renewing subscription, which seemed natural since the German Wehrmacht sent out mostly code books.

After waiting about 10 days for the first app review, I got a "metadata" rejection and a question about what the subscription provided.  I then resubmitted and waited another review cycle and again got a "metadata" rejection saying that an auto-renewing subscription wasn't appropriate for this use, but was for real magazines.

The options were to make the codebook a non-auto renewable subscription, but this would mean I would need to have a server of my own to keep track of when subscriptions were in force.  The other alternative was to make it a non-consumable, in effect a "lifetime" subscription.

So I reworked the app to make the codebook a regular non-consumable purchase, and added a second add on feature purchase. I re-submited the app in early May.

The first review came back with another metadata rejection, they couldn't figure out how to find the place to make the in-app purchases. So I replied with how to do that.

Another review cycle (each one of these took anywhere from a week to 10 days) and they told me that the app wasn't finding the purchases in the store.

The way in app purchases work in both iOS and OS X is that the app has a list of product ids, and makes an SKProductRequest to get the localized descriptions, prices, etc for those purchases.  For development, there's a sandbox app store from which sandbox appleID accounts you set up as a developer can make purchases for testing.

Every thing worked fine in the sandbox, but for some reason when App Review tested the products weren't found.  I didn't understand how this could happen, but I know that there were some problems with iTunes connect when I had uploaded the last build, so I just resubmitted the app again, waited, and got the same rejection.

So it was now time to use one of the Developer Support incidents that come with Apple Developer membership.  So I opened an incident.  When the Developer Support guy got back to me he said that it didn't look like it was a problem with my code, and we had a series of email exchanges where I described what was happening.

Finally the "rubber duck" moment came, he asked if I was sure that the app in review was asking for the product IDs I thought it was.  This prompted me to read the tea leaves in one of the screen shots that app review send me when they couldn't retrieve the products, and it hit me.

There had been a subtle change in the UI between the app when it had a single subscription purchase, and the new version which added the second feature.  The link for the new feature was missing!

Then I realized what had happened.  I'd been submitting new builds to iTunes connect, and I assumed this was all I needed to do.  What' I'd missed was that you need to change the app description record in iTunes connect and tell it which build to use for this version of the app

So all along the problem had been that App Review was still testing the subscription version of the app, which was sending the productID of the auto-renewing subscription product, but that product was no longer in iTunes connect, it had been replaced by the two non-consumable products which had different product ids.

So I changed the description, re-submitted the app, and finally after another week got approval for the App, which became available today.


Getting Swift

I've spent much of the past quarter on a dual project:

  • Learn the new Swift programming language 
  • Figure out how to navigate Apple's developer process

On Good Friday, I submitted my first iPad app to the review process. If all goes well, it will hit the store in about a week, based on what I'm hearing about recent history.

For the most part I'm finding Swift to my liking. I've been using Swift 1.1, the latest stable version. For a while I was using version 1.2 which adds a few niceties like delayed initialization, of let variables.  

Swift provides a nice mixture of functional and object-oriented features. 

I spent quite a bit of time last year working on a mixed-language project which increasingly used Clojure. I really like Clojure. Lisp was one of the first languages I learned when I embarked on my lif-long habit of polyglot programming back in the 1970s. This was Lisp 1.5, before the advent of Scheme and Common Lisp

I started with the recently released pragmatic programmers book "iOS8 SDK Development: Creating iPhone and iPad Apps with Swift"  Which got me up and running as a refresher on both Xcode and Swift.

I'm liking Swift quite a bit, I've never seen functional programming and object-oriented programming as being at odds, particularly the flavor of OOP found in Smalltalk and Ruby which relegates hierarchy to an implementation detail instead of building up an empire of types.

More to come.

My new Monitor

This crosses interests between software development, and photography.

I just purchased a new monitor, I wanted a big monitor which would be good for programming, but also a wide-gamut display, for Lightroom and Photoshop.

After doing my research I came up with the ASUS PA-279Q which is just about perfect. It is certified as calibrated to tight tolerances, and covers 99% of the Adobe RGB color space with a DELTA E < 2.  This was confirmed with my Datacolor Spyder Color Checker.

It's also a great monitor for programmers 27" with 6 USB ports.  The display port connection works great with my MacBook Pro, and the stand allows me to raise it enough so that I can put the laptop with the lid open in front of it and easy use both displays. You can also rotate the display and use it in portrait orientation.

Although it doesn't have Thunderbolt, its a nice alternative to the Apple Thunderbolt Display.

If you don't need such a large display the PA-249Q is a 24 inch display with many of the same features and qualities.  It's still 95% of Adobe RGB, but with a Delta E < 3, still not bad particularly for the price.

Back to Blogging

For many years, I had a blog where I opined on mostly software implementation topics, with a focus on the Ruby programming language.

Due to a series of events, including the death of the second machine I used to host the blog, and bouts of full-time employment, the blog went into stasis.  I know it was popular with some, probably odd people, and I've decided to start again, but this time using square space to host it, and let them deal with keeping the hardware up and running.

This time around I intend to broaden the topics for the blog.  I'll continue to write about software development topics, but I also expect to bring in other topics I'm passionate about, like photography, film, etc.

I'll probably resurrect some favorite articles from talklikeaduck, but gradually, and without trying to make old links work.  I have all of the content albeit in the form a a mysql database dump, so it will be a semi-manual process to bring those back.

So I hope that someone enjoys the new blog.