Stream Sync

I’ve thought a lot about providing a way to sync Stream feed subscriptions so folks can share them across devices. Makes sense, right?

What not to do 👎

Something I don’t want to do is sync all feed items. It would be burdensome, make the code more complex, and being that RSS was never intended to be centralized it’s a better fit for Stream.

What to do 👍🏼

However, there is something that makes sense to sync: Feed Subscriptions.

I’ve considered using iCloud to do sync but it seems to be more trouble that it’s worth.

I could roll my own but I really hate the notion of requiring a username and password to make it work.

How about using Sign in with Apple? It still requires signing in, but it’s a bit easier. You only need to push a single button and you’re ready to roll.

With that in mind I’d still need to implement my own sync service but it would only be about syncing subscriptions; add, delete, and get should do the trick.

I’d also add bookmarking and the ability to delete your account.

I’m also considering a read status. Yes, that’s right, folks have requested I mark items as read. While this goes against my original goal of Stream, I can see why folks want it. I believe I could easily sync the read status of an article by posting only the unique article ID. That needs more thought and if it proves too difficult to implement, I’d pass on sync, and just do it locally.

Still Thinking 🤔

As you can see, I haven’t finalized my thoughts on the matter. Chances are I’ll settle on something, start implementing it, and change my mind for one reason or another.

I’d you’re a Stream user and have opinions on how it should operate, or would like a feature, please add a request and I’ll check it out.

Your Support 🙏🏼

If you’re using Stream and enjoy it, please consider leaving a tip or drop me a line, rob.fahrni@gmail.com, to let me know you enjoy using it.

The New Normal

Axios: “Yes, but: 61% of teleworkers are working from home because they’re choosing to, per a new Pew Research study. Just 38% are home because their workplaces are closed or unavailable.”

Wall Street Journal: “When you do it right, it improves retention. The most successful distributed companies have much, much lower churn than other companies. Our voluntary rate of churn was 7.6% over the past year. That’s during the Great Resignation, lower than our peers. And the biggest hidden cost of productivity in most businesses right now is attrition.” - Matt Mullenweg

A wonderful bouquet of flowers.At WillowTree we had a very strong everyone in the office culture. The pandemic changed that. Over the last couple years it became obvious a fairly substantial number of folks wanted to continue working remote, even after the pandemic (if that ever happens).

Our leadership at WillowTree is pretty amazing. They listened. Now we have a full group of folks working remotely.

I’ve been a remote worker off and on for well over 20 years. I love it, much to the chagrin of my wife. I’m now a part of the work from anywhere team at WillowTree.

We’ve also started hiring folks for remote first positions. Our team has people in California, Oregon, Washington, Wisconsin, Florida, and Ohio to name a few. It’s nice because it’s allowed us to focus on hiring really great people without convincing them to move to Charlottesville, Durham, or Columbus.

So, if you’re looking for an iOS, Android, or Web gig, give WillowTree a look. You may find the company, and job, of your dreams.

I love this place and hope to make it my final work home, if they’ll have me. 😃

Spotify doesn’t publish Podcasts

Read the thread. There is so much confusion around who coined the term Podcast and what defines a Podcast.

Apple didn’t invent podcasting, they just have the most well known directory of podcasts. Think of it as a phone book of sorts, or a map, for finding the source of Podcasts.

I wish Indie Podcasters would band together to create an Open Podcast Directory. It’s only purpose would be to find the source of Podcasts. Podcasting apps could then use it to locate the source RSS feed and subscribe.

Podcasting and the technology that makes it possible were invented by Dave Winer, with help from others, including Adam Curry and Christopher Lydon.

A Podcast is audio, its source, and the means of distribution via RSS.

To be a podcaster all you have to do is record some audio, make that audio an enclosure element in an RSS feed(hey, guess what, it’s just a URL!), and let folks subscribe to the RSS feed.

In every Podcast player I’ve ever used this open standard is fully supported. If I want to subscribe to a Podcast in my favorite player I just get the URL for the Podcast and paste it into my player — for me it’s Castro — and it does the rest.

Sure, it supports finding Podcasts using Apple’s Directory, but that’s just icing on the cake. When it subscribes it doesn’t use any tech from Apple, it just uses the Podcast’s RSS feed, which is supplied to Apple by the Podcast creator.

AHHHHHH!All of that to say, what Spotify calls a Podcast, is not a Podcast. They’re not public and not delivered to the user via RSS, in a Podcast player of their choosing.

I don’t think making money from your work disqualifies it as a Podcast, but I’m sure many folks would disagree with me.

Saturday Morning Coffee

Akami: “Akamai Technologies, Inc, the world’s most trusted solution to power and protect digital experiences, today announced it has entered into a definitive agreement to acquire Linode, one of the easiest-to-use and most trusted infrastructure-as-a-service (IaaS) platform providers.”

I know of two small companies using Linode to run their web servics; Micro.blog and Overcast Radio. I wonder how this will affect small businesses, like those mentioned? Linode has a great reputation, is inexpensive, and gives you full access to your machine instances. All starting at $5 a month. Fingers crossed it doesn’t change too much.

Adobe Blog: ”C++ runs everywhere – Mac, Windows, Linux, iOS, Android, and in browser. It gives you access to the hardware and OS on all platforms. It is well supported and standardized, with few discrepancies between implementations. C++ allows us to build high-performance libraries that can be used anywhere.”

Red sock.If you’ve followed me for any amount of time you’ll know I love the C++ programming language. I spent a large amount of my career, 20 years, building software with it. I still think it’s a great language because it does run everywhere.

Heck, Safari and Chrome (derived from Safari) are probably the two most used applications on macOS and their core are written in C++.

I’d love to know of any other popular macOS apps written in C++. If you know of any, drop me a line at rob.fahrni@gmail.com. Thanks.

ESPN: ”The Houston Texans have hired Lovie Smith as their next head coach, the team announced Monday.”

I’m so happy to see Lovie Smith back at the helm of an NFL team. I still haven’t forgiven the Bears for firing him in 2012, after having an 10-6 season, but failing to make the playoffs. Since his firing the Bears have had one season over .500, Matt Neagy’s first season they went 12-4.

They should’ve kept Lovie.

Anyway, he’s back, and I’m happy for him.

I just got an email from a Google recruiter. I told him I was happy at WillowTree and let him know we’re always looking for good folks.

So, if you’re in the market for a new gig, check us out!

The gang had a great, but cold, day at the Cal vs. UVA Women’s Lacrosse game.

Cal played tough but just couldn’t hang with UVA. This wasn’t unexpected but our niece played a wonderful defensive game.

I was finally able to clean up our yard of the mess created by snowstorms in January.

Also, it’s cold out, 34°F/1°C. Time for a nice hot shower. 😀

How I Post

I haven’t been asked how I manage my blog but I thought I’d share anyway. It is my blog after all, I can post whatever I want.

Tot

I use an app from Iconfactory called Tot on my iPhone and my Mac. I’m using it now from my iPhone, where I compose most of my posts.

I chose Tot because it’s darned simple. There are seven dots across the top of the screen, each represents a different document, they’re like tabs, each with a different color.

It also supports Markdown and plain text mode. I use plain text mode. It’s just nice to see raw Markdown, that’s a super power of Markdown, it’s just text.

Oh, the coolest thing about Tot is it saves your stuff to iCloud behind the scenes. No fuss, no muss. I love that.

Micro.blog

I use a nice, simple, blogging platform called Micro.blog. In the past I’ve used Blogger and WordPress. WordPress is particularly awesome, but I wanted a static site and I don’t need all the complexity of WordPress. It’s great though.

Anywho, once I’m happy with my post I copy it and paste it into the Micro.blog iOS app, Mac app, or the website and add any links I’d like to have. The Micro.blog iOS editor has some really nice Markdown shortcuts, like pasting links and it’s raw text as well.

Why all the compose, copy, paste, edit work? Well, Tot’s auto save is amazing and Micro.blog’s iOS app doesn’t have auto save. Yes, I’ve lost posts and I’m trying to prevent that.

After adding a category, or a few categories, to my post I publish it. Micro.blog creates pages, updates its timeline, and publishes to Twitter and Mastodon.

P.S. I started this post on a Saturday, got distracted, and I’m finishing it on Sunday morning. Nothing lost. Easy to pickup and go.

Today is NFL Conference Championship Day

In the NFC we have the #4 seed Los Angeles Rams hosting the #6 seed San Francisco 49’ers. Two NFC West teams that meet twice a year. They know each other and the 49’ers have owned the Rams this year. Can they do it for a third time? I have no idea.

My pick: Los Angeles Rams

I’d call it controversial based on how the 49’ers have played this year, especially at the end of the season. I will not be surprised if the 9’ers beat them again.

On the AFC side we have #2 Kansas City Chiefs hosting the #4 Cincinnati Bengals.

Last week I picked the Buffalo Bills to beat the Chiefs. I knew at the time the game would be a barn burner and it did not disappoint. That, for me, was the Super Bowl. Kansas City looks unstoppable.

My pick: Cincinnati Bengals

I know, I know, I just said the Chiefs look unstoppable. I won’t be at all surprised if the Chiefs win. My wife has the Chiefs to win it all. She’s smart.

Super Bowl 56: Rams over Bengals

Saturday Morning Coffee, with Links

Links the kitty!Forbes: ‘Billionaire investor Mark Cuban launched an online pharmacy Thursday that offers more than 100 generic drugs at an affordable price with a goal of being “radically transparent” in its price negotiations with drug companies.’

It’s so nice to see someone use their infinite resources to make drugs affordable. At one time I spoke to my brother about what it would take to do something like this, he said for Everyday Joes like us it would be impossible. Just building a facility to accommodate the manufacture of medicine would be cost prohibitive. But, it’s not for a billionaire! Bravo!

Mother Jones: ”Fueled by the Big Lie, this effort picks up where last year’s insurrection left off by putting in place the pieces to steal future elections by systematically taking over every aspect of the voting process.”

If you can’t win with better ideas, cheat. If we allow this to happen we will get what we deserve: a failed Democracy.

NOLA.com: ”Sean Payton is not going to win the NFL Coach of the Year award. But he should. No one has coached better than Payton this NFL season.”

It’s been a rough year for the Saints and they managed to go 9-8. So close to another playoff run.

Enjoy retirement, Mr. Payton.

Atlas Obscura: ”This small shack near the entrance to Sequoia National Park has been in almost continuous operation for the last century.”

Three Rivers is a nice little community not far from Exeter, where I grew up.

If you happen to find yourself passing through Three Rivers on your way to Sequoia National Park, make sure you stop by Reimer’s.

We got just enough snow to make everything look amazing. ❄️

The Fahrni Tundra 🥶

Saturday Morning Coffee, with Links

Celebrating 20 Years of Trustworthy Computing: ”Just by compiling software with a few switches, everyday developers could protect themselves against entire classes of exploits”

On the front lines, Ukrainians brace for possible attack: ”But while they might not agree with where an attack will come from, they are all 100% convinced it is going to happen.”

I really don’t want to see this happen. Here’s hoping it doesn’t, but if it does, we should help. Help doesn’t mean go to war with them.

Patriot Front Fascist Leak Exposes Nationwide Racist Campaigns: ”Unicorn Riot reported in 2017 how Vanguard America’s ‘Southern Front’ server on Discord was used to celebrate Fields’ vehicle attack, as well as exposing the group’s links to Robert Ray (aka ‘Azzmador’) of the Daily Stormer, Richard Spencer and other figures in the white supremacist movement.”

Garbage people.

The Great Resignation is here. What does that mean for developers?: ”Software developers—even though their jobs can typically be done remotely and should, in theory, be more stable during a pandemic—are leading the exodus.”

A few folks I follow on Twitter have purchased RV’s or travel vans and have taken to the road.

This is a dream of mine.

Looking back at Microsoft Edge for developers in 2021: ”The great benefit of contributing these features to Chromium is the ability to partner with other stakeholders in Project Fugu and, together, help make PWAs much more powerful and closer to what people expect installed apps to be capable of.”

PWA’s being a strong focus for Microsoft makes complete sense, they’re an Enterprise company. Having great tools for IT type developers has to be really great for companies

Web3 is going just great: ”This is a personal project of mine, and reflects my own opinions. If you are looking for an unbiased descriptor of web3 and related technologies, there are short ones in the Glossary, but that is not the goal of this site.”

This site reminds me of F*cked Company for some reason. I’m keeping an eye on Web3, like many others, but most things I’ve seen so far don’t make a lot of sense to me. I’ve thought about “minting” an NFT just to understand how it works.

I could see using Blockchain for actual physical works of art as a proof of ownership. Beyond that NFTs seem weird. I “own” a token to nothing.

The next storm has arrived, early. I really didn’t expect to see it snowing at 10:30AM. When I went to bed last night it wasn’t supposed to begin until 2PM.

If it’s like this all day, I’m cool with it. It’s nice, light, fluffy, snow. Not that heavy, wet, stuff we got last week.

Next Snowstorm

The snow is pretty much gone from the storm on January 3.

Today I’m going to cleanup some of the damage caused by it. Dragging busted branches and parts of trees into the backyard for cutting up later.

I also need to shovel off a big pile of snow at the top of our driveway and haul wood up from the lower part of our backyard, stack it under the deck stairs, and put some on our front porch for easy access.

The forecast was fairly grim earlier in the week. They were calling for over a foot of snow. Recent forecasts are showing between six and nine inches.

The thing that concerns me is the call for a mix of sleet and freezing rain that is supposed to follow the snow.

When all is said and done I hope we still have power, then the cleanup begins. 🤞🏼

snow forecast

Snow Days

I enjoy snow, I really do. It’s peaceful, fun to watch while is falling, and the ground covered in white fluff is really beautiful.

On Monday, January 3, we got somewhere between ten inches and a foot of snow. It caught everyone off guard to get that much, about half that was forecast. The amount of snow was fine. The wetness of the snow was a problem.

When we expect snow you’ll find Dominion Energy trucks staged at various places throughout the region. Power goes down and they bust their butts to get it back up. They really do, no sarcasm in that statement at all.

Monday morning I got out of bed and the snow was really coming down and had been for a few hours by that point. No sooner had Kim started making a mocha and I making a pot of coffee the power went out and was out until early afternoon, Friday, January 7.

By around 10AM we started hearing trees break and fall. Our own beautiful magnolia lost a couple fairly big branches and the top broke off. That’s a real heartbreaker. I have no idea what it means for the future of it? Fingers crossed it doesn’t have to come down.

Around 11AM I could hear chainsaws firing up all around us. Our neighbor across the street and one house down lost half of a tree. It fell into the road and had to be cut into chunks to clear the road. Not long after our neighbor directly across from us lost a fairly large tree, I’d say 30-foot. It fell across the roadway and was blocking our driveway. We fired up the chainsaw and got to work on it.

Our neighborhood is amazing. Folks from all sides descended on this monster and we were able to chop it up and clear the roadway in no time. I’m grateful for our neighbors.

It was pretty frigid that day with temperatures in the high 20’s during the day and teens overnight. Of course that meant that wet snow iced up.

Tuesday we started working on the driveway. My gut told me Monday afternoon I should go out and start clearing the driveway. I was cold and decided I didn’t want to do it. That was a huge mistake. Wet snow and low temps cause ice. Duh. It took forever to clear it up. Our daughter, Taylor, slipped on the ice and landed hard on her hand and hip. She was done for the day. Kim helped her in and took care of her. They’d done amazing work clearing the snow and ice. I was able to work on a particularly stubborn bit of ice with help from the sun and cleared off a bunch of it. Kim joined me after a while and we got it cleaned up. Kim was able to back the car up the hill at that point. I’m thankful for my family.

By late Tuesday roads started to improve from Palmyra down the hill into Charlottesville. Kim took me for a ride so I could check Slack and let work know I was ok. Oh, yeah, I forgot to mention our cell service stopped working Monday afternoon. No communication in or out.

We decided to take a trip to check out the roads. They were mostly in good shape. Trees down all over the place. There are some steep S curves not far from home that looked like a war zone. That mess was cleared up by regular folk. They spent hours down there clearing the way. I’m thankful for kind, thoughtful, caring people that think of others.

We decided we really wanted a hot meal Tuesday night, our house was a freezer with the exception of the room around the fireplace. We found that our favorite Japanese place was open. We had great hibachi chicken and steak that night. So delicious! I’m grateful for folks that brave the elements so we could have a hot meal.

I’m thankful we have a fireplace and wood to burn. We had bread, cheese, and some frozen ham leftover from Christmas dinner. We pulled that out and thawed it and we’re able to get along with sandwiches, mostly. I’m thankful for leftovers.

This week has been great. The snow is still hanging around, but it is melting. Our driveway is clear and the roads are dry. There is danger around the corner. We’re expected to get up to a foot of snow between Sunday night and Monday morning.

Here’s hoping the power doesn’t go out.

Flynn is perfectly happy by the fireplace.

I doubt the birds and squirrels will be visiting Kim’s bird feeder today.

This is more like it! Love me some snow! ☃️

I decided to make a change to the Home Screen for the new year.

Smaller widgets in a different arrangement.

Still the same number of icons.

My granddaughter did my makeup today. She said I’m Hades, from Hercules.

I think she nailed it.

Free and Opinionated

NetNewsWire Blog: “Our mission is to make the best RSS reader that we like making. We value stability, high performance, clarity, and lots of figurative air and space rather than a mélange of features.”

I love how Brent and the NNW team hold true to what they believe – and what they want – a feed reader to be.

If you haven’t checked out NNW you really should, it’s a great product.

COVID and Coffee

Watch out! It's a blog fly!I decided I’d go to my favorite coffee shop to work on Stream.

I’m sipping my cofffee, coding away, distanced from folks, of course.

A lady walks in and starts loudly discussing how, on Christmas Day, while the family was together her sister finds out she was exposed to someone with COVID. Swell.

Turns out she’s an employee coming in for her shift.

I just packed up and left. Will this mess ever end?

Stream Development Notes

It feels really good to be spending a little time on Stream today.

My last commit to the repository was June 24, 2021. That’s way longer than I thought. 😳

With any luck I’ll get cache sizing and clearing in today and, fingers crossed, I’ll be able to ship it soon.

Being able to clear the cache and control its size was the first request I received after shipping 1.0.

There are so many things to do and so little time to do them. It’s like eating an elephant. You have to do it one bite at a time.

Stream for Mac Dev Note

RibbitIn iOS development land we have UITableViewController and UITableViewCell for building lists.

On the Mac – AppKit – we have, with my limited knowledge, NSTableView, NSTableCellView, and NSCell. Apple’s developer docs say:

Beginning with macOS v10.7, you can use NSView objects (most commonly customized NSTableCellView objects) instead of cells for specifying rows and columns. You can still use NSCell objects for each row and column item if you prefer.

For some reason my brain finds that paragraph confusing. I need to dig a bit deeper into the docs but my initial read leaves me believing NSCell is not NSView based?

No matter, it’s not a big deal. I already have Stream for Mac populating the table and selecting a row displays the article for it. I have a very long way to go, mind.

Something I have considered doing is wrapping up the AppKit classes with classes that implement UITableViewController and UITableViewCell so I could at least have a familiar interface to work with, but that might be a bit of work for very little gain.

Oh, if you’re wondering why I’m doing the Mac version in AppKit instead of SwiftUI? It’s simple: I’d like to learn a bit about AppKit. It’s apparent we’re headed for a SwiftUI only world. That’s fine. I’ll be on board at some point – I’ve already done a bit.

Oh, FYI, it’s not that difficult to move from UIKit to AppKit. Minor things, like the paragraph I mention above, but AppKit existed long before UIKit.

Here’s a very simple example.

#if os(iOS) import UIKit typealias HSColor = UIColor typealias HSFont = UIFont typealias HSImage = UIImage typealias HSView = UIView #elseif os(macOS) import AppKit typealias HSColor = NSColor typealias HSFont = NSFont typealias HSImage = NSImage typealias HSView = NSView #endif

In my code I’ve been using HS versions of these class types and they work as expected. If I find a missing method on the Mac, I extend the class to include the missing method. Easy!

Here’s one example of that. extension NSColor { static var darkText: HSColor { return HSColor.black } static var lightText: HSColor { return HSColor.white } static var label: HSColor { return HSColor.labelColor } }

Still plugging away.