launchctl: Bootstrap failed: 5: Input/output error
2025-09-26
Initial symtoms
We have an internal service that needs to start a boot. The responsible team wrote a simple launchd script, like this:
1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3<plist version="1.0"> 4<dict> 5 <key>Label</key> 6 <string>com.example.watchdog</string> 7 8 <key>ProgramArguments</key> 9 <array> 10 <string>/usr/local/bin/watchdog</string> 11 </array> 12 13 <key>RunAtLoad</key> 14 <true/> 15 16 <key>KeepAlive</key> 17 <true/> 18 19 <key>SessionCreate</key> 20 <true/> 21 22 <key>StandardOutPath</key> 23 <string>/var/log/watchdog.out</string> 24 25 <key>StandardErrorPath</key> 26 <string>/var/log/watchdog.err</string> 27</dict> 28</plist>
What I'm doing now
2025-03-28
After taking some time to refresh myself and going on a road trip through Vietnam, I returned to the office to work as a Platform Engineer for a company in Hanoi. I’m learning to write an OS in Rust while continuing to read OSTEP. I’m building an all-in-one troubleshooting tool named diagtree, where I turn nearly any command into a tree, helping me quickly debug multiple services across different environments, from local to testing, and production.
Uses
2024-02-27
I found uses.tech and would like to add myself.
Hardware
- MacBook Pro (14-inch, 2021)
- Magic Keyboard
- Magic Mouse
- Nexstand K2 (to save my neck): https://www.youtube.com/watch?v=-fzlZAecI_4
- Raspberry Pi 4: host this website
Development
- Terminal: WezTerm
- Shell: fish shell
- Text Editor: Helix
Tools
- Git: lazygit, tig
- HTTP client: xh
- ls: exa
- cat: bat
- find: fd
- Search: ag
- Quick jump: zoxide
- Fuzzy finder: fzf
- Watch for changes: entr
- GitHub CLI: gh
- Container runtimes: colima
Integration testing TUI applications in Rust
2024-01-21
In building games with any language, there will be a loop to handle the key events. In case of crossterm, it’s event::read:
1if poll(Duration::from_millis(10))? { 2 let event = read()?; 3 match event { 4 Event::Key(KeyEvent { 5 code, 6 state: _, 7 kind, 8 modifiers: _, 9 }) => { 10 if kind == KeyEventKind::Press { 11 let mut tetromino = self.current_tetromino.clone(); 12 match code { 13 KeyCode::Char('h') | KeyCode::Left => { 14 tetromino.move_left(self, stdout)?; 15 self.current_tetromino = tetromino; 16 }
libp2p performance benchmarking
2023-10-27
I invested some time in studying QUIC and libp2p In this article, I will show you how to benchmark the network transfer using perf module for 2 scanerios:
- high latency, no packet loss
- low latency but high packet loss
Let’s print help first:
1 Running `rust-libp2p/target/debug/perf -h` 2Usage: perf [OPTIONS] 3 4Options: 5 --server-address <SERVER_ADDRESS> 6 --transport <TRANSPORT> 7 --upload-bytes <UPLOAD_BYTES> 8 --download-bytes <DOWNLOAD_BYTES> 9 --run-server Run in server mode 10 -h, --help Print help
Learning Rust by building Tetris: my favorite childhood game
2023-10-03
After completing the Rust book and working through rustlings, I found myself standing at the crossroads, wondering where to go next. It was then that I had an idea - a project that would allow me to apply my newfound knowledge and create something meaningful. My favorite childhood game, Tetris, became the inspiration for my next coding adventure.
Since I want it to be playable on Windows, I chose the TUI library crossterm.
Turning Helix into an IDE with the help of WezTerm and CLI tools
2023-08-19
This post recaps previous series of posts about Helix.
- Running code
- Jumping to build errors
- Quickly select a command and open it in a new pane
- Testing a single function
- Git integration
- File tree
- Creating snippets
- How to debug?
- Interactive global search
- Opening file in GitHub
1. Running code
In my previous post, I shared a method for running code from within Helix by using this PR.
I later discovered another useful trick here. We can use wezterm cli get-text command to extract the filename and line number from the status line:
Debug Rust in Helix using lldb-vscode: display the contents of local string variables
2023-08-11
In a previous post titled debugging Rust in Helix,
I introduced a workaround using codelldb to address the visualization issue related to string variables within lldb-vscode
.
However, the usage of codelldb
presents some challenges:
- We have to start the server first using
codelldb --port 13000
- It is noticeably slow
- The Helix theme breaks when listing variables
In my quest for an improved debugging experience, I found rust-lldb, which impressively manages to display the contents of string variables:
How to debug Rust in Helix?
2023-08-10
Helix supports debugging Rust by default using lldb-vscode. However, there is an issue where string variables are displayed as memory addresses instead of their actual values:
Noticing that CodeLLDB natively supports visualization of most common Rust data types, I would like to give it a try.
Here’s the step-by-step process:
Download the CodeLLDB extension:
1$ cd ~/Downloads/ 2$ wget https://github.com/vadimcn/codelldb/releases/download/v1.9.2/codelldb-aarch64-darwin.vsix
Setup the extension:
1$ mkdir -p ~/.local 2$ set fish_user_paths /Users/quantong/.local/extension/adapter $fish_user_paths 3$ codelldb
If you encountered this error:
nnn: wcswidth returns different values for same Unicode code point between macOS and Linux
2023-08-09
When attempting to integrate nnn
with Helix, I encountered an interesting issue that resulted in duplicate first characters in the filename:
What’s interesting is that this issue doesn’t occur on Linux:
I’ve spent several days troubleshooting this problem but haven’t been able to identify the root cause. The only solution I could come up with is a workaround, and I must admit, I’m still not entirely satisfied with it.