My First Swift Package

I’m embarking on phase 1 of my blog rethink and have decided that whatever I do next will use the textbundle spec for file transport and storage. It will likely be some git repo or perhaps a Dropbox synced folder but all of the options that I’ve seen don’t strongly link a post together with assets. Textbundle solves that.

I think initially I might wrap Jekyll in something, so that the thing making the static site is really an implementation detail. The idea being that my server has an endpoint that would accept XML-RPC as well as micropub inputs, transform those to a textbundle and then build the static site from there.

So my first step was to download my posts stored on Ghost as well as my assets folder. I wanted a way to build textbundles out of these for easy migration. My first inclination was a Ruby script. I don’t know Ruby, so that became problematic from the start. So I turned to a more familiar language.

I made a Swift package called textbundleify, and the code is up on GitHub if you’re interested. It’s not polished in the slightest, but was a fun chance to try something new. It gets run from a directory containing Markdown files and if you give it a directory that contains pictures (or a directory of directories of pictures), it will embed linked images to the referenced textbundle.

I had to learn to use Process as well as NSRegularExpression (though I still don’t know how regular expressions really work). It was quite weird getting an NSRange for use on a Swift string, which only works on String.Range ranges. It was fun to put together over a few hours, and should do the migration trick I’m wanting.

The next step is to figure out the proper order of operations in converting textbundles (which Jekyll doesn’t support) to the structure that Jekyll does. I’ve still got Ruby learning on my horizon but at least there are a couple of wonderful souls who have offered some help to me if I need it.

Onward!

View Controllers Make Crummy Navigators

My fellow iOS developers, we have a problem. We’ve been led astray by Apple. Don’t get me wrong, iOS is great. I love writing code in Swift (and Objective-C!). I’m a fan of Xcode too. And UIKit really makes a lot of really powerful things quite easy. But allow me this hot take: View controllers should never have to deal with navigation.

There’s a long running joke about MVC actually standing for massive view controllers and navigation is a key reason. Even a relatively simple view controller with a couple of possible destinations, using storyboards and segues, needs to implement methods that could grow to be dozens of lines long and end up knowing about the implementation details of view controllers that come after them.

What are we to do? There must be some way that can keep our view controllers clean of navigation and doesn’t fight the UIKit frameworks completely, right?

There is!

If we treat view controllers like functional pieces, we can expose a small interface to interact with them and use delegation to get stuff out. Here’s a trivial example:

protocol PeopleViewControllerDelegate: AnyObject {
    func personSelected(_ person: Person, from viewController: PeopleViewController)
}

final class PeopleViewController: UIViewController, UITableViewDelegate {
    var delegate: PeopleViewControllerDelegate?
    private var people: [People]?

    func configureWithPeople(_ people: [Person]) {
        self.people = people
        // fill a table with people
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // find the person
        self.delegate?.personSelected(person, from: self)
    }
}

This view controller (while grossly incomplete) gets configured with an array of people that will fill a table view. Tap on a row and the view controller’s job is done. It hands off the person to its delegate. What happens next is out of its hands. Perhaps we’ll show a detail screen, but maybe it’s just an API call and this view controller gets dismissed. Our PeopleViewController doesn’t know, and doesn’t care. Kind of great, right?

This begs the question of what exactly is the delegate? I’ve come to really like the coordinator pattern myself. I like having objects whose specific responsibility it is to manage the flow of my app (or just a given object’s slice of the app).

There are some things that you’ll have to give up, of course. Storyboard segues are a non-starter in this pattern. This means that there are large swaths of sample code (Apple’s and others’) that you’ll need to learn to either ignore or translate into this pattern.

So let’s trim down the size of our view controllers. Let’s narrow their scopes of responsibility, and in turn we’ll get code that is more maintainable and easier to reason about. I think we will all be better off.

Childlike Faith

And calling to him a child, he put him in the midst of them and said, "Truly, I say to you, unless you turn and become like children, you will never enter the kingdom of heaven. Whoever humbles himself like this child is the greatest in the kingdom of heaven. (Matthew 18:2-4, ESV)

I was on a walk with Finnian (my 21 month old) and as we were on the sidewalk he wanted to walk on the curb that separates the sidewalk from the road. You might have heard that kids his age don’t have the greatest of balance and I can confirm those reports. So he would reach up to grab my hand to keep steady as he walked on the curb.

But the thing is, he didn’t even look at me. He just stuck his hand up in the air and went along the curb. He was confident that I would help him stay balanced by taking his hand.

It struck me the third or fourth time he did this that he had immense faith that I would help him to not fall. And then God reminded me that this is how I’m supposed to be with him. Jesus says that I need to become like a child to enter the kingdom of heaven. What does that mean?

I should stick out my hand and ask for help more often. But I don’t. During everyday life I try to go it on my own. It doesn’t even occur to me to pray while I’m figuring out some way to make something animate just right or parse a feed. But why not? Honestly, I don’t know. But I want to.

How do I do this? I come before God and ask him to help me remember him throughout the day.

Rejoice always! Pray constantly. Give thanks in everything, for this is God's will for you in Christ Jesus. (1 Thessalonians 5:16-18, HCSB)

do not be anxious about anything, but in everything by prayer and supplication with thanksgiving let your requests be made known to God. And the peace of God, which surpasses all understanding, will guard your hearts and your minds in Christ Jesus. (Philippians 4:6-7, ESV)

Amen!

At a previous job I used to keep a post-it note on my monitor that just said “Pray”. Maybe I should bring that back and put it on the monitors I use on a day-to-day basis. That constant reminder that God is close and I’m beckoned to draw near to the throne of grace (Hebrews 4:16) could be the kickstart I need.

Reconsidering My Blogging Setup

I have a very on-again, off-again habit of writing. Sometimes I’ll have a lot to write about, and often I’ll go long stretches without writing much. I backed Micro.blog on its Kicskatarter the day it came out (happy birthday to me!), and it’s gotten me thinking about what blogging even is. Whoa.

I’ve usually considered blogging to be posts like this one. Longer things that I host on my website. But now I’ve got my microblog. I usually think of these posts as “Tweets that I own”. We all know that when you post content to a place you don’t control –  like Twitter, Facebook, or Medium – that you don’t own the post. Not the URL, the appearance, none of it. You gave them the things. But when you own the domain, you can control it all.

So my mental model of replacing tweeting on Twitter with Micro.blog was a good start. But now I see that microblogging is still blogging. Whoa.

Now I’ve got the itch for my website to feature both longer posts and microblog posts. I’ll have feeds for long content, micro content, and a mix of both. Posts should get to micro.blog through one of those feeds. And I’ll own the links to all of my content.

Now for the real question: how can I get this done?

I’m currently using Ghost to power my blog. But Ghost doesn’t seem interested in supporting microblogging (which is fine) so I’m going to look elsewhere. I don’t really want to use micro.blog itself because I don’t get enough control over things there.

What about Wordpress? I don’t like PHP, nor have I had good experience with them in the past. So that’s out.

I’ve been looking at Jekyll. That may end up being the winner but it will take some experimenting. I need to make sure existing links to ghost content will continue working and Jekyll ends entries in .html, but Ghost doesn’t. I’ll have to learn some level of nginx rules to get this done, is my guess.

But I think what I really want is something like Brent Simmons’s Wildcat system. I just wish it was written in Swift so I could understand how it’s put together. I’ve never worked in Ruby before, and while that’s not a dealbreaker it’s definitely additional friction.

I also would love to find something that can work with my text editor (Ulysses), can support image uploading automatically, and has Mac & iOS variants for me to write and publish posts easily.

This is going to take some time, and hopefully I’ll get it right.

Hawaii Trip

We spent the last week on the Oahu island of Hawaii, getting home late last night. It was an amazing trip and couldn’t have gone any better. We rented an AirBnB house in Kaneohe (which is the windward side of the island). The weather was quite good most of the time; even when it was raining, the rain was warm. Quite the change from Seattle.

View from Diamond Head

Waikiki Beach

Going into the trip I was most nervous about how the boys would do. We took them on a plane last year to Phoenix but Finnian is 20 months now and can’t be still for more than 3 seconds. We didn’t buy him a seat on the plane so he was going as a lap baby. Atticus is 4 now and we figured we could distract him with shows & movies on “his” iPad. They both did wonderfully well. A couple of screaming fits by Finnian but that was manageable by getting him to sleep.

Dole Pineapple

Tree on the Dole Train

Of course, I took along my camera. I’ve got the Sony A7II body and while I normally have a 50mm f1.8 prime on there, I wanted something that could capture the landscapes we’d be seeing and get good portrait shots of us on the trip. So I rented the Sony 24-105mm f4 zoom lens from Hawaii Camera. In short, the lens is amazing and now I want one.

Emily had done tons of research and put together a packed itinerary that got us all around the island. We hit up the Dole plantation, the North Shore, hiked Diamond Head and hung out on Waikiki beach, visited Sea Life, and went to a luau at Disney’s Aulani resort. We had a lot of fun and came home really tired.

Finnian before the Luau

Atticus on the trip home