I really hate to brag, but I wanted to share this life achievement. The Pinball Arcade Trial running on Windows 98 informed me that I got the highest score possible for the trial version.

It was cool to see this feature rolled out! Kudos to our teammates who worked hard on this. It was a fun thing to hack on in Munich.
I’ve been eyeing the Keychron Q6 since the middle of 2023 and finally have one in my possession. Here’s why it’s a winner in my book:
After an hour or so of using it, so far so good! It’s exactly what I hoped it’d be, and a leap in modernization and build quality from the New Model M that I’ve been running. I’ll still use Buckling Springs on my retro machines, of course, but it’s so nice to have LEDs, a knob for volume, dedicated function keys for brightness and Spaces, and the flexibility to do whatever I want with custom firmware. 😎
We had a great time ringing in 2024 with friends in San Francisco!
Some highlights:
Revisiting last year’s challenge, let’s see how this year goes with GPT-4.
I used the same prompt from 2022:
Draw a Christmas tree using SwiftUI
Interestingly this time it included the Triangle
type and it was almost line-for-line the exact one I substituted in last year.
import SwiftUI
struct ContentView: View {
var body: some View {
ZStack {
// Background
Color.white.edgesIgnoringSafeArea(.all)
// Christmas Tree
VStack {
ForEach((1...5).reversed(), id: \.self) { i in
TreeLayer(width: CGFloat(i) * 60)
}
Rectangle()
.frame(width: 40, height: 50)
.foregroundColor(.brown)
}
}
}
}
struct TreeLayer: View {
var width: CGFloat
var body: some View {
ZStack {
Triangle()
.fill(Color.green)
.frame(width: width, height: width * 0.75)
// Add decorations here
}
}
}
struct Triangle: Shape {
func path(in rect: CGRect) -> Path {
var path = Path()
path.move(to: CGPoint(x: rect.midX, y: rect.minY))
path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY))
path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
path.closeSubpath()
return path
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
And here’s the output for 2022 and 2023! 🎄😀
I didn’t get out much in Munich as it was an intense week of work, but one morning I did take a walk in the park that borders the Eisbach river. It was cold, rainy, and quite enjoyable.
I’m starting to dust off some seasonal projects and realized I hadn’t made this simple tool public which others may find handy. With projects like the NeoPixel Tree it can be much quicker to code visual sequences locally instead of waiting for new firmware to upload to the MCU every time you want to tweak something.
The tool just wraps around the Adafruit GFX Graphics Library and instead of outputting to physical pixels it runs through SDL2. It’s somewhat similar to what I did in swift-gfx-wrapper but keeps it all in C.
GitHub repo: https://github.com/twstokes/gfx-proto
Amsterdam was so nice! Great food, going to Tony’s Chocolonely, meeting friendly cats, avoiding bicycles, a ride in the canal, and visiting the Anne Frank memorial just to name a few highlights.
Maybe if I share videos of half-finished projects it’ll motivate me to finish them!