<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mi&amp;Bee Blog</title><link>/en/</link><description>Recent content on Mi&amp;Bee Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>蓝宝石的傻话</managingEditor><lastBuildDate>Fri, 05 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="/en/rss.xml" rel="self" type="application/rss+xml"/><item><title>MiBeeNvr v0.6.0: Timelapse + Transcoding UI + ONVIF Enhancements + Documentation Restructure</title><link>/en/posts/mibee-oss/mibee-nvr-v0.6-promo/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>/en/posts/mibee-oss/mibee-nvr-v0.6-promo/</guid><description>&lt;p&gt;After running continuous recording for a few weeks, storage became the first bottleneck. A single 1080p camera writes tens of GB per day — with a 30-day retention policy, a 1TB硬盘 is mostly consumed. Many community members reported the same issue, and during discussions, the ideas of timelapse and transcoding storage gained the most traction: most of the time the画面 is static, and compressing it with timelapse requires only 5% of the space for the same duration.&lt;/p&gt;</description></item><item><title>MiBeeNvr v0.6.0's Test Machines: Three Camera Projects Updated in Sync</title><link>/en/posts/mibee-oss/camera-test-machines/</link><pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate><guid>/en/posts/mibee-oss/camera-test-machines/</guid><description>&lt;p&gt;The concurrently released &lt;a href="/en/posts/mibee-oss/mibee-nvr-v0.6-promo/"&gt;MiBeeNvr v0.6.0&lt;/a&gt; brought major features like timelapse, video transcoding, and ONVIF enhancements. Unit tests alone are far from enough — the full workflow must be tested against real camera hardware. To provide reliable test machines for this release, three camera projects were updated on the same day, June 5th — both to supply testing environments for the NVR and to solve some typical embedded development engineering problems along the way.&lt;/p&gt;</description></item><item><title>MiBeeNvr v0.5.0: Full ONVIF Protocol Support + Hardware Transcoding + rpi-cam Co-development</title><link>/en/posts/mibee-oss/mibee-nvr-v0.5/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/mibee-oss/mibee-nvr-v0.5/</guid><description>&lt;p&gt;Less than a week after v0.4.0, another 31 commits were pushed. v0.5.0 is a feature-dense release: &lt;strong&gt;full ONVIF protocol support&lt;/strong&gt; (covering all five major services: Device/Media/PTZ/Imaging/Event), &lt;strong&gt;hardware transcoding&lt;/strong&gt; (H.265 → H.264), and recorder reconnection optimizations. 127 files changed, +24,509 / -730 lines. See the full changelog at &lt;a href="https://github.com/Mi-Bee-Studio/MiBeeNvr/releases/tag/v0.5.0"&gt;GitHub Release Notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you haven&amp;rsquo;t seen the previous versions, check out &lt;a href="/en/posts/iot/mibee-nvr-introduction/"&gt;MiBeeNvr Introduction&lt;/a&gt; and &lt;a href="/en/posts/iot/mibee-nvr-v0.4-tech/"&gt;v0.4.0 Technical Post&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="full-onvif-protocol-support"&gt;Full ONVIF Protocol Support&lt;/h2&gt;
&lt;p&gt;v0.4.0 already had ONVIF device discovery and stream URL retrieval, but that was just the tip of the ONVIF iceberg. v0.5.0 completes the core services of ONVIF Profile S:&lt;/p&gt;</description></item><item><title>MiBeeHive: The "Hive" Toolbox I Built for My Studio</title><link>/en/posts/mibee-oss/mibeehive-introduction/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/mibee-oss/mibeehive-introduction/</guid><description>&lt;p&gt;Coming from an operations background, later transitioning to development, the number of projects I maintain keeps growing. Various middleware, databases, monitoring components… each version upgrade is a manual labor: go to the official site to find the download link, compare version numbers, manually download to the internal network, then distribute to each machine. I used to write a bunch of Shell scripts to periodically pull the latest versions to the LAN — functional but not user-friendly: scripts scattered everywhere, adding new software required writing parsing logic by hand, and there was nothing to check when things went wrong.&lt;/p&gt;</description></item><item><title>MiBeeNvr v0.4.0: Audio Recording Finally Arrives, Auto-Recovery When Cameras Go Down</title><link>/en/posts/iot/mibee-nvr-v0.4-promo/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/mibee-nvr-v0.4-promo/</guid><description>&lt;p&gt;Previously, MiBeeNvr&amp;rsquo;s MP4 files only had a video track — playback was silent. v0.4.0 fills this gap with &lt;strong&gt;audio recording&lt;/strong&gt;. It also adds more practical &lt;strong&gt;camera health monitoring and auto-recovery&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="recordings-now-have-sound"&gt;Recordings Now Have Sound&lt;/h2&gt;
&lt;p&gt;Each camera can independently enable audio recording:&lt;/p&gt;
&lt;div class="code-block-wrapper" data-lang="yaml"&gt;
 &lt;div class="code-block-header"&gt;
 &lt;div class="code-block-meta"&gt;&lt;span class="code-language"&gt;yaml&lt;/span&gt;&lt;/div&gt;
 
 &lt;button class="copy-button" aria-label="Copy code"&gt;
 &lt;svg class="copy-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"/&gt;&lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/&gt;&lt;/svg&gt;
 &lt;svg class="check-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;polyline points="20 6 9 17 4 12"/&gt;&lt;/svg&gt;
 &lt;/button&gt;
 
 &lt;/div&gt;
 &lt;div class="code-block-body"&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;cameras&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;front-door&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Front Door Camera&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;rtsp&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;h264&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;audio_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Supported audio formats:&lt;/p&gt;</description></item><item><title>MiBeeNvr v0.4.0: Audio Recording Pipeline and Multi-Layer Health Monitoring Architecture</title><link>/en/posts/iot/mibee-nvr-v0.4-tech/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/mibee-nvr-v0.4-tech/</guid><description>&lt;p&gt;After v0.3.1 shipped, I put in another 196 commits. v0.4.0 is a feature-dense release: audio recording pipeline, multi-layer health monitoring engine, HLS/LL-HLS playback stability optimization, and a major UI redesign. For the full changelog, see &lt;a href="https://github.com/Mi-Bee-Studio/MiBeeNvr/releases/tag/v0.4.0"&gt;GitHub Release Notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The previous post covered v0.3.x&amp;rsquo;s multi-protocol streaming and Xiaomi camera support (&lt;a href="/en/posts/iot/mibee-nvr-v0.3-tech/"&gt;v0.3.0 Tech Post&lt;/a&gt;). If you haven&amp;rsquo;t read the first post, start with &lt;a href="/en/posts/iot/mibee-nvr-introduction/"&gt;MiBeeNvr Introduction&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="audio-recording-from-silent-to-sound"&gt;Audio Recording: From Silent to Sound&lt;/h2&gt;
&lt;p&gt;In the v0.3.x era, recorded MP4 files only had a video track. v0.4.0 introduces a complete audio capture and muxing pipeline, supporting AAC audio from RTSP cameras and G.711 audio from ONVIF/Xiaomi cameras.&lt;/p&gt;</description></item><item><title>MiBeeNvr v0.3.1: Multi-Protocol Streaming and Native Xiaomi Camera Support</title><link>/en/posts/iot/mibee-nvr-v0.3-tech/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/mibee-nvr-v0.3-tech/</guid><description>&lt;p&gt;A lot of work went into the releases after v0.2.0. v0.3.x brings several major updates: native Xiaomi camera support, recording archiving, multi-protocol streaming architecture (WebRTC/HTTP-FLV/RTMP/SRT/LL-HLS), and a wave of security hardening. The architectural evolution from external dependencies to built-in implementation, from single protocol to full protocol support, was much more曲折 than I expected.&lt;/p&gt;
&lt;p&gt;The previous post introduced v0.2.0&amp;rsquo;s 15 new features (&lt;a href="/en/posts/iot/mibee-nvr-v0.2/"&gt;v0.2.0 Update&lt;/a&gt;). If you haven&amp;rsquo;t read the first post, start with &lt;a href="/en/posts/iot/mibee-nvr-introduction/"&gt;MiBeeNvr Introduction&lt;/a&gt;. v0.3.0 focuses on deep Xiaomi camera integration, and v0.3.1 builds on that with a complete multi-protocol streaming architecture. For the full changelog, see &lt;a href="https://github.com/Mi-Bee-Studio/MiBeeNvr/releases/tag/v0.3.1"&gt;GitHub Release Notes&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>From Compliance to Real-Time Defense: The Evolution of security-collector-exporter</title><link>/en/posts/telemetry/security-collector-exporter-from-compliance-to-runtime/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/telemetry/security-collector-exporter-from-compliance-to-runtime/</guid><description>&lt;h2 id="the-origin-compliance-check-hassles"&gt;The Origin: Compliance Check Hassles&lt;/h2&gt;
&lt;p&gt;Anyone in operations knows there&amp;rsquo;s no escaping one hurdle for domestic servers: &lt;strong&gt;Cybersecurity Level Protection&lt;/strong&gt; (GB/T 22239-2019, commonly known as &amp;ldquo;Level Protection 2.0&amp;rdquo;). Whether you&amp;rsquo;re Level 3 or Level 2, auditors come asking about these things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is SSH root login disabled? Are password policies compliant?&lt;/li&gt;
&lt;li&gt;Is the firewall on? Is SELinux enforcing?&lt;/li&gt;
&lt;li&gt;Are there expired accounts? What&amp;rsquo;s the password validity period?&lt;/li&gt;
&lt;li&gt;Which ports are open? Are there high-risk services running?&lt;/li&gt;
&lt;li&gt;Are audit logs enabled? How long are they retained?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are plenty of compliance check tools on the market—search GitHub and you&amp;rsquo;ll find a bunch: &lt;code&gt;Golin&lt;/code&gt;, &lt;code&gt;EvaluationTools&lt;/code&gt;, &lt;code&gt;Linux-Security-Compliance-Check&lt;/code&gt;, etc. But they all share one limitation: &lt;strong&gt;Run once, get a report, done&lt;/strong&gt;. You check compliance today, and someone changes &lt;code&gt;sshd_config&lt;/code&gt; tomorrow, turns off the firewall, installs a backdoor service—you&amp;rsquo;d never know.&lt;/p&gt;</description></item><item><title>MiBeeNvr v0.3.0: One-Click Xiaomi Camera Integration, Recordings Never Lost</title><link>/en/posts/iot/mibee-nvr-v0.3-promo/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/mibee-nvr-v0.3-promo/</guid><description>&lt;p&gt;Got Xiaomi cameras at home? Want to keep your recordings on your own storage instead of relying on the cloud?&lt;/p&gt;
&lt;p&gt;As someone with several Xiaomi cameras at home, I always had one frustration: every time I wanted to check the footage from my doorbell camera, I had to log into Xiaomi Cloud, wait for ages while it loaded, and it would often just spin. Plus, cloud storage charges by the day — it adds up over the month. And if you swap cameras, all your old recordings are gone. Pretty frustrating.&lt;/p&gt;</description></item><item><title>security-collector-exporter v0.3.0: Real-Time Security Monitoring with eBPF</title><link>/en/posts/telemetry/security-collector-exporter-ebpf-v030/</link><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/telemetry/security-collector-exporter-ebpf-v030/</guid><description>&lt;h2 id="from-static-to-real-time"&gt;From Static to Real-Time&lt;/h2&gt;
&lt;p&gt;The previous article introduced &lt;a href="../security-collector-exporter-v010/"&gt;security-collector-exporter v0.1.0&lt;/a&gt; — turning Linux security configuration states into Prometheus metrics. But v0.1.0 is essentially &amp;ldquo;snapshot-based&amp;rdquo;: periodically reading &lt;code&gt;/etc&lt;/code&gt;, &lt;code&gt;/proc&lt;/code&gt;, capturing the static configuration at a single point in time.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s an area of security operations that snapshots can&amp;rsquo;t cover: &lt;strong&gt;real-time security events&lt;/strong&gt;. Someone running a reverse shell, a process escalating privileges, an abnormal network connection, someone loading a kernel module — these events happen and pass; you&amp;rsquo;d never see them at your next scrape.&lt;/p&gt;</description></item><item><title>From Hashmod to Jump Consistent Hash — stream-metrics-route Hash Algorithm Upgrade</title><link>/en/posts/telemetry/stream-metrics-three/</link><pubDate>Sat, 16 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/telemetry/stream-metrics-three/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In &lt;a href="/en/posts/telemetry/stream-metrics-two/"&gt;the previous article&lt;/a&gt;, we reviewed the three-year evolution of stream-metrics-route and mentioned that the &amp;ldquo;dual hashmod scheduling&amp;rdquo; is the core scheduling mechanism of the entire gateway. However, during continuous production operation, one fatal flaw of hashmod became increasingly obvious—&lt;strong&gt;every scaling operation triggers full data redistribution&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This article documents the complete decision process of migrating from &lt;code&gt;hash % N&lt;/code&gt; (hashmod) to &lt;strong&gt;Jump Consistent Hash&lt;/strong&gt;: which candidate algorithms were evaluated, why Jump Hash was ultimately chosen, and the specific impact before and after migration.&lt;/p&gt;</description></item><item><title>The Hidden Trap of Headless Browsers: Why Can't Your Automation Tool Catch Early Page Errors?</title><link>/en/posts/aihelper/headless-browser-early-error-capture/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/aihelper/headless-browser-early-error-capture/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;re debugging a frontend engineering issue — the page is behaving abnormally. You ask an AI to open the page with a browser tool and check the console for errors.&lt;/p&gt;
&lt;p&gt;The AI opens the page, scans around, and tells you: &lt;strong&gt;The console is clean, no errors whatsoever.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re skeptical. You open Chrome DevTools yourself — three bright red errors are staring you in the face, the page has already crashed into a white screen. The AI visited the exact same page using a Headless browser, &lt;strong&gt;so why did it catch nothing?&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>security-collector-exporter: Monitoring Linux Security Auditing</title><link>/en/posts/telemetry/security-collector-exporter-v010/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/telemetry/security-collector-exporter-v010/</guid><description>&lt;h2 id="why-this-was-built"&gt;Why This Was Built&lt;/h2&gt;
&lt;p&gt;Anyone managing servers has probably had this experience: compliance audit comes, SSH into machines one by one to check—SSH config correct, SELinux enabled, firewall running, any expired accounts, password policies compliant. A few machines are fine; dozens or hundreds becomes purely manual grunt work.&lt;/p&gt;
&lt;p&gt;And the more painful part: none of this has continuous monitoring. You check compliance today, someone changes a config tomorrow, and you&amp;rsquo;d never know.&lt;/p&gt;</description></item><item><title>One Month with the Zhi Theme: Mermaid v11 Upgrade Experience</title><link>/en/posts/aihelper/hugo-theme-zhi-v11-upgrade/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/aihelper/hugo-theme-zhi-v11-upgrade/</guid><description>&lt;h2 id="one-month-in"&gt;One Month In&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s been nearly a month since the previous article &lt;a href="/en/posts/aihelper/hugo-theme-zhi-intro/"&gt;Switched My Blog Theme: From Hugo NexT to Self-Written Zhi&lt;/a&gt;. During this month, the theme has been running stably without major issues. Replacing the NexT theme was the right decision — although there was some initial adjustment, the experience is now significantly better.&lt;/p&gt;
&lt;p&gt;After a month of use, the theme&amp;rsquo;s stability has exceeded expectations. My initial concerns — whether pure Hugo Pipes without build tools could support complex requirements — were proven unfounded. Daily maintenance has become very simple; modifying a feature no longer requires digging through deeply nested SCSS files — one CSS file gets the job done.&lt;/p&gt;</description></item><item><title>MiBeeNvr v0.2.0 Update: Docker Deployment, HLS Streaming, Recording Merging, and a Complete Installation Guide</title><link>/en/posts/iot/mibee-nvr-v0.2/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/mibee-nvr-v0.2/</guid><description>&lt;p&gt;The previous article introduced MiBeeNvr&amp;rsquo;s basic features and design philosophy. It&amp;rsquo;s only been a week since v0.1.0, and v0.2.0 follows right behind. This update is substantial — 15 new features, some I needed myself, others from community feedback.&lt;/p&gt;
&lt;p&gt;This article covers three things: what&amp;rsquo;s new in v0.2.0, how to deploy from scratch, and some practical tips for real-world use.&lt;/p&gt;
&lt;h2 id="v020-new-features-overview"&gt;v0.2.0 New Features Overview&lt;/h2&gt;
&lt;p&gt;This update has a lot of content. Here&amp;rsquo;s a breakdown by category:&lt;/p&gt;</description></item><item><title>VictoriaMetrics Stream Aggregation: Three-Year Review and Current Status (2026)</title><link>/en/posts/telemetry/stream-metrics-two/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/telemetry/stream-metrics-two/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s been exactly three years since the previous article &lt;a href="https://blog.mickeyzzc.tech/posts/telemetry/stream-metrics-one/"&gt;Applying VictoriaMetrics Stream Aggregation for Metrics&lt;/a&gt; was published in &lt;strong&gt;March 2023&lt;/strong&gt;. In these three years, the VictoriaMetrics ecosystem has undergone tremendous changes—let&amp;rsquo;s revisit the issues raised in that blog post, see what the official project has resolved, and where our &lt;a href="https://github.com/mickeyzzc/stream-metrics-route"&gt;stream-metrics-route&lt;/a&gt; project stands today.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="i-problems-we-encountered-three-years-ago"&gt;I. Problems We Encountered Three Years Ago&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s quickly recap the core issue list from the 2023 blog post:&lt;/p&gt;</description></item><item><title>ESP32-CAM Monitor: DIY Auto Flash for Dark Scenes</title><link>/en/posts/iot/ai-thinker-esp32-cam-flash/</link><pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/ai-thinker-esp32-cam-flash/</guid><description>&lt;h2 id="why"&gt;Why&lt;/h2&gt;
&lt;p&gt;I built a surveillance camera with ESP32-S3 before, and it worked well. Later, while rummaging through a drawer, I found an AI-Thinker ESP32-CAM development board — that classic board costing about ten bucks with a built-in OV2640 camera and TF card slot. No reason to let it go to waste, so I built another one: &lt;a href="https://github.com/Mi-Bee-Studio/ai-thinker-esp32-cam"&gt;ai-thinker-esp32-cam&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This time I wrote the firmware from scratch using ESP-IDF again, with similar capabilities to the previous project but with lots of adaptations for the AI-Thinker board. Here&amp;rsquo;s what it ended up doing:&lt;/p&gt;</description></item><item><title>Evolution: Oh My OpenAgent Configuration Iteration Log</title><link>/en/posts/aihelper/oh-my-openagent-config-iteration/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/aihelper/oh-my-openagent-config-iteration/</guid><description>&lt;blockquote&gt;
&lt;p&gt;The previous article covered the initial configuration setup. This one documents the adjustments after two weeks of running: expanding from single vendor to a four-tier model pool, adding fallback chains, hitting the GLM-4.5-air trap of analyzing without writing code.&lt;/p&gt;
&lt;p&gt;This post covers: fallback strategy design, complete free model pool inventory and analysis, concurrency control configuration, and the decision process for GLM-4.5-air replacement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After the previous article&amp;rsquo;s initial configuration, I ran it for two weeks — all the issues that needed fixing surfaced.&lt;/p&gt;</description></item><item><title>MiBeeNvr: A Lightweight Home NVR System I Built</title><link>/en/posts/iot/mibee-nvr-introduction/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/mibee-nvr-introduction/</guid><description>&lt;p&gt;I have several cameras at home — a few Xiaomi cameras, some DIY ESP32 cameras, and multiple Raspberry Pi CSI cameras. I&amp;rsquo;d been using cloud storage solutions, but I was never comfortable with them: vendor lock-in, network dependency, and the costs add up. So I decided to build my own NVR system, called MiBeeNvr.&lt;/p&gt;
&lt;h2 id="why-build-mibeenvr"&gt;Why Build MiBeeNvr&lt;/h2&gt;
&lt;p&gt;To be honest, I was never satisfied with existing cloud storage solutions. Take Xiaomi cameras, for example. By default, you can only view them through the Mi Home app. Recordings are either stored on an SD card (limited capacity, frequent plugging/unplugging) or in the cloud. Cloud storage costs tens of dollars per month, and there&amp;rsquo;s the privacy concern — you never know when the manufacturer might use your video data for AI training or sell it to third parties. Not to mention vendor lock-in — switching platforms is nearly impossible.&lt;/p&gt;</description></item><item><title>Building a Surveillance Camera with ESP32-S3 — WiFi, TF Card, Video Output Pitfalls</title><link>/en/posts/iot/esp32s3-cam-monitor/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/esp32s3-cam-monitor/</guid><description>&lt;h2 id="why"&gt;Why&lt;/h2&gt;
&lt;p&gt;We have a few parrots at home, and during the workday nobody&amp;rsquo;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&amp;rsquo;s server.&lt;/p&gt;</description></item><item><title>Replacing VMs with ESP32 for Network Probing — esp32-blackbox Project in Action</title><link>/en/posts/iot/esp32-blackbox/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/esp32-blackbox/</guid><description>&lt;h2 id="why"&gt;Why&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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&amp;rsquo;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.&lt;/p&gt;</description></item><item><title>Switched My Blog Theme: From Hugo NexT to Self-Written Zhi</title><link>/en/posts/aihelper/hugo-theme-zhi-intro/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>/en/posts/aihelper/hugo-theme-zhi-intro/</guid><description>&lt;h2 id="why-switch"&gt;Why Switch&lt;/h2&gt;
&lt;p&gt;This blog previously used &lt;a href="https://github.com/hugo-next/hugo-theme-next"&gt;Hugo NexT&lt;/a&gt;, forked for custom modifications. NexT itself is a feature-rich theme, but when it comes to &amp;ldquo;customizing things yourself,&amp;rdquo; the experience wasn&amp;rsquo;t great.&lt;/p&gt;
&lt;p&gt;The issues boiled down to a few things:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SCSS nesting hell&lt;/strong&gt;. 101 SCSS files, three levels of directory nesting. &lt;code&gt;_common/components/post&lt;/code&gt;, &lt;code&gt;_common/components/third-party&lt;/code&gt;, &lt;code&gt;_common/outline/sidebar&lt;/code&gt;… 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&amp;rsquo;t be done, but each change meant half an hour of hunting.&lt;/p&gt;</description></item><item><title>Zhipu Coding Plan × Oh My OpenCode: Multi-Model Orchestration Setup Guide</title><link>/en/posts/aihelper/zhipuai-coding-plan-oh-my-opencode-setup/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>/en/posts/aihelper/zhipuai-coding-plan-oh-my-opencode-setup/</guid><description>&lt;h2 id="why-bother"&gt;Why Bother&lt;/h2&gt;
&lt;p&gt;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&amp;rsquo;t compete with a team of specialized models working in parallel.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/code-yeongyu/oh-my-openagent"&gt;Oh My OpenCode&lt;/a&gt; (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. &lt;a href="https://z.ai/subscribe"&gt;Zhipu&amp;rsquo;s Coding Plan&lt;/a&gt; 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.&lt;/p&gt;</description></item><item><title>Windows Defender Exclusion Bulk Cleanup Guide</title><link>/en/posts/system/windows-defender-exclusion-cleanup/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>/en/posts/system/windows-defender-exclusion-cleanup/</guid><description>&lt;p&gt;When the Windows Defender exclusion list accumulates a large number of useless entries, you can clean them all at once with a PowerShell one-liner. This article details the entire process, including backup, cleanup, and verification.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Modifying Defender configuration requires administrator privileges. Open a terminal with sufficient permissions as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click the Windows Start menu and search for &lt;strong&gt;PowerShell&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Right-click &lt;strong&gt;Windows PowerShell&lt;/strong&gt; in the search results, then select &lt;strong&gt;Run as administrator&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Yes&lt;/strong&gt; in the User Account Control (UAC) window to confirm authorization&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="step-1-backup-existing-exclusions-highly-recommended"&gt;Step 1: Backup Existing Exclusions (Highly Recommended)&lt;/h2&gt;
&lt;p&gt;Before cleaning, it is recommended to back up the current exclusion list to prevent accidentally deleting entries you want to keep. If needed later, you can restore from the backup file.&lt;/p&gt;</description></item><item><title>Domestic LLM Resource and Cost Comparison: GLM-5 / Kimi K2.5 / MiniMax M2.7</title><link>/en/posts/aihelper/domestic-llm-cost-comparison/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>/en/posts/aihelper/domestic-llm-cost-comparison/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This article compares the resource requirements and usage costs of three major domestic LLMs, helping developers choose the right solution for their scenarios.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Model&lt;/th&gt;
					&lt;th&gt;Vendor&lt;/th&gt;
					&lt;th&gt;Architecture&lt;/th&gt;
					&lt;th&gt;Minimum Deployable VRAM&lt;/th&gt;
					&lt;th&gt;API Available&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;GLM-5&lt;/td&gt;
					&lt;td&gt;Zhipu AI&lt;/td&gt;
					&lt;td&gt;Dense (multiple versions)&lt;/td&gt;
					&lt;td&gt;24GB (8B)&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Kimi K2.5&lt;/td&gt;
					&lt;td&gt;Moonshot AI&lt;/td&gt;
					&lt;td&gt;MoE (undisclosed)&lt;/td&gt;
					&lt;td&gt;24GB (lightweight)&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MiniMax M2.7&lt;/td&gt;
					&lt;td&gt;MiniMax&lt;/td&gt;
					&lt;td&gt;MoE 230B&lt;/td&gt;
					&lt;td&gt;Not yet open-sourced&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="glm-5-zhipu-ai"&gt;GLM-5 (Zhipu AI)&lt;/h2&gt;
&lt;h3 id="versions--hardware-requirements"&gt;Versions &amp;amp; Hardware Requirements&lt;/h3&gt;
&lt;p&gt;GLM-5 offers 4 parameter versions, making it the widest-coverage domestic LLM currently available.&lt;/p&gt;</description></item><item><title>Temperature and Humidity Monitoring with ESP01 Board</title><link>/en/posts/iot/esp-01-dht11/</link><pubDate>Fri, 09 Feb 2024 00:00:00 +0000</pubDate><guid>/en/posts/iot/esp-01-dht11/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In IoT applications, temperature and humidity monitoring is a common and important requirement. The ESP01, as a low-cost, low-power WiFi module, provides a convenient solution for implementing temperature and humidity monitoring. This article details how to use the ESP01 board for temperature and humidity monitoring development, including hardware connections, code implementation, and functional analysis.&lt;/p&gt;
&lt;h2 id="hardware-preparation"&gt;Hardware Preparation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ESP01 Board&lt;/strong&gt;: Core control module, responsible for data collection and network communication.
&lt;img src="/posts/iot/images/esp01-dht11-01.jpg" alt=""&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DHT Temperature and Humidity Sensor&lt;/strong&gt;: Used to measure ambient temperature and humidity.
&lt;img src="/posts/iot/images/esp01-dht11-02.jpg" alt=""&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dupont Wires&lt;/strong&gt;: Used to connect the ESP01 and DHT sensor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Connect the DHT sensor&amp;rsquo;s VCC pin to the ESP01&amp;rsquo;s 3.3V pin, the GND pin to GND, and the data pin to the designated pin on the ESP01 (defined as &lt;code&gt;DHTPIN&lt;/code&gt; in the code).&lt;/p&gt;</description></item><item><title>eBPF Series: DeepFlow Extended Protocol Parsing Practice (MongoDB Protocol &amp; Kafka Protocol)</title><link>/en/posts/telemetry/deepflow-agent-proto-dev/</link><pubDate>Sat, 25 Nov 2023 00:00:00 +0000</pubDate><guid>/en/posts/telemetry/deepflow-agent-proto-dev/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#overview"&gt;Overview:&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#how-to-analyze-a-protocol-mongodb"&gt;How to Analyze a Protocol (MongoDB)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#protocol-document-analysis-approach"&gt;Protocol Document Analysis Approach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#mongodb-protocol-opcode-reference-table"&gt;MongoDB Protocol OpCode Reference Table&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#analyzing-the-most-common-opcode-op_msg"&gt;Analyzing the Most Common OpCode &lt;code&gt;OP_MSG&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#extending-protocol-parsing-in-deepflow-agent"&gt;Extending Protocol Parsing in &lt;code&gt;DeepFlow Agent&lt;/code&gt;&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#deepflow-agent-development-document-overview"&gt;&lt;code&gt;DeepFlow Agent&lt;/code&gt; Development Document Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#code-guide"&gt;Code Guide&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#define-a-protocol-with-a-constant-identifier"&gt;Define a Protocol with a Constant Identifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#prepare-parsing-logic-for-the-new-protocol"&gt;Prepare Parsing Logic for the New Protocol&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#define-the-struct"&gt;Define the Struct&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#implement-l7protocolparserinterface"&gt;Implement &lt;code&gt;L7ProtocolParserInterface&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#extending-deepflow-protocol-collection-using-wasm-plugins"&gt;Extending DeepFlow Protocol Collection Using &lt;code&gt;Wasm&lt;/code&gt; Plugins&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#kafka-protocol-analysis"&gt;&lt;code&gt;Kafka&lt;/code&gt; Protocol Analysis&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#kafka-header-and-data-overview"&gt;&lt;code&gt;Kafka&lt;/code&gt; Header and Data Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#kafka-fetch-api"&gt;Kafka Fetch API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#kafka-produce-api"&gt;Kafka Produce API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#kafka-protocol-deepflow-agent-native-decoding"&gt;Kafka Protocol DeepFlow Agent Native Decoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#deepflow-agent-wasm-plugin"&gt;&lt;code&gt;DeepFlow Agent&lt;/code&gt; Wasm Plugin&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#wasm-go-sdk-framework"&gt;Wasm Go SDK Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#plugin-code-guide"&gt;Plugin Code Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#conclusion"&gt;Conclusion&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#native-rust-extension"&gt;Native Rust Extension&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#wasm-plugin-extension"&gt;Wasm Plugin Extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/en/posts/telemetry/deepflow-agent-proto-dev/#appendix"&gt;Appendix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position:relative; padding-bottom:75%; width:100%; height:0"&gt;
&lt;iframe src="//player.bilibili.com/player.html?isOutside=true&amp;aid=921401645&amp;bvid=BV1Nu4y1A7ZC&amp;cid=1345829549&amp;p=1&amp;autoplay=false" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" style="position:absolute; height: 100%; width: 100%;"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;MongoDB&lt;/code&gt; is widely used today, but lacks effective observability capabilities.
&lt;code&gt;DeepFlow&lt;/code&gt; is an excellent solution for observability, but it lacks support for the &lt;code&gt;MongoDB&lt;/code&gt; protocol.
This article extends &lt;code&gt;DeepFlow&lt;/code&gt; with &lt;code&gt;MongoDB&lt;/code&gt; protocol parsing, enhancing observability in the &lt;code&gt;MongoDB&lt;/code&gt; ecosystem. It briefly describes the process from protocol document analysis to implementing code parsing within &lt;code&gt;DeepFlow&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Applying VictoriaMetrics Stream Aggregation for Metrics</title><link>/en/posts/telemetry/stream-metrics-one/</link><pubDate>Mon, 27 Mar 2023 00:00:00 +0000</pubDate><guid>/en/posts/telemetry/stream-metrics-one/</guid><description>&lt;h2 id="community-vm-stream-aggregation-capability-analysis-and-issues"&gt;Community VM Stream Aggregation Capability Analysis and Issues&lt;/h2&gt;
&lt;h3 id="victoriametrics-open-source-project-native-capabilities"&gt;VictoriaMetrics Open-Source Project Native Capabilities&lt;/h3&gt;
&lt;p&gt;Stream aggregation in the VictoriaMetrics project was integrated into vmagent starting from version 1.86. For details, refer to: &lt;a href="https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3460"&gt;https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3460&lt;/a&gt;
From the source code analysis, the stream aggregation capability looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="/posts/telemetry/images/20230329181637.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;The core computation code is described in the &lt;code&gt;pushSample&lt;/code&gt; function:&lt;/p&gt;
&lt;div class="code-block-wrapper" data-lang="go"&gt;
 &lt;div class="code-block-header"&gt;
 &lt;div class="code-block-meta"&gt;&lt;span class="code-language"&gt;go&lt;/span&gt;&lt;/div&gt;
 
 &lt;button class="copy-button" aria-label="Copy code"&gt;
 &lt;svg class="copy-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"/&gt;&lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/&gt;&lt;/svg&gt;
 &lt;svg class="check-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;polyline points="20 6 9 17 4 12"/&gt;&lt;/svg&gt;
 &lt;/button&gt;
 
 &lt;/div&gt;
 &lt;div class="code-block-body"&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;totalAggrState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;pushSample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;outputKey&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;currentTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fasttime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UnixTimestamp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;deleteDeadline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;currentTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;as&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;intervalSecs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;as&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;intervalSecs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;again&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;as&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;outputKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;totalStateValue&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="nx"&gt;lastValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;lastValueState&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;vNew&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;loaded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;as&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LoadOrStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;outputKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;loaded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vNew&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;sv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;totalStateValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;deleted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deleted&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;deleted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;lv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastValues&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;inputKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="nx"&gt;lv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;lastValueState&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="nx"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastValues&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;inputKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lv&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;currentTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;as&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ignoreInputDeadline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="nx"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;lv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;lv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deleteDeadline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deleteDeadline&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deleteDeadline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deleteDeadline&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Unlock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deleted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="k"&gt;goto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;again&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="general-application-analysis-of-stream-aggregation"&gt;General Application Analysis of Stream Aggregation&lt;/h3&gt;
&lt;p&gt;First, let&amp;rsquo;s look at the time series chart after stream aggregation:
&lt;img src="/posts/telemetry/images/20230330154038.png" alt=""&gt;&lt;/p&gt;</description></item><item><title>eBPF Series: A Brief Analysis of Pixie</title><link>/en/posts/telemetry/pixie-try/</link><pubDate>Fri, 10 Feb 2023 00:00:00 +0000</pubDate><guid>/en/posts/telemetry/pixie-try/</guid><description>&lt;p&gt;Deployment process and instructions reference: &lt;a href="https://docs.px.dev/installing-pixie/install-guides/self-hosted-pixie/"&gt;pixie install&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="pixie-platform-main-components"&gt;Pixie Platform Main Components&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pixie Edge Module (PEM)&lt;/strong&gt;:
Pixie&amp;rsquo;s agent, installed per node. PEMs use eBPF to collect data, which is stored locally on the node.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vizier&lt;/strong&gt;:
Pixie&amp;rsquo;s collector, installed per cluster. Responsible for query execution and managing PEMs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pixie Cloud&lt;/strong&gt;:
Used for user management, authentication, and data proxying. Can be hosted or self-hosted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pixie CLI&lt;/strong&gt;:
Used to deploy Pixie. Can also be used to run queries and manage resources like API keys.&lt;/p&gt;</description></item><item><title>A Casual Talk About CPU Timing and Modern Operating Systems</title><link>/en/posts/telemetry/talk-about-cpu-timer/</link><pubDate>Fri, 20 Jan 2023 00:00:00 +0000</pubDate><guid>/en/posts/telemetry/talk-about-cpu-timer/</guid><description>&lt;h2 id="time-sharing-systems-and-linux"&gt;Time-Sharing Systems and Linux&lt;/h2&gt;
&lt;p&gt;First, let&amp;rsquo;s review time-sharing systems. The time-sharing system is a very important operating system concept that maximizes computer utilization and is a crucial means of implementing multi-program concurrency.&lt;/p&gt;
&lt;p&gt;The Linux kernel we use daily also adopts the time-sharing system philosophy, mainly reflected in the following aspects:&lt;/p&gt;
&lt;h3 id="time-slice"&gt;Time Slice:&lt;/h3&gt;
&lt;p&gt;Linux uses a time slice mechanism to divide CPU time. Each process can only execute for one time slice before yielding the CPU to other processes. This achieves CPU time sharing and fair allocation.&lt;/p&gt;</description></item><item><title>Eyes On You: The 2022 Productization Journey of a Multi-Cloud Heterogeneous Monitoring Platform</title><link>/en/posts/telemetry/eyeonyou/</link><pubDate>Mon, 20 Jun 2022 00:00:00 +0000</pubDate><guid>/en/posts/telemetry/eyeonyou/</guid><description>&lt;p&gt;In the context of multi-cloud deployment, global networking, and exponential growth in service scale within internet businesses, monitoring platforms have long surpassed the basic &amp;ldquo;metric collection + alert notification&amp;rdquo; positioning, becoming the core infrastructure for ensuring end-to-end stability. This article, based on the real evolution of a large-scale internet enterprise monitoring platform, dissects the complete planning and implementation approach for upgrading the monitoring platform from &lt;strong&gt;large-scale coverage&lt;/strong&gt; to &lt;strong&gt;productization, usability, and intelligence&lt;/strong&gt; in 2022.&lt;/p&gt;</description></item><item><title>From Bottleneck Breakthrough to Platform Governance — The Full Evolution of an Internet Company's Monitoring Platform Architecture</title><link>/en/posts/architecture/monitor-system-architecture/</link><pubDate>Mon, 10 Jan 2022 00:00:00 +0000</pubDate><guid>/en/posts/architecture/monitor-system-architecture/</guid><description>&lt;p&gt;In the context of rapid internet business expansion, multi-cloud deployment, and exponential asset growth, the monitoring platform is a critical infrastructure for ensuring service stability. This article provides a complete review of &lt;strong&gt;a major internet company&amp;rsquo;s monitoring platform evolution from 2019 to 2021&lt;/strong&gt; — from solving legacy monitoring performance bottlenecks, to implementing cross-cloud distributed monitoring, to cloud-native platform governance — presenting the full transformation of the monitoring system from &lt;strong&gt;0 to 1 build → large-scale expansion → platform governance&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Hybrid Cloud Cross-Region Monitoring System Governance: Autonomous + Unified Dual-Core Architecture Practice</title><link>/en/posts/architecture/monitor-cloud-architecture/</link><pubDate>Mon, 10 Jan 2022 00:00:00 +0000</pubDate><guid>/en/posts/architecture/monitor-cloud-architecture/</guid><description>&lt;p&gt;In the context of global business expansion and large-scale hybrid cloud deployment, &lt;strong&gt;cross-IDC, cross-border, multi-cloud heterogeneous&lt;/strong&gt; monitoring governance has become a core challenge for stability assurance. Traditional monitoring solutions either rely on expensive dedicated line upgrades that intrude on business architecture, or cannot balance node autonomy with global unification. Meanwhile, as a non-revenue infrastructure, the monitoring system must strictly control resource usage without allowing capability degradation.&lt;/p&gt;
&lt;p&gt;This article breaks down a practical &lt;strong&gt;cross-region monitoring system governance solution&lt;/strong&gt; from a real internet company, explaining how to achieve &lt;strong&gt;elastic scaling, cross-border coverage, node autonomy, and data unification&lt;/strong&gt; for the monitoring system without modifying business architecture or incurring business cross-domain costs.&lt;/p&gt;</description></item><item><title>Black-box Probing Monitoring System Architecture Design and Practice for Internet Companies</title><link>/en/posts/architecture/blackbox-system-architecture/</link><pubDate>Tue, 31 Aug 2021 00:00:00 +0000</pubDate><guid>/en/posts/architecture/blackbox-system-architecture/</guid><description>&lt;p&gt;In the full-link monitoring system of internet services, &lt;strong&gt;white-box monitoring&lt;/strong&gt; focuses on proactively uncovering potential issues and predicting risks, while &lt;strong&gt;black-box monitoring&lt;/strong&gt; is fault-oriented, rapidly detecting problems that have already occurred online. The two work together to form a complete monitoring闭环. Most internet companies have long had a monitoring blind spot for &lt;strong&gt;public network services and the user-side last mile&lt;/strong&gt;. User-side faults often only trigger investigation after users report issues. The black-box probing monitoring system was designed precisely to solve this industry pain point.&lt;/p&gt;</description></item><item><title>Monitoring System Enterprise Architecture Evolution — Probing Monitoring</title><link>/en/posts/architecture/prometheus-evolution-history-three/</link><pubDate>Sat, 12 Dec 2020 00:00:00 +0000</pubDate><guid>/en/posts/architecture/prometheus-evolution-history-three/</guid><description>&lt;h2 id="recap"&gt;Recap&lt;/h2&gt;
&lt;p&gt;In &amp;ldquo;Monitoring System Enterprise Architecture Evolution — Cross-Region Hybrid Cloud&amp;rdquo;, the monitoring system had gradually matured and evolved toward enterprise-level capabilities.
This chapter briefly describes the construction of the probing capability during this period. Below is the development history of this system. During the construction of the monitoring platform, internal monitoring collection alone was insufficient to meet enterprise business needs. Before planning APM development, remote probing with black-box monitoring was also incorporated as a subsystem.&lt;/p&gt;</description></item><item><title>Monitoring System Enterprise Architecture Evolution — Cross-Region Hybrid Cloud</title><link>/en/posts/architecture/prometheus-evolution-history-two/</link><pubDate>Mon, 12 Oct 2020 00:00:00 +0000</pubDate><guid>/en/posts/architecture/prometheus-evolution-history-two/</guid><description>&lt;h2 id="recap"&gt;Recap&lt;/h2&gt;
&lt;p&gt;In &amp;ldquo;Monitoring System Enterprise Architecture Evolution — First Steps with Prometheus&amp;rdquo;, the monitoring system had already been upgraded from a single-node architecture to a single &lt;code&gt;IDC&lt;/code&gt; distributed architecture.
The content of the previous article applies to both VM-based and container-based deployments. &lt;code&gt;Prometheus&lt;/code&gt; is a product of the cloud-native era and is commonly used alongside &lt;code&gt;Kubernetes&lt;/code&gt;, but &lt;code&gt;Prometheus&lt;/code&gt; itself can also replace traditional monitoring solutions like &lt;code&gt;Zabbix&lt;/code&gt; in non-&lt;code&gt;Kubernetes&lt;/code&gt; environments.
In this article, we begin to use &lt;code&gt;Kubernetes&lt;/code&gt; deployment to upgrade the entire monitoring system architecture, making it more flexible for cross-region hybrid cloud business scenarios.&lt;/p&gt;</description></item><item><title>Eyes On You: From SRE Principles to Prometheus Monitoring System Implementation</title><link>/en/posts/telemetry/prometheus-first/</link><pubDate>Sat, 20 Jun 2020 00:00:00 +0000</pubDate><guid>/en/posts/telemetry/prometheus-first/</guid><description>&lt;p&gt;In the context of distributed internet services, high concurrency, and multi-cloud deployment, &lt;strong&gt;SRE (Site Reliability Engineering)&lt;/strong&gt; has become a core role in ensuring service availability, and the &lt;strong&gt;monitoring system&lt;/strong&gt; serves as SRE&amp;rsquo;s &amp;ldquo;eyes.&amp;rdquo; This article starts from SRE core principles, deconstructs the pain points of modern monitoring systems, technology stack selection, Prometheus core principles, and alerting best practices, presenting a practical enterprise-grade monitoring system construction methodology.&lt;/p&gt;
&lt;h2 id="sre-core-principles-stability-is-the-1-metric"&gt;SRE Core Principles: Stability is the #1 Metric&lt;/h2&gt;
&lt;p&gt;SRE&amp;rsquo;s core is &lt;strong&gt;ensuring continuous service stability through engineering practices&lt;/strong&gt;, focusing on capacity planning, cluster maintenance, fault tolerance, load balancing, and monitoring system construction. There are only 3 core measurement metrics:&lt;/p&gt;</description></item><item><title>Large Enterprise Email System Architecture Design and Full Mail Flow Analysis</title><link>/en/posts/architecture/mail-system-architecture/</link><pubDate>Wed, 10 Jun 2020 00:00:00 +0000</pubDate><guid>/en/posts/architecture/mail-system-architecture/</guid><description>&lt;p&gt;As enterprise digitalization scales up, large organizations demand extreme capabilities from email systems: &lt;strong&gt;independent deployment, high availability, global interoperability, security protection, and load balancing&lt;/strong&gt;. This article breaks down the practical architecture of a dedicated large enterprise email system, covering overall design, physical/logical deployment, core service systems, and the full send/receive mail flow, providing a reference technical solution for enterprise-level email architecture implementation.&lt;/p&gt;
&lt;h2 id="i-overall-system-architecture-design"&gt;I. Overall System Architecture Design&lt;/h2&gt;
&lt;p&gt;Large enterprise email systems adopt a layered architecture of &lt;strong&gt;&amp;ldquo;frontend gateway layer + load balancing layer + core service layer + backend independent mail system&amp;rdquo;&lt;/strong&gt;, balancing security isolation, traffic scheduling, and business independence. The overall architecture is as follows:&lt;/p&gt;</description></item><item><title>Monitoring System Enterprise Architecture Evolution — First Steps with Prometheus</title><link>/en/posts/architecture/prometheus-evolution-history-one/</link><pubDate>Thu, 12 Dec 2019 00:00:00 +0000</pubDate><guid>/en/posts/architecture/prometheus-evolution-history-one/</guid><description>&lt;p&gt;&lt;code&gt;Prometheus&lt;/code&gt; is an open-source monitoring and time series database system that has gained widespread adoption in recent years.
The official architecture diagram is shown below:
&lt;img src="/posts/architecture/images/prometheus-architecture.svg" alt=""&gt;
This series of articles will gradually understand and deepen various components and concepts through the deployment architecture evolution of &lt;code&gt;Prometheus&lt;/code&gt; in an enterprise.
First, let&amp;rsquo;s get a quick overview of this evolution history through the diagram below:
&lt;img src="/posts/architecture/images/monitoring-system-2019-2020.png" alt=""&gt;&lt;/p&gt;
&lt;h2 id="single-node-architecture"&gt;Single Node Architecture&lt;/h2&gt;
&lt;p&gt;When first getting started with the &lt;code&gt;Prometheus&lt;/code&gt; monitoring system, you only need to deploy the &lt;code&gt;Prometheus&lt;/code&gt; binary on the server side, using the basic file service discovery configuration &lt;code&gt;file_sd_config&lt;/code&gt; to pull metrics from &lt;code&gt;node_exporter&lt;/code&gt; for basic host monitoring.
Then configure the &lt;code&gt;Prometheus&lt;/code&gt; &lt;code&gt;url&lt;/code&gt; address as a &lt;code&gt;datasource&lt;/code&gt; in &lt;code&gt;Grafana&lt;/code&gt; to start viewing monitoring data.&lt;/p&gt;</description></item><item><title>Implementing a Lightweight File Backup System Based on OpenResty</title><link>/en/archives/06-openresty-backup-system/</link><pubDate>Wed, 30 Jan 2019 00:00:00 +0000</pubDate><guid>/en/archives/06-openresty-backup-system/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;There are tools like &lt;strong&gt;filebeat&lt;/strong&gt; for log collection, open-source cloud drives like &lt;strong&gt;seafile&lt;/strong&gt;, and simple distributed file systems like &lt;strong&gt;FastDFS&lt;/strong&gt;, among others. However, the remote backup logs of a certain enterprise SaaS platform still rely on traditional compressed file scp transfers to backup storage.&lt;/p&gt;
&lt;p&gt;Since filebeat&amp;rsquo;s log collection completeness is debatable, open-source cloud drives have cluttered features that are not conducive to management, distributed file systems&amp;rsquo; internal storage logic is not well-suited for the backup log management of the enterprise SaaS platform, and scp transfers pose security risks with private keys deployed on servers, we leveraged OpenResty&amp;rsquo;s features to implement a simple file backup API interface using Lua.&lt;/p&gt;</description></item><item><title>Linux High Availability and Load Balancing in Practice — From Keepalived to Performance Tuning</title><link>/en/archives/04-keepalived-and-haproxy/</link><pubDate>Tue, 19 Jun 2018 00:00:00 +0000</pubDate><guid>/en/archives/04-keepalived-and-haproxy/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In modern enterprise application architectures, high availability and load balancing are key technologies for ensuring stable system operation. This article provides a detailed introduction to achieving dual-machine hot standby with Keepalived, building internal network service load balancing with HAProxy, and resolving NIC soft interrupt issues for network performance optimization. Through real-world cases and detailed configuration explanations, this article helps readers understand the core principles and practical applications of these technologies.&lt;/p&gt;</description></item><item><title>JVM Performance Tuning and Off-Heap Memory Leak Troubleshooting in Practice</title><link>/en/archives/02-jvm-debug/</link><pubDate>Tue, 16 Jan 2018 00:00:00 +0000</pubDate><guid>/en/archives/02-jvm-debug/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;JVM performance tuning and memory issue troubleshooting have always been significant challenges for Java developers. This article starts from the three core goals of GC tuning and combines them with a real-world off-heap memory leak investigation case to provide a systematic approach to performance tuning and practical troubleshooting methods.&lt;/p&gt;
&lt;p&gt;In complex distributed systems, memory issues are often the hardest to diagnose. Off-heap memory leaks in particular, occurring outside the JVM heap, are difficult to detect with conventional GC monitoring tools and can easily cause systems to crash suddenly in production environments. This article shares a complete off-heap memory leak investigation process, hoping to provide valuable reference for readers.&lt;/p&gt;</description></item><item><title>Overseas Email Delivery Acceleration Architecture — Smart Delivery Network in Practice</title><link>/en/archives/07-sdn-oversea/</link><pubDate>Tue, 16 Jan 2018 00:00:00 +0000</pubDate><guid>/en/archives/07-sdn-oversea/</guid><description>&lt;h2 id="introduction-challenges-of-overseas-email-delivery"&gt;Introduction: Challenges of Overseas Email Delivery&lt;/h2&gt;
&lt;p&gt;In globalized business scenarios, email delivery faces numerous challenges. Overseas email delivery must not only overcome network latency issues but also navigate complex geopolitical network environments. Traditional direct overseas delivery methods often encounter connection timeouts, firewall blocking, and high delivery latency. At the same time, interoperability between domestic email systems and overseas networks also presents technical challenges.&lt;/p&gt;
&lt;p&gt;To address these issues, we designed and implemented a Smart Delivery Network (SDN) architecture that effectively improves the efficiency and reliability of overseas email delivery through multi-level proxying, intelligent routing, and load balancing mechanisms.&lt;/p&gt;</description></item><item><title>Advanced Bash Programming Techniques — Handling Message Queue Backlog with the Producer-Consumer Pattern</title><link>/en/archives/08-bash-dev-query/</link><pubDate>Wed, 05 Jul 2017 00:00:00 +0000</pubDate><guid>/en/archives/08-bash-dev-query/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In message system operations, queue backlog is a common and tricky problem. Especially during malicious attacks or system anomalies, the delivery queue may accumulate a large number of messages, severely impacting normal system operation. Traditional single-process processing is not only inefficient but may also cause problems to worsen due to delayed handling.&lt;/p&gt;
&lt;p&gt;This article shares a set of advanced Bash programming techniques based on the producer-consumer pattern. Through core technologies including multi-process concurrency, pipe communication, and efficient awk parsing, we achieve fast and effective handling of message queue backlog issues. This solution has been validated in multiple production environments, capable of improving processing efficiency several times over while ensuring system stability.&lt;/p&gt;</description></item><item><title>About me</title><link>/en/about.html</link><pubDate>Fri, 09 Jun 2017 20:12:52 +0800</pubDate><guid>/en/about.html</guid><description>&lt;h2 id="profile"&gt;Profile&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;I am a engineer with a rich work experience in IT field. I have extensive experience in operations, development and cloud native technologies. I have a passion for observable technologies and cloud native technologies.
I have worked on shell scripts, VBA tools, Python, Lua, Golang, C and Rust. I also have experience in embedded development with Arduino and MicroPython.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I am an experienced IT engineer with a diverse career spanning from operations to development. I am passionate about observability technologies and have deep practical knowledge of cloud-native technologies. My technical journey began with shell scripts, then expanded to VBA tool development, followed by mastering Python, Lua, and in-depth study of Golang and Rust. In addition, I have embedded development experience with Arduino and MicroPython.&lt;/p&gt;</description></item><item><title>Practices and Pitfalls of Dockerizing Enterprise Applications — From Traditional Virtualization to Containerization</title><link>/en/archives/05-docker-enterprise-application/</link><pubDate>Mon, 17 Apr 2017 00:00:00 +0000</pubDate><guid>/en/archives/05-docker-enterprise-application/</guid><description>&lt;h2 id="introduction-why-containerize-enterprise-applications"&gt;Introduction (Why Containerize Enterprise Applications)&lt;/h2&gt;
&lt;p&gt;In the era of cloud computing, the way enterprise applications are deployed and managed is undergoing a profound transformation. While traditional virtualization technology solved the resource isolation problem, it still has many pain points in terms of operational efficiency, resource utilization, and deployment speed. The rise of Docker container technology has provided a brand-new solution for the modernization of enterprise applications.&lt;/p&gt;
&lt;p&gt;This article shares our practical experience in the containerization migration of an enterprise email system, including technology selection, infrastructure construction, the full process of migrating from OpenVZ virtualization to Docker, and various issues encountered in production along with their solutions. Through these practical cases, we hope to provide valuable reference for teams that are currently or planning to undertake containerization migration.&lt;/p&gt;</description></item><item><title>A Simple BBR Test on Linode</title><link>/en/archives/linode-bbr-test/</link><pubDate>Mon, 10 Apr 2017 00:00:00 +0000</pubDate><guid>/en/archives/linode-bbr-test/</guid><description>&lt;h2 id="overview"&gt;Overview:&lt;/h2&gt;
&lt;p&gt;TCP BBR solves two problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fully utilizing bandwidth on network links with some packet loss. Suitable for high-latency, high-bandwidth network links.&lt;/li&gt;
&lt;li&gt;Reducing buffer occupancy on network links, thereby lowering latency. Suitable for users with slow access networks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I remember when BBR was first merged into the Linux 4.9 kernel in 2017, this congestion control algorithm proposed by Google was extremely popular in the tech community. At the time, I was doing cross-border file transfers on Linode, where packet loss was commonplace, so I wanted to test the results firsthand.&lt;/p&gt;</description></item><item><title>Raspberry Pi Docker Cluster</title><link>/en/archives/rasp_pi_docker/</link><pubDate>Wed, 08 Mar 2017 00:00:00 +0000</pubDate><guid>/en/archives/rasp_pi_docker/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;At the time, I was learning Docker cluster management and wanted a low-cost lab environment to experiment with, so I thought of using Raspberry Pis. Following the &lt;a href="http://blog.hypriot.com/"&gt;Hypriot&lt;/a&gt; blog, I bought one Raspberry Pi 2 board and two Raspberry Pi 3 boards. The reasoning was that the Pi 2 was cheaper so it would be the master, and the Pi 3s had better performance for worker nodes — together they made a small cluster.&lt;/p&gt;</description></item><item><title>ARM Board Notes and Experiences</title><link>/en/archives/arm-board-note/</link><pubDate>Mon, 27 Feb 2017 00:00:00 +0000</pubDate><guid>/en/archives/arm-board-note/</guid><description>&lt;h2 id="raspberry-pi"&gt;Raspberry Pi&lt;/h2&gt;
&lt;p&gt;I originally got into Raspberry Pi to set up a Docker cluster environment — mainly because they were cheap and power-efficient. Bought 3 Raspberry Pi 2 boards for around 600+ yuan. Back then, running Docker on ARM was still a novel concept.&lt;/p&gt;
&lt;p&gt;I used Raspberry Pi to build a Docker cluster environment, following the &lt;a href="http://blog.hypriot.com/"&gt;Hypriot&lt;/a&gt; blog.&lt;/p&gt;
&lt;p&gt;&lt;img src="/archives/images/RaspPi_cluster_only.jpg" alt=""&gt;&lt;/p&gt;
&lt;h2 id="cubieboard"&gt;CubieBoard&lt;/h2&gt;
&lt;p&gt;Getting Docker running on ARM was a major challenge back then — official support was poor, community documentation was sparse, and it required a lot of trial and error.&lt;/p&gt;</description></item><item><title>Building a Blog on GitHub</title><link>/en/archives/blog-mickeyzzc-github/</link><pubDate>Sun, 26 Feb 2017 00:00:00 +0000</pubDate><guid>/en/archives/blog-mickeyzzc-github/</guid><description>&lt;h2 id="2023-blog-migration-from-hexo-to-hugo"&gt;2023 Blog Migration from &lt;code&gt;hexo&lt;/code&gt; to &lt;code&gt;hugo&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The main reason was getting tired of hexo taking forever to generate each time, plus the npm package dependency management issues — maintenance was indeed a burden. And hugo, as a static site generator written in Go, is genuinely much faster.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chose &lt;a href="https://gohugo.io/"&gt;hugo&lt;/a&gt; as the tool&lt;/li&gt;
&lt;li&gt;Chose &lt;a href="https://github.com/hugo-next/hugo-theme-next"&gt;Hugo.NexT&lt;/a&gt; as the theme&lt;/li&gt;
&lt;li&gt;Chose &lt;a href="https://www.cloudflare.com"&gt;CloudFlare&lt;/a&gt; for CDN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The migration process was quite a hassle, mainly converting front matter format from YAML to TOML, and the various configuration differences between themes were quite significant, but eventually it all worked out.&lt;/p&gt;</description></item><item><title>Enterprise Mail System Architecture Design and Mail Flow Analysis</title><link>/en/archives/03-mail-system-design/</link><pubDate>Fri, 24 Feb 2017 00:00:00 +0000</pubDate><guid>/en/archives/03-mail-system-design/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In the digital era, email serves as a core communication tool for both internal and external enterprise interactions. Its architecture design directly impacts the stability, security, and performance of mail services. This article explores the three-tier architecture design of enterprise mail systems, provides a detailed analysis of the complete mail receiving and sending processes, and helps readers gain a comprehensive understanding of the technical implementation of modern mail systems.&lt;/p&gt;</description></item><item><title>Monitoring Collection Notes</title><link>/en/posts/telemetry/monitor-experience/</link><pubDate>Mon, 20 Feb 2017 00:00:00 +0000</pubDate><guid>/en/posts/telemetry/monitor-experience/</guid><description>&lt;h2 id="mysql-monitoring"&gt;MySQL Monitoring&lt;/h2&gt;
&lt;h3 id="mysql-privilege-best-practices"&gt;MySQL Privilege Best Practices&lt;/h3&gt;
&lt;p&gt;Privilege control is primarily for security reasons, so follow these best practices:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Grant only the minimum privileges needed to prevent users from doing harm. For example, if a user only needs to query, just grant SELECT privileges, not UPDATE, INSERT, or DELETE.&lt;/li&gt;
&lt;li&gt;Restrict the login host when creating users, typically to a specific IP or internal network IP range.&lt;/li&gt;
&lt;li&gt;Delete users without passwords after initializing the database. The installation automatically creates some users with no passwords by default.&lt;/li&gt;
&lt;li&gt;Set passwords that meet complexity requirements for each user.&lt;/li&gt;
&lt;li&gt;Periodically clean up unnecessary users. Revoke privileges or delete users.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Example:&lt;/p&gt;</description></item><item><title>MySQL Operations in Practice — From Optimization, Monitoring to Disaster Recovery</title><link>/en/archives/01-mysql-ops/</link><pubDate>Sat, 18 Feb 2017 00:00:00 +0000</pubDate><guid>/en/archives/01-mysql-ops/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In the operations and maintenance of business systems, MySQL databases serve as core components whose performance stability and data security are critical. Based on years of hands-on operational experience, this article comprehensively shares practical MySQL database operations knowledge — from performance optimization, monitoring systems, Binlog management, and high-availability deployment to disaster recovery. These insights come from real-world cases across multiple production environments, covering the full technology stack from daily tuning to emergency incident response. We hope this provides valuable reference for database administrators and operations engineers alike.&lt;/p&gt;</description></item><item><title>SSL Certificate Automation Management — Ansible Batch Deployment and Update Practices</title><link>/en/archives/11-ssl-auto/</link><pubDate>Mon, 13 Feb 2017 00:00:00 +0000</pubDate><guid>/en/archives/11-ssl-auto/</guid><description>&lt;p&gt;In modern IT infrastructure management, secure management of SSL certificates has become increasingly important. As the number of services grows and certificate renewal cycles shorten, manual certificate management becomes inefficient and error-prone. This article details how to use Ansible for automated batch deployment and renewal of certificates, improving management efficiency and reducing security risks.&lt;/p&gt;
&lt;h2 id="the-importance-of-ssl-certificate-management"&gt;The Importance of SSL Certificate Management&lt;/h2&gt;
&lt;p&gt;SSL certificates are the foundation of network communication security. They ensure:&lt;/p&gt;</description></item><item><title>Building a Cross-City LAN with Docker</title><link>/en/archives/mi-docker-net/</link><pubDate>Fri, 20 Jan 2017 00:00:00 +0000</pubDate><guid>/en/archives/mi-docker-net/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;At the time, I had servers both at home and at the office and wanted unified management, but the two internal networks were isolated. Traditional port forwarding was too cumbersome, and some services I didn&amp;rsquo;t want exposed to the public internet. After trying several approaches, I found Docker OpenVPN to be the most hassle-free solution.&lt;/p&gt;
&lt;p&gt;I chose Docker OpenVPN over traditional VPN mainly because containerized deployment is extremely convenient, and certificate management is much simpler. The end result was great — I could access various services on the remote internal network via domain names, saving a lot of configuration hassle.&lt;/p&gt;</description></item><item><title>Boosting Development Efficiency — Linux Development Environment Setup Guide</title><link>/en/archives/09-zsh-tmux-vim-git/</link><pubDate>Wed, 07 Dec 2016 00:00:00 +0000</pubDate><guid>/en/archives/09-zsh-tmux-vim-git/</guid><description>&lt;p&gt;In modern software development, having an efficient and convenient development environment can significantly improve productivity. This article provides a detailed guide on setting up a complete development environment on Linux, including configuration and usage of the tmux terminal multiplexer, vim code editor, enhanced zsh shell, and git version control.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Before you begin, make sure your system meets the following minimum requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;tmux&lt;/strong&gt;: version &amp;gt;= 2.1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vim&lt;/strong&gt;: version &amp;gt;= 7.3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zsh&lt;/strong&gt;: oh-my-zsh recommended&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;git&lt;/strong&gt;: latest version&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="1-tmux-terminal-multiplexer-configuration"&gt;1. TMUX Terminal Multiplexer Configuration&lt;/h2&gt;
&lt;p&gt;TMUX is an excellent terminal multiplexer that allows you to create multiple sessions and windows within a single terminal window, making it ideal for developers who need to handle multiple tasks simultaneously.&lt;/p&gt;</description></item><item><title>Complete Distribution of the TCP/IP Protocol Suite in the OSI Model — Understanding Network Protocols at a Glance</title><link>/en/archives/10-tcp-ip-osi/</link><pubDate>Tue, 24 Feb 2015 00:00:00 +0000</pubDate><guid>/en/archives/10-tcp-ip-osi/</guid><description>&lt;p&gt;Network communication is the cornerstone of modern information technology, and understanding how network protocols work is crucial for every developer and system administrator. This article uses the OSI model framework to provide a detailed introduction to the distribution and roles of each protocol in the TCP/IP protocol suite within the network layer hierarchy.&lt;/p&gt;
&lt;h2 id="what-is-the-osi-model"&gt;What is the OSI Model?&lt;/h2&gt;
&lt;p&gt;The OSI (Open Systems Interconnection) model is a conceptual network model that divides the network communication process into seven layers. Although this model is less popular in practice than the TCP/IP model, it is very helpful for understanding how network protocols work.&lt;/p&gt;</description></item></channel></rss>