跳至主要內容

How to Use an iPad as a ROS2 Sensor and Receive Data on a Mac

(the post is automatically translated by AI) Background I’ve been learning ROS, but I don’t have a robot at hand. My idea: use the iPad I already have as a ROS node and receive data on my Mac — sensor data like IMU, Camera, Battery, etc. — to understand how ROS nodes collect and publish data. In this article, we’ll: Set up the MacBook as a ROS node (using Docker) Turn the iPad into a ROS node (using Conduit) Receive the iPad’s sensor data on the MacBook Setting Up the MacBook as a ROS Node (Docker) The ROS documentation mentions installing ROS2 natively on macOS, but in practice this runs into many deprecated packages and version dependency issues. After a few rounds of debugging with Claude Code, I decided to skip native installation — my goal at this stage was to see the data format ROS2 produces, not fight with the toolchain. ...

May 9, 2026 · 4 min · GanniPiece

Startup Journey 0002 | Why Isn't Auto-Scaling Working? The System Just Crashes

(the post is automatically translated by AI) In early 2026, I left my senior software engineer position at a large tech company to join a startup as a tech lead. Still figuring out both the technical and managerial sides, I’m hoping this series of journal entries will help me look back years later and see how I’ve grown. In the previous entry, we unified the deployment process across all environments, giving us more confidence in changes and tests going forward. Now it was finally time to look at the system’s behavior under traffic spikes. ...

April 11, 2026 · 4 min · GanniPiece

Startup Journey 0001 | It's There, But Also Not There

(the post is automatically translated by AI) In early 2026, I left my senior software engineer position at a large tech company to join a startup as a tech lead. Still figuring out both the technical and managerial sides, I’m hoping this series of journal entries will help me look back years later and see how I’ve grown. My first task after joining was to look back at the current system. This system had long struggled with auto-scaling, causing delays under sudden or sustained high traffic. ...

April 3, 2026 · 3 min · GanniPiece

Startup Journey 0000 | To Join or Not To Join

(the post is automatically translated by AI) In early 2026, I left my senior software engineer position at a large tech company to join a startup as a tech lead. Still figuring out both the technical and managerial sides, I’m hoping this series of journal entries will help me look back years later and see how I’ve grown. In early 2025, a former lab senior — also a co-founder from our first startup attempt — reached out again with an invitation to build something together. At that point, I hadn’t been a senior engineer for very long, and my risk tolerance was fairly low. So I declined. ...

March 21, 2026 · 3 min · GanniPiece

How to Install Sushi DAW on macOS

(the post is automatically translated by AI) Table of Contents About Sushi DAW Installation Method 1: Using the Official Pre-built Binary Method 2: Build from Source Verifying the Installation: Playing a Synth Arpeggio Conclusion Troubleshooting Issue 1: required Xcode 9 or newer References About Sushi DAW Sushi is the plugin host and DAW for the Elk Audio OS [1]. Key features include: Configuration via JSON files Runtime control via OSC (Open Sound Control) or Google’s gRPC protocol A configurable logging system for third-party integrations gRPC supports multiple languages — Python, JavaScript, Lua, C/C++, and more — which allows rapid prototyping with elkpy in Python and production optimization with elkcpp in C/C++. ...

June 1, 2024 · 2 min · GanniPiece

How to Deploy Hugo to GitLab Pages and Point It to a Gandi Domain

(the post is automatically translated by AI) Table of Contents Introduction Migrating the GitHub Repo to GitLab Configuring the GitLab CI/CD Pipeline Scheduled Deployment (Auto-Deploy on a Schedule) Pointing the Gandi Domain to GitLab Pages Configure GitLab Pages Configure Gandi DNS Conclusion References Introduction My personal website was previously hosted on GitHub, deployed via GitHub Actions to GitHub Pages, with a custom domain pointed to it. That workflow was convenient — once set up, I only had to focus on content and not worry about deployment. ...

October 28, 2023 · 4 min · GanniPiece

How to Map MediaPipe Skeleton to Unity Humanoid

(the post is automatically translated by AI) Introduction MediaPipe is a collection of ML solutions maintained and developed by Google for various computer vision tasks, including detecting multiple body parts 1 — face, hands, torso, hair, and more (Figure 1). Figure 1 One of the most common applications is using the Holistic 2 solution for full-body skeleton detection. Since it captures both facial and body landmark data, it can substitute for traditional motion capture hardware (e.g., MoCap suits) — especially useful for Vtuber applications that don’t require high-precision motion. ...

March 8, 2023 · 4 min · GanniPiece

Why Coroutine? (Part 2) — Implementing a Coroutine in C

(the post is automatically translated by AI) Introduction In the previous article, Why Coroutine? (Part 1) — Is Multithreading Not Enough?, we covered the underlying principles of Coroutines and listed the interface we need to implement one in C. In this article, we’ll walk through the code line by line. Source code: GanniPiece/SimpleCCoroutine: A simple coroutine example implemented using C (github.com) Background Knowledge Before we begin, if you’re not familiar with Coroutines, please read the previous article first. In it we mentioned that we can manipulate ucontext_t [1] using four operations defined in <ucontext.h>: ...

October 10, 2022 · 4 min · GanniPiece

Code Expansion: Macro vs Inline Function

(the post is automatically translated by AI) Introduction Macros and inline functions are two techniques for code reuse and expansion. Unlike regular function calls, both avoid the overhead of subroutine push/pop operations at runtime, which can speed up execution. The key difference between them is when the expansion happens: macros are substituted by the preprocessor before compilation, while inline functions are expanded by the compiler during compilation. However, both result in larger binary sizes compared to using regular functions, since the code is duplicated at every call site. ...

October 8, 2022 · 4 min · GanniPiece

#: The Language of the Preprocessor

(the post is automatically translated by AI) Introduction The preprocessor runs before the compilation phase. As a pre-compilation step, it can handle several types of tasks, including conditional compilation (e.g., #if, #ifndef), file inclusion, and macro definitions. In this article, we’ll look at each of these preprocessor features one by one. The Language of the Preprocessor To communicate with the preprocessor, we first need to understand its language. A standard preprocessor directive consists of three parts: ...

October 5, 2022 · 3 min · GanniPiece