Ramblings
Dodge Danger
I created a small cross-platform 3D obstacle dodging game under 500 KB.
Create Modern Mac Disk Images
Mac applications outside the App Store are often delivered using disk images (dmg files), but many apps are not delivered using a modern or efficient disk image format. Below I provide my recommendations for creating more optimal disk image files.
Code Injection
I recently released an update to Bit Slicer that adds Code Injection support for arm64 or native Apple Silicon processes. Code injection allows injecting new code and logic into a running program. I will discuss how this functionality works in a debugger like Bit Slicer and what changes were made to enable this functionality for Apple Silicon.
10 Years of Bit Slicer 🎉
Back to my late teenage years I began developing an app to modify, enhance, and cheat Mac games. After struggling to come up with a good name, my friend Dylan named it Bit Slicer (nobody liked my “XZCheat” prototype name 😅). Fast forward 10 years to now, Bit Slicer has become one of my most beloved applications that I have poured a lot of my soul into. To celebrate its decade long anniversary, let me start with how it began.
Distributing Binaries on Linux
When I ported Sky Checkers to Linux a decade ago, distributing binaries to users on the platform was a painful experience. Now, the situation has improved a little. Last week I released Sky Checkers binaries for Linux on the Snap Store and Flathub. I will discuss what distribution approaches I looked at and why I ultimately decided to distribute my software through these channels.
Sky Checkers for iOS
Last year I rambled about making a major update to the rendering and netcode in Sky Checkers. This week I uploaded an even newer update that supports playing on Apple’s mobile platforms! Big architectural changes were made along this journey to iOS, but I will focus on just one interesting challenge I encountered for creating this port.
Sky Checkers
Over 10 years ago I dreamt of creating a fun 3-D multiplayer action packed game and started developing Sky Checkers. Last week, I released an update including major refinements developed in the past few months. Let me introduce the game and mention some of the highlights!
My Website Design
Fifteen years ago I hosted a HTTP server to send files to my friends and created my personal website using a HTML template I scavenged from the web. For a decent 10 years, I used a theme which had served me quite well during the Web 2.0 era up until entering the mobile landscape. A few years ago, I designed my own website style that you see today.
Komet
Today I released an update for Komet: a utility for writing commit messages on macOS. The latest bug fixes aren’t too interesting, so I will instead discuss how this project came to be!
Grammar Errors in Software
We dream that software is crafted in art form, that its creators have done everything possible to make their software friendly and professional. Unfortunately, software’s creators are just humans subject to making common grammar mistakes I nitpick below.
Type-safe printf in Idris
Recently I have been learning Idris: a functional language similar to Haskell with dependent types added to the mix. Writing a type-safe printf formatter function turns out to be a great exercise of how a language with dependent types can be utilized. I will show how writing our own printf
implementation can be type-safe at compile and runtime.
My Learning Experience
Unlike my other ramblings, this one will be more personal and less technical. I will describe my adventure learning as a kid up until now. In advance, I do not want to claim what is told here is applicable to others. I also realize that I am better off than many others and want to avoid making particular conclusions. I just want to share a portion of my life.
Avoid Passing the Delegator
When developing APIs, we strive to eliminate interdependencies between software components. Sometimes doing so completely is unachievable so one pattern we use is the delegation pattern to limit how much components can know about each other. This pattern consists of the delegator
which is typically a reusable library component, and a delegate
which is typically a custom controller1.
Very often, delegators pass themselves as a reference when sending a message to their delegate. Adopting this practice, however, should be avoided or at least be carefully considered.
Detecting the Debugger on OS X
How can your program detect if it’s being attached to a debugger? One approach is detecting if a mach exception handler is configured. Another more well known approach is detecting the usage of ptrace
. I will discuss the merits and disadvantages of both of these.