So Long, Setapp

August 12, 2020 • 11:25 PM

What goes up must come down.

After 5 long months of using Setapp for my Mac app needs, they’ve decided to creep to iOS. To use an app in iOS, you’d have to register your iOS device as an “extra seat.” What used to work on iOS “for free” — such as Ulysses — will stop working unless you register your iOS device. So that’s $15 for my Mac, iPhone XS, and iPad Pro.

All my installed apps, before I did the cleanup and account cancellation.

This new pricing model also made me give a hard look at what I’ve been getting out of Setapp:

  • Ulysses is definitely the No. 1 app I use regularly. To replace Setapp, Ulysses is US $6 / month, or US $50 / year.
  • Timing Pro will rank No. 2 — it gives me a good sense of how much time I spend on each project. However, I have an old license that would work on a previous version indefinitely.
  • CleanShot X — something I’d miss but can totally live without.
  • IconJar — something I’m prepare to pay upfront. It’s €30 or about US $45, or $2 a month assuming it lasts me two years.
  • Paste, ToothFairy, Bartender 3, MindNode, Downie — I’ve paid for them before and they continue to work. (The old version of Paste is actually bug-free and is rid of the cloud sync bullshit, so that’s actually a step-up.)
  • The rest are either tool apps that can be replaced with a webpage (Regex builders, text-based calculator), things that are not up to my taste or standard (Espresso, the website developer tool, has no dark mode support; CodeRunner 2 looks great until you realize how stupid their indentation algorithm is).

This is also a good reflection of the lineup of Setapp’s offerings: there are a few very good niche apps you’d be willing to pay big bucks for; then there are the rest: small, “clever” tools that only shines with their fully skinned user interface.

I’m done 🙂️

Let’s stay in touch!

Sign up for the weekly updates of anything that appears on this blog. You will read about my outdoor life around British Columbia, technical discussions as a Data Analyst & App Developer, as well as other random discoveries and thoughts.

Fuck Medium

August 11, 2020 • 11:00 AM

Fuck Medium.

Fuck their dickbars. Fuck their randomized CSS names. Fuck their putting things behind a paywall, and claiming that membership “is an optional subscription that is not required in order to read and write.” And most of all, fuck them for suggesting that you can continue to read an article after signing up for an account, only to make you find out that you will need to pay for this anyway. Fuck their model for measuring writers’ earning based on the time of readers spend reading.

And fuck the writers who just assume they can someday make big money from writing a “Publication” on Medium. Fuck the “writers” who create shit content, and fuck those who have decent materials but rather let them rot in the puddle of shit copy-and-paste or meme-infused content from other “writers.”


August 10, 2020 • 3:47 PM

A few days ago, MX finally had his film rolls developed (at Kerrisdale Cameras), and we took a Saturday trip to Chen’s to have the negatives scanned.

What makes analogue photographs special — as I’ve come to realize — is how little they attach to a specific context. Context is long gone by the time the entire roll of film gets developed. Instead of “we took a hike up Crown Mountain and here are some photos,” analogue photos feel like “here’s a picture of me with the smile of triumph and fatigue.”

The special colour profile from the chemicals are quite secondary compared to that.

The hike up Crown Mountain in July 2020.

Joseph Joseph

July 26, 2020 • 4:00 PM

While IKEA is a treasure trove, I never managed to find a good storage solution for my kitchen sink — for the sponge, towel, dish soap, and the brush.

That was until I came across Joseph Joseph at a friend’s house. I ended up buying this sink caddy to put away the sponge and tower, and saved some previous countertop space. Another option for you may be the countertop caddy.

Joseph Joseph Sinkaid Caddy. © Joseph Joseph.

Joseph Joseph specialises in home living products in the kitchen and in the bathroom. Their well-thought-out products are meticulously designed, and are much less generic than the best offers from IKEA.

In the past month, we’ve also got the stackable colander set, as well as the ice tray that allows easy breaking of the ice cubes.

Emerald Lake

July 26, 2020 • 12:48 PM

July 9th — We hit every green light during our time in Banff, and took Johnston Canyon off the list because of its closure. For the extra day, we drove back to B.C. and into Yoho National Park for the day.

The mirror-like water of Emerald Lake

The mirror-like water of Emerald Lake.

Stanley Glacier

July 26, 2020 • 12:39 PM

July 10th — Stanley Glacier is a hiking trail in Kootenay National Park in B.C., just half an hour drive from Banff.

The beginning of the trail was very quiet — so quiet that we clapped our hands and chatted loudly to make sure not to make wildlife encounters. But soon there are people getting down, and we run into more groups along the trail.

The creek of the glacier valley.

Crown Mountain

July 26, 2020 • 10:19 AM

It’s been a while since we were last on the Grouse: a time when the pandemic had yet to hit and the mountain was still fully covered in snow.

Then four and half months later, it’s July. Grouse gondola reopened after months of closure. As planned, we got up Grouse Mountain via the gondola, and started off the hike at around 11:30 am from the Chalet.

The first 1/3 of the trail was effortless and steady ascent along Alpine Trail. We kept a cadence of about 20 min per kilometre for the first half (2.7 km), up to the fork that leads to Goat Mountain. From there began the next 1/3 — sharp drop along the ridge into Crown Pass.

Descending into Crown Pass

Descending to Hanes Valley from the Goat Mountain fork.

I didn’t end up paying for after the free trial, but there are some of its features and philosophies that resonate with how I want my emails to look like. I’ll leave the reason why I didn’t pay for Hey in this footnote1, and will dedicate the rest of the post to share how I replicated Hey’s Focus & Reply feature with my Gmail account and Spark Email app.

What’s “Focus & Reply?”

What is this Focus & Reply feature anyway? For those of you who haven’t tried out Hey, Focus & Reply allows you to mark a number of emails to “reply later.” These emails will be removed from inbox to a pile named “Focus & Reply.” When you have a chunk of time to focus, you go into the pile, and tackle the email one by one. With each reply sent, the email is removed from the pile. It’s a great way to make sure you attend to emails that takes small efforts individually, but are mentally tolling as a collective.

So to sum, the features I’m replicating are:

  • an easy way to mark email as “reply later” (so that they don’t clutter my inbox, and I don’t forget about them)
  • a view for all the emails marked as “reply later” but haven’t yet been replied to
  • emails are removed automatically after a reply has been sent out
  1. I didn’t pay for Hey mostly because it’s a walled garden of its own — it doesn’t work with what’s out there: rule-based forwarding (I use it to automatically add package tracking numbers to Parcel App); other email clients that allow multiple email account to be managed together; my own email account, whether with domain or this site’s domain; and other server-side email add-ons such as Sanebox. I’m at Day 2 with Sanebox’s free trial and I’ll see how that goes. 

Published and NSManaged

July 13, 2020 • 11:31 PM

While developing a universal app with the updated SwiftUI framework, I found that @Published decorators do not function as intended in objects inheriting from NSManagedObject class.

What’s Expected & What’s Broken

What’s exactly the expected behaviour anyway? We know that —

  • Objects conforming to ObservableObject protocol can have variables marked with @Published. SwiftUI views that depends on an observable object instance will update when a published variable receives a new value.

Moraine Lake & Lake Louise

July 13, 2020 • 7:15 PM

Moraine Lake.

Icefields Parkway

July 12, 2020 • 11:11 PM

Icefields Parkway

Icefields Parkway, about 40km north of Saskatchewan River Crossing.

Icefields Parkway is the 268km highway that connects Banff and Jasper National Parks. This shot was taken at the lookout about 40km north of Saskatchewan River Crossing on the Parkway.

Athabasca Falls & Sunwapta Falls

July 11, 2020 • 10:06 PM

Speaking of the falls, here’s Jasper’s famous Athabasca Falls —

Athabasca Falls. Shot on iPhone XS with Spectre app.

Valley of the Five Lakes

July 11, 2020 • 9:51 PM

… was the first actual hike we took for the trip. 2.5 hours and 6 kilometres long, the trail is exactly what it says it is in the name: it’s a valley, and there are five lakes. The lakes have different depths and display their own distinct hue of turquoise.

The hike was light and easy — no challenging terrains, lots of flats. After a short grind up the valley, there was a sight at every turn. Here’s Third Lake, unfiltered and untouched from my iPhone XS —

Third Lake of the Valley of the Five Lakes

Third Lake.

The hike was short enough that we managed to fit it in before the long drive down Icefields Parkway to Banff. It felt like the dessert of a five course meal: not as magnificent as Maligne Lake and Canyon or the falls, but something quite interesting to remember.

Maligne Lake

July 10, 2020 • 10:17 PM

Us. © MX.

Parks Canada has placed Red Chairs around national parks and these are one of the many sets.

Maligne Lake was quiet for 6pm in the summer — too quiet. The sun would not set for another four hours; it was still high up, only softened by the clouds. There were patches of brown and crimson among the trees. Dead as they were, the trees made up for the warmth in the scene, balancing out the Red Chairs.

Maligne Lake was our second last stop in Jasper. We hadn’t hiked much; our legs weren’t sore yet. This was as close to vacation vibe as this trip would ever get. It’d be all adventure from here.


July 9, 2020 • 9:10 PM

出来这两天好几个朋友问着类似的问题——国内的问 “这还敢出来玩?” 在 BC 省的问 “现在还敢去 Alberta?” 出来玩总要有游记,我琢磨了一下不如把疫情对出游的影响集中写在这里,省的之后东一榔头西一棒子写的也不完整。

虽然数据摆在每个人面前都是一样的,但是理解和接受程度见仁见智。现在 BC 省的每日新增病例大概是个位数,可能偶尔能碰到十几二十;Alberta 是一天四十五十。你可以说 Alberta 疫情比 BC 严重四五倍,也可以理解为两个省都得到了有效控制,新增病例数量级相同。



疫情期间出来玩,人少是肯定的。美加边境关得很严实,就算一周有 20 万人次从美国入境加拿大,这也是往年人流量的 10% 不到,况且绝大部分过境的人都是工作目的(最常见的就是货运司机),并非出门旅游。


There's Always a Unique Identifier

July 3, 2020 • 12:00 AM

When a business owner approaches me to set up a new ETL pipeline for their emerging dataset, I always ask one question: “What’s the unique identifier of this dataset?” This question gets paraphrased according to the business owner’s knowledge and understanding on data and database, and often times I help them identify a candidate (either a single-column primary key, or a multi-column composite key).

What I don’t do is I never take no for an answer.

The statement that “This dataset has no unique identifier” invites trouble1 — ETL pipelines exist to bring order into the chaotic data from various sources. If they are adamant about the data being without a unique identifier, follow up with a few more questions:

  1. How are you gonna tell if the data have duplicate in the future? How do you ensure its quality down the road?
  2. Why do you need this dataset to begin with, given that you can’t ensure its quality?

Chances are you will find that they have absolutely no clue themselves. Kindly ask them to come back later.

  1. Especially with our archaic infrastructure that gets virtually zero IT support. We have stiches of solutions that depend on Perl, Python 2, Python 3, R, VBA, JavaScript, R, C#, .NET, Ruby on Rail, Oracle SQL, SQL Server, and MS Access, to name a few. 

Strolling Olympic Village

July 3, 2020 • 12:00 AM

It was showering last Saturday. We went to pick up some camera and outdoor gears near Cambie and Broadway, and went for some brunch.

We strolled from the Henry’s Camera from Cambie St to the MEC on Main. A stroll along the seawall in Olympic Village turned out to be quite pleasant, and there were photos —

The only few minutes when we had the sun. Shot on Habitat Island. © MX.

HEY: You Don’t Fix Email in One Step

June 26, 2020 • 10:35 AM

If you’ve been following along WWDC, it’s hard to miss the heated debate between and Apple. I’ve known about HEY’s product plans early because I’ve been a longtime subscriber of Signal v Noise, the office productivity blog from the team behind HEY and Basecamp.

I’ve taken HEY for a spin and I’m now at my Day 6 on the 14-day trial. I’ve got to say the feelings are mixed — they nailed a lot of pain points of email, and have really reimagined a few things that no other teams dared to. But the product is still lacking in some aspects, and it’s ultimately still about email — the internet’s most unsexy offering that we are stuck with.

WWDC 2020 Random Thoughts

June 22, 2020 • 2:51 PM

Lights, camera, action.

This asynchronous event footage could have been dry and could have been another WWDC keynote sans the audience. But thankfully it wasn’t. The camera movement, the lighting, the transitioning and virtual interactions between speakers all played out well. It made the video fun (fun enough) to watch and follow along.

Craig Federighi’s eye brows also helped a lot on the fun-ness. No crack jokes this year, though.

I wonder where Phil Schiller is. And Eddy Cue.

Pee breaks

Apple’s kind enough to include a “pee break” session where it talked about privacy. Don’t get me wrong — privacy is an utterly important issue, but the session tells me nothing on what’s new for me to experience; rather, it says you get that automatically.

This pee break was quite literal for me. And it was a good pause from the non-stop information influx of any WWDC keynote. Except that in previous years, the information was spaced out by applause, cheering, people actually walking on and off stage, speakers saying thank you, and much slower pace of a live speech.

June 19, 2020 • 9:22 AM

难得两个礼拜终于见到了太阳,晚上吃完香锅 cheat meal 决定出门走走,从家里一路走到中央公园。到底还是纬度高,九点二十日落。补张图吧。

Bonsor Park,© MX