Browse through the showcased feeds, or enter a feed URL below.
Brent Simmons’s weblog.
A feed by Brent Simmons
Permalink - Posted on 2019-08-22 23:15
This is a little bit of bad news. It’s not my intention, and it’s not what I want to happen — but NetNewsWire 3.3.2 apparently does not launch in the next version of macOS (10.15, Catalina).
It links to the PubSub framework, which is not included with the next macOS.
NetNewsWire 3.3.2 was the last release of the full version that I worked on, before selling NetNewsWire to Black Pixel, and I’ve heard from lots of people that they’ve been using it ever since. They never switched.
I would rather it continued working forever, but that’s not to be. Not my choice. Sorry about that!
Permalink - Posted on 2019-08-20 20:19
Before every major release I like to try and think of everything mean that people might say about the app. It’s fun!
So we just went through this exercise on the NetNewsWire Slack group. Here’s a taste:
Some feedback will be factually inaccurate, but we like to imagine that too:
See? The actual feedback will be nicer than the stuff we thought up. This provides a bit of immunization. :)
But, also, there will be negative feedback we didn’t imagine. That’s the gold!
* * *
Bonus from Daniel Jalkut, but not actually a criticism:
Can’t innovate, my RSS.
Permalink - Posted on 2019-08-20 00:02
I think we’re still on track for releasing NetNewsWire 5.0 Monday, August 26. There will be one more beta before then.
I’ll be available for podcasts, interviews-via-email, etc. If you’d like to set something up, email me or DM me on Twitter.
Permalink - Posted on 2019-08-12 20:16
NetNewsWire has reached public beta! It only took like five years. :)
Our definition of beta is release candidate. With each beta release, we believe that the app is ready to ship. But we want to do further testing to make sure.
NetNewsWire has a Help Book up on the web now. It needs a couple more pages and some screenshots, but it’s pretty close to finished.
We’ve picked a ship date: Monday, August 26. If we find enough bugs, we won’t hit the ship date. That’s fine — but we’d really like to hit that date.
We’re working from the 5.0 Release milestone now. (The alpha and beta milestones have been closed.) You’ll note that most of what remains are bugs for the marketing site.
P.S. We’ve found a bug already with showing the unread count for the selected item. We’ll get it fixed, hopefully this week, and do another public beta release.
Permalink - Posted on 2019-08-01 17:34
We recap the wonderful July meeting, Liz has a new blog, Jared launched his Scorebook update, and Jared previews his August talk on Xcode projects.
* * *
In the latest episode of The Omni Show, I talk with folks on the OmniGraffle team about their latest update, which includes a bunch of significant performance enhancements.
Performance has been A Topic lately (as it always should be) — and, if you’re a developer, I highly recommend this episode to learn how a company like Omni does performance work.
* * *
I’m the guest in the latest episode of Swift by Sundell. We talk about blogging, Apple’s Swift era, NetNewsWire, performance, and dynamic and declarative programming.
Swift by Sundell has become The Talk Show of Mac and iOS development. I recommend listening to all the episodes.
Permalink - Posted on 2019-07-26 22:16
I forgot about this one — I should have mentioned it in the previous article.
Let’s say the source text that gets displayed in your timeline could be quite long. NetNewsWire has this issue: the summary text is the text of an article (with HTML tags stripped).
This text could be many thousands of words long. But the timeline will only ever display at most a couple lines — even with an absurdly wide timeline on a large screen, it will never display thousands of words.
So here’s the trick:
Use a truncated version of the text rather than the entire text. For the truncation limit, come up with a length that is beyond what could conceivably fit in the space.
This way text measurement will be faster since it’s measuring less text.
(Also use this truncated text for the text field in the timeline.)
Permalink - Posted on 2019-07-26 20:59
NetNewsWire’s timeline is fast — you can resize it and scroll it quickly.
It has to do a bunch of text measurement in order to do its layout. Text measurement is notoriously slow, though, so we use a cache.
Let’s concentrate on the issue of knowing how tall some text is. We know the available width (because we know the width of the timeline at any given moment), and we need to know the height of some text.
Let’s assume we always
ceil the height and width and use integers in a
[Int: Int] (width: height). Each string passed to our sizer gets its own
The first time it’s asked to get the height for a given width, there’s nothing in the cache, so it has to measure the text and store it in the cache.
And then the second time it looks up the width in the cache — if it’s there, then it returns the cached value. Otherwise it does the text measurement again.
But here’s where it gets smart…
Let’s say the first time the width was 100, and the second time the width was 200. Both results are in the cache.
If, on the third call, the width is 150 — between 100 and 200 — and the cached height for 100 and 200 are equal, then the height for 150 is necessarily that same height. We can avoid text measurement and just return the cached value. (And we keep the cache from growing on each call.)
What if, on the third call, the width is 250 instead of 150? There’s another trick. When the sizer is initialized, it can come up with an estimate for the height of a single line of text, just by using a short string (with tall characters) and a very large width.
This estimate means you will be able to know if the cached height for 200 is a single line. If that cached height is suitably close to the estimated single-line height, then you can skip text measurement again and just return the cached height for 200 — since more width can’t make the text higher.
The code in NetNewsWire for this isn’t fully generalized. It maxes out at two lines, since that’s what NetNewsWire uses. But it could form the basis for your own sizing/caching code.
PS Note: this is all because I don’t use Auto Layout on table cell views, for performance reasons. I use Auto Layout everywhere else — just not on table cell views.
Permalink - Posted on 2019-07-25 20:17
I’ll be the guest on the next Swift by Sundell podcast. I’m so looking forward to this.
My next guest on the @swiftbysundell podcast will be none other than @brentsimmons! 🎉
We’ll talk about Apple transitioning into its Swift era, Mac development, his work at Omni and on NetNewsWire, and much more — can’t wait! 😀
Got questions for us? Reply here! 👍
If you have questions, reply to John’s tweet. :)
Permalink - Posted on 2019-07-23 21:46
To write an iOS app, you have to learn Objective-C, Swift, or both. Xcode. UIKit and Foundation and maybe Core Data. How to upload apps to the App Store.
But… after learning all that, AppKit, which is super-similar to UIKit, is a bridge too far? This still freaks me out!
Permalink - Posted on 2019-07-23 21:32
I wish Swift had some kind of syntax that declares that a function or property can used on the main thread only. If use is attempted from some other thread, then the app should crash.
I know I can — and already do — use a precondition and check that we’re on the main thread, but I keep feeling like this should be a language feature.
Permalink - Posted on 2019-07-06 19:25
We’ve got just three things still to do before we hit 5.0b1:
One is a bug — when searching, a refresh or sync can end search mode.
Another is kind of a documentation thing: we need a set of sample AppleScript scripts. These will help people learn how to script the app — and it will also give us the chance to exercise the scripting support more thoroughly.
The third thing is to write the Help book and publish it on the web. Luckily I’m a pretty fast writer and I’ve written NetNewsWire Help books before. I’ll probably start with an older version and revise it for 5.0.
I think we can get to 5.0b1 some time in July — but, if we don’t, it’s because it’s summer and people are in and out due to vacations and ball games and cookouts and rock-and-roll shows. We’re super-eager to ship, but living life comes first. :)
Permalink - Posted on 2019-07-03 20:26
(This is a follow-up post to No Algorithms.)
Joshua Emmons made the point I was trying to make, but more explicitly:
Brent is making a subtle point here:
1. Algorithms weigh signal.
2. In the domain of engagement, outrage and anger mask all other signals.
3. These signals are fatiguing. As Outrage: 5 is normalized, Outrage: 10 is now required to move the needle.
1. and 2. mean it’s not the algorithm’s fault. There’s no way to write an engagement algorithm that doesn’t select for outrage and anger. But 3. means anything that incorporates such an algorithm actually makes us worse people.
This is key: it’s not the motivation — selling ads — that turns algorithms bad. (But, yes, selling ads makes a company pretty keen on these types of algorithms.)
This may not be true of music, movies, and other things, but when it comes to news, outrage and anger swamp everything else.
It’s also not an issue of UI. If there’s any way, implicit or explicit or both, of signaling engagement, it will tend toward rewarding outrage and anger. And this gets even worse, not better, if you add data from what your friends and peers like.
Maybe, though, I could do better. I kind of think not, because I think the problem is a bug in human nature. But let’s say I believed I could do better.
For one thing: how much better does it have to be? I think an algorithm that radicalizes far fewer people than it might otherwise is not a good call. Better is still harmful.
So here’s the thing I keep coming back to: I think of NetNewsWire as almost a kind of ideal public utility. As such, it should be completely trustworthy — you should never wonder if it’s leading you down some path or other you didn’t intend or foresee.
There are plenty of other apps in the world — every app is part of an ecosystem — and this one doesn’t have to solve what I think may be an unsolvable problem. I’ll leave that to other people.
Instead, it should be one place for news that you can absolutely trust. Articles come in, and NetNewsWire sorts by time, and that’s it. That’s solid.
Permalink - Posted on 2019-07-02 22:26
I like to read what people write about RSS readers.
One of the themes goes something like this: “I used to use an RSS reader, then I stopped, years ago. I decided to try it again — so I imported my old list of subscriptions. Over half the feeds were gone or no longer updating! Pour one out for RSS.”
Here’s the thing: blogging is like any other human activity — some people stop and other people start. It’s natural.
And: nobody ever said your favorite bloggers would continue forever. It’s okay to miss your old favorites! I miss mine.
But here are a few examples of current blogs that I like that you might like:
There are plenty more.
Permalink - Posted on 2019-07-02 21:08
I’ve been asked a few times about using algorithms in NetNewsWire to bring articles you wouldn’t otherwise have seen — from outside your feeds list — to your attention.
I’ve also been asked a similar question about using algorithms to bring articles — from inside your feeds list — to the top based on the likelihood that they’ll interest you.
I’m not going to do either.
These kinds of algorithms optimize for engagement, and the quickest path to engagement is via the drugs outrage and anger — which require, and generate, bigger and bigger hits.
This is what Twitter and Facebook are about — but it’s not right for NetNewsWire. The app puts you in control. You choose the sites and blogs you want to read, and the app reliably shows you their articles sorted by time. That’s it.
My hypothesis: these algorithms — driven by the all-consuming need for engagement in order to sell ads — are part of what’s destroying western liberal democracy, and my app will not contribute to that.
Permalink - Posted on 2019-06-26 22:11
I can’t help but picture the 15-year-old — or 45-year-old — who’s never programmed before, and who reads a little bit about Ruby on some website and is intrigued and wants to try learning it.
Maybe they have a thing they want to do, or maybe they’ve always just been curious about programming and this seemed like a nice way to start.
Are we going to ask that person to figure out how to install Ruby? If there are one-click installers out there, are we going to ask them to figure out which one is actually reputable and safe?
Curiosity like this is one of the ways new developers are made. I worry that the less the Mac is tinkerable out-of-the-box, the fewer developers we’ll get.
Or: we’ll only get certain kinds of developers — the ones of the right age and background who can go get a CS degree.
Permalink - Posted on 2019-06-26 20:22
The iPhone is the first — and only? — direct interface that is both great and hugely successful. It’s direct in the sense that you touch things directly on the screen.
The first time I used an interface even remotely like that was the first time I ever sat in front of a computer, sometime in the ’70s — it was a PLATO system at the University of Delaware. (Elementary school field trip FTW.)
But it took a long time before the technology advanced to the point where direct interfaces could be a mass-market thing.
Even though we have this wonderful thing of touching directly on the screen, indirect interfaces are still everywhere. If you have a hardware keyboard connected to your iPad, you’re using an indirect interface with iOS.
And of course there’s the digital crown on the Apple Watch, the remote you use with your Apple TV — and the keyboard and mouse or trackpad you use with your Mac.
Indirect interfaces are part of the future of computing. The future is diverse and complex, and indirect interfaces are a necessary part of the future — because I’m not going to get up and touch my TV screen.
I remember when potato chips were potato chips. Then one day barbecue-flavored chips came along. Then sour cream and onion. Now you can get potato chips of all kinds! It’s crazy, but people have their favorites. The future is like potato chips.
The thing about the Mac is that it’s always used via indirect interface. When you have a hardware keyboard and a precision pointer that takes very little energy to move, then you can do things that would be non-ergonomic for a direct interface.
You can have giant monitors — and even multiple monitors — and whip that pointer from place to far-away place with little effort. You can make targets smaller, due to the precision, which means you can make information and controls quite a bit denser. You can put features in menubars, because menus are much easier to get to and navigate using an indirect pointer.
Though this kind of interface is roughly as old as those early touch-screen PLATO systems — and therefore mature, and therefore boring to a lot of people — there’s still so much to be said for the efficiency that it provides. You can see more, and do more, with less physical energy. For eight hours a day, five days a week — if not more, for some people — it matters.
There’s a cognitive cost, I think, but it’s paid up-front and then ingrained, and most of us have forgotten how we learned to use a Mac in the first place. (I was almost certainly older than you when I first started using a Mac, and I only kind-of remember.) (You also have to learn iOS, too.)
And many iPad users see the benefit of indirect interfaces — plenty of people ask their iPad app-makers to provide full control via keyboard. They want to be able to navigate everything without having to touch the screen. I get it! It totally makes sense. I want that too.
But here’s what I think: the future does include machines that are built, like the Mac, entirely around the idea of indirect interfaces. There will be enough people that value efficiency that this isn’t going to go away.
There are, of course, plenty of tasks that are truly best-suited for an iPhone or an iPad. Absolutely. But for many productivity tasks, the force-multiplication that an indirect interface provides makes a big difference to many people.
You may value other things. You may move between both worlds pretty easily. Different people like different kinds of potato chips — but sour cream and onion doesn’t have to disappear so that barbecue may thrive.
Permalink - Posted on 2019-06-26 19:26
Brett Terpstra writes about how scripting runtimes are being removed from the Mac in the next OS release.
This is actually distressing, and not that much attention has been paid to this.
I’m one of those people who just use whatever’s on the system. I don’t think I’ve ever installed a different version of Ruby, and I don’t even know how.
But the ability to run Ruby scripts is hugely important to me — for one thing, this blog is generated by a set of Ruby scripts running on my Mac.
Permalink - Posted on 2019-06-26 05:44
In the introductory episode of the Xcoders podcast last night, Liz and Jared talked a little bit about impostor syndrome.
I don’t have anything profound to say about it — just a few random notes…
There’s no developer bit in anyone’s DNA. I don’t have that bit — nobody does. There’s no such thing, and there’s no collection of genes that make you a real developer, either.
You don’t have to have a CS degree. (I didn’t even own a computer when I was in college. And I didn’t graduate.)
If you’re working on an app, you’re a developer. Period. Even if it’s not a stand-alone app; even if it’s some scripts. You’re solving a problem on a computer with logic and code — that makes you a developer. That’s all it takes!
Impostor syndrome goes away eventually. You just forget about it. The fastest way to get past it is probably to help other people.
It’s okay to admit that you have it. It’s been many years, but I had it too. :)
Permalink - Posted on 2019-06-25 20:23
Last night they published the first episode, an introduction. Future posts will include interviews and discussions of interest to our community of developers, designers, testers, support people, and writers.
The podcast isn’t on iTunes yet, but there’s an RSS feed you can subscribe to: https://xcoders.org/podcast.xml
Permalink - Posted on 2019-06-24 20:55
Person on Slack: “Public betas are up”
We go through this every summer. Public betas are a moving target, and they have bugs — and people think that app developers can fix any issue immediately.
If you need to get your work done — or, heck, even if you just expect your AirPods to work — you should install public betas on devices and machines that are not your main machine.
Even if you get extremely lucky and everything works with one release, the next public beta could change all that.
Right now I don’t know of any bugs with NetNewsWire 5.0 alpha on the Mac public beta. But it’s so early, and I haven’t personally tested it.
The Omni Group just put up a blog post that recommends caution with public betas.
Our friends at Rogue Amoeba have tweeted about their apps not being compatible yet. (They’re working on it, of course.)
There’s a classic Merlin Mann tweet on the subject.
Permalink - Posted on 2019-06-20 18:39
From the transcript:
Brent: Nice. So does Navani have any hobbies, obsessions?
Lanette: I would say her top interest is murder, and it’s really a huge thing with her. She loves it so much that she will literally be purring while she is trying to kill and destroy things.
That’s kitties for ya. :)
Permalink - Posted on 2019-06-17 20:49
The fact that
DisposeBag is not a name in Apple’s Combine framework sparks joy. I was never, ever going to write code where that was a thing I had to read.
Permalink - Posted on 2019-06-14 22:02
Thing you should know: Mark Boszko — my friend, co-worker, and producer of the The Omni Show — did a podcast called The Optical that dives into movie special effects, and it has some amazing guests such as Douglas Trumbull.
If you like movies, you should listen to these.
Permalink - Posted on 2019-06-13 18:31
The Xcoders meeting tonight should be pretty great — we’ve got a bunch of lightning talks on new stuff from WWDC.
It’s the Woodstock of today. In later years, more people will claim to have been at this meeting than could have fit in the room. :)
Permalink - Posted on 2019-06-13 05:26
In the Sweet Setup’s review of iOS RSS readers from last May, there’s this sentence that I love: “It’s perhaps ironic that Google Reader helped popularize RSS, considering the sheer horror of its interface design.”
Permalink - Posted on 2019-06-13 05:09
We now have continuous integration set up for NetNewsWire. I didn’t need it for a long time, when it was just me — but now that we have multiple contributors, it’s important.
We’re doing the app and the separate frameworks (RSCore, RSParser, etc.) the app uses.
* * *
Most of my work, between now and shipping, is writing. Here’s a new technote: Why Reruns Happen.
* * *
We have had not one single crash report since 5.0a3 shipped. :)
(Yes, the app does have a crash catcher: no, we’re not relying on people finding the crash logs on disk and sending them in.)
Permalink - Posted on 2019-06-12 05:20
I finally got around to two things NetNewsWire needed: 1) a page describing how to contribute, and 2) a code of conduct.
They’re both on the same CONTRIBUTING.md page.
If you’d like to contribute, the process is pretty straightforward. File a ticket, talk it over, write the code, do a pull request.
I don’t like too much process. This seems just right. That said, I’m still learning about how to manage an open source project, and any feedback on this (and anything else) is definitely welcome.
Permalink - Posted on 2019-06-11 05:23
We just released NetNewsWire 5.0a3.
Almost all the current remaining work in the Beta milestone is writing — some tech notes and, most importantly, the Help book.
What will probably happen is that we’ll run out of coding to do while I’m still writing. Which is fine — it just means Maurice can go see how much we can use of SwiftUI in the iOS app. We want to go as all-in as possible (while still making a great app).
We’ll use SF Symbol too, of course. Probably Combine. All the things!
(Yes, we’ll be requiring iOS 13 for the iOS app.)
At any rate — the Mac app (minus documentation) is damn close to what’s going to ship. It’s just a matter of finding and fixing the last few bugs.
Maybe shipping in July? Fingers crossed. :)
Permalink - Posted on 2019-06-10 03:37
Catalina compatibility tip: don’t use NSFont as a key in a Swift dictionary. I’m getting crashes from 10.15 users that include this message:
Fatal error: Duplicate keys of type ‘NSFont’ were found in a Dictionary. This usually means either that the type violates Hashable’s requirements, or that members of such a dictionary were mutated after insertion.
It’s quite possible this was always a bad idea, of course, and it’s just that in 10.15 it crashes. I don’t know.
Permalink - Posted on 2019-06-09 23:05
My job with NetNewsWire, more and more, is product manager. Which I don’t mind. :)
Anyway: I just combed through the issues list and picked out features for 5.1. I had a general idea of what I wanted going in, but it’s good to look at everything.
Here’s the list for 5.1:
Feedback is welcome, of course. Your ideas of what to do next might be different from mine.
Best place for feedback is on the Slack group, but Micro.blog, Twitter, and email are good too.
Permalink - Posted on 2019-06-09 19:47
You may remember the early days of Blogger. Posts didn’t have titles, and they were often quite short — sometimes just a sentence and maybe a link. And these posts appeared on a person’s own blog, which could be hosted anywhere.
It was well-understood that blogging is provisional, is thinking-out-loud. It was the flow of life-on-the-web. Not everything was an essay.
When Twitter came along we collectively decided that this kind of thing was Twitter’s jurisdiction — that these are just tweets.
But why should we agree that Twitter, or any company, owns an entire form of writing for the web?
That’s why my short stuff appears here (and on my microblog) and then gets copied to Twitter. It belongs on the open web first.
Twitter is just another form of syndication. It’s not the home of my writing.
Permalink - Posted on 2019-06-09 19:12
A friend of mine asked me about my blogging setup. I figured I’d blog about it. Definitely skip this post if it’s not the kind of thing you’re interested in.
This blog, inessential.com, lives on an inexpensive shared host. It’s all static files, generated by wildcat. The posts are stored in a Git repository.
Posts from inessential.com are also picked up by my Micro.blog account, where they appear to people who follow me there. Micro.blog also forwards my inessential.com posts to Twitter, to my @brentsimmons account.
The Xcoders blog is owned by the Xcoders group; the Omni microblog is owned by Omni.
micro.inessential.com posts get forwarded to Twitter @brentsimmons. The NetNewsWire blog posts get forwarded to Twitter @netnewswire. The Xcoders blog posts get forwarded to Twitter @xcoders. The Omni microblog posts do not get forwarded.
I do all of my writing on a Mac. This is because I’m in front of a Mac when I’m working, whether it’s my day job or working on side projects.
(This is not a general comment on the suitability of iPad for work. It’s not there for me personally yet, but that’s fine. It’s making progress all the time, and I’m certainly encouraged by the news from WWDC on this front.)
It’s pretty obvious, usually. Cat pictures go to the Omni microblog. :) Xcoders announcements go on the Xcoders blog; NetNewsWire announcements go on the NetNewsWire blog.
The one slightly tricky thing for my personal writing is deciding between my main blog and my microblog. Long things always go on my main blog. Very short things are also totally okay for my main blog — but they’re okay for my microblog too.
So, for short things, I just make a snap decision, go by feel, and try not to spend more than a second on the decision. Since I’m writing in MarsEdit, picking the destination blog is just a matter of selecting it from a pulldown menu in the compose window. (I can choose a destination, write the post, then change my mind about the destination before posting. Easy.)
I rarely just tweet something, unless it’s truly ephemeral (or a reply, obviously). I prefer to blog first and let Twitter get a copy. This is part of owning my own content.