Keehun Nam

Senior Systems Engineer at Cloudflare

Recent Articles

Resolving firmlinks in Python

I recently had the need to resolve firmlinks in python. For example given a path like /Applications/Safari.app, I needed to get /System/Volumes/Data/Applications/Safari.app.

Turns out there is not a single example of this anywhere online, so if you are in the same place as I am, here is an example of how to do that:

Continue Reading...

How (Programming) Languages Shape Problem Solving

It is increasingly important to be a multilingual developer. Being a developer who is fluent in many programming languages not only helps your marketability, but it will also improve your problem-solving skills. It will help you become a more powerful developer who can tackle a problem with deeper insight, better-informed architectural decisions, and think beyond the inherent limitations of any single language. In the past six months,

Continue Reading...

Practical Dynamic Type Part 3: Attributed Strings

Ensuring that applications remain accessible for all is one of our highest priorities at Livefront, and we believe that a key component in achieving that goal is to flawlessly support Dynamic Type in all of our applications. Part 1 of our Practical Dynamic Type series focused on supporting iOS 10 and Part 2 focused on unit testing. This third installment will focus on Attributed Strings.

Continue Reading...

Understanding Swift's Characterset

Have you ever needed to check if a string was made up only of digits? How about the presence of punctuation or non-alphanumeric characters? One could use a variety of methods from one of the Formatter classes to NSScanner to even NSPredicate, but the most likely snippet you would’ve found involved the use of an inverted CharacterSet.

Continue Reading...

Practical Dynamic Type: Part 2, Testing

Last year, Livefront’s software developer Chris Sessions wrote a helpful article about practical usage of Dynamic Type. This short follow-up addresses one primary concern: Unit Testing.

Continue Reading...