2022

2021

In regards to growth marketing, surveilance capitalism, algorithmic moral-panic-driven profiteering I think there’s kind-of Darwinian evolution of our kids’ immune systems. My (now adult) kids responses to all this nonsense really brightens my day.

The axiiio nano camera robotics system is back, baby!

Indiegogo > October 19, 2021 www.axiiio.com/view/laun…

We’re offering 4 kits this time, motor encoder has been redesigned, software has been improved. It’s better than ever.

Apple Maps shows a new message I’ve not seen before asking if I want to switch routes to save 2 minutes. When I don’t answer BECAUSE I’M DRIVING, it does it anyway. I realise late that it’s now taking me to the freeway, which I was trying to avoid. I Keep avoiding the freeway and now it takes me on a wild ride adding 15 minutes… well done.

Sometime mobile software UIs feel like they’re just activity indicators all the way down.

A few years back there was a backlash against job descriptions seeking rockstars, or ninjas. And that was a relief. Now, I think we’re entering a post-startup era; I keep seeing job descriptions emphasising low-ego engineering cultures. Low ego seems to be the new value statement describing the essential ingredient to good engineering, replacing the rockstar?

The tech culture attitude that you have to get on the train or else get left behind is horseshit. Never met a programmer who was unable to get up to speed about something new, when the need arose.

Pffft Bill & Melinda Gates are such noobs, bailing out at 27. Kris and I are coming up to our 28th!

Don’t know about you but “Get started with Trello Workspaces: add your Personal boards to a Workspace now, or it’ll happen automatically starting April 24th.” seems vaguely threatening?!

Making the example app for my next article about using a Redux-style architecture in SwiftUI. Can you guess what the app is called?

Discoverred this morning that there are no posts on the axiiio Facebook page (https://www.facebook.com/axiiio) and we can’t post new ones. That’s because Facebook has classified us as a “news” site and currently blocked in Australia! WTH?

2020

A Haiku to social media:

Instagram accounts cross paths, following, liking algorithmically

I am loosing my mind…

Facebook Management UI is like some Crazy, Hostile Text Adventure Game You Can Never Win

Recently I’ve spent some time managing the axiiio social media accounts, and I can’t believe how much of a train wreck Facebook management UI is. Is this the peak of split testing/optimisation/growth hacking ? If so, I’m out!

I’ve found 3-4 different UIs for the same management features, each one with it’s own bugs, differences in displayed information, performance issues, functionality limits, and how to navigate there. It feels so hostile for me to use and try to navigate; as if I’m a lab rat in a maze.

For the axiiio page, I go to Manage Page, to find two ways to see Notifications, one on either side of the screen. Marking all as read on one list fails to mark them as read on the other. Every other manament UI also has a notifications list, it seems they all manage their unread notifications individually.

I open Publishing Tools, and select Published Posts and it shows me an advertorial for Business Suite, but I can still create a post from there. I can also still see my draft posts, and create a new draft. If I select Video Library, it takes me to Creator Studio in a new tab. There I see a list of Facebook posts and a seperate list of Instagram posts. If I go to Business Suite and select Posts I see a list of all Facebook and Instagram posts together.

Amusingly, in the original Publishing Tools screen, once you select Video Library and the new tab opens, back on the original tab you can see an advertorial for Creator Studio. “We’re moving to Creator Studio!” it announces with enthusiasm. “Post and videos are moving to Creator Studio. The transition will begin from between late September and early October.” This is the only place I’ve seen this notice.

For ads I can visit Ad Center, or Ads in Business Suite (which shows me Ad Center embedded). At the bottom of the list in Ad Center you see a link: “Show more details in Ads Manager”. Ads Manager is entirely different to anything else, a crazy tri-pane hellscape of tables and tabs. Ads Manager causes a Safari lockup sometimes, forcing me to close the tab. Want to know how well an ad is doing? Good luck!

Back at Manage Page, select Insights and you’ll see a summary of page and post statistics. You can do the same in Business Suite to see a different Insights UI. Try this in Creator Studio and you’ll find a 3rd take on it.

There’s a link in Creator Studio Insights labelled Overview. Select that one! Like some crazy puzzle adventure game, it’s a secret portal and you’re transported to an even older UI called FB Pages!

This looks to be the same as the Manage Page Insights page but with a different design. However, FB Pages still has a navigation bar. To what you should ask? It’s another Ad Center! There’s another Notifications list (unread marks still glowing for all the notification I’ve marked as read on previous screens!). There’s also another UI for Publishing Tools!

Visit Publishing Tools and you can enter the recursion tunnel by selecting Video Library to open Creator Studio, or selecting Posts and clicking the Try Business Suite button.

There seems to be no end to this recursive madness, I’m holding onto the thought that when the time comes, I can just leave and never return.

Was woken up last night by an argument I was having in my dream: you can’t apply the practice of software metrics to a marriage! You’re only measuring one dimension, growth, and you don’t know where that’ll come from! Truth bombs?

RIP Hamish 2005 - 2020

Hamish was a white Terrier puppy that we gave to our Son aged 11 as an encouragement reward for doing well at school. Our son was born with cerebral palsy, and during his school years he faced more challenges than most. But Matthew and Hamish were alike in their determination and tenacity.

In a way, Hamish was a therapy dog for our Son. A constant, loyal companion, Matthew could look after and train, and who would return his affection faithfully. Matthew is now a working Archeologist, a tribute to his doggedness to overcome his challenges and achieve a role where he thought he could make a contribution to human knowledge and society.

Hamish deserves a memorial for his contribution to our son’s life and our family, and this brief blog post is mine.

Hamish’s favourite activity was going for walks around the neighbourhood where he could pee on every tree, bush, lamp post and street sign. He did this with practiced precision, often spending minutes walking back and forth, lining up the perfect shot. This would continue for the whole walk, long after the tank was empty.

His favourite walks were along the beach, where he could target particularly nasty smells, such as the rotting remains of sea creatures, to roll in and bring home with him.

He’d make a bone last days; gnawing on it for hours, then burying it until it was ripe several days later, reviving it from the earth and spending a few more hours at it He was a true fetid gourmet.

He was fond of all company, accepted pats and belly rubs from anyone willing.

He particularly enjoyed wrestling with our children, playing tug of war with chew toys. He’d end up on his back, short arms splayed wide, grinning like a fluffy white ewok.

When I worked from home, making early starts, he’d come and sleep under my desk after breakfast keeping me company. I put a dog bed in my office so he’d have somewhere comfortable to lay down.

In more recent years, as he got older, he lost his hearing and gained a host of medical problems that made life uncomfortable for him. He slept most of the day and we bought him dog beds for his favourite resting spots; usually in places where we’d hang out in the house as a family.

During the day he’d visit the backyard repeatedly to lay on the grass in the full sun. I think the sun warming his old bones gave him relief.

Now we have a stack of smelly, unused dog beds in the corner. A strange void that we can’t shake; a bark from the other end of the house; a flash of white crossing the threshold to the backyard; the click clack on the timber floor as he comes looking for us in the house.

I’m sure we’ll find more fetid treasures he left for us buried in the yard somewhere.

Spend yesterday afternoon making a sunset timelapse with Adam and @axiiio at Elizabeth Quay in Perth. Beautiful and sunny, but it got quite chilly in the evening. Perth is the capital of sunsets!

2 beautiful Perth Urban Cranes engaged in a rarely seen mating ritual

My son sent me this, showing the Australian LNP holding fast to this moronic line about the sun and the wind…

We're on the road to Kickstarter!

axiiio has been my professional life for the last 18 months, learnt a hell of a lot along the way. I’m pretty chuffed with how responsive the app is and how accurate and seemless the scale animations feel. CoreAnimation, for all it’s hassle, just plain rocks.

axiiio is a system of 3 core components that allow you to add programmable motion control to any camera rig, that you control over WiFi via the app. You can control up to 4 motors per receiver with the app, in real time, using preset cues, or through a motion program.

There’s a great short intro video on the axiiio Youtube channel.

The app can setup each motor for different roles; tilt, pan, roll, linear motion or lens control. There’s also a set of fine adjustments you can make to ramping, velocity responsiveness and so on. You can then setup your preferred on screen controls to suit your rig; a joystick control for tilt/pan, a slider-style control for controlling velocity (linear axes, rotational axes or zoom control for example), or a positional control for controlling motor position in real time (e.g. for focus control)

The scale for each screen control can display measurements, “wax” marks, cue marks and program marks that are highly accurate to the real position of the axis. Check out the test reel footage of this in action on the Youtube channel.

You can also create 3 types motion programs in the app: video motion, timelapse, and stop motion. Programs and configurations are all exportable and sharable as simple files.

Checkout the Kickstarter launch page for more info.

I was really happy with this paragraph:

” A well-designed haptic experience also takes time. You need to test many subtle variations, but it’s a hoot to be able to say to friends that you just spent the afternoon designing the perfect haptic experience for a crocodile eating a pineapple.” www.raywenderlich.com/10608020-…

The Apple Combine framework is like taking the red pill; the more I use it the more I want to see how deep the rabbit hole goes. So far it hasn’t effected build times, app performance or memory usage in any way, and I feel like I can solve so many problems with it. In fact there have been cases where it’s improved app performance once I removed home rolled async solutions - especially when removing OperationQueues and custom Operation subclasses, surprisingly!

UILayoutGuide where have you been all my life. If you’re making a complicated layout where you want the some parts of the view to display under the safe areas to the edge of the screen, but other parts to sit within the safe area, UILayoutGuide is a good friend to have.

2019

It’s finally out: the vid explaining exactly what the Axiiio motion control system can do for filmmakers youtu.be/55h0l3ZVd… This is what I’ve been building an app for this year!

Suddenly concerned for how many Swift files I have included an erroneous import Foundation statement!

SwiftUI stole the spotlight at WWDC 2019, but Combine, diffable data sources, and collection view compositional layouts, fix a huge amount of annoying things in UIKit. Really enjoying getting to know them all.

Watching a timelapse being taken is almost as good as watching paint dry, but here’s a cool pic

Some Friday night fun,@axiiio testing with an evening motion time lapse

Haven’t had one of these in a while. Trying to use @Published from Combine with a tuple property causes a segmentation fault: 11 in the compiler. Eg. @Published var value: (Int,Int) = (0,0) will cause a segfault in a method where you update that value: value = (intVal, intVal)

Ryan Singer is spot on in this thread about product ownership twitter.com/rjs/statu… “playing time Tetris” is my new favourite analogy!

My tip for SwiftUI: if you find your list of @State variables is growing long, admit it: you’re actually building a view controller. Stop that! Start breaking it up into smaller View components.

First impressions of using SwiftUI for real

My first impressions of SwiftUI were it was a bit of a slog to get up to speed; the changes from the beta to the release version weren’t helping; sudden unfamiliarity after years of UIKit was uncomfortable; live previews were failing more often than they were working.

But after a couple of weeks it dawned on me: you’re mad to try and build a SwiftUI app like a UIKit app; which of course was what I was doing.

UIKit requires you to have a working app, to even start to see anything running. With SwiftUI you can start from a single screen that you’ve been imagining and see its preview as you build. No need to think about the app’s model, the launch behaviours, the navigation, or any of the plumbing.

Gotta break those UIKit habits; just start playing with a single view. It was much more rewarding and each proof of concept was easier to reach. Kind of like building from the inside out. You get to build the most important concepts first.

Damn, just noticed in tomorrow’s forecast, Shifty Jelly announce the Pocket Weather servers are finally shutting down Dec 31st 2019

My new favourite Google search query argument: -site:medium.com. What a breath of fresh air.

If you’re going to use UIDocumentPickerViewController, and also support opening files from the Files app, and now the home screen on iOS 13, it’s best to just use a UIDocument subclass. Even if it’s simple data. UIDocument handles the security-scoped URLs and file coordination, saving you some potential frustration.

Hoorah! In Swift 5.1 omitting return from single line functions also applies to computed properties. It’s the little things…

If you’re using the Network Extension framework and are getting a crash building on Xcode 11 running on iOS versions pre-13: dyld: Symbol not found: _NEHotspotConfigurationErrorDomain there’s a messy workaround described here: forums.developer.apple.com/thread/12…

Trying to track down my Grandfather’s WWII service medals and record of service book.

Here’s a mystery! I was searching for details about my Grandfathers WWII service in Tobruk today; he was Private Stanley Herbert Seiver, serial number: WX9870. I stumbled on some photos of his medals and service record on a Flickr photo stream:

www.flickr.com/photos/ka…

This was uploaded to Flickr in 2015, with a comment saying “Found on eBay”.

Turns out they’ve been missing since 2001, and no one has seen them since. I assume sometime in 2015 they were sold on eBay.

Not sure what to do next…

For years I’ve been wondering where the track “When the tigers broke free” came from, that’s heard at the start of the Alan Parker, Pink Floyd: The Wall movie. Because it’s not on the Pink Floyd album.

Just found it on The Final Cut album! In all those years a simple search would have probably found it for me :P

My Objective-C is getting a little rusty… * looks up NS_ENUM syntax…*

Good read from Dropbox about the cost of sharing code between Android and iOS: blogs.dropbox.com/tech/2019…

I’ve never fully bought into the notion that building native apps on Android and iOS is a waste of engineering capacity because you’re building the same thing twice. I’ve no experience to back that up, just a feeling that native development is the most straight forward way to get a product made. Straight forward to maintain, support, hire developers for. You’re not swimming against the current of the platform improvements that are constantly delivered by Apple and Google.

Rework (23 July) is a great episode for people struggling with building complex software products in teams overcast.fm esp. if you’re over the way agile is done in a lot of places.

Working in 2 week sprints was supposed to provide a realistic perspective on development capacity, to enable better product prioritisation decisions. In my experience all it did was allow pressure to be exerted downwards to the developers; always the question why sprint targets were missed.

Even with all the battering rams and canon balls in my arsenal, I could not storm the gates of Sleep Castle.

despite my many invitations, attempts, offers of support; my love of sleep remained unrequited

Sleep eluded me last night; paraded it’s witnesses and suspects through my head; by the morning it was still at large.

I feel like I’ve finally got a handle on how Auto Layout works with UIStackViews, how stackviews get their intrinsic content size depending on the set alignment and distribution properties. Luckily, just in time to be able to toss it all away for SwiftUI :D

My Son’s dog, a little white terrier, was leaving my office. He stopped in the doorway, turned to look back at me, farted noisily, then continued down the hall. Now I’m racking my brain for what I might have done for him to take offence. An acrid cloud of tension lingers in the air between us…

Considering SwiftUI, now I see how much wasted time was spent on intense discussions about things like, should you pass your model object to your UITableCell subclass to set its properties?

No one warned me that being a contract software developer, also means schlepping equipment up a mountain…

Even more Axiiio field testing; this time in the old convict settlement ruins near Port Gregory, Western Australia

mp-photo-alt[]=mp-photo-alt[]=

Some Axiiio field testing while in a camping trip. Getting a motion time lapse of the sunset.

Garnet grains on a beach near Kalbarri, Western Australia. Looked like a dusting of pink sugar across the beach.

Jumping on the immutable state bandwagon (with a nod to Redux) in an iOS app, suddenly opens up a bunch of opportunities for testing. I can save and load an app’s state to/from a file, which is super handy.

Well this is annoying. Same Swift code literal is correctly CGFloat outside of an array, but within the array it’s an Int… !? Also the 1.0 on the next line becomes a Double, :slaps_forhead:.

It’s only when you’re sharing code between platforms that you discover things like on iOS char is signed, but on 32bit ARM systems like Teensy 3.x char is unsigned. My brain is exploding trying to understand the consequences.

Working out of Axiiio labs this week. Working with embedded devices is a whole new world from working on a big software stack. Lots of fun though.

The new Xcode lldb v command seems a lot faster, but at first try I don’t think it can see type extensions. po sees the method in my class extension but v doesn’t?

Whoa… if you know Objective-C, you’ll appreciate this method name I just found in UIFoundation:

-[NSCoreTypesetter _NSFastDrawString:length:attributes:paragraphStyle:typesetterBehavior:lineBreakMode:rect:padding:cgContext:baselineRendering:usesFontLeading:usesScreenFont:scrollable:syncAlignment:mirrored:boundingRectPointer:baselineOffsetPointer:wantsTextLineFragments:applicationFrameworkContext:]

Xcode upgrade, Swift 5 migration went surprisingly well. All I had to do was upgrade carthage and build the project, no changes required. Lovely when that happens.

This is Apple admitting their previous CoreData examples were rubbish:

“Previously in iOS, the Core Data stack was typically initialized within the application delegate. However, doing so causes a significant amount of code to get muddled in with application life cycle events.”

My son said to me the other day he wonders why when there are so many companies selling content why business models are only ever ads or subscriptions… good point!

Cleaning out old cupboards and drawers is like suburban archeology. For example, in a drawer filled with junk I found 5 hole punches. I think I can draw a pretty accurate conclusion that we’ve had the need to punch holes in paper approximately 5 times in the last 10 years.

#SurryHills

Dim Gaggle of UberbEats riders outside Chur burger all bikes, backpacks, and impatience

Muted terraces signaling to huddled pedestrians outrunning the rain finding sporadic shelter under the Sober trees

Love in the time of unit testing

Here’s the text of a lightning-talk I gave at the beginning of 2016 at one of SafetyCulture’s Townsville company gatherings. I really liked it and thought I should share it here for posterity.

My talk today is on Unit Testing, kind of a boring topic I realise.

In the world of iOS unit testing doesn’t come naturally, It’s uncommon to find an iOS engineer with lots of unit testing experience. And yet every iOS developer here who has given it a go, has been amazed and how much it helps them. when writing new code.

There’s a gap

So i’m wondering about that gap between the unit testing the chore and the epiphany of how helpful unit testing is. And this is my crack at bridging the gap.

Too much focus on what and how

I notice that when I talk about unit testing generally I always focus on the what and the how. What to test, what shouldn’t be in a unit test, how to test classes that have dependancies, how to mock objects and things like HTTP requests.

Much complaining

And mostly complaining about how the unit tests are always failing, needing maintenance, are out of date, or test very little.

Unit testing is a chore

How they take too long to write, or how, once automated testing is running, no one can merge a PR until all tests pass. Because I think that’s what happens when you focus on the what and the how. Unit tests become a chore.

You didn’t estimate enough time

It’s not a part of the programming you’re doing, it’s the bit you tack onto the end, that you didn’t estimate enough time for. Unit tests are a hassle, a pain in the arse, a velocity-sapping, slog.

Why even unit test

The what and how tend to get entangled in procedure. it gets in the way of working out why your even doing it. Other than I have to write some and they have to pass to get my PR merged.

I think if you truely understand why you’re writing unit tests, all the rest follows. All the things you want to put in a test, all the ways you want to test it all become easier through the lens of knowing why.

It’s not all about you

And sure unit testing is helpful while you’re writing new code. Writing or refactoring code in a complex app can be terrifying. Adding tests along the way helps you make sure you’re on the right track, spot edge cases and so on sure.

But it’s not all about you!

Do it for love

Most defects are introduced during coding, but the least number of defects are found during coding. There’s only one reason to write unit tests, the only reason that matters.

You have to do it for love.

Don’t worry, I got your back

Unit tests are a declaration of love for your fellow engineers. They say I care about you, man, and the work you’re about to do. Don’t worry I got your back.

Unit tests are a declaration of love for the product. Unit tests are a declaration of love for SafetyCulture. What happens when you have love in your unit tests?

See it from the other engineers’ perspective

You start to think differently about your code , you start to see it from the other engineers’ perspective. You think about how to make it more testable, you think about all the possible states your code can get into.

You think about how someone else might approach using your API. You write your tests in a way that demonstrate how it should work, how it can fail, what can go wrong when it does.

Tripping balls

You can demonstrate how your code will behave in a positive state, a negative state, and a tripping-balls-what-hell-is-going-on state.

You haven’t broken anything

When you go to work on a codebase with love in its unit tests you know you can rely on them to show you how it’s all supposed to work and reassure you that you haven’t broken anything.

Your team is behind you

You can bravely take on those big refactoring jobs, knowing your team is behind you all the way. Once you know why your writing those unit tests, it guides you on the implementation.

The next engineer

You worry about the time it takes to run: you want to make sure the next engineer can run them as often as they need to feel secure.

Avoid fragile tests

You avoid writing fragile tests that rely on timing, on application state, or UI state – anything that could randomly fail if conditions aren’t right – because that creates confusion, and uncertainty.

And you care that the engineer running your tests is not left confounded, wondering why the tests are failing 10% of the time.

Mock or stub only when necessary

You use mocking or stubbing only for what’s necessary, because overuse ties the unit tests too much to the implementation details of mocked classes. You don’t want to make your mate rewrite all your tests because some unrelated implementation detail has changed.

Avoid persistent state changes

You avoid making persistent state changes you don’t want your unit tests leaving behind a mess someone else has to clean up.

Be descriptive

You make sure to be as descriptive as you can about what’s going on in your tests and why the expected output is legit.

Test something useful

You make sure your tests actually test something useful.

Write tests for humans not robots

Your avoid torturing your code (by breaking it into smaller and smaller parts until it’s perfectly testable, all dependancies are explicit, code coverage is very high, but understandability is very low) because you know you’re writing tests for you fellow human engineers, not writing tests for robots to run.

Even though we might automate them.

Write tests with love

You write tests with love, because you’re not writing them for yourself, You’re writing them for the next engineer, because you care that they succeed.

Inevitably, 6 months down the track, that next engineer turns out to be you. And you can say, thanks past me, you’re weren’t such a jerk after all.

So many evil cats! Played Root for the first time. Really good fun. Each player has different rules, but somehow it all works magically.

Nothing says you love your dog more than waking up to find you still have a dog. Despite being up at 5:30am mopping dog shit that had been walked from one end of the house to the other.

I’m disappointed that the non-meat hamburger companies haven’t used, what I think is, the obvious slogan: “I can’t believe it’s not murder!”, or, if you prefer, “I can’t believe it’s not slaughter!”

Uppercase UUIDs on iOS

If you work in a cross-platform company, you realise iOS is the only one to output upper-case UUIDs. Which is odd. Apple purport to respect RFC 4122, and while that states uppercase characters are within the valid set, it also states “The hexadecimal values “a” through “f” are output as lower case characters and are case insensitive on input.”

So I’m thinking Apple’s implementation is wrong.

Opening the Mac OS Books app to check the spelling of Hugh Howey’s name, I clicked on the book and got this insane error dialog. “Reinstall iTunes” .. seriously?! Reopening Books fixed it.

Haven’t read a book in a while and I finished 3 books over Xmas: The Wool Trilogy by Hugh Howey. Cracking good post-apocalyptic tale.

2018

So my dog just walked into the office and belched… and that’s how I knew she’d been in the kitchen bin again. What a morning I’m having.

I awoke this morning with a stunning realisation: I have never heard a cat fart.

In Swift what is the nature of an optional Void ? If it’s .some then it’s nothing, but if it’s .none then, is it everything?

One of my eldest sons said to me this morning “I think one of the best parts of parenting must be trolling your kids”. I can’t begin to describe the feeling of satisfaction, and yes, pure joy, that I experienced hearing those words; like I did something right as a parent.

I’m building a document-based app, and having to setup a seperate Xcode framework target for the document model code, so it can be used in the app and the app extensions. Turned out to be a really nice way to segregate an Xcode project.

Dining Room Table Project - Part 4

First board filled, sanded and oiled. I’m in love with Marri.

Dining Room Table Project - Part 3

Working out the best way to fill the holes, cracks and gnarly bits with clear expoxy resin

Dining Room Table Project - Part 1

Selecting the wood: some lovely Western Australian Marri boards