Or try one of the following: 詹姆斯.com, adult swim, Afterdawn, Ajaxian, Andy Budd, Ask a Ninja, AtomEnabled.org, BBC News, BBC Arabic, BBC China, BBC Russia, Brent Simmons, Channel Frederator, CNN, Digg, Diggnation, Flickr, Google News, Google Video, Harvard Law, Hebrew Language, InfoWorld, iTunes, Japanese Language, Korean Language, mir.aculo.us, Movie Trailers, Newspond, Nick Bradbury, OK/Cancel, OS News, Phil Ringnalda, Photoshop Videocast, reddit, Romanian Language, Russian Language, Ryan Parman, Traditional Chinese Language, Technorati, Tim Bray, TUAW, TVgasm, UNEASYsilence, Web 2.0 Show, Windows Vista Blog, XKCD, Yahoo! News, You Tube, Zeldman
Mysterious SwiftUI Crash 24 Feb 2021, 7:21 pm
A friend just released a new version of their app — and it has a new crash not seen during development.
This new version of the app has a bunch of new SwiftUI code, and this crash is definitely in SwiftUI — but it’s apparently in SwiftUI itself.
Anyone else seen this? Is there something my friend can do to work around this?
Hardware Model: iPhone13,4 Code Type: ARM-64 OS Version: iPhone OS 14.4 (18D52) Exception Type: SIGTRAP Exception Codes: TRAP_BRKPT at 0x19d447a18 Crashed Thread: 0 Thread 0 Crashed: 0 libswiftCore.dylib 0x000000019d447a18 _assertionFailure(_:_:file:line:flags:) + 492 1 SwiftUI 0x00000001a011c52c ViewCache.commitPlacedChildren(from:to:) + 3032 2 SwiftUI 0x000000019ffc8eb4 specialized IncrementalChildPlacements.updateValue() + 1384 3 SwiftUI 0x00000001a00e6fbc partial apply for specialized + 24 4 AttributeGraph 0x00000001c2cbba50 AG::Graph::UpdateStack::update() + 492 5 AttributeGraph 0x00000001c2cbbe84 AG::Graph::update_attribute(AG::data::ptr<AG::Node>, bool) + 332 6 AttributeGraph 0x00000001c2cc5088 AG::Subgraph::update(unsigned int) + 884 7 SwiftUI 0x00000001a07d1cdc GraphHost.runTransaction() + 172 8 SwiftUI 0x00000001a07d4e1c GraphHost.runTransaction(_:) + 92 9 SwiftUI 0x00000001a07d37a8 GraphHost.flushTransactions() + 176 10 SwiftUI 0x00000001a07d4db4 closure #1 in closure #1 in GraphHost.asyncTransaction<A>(_:mutation:style:) + 24 11 SwiftUI 0x00000001a02a3168 partial apply for closure #1 in ViewGraphDelegate.updateGraph<A>(body:) + 28 12 SwiftUI 0x00000001a0726e9c closure #1 in ViewRendererHost.updateViewGraph<A>(body:) + 108 13 SwiftUI 0x00000001a071de7c ViewRendererHost.updateViewGraph<A>(body:) + 92 14 SwiftUI 0x00000001a029f6d0 ViewGraphDelegate.updateGraph<A>(body:) + 80 15 SwiftUI 0x00000001a07d4d84 closure #1 in GraphHost.init(data:) + 124 16 SwiftUI 0x00000001a07d66f0 closure #1 in GraphHost.asyncTransaction<A>(_:mutation:style:)partial apply + 40 17 SwiftUI 0x00000001a02c2b98 thunk for @escaping @callee_guaranteed () -> () + 28 18 SwiftUI 0x000000019ff91a10 static NSRunLoop.flushObservers() + 148 19 SwiftUI 0x000000019ff91974 closure #1 in closure #1 in static NSRunLoop.addObserver(_:) + 16 20 SwiftUI 0x000000019ff8c4b4 specialized thunk for @callee_guaranteed () -> (@error @owned Error) + 24 21 libswiftObjectiveC.dylib 0x00000001bfcc3f30 autoreleasepool<A>(invoking:) + 64 22 SwiftUI 0x000000019ff91954 closure #1 in static NSRunLoop.addObserver(_:) + 64 23 SwiftUI 0x000000019ff91aac @objc closure #1 in static NSRunLoop.addObserver(_:) + 56 24 CoreFoundation 0x0000000199798358 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 36 25 CoreFoundation 0x00000001997925c4 __CFRunLoopDoObservers + 576 26 CoreFoundation 0x0000000199792b74 __CFRunLoopRun + 1056 27 CoreFoundation 0x000000019979221c CFRunLoopRunSpecific + 600 28 GraphicsServices 0x00000001b135e784 GSEventRunModal + 164 29 UIKitCore 0x000000019c1d2ee8 -[UIApplication _run] + 1072 30 UIKitCore 0x000000019c1d875c UIApplicationMain + 168 31 AppName 0x0000000100ed8444 main (main.m:19) 32 libdyld.dylib 0x00000001994526b0 start + 4
Slow House 23 Feb 2021, 1:27 am
“Slow House,” song #3, is more exercise than song. Where most songs have a structure like ABAB or ABACAB or whatever, this one is just A. Not even AAA — just A.
I wanted to get some practice recording an acoustic guitar — it’s the first GarageBand thing I’ve done where one of the parts was from a mic (a Yeti Blue). (All the previous parts are via MIDI and Apogee Jam.)
I was thinking about “Starman” by David Bowie, and how the verse starts with iim and I chords, which is a little unusual. In “Starman” it’s Gm and F — but I have a great deal of antipathy toward Gm (it can go straight to hell, if you ask me), so I used Am and G as the chords here.
And that’s all I did. No chorus, no other changes. Still, though, I like how it weaves two melodies together, and I like how it all falls apart at the end.
I also like how some of the string-like GarageBand instruments bring kind of a vocal sound — I can almost hear words in there. (But there are none.)
It’s called “Slow House” because it’s slow (as an antidote to the very fast Vampire’s Run) and because the piano is doing kind of a House thing.
Here’s the GarageBand file: SlowHouse.band.zip
It’s not until I make song #1,000 that I’ll make something people actually want to listen to more than once! I get that. I’m sharing anyway, because I think maybe it’s interesting to watch someone learn. 🐣
Vampire’s Run 17 Feb 2021, 5:45 am
My second song, “Vampire’s Run,” just finished last night, is thorny — chromatic, key-modulating, choppy-guitared — where Tie & Suit is aggressively smooth and diatonic.
I have many notes…
I started off wanting to do something early-REM-like. The idea — kind of a bullshit idea, but I liked it anyway — was this fast arpeggio on the top three strings of the guitar: B-E-D-B E-D-B-E C-E-Eflat-C E-D-B-E A-E-C#-A E-C#-A-E A-E-B-A E-B-A-E.
REM wouldn’t have done the C-E-Eflat-C part — but the rest would have fit in. Especially that move at the end from an A chord to Asus2.
To fit some chords to this, I came up with E7, a weird C major and minor, Bmsus4, A, Asus2. The idea is that you’d play the chords as normal but with the high E string always open. (A Buck-like move.)
It’s not actually pleasing-sounding — but, again, I liked it and figured I could make something out of it.
The problem: I made the song 170 beats per minute, and I can’t actually play that lick on guitar that fast. (My personal speed limit is pretty slow, actually.) I could play it on keyboard, though, so I did. It’s the very first thing you hear in the song. I cranked up the reverb on the Steinway Grand Piano instrument, and I thought it sounded great. Like a demented Charlie Brown song.
Next up was to add percussion and a bass line. The percussion is pretty much the same thing as in Tie & Suit. The bass followed the chord roots — E C B A — except that, at the end, I threw in this little blues-scale-ish lick: A-Bflat-B-Bflat-A-G-E-G-E. Which was also total bullshit, but it totally worked, so I kept it. The interaction of that with the piano arpeggio thing just sounded really cool to me.
At this point, though, this didn’t sound like REM in the least tiny bit. It sounded like an ’80s goth instrumental. So I leaned into it — added guitar instruments Eighties Goth and Starlit Cavern. Added a bunch of echo-y things like Stutter Stack and Swirling Flutters.
Last summer I started writing a blog post called “The Vampire’s Run in the Anarchist Jurisdiction” which was about going for a run at night (instead of the day, due to the pandemic) in my neighborhood in Seattle. I wasn’t able to figure out how to write it without sounding like some very fortunate guy who had to adapt in some small way and was pretty fine about it. Wouldn’t add anything to the world, so I didn’t finish it.
But, since that title was just lying around being all goth-y, I snagged the first part of it for this song. And, well, it kinda fits — the song is very fast, and during the chorus it almost sounds like flying.
The song structure here is simple: verse chorus verse chorus verse chorus. But there’s a key change: the verse is in E and the chorus is in C.
This is one of my favorite modulations. The chorus gets a kind of floaty and slightly sinister sound — hence the flying.
The first time I remember encountering this was in Beltane Walk by T. Rex. I remember asking my uncle, a musician, to explain the sorcery behind that song — and when, some years later, I heard that same sorcery in Hungry Like the Wolf I recognized it right away.
(I am, by the way, a glam rock guy at my core. Give me T. Rex and Bowie and all their descendants.)
Anyway — if you hear a little Duran Duran in the C-G-F chorus, you’re not wrong.
The chords aren’t actually C-G-F, though — they’re C-G6-Fmaj7 in order to make the E note prominent all throughout the song. The melody of the chorus is just arpeggios on the piano: E-C-G, E-B-G, E-C-A, with the E repeated. While the piano in the verse is tightly horizontal, the chorus is a bit more vertical.
(There’s a little fun part right as we lead into the chorus — it sounds like that split-second when a vampire leaves ground and is a little shakily airborne. You settle in in a moment. In the first chorus we have B-F#; in the second it’s D-A-B-F#, which makes it sound like Pachelbel’s Canon; and in the third it’s A-E-B-F# — a little “Hey Joe” action.)
String and other instruments are doing a C-B-A thing during the chorus — which is cool because, as you’ll remember, that also appears in the verse. Those exact same notes, which sound somewhat discordant in the verse, sound sweet in the chorus.
The song comes alive in the last third while it’s repeating the chorus before ending. I was recording the piano part for that last chorus, and I was feeling a little down that this entire song was just all these arpeggios. I started improvising — and I worked up some bits to add some more melody and passion to the song. Went all pentatonic on this shit — plus the minor third for some bluesiness. Banging on the E flat a bit.
This part comes as a surprise in the song, I think, and it was just as much a surprise to me, but it’s my favorite part. Part of me thinks you shouldn’t add so much new stuff at the end, but then I remember how “Every Little Thing She Does Is Magic” has this alternate melody at the end. And I think of how The Adversary by Crime and The City Solution — a favorite of mine from a favorite soundtrack — invents a whole new song, with a different time signature even, around the 3-minute mark.
“Vampire’s Run” ends on a simple repeated phrase which I thought sounded romantic: E D-C D C-A. Vampires love that romantic stuff.
And it ends ends on a lone E note from the piano — which sounds like a question.
If you want, you can download the GarageBand file: VampiresRun.band.zip
In case they’re interesting or fun to mess with — here’s a zip with GarageBand files for various “Tie & Suit” mixes.
Computer Music 7 Feb 2021, 11:26 pm
When I was a teenager I spent hundreds of hours making music on my computer. This isn’t a surprising thing to hear someone say — except that this was almost 40 years ago, and the computer wasn’t a Mac but an Apple ][ Plus.
I had an ALF II music synthesizer card with some car speakers hooked up to it. The ALF software and hardware supported nine voices, and you entered music into a staff using the computer paddles. (This page has a screenshot showing what that was like.)
Though it was a very slow way to work, and limited to beeps and bloops with varying properties, it was a miracle to me as a teenager. I took so much pleasure in layering the instruments to get something way beyond what I could perform on guitar or piano.
I stopped before turning 17. I don’t remember exactly why. Probably just spending more time writing words than music.
Tie & Suit
No recordings of the dozen or so songs I made exist. I remember fragments of some of them, and it’s fine that they don’t exist.
The one exception is the very last song I made, called “Tie & Suit.” I remember all of it: the chords, melody, arrangement, everything.
I had not, until “Tie & Suit,” written something with a traditional verse-chorus structure. Everything before that was more adventurous — to put it kindly — with odd chord progressions, lots of key changes, and weird structures. (I was convinced of my musical genius.)
I was frustrated that none of the songs I’d written were particularly memorable or even likable. I couldn’t play them on piano for someone else to enjoy. So I decided to write something simple and traditional.
I had a hobbling case of I-hate-top-forty when I was a teenager, and so I had to be sarcastic about this song: I called it “Tie & Suit” because I thought I was selling out creatively. (OMG the narcissism of me as a 16-year-old!)
Here’s the thing, though: writing a very simple melody with just five chords (I, IIm, IV, V, VIm) and a traditional structure worked! I don’t remember any of the earlier songs, but I remember this one perfectly well.
There’s a lesson in there, though I was too young to learn it.
I’ve been promising myself for years that I would allow myself to start making music again — only this time on a Mac with GarageBand. And so I did, just a few weeks ago. (This is my first time using GarageBand other than recording a couple tracks for James Dempsey last summer.)
I started where I left off, with “Tie & Suit.” Here’s a version where I tried to recreate what it sounded like on my Apple ][ Plus 37 years ago. It still ends up sounding more sophisticated than the original — it’s hard to make GarageBand sound like an early ’80s ALF II. I did my best (short of getting obsessed with it).
Also: it sucks. I know the song sucks. It doesn’t matter! I was 16 when I wrote it, and now I’m learning GarageBand and having fun.
The next thing I did was to try and make a modern version that’s still true to the original. “Tie & Suit 2021” also sucks — but it was so much fun to make!
I am now completely addicted to GarageBand. The pleasure of layering instruments together, picking their parts, and letting it play is every bit as intense as it was when I was 16 on that primitive gear. It’s hard to say that about most things! But this is just fucking wonderful.
URLSession’s Delegate Queue Should Be the Main Queue 27 Jan 2021, 8:01 pm
Consider this line of code from RSWeb, a framework NetNewsWire uses:
urlSession = URLSession(configuration: sessionConfiguration, delegate: self, delegateQueue: OperationQueue.main)
delegateQueue parameter specifies the queue for all delegate callbacks from URLSession — and here I’ve just gone and made it the main queue.
Some of you are screaming. I can hear you: “Brent, Brent, Brent — you’re going to block the main thread! Don’t do it!”
Let’s Back Up and Review the Documentation
The documentation says of the
delegateQueue parameter that it’s…
An operation queue for scheduling the delegate calls and completion handlers. The queue should be a serial queue, in order to ensure the correct ordering of callbacks.
(Pause right here and go check your own code to make sure you’re actually using serial queues. There’s a good chance you’re not.)
Given that the delegate callbacks should be on a serial queue, those callbacks should return as quickly as possible so that they don’t block subsequent calls.
You may have some expensive things to do — NetNewsWire, for instance, does RSS parsing and database updating. Those things should be done on separate serial queues — they should not be done on the delegate callback thread, because you don’t want to block it.
In other words, this all means that your delegate methods should be so fast that they wouldn’t block the main thread.
So Just Use the Main Thread
Your code that uses URLSession almost certainly has some data structures that do things like map a task identifier to some model object of some kind. You could go to lengths to make sure this is all thread-safe — and hope and pray nobody messes it up six months from now — or you could take the easy, safe route and go main-thread-only with that code.
That’s what we do with NetNewsWire. (And did with Vesper and other apps.)
It’s important to know I’m a performance junkie and a stability junkie — and with this practice I satisfy both.
iOS Jobs at Audible 26 Jan 2021, 10:42 pm
We could be co-workers! I love working at Audible, and I think you would too. Plus — no small thing — you’d be working on an app that means so much to millions of people.
Scroll down on this page to find a list of jobs (plus a link to a longer list). On the iOS team we have several engineering positions, a QA engineering position, and a software developer manager position.
New Domain for NetNewsWire 18 Jan 2021, 3:55 am
I was not foresighted enough, back in the early 2000s, to register the netnewswire.com domain — and so, of course, somebody else bought it with the hopes of selling it to me.
(These days the first thing you do is register the domain name. But that wasn’t as much a thing back then.)
I’ve been long resigned to never own that domain name. But then, just a few days before Christmas, I got an email from Ben Ubois, founder and developer of Feedbin, saying that he’d bought it for me. We transferred the domain pretty quickly after.
And then, this weekend, I got the new site set up — and now you can find NetNewsWire where it always should have been: netnewswire.com.
Thanks to Ben!
Early Test Build: NetNewsWire 6.0d4 for Mac 17 Jan 2021, 9:10 pm
The app is made of cat’s claws and fury. I try my damnedest to warn you off:
You should probably skip it. It’s not a beta. It’s not even an alpha. It’s a d release — where d, which used to stand for development, now stands for dangerous.
…let us satisfy your curiosity in advance: it’s just an app. It’s got some more features. You know the story, and you don’t need to run this if you’re just curious.
With that out of the way: the team has been doing great work! This is the first build with a Big Sur UI and app icon. It’s universal (Intel and Apple Silicon). It adds syncing via iCloud, Inoreader, NewsBlur, and others. It has special support for Twitter and Reddit feeds. Etc.
But I really do mean it when I say it’s early and dangerous. I’d like your help testing, but I need you to know it could be quite rocky and we may not have time to help you. You could lose data. You’d be doing a favor for the team which we have no way to repay — other than by eventually releasing the best app we can.
I’ve been haunted since hearing, in the early days of the pandemic, that if we all wore masks for six weeks this thing would be over.
I was there. I’ve done that for six weeks, and another six weeks, and another. And now it’s worse than ever. It’s a challenge not to be angry.
There are healthy, uninfected people right now, today, who are excited for the vaccine and who will die before they get it.
Bogus Code Signing Crash 5 Jan 2021, 7:02 am
For a few people, NetNewsWire for Mac crashes on startup — and the crash log erroneously blames an invalid code signature.
If it were truly invalid, the app wouldn’t launch for anybody. But it launches fine for almost everybody.
This started with macOS 10.15.4 and continues in macOS 11. We’ve posted more details on our issue tracker at GitHub.
Does anybody have any ideas for how to work around this?
When Are We Back To Normal? 31 Dec 2020, 8:01 pm
I’m trying to figure out when we’ll be back to something like normal. I’m thinking of a few things:
- Biden’s goal is 100 million doses in his first 100 days
- The vaccines require two doses
- There are 330 million people in the United States
- Dr. Fauci has said that we’ll achieve herd immunity once we have 70-85% of the population vaccinated
Let’s say we achieve herd immunity, and some kind or normalcy, at around 250 million people vaccinated, which is just over 75%.
Since each person requires two doses, that’s 500 million doses.
The pace Biden is aiming for is 1 million doses per day. If we’re able to achieve and sustain that pace starting late in January — which is not at all a sure thing — we’ll have administered 500 million doses around mid-year 2022.
I keep hearing people talk optimistically about April or May of 2021. Me, I’m hoping to be able to see my family for Thanksgiving and Christmas 2021, but I’m not counting on it as a sure thing.
We’re going to need to go much faster with the vaccines. To reach 75% of the population by, say, Labor Day, in time for kids to go back to school, we’re going to need to administer 500 million doses by mid-August, about seven months after Biden’s inauguration. (Remember that immunity is ramped up about two weeks after the second dose.) To make this happen we’ll need to administer 2-2.5 million doses per day.
I don’t see how we get there by counting on local drug stores to administer most of the doses. I suspect we’re going to need to use parks and high school football fields — big, open spaces where large crowds can line up safely. And we’re going to need to do it day after day, with no days off.
(Is any of my math wrong? There’s no point in being overly-precise here — but please tell me if I’ve made some error that changes things significantly.)
I remember Rudolph the Red-Nosed Reindeer as my favorite of the Christmas specials — as the truly great of the genre, as the Superman of Christmas specials.
And then we watched it last night, for probably the first time this century. It was brutal.
The story was pretty rough to start with: mutant child laborer is shunned until the CEO finds a way to exploit his difference, and only then do his peers accept him. And we’re supposed to take that as a happy ending.
But there’s something far, far worse that I had utterly forgotten.
Here’s the scene: the Abominable Snow Monster is threatening Rudolph’s family. Yukon Cornelius causes a boulder to fall on the monster’s head and he passes out. And then — here’s where Sheila and I both gasped — Hermey, the elf who, charmingly, wants to be a dentist, pulls out all of the snow monster’s teeth. The teeth are shown, pulled out by the roots, littered on the snow.
Hermey is a fucking war criminal. We’re shook.
Apple’s SSL Metrics Is Hanging My App 23 Dec 2020, 10:16 pm
We’ve been getting some reports that NetNewsWire for Mac will hang sometimes. A sample will report something like this:
Dispatch Thread Hard Limit: 512 reached in 1580 of 1580 samples -- too many dispatch threads blocked in synchronous operations
And there will be hundreds of threads labelled
Here’s an example, with sample report, on our bug tracker.
What I think is happening: these Apple metrics reports are happening once per download per feed. So, if you have 1,000 feeds, then there are 1,000 metrics reports for a given download session. If those reports don’t complete quickly enough, then you get this thread explosion.
So… I could slow down our feed downloader so that this is less likely to happen, so that the metrics reports don’t back up so much. I don’t really want to slow down refreshing, though, but I may have no choice.
Luckily, most people don’t have the number of feeds it would take to trigger this. But, still, that’s not good enough — NetNewsWire should never hang for any user.
The Big Sur Sneeze 9 Dec 2020, 9:26 pm
This has happened to me a few times. As I’m using my 2019 16" MBP, it lets out, at some random moment, a startlingly aggressive “Fehhhhh,” and then it shuts down.
It sounds as if the fan goes to 11 for about a second, and then it turns silent and dark.
To be clear: it’s completely unexpected. This is not happening when I shut down the computer. It happens whenever… it wants? Is bored? Is tired? I dunno.
My aunt Jen has narrated a book — Mermaid Eclipse by N.E. Carlisle — and it’s available on Audible, where I work. I’m so proud, and I hope this is the first of many for her. 🎙🎉
No Jedi 23 Nov 2020, 6:13 am
Read this to get some relief from your impostor syndrome.
* * *
During a family Zoom, a relation mentioned they might need to ask for my help with a thing (sharing videos) that I know nothing about.
Almost every single other person on that Zoom would have been a better-than-me choice on this particular topic. But I’m a computer programmer, so people look to me for tech support.
You’ve run across this too, right? Friends and family think, because you’re in tech, that you’re a computer tamer who’s on intimate terms with every feature of every app. They think you know how to make computers sit up straight and mind their manners.
You and I know that’s not true. You and I know that being in tech means that you wish, with a frequency and fervor that would astonish outsiders, that a cleansing fire would one day ignite that burns up all the computers in the world.
“The computers earned it. They brought this on themselves,” we’ll say. While everyone else panics, you and I will know that this fire is, at long last, justice.
* * *
I’ve noticed many times that a developer as senior as I am — now with 40 years writing code on Apple computers — is assumed by newer developers to be a kind of Jedi. As if I’m on intimate terms with every API in every framework; as if I’m deeply learned in every single tool, from Git to Jenkins to AppFigures; as if I know how to make App Store Connect sit up straight and mind its manners.
I don’t know about other senior developers, but I can tell you about me. I have decades of experience and an amount of wisdom. I’ve written some bad, some good, and a couple great apps over the years.
But I’m no Jedi.
This tweet I posted on Saturday has, at this writing, almost a thousand likes. I conclude that it resonates.
I had an app on day one of the App Store — and now, 12 years later, I realize I still have no mental model of how signing, certificates, and provisioning profiles work.
Whenever I need to do something, I just fuck around till it passes the tests.
Maybe there are senior developers who have both breadth and depth — they know everything and know it all well — but I suspect that’s the rare case.
Experience and wisdom count for more than vast technical knowledge. And, in fact, I don’t have that knowledge, except in the few places where I need it. (You couldn’t even call me a Mac power user. Outside the realm of Xcode and app development I use my Mac in the simplest of ways.)
I know how to get technical knowledge, though. I look things up. I learn. I ask questions. I ask for help. Same as you!
And I find some tools — such as Apple’s for setting up app IDs, certificates, and so on — to be as impenetrable and frustrating as everyone else does.
Nope. No Jedi here.
Normalizing Care 13 Nov 2020, 7:52 pm
When cases rise, they rise. The risk now is higher than ever.
Some things I think about…
Even going for a ride in the car is a risk. A friend got in a car accident (fault: other driver) and was taken to the ER in an ambulance, where my friend could have been exposed to the virus.
Let’s say I go for a ride and my car breaks down. I’d have the AAA person coming and a trip to a service station in my future. Is that all safe?
Another friend is currently in quarantine after a trip to the dentist resulted in contact with a person who subsequently tested positive.
I keep thinking: something we’ve done a dozen times isn’t necessarily safe. It’s just that the odds haven’t caught up yet. Next time could be the time.
Something that feels safe isn’t necessarily safe. Our feelings are the opposite of helpful — they’re convincing us of things that aren’t true.
I’ve twice had the vital duty of being in the hospital room when a family member dies. What if I couldn’t have been? What if no family could be there? I can barely think about this without tearing up. What if it were me in the hospital, and my family couldn’t be there — what would that do to them?
What if a family member has a heart attack and can’t even get a bed in the ICU?
What if I give the virus to a family member and they die?
Anyway: please be careful. I know there’s pressure not to. But thousands of people alive and healthy today will be dead by New Year’s. Being careful saves lives.
I’m so happy today — and full of gratitude to everyone who worked so hard for this, and to everyone who worked to make the last four years less dark than they might have been. Thank you!
NetNewsWire 5.1.2 for Mac 1 Nov 2020, 8:29 pm
We’ve released NetNewsWire 5.1.2 for Mac and submitted NetNewsWire 5.0.5 for iOS to App Store review.
Both fix some bugs, including crashing bugs, and increase performance.
We plan for these to be the final 5.x builds — next up will be test builds of NetNewsWire 6, which will support more syncing systems, including iCloud. The team is psyched!
App Store and Congress 6 Oct 2020, 10:33 pm
For a few months I’ve been trying to avoid the App Store as a topic.
I have — we all have — enough to be upset about these days, and I just don’t need this as another thing that’s eating me up. So I decided, once bigger and louder players got involved, that I could leave it to them and try to ignore the topic. Not let it get to me.
And now there’s a report from a House Judiciary subcommittee on this topic. The report quotes this blog twice (on pages 341 and 350) — and I am very proud.
It means I can stop banging my head against this particular wall — Congress is looking at it. I stand by ready to help, but I think it’s well beyond me now, and I can otherwise let this go. For the sake of my own health.
From time to time, often around a new release of NetNewsWire, a person will praise NetNewsWire and, in the same breath, run down some other RSS reader.
Please don’t do this!
We’re lucky in that we have a number of very-good-to-excellent RSS readers these days. They’re all pretty different, which is cool — it means, among other things, that most people would be likely to find one that they like.
Me, I’m just happy when people use RSS readers at all! I’m happy when people step forward with the open web and not back to the outrage web of Twitter and Facebook.
But, again, let me be clear: there are a bunch of pretty damn great RSS readers these days, and I don’t want to see the name of NetNewsWire anywhere near any criticism of any other RSS readers.
NetNewsWire 5.1 for Mac: Feedly Syncing, Reader View, More 19 Sep 2020, 9:29 pm
The announcement on the NetNewsWire blog has the full scoop, including a download link.
This release brings parity between the Mac and iOS versions. Usually we won’t want them to get out of sync for so long, but it happened and it could happen again. (We have no compelling reason to hold up one release while we finish another.)
New features (to NetNewsWire for Mac) include Feedly syncing, a Reader view, the ability to hide read articles and feeds, swipe actions in the timeline, support for non-ASCII characters in URLs, and more.
We will do a 5.1.1 release with some odds and ends. A small maintenance release.
After that we’ll start releasing 6.0 test builds, which will include things like iCloud sync, special support for Reddit and Twitter, and Big Sur user interface changes. The good news is that 6.0 is really far along already — and there is no bad news. (Well. No bad news in this context, anyway.)
For NetNewsWire 6.0 we’re working on Mac and iOS at the same time. They won’t necessarily ship on the same day, but there shouldn’t be a big lag between them, either.
Worrying Effect 21 Aug 2020, 11:22 pm
The WordPress app for iOS is a free and open source app that doesn’t sell anything — but Apple, reportedly, made the publisher change it so that it sells custom domain names via IAP, with the standard 30% cut going to Apple.
So now (or soon) the app will sell things.
Here’s where the worry turns personal for me…
NetNewsWire for iOS is a free and open source app that doesn’t sell anything, but it does let you use your Feedbin or Feedly account for syncing.
Will I be asked to add IAP to NetNewsWire for purchasing Feedbin and Feedly accounts? It doesn’t sound like that much of a stretch right now.
That’s not exactly what’s happening with the WordPress app, but it’s pretty close, and barriers just seem to get crossed these days.
* * *
Somebody on Twitter will tell me that I should add that IAP right now so I can pay Apple for the privilege of being on the App Store. Fuck you in advance.
* * *
Related question: how is the PR hit to Apple worth it for the money they’ll make through these WordPress IAP sales? And: how is developer fear a good thing for the platform?
NetNewsWire 5.1d3 with Feedly Syncing 21 Aug 2020, 3:08 am
It’s a very early test build — it may annoy you; it may eat all your ripe heirloom tomatoes; it may dump all your trash on the lawn and set it on fire.
I appreciate your testing, but I don’t actually recommend it. Waiting is better.
Desktop Means Web 15 Aug 2020, 9:40 pm
I’ve learned something that I suspect is true across much of our industry: the list of platforms in the world is iOS, Android, and desktop.
And — this is critical — desktop literally means web. (It could mean something like Electron wrapping a website, but that’s pretty much the same thing.)
I thought the list of platforms looked like this:
- Desktop (native Mac, Windows, Linux)
But it looks like this:
- Desktop (web)
…and, really, in many places, it looks like this:
- Desktop (web)
- Mobile (some WORA thing that gets you iOS and Android apps)
(Yes, for some places, TV is also a platform. The various voice-based devices are platforms too. There may also be a mobile web thing. But these are side notes compared to desktop and mobile.)
* * *
I’ve also seen the word surface used often, and it’s not the same thing as a platform. iOS and Android are separate surfaces — and Safari on a Mac is a separate surface from, say, Chrome on Windows, even though both are desktop app surfaces. I think surface means a runtime/device combination.
* * *
There are some interesting, at least to me, implications of the above.
One is that there is no word that means what desktop used to mean — there’s no word for “native Mac, Windows, and Linux apps.” It’s not a concept anymore.
Another is that the web sort of lost as a software platform on mobile. The web is for Windows, Mac, and Linux machines — it’s the old way of things. For mobile, it’s all about the apps. But maybe the web didn’t totally lose here, because often those apps are cross-platform affairs that run on web technologies.
PS One thing to take away: if you’re writing or talking about desktop apps, and you mean native Mac, Windows, and Linux apps, then your audience may not understand you — because they think you mean web apps.
I just posted our current NetNewsWire plans on the NetNewsWire blog. It talks about things like Feedly and iCloud syncing, Big Sur user interface updates, and SwiftUI.
Walking Home from School 5 Aug 2020, 11:50 pm
I had a bad-luck schedule when I was a freshman in high school. My afternoon classes were all bunched up in one hall, and that hall was at the far end of the school from my locker — too far to go between classes — so I had to carry all those books with me till end of day.
Which wasn’t that bad. It was a big pile of textbooks, but I could manage.
The problem, though, was that the hall with my classes was near where the school buses pulled up, and my locker was, again, at the far end of the school — as far away from the buses as it could be.
I couldn’t skip going to my locker before catching my bus, since I might have books from morning classes that I needed to take home but that I couldn’t carry all afternoon.
So, at the end of the day, I’d go, with all those books, from near the buses, to far away from the buses (where my locker was), to back to where the buses were.
But not always in time. In fact, often not in time, and I’d watch bus 62B pull away.
* * *
This was a small town high school in the very northeast corner of Maryland, far away from Baltimore and D.C. The distance from school to my home was — I just checked — 7.4 miles.
I had no option but to walk. There was nobody with a car available to come get me, and if there were, they wouldn’t have done it. So instead of getting home around 3:30, I got home around 5:15.
* * *
Though I wasn’t eager to, I did ask the vice principal — who happened to live in my development — about moving my locker so I wouldn’t have to walk home. He told me there was nothing that could be done, and that I should just bring, to my afternoon classes, whatever I need to take home.
Which would have been okay advice, but my load really was excessive, and this wasn’t going to work.
* * *
Pretty soon I got smart: instead of walking home at the end of the day, I’d start walking home right after lunch, and I’d get home even before the other neighborhood kids got home.
The walk was long — it must have been around two-and-a-half hours — but I didn’t mind. I was all alone and happy, at least in a way, walking on those empty roads.
Eventually I got in more trouble for cutting classes, but what did that mean to me? I had been in nearly constant trouble at school since kindergarten.
* * *
I envy the people who had a nice time at school. For me it was a struggle against stupid, unfeeling power the entire time. I truly hated it. When I wasn’t in trouble, when I was actually sitting in class, I was just watching the minute hand on the clock, begging it to speed up, minute by minute.
By my senior year I was the person in the school who skipped entire days the most. I stayed up late and slept way in lots of mornings.
Eventually I got suspended for smoking a cigarette without having filled out the paperwork.
* * *
Well. This is just to say that I preferred being at home, where I was reading and writing and writing computer programs. Like now. 🐥
The Overdog Lovers 31 Jul 2020, 12:28 am
You run into those fellas in life and online who will always explain, for any situation, why the big company is right.
If asked, they will discuss their political and economic ideology. That ideology, they’ll explain, is about reality and logic — it isn’t some blanket defense of big companies. No way. It could just as easily defend small businesses and working people.
Except… every single time, without fail, they side with the big company. And then you realize that they’re the overdog lovers. They cling to the big wealthy power and hate the underdogs. It would be nice if they’d just say so.
I Got Teed Off and Went on a Long Rant About This Opinion Piece on the App Store 29 Jul 2020, 1:27 am
Ed Hardy, writes, in Congress, keep your mitts off the App Store. It’s fine. [Opinion]:
When Apple CEO Tim Cook takes questions from Congress on Wednesday, he’ll surely get an earful of software developers’ complaints about how the App Store operates. Chief among the criticisms will likely be the fact that Apple charges a percentage of revenue earned from in-app sales.
It’s not just a percentage of revenue from in-app purchases. It’s percentage of every paid upfront app, too. And the percentage is 30% for most cases.
There’s not a bit of justification for any of these highly publicized complaints. They come from companies that want to have their cake and eat it, too.
There’s plenty of justification. If you offer a Mac app outside of the Mac App Store, you can expect to pay about 5% to your payment processor. This option is not permitted for people writing iPhone and iPad apps.
It’s incredibly dismissive to accuse companies of wanting to “have their cake and eat it, too.” What companies want is to be able to pay their people and keep making the things they think are cool or good.
The next section of Hardy’s piece is called “The App Store does business like a grocery store.” But…
The App Store does not do business like a grocery store
…take a trip to your local grocery store. Suppose it’s a Kroger. You’ll find store brands — products made by Kroger — on the shelves next to products made by outside companies, like Procter & Gamble. I hope you’re not surprised that if you buy a Procter & Gamble product, Kroger takes a share of the revenue.
That’s exactly what Apple does with the App Store.
If I make and distribute toothpaste, I can offer the exact same product via Kroger, Safeway, and Albertson’s — and I could sell it from my own website and via Amazon.
That’s a lot of choices I have for selling my product.
But if I write an iOS app, I can sell it via the App Store and through no other method.
This is not at all how grocery stores work.
To be fair, it’s not just Spotify who’s complaining. The CEO of Epic Games (maker of Fortnite) whined about the App Store just last week. And the developers of premium email app Hey engaged in a very public spat with Apple in June, accusing Cupertino of acting like “gangsters.” But none of these companies’ criticisms hold up.
For whatever reason, developers are often accused of being whiny. Oh, those whiny developers who like to have their cake and eat it too. How dare they complain about Apple policies. Betcha I’m being a whiny developer right now.
No. Again: developers want to make great apps and be able to continue making great apps.
To demonstrate why, let’s continue with the grocery store analogy. Kroger built its store into a successful business. But suppose the companies who make the products sold in that store wanted to keep using it, without sharing any of the revenue with Kroger. That would be completely unfair. Kroger is paying upkeep on the store, but these other companies don’t want to contribute.
We’ve demonstrated that it’s not like a grocery store.
But let’s talk about fair share.
Apple — certainly among the wealthiest of companies in human history — is taking 30% of developers’ paychecks in order to show services growth. This is not about upkeep on the store: this is about profit for Apple. And not just profit but a specific category of profit.
And the rules aren’t remotely fair. Facebook — another fabulously wealthy company — certainly profits from its iPhone app. Does it share any of this with Apple? No. Instead, apps from smaller developers (because they are almost all smaller than Facebook) are subsidizing Facebook.
If there’s a fair share to be paid, the largest apps get away without paying it. Instead, companies like Omni subsidize Facebook. Fair?
* * *
The next section is called “Selfish developers want to use the iPhone ecosystem without paying their share.”
This is total bullshit and insulting. (Developers are always whiny and selfish, of course.)
This isn’t about paying a share into some commons run for all of our benefit. Apple isn’t just asking for us to help cover costs.
This is the only game in town for iPhone and iPad developers, and we have no choice but to subsidize apps like Facebook. We have no choice but to contribute to Apple’s services growth.
Of course, the analogy isn’t perfect, because it underplays Apple’s role. It didn’t just build a grocery store — it built the entire town. There would be nowhere for Spotify and the rest to sell their products if the iPhone never existed.
This is kind of the thing with platforms. There would be nowhere for Spotify to sell their iPhone app if there were no such things as iPhones. True.
The major reason these software developers have a business is because Apple makes iPhones that people carry with them everywhere. Without them, there’d be no Spotify. Fortnite would be a PC-only game.
I think the argument here is that, without Apple, the smart phone revolution wouldn’t have happened so quickly. That may be true! But it’s not argument in favor of Apple’s 30% cut.
These companies love to play on the idea that a 30% share of revenue is an egregious price to pay to be on the App Store. However, a recent study found that Apple’s percentage falls in line with other software stores (.pdf). And Procter & Gamble wouldn’t blink to hear that Kroger charges 30% extra for one of its products.
All of the various app stores are charging too much. They all point to Apple as precedent.
* * *
The next section is called “Consumers benefit hugely from the App Store.”
In some ways, sure. It’s also worth remembering that the more money Apple takes from developers, the fewer resources developers have. When developers have to cut costs, they stop updating apps, skimp on customer support, put off hiring a graphic designer, etc. They decide not to make apps at all that they might have made were it easier to be profitable.
Suppose the House Judiciary antitrust subcommittee — where Apple CEO Cook will answer questions Wednesday (as will the leaders of Facebook, Amazon and Google) — mistakenly thinks there is some justification for these developers’ complaints. Regulations that forced Apple to change the way the App Store worked would benefit a few big-name software companies, but they would hurt hundreds of millions of Apple users.
We have no way to know that — we don’t know what that regulation would look like or who it would benefit.
I do not want to see Congress regulate app stores. I want Apple to make better choices here — better for Apple, Apple customers, and developers.
But if Congress lowers the cut to 10%, or says that App Stores must allow for side-loading, it’s hard to see how customers would be hurt.
(That said — again, I’d really prefer not to see federal legislation. It shouldn’t be needed.)
True, Apple rules the App Store with an iron fist. While it sometimes acts in opaque and arbitrary ways, firmness is absolutely necessary in a world full of unethical developers who’d happily flood the App Store with crapware designed to steal user information. No one wants that.
Developers: whiny, selfish, and unethical.
Any time I hear about iron fists and the necessity of firmness, in any context, I get pretty nervous. But let’s set that aside.
App Store review is not filtering out apps that steal user information. No. This is done by sandboxing and other technical restrictions. Apps can’t steal user information. Apple — to its immense credit (it’s one of the things I love about Apple) — continues to lock this down.
Letting companies avoid this process would release a wave of malware on iPhone users everywhere. In a world where everyone’s phones are networked together, introducing another way for criminals to spread nefarious software is a horrible idea.
This is horribly, terribly untrue. Again: the App Store doesn’t prevent malware. Other technical limitations, built in to the platform, prevent malware. Apple does a great job with this and deserves all kinds of credit.
The second sentence in Hardy’s paragraph is just pure scare-mongering with no grain of truth.
* * *
The next section is called “Cupertino deserves its fair share.”
Cupertino deserves a cut of the action for the hard work it does policing the App Store. (And don’t forget about the enormous cost of operating and maintaining the servers that power this $519-billion-a-year economic engine, to say nothing of building the software tools developers use to create apps for iOS and macOS.)
Again: Apple isn’t asking us to cover costs plus a little something extra — no. Apple considers revenue growth in services to be of paramount importance, and this is one if its favorite ways of making that services money.
This isn’t about fairness at all. If it were, you’d think Facebook might pay some share.
Apple doesn’t “police” the App Store for the benefit of customers. Submissions are checked to be sure they adhere to Apple guidelines — in other words, reviewers make sure that apps are making money in approved ways and giving Apple its cut.
It’s also understandable that software developers want customers to pay them directly, rather than sending payments through Apple. And admittedly the company does make exceptions for certain services, like Amazon Prime Video, that bring customers to Apple’s ecosystem.
However, Cupertino’s general policy on payments means customers can feel safe shelling out for software and services within the Apple ecosystem. We know some shady firm won’t steal our credit card info. Even the best-intentioned companies get hacked, and I trust Apple’s network security far more than I do some random developer’s.
Again: this article mentions fairness a few times, and I hope it’s clear by now that the App Store isn’t exactly fair.
That thing about security and credit cards is more scare-mongering. If side-loading were allowed, most developers would use reputable systems like Square and Stripe and so on, where the developers never actually see credit card info at all.
(Developers are, by the way, whiny, selfish, unethical, and random.)
Maybe Apple’s 30% cut seems steep for digital products. But, as Ben Bajarin, head of consumer technologies at Creative Strategies, points out, the App Store seemed like a bargain to developers when it launched in 2008. At that time, developers typically surrendered 50% of the retail prices on software sold through physical stores. And small devs couldn’t even gain a toehold.
This is enormously untrue. I know because I was one of many small developers who were there.
We used Kagi as our payment processor at the time, and I think we paid around 5% for our storefront and payment processing and everything. Completely reasonable, and we were perfectly happy with it.
We were also a two-person shop — my wife and I — and you can’t get much smaller than that. Did we gain a toehold? Hell yes! We did great!
There were a lot of small companies operating that way. Hardly any of us were selling boxes through retail stores in the 2000s — we were already selling over the web by the mid ’90s.
Nobody saw this as a bargain. The developers I knew — small developers with nice toeholds! — were shocked and astonished, because we were used to paying 5-10%.
Perhaps Apple should shave a few percentage points off its take from App Store revenues to keep everyone (including Congress) happy. But third-party developers absolutely should pay a share of their revenue to support the iPhone ecosystem. Everyone benefits from it, including the companies that are whining. They just don’t want to admit it.
The traditional way of supporting a platform is to write good apps for that platform. That’s it. A platform with more and better apps will attract more people to that platform. (It’s not the only thing, but it’s a real thing.)
But Hardy — and Apple, apparently — has forgotten that simple truth.
And they haven’t realized that current App Store policies actually hurt the situation: we don’t have the quantity and quality of apps we should have. Which hurts that very ecosystem.
Apple’s Thirty Percent Cut 23 Jul 2020, 1:14 am
Developers will often tell you that Apple’s 30% cut isn’t the worst thing about the App Store, and that it’s actually far down the list.
True. They’re right.
But it’s worth remembering that money really does matter. Say you’re making $70K per year as a salary, and someone asks if you’d like a raise to $90K. You say yes! Because that extra $20K makes a real difference to you and your family.
To an app on the App Store it might mean being able to lower prices — or hire a designer or a couple junior developers. It might be the difference between abandoning an app and getting into a virtuous circle where the app thrives.
Quality costs money, and profitability is just simple arithmetic: anything that affects income — such as Apple’s cut — goes into that equation.
To put it in concrete terms: the difference between 30% and something reasonable like 10% would probably have meant some of my friends would still have their jobs at Omni, and Omni would have more resources to devote to making, testing, and supporting their apps.
But Apple, this immensely rich company, needs 30% of Omni’s and every single other developer’s paycheck?