Stuart Breckenridge

New Website

I’ve been on Wordpress, SquareSpace, Tumblr, and Ghost. All of them were good in their own way, but didn’t give me the level of control I wanted. So I’m giving Jekyll a try.

Content from my old website is still in the process of being transferred1. You’ll may also see some broken links for a while as Amazon’s Route53 has really screwed up the DNS records for my old domain.

A bit of background on the design:

  • The theme is Minimal Mistakes.
  • Typography is provided by Cloud.Typography. Currently a combination of Whitney and Ideal Sans, though I’ve been known to chop and change.
  • Hosted on Amazon S3 and distributed via Cloudfront as the CDN.
  • RSS is provided by FeedPress.
  1. I’ve had to export from SquareSpace to Wordpress, and then Wordpress to Jekyll. ↩︎


Destiny: The Taken King director defends £40 expansion price tag

Update: Bungie has reversed course and will now sell The Taken King as separate DLC with access to all the exclusive content, without the need to repurchase all content.

“Bungie has defended the full-fat £40 price tag of Destiny’s upcoming major expansion The Taken King, as well as the fact that fans will have to rebuy the base game and its existing two add-ons to access exclusive content in The Taken King’s Collector’s Edition.”

Putting DLC behind a paywall is fair game, but putting exclusive DLC behind a paywall that requires you to rebuy everything you’ve already bought is criminal.

The Q&A in the article is astounding: I’ve never seen a Bungie employee give such poor, arrogant, and dismissive responses.

Eurogamer: Well, yeah. I would rather do that - pay a few pounds or dollars or whatever - than spend money on things I already own.

Luke Smith: [Laughs] Well, we have nothing more to talk about regarding your opportunity to spend extra money in Destiny, other than The Taken King and the three versions we’ve announced.


Issues Persist in Halo: The Master Chief Collection

As a project, Halo: The Master Chief Collection is enormous. It includes all four Master Chief Halo games, plus Halo 3:ODST as a downloadable extra, over 100 multiplayer maps, and was developed by no less than six development studios. A package of this size inevitably means that there will be bugs…

So many bugs that it has been patch happy since release (1, 2, 3, 4, 5, 6). I only bought my Xbox One last week so I missed all the previous patches and only received the latest patch during the install of the game. That being said, I’m still seeing some issues with the game.

  • In single-player on Halo 4 when using Save & Quit it has saved the game at the previous checkpoint instead of the current checkpoint, on several occasions.

  • Multiplayer matchmaking can take upwards of 10 minutes, even on the popular playlists.1

  • In Team Slayer I’ve joined several matches where there has only been one team.

There’s still some work to be done.

  1. This is likely a combination of matchmaking issues and the population of players online at the time of playing. ↩︎


WWDC 2015 Predictions

WWDC is less than two months away and instead of waiting till just before the event, I thought I’d post my predictions now and then check them afterwards.

iOS 8.4 and iOS 9

I expect iOS 8.4 and Xcode 6.4 will be announced and released at the Keynote. Included in iOS 8.4 will be the new Music app and, I’m guessing, an expansion of the iTunes streaming service, iTunes Radio, to other countries1. iOS 8.4 is the only beta I can recall where it’s been released in order to give developers a sneak peek:

“This preview provides a sneak peek into what we’ve been working on, and what’s to come — the music is just getting started.”

It’s a marketing teaser in a release notes document. Not very Apple.

Betas of iOS 9 and Xcode 7 will be released at the same time as iOS 8.4. iOS 9 will include the full Apple Watch SDK that developers were promised in 2014.

I’d like to see some streamlining of the apps provided by Apple – I count 30 stock apps provided as standard in a fresh install of iOS, which is an insane number2. It’s a larger number of apps on 64GB/128GB iPhones bought from the store as they have the iWork suite and Garageband installed as well.

OS X

I’m somewhat tired of the annual OS X release cycle. But it has to be this way: you couldn’t have Continuity on iOS 8 without having Yosemite, OS X has to keep pace with iOS as they become more intertwined. My tiredness aside, it won’t stop Apple from releasing a beta of OS X 10.11 (I’m going with the codename Mojave) at the Keynote.

I believe we’ll see more Continuity features, perhaps with Knock style integration that allows the unlocking of your Mac using only your phone. Other than that, I’m really not sure what to expect from OS X 10.11, other than the usual small tweaks and feature enhancements.

On my wishlist is a version of Bootcamp that works consistently with 3TB Fusion Drives. I have little hope of this actually coming to fruition.

Apple TV

Apple TV is due for a substantial refresh. I don’t think Apple made a mistake when they said that pricing for the Apple TV “Starts at S$108” at the Watch event in March. It implies that something else will be added to the line up. I think it’ll be a 4K capable Apple TV puck in conjunction with a new iTunes UHD movie and TV show download service. Guesstimate price: $299.

There’s been discussion about a streaming TV service featuring ABC, CBS, and Fox, costing around $30 - $40 per month. I don’t get what the benefit of this would be – it doesn’t add anything compelling. It’s also very U.S. centric which limits its appeal.3

Included in the iOS 9 SDK, I also think developers will finally get the ability to code for the Apple TV, perhaps using an expanded variant of the Back Row framework.

It’s the final piece of the ecosystem and there’s no reason not to open it up. It also falls neatly into the Epicenter of Change WWDC 2015 slogan.

Apple Pay

An expansion to countries outside the U.S. is a possibility, but there’s been very little news on the subject for a while. If it does happen, I think the expansion will focus on Canada and European countries.

As an aside: it infuriates me that day-to-day, in Singapore, I pay for most things with Visa PayWave/Mastercard PayPass and Apple Pay doesn’t work.

*Banks: How hard can it be?*

iCloud

Regarding iCloud, I think what we’ll be told is that “iCloud Photo Library only just came out of beta and we’re already storing x amount of photos”. I’d like to see more competitive pricing announced for the iCloud storage tiers, but I don’t think it’ll happen. I’d also love an iOS app that allows you to manage your iCloud Drive on a file-by-file basis. The chances of Apple allowing such control are probably nil.

Prediction Summary

  • iOS 8.4/Xcode 6.4: released at the Keynote.
  • iOS 9/Xcode 7/Full Apple Watch SDK: beta release at the Keynote, final release with new iPhone hardware.
  • OS X 10.11: beta release at the Keynote, final release in October.
  • Apple TV: revised 4K capable hardware, available in July, priced $299.
  • Apple TV: beta SDK at the Keynote, released with iOS 9.
  • iTunes Radio: Expansion to other countries.
  • iTunes UHD: New 4K movie/TV show download service.
  • An iCloud Photo Library success update.
  1. Despite launching in September 2013, iTunes Radio is still only available in two countries: the U.S. and Australia. ↩︎

  2. Remove the Tips app, remove Facetime, and remove compass. ↩︎

  3. A limited appeal doesn’t necessarily mean it won’t happen: Apple Pay is U.S. only; and iTunes Radio is only available in the U.S. and Australia. Thus, it’s not unprecedented for Apple to launch a product in one country only. However, I’d point to the difficulty that Microsoft had with the TV portion of the Xbox One – it’s almost a second thought in countries outside of America. ↩︎


UUIDs with TextExpander

I recently needed a way generate UUIDs on-the-fly with TextExpander to uniquely tag some documentation.

I found this article on Never Stop Building which got me started. While it uses Famkruithof to get its UUID, there’s a much easier way to do it locally:

  • Create a new snippet
  • Change its content type to ‘Shell Script’
  • Paste in the following code:
#!/bin/bash
uuidgen
  • Pick your own abbreviation (like NSB, I use ;uuid)

Then, whenever you need a new UUID, you just type ;uuid and the output will look something like 56862470-66B3-49FB-A6DD-4BB9C386EFB9.


Examining the new UISearchController API

I’ve been examining the new UISearchController API which replaces the UISearchDisplayController API that has been around since iOS 3. My immediate impression is that it drastically simplifies the task of managing a search bar and displaying search results.

You can have a UISearchController up and running with very little code. In the sample project I’ve put on GitHub which lists and searches through an array of countries, I’ve configured a UISearchController with the following code in my viewController viewDidLoad method:

self.countrySearchController = ({
            let controller = UISearchController(searchResultsController: nil)
            controller.searchResultsUpdater = self
            controller.hidesNavigationBarDuringPresentation = true
            controller.dimsBackgroundDuringPresentation = false
            controller.searchBar.sizeToFit()
            self.countryTable.tableHeaderView = controller.searchBar
            
            return controller
        })()

Update: See this repo instead.

There are a few items to point out in this code:

  • nil is passed in the UISearchController initialiser so as to ensure that the results of the search are presented in the current viewController.
  • The frame of the searchBar must be set, otherwise it has a height of 0.
  • As per the above, the UISearchControllers searchBar is added to the tableHeaderView. There is no need to add a UISearchBar or UISearchDisplayController in Interface Builder.

The viewController must conform to UISearchResultsUpdating protocol, which contains a single method:

func updateSearchResultsForSearchController(searchController: UISearchController!)

When that method is called, search results are updated based on what String is held the searchController.searchBar.text variable.

It’s a remarkably simple API to use.


Game Center Authentication and Swift

Update: I’ve published my Swift class that handles Game Center authentication in this gist.

I’ve been rewriting my Game Center authentication code in Swift and come across a strange issue – the GKLocalPlayer().authenticated variable is always false, even after authenticating. The Swift version of the authentication code is below:

func authenticateLocalPlayer()
    {
        self.delegate?.willSignIn()

        self.localPlayer.authenticateHandler = {(viewController : UIViewController!, error : NSError!) -> Void in

            if (error)
            {
                self.delegate?.failedToSignInWithError(error)
            }

            if (viewController != nil)
            {
                dispatch_async(dispatch_get_main_queue(), {
                    self.showAuthenticationDialogueWhenReasonable(viewController)
                    })
            }

            else
            {
                if (self.localPlayer.authenticated == true)
                {
                    println("Player is Authenticated")
                    self.registerListener()
                    self.downloadCachedMatches()
                    self.delegate?.didSignIn()
                }

                else
                {
                    println("User Still Not Authenticated")
                    self.delegate?.failedToSignIn()
                }
            }
        }
    }

The code always runs to User Still Not Authenticated. However, I’ve tested downloading data from Game Center at this point (e.g. leader boards), and it allows the download to happen. (On the other hand, if you dismiss the Authentication Dialogue and then attempt to download leader boards, an error is generated saying the player is not authenticated.)

I can’t see anything wrong with the code, so I assume it’s a bug (Radar) and not an error on my part (though, there’s every chance it is).

N.B. I’ve posted this question to Stack Overflow.