Posts from 2024
December 2024
Apple Music App: Android APK Direct Download
How to listen to your Apple Music subscription on an Android device
Gus Continues to Work on Acorn
20 years after starting to work on Acorn, Gus Mueller still works on Acorn as an independent developer.
Org-Mode Emphasis Keymap with Mnemonics
I do not like how org-mode’s emphasis function works, requiring knowledge about the syntax to apply bold and italic and inline code style correctly. Here’s a solution that uses ‘b’ for bold etc.
Swift Concurrency Provides Compile-Time Feedback for Runtime Behavior
Read this introduction to Swift Concurrency. You need it.
November 2024
Refactoring is bending reality over and over until you finally make the actual change. It’s exhausting.
Pi-hole on Unraid (as Local DNS to Access NAS Services Without a Roundtrip to Cloudflare)
My Nextcloud and a couple of other sync services are exposed to the internet via a reverse proxy, and I reach them via a Cloudflare tunnel and a custom domain. That Cloudflare round-trip doesn’t make sense while I’m home, so with Pi-hole as DNS, I directly connect to my NAS for LAN speeds.
TableFlip v1.7.0 Releases with Modern Icons
New icons and UI for TableFlip, the visual Markdown and CSV and LaTeX and JSON and HTML table editor!
Percent-Encode HTML Form Values so That Spaces Become ‘%20’ Instead of ‘+’
You can use HTML forms to dispatch actions to custom macOS app URL schemes, but you need to encode the form data yourself to avoid surprises.
Global Day of Code Retreat 2024 Retrospective
Nov 9th, 2024 was Global Day of Code Retreat. I found that people are the actually hard thing in programming.
Running Unsigned Applications on macOS Sequoia
“Open Anyway” for unsigned apps is now located in settings.
October 2024
Composition Over Inheritance in NSViews
I noticed that I’m writing some AppKit/UIKit view components in a composable way that reminds me of the opaque nature of SwiftUI.View-conforming types: hiding away the actual 1st party APIs, providing very little surface area.
Alex Ozun: Type-Driven Design with Swift (SwiftCraft 2024)
The talk “Type-Driven Design with Swift” by Alex Ozun covers interesting topics and presents type-based solutions to software development problems in an easy-to-grasp way.
September 2024
Checklists Appreciated Under Stress
Giving birth to a child includes managing stressed-out hospital staff, too. Checklists would’ve helped along the way at every turn. And they still help me to get stuff done in an otherwise unorganized daily routine.
August 2024
Typed Filters and callAsFunction
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.
Fairphone Fairbuds Are a Great Idea (Only)
I tried to get the Fairphone Fairbuds to work, but failed. I still like the idea. But the UX and execution is terrible.
July 2024
A formal request for tips and tricks.
Pretty-Printing Variables, Objects, and Functions in JavaScriptCore
A JavaScript function for debugging that stringifies an object including its functions so you can evaluate the result again.
PSA: SwiftUI Button Click-Through Fixed in macOS 15
SwiftUI non-bordered button styles don’t support click-through up to macOS 15, but are fixed with the upcoming macOS release.
Find yourself dealing with primitive value types a lot? There’s a term for that.
Logical Ranges and Character Ranges
Text editing is different from text inspection, and I believe I’m on the path towards a more expressive domain.
June 2024
Embark: Display Buffer in Dedicated Side Window
Show any buffer in a side-window (aka a sidebar, but also potentially at the bottom) of an Emacs frame. Includes Embark key bindings to do this from a buffer list.
Create Journal Note For a Previous Day in denote.el
TLDR: Customize denote-prompts. The longer version shows you how to discover this based on the code on your own if you’re in a similar situation.
MacMenuBar – Directory of Hundreds of Menu Bar Apps
Invaluable resource to see trends in menu bar app UIs and to discover cool tools: macmenubar.com lists 950+ menu bar apps (as of June 2024)
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.
As a software developer, I want to understand the code, so that I can implement changes for our users. How do we get there?
If You Use KOMA-Script, Really Do Use KOMA-Script
The KOMA-Script LaTeX package bundle may be typical German over-engineering, but when it works, it really works.
Fold Search Results Away in rg.el
Whenever you want to fold away content in an Emacs mode that doesn’t support this out of the box, consider using outline-minor-mode. Here’s how I did that to make rg.el
Declarative Text Kit: Word Ranges
Writing a somewhat language-agnostic detector of word boundaries is no small feat.
Hide macOS Menu Bar Icons (Bartender Alternatives)
macOS app Bartender changed owners without any notice, and users are abandoning ship for lack of trust. Here are some alternatives.
Declarative Text Kit: Token-Based Adapters
With a semantic FencedCodeBlock type added to my app, performing changes on existing code blocks is not procedural anymore. It is now a one-liner.
Declarative Text Kit: Reduction in Ugly Code Size
Great news: This week’s v0.3 release of the Package is good enough to implement the feature I wanted to build!
May 2024
Declarative Text Kit: Expression and Evaluation
To declare changes in the DSL, we need a vocabulary of expressions and sort of a grammar. With Result Builders, this is surprisingly simple.
Swift Package: FastSpring In-App Purchase
I published a Swift Package to embed a FastSpring-powered store within my apps.
Declarative Text Kit: Inserting Strings and Lines With a Result Builder
Swift Result Builders make the declarative Text Kit API quite nice to work with once you know what you want to do. Here’s how I got over the initial humps.
Some habits are hard to break. It is easier if you have meaningful alternatives.
Declarative Text Kit: Sketch of an API
I was fed up with writing long procedures to perform markup changes on the fly. This post contains an API that looks like something I would like to use.
Use and Then Reduce Open Source Dependencies
Dependencies make you quick. Dependencies also slow you down.
As the saying goes, if the title of a post is a question, the answer is “no”. So, do you, or don’t you need a Zettelkasten in your life?
April 2024
Table View Cells from Nib: How to Change the Blueprint Data to Affect New Cells
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.
Dynamic Actor Isolation Can Help During the Transitional Phase
On your way to static actor isolation, adopt dynamic isolation practices to ease into the change.
Niki Tonsky: Hardest Problem in Computer Science: Centering Things
Vertical centering, baseline alignment, visual horizontal centering. Nothing is easy.
Always Be Changing Existing Code
Ever thought that your good idea from today will be the worst nightmare of your future self? The future not realized may actually be worse.
SwiftUI Kata: Recreating DebugInfo Viewer
Recreating the “DebugTest Info” app from the Mac OS X era from Technical Note TN2124 in SwiftUI with macOS Sonoma default styling.
Enable SwiftUI Button Click-Through for Inactive Windows on macOS
Buttons in macOS windows both activate a background window and perform the button action with one click. That so-called click-through behavior breaks with almost all SwiftUI button styles, including custom ones. Here is a fix.
Soulslike games are characterized by their high difficulty level, where success depends on learning from failures and mastering the mechanics. You know what else shares this?
Masterclass of Decoupling: Diablo II Resurrected
Diablo II Resurrected has 3D graphics, but it’s actually the same game, as far as you can take the meaning of “same” without running from the original discs.
March 2024
Negate KeyPath<T, Bool> Values with not()
Here is a simple free function to invert boolean values for all you Swift KeyPath fans out there.
Disable XeLaTeX Character Sequence Mappings for Inverted Question Mark and Inverted Exclamation Mark
Some simple ASCII character sequences in TeX files become fancy Unicode characters like curly quotes or em-dashes. Disabling some of these so-called mappings can be a pain. Easy with pdfLaTex/LuaLaTeX, hard with XeLaTeX.
You Absolutely (Do Not) Need to Comment Your Code
Comments in code are useless. And commented code is the best.
Ship Custom Fonts within a Swift Package
You can treat font files like any other resource, but you need to use Core Text API to load them in your app. That isn’t as complicated as I feared. Here’s how.
Easing Into a Language and Environment: Week 3 with PHP
A short retrospective of learning a new-ish language and the programming environment.
Oh, You’re Making Apps, So You Are Working for Apple/Google/…?
The ultimate litmus test: Can your mother tell apart “creating apps for iPhone” from “working for Apple”?
SwiftUI Challenge: Can You Port this from Auto Layout to SwiftUI?
“Der Teilweise” proposed an interesting benchmark to see whether SwiftUI is production ready. Takes 10 minutes to do in Auto Layout. How long do you need for SwiftUI?
3 Types of FastSpring Storefronts
For app developers, there are three basic FastSpring storefronts you can use to sell your apps quickly.
How to Disallow GPTBot Crawling in robots.txt
You need to tell GPTBot to stop crawl your website if you don’t want it to. Here is how.
Developer Voices on Property-Based Testing Made Me Realize PBT’s Value
Maybe Kris Jenkins and Oskar Wickström made Property-Based Testing click for me. Here are my personal insights to maybe color you intrigued as well.
TableFlip v1.6.0: JSON Support and Font Resizing
TalbeFlip v1.6.0 is released, a free update for direct customers and Mac App Store users. It finally brings resizable fonts, and a first glimpse towards JSON support.
February 2024
Portable Every-Day-Carry Paper Kanban
You don’t need a computer or smartphone to use a Kanban board: here’s an approach to do it all with simple, affordable, and fun paper tools.
Splitting Large Tasks is not a Mathematical Process
You’re in a team meeting. You estimate a task to be worth 13 story points, which is a lot in your team, so you break it up into two tasks. The first one is estimated to be worth 8 story points. What’s the second one worth?
Chris Eidhof released an interactive, animated resource to understand SwiftUI.
Looking for Testers: Typers of Japanese, Chinese, and Korean Characters
Do you routinely work with text typeset in Japanese, Chinese, or Korean characters? Do you type these yourself? I’m looking for testers!
Example of Object Tag vs Topic Tag in Programming Zettelkasten
A (hopefully instructive) example of topic vs object tags in a Zettel about programming topics.
Turns out that even when the overflow menu items look clickable, not all of them actually fire an event. You need to tell the NSMenuItem about its action.
January 2024
Life Hack: Label Your Trash Bins
This 1 weird hack will annoy the hell out of all the trash bin bag producers!
32-Bit Cafe: Personal Website Ideas
Inspiration for personal websites: topics, design tweaks, and playfulness.
Low App Prices are Preemptive Excuses
Developers see how their product falls short from the ideal, and so they instinctively charge a lower price than they could (and maybe should).
Have You Ever Sent an Email with a File Attachment that is Located on a Server?
This is a tale of convergence of Embark, TRAMP, and email to brainlessly just send a file from somewhere to someone.
Transformative Reading … 2017 Edition?!
A new year, so let us talk about favorite books (or at least those I wrote down to mention), but from 7 years ago.
ChatGPT Shell: Confirm Before Closing and Split Compose Buffer
Tweaks to my chatgpt-shell configuration.
Emacs sqlite-mode to Open .sqlite Files Automatically
.sqlite files render “graphically” in Emacs, but only if you open them manually with the equivalent of a file picker dialog; that is unacceptable, and I propose a solution that opens the graphical view for SQLite database files when you visit the files automatically.
Cold-Blooded vs Warm-Blooded Software
You cannot run cold-blooded projects as warm-blooded ones. There is not enough activity “to keep the temperature up”. But cold-blooded projects are great to keep around for years and years.
You Can Choose When You Live in Surplus
You decide what constitutes “enough”, and when you reach that point.
I found ISO dates to be lacking in context in notes that represent timelines. So I am trying out something a tad different, like [2024-01-01 Mon].