June 11, 2016
Listening to ATP this morning got me thinking about the recent subscription announcements for the App Stores. During the discussion, John mentioned charging a fee once per year vs. once per month, which led my brain to play out the following things.
What if Acorn did charge $29.99 a year? Would that be awesome? It would certainly fix the problem where folks don't have to pay for the next major upgrade and it's also very similar to what Sketch 4.0 is planning on doing. It also fixes the problem where someone purchases Acorn 5 the day before Acorn 6 comes out, and misses out on a grace period that doesn't currently exist on the App Store (though direct purchases get this automatically because we can just send out an email with a new license).
Yes, this could be awesome. But wait. I also have customers that aren't able to upgrade to the next major version of the OS for any number of reasons, and what if Acorn 6 was 10.12+ only? Does that mean folks still on 10.10 or 10.11 are paying a yearly fee even though they will no longer get any feature upgrades?
This breaks my heart. At Flying Meat we've traditionally had the philosophy that we sell something, and if you like it you can give us some money for it and use it for as long as you'd like. Subscriptions will probably break that. So unless the App Store provides a way for apps with expired subscriptions to keep on working, I don't think it'd be a good fit for Acorn. Also that sounds like paid upgrades (I really miss paid upgrades).
Of course, I could always try the subscription route via the App Store, and then keep direct sales just the way they are today- i.e., you buy something and you get something to use for as long as you'd like. But then I worry that might lead to more customer confusion.
Maybe I'll let other folks try this stuff out first.
June 7, 2016
Buried in the Dictation section of the Accessibility System Pref pane, behind the "Dictation Commands…" button is a checkbox with the label "Enable advanced commands".
When turned on, it lets you add your own commands which can perform specific actions like opening a URL, a file from the Finder, pasting text, or even running an Automator workflow.
This is pretty neat, and enables me to run shell scripts or even make a new build of Acorn when I ask it. We're almost there.
June 7, 2016
What I'm guessing will happen
- An Amazon Echo like product, but it'll be tied to Siri and it'll have a sweet SDK. Maybe we'll have one under our seats?
- Mac OS X rebrand to macOS 12.
- Siri availablitly on OS X. Finally. Maybe always on as well? I've got an Amazon Echo and absolutely love it, so having the ability to drive my Mac with voice commands would be super awesome.
- Probably a new 5k display, since the current displays are crazy old.
- New Mac Pros announced, which can drive the new 5k display. However I'm not terribly excited about this, as I wasn't happy with the 2013 Pros (I actually sold mine a little while back. I'm on an iMac 5k now).
- Xcode 8.
What I want to happen, probably but won't
- I really want the rebrand of Mac OS X to be "Mac OS". That capital letter and the space mean a lot to me. If I can't have that, MacOS will do.
- A Mac OS upgrade which is about bug fixes and minor features. Maybe even moving to an 18 month upgrade cycle instead of a yearly one.
- New Macs with ARM processors in them, with dev kits in a month or so. This WWDC can be all about the transition to ARM, so Mac OS won't get a ton of new features.
- Some awesome new features for Swift that haven't been made public yet.
- An upgrade to OpenCL. Unfortunately, It seems that Apple has moved on. If I can't have that, how about Metal on the CPU? (Why CPU? Well, some things like flood fill are faster in Acorn when the memory is local to it).
Other stuff I Predict
- I'll see a lot of old friends, and hopefully make some new ones.
- A lot of pizza will be eaten.
- I'm going to be exhausted by the end of the week.
May 16, 2016
Acorn 5.4 was released for direct customers today. This is a feature update, which includes new color profile goodies. The full release notes are available for the details.
But the most amazing holy **** moment happened with this release. I built and submitted it for the App Store this morning.
And then seven hours later it was approved.
Don't forget to go give it five stars on the MAS.
May 16, 2016
Brent Simmons has had some good posts lately on the (lack of) dynamic nature of Swift: The Tension of Swift, A Hypothetical Responder Chain Written in Swift, The Case for Dynamic-Swift Optimism. Manton Reece also has a good take, and Daniel Jalkut is optimistic as always.
Being able to write dynamic, responder chain-like code in Swift or Objective-C (or whatever) is extremely important to me. And if I had to give one reason why it would be this: Dynamic code is less code, and less code means fewer bugs and maintenance.
Here's a simple example. Acorn's canvas class has a neat bit of code where it overrides methodSignatureForSelector:, respondsToSelector:, and forwardInvocation: so that it can either act on a given message or pass that along to the currently selected layer(s). It's 44 lines of code including comments, which I wrote once years ago.
With that in place, I can add a new menu item named "Add Layer Mask" with an action of addLayerMask: and a target of nil. Then in the layer class (or subclass if it's only specific to a bitmap or shape layer) I add a single method named addLayerMask:, and I'm pretty much done after writing the code to do the real work.
When the menu is shown via pull down (or contextual menu, etc.) the responder chain is queried, the frontmost canvas asks the currently selected layers if it responds to this method, and then things go on smoothly as you'd expect from there. Menu items are dynamically enabled or disabled, and then actions are called to perform the method when the menu is selected.
What I didn't add was a giant switch statement like we did in the bad old days of classic Mac OS programming. What I didn't add was glue code in various locations setting up targets and actions at runtime that would have to be massaged and updated whenever I changed something. I'm not checking a list of selectors and casting classes around to make the right calls.
Would a switch statement be faster? Probably. I bet you could shave off nanoseconds. But it's simply not worth it in my opinion.
Other people would disagree of course. But I try to pick my battles wisely.
Would I write dynamic code to do the actual processing of images? Of course not, only an insane person would. Would I use dynamic code for any performance critical path in my application? Again, only crazy people.
Dynamic code lets me cut down on clutter, glue code, and unnecessary boiler plate. It lets me focus on what makes Acorn great and lets me worry about what parts need to be fast and safe. I think making Swift more dynamic, where appropriate, would be a huge boon to app developers everywhere.
May 15, 2016
From my friend Albert: Racism is the bogeyman
"America is not a young land: it is old and dirty and evil before the settlers, before the Indians. The evil is there waiting."
May 13, 2016
Daniel Jalkut: Twenty Years
"This year, many new young people will stare down at the relatively meager salary they’ll be earning, sign away their agreement to start in two weeks, and be in for the twenty-year ride of their lives."
May 13th is an interesting day for myself as well. Eleven years ago, May 13th was the last day that I would ever be working for The Man.
It's also George's birthday. We must not forget that. Happy birthday George.
May 4, 2016
Koka's Beat Machine No. 2
I've never wanted a little CNC machine more in my life. The other videos are great too.
April 6, 2016
Sound Off, a non-profit founded to help marginalized people in tech, are raising money to provide live captioning for UIKonf.
If you have some money to spare (and if you're in tech, you do), then why not give a little to help out?
March 29, 2016
From a 2010 article on the 40th anniversary Jimi's death:
"“We started from the premise that music was a mission, not a competition,” says Mayer, who describes himself as a “sonic consultant” to Hendrix. “That the basis was the blues, but that the framework of the blues was too tight. We’d talk first about what he wanted the emotion of the song to be. What’s the vision? He would talk in colours and my job was to give him the electronic palette which would engineer those colours so he could paint the canvas.
"“Let me try to explain why it sounds like it does: when you listen to Hendrix, you are listening to music in its pure form,” he adds. “The electronics we used were ‘feed forward’, which means that the input from the player projects forward – the equivalent of electronic shadow dancing – so that what happens derives from the original sound and modifies what is being played. But nothing can be predictive – it is speed-forward analogue, a non-repetitive wave form, and that is the definition of pure music and therefore the diametric opposite of digital.
"“Look, if you throw a pebble into a lake, you have no way of predicting the ripples – it depends on how you throw the stone, or the wind. Digital makes the false presumption that you can predict those ripples, but Jimi and I were always looking for the warning signs. The brain knows when it hears repetition that this is no longer music and what you hear when you listen to Hendrix is pure music. It took discussion and experiment, and some frustrations, but then that moment would come, we’d put the headphones down and say, ‘Got it. That’s the one.’"