Why We have a few parrots at home, and during the workday nobody’s around. I wanted to check in on them anytime. The requirement sounds simple: real-time video streaming, recording to storage, and ideally automatic backup to NAS. Off-the-shelf cameras are either expensive or require installing apps, registering accounts, and binding phone numbers — privacy concerns. I just want to watch my birds, not stream video to someone else’s server.
Why I have several LANs in different locations around the city, roughly 10 km apart. To make these networks talk to each other, I used tools like NetBird, ZeroTier, and Cloudflare Tunnel to set up a cross-region virtual LAN.
The network was set up, but how to ensure stability? After all, these tunnels traverse the public internet with varying link quality. The most direct approach is to use Prometheus’s blackbox_exporter for probing — periodic HTTP requests, Pings, DNS queries — feeding results into a time-series database with alert rules, so problems are detected immediately.
In the previous post, we discussed why Rust is worth learning and how to run your first Hello World. This post dives directly into syntax—variables, types, control flow, functions, and pattern matching. The core goal is simple: enable you to read and write Rust code.
If you have a Go background, none of these concepts will be unfamiliar. I’ll provide comparisons at key points to help map your existing knowledge to Rust.
Why Switch This blog previously used Hugo NexT, forked for custom modifications. NexT itself is a feature-rich theme, but when it comes to “customizing things yourself,” the experience wasn’t great.
The issues boiled down to a few things:
SCSS nesting hell. 101 SCSS files, three levels of directory nesting. _common/components/post, _common/components/third-party, _common/outline/sidebar… To change a style, you first had to figure out which file it was in, where variables were defined, and which scheme was overriding it. Not that it couldn’t be done, but each change meant half an hour of hunting.
This article is based on Rust 1.82 (released on 2026-01-23, current latest stable version). Rust is a modern systems programming language proven in production. Official documentation is at doc.rust-lang.org, and installation guide is at rust-lang.org/tools/install/.
Why Rust? If you’ve already mastered Go, you might ask: why learn Rust? Rust exists to fill the performance and control gap that Go leaves open.
Go has conquered cloud-native and microservices domains with its extremely low learning curve, excellent concurrency model, and fast compilation speed. But its garbage collector (GC) and fixed runtime make it constrained in systems programming, embedded, and high-performance scenarios. When you need more precise memory control, lower latency, or work in embedded environments without OS kernel support, Go’s GC becomes a burden.
Why Bother When it comes to writing code with AI, the gap between single-model and multi-model approaches keeps widening. No matter how strong a single model is, it can’t compete with a team of specialized models working in parallel.
Oh My OpenCode (OmO for short) is a multi-model orchestration plugin in the OpenCode ecosystem, with 11 Agents each having distinct responsibilities and 48 Hooks spanning the entire lifecycle. Zhipu’s Coding Plan provides access to the full GLM model series. Combining the two allows you to assign different models by role — strong coders for coding, strong reasoners for reasoning, free models for busywork.
After three articles of our journey—why choose Go, basic syntax and concurrency, interfaces and generics—we’ve reached the finale of the Go chapter, time to connect the engineering practices.
Go’s engineering capacity also shows up in its standard library, testing framework, and toolchain. They make up the daily working environment for Go developers and underpin rapid construction of reliable, maintainable software.
Overview This article compares the resource requirements and usage costs of three major domestic LLMs, helping developers choose the right solution for their scenarios.
Model Vendor Architecture Minimum Deployable VRAM API Available GLM-5 Zhipu AI Dense (multiple versions) 24GB (8B) ✅ Kimi K2.5 Moonshot AI MoE (undisclosed) 24GB (lightweight) ✅ MiniMax M2.7 MiniMax MoE 230B Not yet open-sourced ✅ GLM-5 (Zhipu AI) Versions & Hardware Requirements GLM-5 offers 4 parameter versions, making it the widest-coverage domestic LLM currently available.
Concurrency is the core feature that distinguishes Go from other languages. Unlike C++/Java’s thread model, and unlike JavaScript’s single-threaded event loop, Go provides a set of concurrency primitives — goroutines, channels, and context — that let you write high-performance concurrent programs with relatively straightforward code.
This article covers the technical details of Go’s concurrency model: the underlying scheduling mechanism, the implementation of channels and context, common concurrency patterns, and performance optimization and best practices.
Go’s error handling philosophy is “simple, explicit, controllable.” Every function that can fail can return an error value, and the caller must explicitly handle it. No exceptions, no implicit propagation—everything is in plain sight.
The error Interface: One Value, One Method Go’s error interface is minimal: just one Error() string method.
go 1 2 3 type error interface { Error() string } This means any type that implements Error() string is an error. The Go standard library provides many built-in error types, most commonly errors.New and fmt.Errorf.