The swift test command-line invokation does not print unambiguous filenames for test failures, so we need to attempt to patch this from the console output ourselves like true hackers.| Christian Tietze
Folks! Join in the fun: Infinite Canvas is now officially available in iOS and macOS App Stores all around the globe as a free download (with optional premium features).| Worklog: Articles and Blog Posts by Christian Tietze
Jeremy Friesen hosts this month’s Emacs Carnival, and the topic is “Your Elevator Pitch for Emacs”. It took me a couple of days to come up with a useful angle, because I didn’t even consider Emacs pitch-able. But that’s what’s so cool about writing prompts like these – you can think outside the box.| Worklog: Articles and Blog Posts by Christian Tietze
You can adapt principles of unidirectional flow without having to adopt a whole framework like ReSwift or Composable Architecture or Immutable Data.| Worklog: Articles and Blog Posts by Christian Tietze
Xogot is available on the App Store| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Vinh Nguyen found that his ReSwift status updates became slow. There were too many subscribers. Objects would react to state updates by dispatching a new action immediately. (ReSwift action dispatching ...| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
For InfiniteCanvas, I’ve started the app as a single-window application on Mac. As it got useful, I switched it to become a document-based app. SwiftUI has some facilities for this. This is how little you need to get started: And that produces:| Worklog: Articles and Blog Posts by Christian Tietze
I’m psyched to announce a project I hadn’t touched since 2017 is now ready for Mac, iPad, and iPhone: InfiniteCanvas, a delightful and simple drawing app for whiteboarding and sketching. You’re all invited to join the TestFlight beta, and play with the website!| Worklog: Articles and Blog Posts by Christian Tietze
Matt Gemmell released another Markdown writer’s tool, this time a Python-based pre-processor for generating indexes for books: TextIndex. TextIndex introduces curly braces in some places to mark words (or phrases) for index generation, like in the following example, piggybacking on what looks a bit like footnotes (which would use square brackets) or links:| Worklog: Articles and Blog Posts by Christian Tietze
Is it possible to claim that you’re off the hook when it comes to questions of whether usage of GenAI should be allowed, focus on practical usage, and then that’s that? I believe that is a bit too cheap a cop-out.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
I’ve been using asdf to manage my Ruby, node, and Python environments for a couple of years. I migrated to asdf from rbenv, and it kind of worked, but some shims never did their job, so I was a bit confused, but not soooo unhappy that I would actually investigate the issue. So whenever I buid and deployed my website, I went with| Worklog: Articles and Blog Posts by Christian Tietze
I had a ten-year break from Emacs as a terminal-based text editor until I learned about what you could really do with this program. Then it stuck.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
I am learning to speak a new language: Swift Concurrency. It is densely packed with familiar-sounding concepts and details I am not aware of (yet). This is how I tackle it.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Sorry in advance for feeling smug today :) The Zettelkasten is a personal productivity tool, and you should have as many as you have persons. That is now my favorite short-form reply to whether you should maintain multiple note archives or Zettelkasten instances.| Worklog: Articles and Blog Posts by Christian Tietze
To kickstart the Emacs Carnival, and as a hat tip to our recent inspiration, this month’s topic is borrowed from the June IndieWeb Blog Carnival: the topic is “Take Two”, hosted by Nick Simon:| Worklog: Articles and Blog Posts by Christian Tietze
I’ve been writing about “Entry Points” in a Zettelkasten in March and April. Entry points are designated notes that make plunging into a topic simple. Before the section was fleshed-out, it was in a weirdly ad-hoc state I want to present to you here: it was inlined into another document.| Worklog: Articles and Blog Posts by Christian Tietze
Entry Points help you plunge into the ever-growing web of notes in a simple way.| Christian Tietze
Just a quick heads up: this week, I’ll have to skip open office hours. We’ll resume next week (on June 3rd / 2025-06-03).| Worklog of Christian Tietze
Signal on Windows disables screenshot-taking via DRM tools to protect from recording sensitive information via “Recall”: Microsoft Recall takes screenshots of your apps every few seconds as you use your computer and then stores them in an easily searchable database. In Microsoft’s own words, its goal is to act as a sort of “photographic memory” for everything that you do on your computer. The words that other people chose to describe Recall upon its debut were decidedly less positive.| Worklog of Christian Tietze
In my Emacs email setup (notmuch.el using message-mode), I had this for the longest time: It would insert Cc and Bcc headers into email composition buffers so that I could quickly edit these fields. However, the message-default-mail-headers insertion is done unconditionally, so when replying to mail with people receiving a carbon copy, I would end up with two such header lines:| Worklog of Christian Tietze
You will have heared something along these lines: The era of the junior developer is over. Why would anyone hire a junior when an LLM is at a higher level? I positively can imagine how Big Tech can cut cost this way for a while, not training juniors. Eventually, they’ll run out of new seniors, of course. You can’t make a sound moral principle from this.| Worklog of Christian Tietze
What happens when you resolve the references in the four values of the Software Craftsmanship Manifesto to the corresponding values from the Agile Manifesto? You end up with this.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Exploring parameter packs (the repeat-each stuff) in Swift to count how many types are in the generic argument clause, or if that’s empty.| Christian Tietze
A Zettelkasten is a tool for learning. How do I learn a new piece of a familiar API at the very start?| Christian Tietze
A quick recipe on how to emit a binary from Swift that you can use from a C program.| Christian Tietze
Piping data from your Swift program to another program, or receiving large amounts of data from standard input, can be prone to errors, freezing your program. Here is how to do it safely.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Showing a popover relative to a text view will compute the accessibility hierarchy 3 times per clickable link in the text view; that can get slow real quick.| Christian Tietze
Shortcuts, aka “key equivalents”, are usually handled by views in your vier hierarchy in the same, predicatable way. Except deleting a character or word with backspace in a text view. These two, apparently, short-circuit this mechanism.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
The ultimate manifestation of a simplification is replacing N>1 things with 1 thing. If each of these things in turn are non-trivial, you can really feel how much complexity of behavior you cut away.| Christian Tietze
Where I realize that building dependencies in DEBUG mode can offer insights.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Just found this today in a Slack channel. It seems we can actually reference and re-use Xib files by overriding awakeFromCoder! > If we are loading from placeholder view, we create a real view and then ...| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Combining three Swift features for the sake of expressivitiy: sum types aka enums, callAsFunction to introduce “callable” semantics, and type extensions to beautify call sites.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
Blog and portfolio of Christian Tietze: developer of macOS and iOS apps, writer of programming books, and consultant of amazing devs.| Christian Tietze
If you need someone to implement a feature, realize an app, or coach you on programming for Apple platforms, I can help.| Christian Tietze
We don’t think about this as we write: the blinking cursor tells a useful lie about what the text looks like, so we can work on an abstraction that is about the space between characters, and especially the space after the last character.| Christian Tietze
Deep dive into where the little cells come from, the old school way: Inspecting call stacks, probing default objects. The goal is to change how cells spawn from Nibs.| Christian Tietze
Here is a simple free function to invert boolean values for all you Swift KeyPath fans out there.| Christian Tietze
Writing something every day was too tough for me for a long time. Eventually, though, I found out there ware lots of opportunities to practice writing while I feed my note archive. So I made note-writing ...| Christian Tietze