12-Factor
Cloud-Native Deployment (Part 1): The Evolution from Physical Machines to Containers
AAB
The Difference Between Android App Bundle (AAB) and APK
AI
MCP vs. CLI: The Two Paths for Agents to Call Tools, and Who Is Eroding Whom?
An Agent's "Code of Conduct" — the Essence of Skill and the Common Misconceptions
The Hands and Feet of an Agent: Tool Capability Boundaries and Their Evolution
Hermes Memory Provider and Mem0: An Overlooked Memory Abstraction Layer That Lets Agents Share Knowledge
Hermes Profile — Multiple Agent Personas, One Set of Tools Does It All
LiteLLM: A Unified LLM Gateway — From API Key Chaos to Enterprise AI Infrastructure
Local LLM in Practice (Part 6): Hermes Agent — a Self-Evolving AI Agent with Memory and Learning
Local LLMs in Practice (Part 5): OpenClaw — A Local Agent Gateway That Gives LLMs "Digital Hands and Feet"
Local LLM in Practice (Part 4): OpenHands — The Ideal and the Reality of an AI Full-Stack Software Engineer
Local LLM in Practice (Part 3): Cline — the Open-Source Coding Agent in VS Code
Local LLM in Practice (Part 2): OpenCode — The Open-Source AI Coding Assistant in Your Terminal
Local LLMs in Practice (Part 1): Building Your AI Infrastructure on the Intranet
Vibe Coding (Part 4): How to Make AI Truly Understand Your Project
Vibe Coding (Part 3): AI-Generated Code — Doubt First, Trust Later
Vibe Coding (Part 2): Treating the AI as a New Intern
Vibe Coding (Part 1): You're Not Writing Code, You're Describing Requirements
Understanding AI (5): Embedding — How AI Understands Semantics
Understanding AI (Part 4): Temperature and Top-P — the AI Creativity Knob
Understanding AI (Part 3): Context Windows — How Short-Term Memory Works in AI
Understanding AI (Part 2): What Is a Token? — How AI Reads and How Tokenisation Works
Understanding AI (Part 1): What Is AI Actually Learning? — From Probability to Language Models
AI Agent
Local LLM in Practice (Part 6): Hermes Agent — a Self-Evolving AI Agent with Memory and Learning
Local LLMs in Practice (Part 5): OpenClaw — A Local Agent Gateway That Gives LLMs "Digital Hands and Feet"
Local LLM in Practice (Part 4): OpenHands — The Ideal and the Reality of an AI Full-Stack Software Engineer
AI Programming
Local LLM in Practice (Part 3): Cline — the Open-Source Coding Agent in VS Code
Local LLM in Practice (Part 2): OpenCode — The Open-Source AI Coding Assistant in Your Terminal
Vibe Coding (Part 4): How to Make AI Truly Understand Your Project
Vibe Coding (Part 3): AI-Generated Code — Doubt First, Trust Later
Vibe Coding (Part 2): Treating the AI as a New Intern
Vibe Coding (Part 1): You're Not Writing Code, You're Describing Requirements
API Gateway
LiteLLM: A Unified LLM Gateway — From API Key Chaos to Enterprise AI Infrastructure
APK
The Difference Between Android App Bundle (AAB) and APK
ARM
Build Tools (Part 8): Cross-Compilation — Compiling ARM Programs on Your x86 Computer
Addressables
Game Build: Unity Build (Part 4): Addressables — a "Correct Answer" That Changes Far More
Agent
MCP vs. CLI: The Two Paths for Agents to Call Tools, and Who Is Eroding Whom?
An Agent's "Code of Conduct" — the Essence of Skill and the Common Misconceptions
The Hands and Feet of an Agent: Tool Capability Boundaries and Their Evolution
Hermes Memory Provider and Mem0: An Overlooked Memory Abstraction Layer That Lets Agents Share Knowledge
Agent Gateway
Local LLMs in Practice (Part 5): OpenClaw — A Local Agent Gateway That Gives LLMs "Digital Hands and Feet"
Agile
DevOps Methodology Musings (Part 1): Culture Comes First — Why We Start with Culture
Jira Scrum Agile Boards in Practice
Alert Fatigue
Monitoring Musings (Part 4): Alert Design — Why Your Alerts Make People "Numb"
Feedback System Musings (Part 5): Notification Strategy Design — When to Notify Whom
Alert Severity
Feedback System Musings (Part 5): Notification Strategy Design — When to Notify Whom
Alerting
Monitoring Musings (Part 4): Alert Design — Why Your Alerts Make People "Numb"
Feedback System Musings (Part 3): SMS Notifications — the Ultimate Fallback for Emergencies
Alertmanager
Monitoring Musings (Part 4): Alert Design — Why Your Alerts Make People "Numb"
Alibaba Cloud
How to Build a Personal Blog with GitHub Pages
Android
The Difference Between Android App Bundle (AAB) and APK
Ant
Ant Custom Tasks — Writing Inline Scripts in Groovy/JavaScript
Executing External Commands and Scripts with Ant
Conditionals in Ant — Using if/unless and condition
Common Ant File Operations — Copy, Move, Delete, Rename
Loading and Using Property Files in Ant
Measuring the Execution Time of Ant Targets
Ant Design Vue
Learn Vue and Become a Full-Stack Web Developer!
Architectural Thinking
DevOps Methodology Musings (Part 6): The Tasteful Developer Does DevOps — Not Just "Can It Run" but "Does It Look Good"
Architecture
Jenkins Architecture
Artifact Management
Release Engineering (Part 7): Tool Comparison and Artifact Cleanup Strategies
Release Engineering (6): JFrog Artifactory — Enterprise-Grade Artifact Management
Release Engineering (Part 2): Version Number Conventions — SemVer and CalVer
Release Engineering (Part 1): What Is a Release — The Starting Point of the Artifact's Full Life Cycle
Artifact Repository
Release Engineering (Part 4): Nexus — Java Private Repository and General-Purpose Artifact Repository
Artifactory
Release Engineering (Part 7): Tool Comparison and Artifact Cleanup Strategies
Release Engineering (6): JFrog Artifactory — Enterprise-Grade Artifact Management
Unpacking AssetBundles — Extracting Unity Assets with AssetStudio
AssetBundle
Unpacking AssetBundles — Extracting Unity Assets with AssetStudio
Game Build: Unity Build (Part 4): Addressables — a "Correct Answer" That Changes Far More
Game Build: Unity Build (Part 2): Two Generations of the AssetBundle Interface — From Hand-Written Packaging to Automatic Dependencies, What Happened Along the Way?
AssetStudio
Unpacking AssetBundles — Extracting Unity Assets with AssetStudio
Automated Deployment
Automated Deployment with GitHub Actions — from push to live
Automation
The Automation Revolution and DevOps
Autonomous Coding
Local LLM in Practice (Part 4): OpenHands — The Ideal and the Reality of an AI Full-Stack Software Engineer
Balance
The Spear and Shield of Innocence
Bash
Blog Adds a New Page: "Reference Books"
Batch
How to print the current directory in a Windows bat file (like pwd on Linux)
Bazel
Build Tools (11): Build System Panorama — How to Choose from make to Bazel
Build Tools (10): Getting Started with Bazel — A Build System at Google's Level
Blame
DevOps Methodology Musings (Part 1): Culture Comes First — Why We Start with Culture
Blogging
Writing a Blog with Git and Markdown Is a Great Experience!
Blue Ocean
Jenkins FAQ Collection (Part 2)
Borg
Cloud-Native Deployment (Part 5): Kubernetes Architecture Core — Master, Node and etcd
Branching
SVN Branching and Merging — The Right Way to Develop on the Trunk
Branching Models
Git Branching Models (Part 4): Trunk-Based Development
Git Branching Models (Part 3): GitLab Flow
Git Branching Models (Part 2): GitHub Flow
Git Branching Models (Part 1): Git Flow
Browser Use
The Hands and Feet of an Agent: Tool Capability Boundaries and Their Evolution
Build Pipeline
Game Builds: Unity Build (Part 1): After You Click Build, How Much Does Unity Do For You?
Game Build: Unreal Builds (Part 4): The Shader Compilation Nightmare — Why Does Every Update Make Players Wait Twenty Minutes?
Game Builds: Unreal Build (Part 3): Pak Files — How Unreal Wraps Its Assets
Game Build: Unreal Builds (Part 2): What Is Cook? Why Does Every Build Have to "Do the Cooking"?
Game Builds: Unreal Build (Part 1): How Does a .uproject Become an .exe?
Game Build: Unity Build (Part 5): IL2CPP and Cross-Platform — How Does "Develop Once, Ship Everywhere" Actually Work?
Game Build: Unity Build (Part 4): Addressables — a "Correct Answer" That Changes Far More
Game Build: Unity Build (Part 3): Scriptable Build Pipeline — Minimum Change, Maximum Cache Gain
Game Build: Unity Build (Part 2): Two Generations of the AssetBundle Interface — From Hand-Written Packaging to Automatic Dependencies, What Happened Along the Way?
Game Builds: Unity Build (Part 1): After You Click Build, How Much Does Unity Do For You?
Game Build Musings (Part 0): From Java to Unity/Unreal, How I Came to Understand the Word "Build" All Over Again
Build Tools (11): Build System Panorama — How to Choose from make to Bazel
Build Tools (10): Getting Started with Bazel — A Build System at Google's Level
Build Tools (Part 9): Ninja — The Flash of the Build World
Build Tools (Part 5): Getting Started with CMake — Why Your Project Needs a CMakeLists.txt
Build Tools (Part 1): From Typing gcc by Hand to the Makefile — The First Evolution of Build Tools
C/C++
Build Tools (11): Build System Panorama — How to Choose from make to Bazel
Build Tools (10): Getting Started with Bazel — A Build System at Google's Level
Build Tools (Part 9): Ninja — The Flash of the Build World
Build Tools (Part 8): Cross-Compilation — Compiling ARM Programs on Your x86 Computer
Build Tools (Part 7): Organizing CMake in a Multi-Directory Project — Managing Code Like Building Blocks
Build Tools (Part 6): The Way of Modern CMake — target_* and Interface Propagation
Build Tools (Part 5): Getting Started with CMake — Why Your Project Needs a CMakeLists.txt
Build Tools (Part 4): pkg-config — The Key That Solves Dependency Hell
Build Tools (Part 3): Static Libraries vs Dynamic Libraries — What Exactly Is the Difference Between .a, .so and .dylib
Build Tools (Part 2): The Four Stages of GCC Compilation — What Your .c File Actually Goes Through
Build Tools (Part 1): From Typing gcc by Hand to the Makefile — The First Evolution of Build Tools
CDN
Free Front-End CSS and JS CDN Acceleration Sites in China
CI/CD
DevOps Methodology Musings (Part 4): Toolchain Thinking — What Should Be in Your Arsenal
DevOps Methodology Musings (Part 2): The DevOps Loop — End-to-End Software Delivery
Release Engineering (6): JFrog Artifactory — Enterprise-Grade Artifact Management
Release Engineering (Part 1): What Is a Release — The Starting Point of the Artifact's Full Life Cycle
Feedback Systems Miscellany (Part 4): Instant Messaging Notifications — Webhook Connects Everything
Feedback System Musings (Part 1): From "Seeing the Problem" to "Triggering Action"
Automated Deployment with GitHub Actions — from push to live
GitHub Actions — GitHub's Native Automation Workflow
Gitlab CI — the CI/CD Power Tool Built into Gitlab
CI_COMMIT_BRANCH
GitLab Predefined Variables in Practice (Part 1): The Pipeline's "Identity" — Branch, Tag, Commit, and MR
CI_PIPELINE_SOURCE
GitLab Predefined Variables in Practice (Part 2): The Pipeline "Orchestration Signals" — Trigger Source, Parent-Child Pipelines, Runner and Environment
CJE
I Obtained the Certified Jenkins Engineer Certification and Certificate
CLI
MCP vs. CLI: The Two Paths for Agents to Call Tools, and Who Is Eroding Whom?
The Hands and Feet of an Agent: Tool Capability Boundaries and Their Evolution
CMake
Build Tools (11): Build System Panorama — How to Choose from make to Bazel
Build Tools (Part 8): Cross-Compilation — Compiling ARM Programs on Your x86 Computer
Build Tools (Part 7): Organizing CMake in a Multi-Directory Project — Managing Code Like Building Blocks
Build Tools (Part 6): The Way of Modern CMake — target_* and Interface Propagation
Build Tools (Part 5): Getting Started with CMake — Why Your Project Needs a CMakeLists.txt
CNI
Cloud-Native Deployment (Part 7): K8s Network Model — CNI and Service Discovery
CSS
Starting from a Small Problem: A Word on the Mindset of Problem Solving
CSS3
How to Build a Personal Blog with GitHub Pages
Caching
Gradle Incremental Builds and Build Cache Optimization
CalVer
Release Engineering (Part 2): Version Number Conventions — SemVer and CalVer
Calico
Cloud-Native Deployment (Part 7): K8s Network Model — CNI and Service Discovery
Career Development
DevOps Methodology Musings (Part 5): What a DevOps Engineer Needs to Know — An Unconventional Competency Model
DevOps Methodology Musings (Part 3): Which Major Suits DevOps — How Your Professional Background Shapes Your Starting Point
CentOS 7
Installing PHP on CentOS 7
Installing Nginx on CentOS 7
Installing MariaDB on CentOS 7
Certificate
I Obtained the Certified Jenkins Engineer Certification and Certificate
Certification
I Obtained the Certified Jenkins Engineer Certification and Certificate
Certified Jenkins Engineer
I Obtained the Certified Jenkins Engineer Certification and Certificate
Changelog
Release Engineering (Part 3): Changelog and Release Notes — Making Every Version Traceable
Chart
Cloud-Native Deployment (Part 9): K8s Package Management — Helm from Getting Started to Real-World Practice
Checkstyle
Java Static Code Analysis (Part 2): Enforcing Code Style with Checkstyle
Chinese
The Problem of Escaping Chinese Characters in JavaScript
Chinese ICP Filing
Improving the Styling of the Domain's Public Security Filing Information
Claude Code
Local LLM in Practice (Part 2): OpenCode — The Open-Source AI Coding Assistant in Your Terminal
Claude Dev
Local LLM in Practice (Part 3): Cline — the Open-Source Coding Agent in VS Code
Cline
Local LLM in Practice (Part 3): Cline — the Open-Source Coding Agent in VS Code
Cloud Native
Cloud-Native Deployment (Part 1): The Evolution from Physical Machines to Containers
Cobertura
Java Code Coverage (Part 1): From Emma to JaCoCo, What Coverage Really Is
Code Coverage
Java Code Coverage (Part 2): JaCoCo in Practice, from Getting It Running to Reading the Report
Java Code Coverage (Part 1): From Emma to JaCoCo, What Coverage Really Is
Code Quality
DevOps Methodology Musings (Part 6): The Tasteful Developer Does DevOps — Not Just "Can It Run" but "Does It Look Good"
Java Static Code Analysis (6): Building a Continuous Code Quality Platform with SonarQube
Java Static Code Analysis (Part 5): SpotBugs — the Successor to FindBugs
Java Static Code Analysis (Part 4): FindBugs — the Bytecode-Level Bug Hunter
Java Static Code Analysis (Part 3): Finding Bad Practices with PMD
Java Static Code Analysis (Part 1): What Is Static Analysis
Code Review
Vibe Coding (Part 3): AI-Generated Code — Doubt First, Trust Later
Code Style
Java Static Code Analysis (Part 2): Enforcing Code Style with Checkstyle
Competency Model
DevOps Methodology Musings (Part 5): What a DevOps Engineer Needs to Know — An Unconventional Competency Model
DevOps Methodology Musings (Part 3): Which Major Suits DevOps — How Your Professional Background Shapes Your Starting Point
Compilers
Build Tools (Part 2): The Four Stages of GCC Compilation — What Your .c File Actually Goes Through
Computer Use
The Hands and Feet of an Agent: Tool Capability Boundaries and Their Evolution
Conditionals
Conditionals in Ant — Using if/unless and condition
Config Files
Hermes Profile — Multiple Agent Personas, One Set of Tools Does It All
ConfigMap
Cloud-Native Deployment (Part 6): K8s Core Concepts — Pod, Deployment, Service, ConfigMap and Secret
Conflicts
SVN Conflict Resolution in Detail — Say Goodbye to Merge Phobia
Confucianism
The Unity and Plurality of Chinese Values
Container Images
Cloud-Native Deployment (Part 4): Container Image Registry — Docker Hub and a Self-Hosted Harbor Registry
Containers
Release Engineering (Part 5): Harbor — The Container Image Registry
Cloud-Native Deployment (Part 2): Docker Basics — Images, Containers and the Principle of Layering
Cloud-Native Deployment (Part 1): The Evolution from Physical Machines to Containers
Context Management
An Agent's "Code of Conduct" — the Essence of Skill and the Common Misconceptions
Vibe Coding (Part 4): How to Make AI Truly Understand Your Project
Context Window
Understanding AI (Part 3): Context Windows — How Short-Term Memory Works in AI
Continuous Delivery
DevOps Methodology Musings (Part 2): The DevOps Loop — End-to-End Software Delivery
Contradiction
The Spear and Shield of Innocence
Conventional Commits
Release Engineering (Part 3): Changelog and Release Notes — Making Every Version Traceable
Cook
Game Build: Unreal Builds (Part 2): What Is Cook? Why Does Every Build Have to "Do the Cooking"?
CoreDNS
Cloud-Native Deployment (Part 7): K8s Network Model — CNI and Service Discovery
Cost Control
LiteLLM: A Unified LLM Gateway — From API Key Chaos to Enterprise AI Infrastructure
Cross-Compilation
Build Tools (Part 8): Cross-Compilation — Compiling ARM Programs on Your x86 Computer
Game Build: Unity Build (Part 5): IL2CPP and Cross-Platform — How Does "Develop Once, Ship Everywhere" Actually Work?
Custom Rules
An Agent's "Code of Conduct" — the Essence of Skill and the Common Misconceptions
DDC
Game Build: Unreal Builds (Part 4): The Shader Compilation Nightmare — Why Does Every Update Make Players Wait Twenty Minutes?
Dao
The Unity and Plurality of Chinese Values
Dashboards
Jira Query Power Tools: JQL and Filters
Debugging
Git Bisect — Quickly Locating the Problem Commit with Binary Search
Dependency Management
Build Tools (Part 4): pkg-config — The Key That Solves Dependency Hell
Maven Dependency Management: scope, Transitive Dependencies and Exclusions
Deployment
Cloud-Native Deployment (Part 6): K8s Core Concepts — Pod, Deployment, Service, ConfigMap and Secret
Deployment Evolution
Cloud-Native Deployment (Part 1): The Evolution from Physical Machines to Containers
DevOps
MCP vs. CLI: The Two Paths for Agents to Call Tools, and Who Is Eroding Whom?
Hermes Profile — Multiple Agent Personas, One Set of Tools Does It All
LiteLLM: A Unified LLM Gateway — From API Key Chaos to Enterprise AI Infrastructure
DevOps Methodology Musings (Part 6): The Tasteful Developer Does DevOps — Not Just "Can It Run" but "Does It Look Good"
DevOps Methodology Musings (Part 5): What a DevOps Engineer Needs to Know — An Unconventional Competency Model
DevOps Methodology Musings (Part 4): Toolchain Thinking — What Should Be in Your Arsenal
DevOps Methodology Musings (Part 3): Which Major Suits DevOps — How Your Professional Background Shapes Your Starting Point
DevOps Methodology Musings (Part 2): The DevOps Loop — End-to-End Software Delivery
DevOps Methodology Musings (Part 1): Culture Comes First — Why We Start with Culture
Jira, the Requirements Management Power Tool: An Overview and Core Concepts
Release Engineering (6): JFrog Artifactory — Enterprise-Grade Artifact Management
Release Engineering (Part 1): What Is a Release — The Starting Point of the Artifact's Full Life Cycle
Feedback System Musings (Part 5): Notification Strategy Design — When to Notify Whom
Feedback Systems Miscellany (Part 4): Instant Messaging Notifications — Webhook Connects Everything
Feedback System Musings (Part 3): SMS Notifications — the Ultimate Fallback for Emergencies
Feedback Systems (Part 2): Email Notifications — The Oldest and Most Reliable Channel
Feedback System Musings (Part 1): From "Seeing the Problem" to "Triggering Action"
GitHub Actions — GitHub's Native Automation Workflow
Gitlab CI — the CI/CD Power Tool Built into Gitlab
The Automation Revolution and DevOps
Devin
Local LLM in Practice (Part 4): OpenHands — The Ideal and the Reality of an AI Full-Stack Software Engineer
Distributed Systems
Monitoring Musings (Part 5): Tracing — When One Request Crosses 20 Microservices, How Do You Trace What It Went Through
Docker
Release Engineering (Part 5): Harbor — The Container Image Registry
Cloud-Native Deployment (Part 4): Container Image Registry — Docker Hub and a Self-Hosted Harbor Registry
Cloud-Native Deployment (Part 3): Dockerfile Instructions in Detail and Multi-Stage Builds
Cloud-Native Deployment (Part 2): Docker Basics — Images, Containers and the Principle of Layering
Cloud-Native Deployment (Part 1): The Evolution from Physical Machines to Containers
How to Fix Kubernetes Stuck in the starting State in Docker Desktop on macOS
Jenkins FAQ Collection (Part 1)
Docker Basics
Cloud-Native Deployment (Part 2): Docker Basics — Images, Containers and the Principle of Layering
Docker Best Practices
Cloud-Native Deployment (Part 3): Dockerfile Instructions in Detail and Multi-Stage Builds
Dockerfile
Cloud-Native Deployment (Part 3): Dockerfile Instructions in Detail and Multi-Stage Builds
Dynamic Libraries
Build Tools (Part 3): Static Libraries vs Dynamic Libraries — What Exactly Is the Difference Between .a, .so and .dylib
ELK
Monitoring Musings (Part 2): Log Collection — Your First-Hand Material for Troubleshooting, Yet Often Missing When You Need It Most
Efficiency
Jira Efficiency: A Guide to Common Keyboard Shortcuts
Email
Feedback System Musings (Part 1): From "Seeing the Problem" to "Triggering Action"
Email Notifications
Feedback Systems (Part 2): Email Notifications — The Oldest and Most Reliable Channel
Embedding
Understanding AI (5): Embedding — How AI Understands Semantics
Emma
Java Code Coverage (Part 1): From Emma to JaCoCo, What Coverage Really Is
Engineer Growth
DevOps Methodology Musings (Part 5): What a DevOps Engineer Needs to Know — An Unconventional Competency Model
Engineering Taste
DevOps Methodology Musings (Part 6): The Tasteful Developer Does DevOps — Not Just "Can It Run" but "Does It Look Good"
Enterprise AI
Hermes Memory Provider and Mem0: An Overlooked Memory Abstraction Layer That Lets Agents Share Knowledge
LiteLLM: A Unified LLM Gateway — From API Key Chaos to Enterprise AI Infrastructure
Environment
Gitlab CI Variables and Environments — Bringing Your Pipeline to "Life"
Environment Deployment
GitLab Predefined Variables in Practice (Part 2): The Pipeline "Orchestration Signals" — Trigger Source, Parent-Child Pipelines, Runner and Environment
Environment Setup
How to Set Up a Local Jekyll Environment on macOS
Escaping
The Problem of Escaping Chinese Characters in JavaScript
Exec
Executing External Commands and Scripts with Ant
External Commands
Executing External Commands and Scripts with Ant
FAQ
GitHub Pages FAQ (Part 1) - 404 Not Found after adding categories and tages
Feedback Loop
DevOps Methodology Musings (Part 2): The DevOps Loop — End-to-End Software Delivery
Feedback Systems
Feedback System Musings (Part 5): Notification Strategy Design — When to Notify Whom
Feedback Systems Miscellany (Part 4): Instant Messaging Notifications — Webhook Connects Everything
Feedback System Musings (Part 3): SMS Notifications — the Ultimate Fallback for Emergencies
Feedback Systems (Part 2): Email Notifications — The Oldest and Most Reliable Channel
Feedback System Musings (Part 1): From "Seeing the Problem" to "Triggering Action"
Feishu (Lark)
Feedback Systems Miscellany (Part 4): Instant Messaging Notifications — Webhook Connects Everything
File Operations
Common Ant File Operations — Copy, Move, Delete, Rename
Filebeat
Monitoring Musings (Part 2): Log Collection — Your First-Hand Material for Troubleshooting, Yet Often Missing When You Need It Most
Filters
Jira Query Power Tools: JQL and Filters
FindBugs
Java Static Code Analysis (Part 5): SpotBugs — the Successor to FindBugs
Java Static Code Analysis (Part 4): FindBugs — the Bytecode-Level Bug Hunter
Flannel
Cloud-Native Deployment (Part 7): K8s Network Model — CNI and Service Discovery
Frontend
Learn Vue and Become a Full-Stack Web Developer!
Function Calling
MCP vs. CLI: The Two Paths for Agents to Call Tools, and Who Is Eroding Whom?
The Hands and Feet of an Agent: Tool Capability Boundaries and Their Evolution
GCC
Build Tools (Part 2): The Four Stages of GCC Compilation — What Your .c File Actually Goes Through
Game Build
Game Build: Unreal Builds (Part 4): The Shader Compilation Nightmare — Why Does Every Update Make Players Wait Twenty Minutes?
Game Builds: Unreal Build (Part 3): Pak Files — How Unreal Wraps Its Assets
Game Build: Unreal Builds (Part 2): What Is Cook? Why Does Every Build Have to "Do the Cooking"?
Game Builds: Unreal Build (Part 1): How Does a .uproject Become an .exe?
Game Build: Unity Build (Part 5): IL2CPP and Cross-Platform — How Does "Develop Once, Ship Everywhere" Actually Work?
Game Build: Unity Build (Part 4): Addressables — a "Correct Answer" That Changes Far More
Game Build: Unity Build (Part 3): Scriptable Build Pipeline — Minimum Change, Maximum Cache Gain
Game Build: Unity Build (Part 2): Two Generations of the AssetBundle Interface — From Hand-Written Packaging to Automatic Dependencies, What Happened Along the Way?
Game Builds: Unity Build (Part 1): After You Click Build, How Much Does Unity Do For You?
Game Build Musings (Part 0): From Java to Unity/Unreal, How I Came to Understand the Word "Build" All Over Again
Game Development
Game Build: Unreal Builds (Part 4): The Shader Compilation Nightmare — Why Does Every Update Make Players Wait Twenty Minutes?
Game Builds: Unreal Build (Part 3): Pak Files — How Unreal Wraps Its Assets
Game Build: Unreal Builds (Part 2): What Is Cook? Why Does Every Build Have to "Do the Cooking"?
Game Builds: Unreal Build (Part 1): How Does a .uproject Become an .exe?
Game Build: Unity Build (Part 5): IL2CPP and Cross-Platform — How Does "Develop Once, Ship Everywhere" Actually Work?
Game Build: Unity Build (Part 4): Addressables — a "Correct Answer" That Changes Far More
Game Build: Unity Build (Part 3): Scriptable Build Pipeline — Minimum Change, Maximum Cache Gain
Game Build: Unity Build (Part 2): Two Generations of the AssetBundle Interface — From Hand-Written Packaging to Automatic Dependencies, What Happened Along the Way?
Game Builds: Unity Build (Part 1): After You Click Build, How Much Does Unity Do For You?
Game Build Musings (Part 0): From Java to Unity/Unreal, How I Came to Understand the Word "Build" All Over Again
Game Engines
Game Build: Unreal Builds (Part 4): The Shader Compilation Nightmare — Why Does Every Update Make Players Wait Twenty Minutes?
Game Builds: Unreal Build (Part 3): Pak Files — How Unreal Wraps Its Assets
Game Build: Unreal Builds (Part 2): What Is Cook? Why Does Every Build Have to "Do the Cooking"?
Game Builds: Unreal Build (Part 1): How Does a .uproject Become an .exe?
Game Build: Unity Build (Part 5): IL2CPP and Cross-Platform — How Does "Develop Once, Ship Everywhere" Actually Work?
Game Build: Unity Build (Part 4): Addressables — a "Correct Answer" That Changes Far More
Game Build: Unity Build (Part 3): Scriptable Build Pipeline — Minimum Change, Maximum Cache Gain
Game Build: Unity Build (Part 2): Two Generations of the AssetBundle Interface — From Hand-Written Packaging to Automatic Dependencies, What Happened Along the Way?
Game Builds: Unity Build (Part 1): After You Click Build, How Much Does Unity Do For You?
Game Build Musings (Part 0): From Java to Unity/Unreal, How I Came to Understand the Word "Build" All Over Again
GeForce Experience
GeForce Experience Requires Login and Registration Keeps Failing: How to Bypass or Disable Login
Gemfile
One Article to Sort Out How rake, Rakefile, gem, gemspec, bundler, bundle and Gemfile Relate to Each Other
Git
Git Branching Models (Part 4): Trunk-Based Development
Git Branching Models (Part 3): GitLab Flow
Git Branching Models (Part 2): GitHub Flow
Git Branching Models (Part 1): Git Flow
Git Bisect — Quickly Locating the Problem Commit with Binary Search
Git Rebase — Make Your Commit History More Elegant
Git Stash — Temporarily Shelving Changes in the Working Tree
How to Upload an Empty Folder to Git
Deleting Untracked Files from the Git Working Directory
Writing a Blog with Git and Markdown Is a Great Experience!
Git Bisect
Git Bisect — Quickly Locating the Problem Commit with Binary Search
Git Flow
Git Branching Models (Part 1): Git Flow
Git Rebase
Git Rebase — Make Your Commit History More Elegant
Git Stash
Git Stash — Temporarily Shelving Changes in the Working Tree
GitHub
How to Fix GitHub Access Problems Without a VPN
GitHub Actions
Automated Deployment with GitHub Actions — from push to live
GitHub Actions FAQ Collection (Part 1)
GitHub Actions — GitHub's Native Automation Workflow
GitHub Flow
Git Branching Models (Part 2): GitHub Flow
GitHub Pages
New Year, New Look — The Site Has a New Theme!
GitHub Pages FAQ (Part 1) - 404 Not Found after adding categories and tages
How to Build a Personal Blog with GitHub Pages
GitLab CI
GitLab Predefined Variables in Practice (Part 2): The Pipeline "Orchestration Signals" — Trigger Source, Parent-Child Pipelines, Runner and Environment
GitLab Predefined Variables in Practice (Part 1): The Pipeline's "Identity" — Branch, Tag, Commit, and MR
GitLab Flow
Git Branching Models (Part 3): GitLab Flow
Gitlab CI
Gitlab CI Variables and Environments — Bringing Your Pipeline to "Life"
GitLab CI FAQ Collection (Part 1)
Gitlab CI — the CI/CD Power Tool Built into Gitlab
Gradle
Gradle Incremental Builds and Build Cache Optimization
Gradle Custom Plugins — Comparing Three Approaches
Gradle Wrapper: A Unified Build Environment for the Team
Building a Gradle Multi-Module Project
Gradle Tasks in Detail: Custom Tasks and Task Dependencies
An Introduction to the Files Involved in a gradle Build
Disabling the Gradle Daemon
Grafana
Monitoring Musings (Part 3): Metrics Monitoring — Numbers Don't Lie, but Your Dashboard Does
Groovy
Ant Custom Tasks — Writing Inline Scripts in Groovy/JavaScript
Groovy Syntax Tutorial Series: Collections (6) [Final]
Groovy Syntax Tutorial Series: Booleans (Part 5)
Groovy Syntax Tutorial Series: Numbers (Part 4)
Groovy Syntax Tutorial Series: Strings (Part 3)
Groovy Syntax Tutorial Series: Keywords and Identifiers (Part 2)
Groovy Syntax Tutorial Series: Comments (Part 1)
Jenkins FAQ Collection (Part 2)
HTML5
How to Build a Personal Blog with GitHub Pages
HTTP
Blog Adds a New Page: "Reference Books"
Harbor
Release Engineering (Part 7): Tool Comparison and Artifact Cleanup Strategies
Release Engineering (Part 5): Harbor — The Container Image Registry
Cloud-Native Deployment (Part 4): Container Image Registry — Docker Hub and a Self-Hosted Harbor Registry
Health Checks
Cloud-Native Deployment (Part 10): Health Checks and Zero-Downtime Deployment
Helm
Cloud-Native Deployment (Part 9): K8s Package Management — Helm from Getting Started to Real-World Practice
Hermes
An Agent's "Code of Conduct" — the Essence of Skill and the Common Misconceptions
Hermes Memory Provider and Mem0: An Overlooked Memory Abstraction Layer That Lets Agents Share Knowledge
Hermes Profile — Multiple Agent Personas, One Set of Tools Does It All
Local LLM in Practice (Part 6): Hermes Agent — a Self-Evolving AI Agent with Memory and Learning
Humanities
Life Has No Meaning to Begin With
Hypertext Transfer Protocol
Blog Adds a New Page: "Reference Books"
IL2CPP
Game Build: Unity Build (Part 5): IL2CPP and Cross-Platform — How Does "Develop Once, Ship Everywhere" Actually Work?
Image Registry
Release Engineering (Part 5): Harbor — The Container Image Registry
Cloud-Native Deployment (Part 4): Container Image Registry — Docker Hub and a Self-Hosted Harbor Registry
Image Slimming
Cloud-Native Deployment (Part 3): Dockerfile Instructions in Detail and Multi-Stage Builds
Images
Cloud-Native Deployment (Part 2): Docker Basics — Images, Containers and the Principle of Layering
Infrastructure
LiteLLM: A Unified LLM Gateway — From API Key Chaos to Enterprise AI Infrastructure
Innocence
The Spear and Shield of Innocence
Instant Messaging
Feedback Systems Miscellany (Part 4): Instant Messaging Notifications — Webhook Connects Everything
Feedback System Musings (Part 1): From "Seeing the Problem" to "Triggering Action"
Intranet Deployment
Local LLM in Practice (Part 3): Cline — the Open-Source Coding Agent in VS Code
Local LLM in Practice (Part 2): OpenCode — The Open-Source AI Coding Assistant in Your Terminal
Local LLMs in Practice (Part 1): Building Your AI Infrastructure on the Intranet
Issue
Jira Issue Management and Workflow Design
JFrog
Release Engineering (6): JFrog Artifactory — Enterprise-Grade Artifact Management
JQL
Jira Query Power Tools: JQL and Filters
JUnit
Java Unit Testing (Part 1): What Is a Unit Test and Why Write One
JUnit 5
Java Unit Testing (Part 2): Getting Hands-On with JUnit 5
JUnit Jupiter
Java Unit Testing (Part 2): Getting Hands-On with JUnit 5
JaCoCo
Java Code Coverage (Part 2): JaCoCo in Practice, from Getting It Running to Reading the Report
Java Code Coverage (Part 1): From Emma to JaCoCo, What Coverage Really Is
Jaeger
Monitoring Musings (Part 5): Tracing — When One Request Crosses 20 Microservices, How Do You Trace What It Went Through
Java
Release Engineering (Part 4): Nexus — Java Private Repository and General-Purpose Artifact Repository
Invalid cookie header Invalid 'expires' attribute
Java Code Coverage (Part 2): JaCoCo in Practice, from Getting It Running to Reading the Report
Java Code Coverage (Part 1): From Emma to JaCoCo, What Coverage Really Is
Java Unit Testing (Part 3): Isolating External Dependencies with Mockito
Java Unit Testing (Part 2): Getting Hands-On with JUnit 5
Java Unit Testing (Part 1): What Is a Unit Test and Why Write One
Java Static Code Analysis (6): Building a Continuous Code Quality Platform with SonarQube
Java Static Code Analysis (Part 5): SpotBugs — the Successor to FindBugs
Java Static Code Analysis (Part 4): FindBugs — the Bytecode-Level Bug Hunter
Java Static Code Analysis (Part 3): Finding Bad Practices with PMD
Java Static Code Analysis (Part 2): Enforcing Code Style with Checkstyle
Java Static Code Analysis (Part 1): What Is Static Analysis
JavaScript
Ant Custom Tasks — Writing Inline Scripts in Groovy/JavaScript
The Problem of Escaping Chinese Characters in JavaScript
Jekyll
Octicons, an Open-Source and Extensible Icon Set
New Year, New Look — The Site Has a New Theme!
How to Set Up a Local Jekyll Environment on macOS
Writing a Blog with Git and Markdown Is a Great Experience!
GitHub Pages FAQ (Part 1) - 404 Not Found after adding categories and tages
How to Build a Personal Blog with GitHub Pages
Jelly
Jenkins Architecture
Jenkins
DevOps Methodology Musings (Part 4): Toolchain Thinking — What Should Be in Your Arsenal
Feedback Systems (Part 2): Email Notifications — The Oldest and Most Reliable Channel
Jenkins FAQ Collection (Part 8)
Jenkinsclient 1.0 Released: A Powerful, Open-Source, Cross-Platform Jenkins Command-Line Client, Licensed Under the Domestic Mulan Open Source License
Jenkins Plugin Update Center Address Changer: One-Click Switch to a Domestic Mirror
Jenkins Architecture
I Obtained the Certified Jenkins Engineer Certification and Certificate
Jenkins FAQ Collection (Part 7)
Jenkins——the thing which auto everything
Jenkins FAQ Collection (Part 4)
Jenkins FAQ Collection (Part 3)
Jenkins FAQ Collection (Part 2)
Jenkins FAQ Collection (Part 1)
Jenkins Plugins
Jenkins Architecture
Jenkinsclient
Jenkinsclient Tutorial Series: Viewing Basic Information (Part 2)
Jenkinsclient Tutorial Series: Introduction and Installation (Part 1)
Jenkinsclient 1.0 Released: A Powerful, Open-Source, Cross-Platform Jenkins Command-Line Client, Licensed Under the Domestic Mulan Open Source License
Jira
Jira Efficiency: A Guide to Common Keyboard Shortcuts
Jira Query Power Tools: JQL and Filters
Jira Scrum Agile Boards in Practice
Jira Issue Management and Workflow Design
Jira, the Requirements Management Power Tool: An Overview and Core Concepts
K8s
Release Engineering (Part 5): Harbor — The Container Image Registry
K8s Architecture
Cloud-Native Deployment (Part 5): Kubernetes Architecture Core — Master, Node and etcd
K8s Core Concepts
Cloud-Native Deployment (Part 6): K8s Core Concepts — Pod, Deployment, Service, ConfigMap and Secret
K8s Deployment
Cloud-Native Deployment (Part 9): K8s Package Management — Helm from Getting Started to Real-World Practice
K8s Networking
Cloud-Native Deployment (Part 7): K8s Network Model — CNI and Service Discovery
K8s Storage
Cloud-Native Deployment (Part 8): K8s Storage — Volume, PV, PVC and StorageClass
Kanban
Jira Scrum Agile Boards in Practice
Knowledge Sharing
Hermes Memory Provider and Mem0: An Overlooked Memory Abstraction Layer That Lets Agents Share Knowledge
Kubernetes
Cloud-Native Deployment (Part 10): Health Checks and Zero-Downtime Deployment
Cloud-Native Deployment (Part 9): K8s Package Management — Helm from Getting Started to Real-World Practice
Cloud-Native Deployment (Part 8): K8s Storage — Volume, PV, PVC and StorageClass
Cloud-Native Deployment (Part 7): K8s Network Model — CNI and Service Discovery
Cloud-Native Deployment (Part 6): K8s Core Concepts — Pod, Deployment, Service, ConfigMap and Secret
Cloud-Native Deployment (Part 5): Kubernetes Architecture Core — Master, Node and etcd
Cloud-Native Deployment (Part 1): The Evolution from Physical Machines to Containers
How to Fix Kubernetes Stuck in the starting State in Docker Desktop on macOS
LLM
Understanding AI (5): Embedding — How AI Understands Semantics
Understanding AI (Part 4): Temperature and Top-P — the AI Creativity Knob
Understanding AI (Part 3): Context Windows — How Short-Term Memory Works in AI
Understanding AI (Part 2): What Is a Token? — How AI Reads and How Tokenisation Works
Understanding AI (Part 1): What Is AI Actually Learning? — From Probability to Language Models
LSP
Local LLM in Practice (Part 2): OpenCode — The Open-Source AI Coding Assistant in Your Terminal
Large Language Models
Vibe Coding (Part 1): You're Not Writing Code, You're Describing Requirements
Understanding AI (5): Embedding — How AI Understands Semantics
Understanding AI (Part 4): Temperature and Top-P — the AI Creativity Knob
Understanding AI (Part 3): Context Windows — How Short-Term Memory Works in AI
Understanding AI (Part 2): What Is a Token? — How AI Reads and How Tokenisation Works
Understanding AI (Part 1): What Is AI Actually Learning? — From Probability to Language Models
Latest Version
Using the Latest Version of a Dependency in Gradle
Layered Filesystem
Cloud-Native Deployment (Part 2): Docker Basics — Images, Containers and the Principle of Layering
Lean
DevOps Methodology Musings (Part 1): Culture Comes First — Why We Start with Culture
Legalism
The Unity and Plurality of Chinese Values
Life Cycle
Maven Lifecycle and Common Commands Quick Reference
Linking
Build Tools (Part 3): Static Libraries vs Dynamic Libraries — What Exactly Is the Difference Between .a, .so and .dylib
Linux
Build Tools (11): Build System Panorama — How to Choose from make to Bazel
Build Tools (10): Getting Started with Bazel — A Build System at Google's Level
Build Tools (Part 9): Ninja — The Flash of the Build World
Build Tools (Part 8): Cross-Compilation — Compiling ARM Programs on Your x86 Computer
Build Tools (Part 7): Organizing CMake in a Multi-Directory Project — Managing Code Like Building Blocks
Build Tools (Part 6): The Way of Modern CMake — target_* and Interface Propagation
Build Tools (Part 5): Getting Started with CMake — Why Your Project Needs a CMakeLists.txt
Build Tools (Part 4): pkg-config — The Key That Solves Dependency Hell
Build Tools (Part 3): Static Libraries vs Dynamic Libraries — What Exactly Is the Difference Between .a, .so and .dylib
Build Tools (Part 2): The Four Stages of GCC Compilation — What Your .c File Actually Goes Through
Build Tools (Part 1): From Typing gcc by Hand to the Makefile — The First Evolution of Build Tools
LiteLLM
LiteLLM: A Unified LLM Gateway — From API Key Chaos to Enterprise AI Infrastructure
Liveness
Cloud-Native Deployment (Part 10): Health Checks and Zero-Downtime Deployment
Local Execution
Local LLMs in Practice (Part 5): OpenClaw — A Local Agent Gateway That Gives LLMs "Digital Hands and Feet"
Local LLMs
Local LLMs in Practice (Part 1): Building Your AI Infrastructure on the Intranet
Log Collection
Monitoring Musings (Part 2): Log Collection — Your First-Hand Material for Troubleshooting, Yet Often Missing When You Need It Most
Logging
Monitoring Musings (Part 2): Log Collection — Your First-Hand Material for Troubleshooting, Yet Often Missing When You Need It Most
Monitoring Musings (Part 1): Monitoring Is Nothing Fancy — It's Just the System's “Health Check Report”
Loki
Monitoring Musings (Part 2): Log Collection — Your First-Hand Material for Troubleshooting, Yet Often Missing When You Need It Most
Luo Yonghao
Luo Yonghao: The Typical Case of "Lower Virtue Not Losing Virtue, Therefore Having No Virtue"
MCP
MCP vs. CLI: The Two Paths for Agents to Call Tools, and Who Is Eroding Whom?
The Hands and Feet of an Agent: Tool Capability Boundaries and Their Evolution
Local LLM in Practice (Part 3): Cline — the Open-Source Coding Agent in VS Code
Mac
Quickly Extract the Audio from a Video on Mac
Make
Build Tools (11): Build System Panorama — How to Choose from make to Bazel
Makefile
Build Tools (Part 1): From Typing gcc by Hand to the Makefile — The First Evolution of Build Tools
MariaDB
Installing MariaDB on CentOS 7
Markdown
Writing a Blog with Git and Markdown Is a Great Experience!
How to Build a Personal Blog with GitHub Pages
Master
Cloud-Native Deployment (Part 5): Kubernetes Architecture Core — Master, Node and etcd
Maven
Release Engineering (Part 4): Nexus — Java Private Repository and General-Purpose Artifact Repository
Release Engineering (Part 2): Version Number Conventions — SemVer and CalVer
Maven Repository Configuration: settings.xml in Detail
Maven Profiles — Different Configurations for Different Environments
A Look at Common Maven Plugins — compiler, surefire, jar, assembly
Maven Dependency Management: scope, Transitive Dependencies and Exclusions
Maven Lifecycle and Common Commands Quick Reference
Java Code Coverage (Part 2): JaCoCo in Practice, from Getting It Running to Reading the Report
Mem0
Hermes Memory Provider and Mem0: An Overlooked Memory Abstraction Layer That Lets Agents Share Knowledge
Memory Provider
Hermes Memory Provider and Mem0: An Overlooked Memory Abstraction Layer That Lets Agents Share Knowledge
Memory Systems
Hermes Memory Provider and Mem0: An Overlooked Memory Abstraction Layer That Lets Agents Share Knowledge
Local LLM in Practice (Part 6): Hermes Agent — a Self-Evolving AI Agent with Memory and Learning
Merge
SVN Conflict Resolution in Detail — Say Goodbye to Merge Phobia
SVN Branching and Merging — The Right Way to Develop on the Trunk
Local LLMs in Practice (Part 5): OpenClaw — A Local Agent Gateway That Gives LLMs "Digital Hands and Feet"
Metrics
Monitoring Musings (Part 3): Metrics Monitoring — Numbers Don't Lie, but Your Dashboard Does
Monitoring Musings (Part 1): Monitoring Is Nothing Fancy — It's Just the System's “Health Check Report”
Metrics Monitoring
Monitoring Musings (Part 3): Metrics Monitoring — Numbers Don't Lie, but Your Dashboard Does
Mid-Autumn Festival
Thoughts on Seeing the Moon at Mid-Autumn
Mock
Java Unit Testing (Part 3): Isolating External Dependencies with Mockito
Mockito
Java Unit Testing (Part 3): Isolating External Dependencies with Mockito
Modern CMake
Build Tools (Part 6): The Way of Modern CMake — target_* and Interface Propagation
Mohism
The Unity and Plurality of Chinese Values
Monitoring
Monitoring Musings (Part 4): Alert Design — Why Your Alerts Make People "Numb"
Monitoring Musings (Part 1): Monitoring Is Nothing Fancy — It's Just the System's “Health Check Report”
DevOps Methodology Musings (Part 4): Toolchain Thinking — What Should Be in Your Arsenal
Mono
Game Build: Unity Build (Part 5): IL2CPP and Cross-Platform — How Does "Develop Once, Ship Everywhere" Actually Work?
Multi-Agent
Hermes Profile — Multiple Agent Personas, One Set of Tools Does It All
Multi-Environment
Maven Profiles — Different Configurations for Different Environments
Multi-Model Routing
LiteLLM: A Unified LLM Gateway — From API Key Chaos to Enterprise AI Infrastructure
Multi-Module
Building a Gradle Multi-Module Project
Multi-Stage Builds
Cloud-Native Deployment (Part 3): Dockerfile Instructions in Detail and Multi-Stage Builds
Networking
How to Fix GitHub Access Problems Without a VPN
New Pages
Blog Adds a New Page: "Reference Books"
Nexus
Release Engineering (Part 7): Tool Comparison and Artifact Cleanup Strategies
Release Engineering (Part 4): Nexus — Java Private Repository and General-Purpose Artifact Repository
Nginx
Configuring nginx to automatically redirect http to https
Installing Nginx on CentOS 7
Ninja
Build Tools (11): Build System Panorama — How to Choose from make to Bazel
Build Tools (Part 9): Ninja — The Flash of the Build World
Node
Cloud-Native Deployment (Part 5): Kubernetes Architecture Core — Master, Node and etcd
Node.js
Is Node.js a Programming Language?
Notification Strategy
Feedback System Musings (Part 5): Notification Strategy Design — When to Notify Whom
Notifications
Feedback System Musings (Part 1): From "Seeing the Problem" to "Triggering Action"
Observability
Monitoring Musings (Part 5): Tracing — When One Request Crosses 20 Microservices, How Do You Trace What It Went Through
Monitoring Musings (Part 3): Metrics Monitoring — Numbers Don't Lie, but Your Dashboard Does
Monitoring Musings (Part 2): Log Collection — Your First-Hand Material for Troubleshooting, Yet Often Missing When You Need It Most
Monitoring Musings (Part 1): Monitoring Is Nothing Fancy — It's Just the System's “Health Check Report”
Octicons
Octicons, an Open-Source and Extensible Icon Set
Ollama
Local LLMs in Practice (Part 1): Building Your AI Infrastructure on the Intranet
On-Call
Monitoring Musings (Part 4): Alert Design — Why Your Alerts Make People "Numb"
Feedback System Musings (Part 5): Notification Strategy Design — When to Notify Whom
Feedback System Musings (Part 3): SMS Notifications — the Ultimate Fallback for Emergencies
Open Source
Local LLM in Practice (Part 6): Hermes Agent — a Self-Evolving AI Agent with Memory and Learning
Local LLMs in Practice (Part 5): OpenClaw — A Local Agent Gateway That Gives LLMs "Digital Hands and Feet"
Open WebUI
Local LLMs in Practice (Part 1): Building Your AI Infrastructure on the Intranet
Open-Source Alternatives
Local LLM in Practice (Part 4): OpenHands — The Ideal and the Reality of an AI Full-Stack Software Engineer
Local LLM in Practice (Part 3): Cline — the Open-Source Coding Agent in VS Code
Local LLM in Practice (Part 2): OpenCode — The Open-Source AI Coding Assistant in Your Terminal
OpenClaw
Local LLMs in Practice (Part 5): OpenClaw — A Local Agent Gateway That Gives LLMs "Digital Hands and Feet"
OpenCode
Local LLM in Practice (Part 2): OpenCode — The Open-Source AI Coding Assistant in Your Terminal
OpenHands
Local LLM in Practice (Part 4): OpenHands — The Ideal and the Reality of an AI Full-Stack Software Engineer
OpenTelemetry
Monitoring Musings (Part 5): Tracing — When One Request Crosses 20 Microservices, How Do You Trace What It Went Through
Operations
Monitoring Musings (Part 1): Monitoring Is Nothing Fancy — It's Just the System's “Health Check Report”
PHP
Installing PHP on CentOS 7
PMD
Java Static Code Analysis (Part 3): Finding Bad Practices with PMD
PSO
Game Build: Unreal Builds (Part 4): The Shader Compilation Nightmare — Why Does Every Update Make Players Wait Twenty Minutes?
PV
Cloud-Native Deployment (Part 8): K8s Storage — Volume, PV, PVC and StorageClass
PVC
Cloud-Native Deployment (Part 8): K8s Storage — Volume, PV, PVC and StorageClass
Package Management
Cloud-Native Deployment (Part 9): K8s Package Management — Helm from Getting Started to Real-World Practice
Pak
Game Builds: Unreal Build (Part 3): Pak Files — How Unreal Wraps Its Assets
Parent-Child Pipelines
GitLab Predefined Variables in Practice (Part 2): The Pipeline "Orchestration Signals" — Trigger Source, Parent-Child Pipelines, Runner and Environment
Gradle Incremental Builds and Build Cache Optimization
Persistent Storage
Cloud-Native Deployment (Part 8): K8s Storage — Volume, PV, PVC and StorageClass
Pipeline
Jenkins FAQ Collection (Part 8)
Jenkins FAQ Collection (Part 7)
Jenkins FAQ Collection (Part 4)
Jenkins FAQ Collection (Part 3)
Jenkins FAQ Collection (Part 2)
Jenkins FAQ Collection (Part 1)
Pipelines
GitLab Predefined Variables in Practice (Part 1): The Pipeline's "Identity" — Branch, Tag, Commit, and MR
Plugin
Gradle Custom Plugins — Comparing Three Approaches
Plugin Center
Jenkins Plugin Update Center Address Changer: One-Click Switch to a Domestic Mirror
Plugins
Gradle Custom Plugins — Comparing Three Approaches
A Look at Common Maven Plugins — compiler, surefire, jar, assembly
Pod
Cloud-Native Deployment (Part 6): K8s Core Concepts — Pod, Deployment, Service, ConfigMap and Secret
Poetry
The Tale of Nezha — Thoughts on Watching "Ne Zha: Birth of the Demon Child"
Heart and Object
Thoughts on Seeing the Moon at Mid-Autumn
Predefined Variables
GitLab Predefined Variables in Practice (Part 2): The Pipeline "Orchestration Signals" — Trigger Source, Parent-Child Pipelines, Runner and Environment
GitLab Predefined Variables in Practice (Part 1): The Pipeline's "Identity" — Branch, Tag, Commit, and MR
Private Registry
Cloud-Native Deployment (Part 4): Container Image Registry — Docker Hub and a Self-Hosted Harbor Registry
Private Repository
Release Engineering (Part 4): Nexus — Java Private Repository and General-Purpose Artifact Repository
Probe
Cloud-Native Deployment (Part 10): Health Checks and Zero-Downtime Deployment
Problem Solving
Starting from a Small Problem: A Word on the Mindset of Problem Solving
Process Design
An Agent's "Code of Conduct" — the Essence of Skill and the Common Misconceptions
Product Thinking
DevOps Methodology Musings (Part 6): The Tasteful Developer Does DevOps — Not Just "Can It Run" but "Does It Look Good"
Professional Background
DevOps Methodology Musings (Part 3): Which Major Suits DevOps — How Your Professional Background Shapes Your Starting Point
Profile
Maven Profiles — Different Configurations for Different Environments
Project Structure
Build Tools (Part 7): Organizing CMake in a Multi-Directory Project — Managing Code Like Building Blocks
Prometheus
Monitoring Musings (Part 3): Metrics Monitoring — Numbers Don't Lie, but Your Dashboard Does
Prompt
Vibe Coding (Part 2): Treating the AI as a New Intern
Property
Loading and Using Property Files in Ant
PyExecJS
Running JavaScript Code from Python
PyPI
How to Host a Python Package on PyPI
Python
Decompiling Python-compiled pyc files back into py files
Jenkinsclient 1.0 Released: A Powerful, Open-Source, Cross-Platform Jenkins Command-Line Client, Licensed Under the Domestic Mulan Open Source License
How to Host a Python Package on PyPI
Jenkins FAQ Collection (Part 2)
RFC2616
Blog Adds a New Page: "Reference Books"
Rakefile
One Article to Sort Out How rake, Rakefile, gem, gemspec, bundler, bundle and Gemfile Relate to Each Other
React
Jenkins Architecture
Readiness
Cloud-Native Deployment (Part 10): Health Checks and Zero-Downtime Deployment
Reference Books
Blog Adds a New Page: "Reference Books"
Registry
Cloud-Native Deployment (Part 4): Container Image Registry — Docker Hub and a Self-Hosted Harbor Registry
Release Engineering
Release Engineering (Part 3): Changelog and Release Notes — Making Every Version Traceable
Release Engineering (Part 1): What Is a Release — The Starting Point of the Artifact's Full Life Cycle
Release Notes
Release Engineering (Part 3): Changelog and Release Notes — Making Every Version Traceable
Repositories
Maven Repository Configuration: settings.xml in Detail
Requirements Management
DevOps Methodology Musings (Part 4): Toolchain Thinking — What Should Be in Your Arsenal
Jira Efficiency: A Guide to Common Keyboard Shortcuts
Jira Issue Management and Workflow Design
Jira, the Requirements Management Power Tool: An Overview and Core Concepts
Reverting
SVN Reverting and Undo — What to Do When Something Goes Wrong
Role Personas
Hermes Profile — Multiple Agent Personas, One Set of Tools Does It All
Rolling Updates
Cloud-Native Deployment (Part 10): Health Checks and Zero-Downtime Deployment
Ruby
One Article to Sort Out How rake, Rakefile, gem, gemspec, bundler, bundle and Gemfile Relate to Each Other
Runtime
.Net Runtime Types
SBP
Game Build: Unity Build (Part 4): Addressables — a "Correct Answer" That Changes Far More
Game Build: Unity Build (Part 3): Scriptable Build Pipeline — Minimum Change, Maximum Cache Gain
SMS
Feedback System Musings (Part 1): From "Seeing the Problem" to "Triggering Action"
SMS Channel
Feedback System Musings (Part 3): SMS Notifications — the Ultimate Fallback for Emergencies
SMS Notifications
Feedback System Musings (Part 3): SMS Notifications — the Ultimate Fallback for Emergencies
SMTP
Feedback Systems (Part 2): Email Notifications — The Oldest and Most Reliable Channel
SRE
Monitoring Musings (Part 4): Alert Design — Why Your Alerts Make People "Numb"
SVN
SVN Reverting and Undo — What to Do When Something Goes Wrong
SVN Conflict Resolution in Detail — Say Goodbye to Merge Phobia
SVN Branching and Merging — The Right Way to Develop on the Trunk
How to Configure svn:ignore to Ignore Multiple Files/Folders
Getting the current revision of a local SVN repository
How do I ignore files in certain SVN directories so they stay unchanged?
Using a Windows batch script to get the list of changed SVN files
SWE-bench
Local LLM in Practice (Part 4): OpenHands — The Ideal and the Reality of an AI Full-Stack Software Engineer
Sampling
Understanding AI (Part 4): Temperature and Top-P — the AI Creativity Knob
Scriptable Build Pipeline
Game Build: Unity Build (Part 3): Scriptable Build Pipeline — Minimum Change, Maximum Cache Gain
Scripts
Ant Custom Tasks — Writing Inline Scripts in Groovy/JavaScript
Scrum
Jira Scrum Agile Boards in Practice
Secret
Cloud-Native Deployment (Part 6): K8s Core Concepts — Pod, Deployment, Service, ConfigMap and Secret
Self-Learning
Local LLM in Practice (Part 6): Hermes Agent — a Self-Evolving AI Agent with Memory and Learning
SemVer
Release Engineering (Part 2): Version Number Conventions — SemVer and CalVer
Semantic Space
Understanding AI (5): Embedding — How AI Understands Semantics
SendGrid
Feedback Systems (Part 2): Email Notifications — The Oldest and Most Reliable Channel
Service
Cloud-Native Deployment (Part 6): K8s Core Concepts — Pod, Deployment, Service, ConfigMap and Secret
Shader
Game Build: Unreal Builds (Part 4): The Shader Compilation Nightmare — Why Does Every Update Make Players Wait Twenty Minutes?
Shift-Left Testing
Java Unit Testing (Part 1): What Is a Unit Test and Why Write One
Shortcuts
Jira Efficiency: A Guide to Common Keyboard Shortcuts
Skill
An Agent's "Code of Conduct" — the Essence of Skill and the Common Misconceptions
Skill Creation
Local LLM in Practice (Part 6): Hermes Agent — a Self-Evolving AI Agent with Memory and Learning
Skill Tree
DevOps Methodology Musings (Part 5): What a DevOps Engineer Needs to Know — An Unconventional Competency Model
Software Engineering
DevOps Methodology Musings (Part 3): Which Major Suits DevOps — How Your Professional Background Shapes Your Starting Point
Software Life Cycle
DevOps Methodology Musings (Part 2): The DevOps Loop — End-to-End Software Delivery
Release Engineering (Part 1): What Is a Release — The Starting Point of the Artifact's Full Life Cycle
SonarQube
A Process Started by Jenkins Always Exits after the Build? Use the keepRunning Step for an Elegant Fix
Java Static Code Analysis (6): Building a Continuous Code Quality Platform with SonarQube
SpotBugs
Java Static Code Analysis (Part 5): SpotBugs — the Successor to FindBugs
Stability
The Spear and Shield of Innocence
Stapler
Jenkins Architecture
Startup
Adding a Startup Item on Windows via the Registry
Static Analysis
Java Static Code Analysis (6): Building a Continuous Code Quality Platform with SonarQube
Java Static Code Analysis (Part 5): SpotBugs — the Successor to FindBugs
Java Static Code Analysis (Part 4): FindBugs — the Bytecode-Level Bug Hunter
Java Static Code Analysis (Part 3): Finding Bad Practices with PMD
Java Static Code Analysis (Part 2): Enforcing Code Style with Checkstyle
Java Static Code Analysis (Part 1): What Is Static Analysis
Static Libraries
Build Tools (Part 3): Static Libraries vs Dynamic Libraries — What Exactly Is the Difference Between .a, .so and .dylib
StorageClass
Cloud-Native Deployment (Part 8): K8s Storage — Volume, PV, PVC and StorageClass
TBD
Git Branching Models (Part 4): Trunk-Based Development
Tag Cloud
New Year, New Look — The Site Has a New Theme!
Tao Te Ching
Luo Yonghao: The Typical Case of "Lower Virtue Not Losing Virtue, Therefore Having No Virtue"
Task
Gradle Tasks in Detail: Custom Tasks and Task Dependencies
Team Culture
DevOps Methodology Musings (Part 1): Culture Comes First — Why We Start with Culture
Temperature
Understanding AI (Part 4): Temperature and Top-P — the AI Creativity Knob
Template-Based Deployment
Cloud-Native Deployment (Part 9): K8s Package Management — Helm from Getting Started to Real-World Practice
Testing
Java Unit Testing (Part 3): Isolating External Dependencies with Mockito
The Way of Things
Starting from a Small Problem: A Word on the Mindset of Problem Solving
Theme
New Year, New Look — The Site Has a New Theme!
Time Series
Monitoring Musings (Part 3): Metrics Monitoring — Numbers Don't Lie, but Your Dashboard Does
Timeline
New Year, New Look — The Site Has a New Theme!
Token
Understanding AI (Part 2): What Is a Token? — How AI Reads and How Tokenisation Works
Token Optimization
MCP vs. CLI: The Two Paths for Agents to Call Tools, and Who Is Eroding Whom?
Tokenization
Understanding AI (Part 2): What Is a Token? — How AI Reads and How Tokenisation Works
MCP vs. CLI: The Two Paths for Agents to Call Tools, and Who Is Eroding Whom?
The Hands and Feet of an Agent: Tool Capability Boundaries and Their Evolution
Release Engineering (Part 7): Tool Comparison and Artifact Cleanup Strategies
DevOps Methodology Musings (Part 4): Toolchain Thinking — What Should Be in Your Arsenal
Top-P
Understanding AI (Part 4): Temperature and Top-P — the AI Creativity Knob
Tracing
Monitoring Musings (Part 5): Tracing — When One Request Crosses 20 Microservices, How Do You Trace What It Went Through
Monitoring Musings (Part 1): Monitoring Is Nothing Fancy — It's Just the System's “Health Check Report”
Troubleshooting
GitHub Actions FAQ Collection (Part 1)
GitLab CI FAQ Collection (Part 1)
Trunk-Based Development
Git Branching Models (Part 4): Trunk-Based Development
UAT
Game Builds: Unreal Build (Part 1): How Does a .uproject Become an .exe?
UBT
Game Builds: Unreal Build (Part 1): How Does a .uproject Become an .exe?
UE4
Compiling Unreal Engine from Source (UE4/UE5)
UE5
Compiling Unreal Engine from Source (UE4/UE5)
Undo
SVN Reverting and Undo — What to Do When Something Goes Wrong
UnionFS
Cloud-Native Deployment (Part 2): Docker Basics — Images, Containers and the Principle of Layering
Unit Testing
Java Unit Testing (Part 3): Isolating External Dependencies with Mockito
Java Unit Testing (Part 2): Getting Hands-On with JUnit 5
Java Unit Testing (Part 1): What Is a Unit Test and Why Write One
Unity
Unpacking AssetBundles — Extracting Unity Assets with AssetStudio
Game Build: Unity Build (Part 5): IL2CPP and Cross-Platform — How Does "Develop Once, Ship Everywhere" Actually Work?
Game Build: Unity Build (Part 4): Addressables — a "Correct Answer" That Changes Far More
Game Build: Unity Build (Part 3): Scriptable Build Pipeline — Minimum Change, Maximum Cache Gain
Game Build: Unity Build (Part 2): Two Generations of the AssetBundle Interface — From Hand-Written Packaging to Automatic Dependencies, What Happened Along the Way?
Game Builds: Unity Build (Part 1): After You Click Build, How Much Does Unity Do For You?
Game Build Musings (Part 0): From Java to Unity/Unreal, How I Came to Understand the Word "Build" All Over Again
Direct Download Links for the International Version of UnityHub
Installing UI Toolkit in Unity
The Typical Workflow for Using Assets in Unity
Setting Up 3D Audio in Unity
Building Unity ABs While Keeping the Hash Unchanged
What Does the BuildAssetBundleOption.DisableWriteTypeTree Option Do, and Should You Turn It On?
Debugging Unity Code in Visual Studio
Unity Android build error: Android SDK does not include your Target SDK of 28 — cause and fix
Unreal
Game Build: Unreal Builds (Part 4): The Shader Compilation Nightmare — Why Does Every Update Make Players Wait Twenty Minutes?
Game Builds: Unreal Build (Part 3): Pak Files — How Unreal Wraps Its Assets
Game Build: Unreal Builds (Part 2): What Is Cook? Why Does Every Build Have to "Do the Cooking"?
Game Builds: Unreal Build (Part 1): How Does a .uproject Become an .exe?
Game Build Musings (Part 0): From Java to Unity/Unreal, How I Came to Understand the Word "Build" All Over Again
VSCode
Local LLM in Practice (Part 3): Cline — the Open-Source Coding Agent in VS Code
Variables
Gitlab CI Variables and Environments — Bringing Your Pipeline to "Life"
Vectors
Understanding AI (5): Embedding — How AI Understands Semantics
Versioning
Release Engineering (Part 3): Changelog and Release Notes — Making Every Version Traceable
Release Engineering (Part 2): Version Number Conventions — SemVer and CalVer
Vibe Coding
Vibe Coding (Part 4): How to Make AI Truly Understand Your Project
Vibe Coding (Part 3): AI-Generated Code — Doubt First, Trust Later
Vibe Coding (Part 2): Treating the AI as a New Intern
Vibe Coding (Part 1): You're Not Writing Code, You're Describing Requirements
Visual Studio
The Shared Path Cannot Be Modified During Visual Studio Installation
Visual Studio SVN Plugin
How to Fix Method Navigation in Unity Project Scripts Opened in Visual Stuido
Volume
Cloud-Native Deployment (Part 8): K8s Storage — Volume, PV, PVC and StorageClass
Vue
Learn Vue and Become a Full-Stack Web Developer!
WSL2
Installing a Linux Distribution in Windows 10 WSL2 Fails with Error 0x800701bc
WeChat Bot
Python WeChat bot
WeCom
Feedback Systems Miscellany (Part 4): Instant Messaging Notifications — Webhook Connects Everything
Web Development
Learn Vue and Become a Full-Stack Web Developer!
Webhook
Feedback Systems Miscellany (Part 4): Instant Messaging Notifications — Webhook Connects Everything
Windows
Viewing the system boot time in Windows
Enabling Anonymous Access for Windows File Sharing
Enabling Long Path Support on Windows 10
Fix for the Windows administrator User Not Having Administrator Rights
Workflows
Jira Issue Management and Workflow Design
Wrapper
Gradle Wrapper: A Unified Build Environment for the Team
XStream
Jenkins Architecture
YAML
Cloud-Native Deployment (Part 6): K8s Core Concepts — Pod, Deployment, Service, ConfigMap and Secret
Zang-Xiang Thinking
Starting from a Small Problem: A Word on the Mindset of Problem Solving
Zero Downtime
Cloud-Native Deployment (Part 10): Health Checks and Zero-Downtime Deployment
Zhihu
Why Do People Tell "Beautiful Lies"?
arm
The Differences Between armv6, armv7, armv7s, armv8 and arm64
bundle
One Article to Sort Out How rake, Rakefile, gem, gemspec, bundler, bundle and Gemfile Relate to Each Other
bundler
One Article to Sort Out How rake, Rakefile, gem, gemspec, bundler, bundle and Gemfile Relate to Each Other
copy
How Do You Copy Files in a Windows Batch File? What Is the Windows Equivalent of Linux's cp Command
coreutils
Blog Adds a New Page: "Reference Books"
d-pad
What Is a D-pad?
dependencies
2 Lines of Code to Automate HTML-to-Image Conversion!
Distinguishing the Three Different Levels of Dependencies in Gradle
etcd
Cloud-Native Deployment (Part 5): Kubernetes Architecture Core — Master, Node and etcd
firewalld
Temporarily and permanently disabling firewalld
ftp
What the FTP passive Parameter Does
gem
One Article to Sort Out How rake, Rakefile, gem, gemspec, bundler, bundle and Gemfile Relate to Each Other
Octicons, an Open-Source and Extensible Icon Set
gemspec
One Article to Sort Out How rake, Rakefile, gem, gemspec, bundler, bundle and Gemfile Relate to Each Other
grep
How to Do an OR with the grep Command
hosts
How to Fix GitHub Access Problems Without a VPN
httpclient5
Invalid cookie header Invalid 'expires' attribute
https
Configuring nginx to automatically redirect http to https
iOS
iOS build signing fails with "unable to build chain to self-signed root for signer" and CodeSign failed with a nonzero exit code — how to fix it
icons
Octicons, an Open-Source and Extensible Icon Set
kotlin-gradle-plugin
The Relationship Between kotlin, kotlin-plugin, gradle and kotlin-gradle-plugin
kotlin-plugin
The Relationship Between kotlin, kotlin-plugin, gradle and kotlin-gradle-plugin
kube-proxy
Cloud-Native Deployment (Part 7): K8s Network Model — CNI and Service Discovery
log4j2
How to Fix the log4j2 Remote Code Execution Vulnerability CVE-2021-44228
macOS
How to Set Up a Local Jekyll Environment on macOS
nodejs
Octicons, an Open-Source and Extensible Icon Set
pkg-config
Build Tools (Part 4): pkg-config — The Key That Solves Dependency Hell
rails
Octicons, an Open-Source and Extensible Icon Set
rake
One Article to Sort Out How rake, Rakefile, gem, gemspec, bundler, bundle and Gemfile Relate to Each Other
selinux
Temporarily and Permanently Disabling SELinux
settings.xml
Maven Repository Configuration: settings.xml in Detail
setup.py
How to Host a Python Package on PyPI
How to Host a Python Package on PyPI
svg
Octicons, an Open-Source and Extensible Icon Set
taskkill
Using Batch Commands to Kill Processes on Windows
twine
How to Host a Python Package on PyPI
vLLM
Local LLMs in Practice (Part 1): Building Your AI Infrastructure on the Intranet
wget
Fixing the wget “unable to verify xxx’s certificate issued by xxxx: the certificate has expired” error when downloading files
winget
Configuring the UE4 Android NDK, SDK and JDK Without Opening the Editor
Why the sun.misc.BASE64Encoder Class-Not-Found Error Happens and How to Fix It