<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>MoIu Home · Blog</title><description>XiaoMo&apos;s personal site: writing, small games, and browser tools.</description><link>https://www.moiu.cn/</link><language>en</language><item><title>PCL2 Killed Its Minecraft Downloader. Here Is What It Means</title><link>https://www.moiu.cn/en/blog/mc-launcher-download-shutdown/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/mc-launcher-download-shutdown/</guid><description>On October 20, PCL and HMCL both shut down Minecraft downloads in mainland China. The confirmed timeline, the official wording, the rumor, and what it signals.</description><pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate><category>games</category><category>tools</category></item><item><title>Astro 7.4.2 turns a 60-second content sync into under a second by counting bytes differently</title><link>https://www.moiu.cn/en/blog/astro-742-content-sync/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/astro-742-content-sync/</guid><description>On a 44k-entry store, the chunking step drops from about 60 seconds to well under one second with byte-identical output. The fix is not a faster algorithm, but a different way to know how wide a character is.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>Astro</category><category>performance</category><category>meta</category></item><item><title>Bun 1.4.4 ships a formatter: 59 milliseconds on Prettier&apos;s own repo, 286x faster</title><link>https://www.moiu.cn/en/blog/bun-144-fmt/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/bun-144-fmt/</guid><description>bun fmt reads your existing Prettier config and plugins, running 59.7 ms against 17.1 s on Prettier&apos;s own repository, 48 MB against 459 MB. What matters is how it proves identical output: byte comparison plus a semantic re-parse check.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>tools</category><category>performance</category><category>backend</category></item><item><title>The one fix that matters in Deno 2.9.8: it stops trusting the compromised eMudhra root</title><link>https://www.moiu.cn/en/blog/deno-298/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/deno-298/</guid><description>This patch release has 13 fixes, half of them permission and sandbox edges, half Node-compatibility semantics. The eMudhra distrust lines up with what uv and CPython did the same week.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>backend</category><category>tools</category></item><item><title>Electron 45 lands Chromium 156, Node 24.22 and V8 15.6 — and every breaking change sits on a sandbox boundary</title><link>https://www.moiu.cn/en/blog/electron-45/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/electron-45/</guid><description>Three breaking changes: sandboxed preload scripts lose events/timers/url and the Buffer globals, Workers created inside iframes no longer inherit Node integration, and extension pages stop receiving preload scripts unconditionally.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>tools</category><category>performance</category><category>backend</category></item><item><title>Home Assistant 2026.10.3: eighty percent integration fixes, the rest chasing infrastructure</title><link>https://www.moiu.cn/en/blog/home-assistant-2026103/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/home-assistant-2026103/</guid><description>Of roughly thirty changes, most are concrete integration bugs (Proxmox, UniFi Access, Sensibo, KNX, FRITZ!SmartHome and more); the rest are base-layer moves like Python 3.14.8, uv climbing to 0.13.5 and runners on Ubuntu 26.04.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>backend</category><category>tools</category></item><item><title>llama.cpp build 11899: giving multimodal clients an interface to ask what a model supports</title><link>https://www.moiu.cn/en/blog/llama-cpp-b11899/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/llama-cpp-b11899/</guid><description>b11899 is a nightly build whose only substantive change adds mtmd_helper_get_capabilities, reporting audio_stream, speaker reference and text generation while keeping the old API. The build number itself tells you how this project ships.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>tools</category><category>backend</category><category>performance</category></item><item><title>Node ships three security releases in one day: 11 CVEs, five high, two in tls and one in dns</title><link>https://www.moiu.cn/en/blog/node-26121-security/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/node-26121-security/</guid><description>On October 21 Node released 26.12.1, 24.22.1 and 22.23.4 together, fixing 11 CVEs. The high-severity ones cluster in tls and dns input parsing, alongside two permission-model edge cases and a root store bump to NSS 3.131.1.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>backend</category><category>vulnerability</category></item><item><title>Ollama 0.40.11 starts talking: local speech on macOS plus decision models that only answer yes, no or a score</title><link>https://www.moiu.cn/en/blog/ollama-04011-speech/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/ollama-04011-speech/</guid><description>Two unrelated additions: ollama run speaks on macOS while generating, exposing an OpenAI-compatible /v1/audio/speech; and the d3 family of decision models built for classification, judgments and probability scoring.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>tools</category><category>backend</category></item><item><title>Redis patches three lines at once: propagating a 4GB+ message over the cluster bus overflows the heap</title><link>https://www.moiu.cn/en/blog/redis-8103-cluster/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/redis-8103-cluster/</guid><description>8.10.3, 8.8.4 and 8.6.8 fix the same bug: in cluster mode, propagating a PUBLISH or SPUBLISH message larger than 4GB over the cluster bus overflows a heap buffer. Narrow impact, but the trigger conditions are worth remembering.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>backend</category><category>vulnerability</category></item><item><title>Ruff 0.17.2 adds a preview rule against repeated regex compilation, plus a batch of false-positive fixes</title><link>https://www.moiu.cn/en/blog/ruff-0172/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/ruff-0172/</guid><description>Mostly false positives: starred type variable constraints, backslash-escaped args in pydocstyle, star elements in pylint. It also marks comment-deleting fixes unsafe and lands two performance changes.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>tools</category><category>performance</category><category>backend</category></item><item><title>Traefik 3.7.16: ForwardAuth finally speaks NTLM and Kerberos, plus one CVE</title><link>https://www.moiu.cn/en/blog/traefik-3716/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/traefik-3716/</guid><description>Two things in this patch: a fix for GHSA-hrpp-p4fc-wwf8, and NTLM/Kerberos support in ForwardAuth and ingress-nginx auth-url. The latter fixes the long-standing &quot;corporate SSO behind a gateway never authenticates&quot; problem.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>backend</category><category>security</category><category>tools</category></item><item><title>TypeScript 7.1 Beta: ambient modules can finally declare import attributes, and --target reaches es2026</title><link>https://www.moiu.cn/en/blog/typescript-71-beta/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/typescript-71-beta/</guid><description>The beta has six sections: import attributes in ambient modules, source phase imports, --target es2026, new library methods, the 7.1 API (snapshots, file system, content mappers) and a few behavioral changes.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>tools</category><category>backend</category><category>performance</category></item><item><title>uv 0.13.5 drops the compromised root and moves managed CPython onto three security patches</title><link>https://www.moiu.cn/en/blog/uv-0135-cpython/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/uv-0135-cpython/</guid><description>0.13.4 removed the eMudhra/emSign root from uv&apos;s own certificate store; 0.13.5 rebuilds managed CPython 3.11+ on python-build-standalone 20261021, with 3.15.1, 3.14.9, 3.13.17, pip 26.2.2 and certifi 2026.10.19. Run uv python upgrade afterwards.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>backend</category><category>security</category><category>tools</category></item><item><title>Half of Vite 8.3.5&apos;s fixes live in bundled-dev: bundling during dev is still catching up</title><link>https://www.moiu.cn/en/blog/vite-835/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/vite-835/</guid><description>Eight of 21 fixes carry the bundled-dev prefix — HMR propagation, error stack mapping, server.origin, import.meta.env injection — plus two chunk import map correctness fixes and a CSS percent-sign build failure.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>performance</category><category>tools</category><category>meta</category></item><item><title>Vue 3.6&apos;s 13th release candidate: seven of eight fixes live in the Vapor compiler</title><link>https://www.moiu.cn/en/blog/vue-36-rc13-vapor/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/vue-36-rc13-vapor/</guid><description>Almost everything in 3.6.0-rc.13 points at compiler-vapor, plus one change that restores the 200ms default delay for async components. The first says Vapor is still catching up on semantics; the second says defaults are API.</description><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><category>Vue</category><category>performance</category><category>meta</category></item><item><title>BeyondTrust Remote Support auth bypass is exploited in the wild, CISA adds it to KEV</title><link>https://www.moiu.cn/en/blog/beyondtrust-cve-2026-102764/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/beyondtrust-cve-2026-102764/</guid><description>CVE-2026-102764 is an auth bypass in BeyondTrust Remote Support up to 26.2.3, added to CISA KEV on October 16. Blast radius, patch path and what to hunt.</description><pubDate>Fri, 23 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>Python 3.15 lands: UTF-8 by default, frozendict built in, a slightly faster JIT</title><link>https://www.moiu.cn/en/blog/python-315/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/python-315/</guid><description>Python 3.15.0 shipped on October 9 with 5,643 commits from 1,012 contributors. What UTF-8 defaults, lazy imports, frozendict and the JIT change for you.</description><pubDate>Fri, 23 Oct 2026 00:00:00 GMT</pubDate><category>backend</category><category>performance</category><category>tools</category></item><item><title>Safari TP 254 brings calc-size(), size shorthands and live pinch-to-zoom</title><link>https://www.moiu.cn/en/blog/safari-tp-254/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/safari-tp-254/</guid><description>Safari Technology Preview 254 adds calc-size(), size and per-side radius shorthands, plus live pinch-to-zoom on macOS. What changes in your CSS.</description><pubDate>Fri, 23 Oct 2026 00:00:00 GMT</pubDate><category>CSS</category><category>performance</category></item><item><title>Servo 0.6 turns CSS Grid on by default, and a lot of sites finally line up</title><link>https://www.moiu.cn/en/blog/servo-css-grid/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/servo-css-grid/</guid><description>Servo 0.6.0 ships August&apos;s 417 commits and turns CSS Grid on by default. What in the release notes actually changes how pages render.</description><pubDate>Fri, 23 Oct 2026 00:00:00 GMT</pubDate><category>CSS</category><category>performance</category></item><item><title>Zig 0.17: the grammar starts to freeze and the build system splits in two</title><link>https://www.moiu.cn/en/blog/zig-017/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/zig-017/</guid><description>Zig 0.17.0 shipped on October 2 after five months, 206 contributors and 925 commits: syntax breaks, stdlib renames and the build-system split.</description><pubDate>Fri, 23 Oct 2026 00:00:00 GMT</pubDate><category>performance</category><category>tools</category><category>backend</category></item><item><title>Three hours of Cloudflare 5xx: how one config change took down half the web</title><link>https://www.moiu.cn/en/blog/cloudflare-outage/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/cloudflare-outage/</guid><description>On November 18, 2025, Cloudflare&apos;s core proxy returned 5xx for about three hours and a large share of the web went down with it. The postmortem points at an internal configuration change, not an attack — and the blast radius is the lesson.</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate><category>performance</category><category>meta</category></item><item><title>CSS has if() now: conditional styles without stacking media queries</title><link>https://www.moiu.cn/en/blog/css-if-function/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/css-if-function/</guid><description>Chrome 137 shipped the CSS if() function, which lets any property value branch on a custom property, a media query or feature support. It does not replace media queries, but it collapses a lot of duplicated blocks.</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate><category>CSS</category><category>design</category></item><item><title>MCP Inspector&apos;s 9.4: a dev tool that runs commands should not listen on 0.0.0.0</title><link>https://www.moiu.cn/en/blog/mcp-inspector-cve/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/mcp-inspector-cve/</guid><description>Before 0.14.1, MCP Inspector had no authentication between its browser UI and its local proxy, so an unauthenticated request could launch MCP commands over stdio. CVSS 9.4 — and the lesson applies to every local-proxy dev tool.</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>Node.js 24 is LTS: Krypton runs to 2028, and here is what changes</title><link>https://www.moiu.cn/en/blog/nodejs-24-lts/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/nodejs-24-lts/</guid><description>Node.js 24 became LTS on October 28, 2025 under the codename Krypton, supported until April 2028. V8 13.6, npm 11, a stable permission model and require(esm) by default — plus the rough edges to know before upgrading.</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate><category>backend</category><category>tools</category></item><item><title>PHP&apos;s two 9.2 RCEs: the official root causes, and what the public PoC actually demonstrates</title><link>https://www.moiu.cn/en/blog/php2shell-poc/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/php2shell-poc/</guid><description>On October 21 PHP fixed CVE-2026-109618 and CVE-2026-109619 (CVSS 9.2); a public PoC with a full lab appeared the next day. Here are the longjmp and stale-global-state root causes, a reproducible lab, the PoC, and where the PoC diverges from the advisory.</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category><category>backend</category></item><item><title>PostgreSQL 18: async I/O, uuidv7, and an upgrade path that hurts less</title><link>https://www.moiu.cn/en/blog/postgresql-18/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/postgresql-18/</guid><description>PostgreSQL 18 shipped in September 2025 with a new asynchronous I/O subsystem (up to 3x on reads), uuidv7() in core, virtual generated columns and OAuth 2.0 authentication. Here is what actually matters.</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate><category>backend</category></item><item><title>The CVSS 10.0 React bug: one request, code execution on your server</title><link>https://www.moiu.cn/en/blog/react-server-components-rce/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/react-server-components-rce/</guid><description>A flaw in how React Server Components decode payloads earned a perfect 10.0 — unauthenticated remote code execution. Here is who is affected, how to check, and what to do about it.</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>A retargeted tag: twenty thousand repos leaked secrets into build logs</title><link>https://www.moiu.cn/en/blog/tj-actions-supply-chain/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/tj-actions-supply-chain/</guid><description>In March 2025 the version tags of tj-actions/changed-files were pointed at a malicious commit, and CI tokens were printed into workflow logs. CVE-2025-30066 is the bill for mutable tags.</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>TLS certificates are heading to 47 days: automation is no longer optional</title><link>https://www.moiu.cn/en/blog/tls-47-day-certs/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/tls-47-day-certs/</guid><description>CA/Browser Forum ballot SC-081 caps certificate lifetimes at 200 days from March 2026, 100 days from 2027, and 47 days from 2029. Manual renewal has a deadline now.</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>backend</category></item><item><title>What a CVSS 4.0 score of 9.2 says, and the three things it does not</title><link>https://www.moiu.cn/en/blog/cvss-v4-reading-a-9-2/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/cvss-v4-reading-a-9-2/</guid><description>Both PHP vulnerabilities today are rated CVSS v4.0 9.2. That number is a filter, not a priority: it measures the vulnerability, not your assets, your exposure, or the cost of patching.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>Eight intermediate CA private keys that were all integers below 256</title><link>https://www.moiu.cn/en/blog/emudhra-eight-intermediate-keys/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/emudhra-eight-intermediate-keys/</guid><description>Someone scanned the CCADB certificate corpus and found that eight eMudhra intermediate CA keys could simply be enumerated — they were generated as integers between 0 and 255. Yesterday Mozilla decided to remove trust in emSign ECC Root CA - G3.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>PHP ships two 9.2 fixes today at 14:00 UTC: what to do before then</title><link>https://www.moiu.cn/en/blog/php-critical-release-2026-10-21/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/php-critical-release-2026-10-21/</guid><description>PHP posted an advance notice on 20 October: a security release on 21 October at 14:00 UTC fixes two vulnerabilities, both rated CVSS v4.0 9.2. Details come with the release, but your rollback plan can be settled now.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category><category>backend</category></item><item><title>Twelve PHP CVEs in three days, none of them in PHP</title><link>https://www.moiu.cn/en/blog/php-cves-are-not-in-php/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/php-cves-are-not-in-php/</guid><description>I pulled every PHP-related advisory NVD published between 19 and 21 October. All twelve are plugins, CMS modules and libraries. That is the more useful signal: your real inventory is not the language.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>backend</category></item><item><title>Ten open-source games, 48 MB: what self-hosting third-party games actually costs</title><link>https://www.moiu.cn/en/blog/self-hosting-open-source-games/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/self-hosting-open-source-games/</guid><description>I vendored ten MIT/public-domain HTML5 games into this static site — 48.4 MB in total. The work was not copying files; it was licences, size, and the fact that all of them loaded things from CDNs.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><category>games</category><category>meta</category><category>performance</category></item><item><title>When a 3D scene should actually start loading</title><link>https://www.moiu.cn/en/blog/scene-webgl-lifecycle/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/scene-webgl-lifecycle/</guid><description>Fourteen Three.js scenes on one site is not a rendering problem, it is a scheduling problem. Two gates, one SPA navigation bug, and the WebGL context I forgot to release.</description><pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate><category>Astro</category><category>performance</category></item><item><title>CVE-2026-99999: the IPv4 checksum bug that can escape a VM</title><link>https://www.moiu.cn/en/blog/cve-2026-99999-debian/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/cve-2026-99999-debian/</guid><description>Debian security tracker lists CVE-2026-99999 as a missing IPv4 checksum check in the Linux kernel, exploitable from a guest to the KVM host. Fixed in 6.1.190-1 (bookworm) and 6.12.113-1 (trixie).</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><category>vulnerability</category><category>debian</category><category>security</category></item><item><title>Reading DeepSeek official charts: what V4.1 Flash-1017 actually improves</title><link>https://www.moiu.cn/en/blog/deepseek-v4-1-flash-1017/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/deepseek-v4-1-flash-1017/</guid><description>I pulled the benchmark table, the performance-cost chart and the case images from DeepSeek&apos;s official changelog. The update is about doing work, not about being smarter — and the price did not change.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><category>llm</category><category>performance</category></item><item><title>Klotski: write the rules before the animation</title><link>https://www.moiu.cn/en/blog/klotski-as-data/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/klotski-as-data/</guid><description>Sliding puzzles are not hard because of the board, but because of &quot;can this piece move&quot;. Flatten 4x5 into occupancy, get the check in three lines, and use BFS instead of A*.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>games</category></item><item><title>873 bugs, 54 models: notes on the 2026 LLM security report</title><link>https://www.moiu.cn/en/blog/cert-2026-llm-security-report/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/cert-2026-llm-security-report/</guid><description>2,467 white hats tested 54 LLM and agent products from 25 vendors and found 873 vulnerabilities, 608 of them LLM-specific. Prompt injection still ranks first; a hardcoded API key exposed keys for 239 models at once.</description><pubDate>Sun, 18 Oct 2026 00:00:00 GMT</pubDate><category>llm</category><category>security</category><category>vulnerability</category></item><item><title>Next.js October patch: three holes, two of them remote code execution</title><link>https://www.moiu.cn/en/blog/nextjs-react-oct-2026-rce/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/nextjs-react-oct-2026-rce/</guid><description>In mid-October Next.js and React shipped three vulnerabilities: an image-processing RCE, a use cache RCE and a Server Action denial of service. The patches are out of band — do not wait for the next minor version.</description><pubDate>Sun, 18 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category><category>web</category></item><item><title>Pipe puzzles: guarantee the map is solvable</title><link>https://www.moiu.cn/en/blog/pipes-spanning-tree/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/pipes-spanning-tree/</guid><description>Random pipe orientations mostly produce unsolvable boards. Generate a spanning tree first, then rotate every cell — solvability comes from the construction, not from a check.</description><pubDate>Sun, 18 Oct 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>games</category></item><item><title>An agent identity is more dangerous than its capability</title><link>https://www.moiu.cn/en/blog/agent-identity-abuse-2026/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/agent-identity-abuse-2026/</guid><description>In the LLM security report, agent identity and permission abuse plus goal hijacking account for two categories. Delegation chains, memory defects and forged tool responses can give a low-privilege agent high-privilege credentials.</description><pubDate>Sat, 17 Oct 2026 00:00:00 GMT</pubDate><category>llm</category><category>security</category><category>agents</category></item><item><title>Halftone dots and misregistration in CSS</title><link>https://www.moiu.cn/en/blog/css-halftone/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/css-halftone/</guid><description>Print texture is not a filter. It is three measurable things: dot angle, ink offset, and opacity. Build them with gradients and masks, no images involved.</description><pubDate>Sat, 17 Oct 2026 00:00:00 GMT</pubDate><category>CSS</category><category>design</category></item><item><title>Prompt injection is still number one, because we still treat data as instructions</title><link>https://www.moiu.cn/en/blog/prompt-injection-2026/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/prompt-injection-2026/</guid><description>In the 2026 LLM security report, prompt injection remains the most common finding. It is hard to fix not because models are dumb, but because systems lack a boundary between data and instructions.</description><pubDate>Sat, 17 Oct 2026 00:00:00 GMT</pubDate><category>llm</category><category>security</category></item><item><title>PwnEscape and agent sandboxes: a microVM is not an absolute boundary</title><link>https://www.moiu.cn/en/blog/agent-sandbox-escape-pwnescape/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/agent-sandbox-escape-pwnescape/</guid><description>PwnEscape exploits an L2/L3 offset mismatch in virtio-net/TAP to reach the KVM host from a guest, tracked as CVE-2026-99999. It is a reminder that isolating untrusted code in a microVM assumes the host kernel has no reachable path from the guest.</description><pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate><category>vulnerability</category><category>llm</category><category>agents</category></item><item><title>239 model keys behind one hardcoded variable</title><link>https://www.moiu.cn/en/blog/llm-api-key-leak-2026/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/llm-api-key-leak-2026/</guid><description>The sharpest example in the LLM security report: a product hardcoded cloud API keys for 239 models in its frontend. Key leaks are not new, but LLMs amplify them — one key is a whole fleet of models and a bill.</description><pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate><category>llm</category><category>security</category></item><item><title>Search on a bilingual static site: the Pagefind trade-offs</title><link>https://www.moiu.cn/en/blog/pagefind-bilingual/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/pagefind-bilingual/</guid><description>A static site has no backend, so search has to be baked in at build time. Pagefind fits, even though it does not stem Chinese and prints a warning every build — neither is a bug.</description><pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate><category>meta</category><category>performance</category></item><item><title>How a CDN puts your content next door</title><link>https://www.moiu.cn/en/blog/cdn-edge/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/cdn-edge/</guid><description>A site hosted in Virginia can serve you images from a machine in your own city. This covers the three jobs of a CDN, why cache hit ratio is the only metric that really matters, what else edge nodes do, and why CDNs fight to get into internet exchanges.</description><pubDate>Thu, 15 Oct 2026 00:00:00 GMT</pubDate><category>networking</category><category>performance</category><category>CDN</category></item><item><title>Three ways classical cipher tools go quietly wrong</title><link>https://www.moiu.cn/en/blog/classical-ciphers/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/classical-ciphers/</guid><description>Caesar, Vigenere and Atbash all look like table lookups, but case handling, non-letter characters and key alignment each fail silently when done wrong.</description><pubDate>Thu, 15 Oct 2026 00:00:00 GMT</pubDate><category>tools</category><category>security</category></item><item><title>Where a data center&apos;s power comes from</title><link>https://www.moiu.cn/en/blog/data-center-power/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/data-center-power/</guid><description>The thing a data center fears is not downtime, it is a blackout. This covers the full chain from the utility feed to the rack, the three UPS topologies, why a diesel generator must carry load within ten seconds, and how the PUE number gets gamed.</description><pubDate>Thu, 15 Oct 2026 00:00:00 GMT</pubDate><category>infrastructure</category><category>hardware</category></item><item><title>Debian DSA-6045: a poisoned resolver can also break DNSSEC</title><link>https://www.moiu.cn/en/blog/debian-dsa-6045-pdns-recursor/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/debian-dsa-6045-pdns-recursor/</guid><description>Debian issued DSA-6045-1 for pdns-recursor, fixing CVE-2026-52690 and related issues. An attacker can forge answers so the resolver marks an authoritative server as EDNS-incapable, which makes DNSSEC validation fail.</description><pubDate>Thu, 15 Oct 2026 00:00:00 GMT</pubDate><category>debian</category><category>vulnerability</category><category>security</category></item><item><title>NTP and time sync: the internet&apos;s heartbeat</title><link>https://www.moiu.cn/en/blog/network-time-sync/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/network-time-sync/</guid><description>How far apart can two clocks be before things break? This covers how NTP derives an offset from four timestamps, why stratum measures distance rather than accuracy, why leap seconds are so awkward, and what happens when time gets poisoned.</description><pubDate>Thu, 15 Oct 2026 00:00:00 GMT</pubDate><category>networking</category><category>infrastructure</category></item><item><title>Photolithography: printing circuits onto silicon</title><link>https://www.moiu.cn/en/blog/photolithography/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/photolithography/</guid><description>The smallest features on a modern chip are a few nanometres across, smaller than most viruses. They are not carved but printed with light. This covers the four-step cycle, the Rayleigh criterion, the multi-patterning era, and why EUV is so hard.</description><pubDate>Thu, 15 Oct 2026 00:00:00 GMT</pubDate><category>infrastructure</category><category>hardware</category></item><item><title>HTTP/3 and QUIC: routing around TCP</title><link>https://www.moiu.cn/en/blog/quic-http3/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/quic-http3/</guid><description>HTTP/3 is the first HTTP that does not run on TCP. This covers where TCP head-of-line blocking actually hurts, what QUIC moved into user space, how connection migration works, and what the switch costs.</description><pubDate>Thu, 15 Oct 2026 00:00:00 GMT</pubDate><category>networking</category><category>performance</category></item><item><title>Undersea Cables: The Physical Backbone of the Internet</title><link>https://www.moiu.cn/en/blog/undersea-cables/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/undersea-cables/</guid><description>Every overseas site you open probably travels through a glass fibre on the ocean floor. This is how submarine cables are built, how fragile they are, who lays them, and why satellites cannot replace them.</description><pubDate>Thu, 15 Oct 2026 00:00:00 GMT</pubDate><category>networking</category><category>infrastructure</category></item><item><title>Cooling Data Centers: From Blowing Air to Taking a Bath</title><link>https://www.moiu.cn/en/blog/data-center-cooling/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/data-center-cooling/</guid><description>AI racks have outgrown air cooling. Here is why data centers are switching cooling methods, and what air, direct-to-chip liquid and immersion cooling each cost.</description><pubDate>Wed, 14 Oct 2026 00:00:00 GMT</pubDate><category>infrastructure</category><category>performance</category></item><item><title>GEO manipulation: when model answers are decided by search ranking</title><link>https://www.moiu.cn/en/blog/geo-manipulation-ai-search/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/geo-manipulation-ai-search/</guid><description>When DeepSeek opened its search API it mentioned filtering SEO spam, GEO manipulation and low-quality AIGC. GEO optimizes the probability of being cited by a model, not a page rank. Here is how it works and why it is hard to defend.</description><pubDate>Wed, 14 Oct 2026 00:00:00 GMT</pubDate><category>llm</category><category>security</category></item><item><title>Low-Earth-Orbit Satellite Internet: Moving the Base Station Into the Sky</title><link>https://www.moiu.cn/en/blog/satellite-internet/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/satellite-internet/</guid><description>Starlink has passed eleven thousand satellites in orbit. LEO constellations cut latency to tens of milliseconds, and bring orbital debris, astronomy and capacity economics along with them.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><category>networking</category><category>infrastructure</category></item><item><title>Upgrading to Astro 7: the Rust compiler is fast, the cold cache is what bit me</title><link>https://www.moiu.cn/en/blog/astro-7-upgrade/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/astro-7-upgrade/</guid><description>Astro 7 moved the compiler and the Markdown pipeline to Rust and switched the bundler to Rolldown. The upgrade was quick; the failures it surfaced afterwards were not.</description><pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate><category>Astro</category><category>performance</category><category>meta</category></item><item><title>CSS is getting functions and conditionals: @function and if()</title><link>https://www.moiu.cn/en/blog/css-functions-and-conditionals/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/css-functions-and-conditionals/</guid><description>Two new pieces of CSS — custom functions and inline conditionals — remove the copy-paste that every component accumulates. Neither is Baseline yet, but both are worth reading early.</description><pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate><category>CSS</category><category>design</category></item><item><title>HTTP finally has a safe method with a body: QUERY</title><link>https://www.moiu.cn/en/blog/http-query-method/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/http-query-method/</guid><description>GET cannot carry a body and POST cannot be retried safely, so query endpoints have been stuck between two wrong options for twenty years. The IETF QUERY draft adds a third: safe, idempotent, and able to carry content.</description><pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate><category>backend</category><category>meta</category></item><item><title>Internet Exchange Points: Where Traffic Changes Hands</title><link>https://www.moiu.cn/en/blog/internet-exchange/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/internet-exchange/</guid><description>Your packets leave your home line, cross a few networks, and change hands at an exchange point. Here is what an IXP is, how peering differs from transit, and why exchanges set bandwidth prices.</description><pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate><category>networking</category><category>infrastructure</category></item><item><title>No-guess Minesweeper: making every board solvable by reasoning alone</title><link>https://www.moiu.cn/en/blog/no-guess-minesweeper/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/no-guess-minesweeper/</guid><description>The worst part of Minesweeper is not hitting a mine, it is hitting one that could only be avoided by luck. Here is how a generator guarantees the whole board is deducible.</description><pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>games</category></item><item><title>Post-quantum TLS is already in your handshake, but it only solves half the problem</title><link>https://www.moiu.cn/en/blog/post-quantum-tls/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/post-quantum-tls/</guid><description>Browsers and CDNs now negotiate hybrid key exchange like X25519MLKEM768 by default, which closes the harvest-now-decrypt-later gap. The signature half is still open.</description><pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>backend</category></item><item><title>text-box-trim is usable now: cut the dead space around headings</title><link>https://www.moiu.cn/en/blog/text-box-trim/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/text-box-trim/</guid><description>Line boxes are always taller than the glyphs, so that half-leading above a heading used to be fixed with negative margins. text-box-trim does it properly.</description><pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate><category>CSS</category><category>design</category></item><item><title>Ninth Circuit: AI-generated code is not a &quot;copy&quot; under the DMCA</title><link>https://www.moiu.cn/en/blog/doe-v-github-dmca-1202/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/doe-v-github-dmca-1202/</guid><description>On 16 September 2026 the Ninth Circuit affirmed dismissal of the Section 1202 DMCA claims in Doe v. GitHub, holding that generative AI outputs are not copies under that section.</description><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>tools</category></item><item><title>MCP 2026-07-28: delete the session, make the protocol stateless again</title><link>https://www.moiu.cn/en/blog/mcp-stateless-core/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/mcp-stateless-core/</guid><description>The new MCP revision removes the initialize handshake and the Mcp-Session-Id header, and turns cross-call state into explicit server-minted handles. What changed, why, and what it means for an existing server implementation.</description><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><category>backend</category><category>security</category></item><item><title>Node.js 26 is LTS: do not let a platform schedule your upgrade</title><link>https://www.moiu.cn/en/blog/node-26-lts/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/node-26-lts/</guid><description>Node.js 26 was confirmed as LTS on 6 October, with 26.11.0 and 26.11.1 following on 7 October — while Node.js 20 keeps disappearing from hosting platforms.</description><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><category>backend</category><category>tools</category></item><item><title>Artex goes closed source: what an author can do when a security tool is abused</title><link>https://www.moiu.cn/en/blog/artex-closed-source/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/artex-closed-source/</guid><description>An AI-driven pentest tool was linked to data breaches at Korean banks; its author stopped development and closed the source. The responsibility boundary for open security tooling is on the table again.</description><pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>GhostAction: pushing a malicious workflow into tens of thousands of repos</title><link>https://www.moiu.cn/en/blog/ghostaction-actions-secrets/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/ghostaction-actions-secrets/</guid><description>Attackers hijacked maintainer accounts and injected GitHub Actions workflows disguised as security audits that scrape credentials out of the entire git history. By 9 October, 500+ accounts and tens of thousands of repos were involved.</description><pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>tools</category></item><item><title>Harness buys Augment Code: AI coding tools start to consolidate</title><link>https://www.moiu.cn/en/blog/harness-augment-cosmos/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/harness-augment-cosmos/</guid><description>Harness acquired Augment Code assets including Cosmos, a platform that coordinates multiple agents, plus the Auggie CLI and the Code Context Engine, folding AI coding into the delivery pipeline.</description><pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate><category>tools</category><category>backend</category></item><item><title>PostgreSQL 19: REPACK, WAIT, and a planner you can finally argue with</title><link>https://www.moiu.cn/en/blog/postgres-19/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/postgres-19/</guid><description>PostgreSQL 19 merges VACUUM FULL and CLUSTER into REPACK, adds a WAIT command for catching a standby up, and ships two extensions that pin planner decisions. The features I actually care about, plus three incompatibilities that bite.</description><pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate><category>backend</category><category>performance</category></item><item><title>Jensen Huang dancing like Michael Jackson: when a hit video needs no truth</title><link>https://www.moiu.cn/en/blog/ai-video-authenticity/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/ai-video-authenticity/</guid><description>An 86-second AI edit of &quot;Jensen Huang world tour&quot; went viral at home and abroad, and Musk joined in. It is funny, and it makes &quot;is this video real&quot; an everyday question.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><category>tools</category><category>security</category></item><item><title>Chrome 155: JPEG XL is back, and post-quantum lands in Web Crypto</title><link>https://www.moiu.cn/en/blog/chrome-155-jpeg-xl/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/chrome-155-jpeg-xl/</guid><description>Chrome 155 decodes JPEG XL directly through jxl-rs, a Rust decoder, and adds ML-KEM and ML-DSA to the Web Crypto API.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><category>CSS</category><category>performance</category><category>security</category></item><item><title>A poisoned npm release: what one postinstall can carry away</title><link>https://www.moiu.cn/en/blog/npm-shai-hulud-tensorlake/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/npm-shai-hulud-tensorlake/</guid><description>In October 2026, tensorlake 0.5.144 shipped a Shai-Hulud credential-stealing worm aimed at npm, GitHub, cloud and AI credentials. The bar for a supply-chain attack is now one compromised account.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category><category>tools</category></item><item><title>Rust 1.96&apos;s Range types: taking Copy back from Iterator</title><link>https://www.moiu.cn/en/blog/rust-196-range-types/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/rust-196-range-types/</guid><description>Range was never Copy because it implements Iterator itself. Rust 1.96 stabilised a new family of range types that implement only IntoIterator, which makes them Copy. Why the distinction matters, and when the familiar syntax changes.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><category>Rust</category><category>algorithms</category></item><item><title>An AI agent chained two zero-days: the seconds that took down DIVD</title><link>https://www.moiu.cn/en/blog/ai-agent-zammad-zero-day/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/ai-agent-zammad-zero-day/</guid><description>An autonomous AI agent chained two Zammad zero-days into a full attack path and took over DIVD, an organisation whose job is coordinating vulnerability disclosure.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>SQLite 3.53: a WAL corruption fix, and a proper table for the CLI</title><link>https://www.moiu.cn/en/blog/sqlite-353/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/sqlite-353/</guid><description>SQLite 3.53 fixes a WAL-reset corruption bug, adds the Query Result Formatter library, lets ALTER TABLE add and drop constraints, and introduces REINDEX EXPRESSIONS. That last one is the tool for repairing stale expression indexes.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><category>tools</category><category>backend</category></item><item><title>Wikipedia names rogue agents: after millions of requests</title><link>https://www.moiu.cn/en/blog/wikimedia-rogue-agents/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/wikimedia-rogue-agents/</guid><description>The Wikimedia Foundation publicly accused unauthorised OpenAI agents of millions of requests, questionable edits and tool tampering, possibly worsening a rare service disruption.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><category>performance</category><category>backend</category></item><item><title>Putting a Three.js island inside a static site</title><link>https://www.moiu.cn/en/blog/aether-isle/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/aether-isle/</guid><description>The isle page downloads only its own script. The scene is computed at runtime, Three.js stays in that page&apos;s chunk, and the first HTML response carries an empty stage.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><category>meta</category><category>Astro</category><category>performance</category><category>design</category></item><item><title>GLPI template-injection RCE: why admin rights should not equal root</title><link>https://www.moiu.cn/en/blog/cve-2026-26026-glpi-rce/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/cve-2026-26026-glpi-rce/</guid><description>CVE-2026-26026 lets a GLPI administrator reach arbitrary command execution on the server by editing a template. CVSS 9.1. The interesting part is not the attack chain but the assumption it exposes: why should the person with the admin console be able to run system commands?</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>Morse code: one table, two ambiguities, three details</title><link>https://www.moiu.cn/en/blog/morse-code/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/morse-code/</guid><description>Morse itself is trivial; the trouble is in the details — who owns the space, how to normalise full-width dots, and how long one unit actually is.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><category>tools</category><category>algorithms</category></item><item><title>An opponent that predicts the bounce, but not too well</title><link>https://www.moiu.cn/en/blog/pong-ai/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/pong-ai/</guid><description>A Pong opponent worth playing needs two things: an accurate prediction of where the ball lands, and a deliberate error. The first is one triangle wave; the second is redrawn on every return.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><category>games</category><category>algorithms</category></item><item><title>Volume without a modelling tool: triangulating an island by hand</title><link>https://www.moiu.cn/en/blog/procedural-island/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/procedural-island/</guid><description>The rock on this island is not exported from a modelling tool. It is five irregular rings stitched together at runtime, and vertex colours plus flat shading are enough to make it read as stone.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><category>meta</category><category>design</category></item><item><title>Twelve hundred instances: squeezing a garden into a few draw calls</title><link>https://www.moiu.cn/en/blog/three-instancing/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/three-instancing/</guid><description>Six hundred blades of grass, a hundred and twenty flowers, eighty-five mossy stones, forty-two shrubs. Density comes from InstancedMesh, not from cutting the count.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><category>performance</category><category>meta</category></item><item><title>Lighting one scene: three lamps and a shadow map computed once</title><link>https://www.moiu.cn/en/blog/three-lighting/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/three-lighting/</guid><description>A hemisphere light for ambience, a key light for direction and shadow, a rim light to pull the island off the background — and seven point lights that only add glow.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><category>design</category><category>meta</category></item><item><title>Water from two shaders: a pool, a stream and a waterfall</title><link>https://www.moiu.cn/en/blog/three-water-shader/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/three-water-shader/</guid><description>There is no water simulation on the island and no reflections. Two ShaderMaterials cover all of it, one lying flat and one falling, sharing a single time and night uniform.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><category>meta</category><category>design</category></item><item><title>The loading budget for 3D: split the chunk, load on visibility, know when to stop</title><link>https://www.moiu.cn/en/blog/webgl-loading-budget/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/webgl-loading-budget/</guid><description>A 3D page pays three costs — download, first-frame compilation, per-frame drawing. Each needs its own budget, and any one of them can turn good-looking into janky.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><category>performance</category><category>meta</category><category>Astro</category></item><item><title>sibling-index() and sibling-count(): CSS finally knows which one it is</title><link>https://www.moiu.cn/en/blog/sibling-count-index/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/sibling-count-index/</guid><description>Firefox 154 brings these two functions to Baseline. They return the current element&apos;s position among its siblings and the total sibling count, so staggered animation, ordered colours, and even sizing can be computed in CSS instead of an inline variable per element.</description><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><category>CSS</category><category>design</category></item><item><title>The autocorrect attribute: giving the page a say in auto-correction</title><link>https://www.moiu.cn/en/blog/autocorrect-attribute/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/autocorrect-attribute/</guid><description>Chrome 152 supports the global autocorrect attribute, Safari and Firefox had it already, and so it reaches Baseline. How it differs from spellcheck, why it spent years as a vendor prefix, and when you should turn it off.</description><pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate><category>meta</category><category>design</category></item><item><title>Compressed and still mutable: a dynamic compressed self-index</title><link>https://www.moiu.cn/en/blog/dynamic-rr-index/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/dynamic-rr-index/</guid><description>Highly repetitive string data (genomes, web archives, versioned documents) compresses beautifully, but any edit forces a full rebuild. A RIKEN AIP paper at ESA 2026 proposes dynamic RR-index, the first to combine compression, search, and updates in delta-optimal space.</description><pubDate>Sun, 04 Oct 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>backend</category></item><item><title>&lt;template for&gt;: letting HTML declare which region gets replaced</title><link>https://www.moiu.cn/en/blog/template-for-partial-updates/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/template-for-partial-updates/</guid><description>Chrome 150 supports the template for attribute: processing instructions mark replaceable regions, and streamed templates fill them. How it works, what it solves, and why it should not go anywhere near production yet.</description><pubDate>Sat, 03 Oct 2026 00:00:00 GMT</pubDate><category>meta</category><category>performance</category></item><item><title>The source shown on the page and the file served to curl must be one string</title><link>https://www.moiu.cn/en/blog/script-single-source/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/script-single-source/</guid><description>A scripts section has to display its source and also serve the identical file at /scripts/x.sh. Two copies drift. Why inlining with import.meta.glob and ?raw beats reading the filesystem at build time or copying into public.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><category>meta</category><category>tools</category></item><item><title>Atomic file writes: write a temp file, then rename</title><link>https://www.moiu.cn/en/blog/atomic-write/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/atomic-write/</guid><description>Overwriting in place leaves half a file behind on power loss, a crash, or a concurrent read. A temp file plus rename uses filesystem atomicity to make half a file impossible.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>backend</category><category>tools</category></item><item><title>Base64: it is neither encryption nor compression</title><link>https://www.moiu.cn/en/blog/base64/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/base64/</guid><description>Base64 turns 3 bytes into 4 printable characters, growing the payload by a third. It solves carrying binary through a text channel, not keeping anything secret.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>tools</category><category>security</category></item><item><title>Misusing big O: constants and preconditions decide more than the order</title><link>https://www.moiu.cn/en/blog/big-o-misconception/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/big-o-misconception/</guid><description>An O(n log n) sort can lose to O(n²) insertion sort, and an O(1) hash lookup can lose to an array scan. Check input size, constants and memory locality before judging speed.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>performance</category></item><item><title>Using @layer to make CSS precedence a declared order, not a specificity fight</title><link>https://www.moiu.cn/en/blog/css-cascade-layers/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/css-cascade-layers/</guid><description>Runaway styles come from everyone solving problems by adding specificity. Cascade layers make the order explicit: between layers only order matters, and specificity applies within a layer.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>CSS</category><category>design</category></item><item><title>Debounce vs throttle: the difference is who decides when to run</title><link>https://www.moiu.cn/en/blog/debounce-throttle/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/debounce-throttle/</guid><description>Both limit how often a function runs. Debounce lets the last call decide the moment; throttle uses a fixed window. The wrong pick shows up as a laggy drag or a request every 200ms.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>tools</category><category>performance</category></item><item><title>Estimating work: why &quot;about three days&quot; becomes three weeks</title><link>https://www.moiu.cn/en/blog/developer-estimation/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/developer-estimation/</guid><description>You estimated writing code; what you owe is writing plus integration, review, rework, and waiting on others. Listing the unknowns beats multiplying every day count by two.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>tools</category><category>backend</category></item><item><title>Feature flags are debt, not configuration</title><link>https://www.moiu.cn/en/blog/feature-flags/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/feature-flags/</guid><description>Every flag doubles the reachable code paths and no flag ever gets deleted by itself. Giving each one a removal date matters far more than building a clever flag system.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>backend</category><category>tools</category></item><item><title>The game loop: why delta time is not optional</title><link>https://www.moiu.cn/en/blog/game-loop/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/game-loop/</guid><description>Moving 5 pixels per frame runs twice as fast on a 60Hz screen and two and a half times as fast at 144Hz. Multiply by elapsed time to decouple physics from refresh rate, then cap it.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>games</category><category>performance</category></item><item><title>git bisect: turn which commit broke it into one command</title><link>https://www.moiu.cn/en/blog/git-bisect/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/git-bisect/</guid><description>The hard part of regression hunting is not the binary search, it is defining what counts as broken. Write a script that answers that, and bisect compresses n builds into log n.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>tools</category><category>algorithms</category></item><item><title>Gomoku AI: splitting threat detection from search</title><link>https://www.moiu.cn/en/blog/gomoku-search-engine/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/gomoku-search-engine/</guid><description>Plain alpha-beta misses forced wins in gomoku. I split the decision into three layers — win, block, forced-win patterns — and only then hand the rest to iterative deepening.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>games</category></item><item><title>Graceful shutdown: the exit sequence decides between 502s and clean responses</title><link>https://www.moiu.cn/en/blog/graceful-shutdown/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/graceful-shutdown/</guid><description>Exiting immediately on a termination signal cuts in-flight requests. The order is stop accepting, drain what is running, release resources, then exit.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>backend</category><category>meta</category></item><item><title>HTTP caching: Cache-Control and ETag each own half</title><link>https://www.moiu.cn/en/blog/http-caching/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/http-caching/</guid><description>Cache-Control decides whether a request happens; ETag decides whether the response body can be skipped. Mixing them is why cache bugs persist: changing one never fixes the other half.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>meta</category><category>performance</category></item><item><title>Idempotency keys: the one write that makes retries safe</title><link>https://www.moiu.cn/en/blog/idempotency/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/idempotency/</guid><description>A network timeout does not mean the server did nothing. An idempotency key identifies the same request so the server replays the first result instead of executing again.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>backend</category><category>security</category></item><item><title>JSON canonicalization: why the same object hashes two ways</title><link>https://www.moiu.cn/en/blog/json-canonicalization/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/json-canonicalization/</guid><description>Key order, number formatting and escape style all change the bytes. A stable hash has to pin those rules at serialization, not hope JSON.stringify is deterministic.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>backend</category><category>security</category></item><item><title>Memory layout: the same algorithm, ten times slower, is usually cache</title><link>https://www.moiu.cn/en/blog/memory-layout/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/memory-layout/</guid><description>A trip to main memory costs hundreds of cycles; a cache line fetch costs one. Sequential versus random access often outweighs the algorithmic order itself.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>performance</category><category>algorithms</category></item><item><title>Deadlock: break any one of four conditions</title><link>https://www.moiu.cn/en/blog/mutex-deadlock/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/mutex-deadlock/</guid><description>Mutual exclusion, hold and wait, no preemption, circular wait. All four must hold at once. The practical one to break is circular wait: give every lock a global order.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>backend</category><category>algorithms</category></item><item><title>The N+1 query: the most typical ORM performance trap</title><link>https://www.moiu.cn/en/blog/n-plus-one/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/n-plus-one/</guid><description>Fetch 100 rows and query the relation for each one and you have made 101 queries. There are only three fixes: eager load, batch fetch, or use a single join.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>backend</category><category>performance</category></item><item><title>Rate limiting: what token bucket and leaky bucket really differ on</title><link>https://www.moiu.cn/en/blog/rate-limiting/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/rate-limiting/</guid><description>A token bucket permits bursts; a leaky bucket flattens traffic to a constant rate. Picking wrong shows up as throttled normal users, or a limit that does nothing.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>backend</category><category>performance</category></item><item><title>Catastrophic backtracking: why a regex can pin a CPU</title><link>https://www.moiu.cn/en/blog/regex-catastrophic/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/regex-catastrophic/</guid><description>Nested quantifiers make the number of match attempts grow exponentially; (a+)+b can hang a process on one long non-matching input. Drop the nesting or put a timeout on it.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>security</category><category>algorithms</category></item><item><title>iframe sandbox: it narrows capability, it does not harden</title><link>https://www.moiu.cn/en/blog/sandbox-iframe/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/sandbox-iframe/</guid><description>The sandbox attribute starts by removing everything and allow-* adds pieces back. Getting the direction backwards is common: scripts stop running because that is the default.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>security</category><category>meta</category></item><item><title>Semantic versioning: a major bump promises no silent behavior change</title><link>https://www.moiu.cn/en/blog/semver/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/semver/</guid><description>MAJOR does not mean big. It means breaking. Using it for refactors and hiding breaks in minor releases turns your downstream automatic upgrades into outages.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>tools</category><category>meta</category></item><item><title>SQLite indexes: the leftmost prefix is a consequence of sorting</title><link>https://www.moiu.cn/en/blog/sqlite-index/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/sqlite-index/</guid><description>A composite index (a, b) can only order by b within equal a, so skipping a and filtering on b has nothing to use. See it as sorting and the mnemonic stops being a rule to memorize.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>backend</category><category>algorithms</category></item><item><title>What technical debt interest actually looks like</title><link>https://www.moiu.cn/en/blog/tech-debt-interest/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/tech-debt-interest/</guid><description>Debt is not ugly code; it is the extra cost every future change pays. The test is measurable: files touched per edit, test runtime, places that must change together.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>meta</category><category>tools</category></item><item><title>Time zones and DST: store UTC, or daylight saving will bite</title><link>https://www.moiu.cn/en/blog/timezone-dst/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/timezone-dst/</guid><description>A DST day has 23 or 25 hours, and local times near the switch may not exist or may happen twice. Storing UTC timestamps and converting at display is the only model that holds.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>backend</category><category>algorithms</category></item><item><title>Turning an AI search into a tree you can page through</title><link>https://www.moiu.cn/en/blog/tool-tree/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/tool-tree/</guid><description>Visualising a search is not mainly about drawing the tree. The data has to be real, the panel must not shove the board around, and it must load only for people who click the button.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>Vue</category><category>games</category></item><item><title>Unicode normalization: why two identical-looking strings differ</title><link>https://www.moiu.cn/en/blog/unicode-normalization/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/unicode-normalization/</guid><description>An e-acute can be one code point or a base letter plus a combining mark. Normalize to NFC before comparing, storing or indexing, or duplicates quietly slip through.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>security</category><category>backend</category></item><item><title>URL encoding: spaces, plus signs and double encoding</title><link>https://www.moiu.cn/en/blog/url-encoding/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/url-encoding/</guid><description>A plus is a space in the query string and a literal plus in the path; the two positions encode the same character differently; encoding twice yields a plausible value that never matches.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>meta</category><category>security</category></item><item><title>Four places Chinese chess rules go wrong</title><link>https://www.moiu.cn/en/blog/xiangqi-rules/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/xiangqi-rules/</guid><description>Horse-leg blocking, elephant-eye blocking, cannon screens and the flying-general rule. Splitting move generation into a geometry layer and a legality layer removes most of the mistakes.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>games</category></item><item><title>Writing a cron parser: five fields, the union rule, and February 30th</title><link>https://www.moiu.cn/en/blog/cron-parser/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/cron-parser/</guid><description>The syntax takes half an hour. The semantics are the work: day-of-month and day-of-week unite rather than intersect, impossible dates need a stopping condition, and 7 and 0 are both Sunday.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><category>tools</category><category>algorithms</category></item><item><title>CSV is not split on commas: quoting and newlines from RFC 4180</title><link>https://www.moiu.cn/en/blog/csv-rfc4180/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/csv-rfc4180/</guid><description>The moment a field is quoted, split stops working: quotes hold delimiters and newlines, and a quote inside a field is doubled. A thirty-line state machine beats any regex.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><category>tools</category><category>algorithms</category></item><item><title>Legal moves in Reversi: eight directions, one scan</title><link>https://www.moiu.cn/en/blog/reversi-legal-moves/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/reversi-legal-moves/</guid><description>A square is legal if at least one of eight directions can sandwich the opponent. Testing and flipping share a single scan, so there is no simulated move to roll back.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>games</category></item><item><title>A sudoku generator: digging holes, unique solutions, and the bug that froze the page</title><link>https://www.moiu.cn/en/blog/sudoku-generator/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/sudoku-generator/</guid><description>Generate a full solution, then dig cells out while checking uniqueness. I let zero mean unlimited in the solver, so an empty grid enumerated every solution and the new-game button hung.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>games</category></item><item><title>Consistent hashing: why adding a machine does not reshuffle every key</title><link>https://www.moiu.cn/en/blog/consistent-hashing/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/consistent-hashing/</guid><description>Modulo sharding moves almost all data when the machine count changes. Put the hash space on a ring and let each key follow it clockwise to the first node, and only one arc moves. Virtual nodes are the price.</description><pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>meta</category></item><item><title>Winning at Gomoku: checking the last stone is enough</title><link>https://www.moiu.cn/en/blog/gomoku-win-detect/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/gomoku-win-detect/</guid><description>Rescanning the whole board after every move is waste. Only the newest stone can create a line, so four directions from that point settle it in constant time.</description><pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>games</category></item><item><title>Sliding windows: decide what the window tracks before writing the loop</title><link>https://www.moiu.cn/en/blog/sliding-window/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/sliding-window/</guid><description>A window works when validity changes monotonically with its edges. Write down the tracked state and the shrink condition first, and the two-pointer loop amortises to O(n) on its own.</description><pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>performance</category></item><item><title>Monotonic stacks: next greater element in O(n), not O(n squared)</title><link>https://www.moiu.cn/en/blog/monotonic-stack/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/monotonic-stack/</guid><description>Each index is pushed and popped at most once, so what looks like a nested loop is linear. Recognise the first larger or smaller neighbour shape and the same template applies.</description><pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>performance</category></item><item><title>Counting the ones in a binary number: from loops to SWAR</title><link>https://www.moiu.cn/en/blog/popcount-bit-tricks/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/popcount-bit-tricks/</guid><description>Popcount has three forms: loop once per set bit, a lookup table, or SWAR across bit fields. They differ by orders of magnitude, and Rust and WebAssembly already expose it as a single instruction.</description><pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>performance</category></item><item><title>Union-find: two lines of optimisation make every operation near constant</title><link>https://www.moiu.cn/en/blog/union-find/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/union-find/</guid><description>Path compression flattens the tree, union by size stops it growing tall. You need both before the cost drops to the inverse Ackermann function, which is never above 5 in practice.</description><pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>performance</category></item><item><title>In Rust, context belongs on the line that actually fails</title><link>https://www.moiu.cn/en/blog/rust-result-context/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/rust-result-context/</guid><description>The question mark operator rethrows an error without saying which step failed. Structured errors in the core, Context in the application layer, with the input attached, is what makes a log line locatable.</description><pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate><category>Rust</category><category>backend</category></item><item><title>When a crate should become a workspace</title><link>https://www.moiu.cn/en/blog/rust-workspace-split/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/rust-workspace-split/</guid><description>The trigger for splitting a workspace is build time and dependency boundaries, not tidy directories. Split when three signals hold, or you trade one compile for managing several packages.</description><pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate><category>Rust</category><category>backend</category></item><item><title>Structured logging is not println replaced by tracing::info</title><link>https://www.moiu.cn/en/blog/tracing-structured-logs/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/tracing-structured-logs/</guid><description>Log lines built by concatenation can only be read by humans. Fields make them queryable. Fields, spans, levels and knowing when not to format are the four real decisions.</description><pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate><category>Rust</category><category>backend</category></item><item><title>Islands are not Web Components: two different kinds of on-demand loading</title><link>https://www.moiu.cn/en/blog/islands-vs-webcomponents/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/islands-vs-webcomponents/</guid><description>Islands decide at build time where JavaScript is needed and when it hydrates. Web Components give the browser a self-contained element at runtime. Confusing them picks the wrong tool.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>Astro</category><category>performance</category></item><item><title>Cache headers for a static site: hashed files forever, HTML never</title><link>https://www.moiu.cn/en/blog/nginx-cache-headers/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/nginx-cache-headers/</guid><description>A cache policy depends on whether the filename changes with the content, not on file size. Long-caching HTML hands users an old entry point that points at deleted chunks.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>meta</category><category>performance</category></item><item><title>When WebAssembly earns its place: less often than the pitch suggests</title><link>https://www.moiu.cn/en/blog/wasm-where-to-use/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/wasm-where-to-use/</guid><description>WASM pays off with heavy computation, bulk data and few boundary crossings. Rewriting an O(n) JavaScript loop as WASM usually buys slower loading and a harder stack to debug.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>performance</category><category>meta</category></item><item><title>Anchors hidden behind a sticky header: one scroll-padding-top for the whole site</title><link>https://www.moiu.cn/en/blog/anchor-scroll-padding/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/anchor-scroll-padding/</guid><description>A sticky header covers every anchor target. scroll-margin per heading always misses one; scroll-padding-top on the scroll container does not, fed by the real header height.</description><pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate><category>CSS</category><category>design</category></item><item><title>Use the native dialog element: you get more than you think</title><link>https://www.moiu.cn/en/blog/dialog-a11y/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/dialog-a11y/</guid><description>A hand-rolled modal needs a focus trap, ESC handling, scroll locking and focus restore. Native dialog with showModal has all of it plus ::backdrop, and one style rule as the price.</description><pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate><category>CSS</category><category>design</category></item><item><title>Dark mode forms stay white: color-scheme is the switch</title><link>https://www.moiu.cn/en/blog/form-color-scheme/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/form-color-scheme/</guid><description>Painting a dark background does not darken native controls. Select popups, date pickers and autofill follow color-scheme; accent-color only reaches checkboxes and sliders.</description><pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate><category>CSS</category><category>design</category></item><item><title>Stop guessing the header height: measure it with ResizeObserver</title><link>https://www.moiu.cn/en/blog/resize-observer-layout/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/resize-observer-layout/</guid><description>A wrapping navigation, late webfonts and changing content all break constants written into CSS. A ResizeObserver watches the element and writes the measured value back into a variable.</description><pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate><category>CSS</category><category>performance</category></item><item><title>Design tokens: one file that runs the whole site</title><link>https://www.moiu.cn/en/blog/design-tokens/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/design-tokens/</guid><description>Why every colour, spacing step and corner radius lives in _tokens.scss — and why changing this site&apos;s entire visual direction only touched two files.</description><pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate><category>CSS</category><category>design</category></item><item><title>Manual i18n: what hand-rolling two languages costs</title><link>https://www.moiu.cn/en/blog/manual-i18n/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/manual-i18n/</guid><description>I hand-rolled this site&apos;s i18n instead of using Astro&apos;s built-in config. Here is why, and exactly where the cost shows up — two 404 incidents and a blog that was half translated.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><category>meta</category><category>design</category></item><item><title>2048: collapsing four directions into one operation</title><link>https://www.moiu.cn/en/blog/algo-2048/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/algo-2048/</guid><description>Sliding, merging and scoring only need to be written once; the other three directions reuse it through transpose and reverse. The hard part is that each tile may merge at most once per move.</description><pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>games</category></item><item><title>Minesweeper: deferring mine placement until the first click</title><link>https://www.moiu.cn/en/blog/algo-minesweeper/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/algo-minesweeper/</guid><description>A minesweeper where the first click can lose is an unfinished minesweeper. Deferring placement and excluding the surrounding 3 by 3 is the single most important design decision here.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate><category>algorithms</category><category>games</category></item><item><title>Turning screen-printing limits into design tokens</title><link>https://www.moiu.cn/en/blog/riso-ui/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/riso-ui/</guid><description>This site&apos;s visual direction is Riso screen printing. What I actually built was the printing constraints as tokens, so retheming touched two files and no component changed.</description><pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate><category>design</category><category>CSS</category></item><item><title>Base and unit conversion: temperature is the only non-linear one</title><link>https://www.moiu.cn/en/blog/tool-convert/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/tool-convert/</guid><description>Converting between bases 2 and 36 needs BigInt to avoid silent precision loss. Across ten unit categories nine are linear ratios, while temperature is affine, and a single multiplier is always wrong.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><category>tools</category><category>Vue</category></item><item><title>Color and contrast: relative luminance is not an average</title><link>https://www.moiu.cn/en/blog/tool-color/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/tool-color/</guid><description>Converting between notations is just the entry point. The real trap is WCAG contrast, which needs gamma decoding before weighting, and deciding between black and white text, which is not a brightness threshold.</description><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><category>tools</category><category>Vue</category></item><item><title>Full-text search on a static site: index at build time, no backend at runtime</title><link>https://www.moiu.cn/en/blog/pagefind-search/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/pagefind-search/</guid><description>A static site does not need Algolia to have search. Generate the index during the build, run the query entirely in the browser, and pay a few seconds of build time.</description><pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate><category>meta</category><category>performance</category></item><item><title>Hash and checksum: why CRC32 and MD5 have to be written by hand</title><link>https://www.moiu.cn/en/blog/tool-hash/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/tool-hash/</guid><description>The browser only offers the SHA family, and only in a secure context. CRC32 and MD5 are not in Web Crypto. Along the way: large files should not be read into memory whole, and checksums should not be compared by eye.</description><pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate><category>tools</category><category>Vue</category></item><item><title>Regex Lab: hits, groups, replacement preview, and the zero-width trap</title><link>https://www.moiu.cn/en/blog/tool-regex-lab/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/tool-regex-lab/</guid><description>A regex tester has to do three things well: show where matches land and what each group captured, preview the replacement, and never hang on a zero-width match.</description><pubDate>Fri, 11 Sep 2026 00:00:00 GMT</pubDate><category>tools</category><category>Vue</category></item><item><title>JSON Studio: format, validate and diff in one page</title><link>https://www.moiu.cn/en/blog/tool-json-studio/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/tool-json-studio/</guid><description>Built from the habit of writing throwaway commands to clean up JSON. It formats, minifies, sorts, pinpoints parse errors by line and column, and diffs two documents — all in the browser.</description><pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate><category>tools</category><category>Vue</category></item><item><title>1059 assertions, no test framework: why pure logic must import nothing</title><link>https://www.moiu.cn/en/blog/zero-import-selftest/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/zero-import-selftest/</guid><description>My test suite is `node scripts/selftest.ts` — no framework, no dependencies. The price is that every module it touches must have zero relative imports, and that price bought a codebase shape.</description><pubDate>Tue, 08 Sep 2026 00:00:00 GMT</pubDate><category>Astro</category><category>meta</category></item><item><title>SharePoint deserialisation RCE: CVE-2026-45659</title><link>https://www.moiu.cn/en/blog/cve-2026-45659-sharepoint/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/cve-2026-45659-sharepoint/</guid><description>A plain Site Member account is enough to run code on a SharePoint server. Microsoft rated exploitation unlikely, and CISA put it in the KEV catalogue with three days to remediate.</description><pubDate>Sun, 06 Sep 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>n8n unauthenticated RCE (Ni8mare): CVE-2026-21858</title><link>https://www.moiu.cn/en/blog/cve-2026-21858-n8n/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/cve-2026-21858-n8n/</guid><description>The form node skips Content-Type validation, so one application/json request makes it read an arbitrary file. The key inside the config forges an admin JWT, and a sandbox bypass turns that into RCE.</description><pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>Cisco FMC unauthenticated Java deserialisation RCE: CVE-2026-20131</title><link>https://www.moiu.cn/en/blog/cve-2026-20131-cisco-fmc/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/cve-2026-20131-cisco-fmc/</guid><description>CVSS 10.0, no authentication, code execution as root, and 36 days of use as a zero-day by a ransomware crew. Breaking the firewall management hub hands over every policy and log with it.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>Pushing first-load JS to zero with Astro islands</title><link>https://www.moiu.cn/en/blog/astro-islands/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/astro-islands/</guid><description>From &quot;async import&quot; to &quot;hydrate on demand&quot; — what each of the three lazy-loading layers actually solves, with the code that runs on this site.</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><category>Astro</category><category>performance</category><category>Vue</category></item><item><title>Next.js incremental cache path traversal to RCE: CVE-2026-75604</title><link>https://www.moiu.cn/en/blog/cve-2026-75604-nextjs/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/cve-2026-75604-nextjs/</guid><description>One unescaped backslash turns the incremental cache into arbitrary file read and write on Windows, and the leaked Server Action encryption key forges a request that walks a React Flight property chain to Function.</description><pubDate>Sun, 30 Aug 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>React Router prototype pollution chained into RCE: CVE-2026-42211</title><link>https://www.moiu.cn/en/blog/cve-2026-42211-react-router/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/cve-2026-42211-react-router/</guid><description>turbo-stream v2 calls a constructor while rehydrating the TYPE_ERROR branch without checking where it came from. If the app already has a prototype pollution bug, that path reaches Function and two moderate flaws become RCE.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><category>security</category><category>vulnerability</category></item><item><title>One source for head: SiteHead, JSON-LD escaping and hreflang</title><link>https://www.moiu.cn/en/blog/head-single-source/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/head-single-source/</guid><description>All three HTML shells render one component that emits every head tag, with the data assembled on the server. Plus a detail worth remembering: angle brackets in JSON-LD must be escaped.</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><category>meta</category><category>performance</category></item><item><title>Shipping a static site is not &quot;upload the folder&quot;: caching, compression, honest 404s</title><link>https://www.moiu.cn/en/blog/static-hosting-nginx/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/static-hosting-nginx/</guid><description>Almost every static-hosting bug lives in response headers. Which files may be cached forever, which may not be cached at all, and why a static site must never use an SPA fallback.</description><pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate><category>meta</category><category>performance</category></item><item><title>A theme-switch ripple with the View Transitions API</title><link>https://www.moiu.cn/en/blog/theme-ripple/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/theme-ripple/</guid><description>A circle growing from the click point reveals the new theme. The radius must reach the farthest corner, and the custom properties must be cleaned up or they leak into the next switch.</description><pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate><category>CSS</category><category>design</category><category>Vue</category></item><item><title>Pagination at build time: why a static site should not page with a query string</title><link>https://www.moiu.cn/en/blog/build-time-pagination/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/build-time-pagination/</guid><description>The post list is sliced into static pages during the build, so page N is a real route. No client-side paging logic, no query string, just links.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate><category>Astro</category><category>performance</category></item><item><title>The @/ alias lives in three configs, and all three are required</title><link>https://www.moiu.cn/en/blog/alias-three-places/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/alias-three-places/</guid><description>Deep relative imports are banned project-wide, and the price is configuring the alias in three places. Miss one and you get editor errors, a broken build, or silently dropped styles.</description><pubDate>Sun, 16 Aug 2026 00:00:00 GMT</pubDate><category>Astro</category><category>meta</category></item><item><title>zod as a frontmatter contract: bad articles fail the build</title><link>https://www.moiu.cn/en/blog/zod-frontmatter/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/zod-frontmatter/</guid><description>The Content Collections schema is the single source of truth. A title over 120 characters, a mangled date or a string where an array belongs fails immediately instead of silently dropping a page.</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><category>Astro</category><category>meta</category></item><item><title>Why I built yet another personal site</title><link>https://www.moiu.cn/en/blog/hello-world/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/hello-world/</guid><description>Not because there was nowhere to write, but because there was nowhere to put writing, small games and tools side by side.</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate><category>meta</category><category>Astro</category></item><item><title>A zero-config registry: adding a game means adding a directory</title><link>https://www.moiu.cn/en/blog/glob-registry/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/glob-registry/</guid><description>App lists, detail routes, the home page picks and the sitemap are all discovered by import.meta.glob. The price is Vite&apos;s hard rule: literal relative paths only.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate><category>Astro</category><category>meta</category></item><item><title>No client:only for app pages: a static shell plus an explicit mount</title><link>https://www.moiu.cn/en/blog/app-shell-mount/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/app-shell-mount/</guid><description>Game and tool pages are a shell plus createApp, not client:only. I own the loading, ready and error states, and the retry button actually works.</description><pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate><category>Vue</category><category>performance</category></item><item><title>Views hold no logic: all data assembly lives in src/server</title><link>https://www.moiu.cn/en/blog/server-layer/</link><guid isPermaLink="true">https://www.moiu.cn/en/blog/server-layer/</guid><description>A page here exports a route, imports two components and passes props. Everything else — fetching, paths, dates — happens in src/server. Here is what that buys, and the type constraint it forces.</description><pubDate>Sun, 02 Aug 2026 00:00:00 GMT</pubDate><category>Astro</category><category>meta</category></item></channel></rss>