RSSAmplifier

Blog

curtclifton.net

Posts and announcements from curtclifton.net

curtclifton.netRSS feed ↗24 posts

Latest posts

App Technologies Evangelist

I’m starting a new role at Apple! Today, I moved from Software Engineering to Developer Relations. I’m an App Technologies Evangelist representing SwiftUI and related frameworks. After nearly five years on the engineering team, I’m thrilled to be able to spend more time with the developer community, while continuing to support SwiftUI. With WWDC just around the corner, it’s an intense and…

Talks Page

It occurred to me that several of my conference talks are kicking around on the internet, but that I didn’t have a collection of links to them in one place. Now I do .

Complete and Await Reply Script, Version 2.0

Based on the latest OmniShow , OmniFocus 3 for Mac should be available Real Soon Now. The good folks at Omni have made sure existing scripts continue to work, my Complete and Awaiting Reply script among them. The original version of my script completes the selected item, then creates a new follow up item like the original but with any existing context replaced with a waiting for context. OmniFocus…

Something Old, Something New

Over an excellent machiatto at Chromatic Coffee this morning, I put together a couple of OmniFocus scripts to share. Something Old The latest release of OmniFocus , version 2.12 for Mac, changes how task completion works under the hood. This change is likely in support of improvements to repeating tasks coming in OmniFocus 3 . Version 1.3 of my Complete and Await Reply script handles this change.…

Incomplete and Awaiting Updates

The latest release of OmniFocus, version 2.12 for Mac, changes how task completion works under the hood. This change is likely in support of improvements to repeating tasks coming in OmniFocus 3 . Unfortunately, this changes means my Complete and Await Reply script is currently broken. I hope to post an updated script this weekend. I’m sorry for the inconvenience.

Twitter Quitter

I’ve decided to close my Twitter account. William Van Hecke makes a convincing case for its diminishing utility, and it’s clear that Jack is more concerned with eyeballs than standards . I stopped regularly reading my timeline months ago. The few times I have dipped in, I’ve ended up angry or depressed. Despite occasional bright spots, there is always someone sharing the angst of the day. I read…

Next Actions

After six and a half wonderful years, today is my last with the Omni Group. It’s been the joy and privilege of a lifetime to work with the great people at Omni. Care for others permeates the culture at Omni, from interpersonal interactions, to software design, to our amazing Support Humans. It’s been especially rewarding to contribute to OmniFocus , an app that’s been invaluable to me personally…

These are a Few of My Stateful Machines

I’m excited to be presenting at the inaugural Swift by Northwest conference today. My talk is on state machines and how easy they are to implement in Swift. Slides Source code Narwhals Share and enjoy.

Terminal Palettes

For some recent work, I was switching between OmniFocus and OmniPlan code often. To keep my source directories straight in my head, I tweaked the colors of the two Terminal tabs to use the apps’ branding fonts: purple text for OmniFocus; yellow text for OmniPlan. I mentioned this hack in an engineering meeting and Ken promptly dropped the nerd snipe: “Does it switch automatically?” It didn’t then.…

Swift by Northwest Schedule Posted

Swift by Northwest has posted their preliminary schedule . The conference will be single-track with some great speakers. I love this format. Single-track conferences always feel more intimate because everyone shares the experience. The conference is Oct. 27–28 in beautiful Seattle. If you register this week, you can still get the early bird discount. I hope to see you there!

Swift by Northwest Plans

I’m excited to be speaking at Swift by Northwest in October in sunny Seattle. I just put the finishing touches on the abstract for my session: These are a Few of My Stateful Machines As app developers we have to deal with the challenges of stateful code every day. State machines are a powerful technique for managing state — but they’re underused in Mac and iOS development, in part because they can…

Version 1.2 of Export OmniFocus View to OmniOutliner

Now available, version 1.2 of my Export View to OmniOutliner script. The script makes a new OmniOutliner document from your current view in OmniFocus . With Version 1.2 you can now export from the Forecast perspective in OmniFocus. Due to a limitation in OmniFocus, the export from Forecast will have empty group titles in OmniOutliner. The tasks are exported correctly, however. (I hope to fix this…

Appearance Manager

In my previous posts on fonts we looked at: adding custom fonts to iOS apps, and extending UIFont so we could map from iOS named text styles to custom fonts while still supporting users’ preferred content sizes. Today I want to share a utility class, AppearanceManager , that works with my UIFont extension and iOS’ appearance proxies to manage all the fonts in an app. After Font with Style we had a…

Integrating Micro.blog

I’m excited about the soft launch of micro.blog . Manton Reece ’s creation lets users easily own their short-form content. Instead of posting short items and photos to Twitter or Facebook, you can post them to your own website, or to you.micro.blog . Automatic cross-posting means that your audience can still follow you on Twitter and, soon, Facebook, but you own all the posts so they can survive a…

Fonts with Style

I really appreciate the preferred content size feature on iOS. This is the system setting that let’s you choose to make text smaller or larger than the default size. Apps that use Apple’s named font styles get properly sized variants of the system fonts. The API for getting a named font style is: let font = UIFont.preferredFont(forTextStyle: .body) Apple offers ten named styles, shown here with…

Custom Fonts on iOS

On one of my side projects, I wanted to experiment with custom fonts while still respecting font size adjustments for accessibility. I’m using storyboards for this project, so also want to be able set font styles there. Here’s a screenshot of the app in progress: In this post I’ll share the steps to add custom fonts to an app in Xcode. Get Licensed Fonts Like other intellectual property we need a…

Font Follow-up

In an earlier post I walked through the steps to add custom fonts to a project. My steps followed Apple’s recommended process of adding a list of the fonts to the project’s Info.plist . Michael Tsai posted links to another technique that’s interesting. The technique is realized in FontBlaster by Arthur Ariel Sabintsev. FontBlaster is an open-source module for automatically loading any fonts found…

Clyde the Glide

A couple of weeks ago I made an outrageous impulse purchase that’s proving to be a great decision. It’s good to be lucky. Some background: I used to bike to work fairly regularly. I have a solid commuter bike and rain gear to manage Seattle’s winters. Given our hills and my metabolism, bike commuting meant a shower at either end of the commute. Between that and the ride, I was spending nearly an…

Complete and Await Reply Script, Version 1.2

Via email, Rachel Hopkin shared a cool feature request for my Complete and Await Reply script . Now the script can automatically set a defer date on the follow-up tasks it creates. If you run OmniFocus from the Forecast perspective, this is a great way to clear an item from today’s list after you’ve reminded someone about it. This feature is off by default, but it’s easy to enable. See the…

Finder and Terminal are Friends

As developers, we tend to spend a lot of time typing in Terminal windows. Even so, I often find it more helpful to browse directories and files in Finder. I have three little hacks that simplify moving between the two modes. pwdf The first hack is a shell function that logs the path of the directory shown by the front-most Finder window. # pwdf: echoes path of front-most window of Finder pwdf () {…

Variations on a Theme

In Weak References and Type Erasure I wrote about using closures, weak capture, and an isLivePredicate to combine type erasure and weak references. The goal was to store a heterogeneous collection of generic Signal objects while letting them deallocate when client code was done with them. My final implementation used a SignalHolder struct with a couple of closures inside. One closure extracted a…

Weak References and Type Erasure

In one of my side projects, two interesting Swift problems—heterogeneous arrays and weak references—collided in an interesting way. I needed to store an array of signal objects. var signals: [Signal] = [] Easy peasy? Not quite. Signals push updates to subscribers, so we’d really like them to be generic in the type of values that they push: public class Signal { private var currentValue: Value? =…

The Carson Rationalization

Voting for Donald Trump was a racist act. Assuming the Trump voter was well-informed, it’s a simple case analysis: Either they directly supported his racist rhetoric. It follows that their support for him was a racist act. Or they decided that Trump’s racist rhetoric didn’t matter. That decision is also a racist act as it validates his rhetoric as acceptable. John Scalzi lays out the argument in…

Mac Malaise

I’ve been a tech enthusiast and Apple customer for over 30 years. I don’t recall ever being as disappointed by a set of Apple product announcements as I was this week. The TV app for Apple TV on your TV . Meh. Maybe this will actually deliver on the promise. Maybe it won’t. The lack of a partnership with Netflix doesn’t bode well. Ultimately, this is a product for someone else. I don’t watch…