Practical Machine Learning for iOS

This post serves as a collection of follow-up resources for my AppBuilders 2020 talk, Practical Machine Learning for iOS. If you have any questions, feel free to reach out to me (via Twitter is preferred). 

If you want a full transcript, the script for this talk is available here as a PDF.

Here’s some useful links, roughly in the order they might interest you related to the talk:

  • CreateML — Apple’s easy to use tool for creating machine learning models based on tasks
  • CoreML — Apple’s framework for using machine learning models that are in the CoreML mlmodel format

Building a Sound Classifier:

Building a Caption Generator:

Some additional links that might be of interest:

And finally, we have a GitHub repository with the code that was shown in the talk, as well as the code repository for our book, Practical AI with Swift, that has a whole lot of great activities for you to use (even if you don’t have the book) across sound, vision, text, and more.

An update on 2020

Well, 2020 has gone in interesting directions so far! 🤷🏻‍♂️

I’m writing this from Hobart, where I live, and am currently self-isolating, after we returned home early from the USA a few weeks. We finished two events — including O’Reilly’s Software Architecture Conference (more on that in a second). After the second event, we found ourselves in Miami with the news that both the Game Developers Conference 2020 and O’Reilly’s Strata Data+AI conference (our next two events) were both cancelled.

With news that the COVID-19 virus was spreading, we sat in a Starbucks and worked with Virgin Australia to get us home. We landed in Melbourne early in the morning of 12 March 2020, arrived in Hobart a few hours later. We’ve been voluntarily self-isolating since then, out of an abundance of caution.

It’s already a bit stressful, but it doesn’t seem like the end is in sight.

A few days ago our publisher O’Reilly Media announced that they were shutting down their in-person events business, and wouldn’t be running conferences any more. This coincided with the positions of many of our friends at O’Reilly being made redundant. We’re pretty shocked, and sad. We’ve been to many, many O’Reilly conferences over the last 15 years, so this is very much the end of an era.

This week also coincides with the end of Jon and myself being employees of Secret Lab for 2 months! We made the change, after planning to do so for more than a year, because of all the upcoming travel we’d had planned, and the amazing opportunities we could see ahead if we worked in the business a little more and differently (more announcements soon!) Well, the travel didn’t pan out, but the employment is going well.

More, hopefully more cheerful, updates soon.

SA Conference 2020 NYC

Ben_Hider_BH305631

We’ve just finished speaking at the O’Reilly Software Architecture Conference 2020 in New York City. It was, as always, a fabulous event, and we had a great time! In a few weeks we’ll be speaking at O’Reilly’s Strata conference in San Jose, as well!

At Software Architecture in NYC we spoke about entity component systems, in a talk entitled “Entity component systems and you: they’re not just for game developers“.

Below are some of our favourite links relating to ECS. We hope you find them useful!

You can also find a slightly earlier version of the talk (from last year’s conference) on YouTube:

Software Architecture NYC was fabulous, and we can’t wait for the next one! We really enjoyed seeing our friend r0ml give an amazing talk (as usual), and signing copies of our Unity Game Development Cookbook!

Catch us next at the O’Reilly Strata Conference in San Jose!

🧶 Yarn Spinner 1.0

The popular open source narrative game development framework, Yarn Spinner, which is maintained by Secret Lab and a fabulous community, has reached version 1.0. As part of our 1.0 release, we’ve debuted 5 exciting new features:

  1. Compiled Scripts — Yarn Spinner now compiles to a binary format.
  2. Automatic Compiling — In Unity, your Yarn scripts will automatically be compiled when they change.
  3. Line Tagging — You can automatically add unique tags to lines of dialogue, and generate a .csv file to send to translators with the click of a button.
  4. Code Extension — There’s a syntax highlighting extension, available from the marketplace, for Visual Studio Code.
  5. No more .yarn.txt — The file extension is now .yarn! It was time.

We want Yarn Spinner to be the best tool that it can be. As part of that, we’ve launched a Patreon page, and we’d love for you to help support its development!

We’ve got big plans, so please check out the website, follow us on Twitter, support the Patreon if you can, and join our Narrative Game Development Slack. And we’d really appreciate it if you shared the news!

Finally employed after all these years

Secret Lab

The year 2020 will mark the 12th year of the “Secret Lab” name existing.

It initially started as a vehicle for three University friends to do cool things and make stuff, but in 2010 we turned it into a company. So it’s the 12th year of the name, and it’s the 10th anniversary for the “real thing”: the company.

In that time, like most of Australia’s small businesses, we’ve paid other people more than we’ve paid ourselves, and we’ve paid ourselves (Jon and myself) as “Directors Fees”. This made sense, and was the easiest way to do things, but times change.

Starting this year (in fact starting in a few short weeks at the beginning of February, just before we start a whole lot of travel for conferences and events, representing the company) Jon and I will both finally be employees of the company that we founded.

This doesn’t actually change much: the company still has to pay us superannuation, but now we’ll be paying ourselves every month, instead of at the end of a financial year, and now our income will be a wage, instead of directors fees.

We made this change to make it structurally easier to pay ourselves, and to make things a little clearer as we plan to travel to represent the company so much this year. If anyone has any tips on running a small business, 10 years in, I’m all ears!

Either way: from February 2020, I have a new job! It’s very similar to the old one, but I’ll be doing more than just managing the company, as now I’ll be working!

/dev/world/2019 Early Bird ⚠️

Get your /dev/world/2019 tickets soon! Don’t miss out!/dev/world/2019 is fast approaching, and discounted Early Bird tickets are available until 9 August 2019.

A ticket gets you access to three days of workshops, sessions, and networking — it’s a great deal! /dev/world/2019 runs in Melbourne at RMIT, and features speakers from companies like Google, Canva, Mercari, Etsy, CBA and beyond, covering topics from the latest SwiftUI, to Flutter, to Rich Notifications, to hand puppets with Augmented Reality (AR).

Join us at /dev/world! For more information and tickets, visit https://devworld.com.com.au

The first announced Featured Presentation at /dev/world/2019 will be from Simon Joslin and Matthew Clark, from The Voxel Agents, developers of The Gardens Between, the Apple Design Award-winning adventure puzzle game. They’ll be talking about good design, and how it can’t just be rushed.

Get your tickets at https://devworld.com.au ❤️

Adventures with a client who won’t pay

Over at Secret Lab, we’ve been dealing with a client who won’t pay. Since October last year, we’ve been working on a gorgeous iPad application for a big name client who has been nothing but full of praise for our (quite frankly, amazingly good) work. They have literally sent emails thanking us and telling us how great the work has been.

Per our standard terms, we don’t turn over source code and ownership of source code until the final payment. They accepted this, in writing, up front. It’s pretty standard stuff.

The client has been hard to pin down, and has declared how busy they are are travelling the world (join the club, we travel all the time and respond instantly) and generally being very important, by way of explanation to their lack of responsiveness (not our problem, but whatever). They have also disappeared or been unreachable for large periods after the app shipped to the App Store and went live.

There was some squabbling by the client over this (I imagine they probably didn’t read what they agree to, pretty standard stuff — we suspected they hadn’t read the terms when we started getting emails complaining that we were over budget. We were not over budget by a single cent), and when they refused to pay until they received the source code we renegotiated (after offering escrow, and a few other options), and arrived upon: they’d pay 50% of the remaining owing, we’d send the code, they’d immediately send the other 50% payment.

They paid the first 50% (late, I might add) and we immediately (literally, immediately) sent the code along. They have yet to pay the other 50%.

Now, months after the app shipped (literally months after the client shipped the app to the App Store and is collecting the IAP revenue), and weeks after they were meant to pay the second 50%, they have declared that it is ‘terrible’ and ‘horribly broken’, and are refusing to pay until they fix it. (I say they fix it, because while we’ve offered — even though we’re definitely not obligated to — they haven’t given us a bug report.)

It’s at this point I should add: after shipping the first release to the App Store, the client activated an optional final milestone in our agreement for us to perform some additional work on any bugs discovered since launch. All were minor, and largely cosmetic (the client supplied the list), and we shipped that build off to them. They have yet to set it live, and if there was a ‘terrible’, ‘horribly broken’ issue with the first version that shipped we’d have expected them to include that on the list of things to fix for that milestone (and if they were so unhappy with us why did they activate that milestone?)

Despite the client disappearing for a number of weeks in between the app shipping and them turning up and declaring it broken we, of course, offered to take a look into the issue they were seeing.

No bug report was forthcoming and the client went back to ignoring us. So we got our lawyer involved, and the client responded with a video showing the app not working to our lawyer. They didn’t supply a bug report, or credentials that result in the broken experience the video showed. Nothing useful, just a video. (We can’t reproduce the issue, but aren’t accusing them of lying; software is software. Software has bugs. While they had ample opportunity to report such a bug, and while we’re no longer really obligated to look into it, we would, because we like our clients. We just need an actual bug report, not a video, and not emails ranting about how everything is broken without providing context or requested information).

We’re owed nearly $50,000 AUD, and are very very out of pocket. The client throws around such comments as “it’s not that much money”, and “money is not the problem” but doesn’t take us up on our very generous offer to take a look into their issues regardless (and, indeed, only sent a video when our lawyer got involved. The video isn’t helpful to actually investigate the problem.)

We’re now in the position of having to take what seemed like a dream client to court for an amount of money that, while not very much in the scheme of things, makes a big difference to a small business that’s very selective with who it takes as a client.

Suffice to say, it hurts us, big time, and makes the difference between being able to go to a conference where we might find more work, and having to stay home. Or, you know, fund the popular open source project we work on.

I guess that we’re lucky that we’ve never had to really deal with this before in our nearly 12 years of existence.

Recommendations welcome. My email is paris@paris.id.au ❤️