<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Vincent Ping</title><link href="https://vincentping.com/" rel="alternate"></link><link href="https://vincentping.com/feeds/all.atom.xml" rel="self"></link><id>https://vincentping.com/</id><updated>2026-06-07T23:23:00+08:00</updated><entry><title>From Smart Cards to AI Agents: Why I Built ASys</title><link href="https://vincentping.com/en/why-i-built-asys.html" rel="alternate"></link><published>2026-06-07T23:23:00+08:00</published><updated>2026-06-07T23:23:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-06-07:/en/why-i-built-asys.html</id><summary type="html">&lt;p&gt;The origin story of ASys: from ISO 7816 smart card protocols to a binary system interface for AI Agents, and why AI ops needs a new communication standard.&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;ASys (Agentic System Interface) is an open-source system interface protocol designed specifically for AI Agents — binary instructions instead of text commands, persistent connections instead of per-request handshakes, instruction-level permissions instead of broad session-level access. This is where it came from and why it's built the way it is.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Last year, using Claude to help write code felt like working with an intern with terrible memory. Context would drift as conversations grew longer. Restarting a session meant spending several rounds just getting back to where we were. Interfaces we'd agreed on earlier would be forgotten later.&lt;/p&gt;
&lt;p&gt;Early this year I tried again. I used Claude Code to build &lt;a href="/en/built-a-study-tool-while-preparing-for-comptia-a-plus-now-open-source"&gt;PySide6&lt;/a&gt; — a PySide6 desktop flashcard app with config, UI, database, i18n, a theme system, tests, and Windows packaging. Not huge in scope, but it covered everything a real desktop app needs. The experience was completely different. I was still driving, but Claude could keep up. I'd say what needed doing, and it understood accurately. The code mostly worked. When it went off track, a correction pulled it back fast.&lt;/p&gt;
&lt;p&gt;The progress between those two experiences was obvious.&lt;/p&gt;
&lt;p&gt;Looking back, the domains where LLMs have actually shipped: text and code. Both share something: &lt;strong&gt;they're tasks with a finish line&lt;/strong&gt; — write an article, ship a feature, done. Operations is different. Once a system is live, it's real-time, stateful, and problems arrive without warning. There's no "done." It's a different world entirely.&lt;/p&gt;
&lt;p&gt;I was studying for CompTIA A+ Core 2 at the time — reviewing during the day, writing code at night. One question kept turning over in my head: &lt;strong&gt;AI assistance for development is maturing fast. What about ops?&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;When the Operator Becomes an AI&lt;/h2&gt;
&lt;p&gt;Once AI accelerates development to an exponential pace, the accumulation of running systems accelerates with it. Every new service deployed is something that needs maintaining — indefinitely. Systems don't disappear. Problems pile up. Complexity compounds. Think of it this way: all running systems together form a large lake; all systems under development are rivers flowing into it. As more rivers flow faster, the lake grows faster than anyone expects.&lt;/p&gt;
&lt;p&gt;But human ops scales linearly. One engineer can only maintain so many systems, no matter the tooling. Human ops can't keep up with exponential accumulation. Looking ahead, only AI ops can take that on.&lt;/p&gt;
&lt;p&gt;For AI ops to work, though, one prerequisite needs solving: the interface.&lt;/p&gt;
&lt;p&gt;From POSIX to SSH, from Ansible to Kubernetes Operators — these tools are battle-tested, widely deployed, and will keep running for years. But every one of them was designed with a human operator in mind. When the operator becomes an AI Agent, several things are worth rethinking from scratch: text parsing fails whenever output format changes; session-level permissions carry serious risk for Agents that can hallucinate; frequent sampling makes per-connection handshakes a real bottleneck.&lt;/p&gt;
&lt;p&gt;Take the cost of "guessing text." An Agent running &lt;code&gt;ps aux | grep nginx&lt;/code&gt; over SSH gets back free-form text — format varies by OS, locale, and tool version. The Agent has to parse it, and every regex that might break is a potential hallucination entry point. Call ASys's &lt;code&gt;SYS_PROCS&lt;/code&gt; instead, and you get a fixed 44-byte binary frame: process count, top-5 PIDs, CPU%, memory%, status flags. Typed, unambiguous, identical on every node. Parsing is one line of &lt;code&gt;struct.unpack&lt;/code&gt;. This isn't just a performance gain. It's a reliability improvement of a different order. When parsing overhead approaches zero, the Agent can spend nearly all its compute on what actually matters: perception, reasoning, decision.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Text Parsing vs Binary Frames" src="https://vincentping.com/images/20260607/text-vs-binary-frame.jpg"&gt;&lt;/p&gt;
&lt;p&gt;ASys isn't trying to replace any of these tools. It's exploring one question: if you designed an interface specifically for Agents, from first principles, what would it look like? One more option, that's all.&lt;/p&gt;
&lt;p&gt;Open source: &lt;a href="https://github.com/vincentping/asys"&gt;github.com/vincentping/asys&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Where ASys Came From&lt;/h2&gt;
&lt;p&gt;From 2010 to 2016, I worked as a developer at a smart card company in Shanghai — SIM cards, bank cards, ID chip cards. The industry had one iron rule: &lt;strong&gt;once a card ships, you can't take it back.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Smart card development meant writing the spec first, implementing against the spec, testing against the spec: functional tests, failure tests, edge case coverage. After internal testing came on-site testing at the telecom operator. Tedious, long-cycle, no shortcuts. Because if you found a bug after mass production, the recall cost was catastrophic. That's a completely different philosophy from the move-fast-and-iterate approach of internet development. The deepest thing those six years left me wasn't any particular technology. It was an instinct: &lt;strong&gt;thinking it through and writing it down matters more than starting fast.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Those six years also made me fluent in protocols. Especially &lt;strong&gt;ISO/IEC 7816&lt;/strong&gt; — the APDU system for smart card communication. A card reader sends binary instructions to a smart card and gets back a fixed-format response, never parsed by human eyes. &lt;code&gt;0x9000&lt;/code&gt; means success. &lt;code&gt;0x6982&lt;/code&gt; means security status not satisfied. Unchanged for decades. This protocol runs on tens of billions of devices — every bank chip card, every e-passport, every SIM card. Every edge case has been validated in the hardest production conditions possible.&lt;/p&gt;
&lt;p&gt;After 2016, I left smart cards and spent the next ten years building web systems of all shapes — frontend JS, backend Python/Go/Java, databases, servers, caches, clouds, various architectures.&lt;/p&gt;
&lt;p&gt;The past year I've been deep in AI, building projects with Claude. The more I understand it, the more convinced I am: &lt;strong&gt;AI will reshape humanity the way the Industrial Revolution did.&lt;/strong&gt; After finishing ReCall, I kept asking myself what to build next that was actually AI-related.&lt;/p&gt;
&lt;p&gt;One night in late February — studying late, just lay down, half-asleep — APDU from 7816 flashed into my head. Those elegantly simple binary instructions, fixed-format responses. I sat straight up. &lt;strong&gt;Why not use APDU-style communication between Agents and servers? Why keep human-readable text in the middle at all?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That same night I re-read the 7816 spec, wrote a rough document, got the initial idea down.&lt;/p&gt;
&lt;p&gt;Six years in smart cards, ten years in web systems, one-plus years in AI — take away any one of those, and that half-asleep connection doesn't happen. Most of my old smart card colleagues are still in embedded systems. My web friends rarely have a background in low-level protocol design. Maybe this is what people mean when they say diversity drives emergence. Once the idea showed up, not trying it felt like a waste.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Three Months, Zero to Open Source&lt;/h2&gt;
&lt;p&gt;Early March — A+ Core 2 still not done — I started anyway.&lt;/p&gt;
&lt;p&gt;Old habit from smart card days: write the docs first. Interface design philosophy, instruction set encoding, security model, frame format — think each piece through, write it up, realize mid-writing that I hadn't thought it through, go back. March 16, v0.1 docs done. Same day, first PoC running between a Windows machine and a RHEL server: &lt;code&gt;SYS_HELLO&lt;/code&gt; instruction, response &lt;code&gt;0x9000 OK&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;After the exam, progress accelerated. Docs and code alternated. Write code, find a design problem, go fix the spec, continue. Not throwing things away and starting over — just continuous refinement.&lt;/p&gt;
&lt;p&gt;A few decisions in this process each took time to work through.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transport: Why Not mTLS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Transport layer was the first thing that stopped me. Instinct said mTLS — common, widely used, easy to debug. But the more I thought about it, the more wrong it felt.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;asyd&lt;/code&gt; is ASys's server-side daemon. One of its core use cases is staying reachable during OOM events, full disks, exactly the moments you need it most. If it goes silent because a certificate expired or the CA is unreachable at that moment — an interface that fails during emergencies is more dangerous than no interface at all. And OpenSSL is a heavyweight dependency. That directly conflicts with the zero-external-dependencies design goal.&lt;/p&gt;
&lt;p&gt;I went with &lt;strong&gt;Noise Protocol IK&lt;/strong&gt;, implemented on Monocypher. Pure cryptographic primitives, no certificate dependencies, roughly 2,000 lines of C, fully auditable, 1-RTT handshake. This choice lets &lt;code&gt;asyd&lt;/code&gt; ship as a single static binary. Deploy it on any POSIX environment with no runtime risk.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Permission Model: Making Unauthorized Things Not Exist&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The permission model took longer. The intuitive answer was an ACL table — configure which Agent can do what. Simple-looking, but not enough.&lt;/p&gt;
&lt;p&gt;Traditional security models (SSH, sudo) were designed for human operators. Human actions are exploratory; intent is hard to declare upfront. "Broad default permissions plus negative interception" fits how humans work. When the operator is an AI Agent, that assumption breaks. Agent behavior is programmatic. Permission boundaries can be declared precisely at deployment time.&lt;/p&gt;
&lt;p&gt;So ASys flips it. The system is dark to an Agent by default. Only instructions explicitly lit up in the &lt;strong&gt;Capability Map&lt;/strong&gt; "physically exist." An unauthorized operation isn't "you don't have permission" — it's "this instruction doesn't exist in your world." Unregistered instructions are dropped at the decode stage and never enter any execution path.&lt;/p&gt;
&lt;p&gt;Using a bitmap has an additional benefit: side-channel resistance. If you check permissions before checking existence, an attacker can infer which instructions "exist but are disabled" through tiny timing differences in responses. The Capability Map forces existence-check first. All unauthorized operations produce identical response timing. No information leakage surface.&lt;/p&gt;
&lt;p&gt;Least privilege isn't a configuration option. It's a physical property of the protocol.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capability Map — Making Unauthorized Operations Non-Existent" src="https://vincentping.com/images/20260607/capability-map.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Instruction Set: How to Organize 256 Slots&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The instruction set structure came together faster, because there was an obvious reference: APDU.&lt;/p&gt;
&lt;p&gt;Frame format borrowed directly: &lt;code&gt;[CLA][INS][P1][P2][Lc][Data][Le]&lt;/code&gt;. The high nibble of the INS byte serves as a logical page index — &lt;code&gt;0x00–0x0F&lt;/code&gt; is Core ISA, the baseline observation instructions, permanently locked; &lt;code&gt;0x20–0x8F&lt;/code&gt; is Standard ISA, seven functional groups; &lt;code&gt;0xC0–0xFF&lt;/code&gt; is Vendor Extensions, open for domain-specific customization.&lt;/p&gt;
&lt;p&gt;Any developer reading an instruction code knows the group at a glance. &lt;code&gt;0x2x&lt;/code&gt; is Process Control, no table lookup needed.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ASys Instruction Set — INS Byte Layout" src="https://vincentping.com/images/20260607/ins-byte-layout.jpg"&gt;&lt;/p&gt;
&lt;p&gt;More important is the semantic lock on Core ISA: once a core instruction ships, byte offsets never change. New fields can only be appended at the end. Agent parsing code written today is expected to work on some POSIX-compatible system fifty years from now. APDU covers tens of billions of devices precisely because of this long-termism. That's what ASys is trying to inherit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Closing the OODA Loop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Late May, I ran a complete OODA loop demo on RHEL. The RHEL server ran a CPU hog to trigger a load spike. A Python client on Windows called &lt;code&gt;SYS_STATUS&lt;/code&gt; to detect the anomaly, &lt;code&gt;SYS_PROCS&lt;/code&gt; to locate the process, &lt;code&gt;PROC_THROTTLE&lt;/code&gt; to suppress it, then &lt;code&gt;SYS_STATUS&lt;/code&gt; again to confirm recovery. All &lt;code&gt;0x9000&lt;/code&gt; throughout.&lt;/p&gt;
&lt;p&gt;That moment didn't feel like "it works." It felt like "proof of concept confirmed."&lt;/p&gt;
&lt;p&gt;&lt;img alt="OODA Loop — Agent Autonomous Operations Demo" src="https://vincentping.com/images/20260607/ooda-loop.jpg"&gt;&lt;/p&gt;
&lt;p&gt;May 27, v0.3.0 released. Three months from idea to open source.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Where Things Stand&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/vincentping/asys"&gt;github.com/vincentping/asys&lt;/a&gt; is now at v0.3.1.&lt;/p&gt;
&lt;p&gt;Stable today: Core ISA's four observation instructions (&lt;code&gt;SYS_CAPS&lt;/code&gt; / &lt;code&gt;SYS_HELLO&lt;/code&gt; / &lt;code&gt;SYS_STATUS&lt;/code&gt; / &lt;code&gt;SYS_PROCS&lt;/code&gt;), the first batch of Standard ISA control instructions (&lt;code&gt;PROC_THROTTLE&lt;/code&gt; / &lt;code&gt;SVC_RESTART&lt;/code&gt; / &lt;code&gt;TASK_QUERY&lt;/code&gt;), a complete Noise IK encrypted channel, public key whitelist authentication, and Epoch_ID replay protection.&lt;/p&gt;
&lt;p&gt;The most important next piece is the &lt;strong&gt;Python SDK&lt;/strong&gt; — targeting AI Agent developers, designed to drop into LangChain, AutoGen, and similar frameworks. The core design principle: Agents never touch the byte layer directly. They call structured interfaces (&lt;code&gt;sdk.proc_throttle(pid=1234, action="stop")&lt;/code&gt;); the SDK handles parameter validation and binary compilation. LLMs are inherently bad at byte offsets. Having an Agent assemble raw APDU parameters is the wrong abstraction.&lt;/p&gt;
&lt;p&gt;Still planned but not yet implemented: per-Agent fine-grained Capability Maps, an audit black box, chained transport. All in the spec. All coming.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Honest Thoughts&lt;/h2&gt;
&lt;p&gt;Building a protocol solo sounds a little crazy.&lt;/p&gt;
&lt;p&gt;Protocols are usually a committee job — they need multi-party consensus, large bodies of real-world input, exhaustive edge case analysis. But the idea showed up. So I tried. Working alone means decisions move fast. It also means no external pressure forces you to think every corner through. My response has been the same as in smart card days: docs before code. White paper, protocol spec, design notes, implementation notes — these took more time than the code itself. Because writing is the best thinking tool I have. If I can't write it clearly, I don't actually understand it. If I don't understand it, the code will collapse eventually.&lt;/p&gt;
&lt;p&gt;ASys is an exploratory project. It's not a replacement for SSH, not a competitor to Ansible. The gap it's trying to fill: when an Agent needs to manipulate a system at high frequency, low latency, and with full auditability — while staying reachable in extreme conditions — there's currently no purpose-built standard for that. Wrapping an LLM around SSH and calling it AI ops doesn't solve the underlying problem.&lt;/p&gt;
&lt;p&gt;Whether that's worth solving is for others to judge. But I think as Agents move further into production systems, the question "what should the interface between an Agent and a system actually look like?" deserves serious attention.&lt;/p&gt;
&lt;p&gt;If ASys starts that conversation, that's enough.&lt;/p&gt;
&lt;p&gt;One last note: ASys listens on port &lt;strong&gt;7816&lt;/strong&gt; by default. A deliberate tribute to ISO/IEC 7816 — the standard number for smart card communication protocols. Every time I see that number, I'm back in front of a stack of specs from a decade ago: 7816, 14443, EMV, PBOC, UICC, RSA. The years I spent with my face in those pages.&lt;/p&gt;</content><category term="Tech"></category><category term="ASys"></category><category term="AI Agent"></category><category term="Binary Protocol"></category><category term="System Design"></category><category term="Smart Card"></category><category term="Open Source"></category></entry><entry><title>From Smart Cards to AI Agents: Why I Built ASys</title><link href="https://vincentping.com/en/why-i-built-asys.html" rel="alternate"></link><published>2026-06-07T23:23:00+08:00</published><updated>2026-06-07T23:23:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-06-07:/en/why-i-built-asys.html</id><summary type="html">&lt;p&gt;The origin story of ASys: from ISO 7816 smart card protocols to a binary system interface for AI Agents, and why AI ops needs a new communication standard.&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;ASys (Agentic System Interface) is an open-source system interface protocol designed specifically for AI Agents — binary instructions instead of text commands, persistent connections instead of per-request handshakes, instruction-level permissions instead of broad session-level access. This is where it came from and why it's built the way it is.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Last year, using Claude to help write code felt like working with an intern with terrible memory. Context would drift as conversations grew longer. Restarting a session meant spending several rounds just getting back to where we were. Interfaces we'd agreed on earlier would be forgotten later.&lt;/p&gt;
&lt;p&gt;Early this year I tried again. I used Claude Code to build &lt;a href="/en/built-a-study-tool-while-preparing-for-comptia-a-plus-now-open-source"&gt;PySide6&lt;/a&gt; — a PySide6 desktop flashcard app with config, UI, database, i18n, a theme system, tests, and Windows packaging. Not huge in scope, but it covered everything a real desktop app needs. The experience was completely different. I was still driving, but Claude could keep up. I'd say what needed doing, and it understood accurately. The code mostly worked. When it went off track, a correction pulled it back fast.&lt;/p&gt;
&lt;p&gt;The progress between those two experiences was obvious.&lt;/p&gt;
&lt;p&gt;Looking back, the domains where LLMs have actually shipped: text and code. Both share something: &lt;strong&gt;they're tasks with a finish line&lt;/strong&gt; — write an article, ship a feature, done. Operations is different. Once a system is live, it's real-time, stateful, and problems arrive without warning. There's no "done." It's a different world entirely.&lt;/p&gt;
&lt;p&gt;I was studying for CompTIA A+ Core 2 at the time — reviewing during the day, writing code at night. One question kept turning over in my head: &lt;strong&gt;AI assistance for development is maturing fast. What about ops?&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;When the Operator Becomes an AI&lt;/h2&gt;
&lt;p&gt;Once AI accelerates development to an exponential pace, the accumulation of running systems accelerates with it. Every new service deployed is something that needs maintaining — indefinitely. Systems don't disappear. Problems pile up. Complexity compounds. Think of it this way: all running systems together form a large lake; all systems under development are rivers flowing into it. As more rivers flow faster, the lake grows faster than anyone expects.&lt;/p&gt;
&lt;p&gt;But human ops scales linearly. One engineer can only maintain so many systems, no matter the tooling. Human ops can't keep up with exponential accumulation. Looking ahead, only AI ops can take that on.&lt;/p&gt;
&lt;p&gt;For AI ops to work, though, one prerequisite needs solving: the interface.&lt;/p&gt;
&lt;p&gt;From POSIX to SSH, from Ansible to Kubernetes Operators — these tools are battle-tested, widely deployed, and will keep running for years. But every one of them was designed with a human operator in mind. When the operator becomes an AI Agent, several things are worth rethinking from scratch: text parsing fails whenever output format changes; session-level permissions carry serious risk for Agents that can hallucinate; frequent sampling makes per-connection handshakes a real bottleneck.&lt;/p&gt;
&lt;p&gt;Take the cost of "guessing text." An Agent running &lt;code&gt;ps aux | grep nginx&lt;/code&gt; over SSH gets back free-form text — format varies by OS, locale, and tool version. The Agent has to parse it, and every regex that might break is a potential hallucination entry point. Call ASys's &lt;code&gt;SYS_PROCS&lt;/code&gt; instead, and you get a fixed 44-byte binary frame: process count, top-5 PIDs, CPU%, memory%, status flags. Typed, unambiguous, identical on every node. Parsing is one line of &lt;code&gt;struct.unpack&lt;/code&gt;. This isn't just a performance gain. It's a reliability improvement of a different order. When parsing overhead approaches zero, the Agent can spend nearly all its compute on what actually matters: perception, reasoning, decision.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Text Parsing vs Binary Frames" src="https://vincentping.com/images/20260607/text-vs-binary-frame.jpg"&gt;&lt;/p&gt;
&lt;p&gt;ASys isn't trying to replace any of these tools. It's exploring one question: if you designed an interface specifically for Agents, from first principles, what would it look like? One more option, that's all.&lt;/p&gt;
&lt;p&gt;Open source: &lt;a href="https://github.com/vincentping/asys"&gt;github.com/vincentping/asys&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Where ASys Came From&lt;/h2&gt;
&lt;p&gt;From 2010 to 2016, I worked as a developer at a smart card company in Shanghai — SIM cards, bank cards, ID chip cards. The industry had one iron rule: &lt;strong&gt;once a card ships, you can't take it back.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Smart card development meant writing the spec first, implementing against the spec, testing against the spec: functional tests, failure tests, edge case coverage. After internal testing came on-site testing at the telecom operator. Tedious, long-cycle, no shortcuts. Because if you found a bug after mass production, the recall cost was catastrophic. That's a completely different philosophy from the move-fast-and-iterate approach of internet development. The deepest thing those six years left me wasn't any particular technology. It was an instinct: &lt;strong&gt;thinking it through and writing it down matters more than starting fast.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Those six years also made me fluent in protocols. Especially &lt;strong&gt;ISO/IEC 7816&lt;/strong&gt; — the APDU system for smart card communication. A card reader sends binary instructions to a smart card and gets back a fixed-format response, never parsed by human eyes. &lt;code&gt;0x9000&lt;/code&gt; means success. &lt;code&gt;0x6982&lt;/code&gt; means security status not satisfied. Unchanged for decades. This protocol runs on tens of billions of devices — every bank chip card, every e-passport, every SIM card. Every edge case has been validated in the hardest production conditions possible.&lt;/p&gt;
&lt;p&gt;After 2016, I left smart cards and spent the next ten years building web systems of all shapes — frontend JS, backend Python/Go/Java, databases, servers, caches, clouds, various architectures.&lt;/p&gt;
&lt;p&gt;The past year I've been deep in AI, building projects with Claude. The more I understand it, the more convinced I am: &lt;strong&gt;AI will reshape humanity the way the Industrial Revolution did.&lt;/strong&gt; After finishing ReCall, I kept asking myself what to build next that was actually AI-related.&lt;/p&gt;
&lt;p&gt;One night in late February — studying late, just lay down, half-asleep — APDU from 7816 flashed into my head. Those elegantly simple binary instructions, fixed-format responses. I sat straight up. &lt;strong&gt;Why not use APDU-style communication between Agents and servers? Why keep human-readable text in the middle at all?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That same night I re-read the 7816 spec, wrote a rough document, got the initial idea down.&lt;/p&gt;
&lt;p&gt;Six years in smart cards, ten years in web systems, one-plus years in AI — take away any one of those, and that half-asleep connection doesn't happen. Most of my old smart card colleagues are still in embedded systems. My web friends rarely have a background in low-level protocol design. Maybe this is what people mean when they say diversity drives emergence. Once the idea showed up, not trying it felt like a waste.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Three Months, Zero to Open Source&lt;/h2&gt;
&lt;p&gt;Early March — A+ Core 2 still not done — I started anyway.&lt;/p&gt;
&lt;p&gt;Old habit from smart card days: write the docs first. Interface design philosophy, instruction set encoding, security model, frame format — think each piece through, write it up, realize mid-writing that I hadn't thought it through, go back. March 16, v0.1 docs done. Same day, first PoC running between a Windows machine and a RHEL server: &lt;code&gt;SYS_HELLO&lt;/code&gt; instruction, response &lt;code&gt;0x9000 OK&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;After the exam, progress accelerated. Docs and code alternated. Write code, find a design problem, go fix the spec, continue. Not throwing things away and starting over — just continuous refinement.&lt;/p&gt;
&lt;p&gt;A few decisions in this process each took time to work through.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transport: Why Not mTLS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Transport layer was the first thing that stopped me. Instinct said mTLS — common, widely used, easy to debug. But the more I thought about it, the more wrong it felt.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;asyd&lt;/code&gt; is ASys's server-side daemon. One of its core use cases is staying reachable during OOM events, full disks, exactly the moments you need it most. If it goes silent because a certificate expired or the CA is unreachable at that moment — an interface that fails during emergencies is more dangerous than no interface at all. And OpenSSL is a heavyweight dependency. That directly conflicts with the zero-external-dependencies design goal.&lt;/p&gt;
&lt;p&gt;I went with &lt;strong&gt;Noise Protocol IK&lt;/strong&gt;, implemented on Monocypher. Pure cryptographic primitives, no certificate dependencies, roughly 2,000 lines of C, fully auditable, 1-RTT handshake. This choice lets &lt;code&gt;asyd&lt;/code&gt; ship as a single static binary. Deploy it on any POSIX environment with no runtime risk.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Permission Model: Making Unauthorized Things Not Exist&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The permission model took longer. The intuitive answer was an ACL table — configure which Agent can do what. Simple-looking, but not enough.&lt;/p&gt;
&lt;p&gt;Traditional security models (SSH, sudo) were designed for human operators. Human actions are exploratory; intent is hard to declare upfront. "Broad default permissions plus negative interception" fits how humans work. When the operator is an AI Agent, that assumption breaks. Agent behavior is programmatic. Permission boundaries can be declared precisely at deployment time.&lt;/p&gt;
&lt;p&gt;So ASys flips it. The system is dark to an Agent by default. Only instructions explicitly lit up in the &lt;strong&gt;Capability Map&lt;/strong&gt; "physically exist." An unauthorized operation isn't "you don't have permission" — it's "this instruction doesn't exist in your world." Unregistered instructions are dropped at the decode stage and never enter any execution path.&lt;/p&gt;
&lt;p&gt;Using a bitmap has an additional benefit: side-channel resistance. If you check permissions before checking existence, an attacker can infer which instructions "exist but are disabled" through tiny timing differences in responses. The Capability Map forces existence-check first. All unauthorized operations produce identical response timing. No information leakage surface.&lt;/p&gt;
&lt;p&gt;Least privilege isn't a configuration option. It's a physical property of the protocol.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capability Map — Making Unauthorized Operations Non-Existent" src="https://vincentping.com/images/20260607/capability-map.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Instruction Set: How to Organize 256 Slots&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The instruction set structure came together faster, because there was an obvious reference: APDU.&lt;/p&gt;
&lt;p&gt;Frame format borrowed directly: &lt;code&gt;[CLA][INS][P1][P2][Lc][Data][Le]&lt;/code&gt;. The high nibble of the INS byte serves as a logical page index — &lt;code&gt;0x00–0x0F&lt;/code&gt; is Core ISA, the baseline observation instructions, permanently locked; &lt;code&gt;0x20–0x8F&lt;/code&gt; is Standard ISA, seven functional groups; &lt;code&gt;0xC0–0xFF&lt;/code&gt; is Vendor Extensions, open for domain-specific customization.&lt;/p&gt;
&lt;p&gt;Any developer reading an instruction code knows the group at a glance. &lt;code&gt;0x2x&lt;/code&gt; is Process Control, no table lookup needed.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ASys Instruction Set — INS Byte Layout" src="https://vincentping.com/images/20260607/ins-byte-layout.jpg"&gt;&lt;/p&gt;
&lt;p&gt;More important is the semantic lock on Core ISA: once a core instruction ships, byte offsets never change. New fields can only be appended at the end. Agent parsing code written today is expected to work on some POSIX-compatible system fifty years from now. APDU covers tens of billions of devices precisely because of this long-termism. That's what ASys is trying to inherit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Closing the OODA Loop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Late May, I ran a complete OODA loop demo on RHEL. The RHEL server ran a CPU hog to trigger a load spike. A Python client on Windows called &lt;code&gt;SYS_STATUS&lt;/code&gt; to detect the anomaly, &lt;code&gt;SYS_PROCS&lt;/code&gt; to locate the process, &lt;code&gt;PROC_THROTTLE&lt;/code&gt; to suppress it, then &lt;code&gt;SYS_STATUS&lt;/code&gt; again to confirm recovery. All &lt;code&gt;0x9000&lt;/code&gt; throughout.&lt;/p&gt;
&lt;p&gt;That moment didn't feel like "it works." It felt like "proof of concept confirmed."&lt;/p&gt;
&lt;p&gt;&lt;img alt="OODA Loop — Agent Autonomous Operations Demo" src="https://vincentping.com/images/20260607/ooda-loop.jpg"&gt;&lt;/p&gt;
&lt;p&gt;May 27, v0.3.0 released. Three months from idea to open source.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Where Things Stand&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/vincentping/asys"&gt;github.com/vincentping/asys&lt;/a&gt; is now at v0.3.1.&lt;/p&gt;
&lt;p&gt;Stable today: Core ISA's four observation instructions (&lt;code&gt;SYS_CAPS&lt;/code&gt; / &lt;code&gt;SYS_HELLO&lt;/code&gt; / &lt;code&gt;SYS_STATUS&lt;/code&gt; / &lt;code&gt;SYS_PROCS&lt;/code&gt;), the first batch of Standard ISA control instructions (&lt;code&gt;PROC_THROTTLE&lt;/code&gt; / &lt;code&gt;SVC_RESTART&lt;/code&gt; / &lt;code&gt;TASK_QUERY&lt;/code&gt;), a complete Noise IK encrypted channel, public key whitelist authentication, and Epoch_ID replay protection.&lt;/p&gt;
&lt;p&gt;The most important next piece is the &lt;strong&gt;Python SDK&lt;/strong&gt; — targeting AI Agent developers, designed to drop into LangChain, AutoGen, and similar frameworks. The core design principle: Agents never touch the byte layer directly. They call structured interfaces (&lt;code&gt;sdk.proc_throttle(pid=1234, action="stop")&lt;/code&gt;); the SDK handles parameter validation and binary compilation. LLMs are inherently bad at byte offsets. Having an Agent assemble raw APDU parameters is the wrong abstraction.&lt;/p&gt;
&lt;p&gt;Still planned but not yet implemented: per-Agent fine-grained Capability Maps, an audit black box, chained transport. All in the spec. All coming.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Honest Thoughts&lt;/h2&gt;
&lt;p&gt;Building a protocol solo sounds a little crazy.&lt;/p&gt;
&lt;p&gt;Protocols are usually a committee job — they need multi-party consensus, large bodies of real-world input, exhaustive edge case analysis. But the idea showed up. So I tried. Working alone means decisions move fast. It also means no external pressure forces you to think every corner through. My response has been the same as in smart card days: docs before code. White paper, protocol spec, design notes, implementation notes — these took more time than the code itself. Because writing is the best thinking tool I have. If I can't write it clearly, I don't actually understand it. If I don't understand it, the code will collapse eventually.&lt;/p&gt;
&lt;p&gt;ASys is an exploratory project. It's not a replacement for SSH, not a competitor to Ansible. The gap it's trying to fill: when an Agent needs to manipulate a system at high frequency, low latency, and with full auditability — while staying reachable in extreme conditions — there's currently no purpose-built standard for that. Wrapping an LLM around SSH and calling it AI ops doesn't solve the underlying problem.&lt;/p&gt;
&lt;p&gt;Whether that's worth solving is for others to judge. But I think as Agents move further into production systems, the question "what should the interface between an Agent and a system actually look like?" deserves serious attention.&lt;/p&gt;
&lt;p&gt;If ASys starts that conversation, that's enough.&lt;/p&gt;
&lt;p&gt;One last note: ASys listens on port &lt;strong&gt;7816&lt;/strong&gt; by default. A deliberate tribute to ISO/IEC 7816 — the standard number for smart card communication protocols. Every time I see that number, I'm back in front of a stack of specs from a decade ago: 7816, 14443, EMV, PBOC, UICC, RSA. The years I spent with my face in those pages.&lt;/p&gt;</content><category term="Tech"></category><category term="ASys"></category><category term="AI Agent"></category><category term="Binary Protocol"></category><category term="System Design"></category><category term="Smart Card"></category><category term="Open Source"></category></entry><entry><title>从智能卡到 AI Agent：我为什么做 ASys</title><link href="https://vincentping.com/cn/why-i-built-asys.html" rel="alternate"></link><published>2026-06-07T22:44:00+08:00</published><updated>2026-06-07T22:44:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-06-07:/cn/why-i-built-asys.html</id><summary type="html">&lt;p&gt;记录 ASys 的诞生故事：从智能卡 APDU 协议到专为 AI Agent 设计的二进制系统接口，探讨为什么 AI 运维需要一个全新的通信标准。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;ASys（Agentic System Interface）是一个专为 AI Agent 设计的开源系统接口协议——用二进制指令替代文本命令，用长连接替代每次重新握手，用指令级权限替代宽泛的会话权限。这篇文章讲的是它从哪里来，为什么这样设计。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;去年用 Claude 辅助写代码，感觉像带一个记性很差的实习生。上下文一长就会开始漂移，重启 Session 要好几个回合才能找回状态，前面约好的接口后面就忘了。&lt;/p&gt;
&lt;p&gt;今年一二月再试，用 Claude Code 写 ReCall——一个基于 &lt;a href="/cn/built-a-study-tool-while-preparing-for-comptia-a-plus-now-open-source"&gt;PySide6&lt;/a&gt;
 的桌面题库工具，有配置、UI、数据库、i18n、主题系统、测试，最后还要打包成 Windows 可执行文件。功能不多，但桌面程序开发该有的基本都齐了。这次感觉完全不同了：不是 AI 替我写，依然是我在主导，但 Claude 已经跟得上。说要做什么，它能准确理解；出来的代码基本能用；即使偏了，纠正一下也很快能调回来。&lt;/p&gt;
&lt;p&gt;前后两次，AI 的进步很明显。&lt;/p&gt;
&lt;p&gt;回头看，LLM 目前真正落地的领域：文字处理，以及开发。这两个领域有个共同点：&lt;strong&gt;都是做完就结束的事&lt;/strong&gt;——一篇文章写完发出去，一个功能交付上线，这件事就画句号了。但系统的运维不一样，系统上线之后是实时的、有状态的，问题随时会来，没有"做完"这一说。那是完全不同的一个世界。&lt;/p&gt;
&lt;p&gt;备考 A+ Core 2 那段时间，白天复习刷题，晚上写代码，脑子里一直转一个问题：&lt;strong&gt;AI 辅助开发越来越成熟——那运维呢？&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;当操作者变成了 AI&lt;/h2&gt;
&lt;p&gt;AI 把开发速度拉成指数级之后，存量的积累速度也跟着加快了。每部署一个新服务，就多了一个需要长时间甚至永久维护的对象——这就成了存量。系统不会自己消失，问题会积累，复杂度会叠加。可以这么想象下：运行中的系统整个是一个大湖，开发中的新系统是众多不断涌入的河流。随着河流的数量越来越多、河流中水流的速度越来越快，大湖的扩展速度将超过我们的想象。&lt;/p&gt;
&lt;p&gt;但人工运维是线性的——一个工程师能维护的系统是有限的，就算是有各种工具的帮助，人工运维也跟不上指数级的积累速度。往前看，能接这个盘的只有 AI 运维。&lt;/p&gt;
&lt;p&gt;但 AI 运维要成立，有一个前提需要解决：接口。&lt;/p&gt;
&lt;p&gt;从 POSIX 到 SSH、从 Ansible 到 K8s Operator——这些成熟的工具，每一个都经过了大规模生产验证，在各自的场景下运转良好，还会继续运转很久。但它们的设计前提都是人类操作员。当操作主体变为 AI Agent 时，有几个问题值得从头思考：文本解析随时可能因格式变化而失效；会话级权限对可能产生幻觉的 Agent 风险太高；高频采样时每次握手的开销会成为瓶颈。&lt;/p&gt;
&lt;p&gt;比如"猜文本"的代价。Agent 通过 SSH 执行 &lt;code&gt;ps aux | grep nginx&lt;/code&gt;，拿到的是自由文本——格式会因 OS、locale 和工具版本而异，还得自己解析，每一段可能失效的正则表达式都是一个潜在的幻觉入口。但调用 ASys 的 &lt;code&gt;SYS_PROCS&lt;/code&gt; 指令，拿到的是固定的 44 字节二进制帧：进程总数、top-5 PID、CPU%、内存%、状态标志——类型明确，无歧义，在每个节点上都一样。解析逻辑是一行 &lt;code&gt;struct.unpack&lt;/code&gt;。这不只是性能问题，更重要的是可靠性的量级提升。当解析的负担趋近于零时，Agent 几乎全部的算力就可以用在真正重要的事上：感知、推理、决策。&lt;/p&gt;
&lt;p&gt;&lt;img alt="文本解析 vs 二进制帧" src="https://vincentping.com/images/20260607/text-vs-binary-frame-cn.jpg"&gt;&lt;/p&gt;
&lt;p&gt;ASys 不是要替代这些工具，只是想探索一个问题：如果专门为 Agent 设计，从第一性原理出发，接口应该长什么样？多一个选择而已。&lt;/p&gt;
&lt;p&gt;开源地址：&lt;a href="https://github.com/vincentping/asys"&gt;github.com/vincentping/asys&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;ASys 从哪里来&lt;/h2&gt;
&lt;p&gt;2010 到 2016 年，我在上海的一家智能卡公司做开发——SIM 卡、银行卡、身份证芯片。那个行业有一条铁律：&lt;strong&gt;卡发出去了，没法收回。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;智能卡的开发流程是先写规范，基于规范开发，基于规范测试：功能测试、异常测试、边界覆盖……内部测试完了，还要去电信服务商进行现场测试。繁琐、周期长，但没有别的选择：产品一旦量产出去发现 bug，召回成本是灾难。这和互联网的"边跑边迭代"开发风格，是两种完全不同的哲学。那六年给我留下最深的东西不是某项技术，而是一种本能：&lt;strong&gt;把事情想清楚写清楚，比快速动手更重要。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那六年也让我对很多协议很熟悉，尤其是 ISO/IEC 7816，智能卡通信的 APDU 体系。读卡器向智能卡发二进制指令，拿到固定格式的响应，不需要经过人眼，也从不解析文本。返回 &lt;code&gt;0x9000&lt;/code&gt; 就是成功，返回 &lt;code&gt;0x6982&lt;/code&gt; 即 Security status not satisfied，几十年没变过。这套协议覆盖了全球数百亿设备——每一张银行芯片卡、每一本电子护照、每一张 SIM 卡。它的每一个边界条件，都经过了最严苛的实战验证。&lt;/p&gt;
&lt;p&gt;2016 年之后，我离开了智能卡行业，后来一直在做各种大大小小的网站系统——前端 JS、后端 Python/Go/Java，数据库、服务器、缓存、各种云、各种架构。&lt;/p&gt;
&lt;p&gt;过去一年多又一直在学习 AI，并尝试用 Claude 开发各种项目。随着对 AI 越来越了解，我逐渐相信：&lt;strong&gt;AI 会像工业革命一样彻底改变人类的走向&lt;/strong&gt;。所以，当我完成 ReCall 这个项目后，我就一直在思考做点什么与 AI 相关的事。&lt;/p&gt;
&lt;p&gt;有天晚上，我记得是二月底，复习得很晚了，刚躺下，迷迷糊糊的，脑子里突然冒出了 7816 的 APDU——那些自带美感的二进制指令，固定格式的响应。我一激灵坐了起来：&lt;strong&gt;对呀，为什么不用 APDU 的方式让 Agent 和服务器沟通呢？还要把人类的文本加在中间干嘛？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当晚就把 7816 协议下载下来重新翻了一遍，写了个简单的文档，把初步想法记下来。&lt;/p&gt;
&lt;p&gt;智能卡那六年、网站系统那十年、加上这一年多的 AI 实践——缺了哪一块，都不会在那个迷糊的夜晚把这几样东西联系起来。智能卡的老同事们大多还在嵌入式的世界里；做网站系统的朋友又很少有底层协议设计的背景。也许这就是人们说的，多样性带来涌现。有了这个 idea 不试试可惜了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;三个月，从零到开源&lt;/h2&gt;
&lt;p&gt;今年三月初，A+ Core 2 还没考完，我就开始动手了。&lt;/p&gt;
&lt;p&gt;按智能卡时代养成的习惯，先写文档。从接口设计哲学，到指令集编码，到安全模型，到帧格式，每一块想清楚再写，写着写着发现没想清楚，回去再想。3 月 16 日，文档 v0.1 出来，同一天第一个 PoC 在 Windows 机器和 RHEL 服务端跑通：&lt;code&gt;SYS_HELLO&lt;/code&gt; 指令，返回 &lt;code&gt;0x9000 OK&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;等到考试考完，项目推进就加快了，文档和代码交替迭代。写代码，发现设计有问题，回去改 spec，再继续。不是推倒重来，是不停打磨。&lt;/p&gt;
&lt;p&gt;这个过程里有几个决策点，每个都卡了一段时间。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;传输层：为什么不用 mTLS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;传输层是第一个让我卡住的地方。本能反应是 mTLS，行业常见方案，用的人多，出了问题好查。但越想越不对。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;asyd&lt;/code&gt; 是 ASys 协议的服务端 Daemon，核心用途之一是在系统 OOM、磁盘满这种极端情况下还能用——恰恰是最需要它的时候。如果这时候因为证书过期、CA 连不上而失联，一个在急救时刻失联的接口，比没有接口更危险。而且 OpenSSL 是重量级依赖，和零外部依赖的设计目标根本冲突。&lt;/p&gt;
&lt;p&gt;最终选了 &lt;strong&gt;Noise Protocol IK&lt;/strong&gt;，基于 Monocypher 实现。纯密码学原语，无证书依赖，实现约两千行 C，可以完整审计，1-RTT 握手。这个选择让 &lt;code&gt;asyd&lt;/code&gt; 可以做到单一静态二进制，任何 POSIX 环境都能部署，不带任何运行时风险。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;权限模型：让不该存在的东西真的不存在&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;权限这块卡得更久。最直觉的方案是 ACL 规则表——哪个 Agent 能做什么，配置里写清楚。看上去简单，但不够。&lt;/p&gt;
&lt;p&gt;传统安全模型（SSH/sudo）是为人类操作员设计的——人的操作是探索性的，意图难以预先声明，"宽泛默认权限 + 负向拦截"符合人类的工作方式。但当操作主体变为 AI Agent，这个假设不再成立：Agent 的行为是程序化的，权限边界完全可以在部署时精确声明。&lt;/p&gt;
&lt;p&gt;所以 ASys 可以反过来：系统对 Agent 是一片漆黑，只有在 &lt;strong&gt;Capability Map&lt;/strong&gt; 中显式点亮的指令才"物理存在"。Agent 没被授权的操作，不是"你没权限"，而是"这个指令在你的世界里根本不存在"——未注册的指令在解包阶段直接丢弃，不进入任何执行流。&lt;/p&gt;
&lt;p&gt;用位图还有一个额外的好处：防侧信道攻击。如果先查权限再查存在性，攻击者可以通过响应时间的微小差异推断哪些指令"存在但被禁用"。Capability Map 强制先查存在性——所有未授权操作的响应时间完全一致，消灭信息泄露面。&lt;/p&gt;
&lt;p&gt;最小权限不是配置选项，是协议的物理属性。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capability Map — 让未授权操作不存在" src="https://vincentping.com/images/20260607/capability-map-cn.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;指令集：怎么组织 256 个槽位&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;指令集的组织方式反而想得比较快，因为有现成的参照——APDU。&lt;/p&gt;
&lt;p&gt;帧格式直接借鉴：&lt;code&gt;[CLA][INS][P1][P2][Lc][Data][Le]&lt;/code&gt;。INS 字节的高位半字节作为逻辑页索引——&lt;code&gt;0x00–0x0F&lt;/code&gt; 是 Core ISA，基础观测指令，永久锁定；&lt;code&gt;0x20–0x8F&lt;/code&gt; 是 Standard ISA，七个功能组；&lt;code&gt;0xC0–0xFF&lt;/code&gt; 是 Vendor Extensions，留给各领域自定义。&lt;/p&gt;
&lt;p&gt;任何开发者看到指令码就知道分组，&lt;code&gt;0x2x&lt;/code&gt; 一眼是 Process Control，不需要查表。&lt;/p&gt;
&lt;p&gt;&lt;img alt="ASys 指令集结构 — INS 字节布局" src="https://vincentping.com/images/20260607/ins-byte-layout-cn.jpg"&gt;&lt;/p&gt;
&lt;p&gt;更重要的是 Core ISA 的语义锁定：核心指令一旦发布，字节偏移永远不变，新字段只能在末尾扩展。今天写的 Agent 解析代码，期望是在 50 年后的某个 POSIX 兼容系统上还有效。APDU 协议体系能覆盖数百亿设备，正是因为这种长期主义。ASys 想继承的，也是这个。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;跑通 OODA&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;5 月底，在 RHEL 上跑通了完整的 OODA 闭环演示：RHEL 服务端运行 CPU hog 触发负载异常，位于 Windows 系统上的 Python 客户端依次调用 &lt;code&gt;SYS_STATUS&lt;/code&gt; 发现异常、&lt;code&gt;SYS_PROCS&lt;/code&gt; 定位进程、&lt;code&gt;PROC_THROTTLE&lt;/code&gt; 压制、再次 &lt;code&gt;SYS_STATUS&lt;/code&gt; 核实恢复，全程 &lt;code&gt;0x9000&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;那一刻的感受不是"成了"，而是"证明可行了"。&lt;/p&gt;
&lt;p&gt;&lt;img alt="OODA 闭环 — Agent 自主运维演示" src="https://vincentping.com/images/20260607/ooda-loop-cn.jpg"&gt;&lt;/p&gt;
&lt;p&gt;5 月 27 日，v0.3.0 开源。从三月初构思到开源，三个月。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;现在在哪里&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/vincentping/asys"&gt;github.com/vincentping/asys&lt;/a&gt; 现在是 v0.3.1。&lt;/p&gt;
&lt;p&gt;目前稳定实现：Core ISA 四条观测指令（&lt;code&gt;SYS_CAPS&lt;/code&gt; / &lt;code&gt;SYS_HELLO&lt;/code&gt; / &lt;code&gt;SYS_STATUS&lt;/code&gt; / &lt;code&gt;SYS_PROCS&lt;/code&gt;）、首批 Standard ISA 操控指令（&lt;code&gt;PROC_THROTTLE&lt;/code&gt; / &lt;code&gt;SVC_RESTART&lt;/code&gt; / &lt;code&gt;TASK_QUERY&lt;/code&gt;）、完整的 Noise IK 加密通道、公钥白名单身份验证、Epoch_ID 防重放机制。&lt;/p&gt;
&lt;p&gt;接下来最重要的是 &lt;strong&gt;Python SDK&lt;/strong&gt;：面向 AI Agent 开发者，目标是能直接嵌入 LangChain、AutoGen 这类主流 Agent 框架。核心设计原则是 Agent 永远不直接操作字节层——调用结构化接口（&lt;code&gt;sdk.proc_throttle(pid=1234, action="stop")&lt;/code&gt;），SDK 负责参数校验和二进制编译。LLM 对字节偏移天然不敏感，让 Agent 直接拼 APDU 参数是错误的使用方式。&lt;/p&gt;
&lt;p&gt;还有一些已规划但尚未实现的功能：per-Agent 细粒度 Capability Map、审计黑匣子、链式传输。这些都在规范里，会逐步落地。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;一点感受&lt;/h2&gt;
&lt;p&gt;一个人做协议，听上去有点异想天开。&lt;/p&gt;
&lt;p&gt;协议通常是委员会的事——需要多方共识，需要大量案例输入，需要反复论证边界条件。但既然这个 idea 冒出来了，那就试试吧。一个人做的好处是决策可以很快，坏处是没有外部压力强迫你把每个角落想清楚。&lt;/p&gt;
&lt;p&gt;我的应对方式是：文档比代码优先。白皮书、规范文档、设计 Notes、实施 Notes，这些花了我比代码多得多的时间。因为文字是最好的思维工具——写不清楚，说明想不清楚；想不清楚，代码写出来迟早要推倒。这是智能卡那六年给我的东西，在这个项目里用上了。&lt;/p&gt;
&lt;p&gt;ASys 是一个探索性项目，不是 SSH 的替代品，不是 Ansible 的竞争者。它试图填的空白是：当 Agent 需要高频、低延迟、可审计地操控系统，且要在极端场景下保持接口可用时，目前没有一个专门为这个场景设计的标准化方案。&lt;/p&gt;
&lt;p&gt;值不值得解决，见仁见智。但我认为，随着 Agent 越来越多地进入生产系统，"Agent 和系统之间的接口应该是什么样的"是一个值得认真对待的问题——不应该只是在 SSH 上套一层 LLM 就算了。&lt;/p&gt;
&lt;p&gt;如果 ASys 能引发一些这方面的讨论，已经足够。&lt;/p&gt;
&lt;p&gt;对了，ASys 默认监听的我特意选择了 &lt;strong&gt;7816 端口&lt;/strong&gt;。这是我内心对 ISO/IEC 7816 的致敬——智能卡通信协议的标准编号。每次想起这个数字，就想起十几年前那一大堆规范——7816、14443、EMV、PBOC、UICC、RSA……趴在上面研究的日子。&lt;/p&gt;</content><category term="Tech"></category><category term="ASys"></category><category term="AI Agent"></category><category term="Binary Protocol"></category><category term="System Design"></category><category term="Smart Card"></category><category term="Open Source"></category></entry><entry><title>从智能卡到 AI Agent：我为什么做 ASys</title><link href="https://vincentping.com/cn/why-i-built-asys.html" rel="alternate"></link><published>2026-06-07T22:44:00+08:00</published><updated>2026-06-07T22:44:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-06-07:/cn/why-i-built-asys.html</id><summary type="html">&lt;p&gt;记录 ASys 的诞生故事：从智能卡 APDU 协议到专为 AI Agent 设计的二进制系统接口，探讨为什么 AI 运维需要一个全新的通信标准。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;ASys（Agentic System Interface）是一个专为 AI Agent 设计的开源系统接口协议——用二进制指令替代文本命令，用长连接替代每次重新握手，用指令级权限替代宽泛的会话权限。这篇文章讲的是它从哪里来，为什么这样设计。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;去年用 Claude 辅助写代码，感觉像带一个记性很差的实习生。上下文一长就会开始漂移，重启 Session 要好几个回合才能找回状态，前面约好的接口后面就忘了。&lt;/p&gt;
&lt;p&gt;今年一二月再试，用 Claude Code 写 ReCall——一个基于 &lt;a href="/cn/built-a-study-tool-while-preparing-for-comptia-a-plus-now-open-source"&gt;PySide6&lt;/a&gt;
 的桌面题库工具，有配置、UI、数据库、i18n、主题系统、测试，最后还要打包成 Windows 可执行文件。功能不多，但桌面程序开发该有的基本都齐了。这次感觉完全不同了：不是 AI 替我写，依然是我在主导，但 Claude 已经跟得上。说要做什么，它能准确理解；出来的代码基本能用；即使偏了，纠正一下也很快能调回来。&lt;/p&gt;
&lt;p&gt;前后两次，AI 的进步很明显。&lt;/p&gt;
&lt;p&gt;回头看，LLM 目前真正落地的领域：文字处理，以及开发。这两个领域有个共同点：&lt;strong&gt;都是做完就结束的事&lt;/strong&gt;——一篇文章写完发出去，一个功能交付上线，这件事就画句号了。但系统的运维不一样，系统上线之后是实时的、有状态的，问题随时会来，没有"做完"这一说。那是完全不同的一个世界。&lt;/p&gt;
&lt;p&gt;备考 A+ Core 2 那段时间，白天复习刷题，晚上写代码，脑子里一直转一个问题：&lt;strong&gt;AI 辅助开发越来越成熟——那运维呢？&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;当操作者变成了 AI&lt;/h2&gt;
&lt;p&gt;AI 把开发速度拉成指数级之后，存量的积累速度也跟着加快了。每部署一个新服务，就多了一个需要长时间甚至永久维护的对象——这就成了存量。系统不会自己消失，问题会积累，复杂度会叠加。可以这么想象下：运行中的系统整个是一个大湖，开发中的新系统是众多不断涌入的河流。随着河流的数量越来越多、河流中水流的速度越来越快，大湖的扩展速度将超过我们的想象。&lt;/p&gt;
&lt;p&gt;但人工运维是线性的——一个工程师能维护的系统是有限的，就算是有各种工具的帮助，人工运维也跟不上指数级的积累速度。往前看，能接这个盘的只有 AI 运维。&lt;/p&gt;
&lt;p&gt;但 AI 运维要成立，有一个前提需要解决：接口。&lt;/p&gt;
&lt;p&gt;从 POSIX 到 SSH、从 Ansible 到 K8s Operator——这些成熟的工具，每一个都经过了大规模生产验证，在各自的场景下运转良好，还会继续运转很久。但它们的设计前提都是人类操作员。当操作主体变为 AI Agent 时，有几个问题值得从头思考：文本解析随时可能因格式变化而失效；会话级权限对可能产生幻觉的 Agent 风险太高；高频采样时每次握手的开销会成为瓶颈。&lt;/p&gt;
&lt;p&gt;比如"猜文本"的代价。Agent 通过 SSH 执行 &lt;code&gt;ps aux | grep nginx&lt;/code&gt;，拿到的是自由文本——格式会因 OS、locale 和工具版本而异，还得自己解析，每一段可能失效的正则表达式都是一个潜在的幻觉入口。但调用 ASys 的 &lt;code&gt;SYS_PROCS&lt;/code&gt; 指令，拿到的是固定的 44 字节二进制帧：进程总数、top-5 PID、CPU%、内存%、状态标志——类型明确，无歧义，在每个节点上都一样。解析逻辑是一行 &lt;code&gt;struct.unpack&lt;/code&gt;。这不只是性能问题，更重要的是可靠性的量级提升。当解析的负担趋近于零时，Agent 几乎全部的算力就可以用在真正重要的事上：感知、推理、决策。&lt;/p&gt;
&lt;p&gt;&lt;img alt="文本解析 vs 二进制帧" src="https://vincentping.com/images/20260607/text-vs-binary-frame-cn.jpg"&gt;&lt;/p&gt;
&lt;p&gt;ASys 不是要替代这些工具，只是想探索一个问题：如果专门为 Agent 设计，从第一性原理出发，接口应该长什么样？多一个选择而已。&lt;/p&gt;
&lt;p&gt;开源地址：&lt;a href="https://github.com/vincentping/asys"&gt;github.com/vincentping/asys&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;ASys 从哪里来&lt;/h2&gt;
&lt;p&gt;2010 到 2016 年，我在上海的一家智能卡公司做开发——SIM 卡、银行卡、身份证芯片。那个行业有一条铁律：&lt;strong&gt;卡发出去了，没法收回。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;智能卡的开发流程是先写规范，基于规范开发，基于规范测试：功能测试、异常测试、边界覆盖……内部测试完了，还要去电信服务商进行现场测试。繁琐、周期长，但没有别的选择：产品一旦量产出去发现 bug，召回成本是灾难。这和互联网的"边跑边迭代"开发风格，是两种完全不同的哲学。那六年给我留下最深的东西不是某项技术，而是一种本能：&lt;strong&gt;把事情想清楚写清楚，比快速动手更重要。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那六年也让我对很多协议很熟悉，尤其是 ISO/IEC 7816，智能卡通信的 APDU 体系。读卡器向智能卡发二进制指令，拿到固定格式的响应，不需要经过人眼，也从不解析文本。返回 &lt;code&gt;0x9000&lt;/code&gt; 就是成功，返回 &lt;code&gt;0x6982&lt;/code&gt; 即 Security status not satisfied，几十年没变过。这套协议覆盖了全球数百亿设备——每一张银行芯片卡、每一本电子护照、每一张 SIM 卡。它的每一个边界条件，都经过了最严苛的实战验证。&lt;/p&gt;
&lt;p&gt;2016 年之后，我离开了智能卡行业，后来一直在做各种大大小小的网站系统——前端 JS、后端 Python/Go/Java，数据库、服务器、缓存、各种云、各种架构。&lt;/p&gt;
&lt;p&gt;过去一年多又一直在学习 AI，并尝试用 Claude 开发各种项目。随着对 AI 越来越了解，我逐渐相信：&lt;strong&gt;AI 会像工业革命一样彻底改变人类的走向&lt;/strong&gt;。所以，当我完成 ReCall 这个项目后，我就一直在思考做点什么与 AI 相关的事。&lt;/p&gt;
&lt;p&gt;有天晚上，我记得是二月底，复习得很晚了，刚躺下，迷迷糊糊的，脑子里突然冒出了 7816 的 APDU——那些自带美感的二进制指令，固定格式的响应。我一激灵坐了起来：&lt;strong&gt;对呀，为什么不用 APDU 的方式让 Agent 和服务器沟通呢？还要把人类的文本加在中间干嘛？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当晚就把 7816 协议下载下来重新翻了一遍，写了个简单的文档，把初步想法记下来。&lt;/p&gt;
&lt;p&gt;智能卡那六年、网站系统那十年、加上这一年多的 AI 实践——缺了哪一块，都不会在那个迷糊的夜晚把这几样东西联系起来。智能卡的老同事们大多还在嵌入式的世界里；做网站系统的朋友又很少有底层协议设计的背景。也许这就是人们说的，多样性带来涌现。有了这个 idea 不试试可惜了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;三个月，从零到开源&lt;/h2&gt;
&lt;p&gt;今年三月初，A+ Core 2 还没考完，我就开始动手了。&lt;/p&gt;
&lt;p&gt;按智能卡时代养成的习惯，先写文档。从接口设计哲学，到指令集编码，到安全模型，到帧格式，每一块想清楚再写，写着写着发现没想清楚，回去再想。3 月 16 日，文档 v0.1 出来，同一天第一个 PoC 在 Windows 机器和 RHEL 服务端跑通：&lt;code&gt;SYS_HELLO&lt;/code&gt; 指令，返回 &lt;code&gt;0x9000 OK&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;等到考试考完，项目推进就加快了，文档和代码交替迭代。写代码，发现设计有问题，回去改 spec，再继续。不是推倒重来，是不停打磨。&lt;/p&gt;
&lt;p&gt;这个过程里有几个决策点，每个都卡了一段时间。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;传输层：为什么不用 mTLS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;传输层是第一个让我卡住的地方。本能反应是 mTLS，行业常见方案，用的人多，出了问题好查。但越想越不对。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;asyd&lt;/code&gt; 是 ASys 协议的服务端 Daemon，核心用途之一是在系统 OOM、磁盘满这种极端情况下还能用——恰恰是最需要它的时候。如果这时候因为证书过期、CA 连不上而失联，一个在急救时刻失联的接口，比没有接口更危险。而且 OpenSSL 是重量级依赖，和零外部依赖的设计目标根本冲突。&lt;/p&gt;
&lt;p&gt;最终选了 &lt;strong&gt;Noise Protocol IK&lt;/strong&gt;，基于 Monocypher 实现。纯密码学原语，无证书依赖，实现约两千行 C，可以完整审计，1-RTT 握手。这个选择让 &lt;code&gt;asyd&lt;/code&gt; 可以做到单一静态二进制，任何 POSIX 环境都能部署，不带任何运行时风险。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;权限模型：让不该存在的东西真的不存在&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;权限这块卡得更久。最直觉的方案是 ACL 规则表——哪个 Agent 能做什么，配置里写清楚。看上去简单，但不够。&lt;/p&gt;
&lt;p&gt;传统安全模型（SSH/sudo）是为人类操作员设计的——人的操作是探索性的，意图难以预先声明，"宽泛默认权限 + 负向拦截"符合人类的工作方式。但当操作主体变为 AI Agent，这个假设不再成立：Agent 的行为是程序化的，权限边界完全可以在部署时精确声明。&lt;/p&gt;
&lt;p&gt;所以 ASys 可以反过来：系统对 Agent 是一片漆黑，只有在 &lt;strong&gt;Capability Map&lt;/strong&gt; 中显式点亮的指令才"物理存在"。Agent 没被授权的操作，不是"你没权限"，而是"这个指令在你的世界里根本不存在"——未注册的指令在解包阶段直接丢弃，不进入任何执行流。&lt;/p&gt;
&lt;p&gt;用位图还有一个额外的好处：防侧信道攻击。如果先查权限再查存在性，攻击者可以通过响应时间的微小差异推断哪些指令"存在但被禁用"。Capability Map 强制先查存在性——所有未授权操作的响应时间完全一致，消灭信息泄露面。&lt;/p&gt;
&lt;p&gt;最小权限不是配置选项，是协议的物理属性。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capability Map — 让未授权操作不存在" src="https://vincentping.com/images/20260607/capability-map-cn.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;指令集：怎么组织 256 个槽位&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;指令集的组织方式反而想得比较快，因为有现成的参照——APDU。&lt;/p&gt;
&lt;p&gt;帧格式直接借鉴：&lt;code&gt;[CLA][INS][P1][P2][Lc][Data][Le]&lt;/code&gt;。INS 字节的高位半字节作为逻辑页索引——&lt;code&gt;0x00–0x0F&lt;/code&gt; 是 Core ISA，基础观测指令，永久锁定；&lt;code&gt;0x20–0x8F&lt;/code&gt; 是 Standard ISA，七个功能组；&lt;code&gt;0xC0–0xFF&lt;/code&gt; 是 Vendor Extensions，留给各领域自定义。&lt;/p&gt;
&lt;p&gt;任何开发者看到指令码就知道分组，&lt;code&gt;0x2x&lt;/code&gt; 一眼是 Process Control，不需要查表。&lt;/p&gt;
&lt;p&gt;&lt;img alt="ASys 指令集结构 — INS 字节布局" src="https://vincentping.com/images/20260607/ins-byte-layout-cn.jpg"&gt;&lt;/p&gt;
&lt;p&gt;更重要的是 Core ISA 的语义锁定：核心指令一旦发布，字节偏移永远不变，新字段只能在末尾扩展。今天写的 Agent 解析代码，期望是在 50 年后的某个 POSIX 兼容系统上还有效。APDU 协议体系能覆盖数百亿设备，正是因为这种长期主义。ASys 想继承的，也是这个。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;跑通 OODA&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;5 月底，在 RHEL 上跑通了完整的 OODA 闭环演示：RHEL 服务端运行 CPU hog 触发负载异常，位于 Windows 系统上的 Python 客户端依次调用 &lt;code&gt;SYS_STATUS&lt;/code&gt; 发现异常、&lt;code&gt;SYS_PROCS&lt;/code&gt; 定位进程、&lt;code&gt;PROC_THROTTLE&lt;/code&gt; 压制、再次 &lt;code&gt;SYS_STATUS&lt;/code&gt; 核实恢复，全程 &lt;code&gt;0x9000&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;那一刻的感受不是"成了"，而是"证明可行了"。&lt;/p&gt;
&lt;p&gt;&lt;img alt="OODA 闭环 — Agent 自主运维演示" src="https://vincentping.com/images/20260607/ooda-loop-cn.jpg"&gt;&lt;/p&gt;
&lt;p&gt;5 月 27 日，v0.3.0 开源。从三月初构思到开源，三个月。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;现在在哪里&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/vincentping/asys"&gt;github.com/vincentping/asys&lt;/a&gt; 现在是 v0.3.1。&lt;/p&gt;
&lt;p&gt;目前稳定实现：Core ISA 四条观测指令（&lt;code&gt;SYS_CAPS&lt;/code&gt; / &lt;code&gt;SYS_HELLO&lt;/code&gt; / &lt;code&gt;SYS_STATUS&lt;/code&gt; / &lt;code&gt;SYS_PROCS&lt;/code&gt;）、首批 Standard ISA 操控指令（&lt;code&gt;PROC_THROTTLE&lt;/code&gt; / &lt;code&gt;SVC_RESTART&lt;/code&gt; / &lt;code&gt;TASK_QUERY&lt;/code&gt;）、完整的 Noise IK 加密通道、公钥白名单身份验证、Epoch_ID 防重放机制。&lt;/p&gt;
&lt;p&gt;接下来最重要的是 &lt;strong&gt;Python SDK&lt;/strong&gt;：面向 AI Agent 开发者，目标是能直接嵌入 LangChain、AutoGen 这类主流 Agent 框架。核心设计原则是 Agent 永远不直接操作字节层——调用结构化接口（&lt;code&gt;sdk.proc_throttle(pid=1234, action="stop")&lt;/code&gt;），SDK 负责参数校验和二进制编译。LLM 对字节偏移天然不敏感，让 Agent 直接拼 APDU 参数是错误的使用方式。&lt;/p&gt;
&lt;p&gt;还有一些已规划但尚未实现的功能：per-Agent 细粒度 Capability Map、审计黑匣子、链式传输。这些都在规范里，会逐步落地。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;一点感受&lt;/h2&gt;
&lt;p&gt;一个人做协议，听上去有点异想天开。&lt;/p&gt;
&lt;p&gt;协议通常是委员会的事——需要多方共识，需要大量案例输入，需要反复论证边界条件。但既然这个 idea 冒出来了，那就试试吧。一个人做的好处是决策可以很快，坏处是没有外部压力强迫你把每个角落想清楚。&lt;/p&gt;
&lt;p&gt;我的应对方式是：文档比代码优先。白皮书、规范文档、设计 Notes、实施 Notes，这些花了我比代码多得多的时间。因为文字是最好的思维工具——写不清楚，说明想不清楚；想不清楚，代码写出来迟早要推倒。这是智能卡那六年给我的东西，在这个项目里用上了。&lt;/p&gt;
&lt;p&gt;ASys 是一个探索性项目，不是 SSH 的替代品，不是 Ansible 的竞争者。它试图填的空白是：当 Agent 需要高频、低延迟、可审计地操控系统，且要在极端场景下保持接口可用时，目前没有一个专门为这个场景设计的标准化方案。&lt;/p&gt;
&lt;p&gt;值不值得解决，见仁见智。但我认为，随着 Agent 越来越多地进入生产系统，"Agent 和系统之间的接口应该是什么样的"是一个值得认真对待的问题——不应该只是在 SSH 上套一层 LLM 就算了。&lt;/p&gt;
&lt;p&gt;如果 ASys 能引发一些这方面的讨论，已经足够。&lt;/p&gt;
&lt;p&gt;对了，ASys 默认监听的我特意选择了 &lt;strong&gt;7816 端口&lt;/strong&gt;。这是我内心对 ISO/IEC 7816 的致敬——智能卡通信协议的标准编号。每次想起这个数字，就想起十几年前那一大堆规范——7816、14443、EMV、PBOC、UICC、RSA……趴在上面研究的日子。&lt;/p&gt;</content><category term="Tech"></category><category term="ASys"></category><category term="AI Agent"></category><category term="Binary Protocol"></category><category term="System Design"></category><category term="Smart Card"></category><category term="Open Source"></category></entry><entry><title>Grant in Lincoln Park</title><link href="https://vincentping.com/en/grant-in-lincoln-park.html" rel="alternate"></link><published>2026-06-05T22:55:00+08:00</published><updated>2026-06-05T22:55:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-06-05:/en/grant-in-lincoln-park.html</id><summary type="html">&lt;p&gt;Lincoln Park was once Chicago's municipal cemetery. The Grant statue has stood there for over a century — surviving a lightning strike in 1892 and a monuments review committee in 2020. Removing a bronze doesn't remove history; sometimes it only moves the problem out of sight. One person can be both an instrument of justice and an agent of injustice. The complexity doesn't resolve.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Lincoln Park" src="https://vincentping.com/images/20260605/cover.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;Lincoln Park, Chicago skyline beyond.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There were once more than thirty thousand bodies buried in Lincoln Park.&lt;/p&gt;
&lt;p&gt;This is not a metaphor. Before the 1850s, this stretch of lakefront green was Chicago's municipal cemetery. The city expanded. The government decided to move the dead and return the land to the living. Most of the remains were relocated — but no one could guarantee the job was finished. The lawn where joggers run today, where families spread their blankets, where children chase squirrels — beneath it, some nineteenth-century Chicagoans may still be sleeping. Names unknown. The removal orders never found them.&lt;/p&gt;
&lt;p&gt;Lincoln was assassinated in 1865, and the park was renamed in his honor. Death and commemoration. This place never pretended that life was light.&lt;/p&gt;
&lt;p&gt;I came today specifically to see the Grant statue. I'd been cooped up for days wrestling with Claude Code — when it's cooperative, it makes you want to write code forever; when it isn't, it's a wall you can't get through. After enough of that, a statue seemed like a reasonable destination.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;General Ulysses Grant — who would become president — died in July 1885. In his final months he raced his throat cancer, driving himself to finish his memoirs, hoping to leave his wife some royalty money. Mark Twain published them, and the contract became one of the most lucrative in American publishing history. Grant didn't live to see the check. Four days after he died, New York held his funeral. A million people lined the streets.&lt;/p&gt;
&lt;p&gt;Chicago decided to build him a monument. Within a month of the announcement, tens of thousands of dollars had come in from every corner of the city, from nearly one hundred thousand donors. When the statue was unveiled in 1891, roughly two hundred thousand people were there. Chicago's total population was just over a million. One in five.&lt;/p&gt;
&lt;p&gt;I stood in front of the statue and looked up at how Grant sat his horse. No triumphant gesture. No arm sweeping toward the horizon. The horse's front hooves stayed on the ground. He simply sat there, expression composed, like a man who had nothing left to prove.&lt;/p&gt;
&lt;p&gt;The year after the statue was completed — 1892 — lightning struck. It hit near the arch at the base. Three people sheltering there were killed instantly. The bronze was untouched.&lt;/p&gt;
&lt;p&gt;I don't know what to do with that detail. But it stays with me.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Grant Statue" src="https://vincentping.com/images/20260605/grant1.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;Grant Statue&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;There is another structure in the park worth mentioning, though most visitors walk past it without a second glance. The Carlson Cottage, built in 1888, was originally a public restroom — segregated by sex, brick and stone, designed by the architect Joseph Lyman Silsbee. Silsbee's office once employed a young apprentice named Frank Lloyd Wright, who went on to become one of the most consequential architects of the twentieth century.&lt;/p&gt;
&lt;p&gt;A public toilet. From the office that shaped a century of building.&lt;/p&gt;
&lt;p&gt;In 2008, the federal government funded the cottage's restoration through the Save America's Treasures program. Bureaucracies occasionally do surprising things — they decided to restore an 1888 outhouse because it was history. That logic, I accept.&lt;/p&gt;
&lt;p&gt;But once restored, it was no longer used as a restroom. It became an event space, and most days it sits quietly locked. The history was preserved; the function died. It's a strange outcome — like maintaining a body in perfect condition after removing everything it was ever for.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Carlson Cottage" src="https://vincentping.com/images/20260605/carlson_cottage.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;Carlson Cottage&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;In 2020, Mayor Lori Lightfoot, amid a nationwide reckoning with public monuments, formed the Chicago Monuments Project. The proximate cause was the Columbus statue — toppled by protesters, or quietly removed by the city before protesters could topple it, depending on which account you read. The committee's mandate was to review the city's monuments and public art: what should stay, what should go, whose stories had been left out of the official memory.&lt;/p&gt;
&lt;p&gt;There is nothing inherently wrong with this. A city periodically examining what it has chosen to memorialize is ordinary civic practice. Public monuments are not neutral. Each one is a decision, made by a particular group of people in a particular era, telling everyone who passes: &lt;em&gt;this person, this event, deserves to be remembered.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Grant's statue was on the review list.&lt;/p&gt;
&lt;p&gt;The argument against him: he had signed policies that were unjust to Native Americans, and the westward expansion of his presidency brought forced removal and cultural destruction to tribal nations. These are facts.&lt;/p&gt;
&lt;p&gt;But Grant was also the Union general who defeated the Confederacy — the man whose military pressure compelled Lee's surrender at Appomattox, the moment slavery's military defense collapsed. During Reconstruction, he was among the rare presidents who genuinely tried to protect the civil rights of Black Americans, deploying federal force against the Ku Klux Klan. The memoirs he finished while racing toward death were later called by Hemingway the best account of war he had ever read.&lt;/p&gt;
&lt;p&gt;One person can be both of these things at once: an instrument of one justice, and an agent of another injustice.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I have no objection to the Monuments Project's existence. Scrutinizing history is not the same as erasing it. But I've always had a fundamental skepticism toward the logic that removing a bronze statue can repair a historical wound.&lt;/p&gt;
&lt;p&gt;The thirty thousand bodies once buried under Lincoln Park did not change their position when the park changed its name. Removing a monument does not remove history. Sometimes it only creates a feeling of cleanliness — the problem seems handled, when really it has simply moved out of sight.&lt;/p&gt;
&lt;p&gt;The Grant statue was ultimately not removed. The report recommended keeping it, with an interpretive panel added to provide fuller historical context. That seems like the right call, or close enough to it — not because it satisfies everyone, but because it acknowledges that historical complexity cannot be resolved by a piece of bronze, or by taking a piece of bronze away. For what it's worth, I walked around the base of that arch today, all the way around, and found no interpretive panel. Perhaps it's still being made.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I sat near the statue for a long time. Wind off Lake Michigan. A man walking his dog. Kids on bikes. In the distance, by the smaller pond, someone was getting married. Laughter carried over.&lt;/p&gt;
&lt;p&gt;Grant sat on his horse, Lake Michigan to his left, facing the city to the south. Some say the orientation is deliberate — the general keeping watch over the former Confederacy, a symbol of union and victory. But the expression I described earlier as composed — I want to change that word now. It's the tiredness of someone who has seen too much. Not a defeated tiredness, but the kind that no longer needs to explain itself to anyone.&lt;/p&gt;
&lt;p&gt;The lightning of 1892 killed three people. It didn't touch him.&lt;/p&gt;
&lt;p&gt;I don't know what that means. But when something a city built in one month with money from a hundred thousand people is still standing a hundred and thirty years later — I'm willing to sit beside it a while longer.&lt;/p&gt;
&lt;p&gt;There may still be some nineteenth-century Chicagoans underfoot who were never moved. That doesn't seem like a bad arrangement.&lt;/p&gt;
&lt;p&gt;The dead and the bronze are more patient than we tend to think.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Grant Statue" src="https://vincentping.com/images/20260605/grant2.jpg"&gt;&lt;/p&gt;</content><category term="Others"></category><category term="Chicago"></category><category term="Lincoln Park"></category><category term="history"></category><category term="public memory"></category><category term="monuments"></category><category term="essay"></category></entry><entry><title>Grant in Lincoln Park</title><link href="https://vincentping.com/en/grant-in-lincoln-park.html" rel="alternate"></link><published>2026-06-05T22:55:00+08:00</published><updated>2026-06-05T22:55:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-06-05:/en/grant-in-lincoln-park.html</id><summary type="html">&lt;p&gt;Lincoln Park was once Chicago's municipal cemetery. The Grant statue has stood there for over a century — surviving a lightning strike in 1892 and a monuments review committee in 2020. Removing a bronze doesn't remove history; sometimes it only moves the problem out of sight. One person can be both an instrument of justice and an agent of injustice. The complexity doesn't resolve.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Lincoln Park" src="https://vincentping.com/images/20260605/cover.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;Lincoln Park, Chicago skyline beyond.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There were once more than thirty thousand bodies buried in Lincoln Park.&lt;/p&gt;
&lt;p&gt;This is not a metaphor. Before the 1850s, this stretch of lakefront green was Chicago's municipal cemetery. The city expanded. The government decided to move the dead and return the land to the living. Most of the remains were relocated — but no one could guarantee the job was finished. The lawn where joggers run today, where families spread their blankets, where children chase squirrels — beneath it, some nineteenth-century Chicagoans may still be sleeping. Names unknown. The removal orders never found them.&lt;/p&gt;
&lt;p&gt;Lincoln was assassinated in 1865, and the park was renamed in his honor. Death and commemoration. This place never pretended that life was light.&lt;/p&gt;
&lt;p&gt;I came today specifically to see the Grant statue. I'd been cooped up for days wrestling with Claude Code — when it's cooperative, it makes you want to write code forever; when it isn't, it's a wall you can't get through. After enough of that, a statue seemed like a reasonable destination.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;General Ulysses Grant — who would become president — died in July 1885. In his final months he raced his throat cancer, driving himself to finish his memoirs, hoping to leave his wife some royalty money. Mark Twain published them, and the contract became one of the most lucrative in American publishing history. Grant didn't live to see the check. Four days after he died, New York held his funeral. A million people lined the streets.&lt;/p&gt;
&lt;p&gt;Chicago decided to build him a monument. Within a month of the announcement, tens of thousands of dollars had come in from every corner of the city, from nearly one hundred thousand donors. When the statue was unveiled in 1891, roughly two hundred thousand people were there. Chicago's total population was just over a million. One in five.&lt;/p&gt;
&lt;p&gt;I stood in front of the statue and looked up at how Grant sat his horse. No triumphant gesture. No arm sweeping toward the horizon. The horse's front hooves stayed on the ground. He simply sat there, expression composed, like a man who had nothing left to prove.&lt;/p&gt;
&lt;p&gt;The year after the statue was completed — 1892 — lightning struck. It hit near the arch at the base. Three people sheltering there were killed instantly. The bronze was untouched.&lt;/p&gt;
&lt;p&gt;I don't know what to do with that detail. But it stays with me.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Grant Statue" src="https://vincentping.com/images/20260605/grant1.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;Grant Statue&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;There is another structure in the park worth mentioning, though most visitors walk past it without a second glance. The Carlson Cottage, built in 1888, was originally a public restroom — segregated by sex, brick and stone, designed by the architect Joseph Lyman Silsbee. Silsbee's office once employed a young apprentice named Frank Lloyd Wright, who went on to become one of the most consequential architects of the twentieth century.&lt;/p&gt;
&lt;p&gt;A public toilet. From the office that shaped a century of building.&lt;/p&gt;
&lt;p&gt;In 2008, the federal government funded the cottage's restoration through the Save America's Treasures program. Bureaucracies occasionally do surprising things — they decided to restore an 1888 outhouse because it was history. That logic, I accept.&lt;/p&gt;
&lt;p&gt;But once restored, it was no longer used as a restroom. It became an event space, and most days it sits quietly locked. The history was preserved; the function died. It's a strange outcome — like maintaining a body in perfect condition after removing everything it was ever for.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Carlson Cottage" src="https://vincentping.com/images/20260605/carlson_cottage.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;Carlson Cottage&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;In 2020, Mayor Lori Lightfoot, amid a nationwide reckoning with public monuments, formed the Chicago Monuments Project. The proximate cause was the Columbus statue — toppled by protesters, or quietly removed by the city before protesters could topple it, depending on which account you read. The committee's mandate was to review the city's monuments and public art: what should stay, what should go, whose stories had been left out of the official memory.&lt;/p&gt;
&lt;p&gt;There is nothing inherently wrong with this. A city periodically examining what it has chosen to memorialize is ordinary civic practice. Public monuments are not neutral. Each one is a decision, made by a particular group of people in a particular era, telling everyone who passes: &lt;em&gt;this person, this event, deserves to be remembered.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Grant's statue was on the review list.&lt;/p&gt;
&lt;p&gt;The argument against him: he had signed policies that were unjust to Native Americans, and the westward expansion of his presidency brought forced removal and cultural destruction to tribal nations. These are facts.&lt;/p&gt;
&lt;p&gt;But Grant was also the Union general who defeated the Confederacy — the man whose military pressure compelled Lee's surrender at Appomattox, the moment slavery's military defense collapsed. During Reconstruction, he was among the rare presidents who genuinely tried to protect the civil rights of Black Americans, deploying federal force against the Ku Klux Klan. The memoirs he finished while racing toward death were later called by Hemingway the best account of war he had ever read.&lt;/p&gt;
&lt;p&gt;One person can be both of these things at once: an instrument of one justice, and an agent of another injustice.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I have no objection to the Monuments Project's existence. Scrutinizing history is not the same as erasing it. But I've always had a fundamental skepticism toward the logic that removing a bronze statue can repair a historical wound.&lt;/p&gt;
&lt;p&gt;The thirty thousand bodies once buried under Lincoln Park did not change their position when the park changed its name. Removing a monument does not remove history. Sometimes it only creates a feeling of cleanliness — the problem seems handled, when really it has simply moved out of sight.&lt;/p&gt;
&lt;p&gt;The Grant statue was ultimately not removed. The report recommended keeping it, with an interpretive panel added to provide fuller historical context. That seems like the right call, or close enough to it — not because it satisfies everyone, but because it acknowledges that historical complexity cannot be resolved by a piece of bronze, or by taking a piece of bronze away. For what it's worth, I walked around the base of that arch today, all the way around, and found no interpretive panel. Perhaps it's still being made.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I sat near the statue for a long time. Wind off Lake Michigan. A man walking his dog. Kids on bikes. In the distance, by the smaller pond, someone was getting married. Laughter carried over.&lt;/p&gt;
&lt;p&gt;Grant sat on his horse, Lake Michigan to his left, facing the city to the south. Some say the orientation is deliberate — the general keeping watch over the former Confederacy, a symbol of union and victory. But the expression I described earlier as composed — I want to change that word now. It's the tiredness of someone who has seen too much. Not a defeated tiredness, but the kind that no longer needs to explain itself to anyone.&lt;/p&gt;
&lt;p&gt;The lightning of 1892 killed three people. It didn't touch him.&lt;/p&gt;
&lt;p&gt;I don't know what that means. But when something a city built in one month with money from a hundred thousand people is still standing a hundred and thirty years later — I'm willing to sit beside it a while longer.&lt;/p&gt;
&lt;p&gt;There may still be some nineteenth-century Chicagoans underfoot who were never moved. That doesn't seem like a bad arrangement.&lt;/p&gt;
&lt;p&gt;The dead and the bronze are more patient than we tend to think.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Grant Statue" src="https://vincentping.com/images/20260605/grant2.jpg"&gt;&lt;/p&gt;</content><category term="Others"></category><category term="Chicago"></category><category term="Lincoln Park"></category><category term="history"></category><category term="public memory"></category><category term="monuments"></category><category term="essay"></category></entry><entry><title>林肯公园的格兰特</title><link href="https://vincentping.com/cn/grant-in-lincoln-park.html" rel="alternate"></link><published>2026-06-05T22:45:00+08:00</published><updated>2026-06-05T22:45:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-06-05:/cn/grant-in-lincoln-park.html</id><summary type="html">&lt;p&gt;林肯公园曾是芝加哥的城市公墓，如今格兰特将军的铜像立于此地已逾百年。从1892年的雷击到2020年的纪念碑审查委员会，这座铜像经历了它不需要解释的一切。移走纪念物不等于移走历史，有时只是给当代人一种虚假的清洁感。历史的复杂性无法被一块铜化解，也无法被移除一块铜来解决。&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="林肯公园" src="https://vincentping.com/images/20260605/cover.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;林肯公园，远处是市区&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;林肯公园里曾经埋着三万多具尸体。&lt;/p&gt;
&lt;p&gt;1850年代之前，这片湖边绿地是芝加哥的城市公墓。后来城市扩张，市政府决定把死人挪走，把土地还给活人。遗体被迁走了大部分，但没有人能保证迁干净了。今天慢跑者踩过的草坪，野餐者铺毯子的地方，孩子们追松鼠的小径——下面可能还睡着几个19世纪的芝加哥人，姓名不详，迁移令没能找到他们。&lt;/p&gt;
&lt;p&gt;1865年林肯遇刺，这片绿地以他的名字重新命名。死亡与纪念，这个公园从一开始就没打算假装生活是轻松的。&lt;/p&gt;
&lt;p&gt;我今天是专门来看格兰特的雕像的。闷在家里和Claude Code纠缠了好几天，它心情好的时候让我写代码觉得自己是超人无所不能，心情差的时候又像一堵墙，死劲撞也撞不开。出来透透气。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;尤利西斯·格兰特将军——后来他成了总统——死于1885年7月。他在生命最后几个月里跟喉癌赛跑，拼命写完回忆录，想给妻子留点版税钱。马克·吐温替他出版，后来成了美国出版史上回报最丰厚的合同之一，但格兰特本人没活到看见版税支票。他死后四天，纽约举行了他的葬礼，百万人站在街边送行。&lt;/p&gt;
&lt;p&gt;芝加哥市民决定为他立一座铜像。消息传出后，不到一个月，数万美元从这座城市各个角落汇集过来，捐款人数将近十万。1891年雕像揭幕那天，大约二十万人到场——那时芝加哥全市人口也不过一百万出头，相当于每五个芝加哥人里就有一个到了现场。&lt;/p&gt;
&lt;p&gt;我站在雕像前，抬头看格兰特骑在马上的姿势。他没有摆出那种常见的凯旋姿态，手臂没有挥向远方，马也没有前蹄腾空。他只是坐在马背上，神情沉静，像一个已经无需证明任何事情的人。&lt;/p&gt;
&lt;p&gt;雕像落成次年，1892年，雷击中了这里。闪电劈在基座拱门附近，三个避雨的人当场死亡，而铜像完好无损。&lt;/p&gt;
&lt;p&gt;这个细节我不知道该怎么解读，但它一直留在我脑子里。&lt;/p&gt;
&lt;p&gt;&lt;img alt="格兰特雕像" src="https://vincentping.com/images/20260605/grant1.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;格兰特将军雕像&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;公园里还有一座建筑值得一提，虽然大多数人路过时根本不会多看一眼——那是1888年建造的卡尔森小屋，最初是公共厕所，男女分区，砖石结构，设计者是建筑师约瑟夫·莱曼·希尔斯比。希尔斯比的事务所曾经有个年轻学徒，叫弗兰克·劳埃德·赖特，后来成了二十世纪最重要的建筑师之一。&lt;/p&gt;
&lt;p&gt;一座公共厕所，出自后来影响了二十世纪建筑语言的那个事务所。&lt;/p&gt;
&lt;p&gt;2008年，联邦政府通过「拯救美国的宝藏」项目资助了小屋的修复工程。官僚机构偶尔会做出让人意外的事——他们决定修一座1888年的公厕，因为它是历史。这个逻辑我接受。&lt;/p&gt;
&lt;p&gt;只是修好之后，它不再开放为厕所，变成了某种活动场地，平日里静悄悄地锁着门。历史被保住了，功能却死了。这个结局有些奇怪——像是把一个人完好地保存下来，却抽走了他活着的用处。&lt;/p&gt;
&lt;p&gt;&lt;img alt="卡尔森小屋" src="https://vincentping.com/images/20260605/carlson_cottage.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;卡尔森小屋，石头上的铭牌介绍了它的来历&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2020年，芝加哥市长莱特福特在全美范围内的历史清算浪潮里，组建了「芝加哥纪念碑项目」。起因是哥伦布雕像被示威者推倒，或者说被市政府抢在推倒之前悄悄移走——取决于你看哪份报道。这个委员会的任务是审查全市的纪念碑和公共艺术，评估哪些应该保留，哪些应该移除，哪些历史叙事被排除在公共记忆之外。&lt;/p&gt;
&lt;p&gt;这件事本身没有什么可挑剔的。一座城市定期审视自己竖起了什么、纪念了谁，是正常的公共程序。公共空间里的纪念碑本来就不是中立的，每一座都是某个时代、某群人做出的选择，都在无声地告诉路过的人：这个人或这件事值得你记住。&lt;/p&gt;
&lt;p&gt;格兰特的雕像在审查名单里。&lt;/p&gt;
&lt;p&gt;理由是他曾签署过对美国原住民不公正的政策，任总统期间的西部扩张政策导致了原住民部落的强制驱逐和文化毁灭。这些都是事实。&lt;/p&gt;
&lt;p&gt;但格兰特同样是内战中击败南方邦联军的联邦军总司令，是在他的军事压力下，南方的李将军投降、奴隶制度军事上走向终结的那个人。重建时期，他是少数真正尝试保护黑人公民权利的总统之一，动用联邦力量镇压了三K党。他死前那场与死亡赛跑的写作，后来被海明威称为最好的战争回忆录之一。&lt;/p&gt;
&lt;p&gt;一个人可以同时是这两类：某种正义的推进者，和另一种不义的执行者。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我不认为纪念碑委员会的存在本身有问题，也不认为审视历史等同于清洗历史。但对那种认为移除一座铜像能够修复历史创伤的逻辑，我始终将信将疑。&lt;/p&gt;
&lt;p&gt;那三万具曾经埋在林肯公园地下的遗体，不会因为公园改了名字而改变它们曾经的位置。移走纪念物也不等于移走了历史本身，有时候反而是在给当代人一种虚假的清洁感——好像问题处理掉了，而实际上只是从你眼里消失了。&lt;/p&gt;
&lt;p&gt;格兰特的雕像最终没有被移除。报告建议保留，同时增加解说牌，以提供更完整的历史语境。我觉得这已经算是体面的收场——不是因为它让所有人满意，而是因为它承认了历史的复杂性无法被一块铜化解，也无法被移除一块铜来解决。当然，我今天又在雕像拱门的前前后后、上上下下转了一圈，没有看到解说牌，可能它正在制作的途中。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我在雕像附近坐了很久。湖风从密歇根湖那边吹过来，公园里有人遛狗，有孩子骑车，远处小湖边还有人在举行婚礼，隐隐能听到人们的欢笑和喧哗。&lt;/p&gt;
&lt;p&gt;格兰特骑在马背上，左侧是密歇根湖，面朝南方的城市。有人说，这代表将军正警惕地注视着当年的南方邦联，象征着国家的统一与胜利，但他的神情我刚才说是沉静，现在我想换个词——是那种见过太多事情之后的疲倦，不是那种消极的疲倦，而是已经不需要再向任何人解释自己的疲倦。&lt;/p&gt;
&lt;p&gt;1892年的那道闪电劈死了三个人，没有碰他。&lt;/p&gt;
&lt;p&gt;我不知道这说明什么。但当一座城市用一个月时间、十万人的捐款造出来的东西，在一百三十年后还站在那里——我愿意在它旁边多坐一会儿。&lt;/p&gt;
&lt;p&gt;脚下可能还有几个没被迁走的19世纪芝加哥人。这也没什么不好。&lt;/p&gt;
&lt;p&gt;死人和铜像都比我们想象的更有耐心。&lt;/p&gt;
&lt;p&gt;&lt;img alt="格兰特雕像" src="https://vincentping.com/images/20260605/grant2.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;格兰特将军雕像&lt;/em&gt;&lt;/p&gt;</content><category term="Others"></category><category term="芝加哥"></category><category term="林肯公园"></category><category term="历史"></category><category term="公共记忆"></category><category term="纪念碑"></category><category term="散文"></category></entry><entry><title>林肯公园的格兰特</title><link href="https://vincentping.com/cn/grant-in-lincoln-park.html" rel="alternate"></link><published>2026-06-05T22:45:00+08:00</published><updated>2026-06-05T22:45:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-06-05:/cn/grant-in-lincoln-park.html</id><summary type="html">&lt;p&gt;林肯公园曾是芝加哥的城市公墓，如今格兰特将军的铜像立于此地已逾百年。从1892年的雷击到2020年的纪念碑审查委员会，这座铜像经历了它不需要解释的一切。移走纪念物不等于移走历史，有时只是给当代人一种虚假的清洁感。历史的复杂性无法被一块铜化解，也无法被移除一块铜来解决。&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="林肯公园" src="https://vincentping.com/images/20260605/cover.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;林肯公园，远处是市区&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;林肯公园里曾经埋着三万多具尸体。&lt;/p&gt;
&lt;p&gt;1850年代之前，这片湖边绿地是芝加哥的城市公墓。后来城市扩张，市政府决定把死人挪走，把土地还给活人。遗体被迁走了大部分，但没有人能保证迁干净了。今天慢跑者踩过的草坪，野餐者铺毯子的地方，孩子们追松鼠的小径——下面可能还睡着几个19世纪的芝加哥人，姓名不详，迁移令没能找到他们。&lt;/p&gt;
&lt;p&gt;1865年林肯遇刺，这片绿地以他的名字重新命名。死亡与纪念，这个公园从一开始就没打算假装生活是轻松的。&lt;/p&gt;
&lt;p&gt;我今天是专门来看格兰特的雕像的。闷在家里和Claude Code纠缠了好几天，它心情好的时候让我写代码觉得自己是超人无所不能，心情差的时候又像一堵墙，死劲撞也撞不开。出来透透气。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;尤利西斯·格兰特将军——后来他成了总统——死于1885年7月。他在生命最后几个月里跟喉癌赛跑，拼命写完回忆录，想给妻子留点版税钱。马克·吐温替他出版，后来成了美国出版史上回报最丰厚的合同之一，但格兰特本人没活到看见版税支票。他死后四天，纽约举行了他的葬礼，百万人站在街边送行。&lt;/p&gt;
&lt;p&gt;芝加哥市民决定为他立一座铜像。消息传出后，不到一个月，数万美元从这座城市各个角落汇集过来，捐款人数将近十万。1891年雕像揭幕那天，大约二十万人到场——那时芝加哥全市人口也不过一百万出头，相当于每五个芝加哥人里就有一个到了现场。&lt;/p&gt;
&lt;p&gt;我站在雕像前，抬头看格兰特骑在马上的姿势。他没有摆出那种常见的凯旋姿态，手臂没有挥向远方，马也没有前蹄腾空。他只是坐在马背上，神情沉静，像一个已经无需证明任何事情的人。&lt;/p&gt;
&lt;p&gt;雕像落成次年，1892年，雷击中了这里。闪电劈在基座拱门附近，三个避雨的人当场死亡，而铜像完好无损。&lt;/p&gt;
&lt;p&gt;这个细节我不知道该怎么解读，但它一直留在我脑子里。&lt;/p&gt;
&lt;p&gt;&lt;img alt="格兰特雕像" src="https://vincentping.com/images/20260605/grant1.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;格兰特将军雕像&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;公园里还有一座建筑值得一提，虽然大多数人路过时根本不会多看一眼——那是1888年建造的卡尔森小屋，最初是公共厕所，男女分区，砖石结构，设计者是建筑师约瑟夫·莱曼·希尔斯比。希尔斯比的事务所曾经有个年轻学徒，叫弗兰克·劳埃德·赖特，后来成了二十世纪最重要的建筑师之一。&lt;/p&gt;
&lt;p&gt;一座公共厕所，出自后来影响了二十世纪建筑语言的那个事务所。&lt;/p&gt;
&lt;p&gt;2008年，联邦政府通过「拯救美国的宝藏」项目资助了小屋的修复工程。官僚机构偶尔会做出让人意外的事——他们决定修一座1888年的公厕，因为它是历史。这个逻辑我接受。&lt;/p&gt;
&lt;p&gt;只是修好之后，它不再开放为厕所，变成了某种活动场地，平日里静悄悄地锁着门。历史被保住了，功能却死了。这个结局有些奇怪——像是把一个人完好地保存下来，却抽走了他活着的用处。&lt;/p&gt;
&lt;p&gt;&lt;img alt="卡尔森小屋" src="https://vincentping.com/images/20260605/carlson_cottage.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;卡尔森小屋，石头上的铭牌介绍了它的来历&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2020年，芝加哥市长莱特福特在全美范围内的历史清算浪潮里，组建了「芝加哥纪念碑项目」。起因是哥伦布雕像被示威者推倒，或者说被市政府抢在推倒之前悄悄移走——取决于你看哪份报道。这个委员会的任务是审查全市的纪念碑和公共艺术，评估哪些应该保留，哪些应该移除，哪些历史叙事被排除在公共记忆之外。&lt;/p&gt;
&lt;p&gt;这件事本身没有什么可挑剔的。一座城市定期审视自己竖起了什么、纪念了谁，是正常的公共程序。公共空间里的纪念碑本来就不是中立的，每一座都是某个时代、某群人做出的选择，都在无声地告诉路过的人：这个人或这件事值得你记住。&lt;/p&gt;
&lt;p&gt;格兰特的雕像在审查名单里。&lt;/p&gt;
&lt;p&gt;理由是他曾签署过对美国原住民不公正的政策，任总统期间的西部扩张政策导致了原住民部落的强制驱逐和文化毁灭。这些都是事实。&lt;/p&gt;
&lt;p&gt;但格兰特同样是内战中击败南方邦联军的联邦军总司令，是在他的军事压力下，南方的李将军投降、奴隶制度军事上走向终结的那个人。重建时期，他是少数真正尝试保护黑人公民权利的总统之一，动用联邦力量镇压了三K党。他死前那场与死亡赛跑的写作，后来被海明威称为最好的战争回忆录之一。&lt;/p&gt;
&lt;p&gt;一个人可以同时是这两类：某种正义的推进者，和另一种不义的执行者。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我不认为纪念碑委员会的存在本身有问题，也不认为审视历史等同于清洗历史。但对那种认为移除一座铜像能够修复历史创伤的逻辑，我始终将信将疑。&lt;/p&gt;
&lt;p&gt;那三万具曾经埋在林肯公园地下的遗体，不会因为公园改了名字而改变它们曾经的位置。移走纪念物也不等于移走了历史本身，有时候反而是在给当代人一种虚假的清洁感——好像问题处理掉了，而实际上只是从你眼里消失了。&lt;/p&gt;
&lt;p&gt;格兰特的雕像最终没有被移除。报告建议保留，同时增加解说牌，以提供更完整的历史语境。我觉得这已经算是体面的收场——不是因为它让所有人满意，而是因为它承认了历史的复杂性无法被一块铜化解，也无法被移除一块铜来解决。当然，我今天又在雕像拱门的前前后后、上上下下转了一圈，没有看到解说牌，可能它正在制作的途中。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我在雕像附近坐了很久。湖风从密歇根湖那边吹过来，公园里有人遛狗，有孩子骑车，远处小湖边还有人在举行婚礼，隐隐能听到人们的欢笑和喧哗。&lt;/p&gt;
&lt;p&gt;格兰特骑在马背上，左侧是密歇根湖，面朝南方的城市。有人说，这代表将军正警惕地注视着当年的南方邦联，象征着国家的统一与胜利，但他的神情我刚才说是沉静，现在我想换个词——是那种见过太多事情之后的疲倦，不是那种消极的疲倦，而是已经不需要再向任何人解释自己的疲倦。&lt;/p&gt;
&lt;p&gt;1892年的那道闪电劈死了三个人，没有碰他。&lt;/p&gt;
&lt;p&gt;我不知道这说明什么。但当一座城市用一个月时间、十万人的捐款造出来的东西，在一百三十年后还站在那里——我愿意在它旁边多坐一会儿。&lt;/p&gt;
&lt;p&gt;脚下可能还有几个没被迁走的19世纪芝加哥人。这也没什么不好。&lt;/p&gt;
&lt;p&gt;死人和铜像都比我们想象的更有耐心。&lt;/p&gt;
&lt;p&gt;&lt;img alt="格兰特雕像" src="https://vincentping.com/images/20260605/grant2.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em style="display: block; text-align: center;"&gt;格兰特将军雕像&lt;/em&gt;&lt;/p&gt;</content><category term="Others"></category><category term="芝加哥"></category><category term="林肯公园"></category><category term="历史"></category><category term="公共记忆"></category><category term="纪念碑"></category><category term="散文"></category></entry><entry><title>Plywood Over Bed Slats: A Better Alternative to Bunkie Boards</title><link href="https://vincentping.com/en/plywood-bed-slats-bunkie-board-alternative.html" rel="alternate"></link><published>2026-06-01T11:40:00+08:00</published><updated>2026-06-01T11:40:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-06-01:/en/plywood-bed-slats-bunkie-board-alternative.html</id><summary type="html">&lt;p&gt;Bed frame slats spaced 3.5 inches apart — exceeding Simmons warranty requirements. After ruling out a Box Spring, Bunkie Board, and Foundation one by one, I solved the problem with two sheets of plywood from Home Depot for $108. Includes cut dimensions, kerf details, and exactly what to say at the cutting station.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I needed a new bed after moving.&lt;/p&gt;
&lt;p&gt;For the frame, I ordered a King Size solid wood bed frame with storage drawers from Bob's Discount Furniture.&lt;/p&gt;
&lt;p&gt;The mattress came from Wayfair — a Simmons Beautyrest Silver BRS900, Extra Firm, with individually pocketed coil springs. Fun fact: the Simmons brand name is the origin of "席梦思" (Xí Mèng Sī), the generic term Chinese consumers use for spring mattresses.&lt;/p&gt;
&lt;p&gt;I like a firm feel — solid, supportive under the back, no sinking when you roll over. Extra Firm was exactly what I was after.&lt;/p&gt;
&lt;p&gt;When the delivery crew from Bob's brought the frame in, both white-glove installers said the same thing unprompted: "This bed is really heavy." Once it was set up, I could confirm — solid and sturdy.&lt;/p&gt;
&lt;p&gt;But the slats on top of the frame were spaced too far apart. I measured: each slat was 2.5 inches wide and 0.6 inches thick, with gaps of nearly 3.5 inches between them.&lt;/p&gt;
&lt;p&gt;Putting the mattress directly on that wasn't going to work. A pocketed coil mattress has each spring individually wrapped in fabric — there's no interconnecting steel wire forming a grid. Based on the spring count for my model, each coil pocket is roughly 2.1 inches in diameter. With gaps that wide, every spring would be affected:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Springs sitting directly over a gap lose their support entirely, sag downward, and stop doing their job.&lt;/li&gt;
&lt;li&gt;Springs partially over a gap bear uneven loads and are prone to twisting out of shape.&lt;/li&gt;
&lt;li&gt;Even springs that land squarely on a slat end up carrying disproportionate weight, causing them to wear out and lose tension faster.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This doesn't just mean an uneven sleeping surface and internal damage over time — Simmons will also void the warranty outright if the gap exceeds 2 inches. Their official Warranty Instructions are explicit: gaps between slats must not exceed 2 inches.&lt;/p&gt;
&lt;p&gt;So what to do?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;American Beds vs. Chinese Beds&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Back in China, mattress support was never something I thought about.&lt;/p&gt;
&lt;p&gt;Beds there were simple: a frame with a solid wood board on top, a cotton mattress pad, a sheet, done. I also slept on palm fiber mattresses for a while — rock hard. The elders always said that was good for your bones and spine. These days everyone uses mattresses, but the solid board base is still standard. Support was never a problem; it never crossed anyone's mind.&lt;/p&gt;
&lt;p&gt;&lt;img alt="How Chinese bed frames are typically set up" src="https://vincentping.com/images/20260601/chinese_bed_system.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Coming to America, I found things work completely differently. The standard American bed has three layers: frame + Box Spring + mattress.&lt;/p&gt;
&lt;p&gt;The frame itself is just a border with legs and a few sparse slats running across.&lt;/p&gt;
&lt;p&gt;Because that alone can't support a mattress properly, a Box Spring goes in between. Originally, a box spring was literally a box filled with springs — essentially a simple spring mattress in a box shape, designed to add bounce and raise the overall bed height. Today, nearly all box springs have no springs at all. They've been replaced by a layer of closely spaced slats on top of a wooden frame, wrapped in the familiar knit fabric — but still built in the same boxy shape.&lt;/p&gt;
&lt;p&gt;That's why American beds tend to sit so high — raising the height was part of the box spring's original purpose.&lt;/p&gt;
&lt;p&gt;&lt;img alt="How American bed frames are typically set up" src="https://vincentping.com/images/20260601/us_bed_system.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Options&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So what were my choices?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Box Spring — ruled out&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My first thought was to just add a box spring. But the slats inside modern box springs are spaced roughly 2–3 inches apart as well, so adding one would accomplish nothing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Bunkie Board — ruled out&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I asked an AI for suggestions, and it recommended a Bunkie Board.&lt;/p&gt;
&lt;p&gt;After researching extensively, I could see the idea: it's designed to go between the frame and mattress to solve exactly this kind of support problem. But after looking at a lot of products on the market, I wasn't convinced.&lt;/p&gt;
&lt;p&gt;Bunkie boards come in two types. The first uses internal slats with a fabric cover — the slats are a bit closer together (1–2 inches), slightly better than the bed frame, but still gapped. The second type uses a solid panel inside with a fabric cover.&lt;/p&gt;
&lt;p&gt;The solid panel type sounds right, but on closer inspection the materials are almost universally particleboard or MDF — both prone to off-gassing, moisture warping, and a lifespan of only 5–10 years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Foundation — ruled out&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The AI also suggested a foundation. Looking at what's actually sold, a foundation is essentially the same thing as a modern springless box spring: same height, fabric-wrapped exterior, wooden frame inside, no springs, slats spaced about 1–2 inches apart — and priced at $200–$400. Pass.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Adding more slats — ruled out&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This was the DIY angle: add more slats between the existing ones to bring the spacing down to 1–2 inches. Theoretically workable, but a King Size frame has an interior width of 76 inches, which isn't a standard dimension, so the slats would need custom cutting. Then each one would have to be installed and spaced evenly. More effort than it's worth, with too much room for error.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;The actual solution: plywood&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cut a few sheets of plywood to the bed's dimensions, lay them flat on the existing slats, put the mattress on top. Solid, 100% even support. It's the same logic as the traditional Chinese bed board — just a different material.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;At Home Depot — What to Say&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I went to the Home Depot on North Ave in Chicago. Weekdays between 10am and 2pm are the best time — the cutting station is least busy and wait times are short.&lt;/p&gt;
&lt;p&gt;I picked up two sheets of SANDEPLY 12mm Sande Plywood, 1/2 in. x 4 ft. x 8 ft., sanded surface finish, at $53.73 each. Two sheets for a King Size comes to $107.46. Home Depot cuts for free. I also grabbed a roll of black Duct Tape to hold the panels together.&lt;/p&gt;
&lt;p&gt;My frame has 13 slats spaced fairly evenly, and with a 3.5-inch span between them, 1/2-inch plywood is thick enough — no sagging.&lt;/p&gt;
&lt;p&gt;Load the sheets onto a flat cart and wheel them to the cutting station. Here's what to say:&lt;/p&gt;
&lt;p&gt;Please cut these TWO 4x8 sheets into FOUR pieces total. Each piece should be 38 inches by 40 inches. Please account for the kerf so the final combined width equals 76 inches. Discard the remaining scraps.&lt;/p&gt;
&lt;p&gt;One important detail: always ask them to account for the kerf. The saw blade itself has thickness — each cut removes about 1/8 inch of material. If you ignore this, the two panels won't quite add up to 76 inches when placed side by side. Let the staff handle the math; they do this all day and will get it right.&lt;/p&gt;
&lt;p&gt;A King Size is 76 × 80 inches. Two 4×8 sheets, each cut into two 38×40-inch pieces, gives you four panels total.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transport and Installation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The reason to cut into four pieces rather than two 38×80-inch panels is simple: my car isn't big enough for an 80-inch panel. With four pieces, I folded down the rear seats and stacked them flat in the back. Each panel is 38×40 inches — about a meter long — so nothing pushed against the front passenger seat or blocked the right mirror. Perfectly manageable. If you have a pickup truck, two panels are enough.&lt;/p&gt;
&lt;p&gt;Pad the edges with an old blanket to avoid scratching the car's interior trim.&lt;/p&gt;
&lt;p&gt;Back home, I rinsed the panels off and left them outside to air out for a bit — plywood does have a smell.&lt;/p&gt;
&lt;p&gt;Installation was fast: starting from the headboard, lay all four panels flat, working toward the foot. They'll naturally leave about a 1-inch gap around the perimeter, which is actually good for airflow. Run Duct Tape over the cross-shaped seam in the center to keep the panels from shifting.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The finished setup" src="https://vincentping.com/images/20260601/my_bed.jpg"&gt;&lt;/p&gt;
&lt;p&gt;When the mattress arrived, I set it straight on top.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How It Feels&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rock solid.&lt;/p&gt;
&lt;p&gt;The Extra Firm feel comes through completely — no localized sinking anywhere. Rolling over, getting up, the entire surface holds. Two people sleeping doesn't affect the other side at all.&lt;/p&gt;
&lt;p&gt;Exactly what I wanted.&lt;/p&gt;
&lt;p&gt;On airflow: a solid panel does restrict circulation underneath compared to slats, but the bed frame is open on all four sides, so air can come in from the edges. If you live somewhere humid or tend to sleep hot, drill 1/2-inch holes every 6 inches across the panels — airflow improves dramatically with almost no effect on structural rigidity.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bunkie boards and foundations are, at their core, fabric-wrapped thin panels or slat assemblies. You're paying for the packaging. Plywood is thicker, stronger, more durable, and costs less than half the price. If your bed is a platform frame that was never designed for a box spring, this is the most practical solution I've found.&lt;/p&gt;
&lt;p&gt;Cost comparison: Bunkie Board $100–$300, Foundation $200–$400, two sheets of Sande Plywood $108, Home Depot cutting free.&lt;/p&gt;
&lt;p&gt;None of this is a new idea. It's just the logic of the traditional Chinese bed board, applied in America. Went the long way around, and ended up back at a solid surface.&lt;/p&gt;</content><category term="Others"></category><category term="DIY"></category><category term="Home"></category><category term="Bed"></category><category term="Plywood"></category><category term="Bunkie Board"></category><category term="Mattress"></category><category term="Home Depot"></category><category term="King Size"></category></entry><entry><title>Plywood Over Bed Slats: A Better Alternative to Bunkie Boards</title><link href="https://vincentping.com/en/plywood-bed-slats-bunkie-board-alternative.html" rel="alternate"></link><published>2026-06-01T11:40:00+08:00</published><updated>2026-06-01T11:40:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-06-01:/en/plywood-bed-slats-bunkie-board-alternative.html</id><summary type="html">&lt;p&gt;Bed frame slats spaced 3.5 inches apart — exceeding Simmons warranty requirements. After ruling out a Box Spring, Bunkie Board, and Foundation one by one, I solved the problem with two sheets of plywood from Home Depot for $108. Includes cut dimensions, kerf details, and exactly what to say at the cutting station.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I needed a new bed after moving.&lt;/p&gt;
&lt;p&gt;For the frame, I ordered a King Size solid wood bed frame with storage drawers from Bob's Discount Furniture.&lt;/p&gt;
&lt;p&gt;The mattress came from Wayfair — a Simmons Beautyrest Silver BRS900, Extra Firm, with individually pocketed coil springs. Fun fact: the Simmons brand name is the origin of "席梦思" (Xí Mèng Sī), the generic term Chinese consumers use for spring mattresses.&lt;/p&gt;
&lt;p&gt;I like a firm feel — solid, supportive under the back, no sinking when you roll over. Extra Firm was exactly what I was after.&lt;/p&gt;
&lt;p&gt;When the delivery crew from Bob's brought the frame in, both white-glove installers said the same thing unprompted: "This bed is really heavy." Once it was set up, I could confirm — solid and sturdy.&lt;/p&gt;
&lt;p&gt;But the slats on top of the frame were spaced too far apart. I measured: each slat was 2.5 inches wide and 0.6 inches thick, with gaps of nearly 3.5 inches between them.&lt;/p&gt;
&lt;p&gt;Putting the mattress directly on that wasn't going to work. A pocketed coil mattress has each spring individually wrapped in fabric — there's no interconnecting steel wire forming a grid. Based on the spring count for my model, each coil pocket is roughly 2.1 inches in diameter. With gaps that wide, every spring would be affected:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Springs sitting directly over a gap lose their support entirely, sag downward, and stop doing their job.&lt;/li&gt;
&lt;li&gt;Springs partially over a gap bear uneven loads and are prone to twisting out of shape.&lt;/li&gt;
&lt;li&gt;Even springs that land squarely on a slat end up carrying disproportionate weight, causing them to wear out and lose tension faster.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This doesn't just mean an uneven sleeping surface and internal damage over time — Simmons will also void the warranty outright if the gap exceeds 2 inches. Their official Warranty Instructions are explicit: gaps between slats must not exceed 2 inches.&lt;/p&gt;
&lt;p&gt;So what to do?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;American Beds vs. Chinese Beds&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Back in China, mattress support was never something I thought about.&lt;/p&gt;
&lt;p&gt;Beds there were simple: a frame with a solid wood board on top, a cotton mattress pad, a sheet, done. I also slept on palm fiber mattresses for a while — rock hard. The elders always said that was good for your bones and spine. These days everyone uses mattresses, but the solid board base is still standard. Support was never a problem; it never crossed anyone's mind.&lt;/p&gt;
&lt;p&gt;&lt;img alt="How Chinese bed frames are typically set up" src="https://vincentping.com/images/20260601/chinese_bed_system.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Coming to America, I found things work completely differently. The standard American bed has three layers: frame + Box Spring + mattress.&lt;/p&gt;
&lt;p&gt;The frame itself is just a border with legs and a few sparse slats running across.&lt;/p&gt;
&lt;p&gt;Because that alone can't support a mattress properly, a Box Spring goes in between. Originally, a box spring was literally a box filled with springs — essentially a simple spring mattress in a box shape, designed to add bounce and raise the overall bed height. Today, nearly all box springs have no springs at all. They've been replaced by a layer of closely spaced slats on top of a wooden frame, wrapped in the familiar knit fabric — but still built in the same boxy shape.&lt;/p&gt;
&lt;p&gt;That's why American beds tend to sit so high — raising the height was part of the box spring's original purpose.&lt;/p&gt;
&lt;p&gt;&lt;img alt="How American bed frames are typically set up" src="https://vincentping.com/images/20260601/us_bed_system.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Options&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So what were my choices?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Box Spring — ruled out&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My first thought was to just add a box spring. But the slats inside modern box springs are spaced roughly 2–3 inches apart as well, so adding one would accomplish nothing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Bunkie Board — ruled out&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I asked an AI for suggestions, and it recommended a Bunkie Board.&lt;/p&gt;
&lt;p&gt;After researching extensively, I could see the idea: it's designed to go between the frame and mattress to solve exactly this kind of support problem. But after looking at a lot of products on the market, I wasn't convinced.&lt;/p&gt;
&lt;p&gt;Bunkie boards come in two types. The first uses internal slats with a fabric cover — the slats are a bit closer together (1–2 inches), slightly better than the bed frame, but still gapped. The second type uses a solid panel inside with a fabric cover.&lt;/p&gt;
&lt;p&gt;The solid panel type sounds right, but on closer inspection the materials are almost universally particleboard or MDF — both prone to off-gassing, moisture warping, and a lifespan of only 5–10 years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Foundation — ruled out&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The AI also suggested a foundation. Looking at what's actually sold, a foundation is essentially the same thing as a modern springless box spring: same height, fabric-wrapped exterior, wooden frame inside, no springs, slats spaced about 1–2 inches apart — and priced at $200–$400. Pass.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Adding more slats — ruled out&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This was the DIY angle: add more slats between the existing ones to bring the spacing down to 1–2 inches. Theoretically workable, but a King Size frame has an interior width of 76 inches, which isn't a standard dimension, so the slats would need custom cutting. Then each one would have to be installed and spaced evenly. More effort than it's worth, with too much room for error.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;The actual solution: plywood&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cut a few sheets of plywood to the bed's dimensions, lay them flat on the existing slats, put the mattress on top. Solid, 100% even support. It's the same logic as the traditional Chinese bed board — just a different material.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;At Home Depot — What to Say&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I went to the Home Depot on North Ave in Chicago. Weekdays between 10am and 2pm are the best time — the cutting station is least busy and wait times are short.&lt;/p&gt;
&lt;p&gt;I picked up two sheets of SANDEPLY 12mm Sande Plywood, 1/2 in. x 4 ft. x 8 ft., sanded surface finish, at $53.73 each. Two sheets for a King Size comes to $107.46. Home Depot cuts for free. I also grabbed a roll of black Duct Tape to hold the panels together.&lt;/p&gt;
&lt;p&gt;My frame has 13 slats spaced fairly evenly, and with a 3.5-inch span between them, 1/2-inch plywood is thick enough — no sagging.&lt;/p&gt;
&lt;p&gt;Load the sheets onto a flat cart and wheel them to the cutting station. Here's what to say:&lt;/p&gt;
&lt;p&gt;Please cut these TWO 4x8 sheets into FOUR pieces total. Each piece should be 38 inches by 40 inches. Please account for the kerf so the final combined width equals 76 inches. Discard the remaining scraps.&lt;/p&gt;
&lt;p&gt;One important detail: always ask them to account for the kerf. The saw blade itself has thickness — each cut removes about 1/8 inch of material. If you ignore this, the two panels won't quite add up to 76 inches when placed side by side. Let the staff handle the math; they do this all day and will get it right.&lt;/p&gt;
&lt;p&gt;A King Size is 76 × 80 inches. Two 4×8 sheets, each cut into two 38×40-inch pieces, gives you four panels total.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transport and Installation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The reason to cut into four pieces rather than two 38×80-inch panels is simple: my car isn't big enough for an 80-inch panel. With four pieces, I folded down the rear seats and stacked them flat in the back. Each panel is 38×40 inches — about a meter long — so nothing pushed against the front passenger seat or blocked the right mirror. Perfectly manageable. If you have a pickup truck, two panels are enough.&lt;/p&gt;
&lt;p&gt;Pad the edges with an old blanket to avoid scratching the car's interior trim.&lt;/p&gt;
&lt;p&gt;Back home, I rinsed the panels off and left them outside to air out for a bit — plywood does have a smell.&lt;/p&gt;
&lt;p&gt;Installation was fast: starting from the headboard, lay all four panels flat, working toward the foot. They'll naturally leave about a 1-inch gap around the perimeter, which is actually good for airflow. Run Duct Tape over the cross-shaped seam in the center to keep the panels from shifting.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The finished setup" src="https://vincentping.com/images/20260601/my_bed.jpg"&gt;&lt;/p&gt;
&lt;p&gt;When the mattress arrived, I set it straight on top.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How It Feels&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rock solid.&lt;/p&gt;
&lt;p&gt;The Extra Firm feel comes through completely — no localized sinking anywhere. Rolling over, getting up, the entire surface holds. Two people sleeping doesn't affect the other side at all.&lt;/p&gt;
&lt;p&gt;Exactly what I wanted.&lt;/p&gt;
&lt;p&gt;On airflow: a solid panel does restrict circulation underneath compared to slats, but the bed frame is open on all four sides, so air can come in from the edges. If you live somewhere humid or tend to sleep hot, drill 1/2-inch holes every 6 inches across the panels — airflow improves dramatically with almost no effect on structural rigidity.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bunkie boards and foundations are, at their core, fabric-wrapped thin panels or slat assemblies. You're paying for the packaging. Plywood is thicker, stronger, more durable, and costs less than half the price. If your bed is a platform frame that was never designed for a box spring, this is the most practical solution I've found.&lt;/p&gt;
&lt;p&gt;Cost comparison: Bunkie Board $100–$300, Foundation $200–$400, two sheets of Sande Plywood $108, Home Depot cutting free.&lt;/p&gt;
&lt;p&gt;None of this is a new idea. It's just the logic of the traditional Chinese bed board, applied in America. Went the long way around, and ended up back at a solid surface.&lt;/p&gt;</content><category term="Others"></category><category term="DIY"></category><category term="Home"></category><category term="Bed"></category><category term="Plywood"></category><category term="Bunkie Board"></category><category term="Mattress"></category><category term="Home Depot"></category><category term="King Size"></category></entry><entry><title>不买 Bunkie Board：用胶合板解决床架 Slats 间距问题</title><link href="https://vincentping.com/cn/plywood-bed-slats-bunkie-board-alternative.html" rel="alternate"></link><published>2026-06-01T10:40:00+08:00</published><updated>2026-06-01T10:40:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-06-01:/cn/plywood-bed-slats-bunkie-board-alternative.html</id><summary type="html">&lt;p&gt;床架木条间距3.5英寸，超出Simmons质保要求，Box Spring、Bunkie Board、Foundation逐一排除之后，最终用两张Home Depot的胶合板裁切铺底，$108解决问题。附裁切尺寸、kerf细节和Home Depot沟通话术。&lt;/p&gt;</summary><content type="html">&lt;p&gt;因为搬家，需要一张新床。&lt;/p&gt;
&lt;p&gt;首先是床架，在 Bob's Discount Furniture 订了一个带储物抽屉 King Size 的实木床架。&lt;/p&gt;
&lt;p&gt;而床垫则是是从 Wayfair 订的，Simmons 公司生产的 Beautyrest Silver BRS900，Extra Firm，里面是用袋装弹簧。顺便说一声，Simmons 公司名就是国内弹簧床垫经常叫“席梦思”这个品名的由来。&lt;/p&gt;
&lt;p&gt;我喜欢硬床感。那种很扎实、背部有支撑、翻身不陷进去的感觉。Extra Firm就是冲这个买的。&lt;/p&gt;
&lt;p&gt;床架搬进去，负责搬运和安装的 Bob's 两位白手套师傅都跟我说了同一句话，"这张床真的很重"。等安装好，我试了试，确实很沉很结实。&lt;/p&gt;
&lt;p&gt;可是床架上面铺着的木条，间距有点大，一测量，每根木条本身是2.5英寸宽、0.6英寸厚，但是两根之间的缝有差不多3.5英寸。&lt;/p&gt;
&lt;p&gt;如果等床垫到了直接放上去，肯定不行。因为弹簧床垫每一个弹簧都是独立装在布袋里的，它们之间没有硬钢丝连成网。我这个型号的床垫按照弹簧数量计算了下，弹簧袋的直径基本就是2.1英寸左右。如果木条空隙太宽，所有弹簧都会受到影响：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;正好位于空隙上方的那些独立弹簧，会因为底下悬空失去支撑，直接不受力，往下塌陷&lt;/li&gt;
&lt;li&gt;半悬空的弹簧，会因为受力不均，容易扭曲变形&lt;/li&gt;
&lt;li&gt;对于那些刚好完全落在木条上的弹簧，也会因为独自支撑了太多重量，提前老化失去弹性，缩短使用寿命。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这不仅会导致床垫表面很快变得凹凸不平、内部结构损坏，而且一旦空隙超过 2 英寸，Simmons 官方是直接拒绝质保（Void Warranty）的，其官方质保政策（Warranty Instructions）中明确规定：床条之间的净空隙不能超过 2 英寸。&lt;/p&gt;
&lt;p&gt;怎么办？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;美国床 VS 中国床&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在国内的时候，从来没想过“床垫支撑”这件事。&lt;/p&gt;
&lt;p&gt;那时候床是什么样的？最早的时候是床架加实木床板，然后垫上褥子，铺上床单就行。后来还睡过棕绷床垫，睡起来都是硬邦邦的。老人说这样好，对骨头好，对脊椎好。当然现在大家也都用床垫了，但床架上的实心床板一直都在。在国内，支撑这事从来不是问题，根本不需要操心。&lt;/p&gt;
&lt;p&gt;&lt;img alt="中国床的样子" src="https://vincentping.com/images/20260601/chinese_bed_system.jpg"&gt;&lt;/p&gt;
&lt;p&gt;到了美国才发现，这边完全不同。美国最普遍的床基本都是三层结构：床架 + Box Spring + 床垫。&lt;/p&gt;
&lt;p&gt;床架本身就是床框和床脚，然后横向加几根稀疏的木条。&lt;/p&gt;
&lt;p&gt;因为这样撑不住床垫，中间就加个 Box Spring。这玩意最早就是一个装了弹簧的木箱子，相当于一个简单的弹簧床垫，做成 Box 样子，主要是用作让床垫睡起来比较有弹性，同时增加床的总高度。到现在，绝大多数 Box Spring 已经没有 Spring 了，替代成顶部有一层比较密的横向木条（Slats），外面再裹上一层标志性的针织布，但还是做成一个 Box 的样子。&lt;/p&gt;
&lt;p&gt;所以美国的床一般都比较高，Box 最初也有增加床高度的作用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="美国床的样子" src="https://vincentping.com/images/20260601/us_bed_system.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;市面上的选项&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;回到问题，我这种情况该怎么办？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Box 排除&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先想到的是，加一层 Box？ 可是现在 Box 里面的木条间隔基本也在 2-3 英寸，加上去完全没意义。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Bunkie Board 排除&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;找 AI 帮忙想办法，它推荐买一个 Bunkie Board。&lt;/p&gt;
&lt;p&gt;在网上搜了很多，感觉这东西应该就是专门为这种情况设计的，放在床架和床垫之间，解决支撑问题。但仔细看了市面上大量产品之后，发现不好。&lt;/p&gt;
&lt;p&gt;Bunkie Board 分两种。一种是木条式，内部还是木条加布罩，间距1到2英寸，比床架稍微密一点，但本质上还是有缝。另一种是实心板式，内部是一块板，外面包层布。&lt;/p&gt;
&lt;p&gt;照说实心板式可以，但是仔细一看，我发现材质都比较差，基本都是particleboard（刨花板）或者 MDF，味道重不说，遇潮就会膨胀变形，寿命只有5到10年。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Foundation 排除&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后 AI 还推荐了 Foundation。 查了下市面上卖的 Foundation，其实和现在不带弹簧的 Box Spring 差不多，同样高度，外面包布，里面是木框架，没有弹簧，木条间距比Box Spring密一点，大概1到2英寸，价格还要$200-$400，排除。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;加装木条 排除&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是DIY的思路，在现有木条之间加装更多木条，把3.5英寸的间距缩小到1到2英寸。理论上可行。但King Size床架内径76英寸，不是标准尺寸，需要定制裁切，买回来还要逐根安装固定，确保每条间距均匀。工程量不小，容错率也低。算了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;最后的选择：胶合板&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;就是自己做一个床板，买几张胶合板，裁成床的尺寸，平铺在木条上，床垫再放胶合板上面。实心的，100%均匀支撑。说到底，跟国内的实木床板是同一个逻辑，只是换了个材料。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;去Home Depot，手把手说清楚&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我去的是芝加哥 North Ave 那家Home Depot。工作日白天10点到2点去，锯木台人最少，等待时间短。&lt;/p&gt;
&lt;p&gt;买了两张 SANDEPLY 12mm Sande Plywood，1/2 in. x 4 ft. x 8 ft.，选表面 Sandy 打磨过的那种，Home Depot卖$53.73。King Size需要两张，合计$107.46。Home Depot 帮忙裁切。。另外还买一卷黑色布胶带 Duct Tape，固定几块板子用。&lt;/p&gt;
&lt;p&gt;因为我的床架本身有13根木条，间距相对均匀，跨度3.5inch不算大，所以选1/2英寸的厚度够了，不会变形。&lt;/p&gt;
&lt;p&gt;选好后，用小板车拖到到锯木台，跟师傅说：&lt;/p&gt;
&lt;p&gt;Please cut these TWO 4x8 sheets into FOUR pieces total. Each piece should be 38 inches by 40 inches. Please account for the kerf so the final combined width equals 76 inches. Discard the remaining scraps.&lt;/p&gt;
&lt;p&gt;这里有一个细节，一定要跟师傅说 account for the kerf。 锯片本身有厚度，每切一刀会损耗约1/8英寸，英文叫kerf（锯缝）。如果不考虑这个，两块板子拼起来会差一点点。让师傅自己算，他们熟，比自己算更准。&lt;/p&gt;
&lt;p&gt;King Size是76×80英寸，两张4×8的板子各裁成两块38×40英寸，共四块。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;运输和安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;之所以要裁切成四块，而不是两块 38x80 英寸的，是因为我的车不够大，80 英寸的放不下。切成四块，把后排座椅放倒，四块板子叠放进去。每块38×40英寸，长度大概1米，不会顶到副驾驶，不会遮挡右侧后视镜，驾驶完全没问题。如果有一辆皮卡，就可以切成两块就够了。&lt;/p&gt;
&lt;p&gt;记得在边缘垫块旧毛毯，防止刮到车内塑料件。&lt;/p&gt;
&lt;p&gt;回到家首先把四块板子清洗下，放室外透透气，胶合板还是有点味道的。&lt;/p&gt;
&lt;p&gt;安装很快，直接从床头开始把四块板子平铺上去，四周会自然留下约1英寸的缝隙，有助于透气。再用 Duct Tape 把四块板子之间的十字接缝贴上，防止滑动。&lt;/p&gt;
&lt;p&gt;&lt;img alt="最终我的床的样子" src="https://vincentping.com/images/20260601/my_bed.jpg"&gt;&lt;/p&gt;
&lt;p&gt;床垫到货，直接放上去就好了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实际效果&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;非常稳。&lt;/p&gt;
&lt;p&gt;Extra Firm的硬度感完全出来了，没有任何局部下陷的感觉，翻身、起床，整个支撑面都是实的，两个人睡也不会互相影响。&lt;/p&gt;
&lt;p&gt;这就是我想要的。&lt;/p&gt;
&lt;p&gt;关于透气性的问题也说一下：实心板底部空气流通比木条式差，但床架四周是开放的，空气可以从侧面进来。如果你住的地方比较潮湿，或者容易出汗，可以用电钻每隔6英寸打一个1/2英寸的小孔，透气性大幅改善，结构强度基本不受影响。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;最后说几句&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bunkie Board和Foundation本质上是“包了布的薄板或木条”，卖的是外观和包装的溢价。胶合板更厚、更结实、更耐用，而且便宜一半以上。如果你的床架是平台床架，原本就不需要Box Spring，这个方案是目前我找到的最性价比的解法。&lt;/p&gt;
&lt;p&gt;费用对比，Bunkie Board $100到$300，Foundation $200到$400，两张Sande Plywood $108，Home Depot裁切免费，完事。&lt;/p&gt;
&lt;p&gt;说到底，这不是什么新发明，就是国内床板逻辑在美国的一次实践。绕了一圈，还是实心床板最管用。&lt;/p&gt;</content><category term="Others"></category><category term="DIY"></category><category term="Home"></category><category term="Bed"></category><category term="Plywood"></category><category term="Bunkie Board"></category><category term="Mattress"></category><category term="Home Depot"></category><category term="King Size"></category></entry><entry><title>不买 Bunkie Board：用胶合板解决床架 Slats 间距问题</title><link href="https://vincentping.com/cn/plywood-bed-slats-bunkie-board-alternative.html" rel="alternate"></link><published>2026-06-01T10:40:00+08:00</published><updated>2026-06-01T10:40:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-06-01:/cn/plywood-bed-slats-bunkie-board-alternative.html</id><summary type="html">&lt;p&gt;床架木条间距3.5英寸，超出Simmons质保要求，Box Spring、Bunkie Board、Foundation逐一排除之后，最终用两张Home Depot的胶合板裁切铺底，$108解决问题。附裁切尺寸、kerf细节和Home Depot沟通话术。&lt;/p&gt;</summary><content type="html">&lt;p&gt;因为搬家，需要一张新床。&lt;/p&gt;
&lt;p&gt;首先是床架，在 Bob's Discount Furniture 订了一个带储物抽屉 King Size 的实木床架。&lt;/p&gt;
&lt;p&gt;而床垫则是是从 Wayfair 订的，Simmons 公司生产的 Beautyrest Silver BRS900，Extra Firm，里面是用袋装弹簧。顺便说一声，Simmons 公司名就是国内弹簧床垫经常叫“席梦思”这个品名的由来。&lt;/p&gt;
&lt;p&gt;我喜欢硬床感。那种很扎实、背部有支撑、翻身不陷进去的感觉。Extra Firm就是冲这个买的。&lt;/p&gt;
&lt;p&gt;床架搬进去，负责搬运和安装的 Bob's 两位白手套师傅都跟我说了同一句话，"这张床真的很重"。等安装好，我试了试，确实很沉很结实。&lt;/p&gt;
&lt;p&gt;可是床架上面铺着的木条，间距有点大，一测量，每根木条本身是2.5英寸宽、0.6英寸厚，但是两根之间的缝有差不多3.5英寸。&lt;/p&gt;
&lt;p&gt;如果等床垫到了直接放上去，肯定不行。因为弹簧床垫每一个弹簧都是独立装在布袋里的，它们之间没有硬钢丝连成网。我这个型号的床垫按照弹簧数量计算了下，弹簧袋的直径基本就是2.1英寸左右。如果木条空隙太宽，所有弹簧都会受到影响：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;正好位于空隙上方的那些独立弹簧，会因为底下悬空失去支撑，直接不受力，往下塌陷&lt;/li&gt;
&lt;li&gt;半悬空的弹簧，会因为受力不均，容易扭曲变形&lt;/li&gt;
&lt;li&gt;对于那些刚好完全落在木条上的弹簧，也会因为独自支撑了太多重量，提前老化失去弹性，缩短使用寿命。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这不仅会导致床垫表面很快变得凹凸不平、内部结构损坏，而且一旦空隙超过 2 英寸，Simmons 官方是直接拒绝质保（Void Warranty）的，其官方质保政策（Warranty Instructions）中明确规定：床条之间的净空隙不能超过 2 英寸。&lt;/p&gt;
&lt;p&gt;怎么办？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;美国床 VS 中国床&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在国内的时候，从来没想过“床垫支撑”这件事。&lt;/p&gt;
&lt;p&gt;那时候床是什么样的？最早的时候是床架加实木床板，然后垫上褥子，铺上床单就行。后来还睡过棕绷床垫，睡起来都是硬邦邦的。老人说这样好，对骨头好，对脊椎好。当然现在大家也都用床垫了，但床架上的实心床板一直都在。在国内，支撑这事从来不是问题，根本不需要操心。&lt;/p&gt;
&lt;p&gt;&lt;img alt="中国床的样子" src="https://vincentping.com/images/20260601/chinese_bed_system.jpg"&gt;&lt;/p&gt;
&lt;p&gt;到了美国才发现，这边完全不同。美国最普遍的床基本都是三层结构：床架 + Box Spring + 床垫。&lt;/p&gt;
&lt;p&gt;床架本身就是床框和床脚，然后横向加几根稀疏的木条。&lt;/p&gt;
&lt;p&gt;因为这样撑不住床垫，中间就加个 Box Spring。这玩意最早就是一个装了弹簧的木箱子，相当于一个简单的弹簧床垫，做成 Box 样子，主要是用作让床垫睡起来比较有弹性，同时增加床的总高度。到现在，绝大多数 Box Spring 已经没有 Spring 了，替代成顶部有一层比较密的横向木条（Slats），外面再裹上一层标志性的针织布，但还是做成一个 Box 的样子。&lt;/p&gt;
&lt;p&gt;所以美国的床一般都比较高，Box 最初也有增加床高度的作用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="美国床的样子" src="https://vincentping.com/images/20260601/us_bed_system.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;市面上的选项&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;回到问题，我这种情况该怎么办？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Box 排除&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先想到的是，加一层 Box？ 可是现在 Box 里面的木条间隔基本也在 2-3 英寸，加上去完全没意义。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Bunkie Board 排除&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;找 AI 帮忙想办法，它推荐买一个 Bunkie Board。&lt;/p&gt;
&lt;p&gt;在网上搜了很多，感觉这东西应该就是专门为这种情况设计的，放在床架和床垫之间，解决支撑问题。但仔细看了市面上大量产品之后，发现不好。&lt;/p&gt;
&lt;p&gt;Bunkie Board 分两种。一种是木条式，内部还是木条加布罩，间距1到2英寸，比床架稍微密一点，但本质上还是有缝。另一种是实心板式，内部是一块板，外面包层布。&lt;/p&gt;
&lt;p&gt;照说实心板式可以，但是仔细一看，我发现材质都比较差，基本都是particleboard（刨花板）或者 MDF，味道重不说，遇潮就会膨胀变形，寿命只有5到10年。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Foundation 排除&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后 AI 还推荐了 Foundation。 查了下市面上卖的 Foundation，其实和现在不带弹簧的 Box Spring 差不多，同样高度，外面包布，里面是木框架，没有弹簧，木条间距比Box Spring密一点，大概1到2英寸，价格还要$200-$400，排除。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;加装木条 排除&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是DIY的思路，在现有木条之间加装更多木条，把3.5英寸的间距缩小到1到2英寸。理论上可行。但King Size床架内径76英寸，不是标准尺寸，需要定制裁切，买回来还要逐根安装固定，确保每条间距均匀。工程量不小，容错率也低。算了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;最后的选择：胶合板&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;就是自己做一个床板，买几张胶合板，裁成床的尺寸，平铺在木条上，床垫再放胶合板上面。实心的，100%均匀支撑。说到底，跟国内的实木床板是同一个逻辑，只是换了个材料。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;去Home Depot，手把手说清楚&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我去的是芝加哥 North Ave 那家Home Depot。工作日白天10点到2点去，锯木台人最少，等待时间短。&lt;/p&gt;
&lt;p&gt;买了两张 SANDEPLY 12mm Sande Plywood，1/2 in. x 4 ft. x 8 ft.，选表面 Sandy 打磨过的那种，Home Depot卖$53.73。King Size需要两张，合计$107.46。Home Depot 帮忙裁切。。另外还买一卷黑色布胶带 Duct Tape，固定几块板子用。&lt;/p&gt;
&lt;p&gt;因为我的床架本身有13根木条，间距相对均匀，跨度3.5inch不算大，所以选1/2英寸的厚度够了，不会变形。&lt;/p&gt;
&lt;p&gt;选好后，用小板车拖到到锯木台，跟师傅说：&lt;/p&gt;
&lt;p&gt;Please cut these TWO 4x8 sheets into FOUR pieces total. Each piece should be 38 inches by 40 inches. Please account for the kerf so the final combined width equals 76 inches. Discard the remaining scraps.&lt;/p&gt;
&lt;p&gt;这里有一个细节，一定要跟师傅说 account for the kerf。 锯片本身有厚度，每切一刀会损耗约1/8英寸，英文叫kerf（锯缝）。如果不考虑这个，两块板子拼起来会差一点点。让师傅自己算，他们熟，比自己算更准。&lt;/p&gt;
&lt;p&gt;King Size是76×80英寸，两张4×8的板子各裁成两块38×40英寸，共四块。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;运输和安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;之所以要裁切成四块，而不是两块 38x80 英寸的，是因为我的车不够大，80 英寸的放不下。切成四块，把后排座椅放倒，四块板子叠放进去。每块38×40英寸，长度大概1米，不会顶到副驾驶，不会遮挡右侧后视镜，驾驶完全没问题。如果有一辆皮卡，就可以切成两块就够了。&lt;/p&gt;
&lt;p&gt;记得在边缘垫块旧毛毯，防止刮到车内塑料件。&lt;/p&gt;
&lt;p&gt;回到家首先把四块板子清洗下，放室外透透气，胶合板还是有点味道的。&lt;/p&gt;
&lt;p&gt;安装很快，直接从床头开始把四块板子平铺上去，四周会自然留下约1英寸的缝隙，有助于透气。再用 Duct Tape 把四块板子之间的十字接缝贴上，防止滑动。&lt;/p&gt;
&lt;p&gt;&lt;img alt="最终我的床的样子" src="https://vincentping.com/images/20260601/my_bed.jpg"&gt;&lt;/p&gt;
&lt;p&gt;床垫到货，直接放上去就好了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实际效果&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;非常稳。&lt;/p&gt;
&lt;p&gt;Extra Firm的硬度感完全出来了，没有任何局部下陷的感觉，翻身、起床，整个支撑面都是实的，两个人睡也不会互相影响。&lt;/p&gt;
&lt;p&gt;这就是我想要的。&lt;/p&gt;
&lt;p&gt;关于透气性的问题也说一下：实心板底部空气流通比木条式差，但床架四周是开放的，空气可以从侧面进来。如果你住的地方比较潮湿，或者容易出汗，可以用电钻每隔6英寸打一个1/2英寸的小孔，透气性大幅改善，结构强度基本不受影响。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;最后说几句&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bunkie Board和Foundation本质上是“包了布的薄板或木条”，卖的是外观和包装的溢价。胶合板更厚、更结实、更耐用，而且便宜一半以上。如果你的床架是平台床架，原本就不需要Box Spring，这个方案是目前我找到的最性价比的解法。&lt;/p&gt;
&lt;p&gt;费用对比，Bunkie Board $100到$300，Foundation $200到$400，两张Sande Plywood $108，Home Depot裁切免费，完事。&lt;/p&gt;
&lt;p&gt;说到底，这不是什么新发明，就是国内床板逻辑在美国的一次实践。绕了一圈，还是实心床板最管用。&lt;/p&gt;</content><category term="Others"></category><category term="DIY"></category><category term="Home"></category><category term="Bed"></category><category term="Plywood"></category><category term="Bunkie Board"></category><category term="Mattress"></category><category term="Home Depot"></category><category term="King Size"></category></entry><entry><title>WSL2 Under the Hood: One VM, One File, One IP That Never Stays the Same</title><link href="https://vincentping.com/en/wsl2-under-the-hood.html" rel="alternate"></link><published>2026-02-27T22:10:00+08:00</published><updated>2026-02-27T22:10:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-02-27:/en/wsl2-under-the-hood.html</id><summary type="html">&lt;p&gt;Once WSL2 is up and running, some strange things start to happen: you delete gigabytes of files in Linux and Windows disk usage doesn't budge; cross-system file access is painfully slow; a network script that worked fine yesterday suddenly breaks after a wsl --shutdown. None of this is a bug. It all traces back to three things at the core of WSL2's design — a special kind of VM, a single file that holds your entire Linux system, and an IP address that changes every time you restart.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The previous article "&lt;a href="https://vincentping.com/en/install-a-linux-in-windows-11-in-5-minutes" target="_blank"&gt;Install Linux on Windows 11 in 5 Minutes&lt;/a&gt;" covered how to install WSL2 and get it running. Once you've had it going for a while, the quirks start to show.&lt;/p&gt;
&lt;p&gt;You delete a bunch of files inside Linux — Windows disk space doesn't move. You try to access Windows files from inside WSL2 — painfully slow. A network script that worked fine yesterday stops connecting after a &lt;code&gt;wsl --shutdown&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;None of this is a bug. It all comes directly from how WSL2 is designed under the hood. Once you understand the key design decisions, these problems become easy to diagnose.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What Kind of VM Is It, Exactly?&lt;/h2&gt;
&lt;p&gt;There are two types of hypervisors. Type 1 (Bare Metal) runs directly on hardware and hosts multiple operating systems — no host OS in between. Type 2 runs on top of an existing OS, like VirtualBox or VMware on your Windows desktop.&lt;/p&gt;
&lt;p&gt;Type 1 is more efficient, suited for data center servers. Type 2 is more flexible, better for developer workstations.&lt;/p&gt;
&lt;p&gt;So where does WSL2 fit?&lt;/p&gt;
&lt;p&gt;At first glance, it looks like Type 2 — Linux is running inside Windows, it can't run standalone, and we're using it on a client machine. But the performance is surprisingly good, almost like running on bare metal.&lt;/p&gt;
&lt;p&gt;The reality is it's neither. Or rather, it has the efficiency of Type 1 and the flexibility of Type 2.&lt;/p&gt;
&lt;p&gt;WSL2 runs a &lt;strong&gt;real Linux kernel&lt;/strong&gt; inside Windows.&lt;/p&gt;
&lt;p&gt;But this "VM" isn't like VirtualBox or VMware. It's called a &lt;strong&gt;Utility VM&lt;/strong&gt;, running on Microsoft's own &lt;strong&gt;Hyper-V Hypervisor&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A regular VM has to simulate an entire hardware stack: motherboard, BIOS, GPU drivers, storage controllers — all of it. WSL2's Utility VM skips all of that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No BIOS emulation&lt;/li&gt;
&lt;li&gt;No virtual hardware drivers&lt;/li&gt;
&lt;li&gt;No fixed memory reservation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It only exposes what the Linux kernel actually needs: CPU time, memory pages, and I/O channels. The result is fast startup and near-zero memory use when idle.&lt;/p&gt;
&lt;p&gt;If we had to put a label on it: &lt;strong&gt;Type 1.5&lt;/strong&gt; — Hyper-V underneath, but far lighter than a traditional VM.&lt;/p&gt;
&lt;p&gt;One thing worth clarifying: Hyper-V actually has two layers. The first is the &lt;strong&gt;Hypervisor itself&lt;/strong&gt;, loaded directly by the Windows 11 bootloader at startup — it runs &lt;em&gt;below&lt;/em&gt; the OS at Type 1 level, and it's always on. That's the layer WSL2 uses. The second layer is the &lt;strong&gt;Hyper-V management services&lt;/strong&gt; — the "Hyper-V xxx" entries you see in services.msc. Those are for Hyper-V Manager and traditional VM management. WSL2 doesn't use them at all, so it's completely normal for those services to be stopped.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;From WSL1 to WSL2: Why the Design Changed&lt;/h2&gt;
&lt;p&gt;Why is WSL2 designed this way? We need to look back at the history — starting with how WSL1 worked and where it broke down.&lt;/p&gt;
&lt;p&gt;WSL1, released in August 2016, was built around &lt;strong&gt;syscall translation&lt;/strong&gt;: when you ran &lt;code&gt;ls&lt;/code&gt; or &lt;code&gt;make&lt;/code&gt; inside it, WSL1 intercepted those Linux kernel calls and translated them into Windows API calls in real time. Clever idea — but it fell apart under real workloads.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 1: Translation itself has a cost.&lt;/strong&gt; Every syscall — reading a file, spawning a process, checking permissions — goes through three steps: intercept, translate, execute. This isn't something that happens occasionally. A running program can trigger thousands of syscalls per second. The overhead adds up fast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 2: The file systems are fundamentally incompatible.&lt;/strong&gt; Linux uses ext4, built around inodes. Windows uses NTFS, with a completely different permission model. WSL1 had to do real-time mapping between the two — but Linux concepts like symlinks, permission bits, and case-sensitive filenames either have no equivalent in Windows or behave differently. The translation cost was high, and the results weren't always correct.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 3: Some things simply can't be translated.&lt;/strong&gt; This was WSL1's real breaking point. Containers (Docker) depend deeply on two Linux kernel mechanisms: namespaces, which isolate what a process can see, and cgroups, which limit resource usage. These are native Linux kernel capabilities — Windows has no equivalent. There's nothing to translate to. So Docker in WSL1 never worked, period.&lt;/p&gt;
&lt;p&gt;WSL2's solution was direct: &lt;strong&gt;stop translating. Put a real Linux kernel in there instead.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With that, Linux syscalls go straight into the kernel — no middle layer. The ext4 file system runs natively inside the VM with no NTFS mapping. Namespaces and cgroups actually exist, so Docker just works.&lt;/p&gt;
&lt;p&gt;The performance gain wasn't a tweak. It was a fundamental rethink.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Your Entire Linux Lives in One File&lt;/h2&gt;
&lt;p&gt;Let's see what Linux actually looks like inside the Windows file system.&lt;/p&gt;
&lt;p&gt;Open File Explorer and navigate to &lt;code&gt;C:\Users\[username]\AppData\Local\wsl\&lt;/code&gt;. You'll find a subfolder with a GUID name (something like &lt;code&gt;{445ca81a-6e98-4e8d-aa7b-da5591a61d49}&lt;/code&gt;). Inside it is a file called &lt;code&gt;ext4.vhdx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;(Older versions of WSL2 used the distro name as the folder name, like &lt;code&gt;Ubuntu&lt;/code&gt;. Newer versions switched to GUIDs.)&lt;/p&gt;
&lt;p&gt;&lt;img alt="Linux in the Windows file system" src="https://vincentping.com/images/20260228/linux_files_in_windows.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your entire Linux system is that one file.&lt;/strong&gt; Every package installed, every repo cloned, every line written to a log — it's all in there.&lt;/p&gt;
&lt;p&gt;Here's a counterintuitive trap: &lt;code&gt;.vhdx&lt;/code&gt; is dynamically expanding, so it grows as you add data. But &lt;strong&gt;deleting files inside Linux does not shrink the &lt;code&gt;.vhdx&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Delete 20 GB of dependencies? Windows disk usage won't budge. After a few months, the &lt;code&gt;.vhdx&lt;/code&gt; ballooning to several hundred GB is common — even if the actual Linux content is much smaller.&lt;/p&gt;
&lt;p&gt;The fix is Windows' built-in &lt;code&gt;diskpart&lt;/code&gt;. Close all WSL windows, run &lt;code&gt;wsl --shutdown&lt;/code&gt;, then:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;diskpart&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vdisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;C:\Users\[username]\AppData\Local\wsl\{your-GUID}\ext4.vhdx&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;attach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vdisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;readonly&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;compact&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vdisk&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;detach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vdisk&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This compresses the empty space inside the virtual disk and gives it back to Windows. Anyone maintaining a WSL environment long-term should run this periodically.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Why Is Cross-System File Access So Slow?&lt;/h2&gt;
&lt;p&gt;This is WSL2's most common performance complaint: accessing Windows files from inside Linux (anything under &lt;code&gt;/mnt/c/&lt;/code&gt;) is painfully slow. Restarting WSL or switching commands doesn't help.&lt;/p&gt;
&lt;p&gt;What about the other direction? Opening Linux files from Windows Explorer (the penguin icon in the left sidebar) — just as slow.&lt;/p&gt;
&lt;p&gt;Same reason: both directions go through the same channel.&lt;/p&gt;
&lt;p&gt;WSL2 runs two completely separate file systems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ext4&lt;/strong&gt;, inside the Linux Utility VM (paths like &lt;code&gt;~/projects/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NTFS&lt;/strong&gt;, on the Windows side (accessed from Linux as &lt;code&gt;/mnt/c/&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whichever direction you're crossing, every request goes through: the Hyper-V virtualization layer → tunneled via the &lt;strong&gt;9P protocol&lt;/strong&gt; → reaches the other side → data comes all the way back. Every single file operation makes that round trip.&lt;/p&gt;
&lt;p&gt;(9P is a network file-sharing protocol. WSL2 runs a 9P server internally — it essentially treats the other side's file system like a network share on a LAN.)&lt;/p&gt;
&lt;p&gt;For anything that reads and writes lots of small files frequently, each operation is a 9P round trip through the virtualization layer — 10 to 50× slower is completely normal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The rule is simple: keep files where you use them.&lt;/strong&gt; Files you work on in WSL2 go in the Linux file system (&lt;code&gt;~/&lt;/code&gt;). Windows projects stay in NTFS. Don't make files cross the boundary repeatedly — no configuration can work around this physical constraint.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The IP That Keeps Changing&lt;/h2&gt;
&lt;p&gt;When WSL2 starts, Windows builds a small internal virtual LAN: Linux gets a virtual network card, the Windows host gets one too, and they talk through this private network using addresses in the &lt;code&gt;172.x.x.x&lt;/code&gt; range.&lt;/p&gt;
&lt;p&gt;The problem: &lt;strong&gt;every time WSL2 restarts via &lt;code&gt;wsl --shutdown&lt;/code&gt;, this virtual LAN gets rebuilt and IPs are reassigned&lt;/strong&gt;. It might be &lt;code&gt;172.28.80.1&lt;/code&gt; one time, &lt;code&gt;172.19.32.1&lt;/code&gt; the next.&lt;/p&gt;
&lt;p&gt;This creates two distinct issues — worth separating:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows connecting to Linux services&lt;/strong&gt;: Say you're running a web server inside Linux and want to open it in a Windows browser — don't worry about the IP. Just use &lt;code&gt;localhost&lt;/code&gt;. Microsoft handles automatic forwarding on the Windows side. Nothing to configure here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linux connecting to Windows services&lt;/strong&gt;: This direction is trickier. If a script needs to call an endpoint on the Windows host, or connect to a database running on Windows, Linux needs to know the current Windows host IP to get there.&lt;/p&gt;
&lt;p&gt;And that IP is exactly the one that changes every restart.&lt;/p&gt;
&lt;p&gt;The good news: every time WSL2 starts, it automatically writes the current Windows host IP into &lt;code&gt;/etc/resolv.conf&lt;/code&gt; on the Linux side:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/etc/resolv.conf
&lt;span class="c1"&gt;# nameserver 172.28.80.1  ← this is the Windows host IP right now&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Any script that needs to reach back to Windows should &lt;strong&gt;read this value dynamically&lt;/strong&gt; — never hardcode a specific IP. Hardcode it, and after the next restart it silently stops working. No error, no warning — just mysterious failures that take a long time to trace.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Keeping WSL2 From Eating All Your Memory&lt;/h2&gt;
&lt;p&gt;Let's talk about resource limits. By default, WSL2 can use up to 50% of system memory and all CPU cores. On a 32 GB machine running heavy workloads, that noticeably squeezes Windows-side applications.&lt;/p&gt;
&lt;p&gt;How do we configure it? Windows now includes a built-in GUI tool called &lt;strong&gt;WSL Settings&lt;/strong&gt; — just search for it and open it. Memory limit, CPU core count, and swap size are all right there. Adjust and save.&lt;/p&gt;
&lt;p&gt;&lt;img alt="WSL Settings" src="https://vincentping.com/images/20260228/wsl_settings.png"&gt;&lt;/p&gt;
&lt;p&gt;If you prefer editing manually, create or edit &lt;code&gt;.wslconfig&lt;/code&gt; in &lt;code&gt;C:\Users\[username]\&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[wsl2]&lt;/span&gt;
&lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;8GB&lt;/span&gt;
&lt;span class="na"&gt;processors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;4&lt;/span&gt;
&lt;span class="na"&gt;swap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2GB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Both approaches work the same way. Run &lt;code&gt;wsl --shutdown&lt;/code&gt; after saving — changes take effect on the next start. Tune the numbers to your machine; there's no universal right answer.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Why Did Microsoft Build This?&lt;/h2&gt;
&lt;p&gt;Some people wonder — why would Microsoft go to all this trouble to run Linux inside Windows? Weren't they worried about it cutting into their business?&lt;/p&gt;
&lt;p&gt;There's a clear business logic behind it. Three reasons, actually.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reason 1: Win back developers.&lt;/strong&gt; Between 2010 and 2018, a massive number of developers moved from Windows to MacBooks — because macOS natively supports Unix toolchains, while Windows developers were fighting Cygwin, path escaping, and permission incompatibilities. Microsoft saw the pattern: control the developer experience, control the ecosystem. WSL2 was the counterpunch — make Windows a platform developers actually want to use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reason 2: A beachhead for the cloud.&lt;/strong&gt; Every major cloud platform runs Linux. Developers who use WSL2 locally — learning shell, apt, systemd — build skills that transfer directly to cloud environments. When they're ready to move workloads up, the path of least resistance leads straight to Azure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reason 3: A prerequisite for the container era.&lt;/strong&gt; Docker and Kubernetes require a real Linux kernel. Without WSL2, Docker Desktop on Windows needed a much heavier standalone VM. WSL2 made containers feel natural on Windows — and comfortable Docker users are one step closer to Azure.&lt;/p&gt;
&lt;p&gt;WSL2 isn't a product. It's a layer of strategic infrastructure. A company that once called Linux "a cancer" spent years building what is arguably the most polished Linux environment on any platform. Once the business logic clicks, everything makes sense.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Quick Reference: Things That'll Bite You&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;wsl --unregister&lt;/code&gt; is a hard delete.&lt;/strong&gt; The &lt;code&gt;.vhdx&lt;/code&gt; file disappears instantly — no confirmation, no Recycle Bin, no recovery. Always run &lt;code&gt;wsl --export [distro-name] [backup.tar]&lt;/code&gt; before using it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code&gt;.vhdx&lt;/code&gt; silently bloats.&lt;/strong&gt; Disk space freed inside Linux doesn't return to Windows automatically. On long-running WSL machines, run &lt;code&gt;diskpart compact vdisk&lt;/code&gt; periodically — otherwise one day you'll suddenly find the C drive full.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where files live affects performance.&lt;/strong&gt; Files that need frequent access inside WSL2 should live in the Linux file system (&lt;code&gt;~/&lt;/code&gt;), not &lt;code&gt;/mnt/c/&lt;/code&gt;. Making this clear resolves most "why is WSL2 so slow" complaints.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kernel errors: update before reinstalling.&lt;/strong&gt; WSL2's Linux kernel is maintained by Microsoft separately from your distro. For mysterious crashes, run &lt;code&gt;wsl --update&lt;/code&gt; first — reinstalling the distro almost certainly won't fix a kernel-level issue.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Installing WSL2 is the first step. Understanding how it actually behaves is what makes you comfortable using it.&lt;/p&gt;</content><category term="Tech"></category><category term="Linux"></category><category term="WSL2"></category><category term="Windows"></category><category term="Architecture"></category><category term="SysAdmin"></category></entry><entry><title>WSL2 Under the Hood: One VM, One File, One IP That Never Stays the Same</title><link href="https://vincentping.com/en/wsl2-under-the-hood.html" rel="alternate"></link><published>2026-02-27T22:10:00+08:00</published><updated>2026-02-27T22:10:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-02-27:/en/wsl2-under-the-hood.html</id><summary type="html">&lt;p&gt;Once WSL2 is up and running, some strange things start to happen: you delete gigabytes of files in Linux and Windows disk usage doesn't budge; cross-system file access is painfully slow; a network script that worked fine yesterday suddenly breaks after a wsl --shutdown. None of this is a bug. It all traces back to three things at the core of WSL2's design — a special kind of VM, a single file that holds your entire Linux system, and an IP address that changes every time you restart.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The previous article "&lt;a href="https://vincentping.com/en/install-a-linux-in-windows-11-in-5-minutes" target="_blank"&gt;Install Linux on Windows 11 in 5 Minutes&lt;/a&gt;" covered how to install WSL2 and get it running. Once you've had it going for a while, the quirks start to show.&lt;/p&gt;
&lt;p&gt;You delete a bunch of files inside Linux — Windows disk space doesn't move. You try to access Windows files from inside WSL2 — painfully slow. A network script that worked fine yesterday stops connecting after a &lt;code&gt;wsl --shutdown&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;None of this is a bug. It all comes directly from how WSL2 is designed under the hood. Once you understand the key design decisions, these problems become easy to diagnose.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What Kind of VM Is It, Exactly?&lt;/h2&gt;
&lt;p&gt;There are two types of hypervisors. Type 1 (Bare Metal) runs directly on hardware and hosts multiple operating systems — no host OS in between. Type 2 runs on top of an existing OS, like VirtualBox or VMware on your Windows desktop.&lt;/p&gt;
&lt;p&gt;Type 1 is more efficient, suited for data center servers. Type 2 is more flexible, better for developer workstations.&lt;/p&gt;
&lt;p&gt;So where does WSL2 fit?&lt;/p&gt;
&lt;p&gt;At first glance, it looks like Type 2 — Linux is running inside Windows, it can't run standalone, and we're using it on a client machine. But the performance is surprisingly good, almost like running on bare metal.&lt;/p&gt;
&lt;p&gt;The reality is it's neither. Or rather, it has the efficiency of Type 1 and the flexibility of Type 2.&lt;/p&gt;
&lt;p&gt;WSL2 runs a &lt;strong&gt;real Linux kernel&lt;/strong&gt; inside Windows.&lt;/p&gt;
&lt;p&gt;But this "VM" isn't like VirtualBox or VMware. It's called a &lt;strong&gt;Utility VM&lt;/strong&gt;, running on Microsoft's own &lt;strong&gt;Hyper-V Hypervisor&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A regular VM has to simulate an entire hardware stack: motherboard, BIOS, GPU drivers, storage controllers — all of it. WSL2's Utility VM skips all of that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No BIOS emulation&lt;/li&gt;
&lt;li&gt;No virtual hardware drivers&lt;/li&gt;
&lt;li&gt;No fixed memory reservation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It only exposes what the Linux kernel actually needs: CPU time, memory pages, and I/O channels. The result is fast startup and near-zero memory use when idle.&lt;/p&gt;
&lt;p&gt;If we had to put a label on it: &lt;strong&gt;Type 1.5&lt;/strong&gt; — Hyper-V underneath, but far lighter than a traditional VM.&lt;/p&gt;
&lt;p&gt;One thing worth clarifying: Hyper-V actually has two layers. The first is the &lt;strong&gt;Hypervisor itself&lt;/strong&gt;, loaded directly by the Windows 11 bootloader at startup — it runs &lt;em&gt;below&lt;/em&gt; the OS at Type 1 level, and it's always on. That's the layer WSL2 uses. The second layer is the &lt;strong&gt;Hyper-V management services&lt;/strong&gt; — the "Hyper-V xxx" entries you see in services.msc. Those are for Hyper-V Manager and traditional VM management. WSL2 doesn't use them at all, so it's completely normal for those services to be stopped.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;From WSL1 to WSL2: Why the Design Changed&lt;/h2&gt;
&lt;p&gt;Why is WSL2 designed this way? We need to look back at the history — starting with how WSL1 worked and where it broke down.&lt;/p&gt;
&lt;p&gt;WSL1, released in August 2016, was built around &lt;strong&gt;syscall translation&lt;/strong&gt;: when you ran &lt;code&gt;ls&lt;/code&gt; or &lt;code&gt;make&lt;/code&gt; inside it, WSL1 intercepted those Linux kernel calls and translated them into Windows API calls in real time. Clever idea — but it fell apart under real workloads.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 1: Translation itself has a cost.&lt;/strong&gt; Every syscall — reading a file, spawning a process, checking permissions — goes through three steps: intercept, translate, execute. This isn't something that happens occasionally. A running program can trigger thousands of syscalls per second. The overhead adds up fast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 2: The file systems are fundamentally incompatible.&lt;/strong&gt; Linux uses ext4, built around inodes. Windows uses NTFS, with a completely different permission model. WSL1 had to do real-time mapping between the two — but Linux concepts like symlinks, permission bits, and case-sensitive filenames either have no equivalent in Windows or behave differently. The translation cost was high, and the results weren't always correct.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 3: Some things simply can't be translated.&lt;/strong&gt; This was WSL1's real breaking point. Containers (Docker) depend deeply on two Linux kernel mechanisms: namespaces, which isolate what a process can see, and cgroups, which limit resource usage. These are native Linux kernel capabilities — Windows has no equivalent. There's nothing to translate to. So Docker in WSL1 never worked, period.&lt;/p&gt;
&lt;p&gt;WSL2's solution was direct: &lt;strong&gt;stop translating. Put a real Linux kernel in there instead.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With that, Linux syscalls go straight into the kernel — no middle layer. The ext4 file system runs natively inside the VM with no NTFS mapping. Namespaces and cgroups actually exist, so Docker just works.&lt;/p&gt;
&lt;p&gt;The performance gain wasn't a tweak. It was a fundamental rethink.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Your Entire Linux Lives in One File&lt;/h2&gt;
&lt;p&gt;Let's see what Linux actually looks like inside the Windows file system.&lt;/p&gt;
&lt;p&gt;Open File Explorer and navigate to &lt;code&gt;C:\Users\[username]\AppData\Local\wsl\&lt;/code&gt;. You'll find a subfolder with a GUID name (something like &lt;code&gt;{445ca81a-6e98-4e8d-aa7b-da5591a61d49}&lt;/code&gt;). Inside it is a file called &lt;code&gt;ext4.vhdx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;(Older versions of WSL2 used the distro name as the folder name, like &lt;code&gt;Ubuntu&lt;/code&gt;. Newer versions switched to GUIDs.)&lt;/p&gt;
&lt;p&gt;&lt;img alt="Linux in the Windows file system" src="https://vincentping.com/images/20260228/linux_files_in_windows.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your entire Linux system is that one file.&lt;/strong&gt; Every package installed, every repo cloned, every line written to a log — it's all in there.&lt;/p&gt;
&lt;p&gt;Here's a counterintuitive trap: &lt;code&gt;.vhdx&lt;/code&gt; is dynamically expanding, so it grows as you add data. But &lt;strong&gt;deleting files inside Linux does not shrink the &lt;code&gt;.vhdx&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Delete 20 GB of dependencies? Windows disk usage won't budge. After a few months, the &lt;code&gt;.vhdx&lt;/code&gt; ballooning to several hundred GB is common — even if the actual Linux content is much smaller.&lt;/p&gt;
&lt;p&gt;The fix is Windows' built-in &lt;code&gt;diskpart&lt;/code&gt;. Close all WSL windows, run &lt;code&gt;wsl --shutdown&lt;/code&gt;, then:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;diskpart&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vdisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;C:\Users\[username]\AppData\Local\wsl\{your-GUID}\ext4.vhdx&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;attach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vdisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;readonly&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;compact&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vdisk&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;detach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vdisk&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This compresses the empty space inside the virtual disk and gives it back to Windows. Anyone maintaining a WSL environment long-term should run this periodically.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Why Is Cross-System File Access So Slow?&lt;/h2&gt;
&lt;p&gt;This is WSL2's most common performance complaint: accessing Windows files from inside Linux (anything under &lt;code&gt;/mnt/c/&lt;/code&gt;) is painfully slow. Restarting WSL or switching commands doesn't help.&lt;/p&gt;
&lt;p&gt;What about the other direction? Opening Linux files from Windows Explorer (the penguin icon in the left sidebar) — just as slow.&lt;/p&gt;
&lt;p&gt;Same reason: both directions go through the same channel.&lt;/p&gt;
&lt;p&gt;WSL2 runs two completely separate file systems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ext4&lt;/strong&gt;, inside the Linux Utility VM (paths like &lt;code&gt;~/projects/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NTFS&lt;/strong&gt;, on the Windows side (accessed from Linux as &lt;code&gt;/mnt/c/&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whichever direction you're crossing, every request goes through: the Hyper-V virtualization layer → tunneled via the &lt;strong&gt;9P protocol&lt;/strong&gt; → reaches the other side → data comes all the way back. Every single file operation makes that round trip.&lt;/p&gt;
&lt;p&gt;(9P is a network file-sharing protocol. WSL2 runs a 9P server internally — it essentially treats the other side's file system like a network share on a LAN.)&lt;/p&gt;
&lt;p&gt;For anything that reads and writes lots of small files frequently, each operation is a 9P round trip through the virtualization layer — 10 to 50× slower is completely normal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The rule is simple: keep files where you use them.&lt;/strong&gt; Files you work on in WSL2 go in the Linux file system (&lt;code&gt;~/&lt;/code&gt;). Windows projects stay in NTFS. Don't make files cross the boundary repeatedly — no configuration can work around this physical constraint.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The IP That Keeps Changing&lt;/h2&gt;
&lt;p&gt;When WSL2 starts, Windows builds a small internal virtual LAN: Linux gets a virtual network card, the Windows host gets one too, and they talk through this private network using addresses in the &lt;code&gt;172.x.x.x&lt;/code&gt; range.&lt;/p&gt;
&lt;p&gt;The problem: &lt;strong&gt;every time WSL2 restarts via &lt;code&gt;wsl --shutdown&lt;/code&gt;, this virtual LAN gets rebuilt and IPs are reassigned&lt;/strong&gt;. It might be &lt;code&gt;172.28.80.1&lt;/code&gt; one time, &lt;code&gt;172.19.32.1&lt;/code&gt; the next.&lt;/p&gt;
&lt;p&gt;This creates two distinct issues — worth separating:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows connecting to Linux services&lt;/strong&gt;: Say you're running a web server inside Linux and want to open it in a Windows browser — don't worry about the IP. Just use &lt;code&gt;localhost&lt;/code&gt;. Microsoft handles automatic forwarding on the Windows side. Nothing to configure here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linux connecting to Windows services&lt;/strong&gt;: This direction is trickier. If a script needs to call an endpoint on the Windows host, or connect to a database running on Windows, Linux needs to know the current Windows host IP to get there.&lt;/p&gt;
&lt;p&gt;And that IP is exactly the one that changes every restart.&lt;/p&gt;
&lt;p&gt;The good news: every time WSL2 starts, it automatically writes the current Windows host IP into &lt;code&gt;/etc/resolv.conf&lt;/code&gt; on the Linux side:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/etc/resolv.conf
&lt;span class="c1"&gt;# nameserver 172.28.80.1  ← this is the Windows host IP right now&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Any script that needs to reach back to Windows should &lt;strong&gt;read this value dynamically&lt;/strong&gt; — never hardcode a specific IP. Hardcode it, and after the next restart it silently stops working. No error, no warning — just mysterious failures that take a long time to trace.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Keeping WSL2 From Eating All Your Memory&lt;/h2&gt;
&lt;p&gt;Let's talk about resource limits. By default, WSL2 can use up to 50% of system memory and all CPU cores. On a 32 GB machine running heavy workloads, that noticeably squeezes Windows-side applications.&lt;/p&gt;
&lt;p&gt;How do we configure it? Windows now includes a built-in GUI tool called &lt;strong&gt;WSL Settings&lt;/strong&gt; — just search for it and open it. Memory limit, CPU core count, and swap size are all right there. Adjust and save.&lt;/p&gt;
&lt;p&gt;&lt;img alt="WSL Settings" src="https://vincentping.com/images/20260228/wsl_settings.png"&gt;&lt;/p&gt;
&lt;p&gt;If you prefer editing manually, create or edit &lt;code&gt;.wslconfig&lt;/code&gt; in &lt;code&gt;C:\Users\[username]\&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[wsl2]&lt;/span&gt;
&lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;8GB&lt;/span&gt;
&lt;span class="na"&gt;processors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;4&lt;/span&gt;
&lt;span class="na"&gt;swap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2GB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Both approaches work the same way. Run &lt;code&gt;wsl --shutdown&lt;/code&gt; after saving — changes take effect on the next start. Tune the numbers to your machine; there's no universal right answer.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Why Did Microsoft Build This?&lt;/h2&gt;
&lt;p&gt;Some people wonder — why would Microsoft go to all this trouble to run Linux inside Windows? Weren't they worried about it cutting into their business?&lt;/p&gt;
&lt;p&gt;There's a clear business logic behind it. Three reasons, actually.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reason 1: Win back developers.&lt;/strong&gt; Between 2010 and 2018, a massive number of developers moved from Windows to MacBooks — because macOS natively supports Unix toolchains, while Windows developers were fighting Cygwin, path escaping, and permission incompatibilities. Microsoft saw the pattern: control the developer experience, control the ecosystem. WSL2 was the counterpunch — make Windows a platform developers actually want to use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reason 2: A beachhead for the cloud.&lt;/strong&gt; Every major cloud platform runs Linux. Developers who use WSL2 locally — learning shell, apt, systemd — build skills that transfer directly to cloud environments. When they're ready to move workloads up, the path of least resistance leads straight to Azure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reason 3: A prerequisite for the container era.&lt;/strong&gt; Docker and Kubernetes require a real Linux kernel. Without WSL2, Docker Desktop on Windows needed a much heavier standalone VM. WSL2 made containers feel natural on Windows — and comfortable Docker users are one step closer to Azure.&lt;/p&gt;
&lt;p&gt;WSL2 isn't a product. It's a layer of strategic infrastructure. A company that once called Linux "a cancer" spent years building what is arguably the most polished Linux environment on any platform. Once the business logic clicks, everything makes sense.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Quick Reference: Things That'll Bite You&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;wsl --unregister&lt;/code&gt; is a hard delete.&lt;/strong&gt; The &lt;code&gt;.vhdx&lt;/code&gt; file disappears instantly — no confirmation, no Recycle Bin, no recovery. Always run &lt;code&gt;wsl --export [distro-name] [backup.tar]&lt;/code&gt; before using it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code&gt;.vhdx&lt;/code&gt; silently bloats.&lt;/strong&gt; Disk space freed inside Linux doesn't return to Windows automatically. On long-running WSL machines, run &lt;code&gt;diskpart compact vdisk&lt;/code&gt; periodically — otherwise one day you'll suddenly find the C drive full.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where files live affects performance.&lt;/strong&gt; Files that need frequent access inside WSL2 should live in the Linux file system (&lt;code&gt;~/&lt;/code&gt;), not &lt;code&gt;/mnt/c/&lt;/code&gt;. Making this clear resolves most "why is WSL2 so slow" complaints.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kernel errors: update before reinstalling.&lt;/strong&gt; WSL2's Linux kernel is maintained by Microsoft separately from your distro. For mysterious crashes, run &lt;code&gt;wsl --update&lt;/code&gt; first — reinstalling the distro almost certainly won't fix a kernel-level issue.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Installing WSL2 is the first step. Understanding how it actually behaves is what makes you comfortable using it.&lt;/p&gt;</content><category term="Tech"></category><category term="Linux"></category><category term="WSL2"></category><category term="Windows"></category><category term="Architecture"></category><category term="SysAdmin"></category></entry><entry><title>WSL2 底层：一个虚拟机、一个文件、一个会变的 IP</title><link href="https://vincentping.com/cn/wsl2-under-the-hood.html" rel="alternate"></link><published>2026-02-27T19:20:00+08:00</published><updated>2026-02-27T19:20:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-02-27:/cn/wsl2-under-the-hood.html</id><summary type="html">&lt;p&gt;装好 WSL2 之后，用着用着就会碰到一些奇怪的问题：Linux 里删了几十 GB，Windows 磁盘纹丝不动；跨系统访问文件，速度慢得离谱；网络脚本昨天还好好的，重启 WSL 就连不上了。这些都不是 Bug，根子在 WSL2 的底层设计——一个特殊的虚拟机、一个装着整个 Linux 的文件、还有一个每次重启都会变的 IP。搞清楚这三件事，那些让人懵的问题就都说得通了。&lt;/p&gt;</summary><content type="html">&lt;p&gt;前面那篇《&lt;a href="https://vincentping.com/cn/install-a-linux-in-windows-11-in-5-minutes" target="_blank"&gt;Windows 11 下 5 分钟安装 Linux&lt;/a&gt;》介绍了怎么安装、以及怎么用起来。&lt;/p&gt;
&lt;p&gt;装好之后用着用着，我们就会碰到一些奇怪的问题。比如明明 Linux 里删了一堆文件，Windows 磁盘空间怎么没变？再比如，从 WSL2 里访问 Windows 那边的文件，速度慢得出奇？还有，网络脚本昨天还好好的，今天 &lt;code&gt;wsl --shutdown&lt;/code&gt; 一重启就连不上了？&lt;/p&gt;
&lt;p&gt;这些其实都不是 Bug，而是 WSL2 底层设计直接带来的。搞清楚它的一些设计思路，这些问题就能很容易定位解决。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;它到底是什么类型的虚拟机&lt;/h2&gt;
&lt;p&gt;我们知道，虚拟机有两种类型，一种Type 1（Bare Metal），直接在硬件上运行多种系统；另一种Type 2，则是在现有操作系统上运行虚拟机。&lt;/p&gt;
&lt;p&gt;相比Type 2， Type 1运行效率更高，适合数据中心服务器；但是Type 2 更灵活，则适合开发测试人员运行的Workstation。&lt;/p&gt;
&lt;p&gt;那Windows里的Linux算哪一种呢？&lt;/p&gt;
&lt;p&gt;乍一看，Windows是在其里面运行Linux，不能单独运行Linux，而且一般我们也是在客户端使用，好像是Type 2。但是它的运行效率确实很高，几乎就像Bare Metal上运行一样。&lt;/p&gt;
&lt;p&gt;实际的情况是，它既不是Type 1，也不是Type 2。或者说，它既有Type 1的效率，也有Type 2 的灵活性。&lt;/p&gt;
&lt;p&gt;WSL2 在 Windows 内部运行着一个&lt;strong&gt;真正的 Linux 内核&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;但这个"虚拟机"跟我们印象里的 VirtualBox、VMware 不一样。它叫 &lt;strong&gt;Utility VM（实用虚拟机）&lt;/strong&gt;，跑在微软自家的 &lt;strong&gt;Hyper-V Hypervisor&lt;/strong&gt; 之上。&lt;/p&gt;
&lt;p&gt;普通虚拟机要模拟一整套硬件：主板、BIOS、显卡驱动、存储控制器，开销很重。WSL2 的 Utility VM 把这些全跳过了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不模拟 BIOS&lt;/li&gt;
&lt;li&gt;不加载虚拟硬件驱动&lt;/li&gt;
&lt;li&gt;不预留固定内存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它只向 Linux 内核暴露真正必要的东西：CPU 时间、内存页和 I/O 通道。结果是启动很快，而且闲置时内存占用近乎为零。&lt;/p&gt;
&lt;p&gt;所以，如果非要给它分个类：&lt;strong&gt;Type 1.5&lt;/strong&gt;——Hyper-V 打底，但比普通虚拟机轻得多。&lt;/p&gt;
&lt;p&gt;这里要提醒一点：Hyper-V 其实分两层。一层是 &lt;strong&gt;Hypervisor 本体&lt;/strong&gt;，Windows 11 启动时由系统引导程序直接加载，运行在操作系统"下面"，属于 Type 1 级别——这一层一直在跑，WSL2 用的就是它。另一层是 &lt;strong&gt;Hyper-V 管理服务&lt;/strong&gt;，也就是在 services.msc 里看到的那些"Hyper-V xxx"服务，那是给 Hyper-V Manager 和传统虚拟机管理用的。WSL2 根本不走那条路，所以那些服务关着也完全正常。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;WSL1 到 WSL2 的进化历史&lt;/h2&gt;
&lt;p&gt;WSL2 为什么要这么设计？这个需要回头看看历史，我们要先看 WSL1 是怎么设计的，以及它的问题。&lt;/p&gt;
&lt;p&gt;十年前（2016年8月）推出的WSL1 的设计思路叫&lt;strong&gt;系统调用翻译&lt;/strong&gt;：当我们在里面跑 &lt;code&gt;ls&lt;/code&gt; 或者 &lt;code&gt;make&lt;/code&gt;，WSL1 会拦截这些 Linux 内核调用，实时翻译成对应的 Windows API。听起来挺聪明，但遇到真实场景就现原形了：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题一：翻译本身就是开销。&lt;/strong&gt; 每一次系统调用——读文件、创建进程、查权限——都要经过拦截、翻译、再执行这三步。这不是偶尔发生的，而是程序运行时每秒可能触发几千次的事情。累积下来，性能损耗极大。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题二：文件系统根本就不兼容。&lt;/strong&gt; Linux 用的是 ext4，基于 inode 结构；Windows 用的是 NTFS，权限模型完全不同。WSL1 要在两套完全不同的文件系统之间实时做映射，Linux 的软链接、权限位、大小写敏感——这些在 Windows 里要么没有对应概念，要么行为不一样。翻译的代价极高，翻译的结果也不总是对的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题三：有些东西根本没法翻译。&lt;/strong&gt; 这才是 WSL1 真正的死穴。容器（Docker）深度依赖 Linux 内核的 namespace 和 cgroups 机制——namespace 用来隔离进程视图，cgroups 用来限制资源占用。这两个是 Linux 内核的原生能力，Windows 上根本没有对应的东西，翻译无从下手。所以 WSL1 里，Docker 永远跑不起来。&lt;/p&gt;
&lt;p&gt;WSL2 的解法非常直接：&lt;strong&gt;不翻译了，直接塞一个真正的 Linux 内核进去。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这样一来，Linux 程序发出的系统调用直接进内核，没有任何中间层。ext4 文件系统在 VM 内部原生运行，不需要跟 NTFS 做任何映射。namespace、cgroups 都是真实存在的，Docker 自然就能跑起来。&lt;/p&gt;
&lt;p&gt;效率的提升不是"优化了一下"，而是从根本上换掉了思路。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;你的整个 Linux 就是一个文件&lt;/h2&gt;
&lt;p&gt;接下来，我们看看Linux在Windows文件系统究竟长什么样？&lt;/p&gt;
&lt;p&gt;打开文件资源管理器，导航到 &lt;code&gt;C:\Users\[用户名]\AppData\Local\wsl\&lt;/code&gt;，会看到一个用 GUID 命名的子文件夹（类似 &lt;code&gt;{445ca81a-6e98-4e8d-aa7b-da5591a61d49}&lt;/code&gt; 这样一串）。进去之后，里面有一个 &lt;code&gt;ext4.vhdx&lt;/code&gt; 文件。&lt;/p&gt;
&lt;p&gt;（以前的旧版 WSL2 用发行版名称命名这个文件夹，比如 &lt;code&gt;Ubuntu&lt;/code&gt;；新版改成 GUID 了。）&lt;/p&gt;
&lt;p&gt;&lt;img alt="Linux 在 Windows 文件系统里的样子" src="https://vincentping.com/images/20260228/linux_files_in_windows.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个 Linux 系统在 Windows 里，就是这一个文件&lt;/strong&gt;。我们安装的每个软件包、克隆的每个仓库、每一行写进去的日志——都在这里面。&lt;/p&gt;
&lt;p&gt;这里，有一个反直觉的坑要提醒大家：&lt;code&gt;.vhdx&lt;/code&gt; 是动态扩展的，数据越装越大，文件自然变大。但&lt;strong&gt;在 Linux 里删文件，&lt;code&gt;.vhdx&lt;/code&gt; 不会自动缩小&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;删了 20 GB 的依赖包？Windows 那边的磁盘占用纹丝不动。用了几个月，&lt;code&gt;.vhdx&lt;/code&gt; 膨胀到几百 GB 是常见情况，即便 Linux 里实际存的东西远没那么多。&lt;/p&gt;
&lt;p&gt;解决方案是 Windows 自带的 &lt;code&gt;diskpart&lt;/code&gt;。先关掉所有 WSL 窗口，执行 &lt;code&gt;wsl --shutdown&lt;/code&gt;，然后：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;diskpart&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vdisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;C:\Users\[用户名]\AppData\Local\wsl\{你的GUID}\ext4.vhdx&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;attach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vdisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;readonly&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;compact&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vdisk&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;detach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vdisk&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这个操作会把虚拟硬盘里的"气泡"压缩掉，把空间还给 Windows。长期维护 WSL 环境的，应该把这步定期跑一次。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;跨系统访问文件为什么这么慢&lt;/h2&gt;
&lt;p&gt;这是 WSL2 最常遇到的性能问题：在 Linux 里访问 Windows 那边的文件（比如 &lt;code&gt;/mnt/c/&lt;/code&gt; 下的内容），速度慢得离谱。重启 WSL、换个命令都没用。&lt;/p&gt;
&lt;p&gt;那反过来呢？Windows 那边通过资源管理器打开 Linux 文件（就是左侧导航栏里的那个小企鹅图标），同样慢。&lt;/p&gt;
&lt;p&gt;原因是一样的——两个方向走的是同一条通道。&lt;/p&gt;
&lt;p&gt;WSL2 同时运行着两套完全独立的文件系统：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ext4&lt;/strong&gt;，在 Linux Utility VM 内部（路径形如 &lt;code&gt;~/projects/&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NTFS&lt;/strong&gt;，在 Windows 那边（从 Linux 访问时路径是 &lt;code&gt;/mnt/c/&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不管哪个方向，只要跨越这条边界，请求都要经历：穿越 Hyper-V 虚拟化层 → 通过 &lt;strong&gt;9P 协议&lt;/strong&gt;隧道传输 → 到达对方 → 数据再原路返回。每一次文件操作都走这一圈。&lt;/p&gt;
&lt;p&gt;（9P 是一个网络文件共享协议。WSL2 内部运行着一个 9P 服务器，本质上是把对方的文件系统当成局域网共享来访问。）&lt;/p&gt;
&lt;p&gt;任何需要频繁读写大量小文件的操作，每次都是一次 9P 往返，穿越虚拟化层——速度慢 10 到 50 倍是正常的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结论很简单：文件放在哪里，就在哪里用。&lt;/strong&gt; 在 WSL2 里工作的文件放在 Linux 文件系统（&lt;code&gt;~/&lt;/code&gt; 下）；Windows 那边的项目就留在 NTFS 里。别让文件频繁跨边界，没有任何配置能绕过这个物理限制。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;IP 总是在变&lt;/h2&gt;
&lt;p&gt;WSL2 启动的时候，Windows 会在内部搭一个"小型虚拟局域网"：Linux 有自己的虚拟网卡，Windows 宿主机也有一张对应的虚拟网卡，两边通过这张虚拟网互相通信。这个虚拟网用的是 &lt;code&gt;172.x.x.x&lt;/code&gt; 这类私有地址段。&lt;/p&gt;
&lt;p&gt;麻烦的是，&lt;strong&gt;每次执行 &lt;code&gt;wsl --shutdown&lt;/code&gt; 重启 WSL2，这个虚拟局域网就会重建一次，IP 地址重新分配&lt;/strong&gt;。上次是 &lt;code&gt;172.28.80.1&lt;/code&gt;，下次可能就变成 &lt;code&gt;172.19.32.1&lt;/code&gt; 了。&lt;/p&gt;
&lt;p&gt;这带来两个完全不同的问题，分开说：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从 Windows 连 Linux 服务&lt;/strong&gt;：比如在 Linux 里跑了一个 Web 服务，想从 Windows 的浏览器打开——不用管 IP，直接用 &lt;code&gt;localhost&lt;/code&gt; 就行。微软已经在 Windows 侧做了自动转发，这个方向不用操心。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从 Linux 连 Windows 服务&lt;/strong&gt;：这个方向就麻烦了。比如脚本需要调用 Windows 那边的某个接口，或者连 Windows 本机的数据库——Linux 必须知道 Windows 宿主机当前的 IP 才能过去。&lt;/p&gt;
&lt;p&gt;而这个 IP，正是那个每次重启都会变的地址。&lt;/p&gt;
&lt;p&gt;好在 WSL2 每次启动时，会自动把 Windows 宿主机当前的虚拟 IP 写进 Linux 的一个配置文件里——&lt;code&gt;/etc/resolv.conf&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/etc/resolv.conf
&lt;span class="c1"&gt;# nameserver 172.28.80.1  ← 这就是此刻 Windows 宿主机的 IP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;所以，任何需要在 Linux 里回连 Windows 的脚本，都应该&lt;strong&gt;动态读取这个文件里的地址&lt;/strong&gt;，而不是把某个 IP 写死在脚本里。写死了，下次重启就静默失效，不会有任何报错提示，只会让人一头雾水地排查半天。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;防止 WSL2 把内存吃完&lt;/h2&gt;
&lt;p&gt;接下来，我们来说说 Linux 的资源占用如何配置。默认情况下，WSL2 可以吃掉最多 50% 的系统内存和全部 CPU 核心。在 32 GB 的机器上跑大项目时，这会明显挤压 Windows 侧的应用。&lt;/p&gt;
&lt;p&gt;怎么配置呢？现在 Windows 已经自带了一个图形界面工具 &lt;strong&gt;WSL Settings&lt;/strong&gt;，直接搜索打开，内存、CPU 核心数、swap 大小一目了然，改完点保存就行。&lt;/p&gt;
&lt;p&gt;&lt;img alt="WSL Settings 界面" src="https://vincentping.com/images/20260228/wsl_settings.png"&gt;&lt;/p&gt;
&lt;p&gt;如果喜欢手动改，也可以直接编辑 &lt;code&gt;C:\Users\[用户名]\&lt;/code&gt; 下的 &lt;code&gt;.wslconfig&lt;/code&gt; 文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[wsl2]&lt;/span&gt;
&lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;8GB&lt;/span&gt;
&lt;span class="na"&gt;processors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;4&lt;/span&gt;
&lt;span class="na"&gt;swap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2GB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;两种方式效果一样。改完执行 &lt;code&gt;wsl --shutdown&lt;/code&gt; 重启，即刻生效。这样就能把 Linux 占用资源设定一个限制，不会无限膨胀。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;微软为什么要造这个东西&lt;/h2&gt;
&lt;p&gt;最后，有的朋友可能会好奇，微软为啥要专门费劲弄个 WSL2 呢？他们不怕 Linux 影响他们的生意吗？&lt;/p&gt;
&lt;p&gt;其实，他们背后有几条很清晰的商业逻辑。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一条：抢回开发者。&lt;/strong&gt; 2010 到 2018 年间，大量开发者从 Windows 转向 MacBook，原因很简单——macOS 原生支持 Unix 工具链，Windows 开发者要跟 Cygwin、路径转义、权限不兼容死磕。微软意识到，得开发者者得生态。WSL2 是反击：让 Windows 变成开发者愿意用的平台。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二条：云的线下前哨。&lt;/strong&gt; 所有主流云平台底层都是 Linux。开发者在本地用 WSL2 练熟了 Ubuntu——学了 shell、apt、systemd——这些技能直接平移到云端。当他们需要上云时，阻力最小的路自然通向 Azure。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三条：容器化时代的必要条件。&lt;/strong&gt; Docker、Kubernetes 需要真正的 Linux 内核。没有 WSL2，Windows 上的 Docker Desktop 就要用一个笨重得多的独立 VM。WSL2 让容器在 Windows 上变得好用，Docker 用得顺手，Azure 就离得近。&lt;/p&gt;
&lt;p&gt;WSL2 不是一个产品，是一层战略基础设施。一家曾经把 Linux 称为"癌症"的公司，花了几年时间造出了世界上最流畅的 Linux 子系统——商业逻辑通了，一切就都说得通了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;防坑备忘&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;wsl --unregister&lt;/code&gt; 是物理级抹除！&lt;/strong&gt; 执行之后，对应的 &lt;code&gt;.vhdx&lt;/code&gt; 文件瞬间消失，没有确认提示，没有回收站，无法恢复。用之前务必先用 &lt;code&gt;wsl --export [发行版名] [备份文件.tar]&lt;/code&gt; 做备份。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;.vhdx 会悄悄膨胀。&lt;/strong&gt; Linux 里释放的磁盘空间不会自动归还给 Windows。长期用 WSL 的机器，定期跑一次 &lt;code&gt;diskpart compact vdisk&lt;/code&gt;，不然某一天你会突然发现 C 盘满了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;文件放在哪影响性能。&lt;/strong&gt; 在 WSL2 里，需要频繁操作的文件应该放在 Linux 文件系统（&lt;code&gt;~/&lt;/code&gt; 下），访问 &lt;code&gt;/mnt/c/&lt;/code&gt; 的速度会慢很多。跟用户说清楚这一点，能解决大部分"WSL2 怎么这么慢"的投诉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;内核报错先更新再重装。&lt;/strong&gt; WSL2 的 Linux 内核由微软独立维护，跟装的 Ubuntu 版本无关。遇到莫名奇妙的崩溃，先跑 &lt;code&gt;wsl --update&lt;/code&gt;，别上来就重装——重装大概率解决不了内核层面的问题。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;装好 WSL2 是第一步，搞清楚它的脾气才算真的会用。&lt;/p&gt;</content><category term="Tech"></category><category term="Linux"></category><category term="WSL2"></category><category term="Windows"></category><category term="Architecture"></category><category term="SysAdmin"></category></entry><entry><title>WSL2 底层：一个虚拟机、一个文件、一个会变的 IP</title><link href="https://vincentping.com/cn/wsl2-under-the-hood.html" rel="alternate"></link><published>2026-02-27T19:20:00+08:00</published><updated>2026-02-27T19:20:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-02-27:/cn/wsl2-under-the-hood.html</id><summary type="html">&lt;p&gt;装好 WSL2 之后，用着用着就会碰到一些奇怪的问题：Linux 里删了几十 GB，Windows 磁盘纹丝不动；跨系统访问文件，速度慢得离谱；网络脚本昨天还好好的，重启 WSL 就连不上了。这些都不是 Bug，根子在 WSL2 的底层设计——一个特殊的虚拟机、一个装着整个 Linux 的文件、还有一个每次重启都会变的 IP。搞清楚这三件事，那些让人懵的问题就都说得通了。&lt;/p&gt;</summary><content type="html">&lt;p&gt;前面那篇《&lt;a href="https://vincentping.com/cn/install-a-linux-in-windows-11-in-5-minutes" target="_blank"&gt;Windows 11 下 5 分钟安装 Linux&lt;/a&gt;》介绍了怎么安装、以及怎么用起来。&lt;/p&gt;
&lt;p&gt;装好之后用着用着，我们就会碰到一些奇怪的问题。比如明明 Linux 里删了一堆文件，Windows 磁盘空间怎么没变？再比如，从 WSL2 里访问 Windows 那边的文件，速度慢得出奇？还有，网络脚本昨天还好好的，今天 &lt;code&gt;wsl --shutdown&lt;/code&gt; 一重启就连不上了？&lt;/p&gt;
&lt;p&gt;这些其实都不是 Bug，而是 WSL2 底层设计直接带来的。搞清楚它的一些设计思路，这些问题就能很容易定位解决。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;它到底是什么类型的虚拟机&lt;/h2&gt;
&lt;p&gt;我们知道，虚拟机有两种类型，一种Type 1（Bare Metal），直接在硬件上运行多种系统；另一种Type 2，则是在现有操作系统上运行虚拟机。&lt;/p&gt;
&lt;p&gt;相比Type 2， Type 1运行效率更高，适合数据中心服务器；但是Type 2 更灵活，则适合开发测试人员运行的Workstation。&lt;/p&gt;
&lt;p&gt;那Windows里的Linux算哪一种呢？&lt;/p&gt;
&lt;p&gt;乍一看，Windows是在其里面运行Linux，不能单独运行Linux，而且一般我们也是在客户端使用，好像是Type 2。但是它的运行效率确实很高，几乎就像Bare Metal上运行一样。&lt;/p&gt;
&lt;p&gt;实际的情况是，它既不是Type 1，也不是Type 2。或者说，它既有Type 1的效率，也有Type 2 的灵活性。&lt;/p&gt;
&lt;p&gt;WSL2 在 Windows 内部运行着一个&lt;strong&gt;真正的 Linux 内核&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;但这个"虚拟机"跟我们印象里的 VirtualBox、VMware 不一样。它叫 &lt;strong&gt;Utility VM（实用虚拟机）&lt;/strong&gt;，跑在微软自家的 &lt;strong&gt;Hyper-V Hypervisor&lt;/strong&gt; 之上。&lt;/p&gt;
&lt;p&gt;普通虚拟机要模拟一整套硬件：主板、BIOS、显卡驱动、存储控制器，开销很重。WSL2 的 Utility VM 把这些全跳过了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不模拟 BIOS&lt;/li&gt;
&lt;li&gt;不加载虚拟硬件驱动&lt;/li&gt;
&lt;li&gt;不预留固定内存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它只向 Linux 内核暴露真正必要的东西：CPU 时间、内存页和 I/O 通道。结果是启动很快，而且闲置时内存占用近乎为零。&lt;/p&gt;
&lt;p&gt;所以，如果非要给它分个类：&lt;strong&gt;Type 1.5&lt;/strong&gt;——Hyper-V 打底，但比普通虚拟机轻得多。&lt;/p&gt;
&lt;p&gt;这里要提醒一点：Hyper-V 其实分两层。一层是 &lt;strong&gt;Hypervisor 本体&lt;/strong&gt;，Windows 11 启动时由系统引导程序直接加载，运行在操作系统"下面"，属于 Type 1 级别——这一层一直在跑，WSL2 用的就是它。另一层是 &lt;strong&gt;Hyper-V 管理服务&lt;/strong&gt;，也就是在 services.msc 里看到的那些"Hyper-V xxx"服务，那是给 Hyper-V Manager 和传统虚拟机管理用的。WSL2 根本不走那条路，所以那些服务关着也完全正常。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;WSL1 到 WSL2 的进化历史&lt;/h2&gt;
&lt;p&gt;WSL2 为什么要这么设计？这个需要回头看看历史，我们要先看 WSL1 是怎么设计的，以及它的问题。&lt;/p&gt;
&lt;p&gt;十年前（2016年8月）推出的WSL1 的设计思路叫&lt;strong&gt;系统调用翻译&lt;/strong&gt;：当我们在里面跑 &lt;code&gt;ls&lt;/code&gt; 或者 &lt;code&gt;make&lt;/code&gt;，WSL1 会拦截这些 Linux 内核调用，实时翻译成对应的 Windows API。听起来挺聪明，但遇到真实场景就现原形了：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题一：翻译本身就是开销。&lt;/strong&gt; 每一次系统调用——读文件、创建进程、查权限——都要经过拦截、翻译、再执行这三步。这不是偶尔发生的，而是程序运行时每秒可能触发几千次的事情。累积下来，性能损耗极大。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题二：文件系统根本就不兼容。&lt;/strong&gt; Linux 用的是 ext4，基于 inode 结构；Windows 用的是 NTFS，权限模型完全不同。WSL1 要在两套完全不同的文件系统之间实时做映射，Linux 的软链接、权限位、大小写敏感——这些在 Windows 里要么没有对应概念，要么行为不一样。翻译的代价极高，翻译的结果也不总是对的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题三：有些东西根本没法翻译。&lt;/strong&gt; 这才是 WSL1 真正的死穴。容器（Docker）深度依赖 Linux 内核的 namespace 和 cgroups 机制——namespace 用来隔离进程视图，cgroups 用来限制资源占用。这两个是 Linux 内核的原生能力，Windows 上根本没有对应的东西，翻译无从下手。所以 WSL1 里，Docker 永远跑不起来。&lt;/p&gt;
&lt;p&gt;WSL2 的解法非常直接：&lt;strong&gt;不翻译了，直接塞一个真正的 Linux 内核进去。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这样一来，Linux 程序发出的系统调用直接进内核，没有任何中间层。ext4 文件系统在 VM 内部原生运行，不需要跟 NTFS 做任何映射。namespace、cgroups 都是真实存在的，Docker 自然就能跑起来。&lt;/p&gt;
&lt;p&gt;效率的提升不是"优化了一下"，而是从根本上换掉了思路。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;你的整个 Linux 就是一个文件&lt;/h2&gt;
&lt;p&gt;接下来，我们看看Linux在Windows文件系统究竟长什么样？&lt;/p&gt;
&lt;p&gt;打开文件资源管理器，导航到 &lt;code&gt;C:\Users\[用户名]\AppData\Local\wsl\&lt;/code&gt;，会看到一个用 GUID 命名的子文件夹（类似 &lt;code&gt;{445ca81a-6e98-4e8d-aa7b-da5591a61d49}&lt;/code&gt; 这样一串）。进去之后，里面有一个 &lt;code&gt;ext4.vhdx&lt;/code&gt; 文件。&lt;/p&gt;
&lt;p&gt;（以前的旧版 WSL2 用发行版名称命名这个文件夹，比如 &lt;code&gt;Ubuntu&lt;/code&gt;；新版改成 GUID 了。）&lt;/p&gt;
&lt;p&gt;&lt;img alt="Linux 在 Windows 文件系统里的样子" src="https://vincentping.com/images/20260228/linux_files_in_windows.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个 Linux 系统在 Windows 里，就是这一个文件&lt;/strong&gt;。我们安装的每个软件包、克隆的每个仓库、每一行写进去的日志——都在这里面。&lt;/p&gt;
&lt;p&gt;这里，有一个反直觉的坑要提醒大家：&lt;code&gt;.vhdx&lt;/code&gt; 是动态扩展的，数据越装越大，文件自然变大。但&lt;strong&gt;在 Linux 里删文件，&lt;code&gt;.vhdx&lt;/code&gt; 不会自动缩小&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;删了 20 GB 的依赖包？Windows 那边的磁盘占用纹丝不动。用了几个月，&lt;code&gt;.vhdx&lt;/code&gt; 膨胀到几百 GB 是常见情况，即便 Linux 里实际存的东西远没那么多。&lt;/p&gt;
&lt;p&gt;解决方案是 Windows 自带的 &lt;code&gt;diskpart&lt;/code&gt;。先关掉所有 WSL 窗口，执行 &lt;code&gt;wsl --shutdown&lt;/code&gt;，然后：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;diskpart&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vdisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;C:\Users\[用户名]\AppData\Local\wsl\{你的GUID}\ext4.vhdx&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;attach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vdisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;readonly&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;compact&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vdisk&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;detach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vdisk&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这个操作会把虚拟硬盘里的"气泡"压缩掉，把空间还给 Windows。长期维护 WSL 环境的，应该把这步定期跑一次。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;跨系统访问文件为什么这么慢&lt;/h2&gt;
&lt;p&gt;这是 WSL2 最常遇到的性能问题：在 Linux 里访问 Windows 那边的文件（比如 &lt;code&gt;/mnt/c/&lt;/code&gt; 下的内容），速度慢得离谱。重启 WSL、换个命令都没用。&lt;/p&gt;
&lt;p&gt;那反过来呢？Windows 那边通过资源管理器打开 Linux 文件（就是左侧导航栏里的那个小企鹅图标），同样慢。&lt;/p&gt;
&lt;p&gt;原因是一样的——两个方向走的是同一条通道。&lt;/p&gt;
&lt;p&gt;WSL2 同时运行着两套完全独立的文件系统：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ext4&lt;/strong&gt;，在 Linux Utility VM 内部（路径形如 &lt;code&gt;~/projects/&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NTFS&lt;/strong&gt;，在 Windows 那边（从 Linux 访问时路径是 &lt;code&gt;/mnt/c/&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不管哪个方向，只要跨越这条边界，请求都要经历：穿越 Hyper-V 虚拟化层 → 通过 &lt;strong&gt;9P 协议&lt;/strong&gt;隧道传输 → 到达对方 → 数据再原路返回。每一次文件操作都走这一圈。&lt;/p&gt;
&lt;p&gt;（9P 是一个网络文件共享协议。WSL2 内部运行着一个 9P 服务器，本质上是把对方的文件系统当成局域网共享来访问。）&lt;/p&gt;
&lt;p&gt;任何需要频繁读写大量小文件的操作，每次都是一次 9P 往返，穿越虚拟化层——速度慢 10 到 50 倍是正常的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结论很简单：文件放在哪里，就在哪里用。&lt;/strong&gt; 在 WSL2 里工作的文件放在 Linux 文件系统（&lt;code&gt;~/&lt;/code&gt; 下）；Windows 那边的项目就留在 NTFS 里。别让文件频繁跨边界，没有任何配置能绕过这个物理限制。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;IP 总是在变&lt;/h2&gt;
&lt;p&gt;WSL2 启动的时候，Windows 会在内部搭一个"小型虚拟局域网"：Linux 有自己的虚拟网卡，Windows 宿主机也有一张对应的虚拟网卡，两边通过这张虚拟网互相通信。这个虚拟网用的是 &lt;code&gt;172.x.x.x&lt;/code&gt; 这类私有地址段。&lt;/p&gt;
&lt;p&gt;麻烦的是，&lt;strong&gt;每次执行 &lt;code&gt;wsl --shutdown&lt;/code&gt; 重启 WSL2，这个虚拟局域网就会重建一次，IP 地址重新分配&lt;/strong&gt;。上次是 &lt;code&gt;172.28.80.1&lt;/code&gt;，下次可能就变成 &lt;code&gt;172.19.32.1&lt;/code&gt; 了。&lt;/p&gt;
&lt;p&gt;这带来两个完全不同的问题，分开说：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从 Windows 连 Linux 服务&lt;/strong&gt;：比如在 Linux 里跑了一个 Web 服务，想从 Windows 的浏览器打开——不用管 IP，直接用 &lt;code&gt;localhost&lt;/code&gt; 就行。微软已经在 Windows 侧做了自动转发，这个方向不用操心。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从 Linux 连 Windows 服务&lt;/strong&gt;：这个方向就麻烦了。比如脚本需要调用 Windows 那边的某个接口，或者连 Windows 本机的数据库——Linux 必须知道 Windows 宿主机当前的 IP 才能过去。&lt;/p&gt;
&lt;p&gt;而这个 IP，正是那个每次重启都会变的地址。&lt;/p&gt;
&lt;p&gt;好在 WSL2 每次启动时，会自动把 Windows 宿主机当前的虚拟 IP 写进 Linux 的一个配置文件里——&lt;code&gt;/etc/resolv.conf&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;/etc/resolv.conf
&lt;span class="c1"&gt;# nameserver 172.28.80.1  ← 这就是此刻 Windows 宿主机的 IP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;所以，任何需要在 Linux 里回连 Windows 的脚本，都应该&lt;strong&gt;动态读取这个文件里的地址&lt;/strong&gt;，而不是把某个 IP 写死在脚本里。写死了，下次重启就静默失效，不会有任何报错提示，只会让人一头雾水地排查半天。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;防止 WSL2 把内存吃完&lt;/h2&gt;
&lt;p&gt;接下来，我们来说说 Linux 的资源占用如何配置。默认情况下，WSL2 可以吃掉最多 50% 的系统内存和全部 CPU 核心。在 32 GB 的机器上跑大项目时，这会明显挤压 Windows 侧的应用。&lt;/p&gt;
&lt;p&gt;怎么配置呢？现在 Windows 已经自带了一个图形界面工具 &lt;strong&gt;WSL Settings&lt;/strong&gt;，直接搜索打开，内存、CPU 核心数、swap 大小一目了然，改完点保存就行。&lt;/p&gt;
&lt;p&gt;&lt;img alt="WSL Settings 界面" src="https://vincentping.com/images/20260228/wsl_settings.png"&gt;&lt;/p&gt;
&lt;p&gt;如果喜欢手动改，也可以直接编辑 &lt;code&gt;C:\Users\[用户名]\&lt;/code&gt; 下的 &lt;code&gt;.wslconfig&lt;/code&gt; 文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[wsl2]&lt;/span&gt;
&lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;8GB&lt;/span&gt;
&lt;span class="na"&gt;processors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;4&lt;/span&gt;
&lt;span class="na"&gt;swap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2GB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;两种方式效果一样。改完执行 &lt;code&gt;wsl --shutdown&lt;/code&gt; 重启，即刻生效。这样就能把 Linux 占用资源设定一个限制，不会无限膨胀。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;微软为什么要造这个东西&lt;/h2&gt;
&lt;p&gt;最后，有的朋友可能会好奇，微软为啥要专门费劲弄个 WSL2 呢？他们不怕 Linux 影响他们的生意吗？&lt;/p&gt;
&lt;p&gt;其实，他们背后有几条很清晰的商业逻辑。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一条：抢回开发者。&lt;/strong&gt; 2010 到 2018 年间，大量开发者从 Windows 转向 MacBook，原因很简单——macOS 原生支持 Unix 工具链，Windows 开发者要跟 Cygwin、路径转义、权限不兼容死磕。微软意识到，得开发者者得生态。WSL2 是反击：让 Windows 变成开发者愿意用的平台。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二条：云的线下前哨。&lt;/strong&gt; 所有主流云平台底层都是 Linux。开发者在本地用 WSL2 练熟了 Ubuntu——学了 shell、apt、systemd——这些技能直接平移到云端。当他们需要上云时，阻力最小的路自然通向 Azure。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三条：容器化时代的必要条件。&lt;/strong&gt; Docker、Kubernetes 需要真正的 Linux 内核。没有 WSL2，Windows 上的 Docker Desktop 就要用一个笨重得多的独立 VM。WSL2 让容器在 Windows 上变得好用，Docker 用得顺手，Azure 就离得近。&lt;/p&gt;
&lt;p&gt;WSL2 不是一个产品，是一层战略基础设施。一家曾经把 Linux 称为"癌症"的公司，花了几年时间造出了世界上最流畅的 Linux 子系统——商业逻辑通了，一切就都说得通了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;防坑备忘&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;wsl --unregister&lt;/code&gt; 是物理级抹除！&lt;/strong&gt; 执行之后，对应的 &lt;code&gt;.vhdx&lt;/code&gt; 文件瞬间消失，没有确认提示，没有回收站，无法恢复。用之前务必先用 &lt;code&gt;wsl --export [发行版名] [备份文件.tar]&lt;/code&gt; 做备份。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;.vhdx 会悄悄膨胀。&lt;/strong&gt; Linux 里释放的磁盘空间不会自动归还给 Windows。长期用 WSL 的机器，定期跑一次 &lt;code&gt;diskpart compact vdisk&lt;/code&gt;，不然某一天你会突然发现 C 盘满了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;文件放在哪影响性能。&lt;/strong&gt; 在 WSL2 里，需要频繁操作的文件应该放在 Linux 文件系统（&lt;code&gt;~/&lt;/code&gt; 下），访问 &lt;code&gt;/mnt/c/&lt;/code&gt; 的速度会慢很多。跟用户说清楚这一点，能解决大部分"WSL2 怎么这么慢"的投诉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;内核报错先更新再重装。&lt;/strong&gt; WSL2 的 Linux 内核由微软独立维护，跟装的 Ubuntu 版本无关。遇到莫名奇妙的崩溃，先跑 &lt;code&gt;wsl --update&lt;/code&gt;，别上来就重装——重装大概率解决不了内核层面的问题。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;装好 WSL2 是第一步，搞清楚它的脾气才算真的会用。&lt;/p&gt;</content><category term="Tech"></category><category term="Linux"></category><category term="WSL2"></category><category term="Windows"></category><category term="Architecture"></category><category term="SysAdmin"></category></entry><entry><title>Install Linux on Windows 11 in 5 Minutes</title><link href="https://vincentping.com/en/install-a-linux-in-windows-11-in-5-minutes.html" rel="alternate"></link><published>2026-02-26T16:10:00+08:00</published><updated>2026-02-26T16:10:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-02-26:/en/install-a-linux-in-windows-11-in-5-minutes.html</id><summary type="html">&lt;p&gt;A practical guide to building a native Linux environment on Windows 11 using WSL2, bypassing the resource overhead of traditional virtual machines. Covers enabling BIOS virtualization, one-command deployment with &lt;code&gt;wsl --install&lt;/code&gt;, file system mapping, and a warning about the irreversible data erasure caused by &lt;code&gt;--unregister&lt;/code&gt;.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I recently started training for the CompTIA A+ certification at Per Scholas. Core 2 covers a substantial amount of Linux-specific content.&lt;/p&gt;
&lt;p&gt;To get more comfortable with Linux — especially command-line operations — I needed a Linux system to practice on. Since my machine runs Windows 11 Pro, my first instinct was to set up a virtual machine using VirtualBox or VMware. But that approach demands a lot of system resources. After some back-and-forth with AI, I discovered that modern Windows ships with &lt;strong&gt;WSL2 (Windows Subsystem for Linux 2)&lt;/strong&gt; built in. Once installed, you can launch a Linux system directly inside Windows.&lt;/p&gt;
&lt;h2&gt;Quick Installation&lt;/h2&gt;
&lt;p&gt;No fluff — let's get started.&lt;/p&gt;
&lt;p&gt;Run CMD as Administrator on Windows, open the command line, and enter the following command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --install&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After pressing Enter, Windows will begin downloading the default Linux distribution — Ubuntu. Once the download finishes, installation starts automatically. You'll then be prompted to create a user account (the default username matches your current Windows username) and set a password. Note: password input is invisible — just type and press Enter. You'll be asked to confirm it once more.&lt;/p&gt;
&lt;div style="text-align: center; margin: 20px 0;"&gt;
  &lt;video controls width="100%" 
         poster="https://vincentping.com/images/20260226/01_wsl_install.png" 
         style="max-width: 850px; border: 1px solid #e0e0e0; border-radius: 8px; box-shadow: 0 4px 10px rgba(0,0,0,0.1);"&gt;
    &lt;source src="https://vincentping.com/images/20260226/wsl_install.mp4" type="video/mp4"&gt;
    Your browser doesn't support HTML5 video playing. You could &lt;a href="https://vincentping.com/images/20260226/wsl_install.mp4"&gt;download the video&lt;/a&gt; to watch。
  &lt;/video&gt;
  &lt;p style="font-size: 0.9em; color: #666; margin-top: 8px;"&gt;Install Linux with &lt;code&gt;wsl --install&lt;/code&gt; command in Windows&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Once everything completes successfully, congratulations — you now have a Linux/Ubuntu system inside Windows, natively.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;WSL2 is supported on all Windows 11 editions (Home, Pro, and Enterprise). For Windows 10, make sure your build is &lt;strong&gt;2004 (Build 19041)&lt;/strong&gt; or later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WSL2 relies on hardware virtualization. If installation keeps failing, check whether hardware virtualization is enabled.
   Open &lt;strong&gt;Task Manager&lt;/strong&gt;, click the &lt;strong&gt;Performance&lt;/strong&gt; tab, and select &lt;strong&gt;CPU&lt;/strong&gt;. Look for &lt;strong&gt;Virtualization&lt;/strong&gt; in the lower-right corner to see whether it's enabled.
   &lt;img alt="Check Virtualization" src="https://vincentping.com/images/20260226/02_taskmanager.png" style="border: 0px solid #000000;"&gt;
   If Virtualization shows as &lt;strong&gt;Disabled&lt;/strong&gt;, restart your computer and repeatedly press &lt;code&gt;F2&lt;/code&gt; or &lt;code&gt;Del&lt;/code&gt; to enter &lt;strong&gt;BIOS/UEFI&lt;/strong&gt; settings. Locate the &lt;code&gt;Intel VT-x&lt;/code&gt; or &lt;code&gt;AMD-V&lt;/code&gt; option and set it to &lt;code&gt;Enabled&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If nothing happens after installation completes, try restarting Windows.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Basic Usage&lt;/h2&gt;
&lt;p&gt;Once installation is done and Windows has restarted, open &lt;strong&gt;File Explorer&lt;/strong&gt;. At the very bottom of the left navigation panel, you'll be pleasantly surprised to find a &lt;strong&gt;Linux penguin icon&lt;/strong&gt;. Click it to see a list of your installed Linux distributions. If you followed the command above, you'll see an Ubuntu directory.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Linux in File Explorer" src="https://vincentping.com/images/20260226/03_linux_in_explorer.png" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;Click that directory and you're taken straight to the root of your Ubuntu filesystem. You can drag files from your Windows desktop into it, or pull files out from Ubuntu back to Windows. This drag-and-drop file exchange is more convenient than anything a traditional virtual machine offers.&lt;/p&gt;
&lt;p&gt;Another change shows up in the CMD terminal. In the dropdown next to the title bar, you'll now see an &lt;strong&gt;Ubuntu&lt;/strong&gt; option. Click it and a new tab opens running Ubuntu directly — extremely convenient.&lt;/p&gt;
&lt;p&gt;&lt;img alt="CMD Droplist" src="https://vincentping.com/images/20260226/04_cmd_droplist.png" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;There are other ways to launch Linux/Ubuntu as well — for example, press &lt;code&gt;Ctrl+R&lt;/code&gt;, type &lt;code&gt;wsl&lt;/code&gt;, and hit Enter. Or simply type &lt;code&gt;wsl&lt;/code&gt; in CMD and press Enter.&lt;/p&gt;
&lt;p&gt;Launching Linux/Ubuntu this way is fast — nearly as instant as opening any Windows app — and uses very little resources. Traditional virtual machines simply can't compare.&lt;/p&gt;
&lt;p&gt;To exit Linux and return to Windows, just type &lt;code&gt;exit&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Other WSL Commands&lt;/h2&gt;
&lt;p&gt;We used &lt;code&gt;wsl --install&lt;/code&gt; to install Ubuntu, but there are other WSL options worth knowing.
(&lt;strong&gt;The following commands are run in Windows CMD — not inside Linux.&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --list&lt;/code&gt;: Lists all currently installed Linux distributions.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --list --online&lt;/code&gt;: Lists all Linux distributions available for download from Microsoft.&lt;/p&gt;
&lt;p&gt;To install a different Linux distribution (e.g., Kali Linux):
&lt;code&gt;wsl --install --Kali-linux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If you have multiple distributions installed, launch a specific one by name:
&lt;code&gt;wsl -d Kali-linux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --status&lt;/code&gt;: Displays current WSL status information.&lt;/p&gt;
&lt;p&gt;To remove a Linux distribution (e.g., Kali Linux):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --unregister Kali-linux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is a &lt;strong&gt;physical-level wipe!&lt;/strong&gt; Once executed, the corresponding Linux folder and all its data vanish instantly with no recovery possible. BACKUP your DATA!&lt;/p&gt;
&lt;h2&gt;Additional Tips&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;After closing all Linux windows, Linux is still running in the background on standby. To fully release those resources, run:
   &lt;code&gt;wsl --shutdown&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you get an error on startup one day, don't rush to uninstall. Try this command first:
   &lt;code&gt;wsl --update&lt;/code&gt;
   It works like a phone OS update — automatically fetching the latest Linux kernel patches from the cloud.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Desktop Shortcut&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create a desktop shortcut that launches Linux with a single click, right-click the desktop and select &lt;strong&gt;New → Shortcut&lt;/strong&gt;. Set the target to &lt;code&gt;wsl -d Ubuntu&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To use the Ubuntu icon for the shortcut, right-click it → &lt;strong&gt;Properties&lt;/strong&gt; → &lt;strong&gt;Change Icon&lt;/strong&gt;, then navigate to &lt;code&gt;C:\Users\[YourUsername]\AppData\Local\wsl\&lt;/code&gt; and select the native Ubuntu icon.&lt;/p&gt;</content><category term="Tech"></category><category term="Linux"></category><category term="WSL2"></category><category term="Windows"></category></entry><entry><title>Install Linux on Windows 11 in 5 Minutes</title><link href="https://vincentping.com/en/install-a-linux-in-windows-11-in-5-minutes.html" rel="alternate"></link><published>2026-02-26T16:10:00+08:00</published><updated>2026-02-26T16:10:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-02-26:/en/install-a-linux-in-windows-11-in-5-minutes.html</id><summary type="html">&lt;p&gt;A practical guide to building a native Linux environment on Windows 11 using WSL2, bypassing the resource overhead of traditional virtual machines. Covers enabling BIOS virtualization, one-command deployment with &lt;code&gt;wsl --install&lt;/code&gt;, file system mapping, and a warning about the irreversible data erasure caused by &lt;code&gt;--unregister&lt;/code&gt;.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I recently started training for the CompTIA A+ certification at Per Scholas. Core 2 covers a substantial amount of Linux-specific content.&lt;/p&gt;
&lt;p&gt;To get more comfortable with Linux — especially command-line operations — I needed a Linux system to practice on. Since my machine runs Windows 11 Pro, my first instinct was to set up a virtual machine using VirtualBox or VMware. But that approach demands a lot of system resources. After some back-and-forth with AI, I discovered that modern Windows ships with &lt;strong&gt;WSL2 (Windows Subsystem for Linux 2)&lt;/strong&gt; built in. Once installed, you can launch a Linux system directly inside Windows.&lt;/p&gt;
&lt;h2&gt;Quick Installation&lt;/h2&gt;
&lt;p&gt;No fluff — let's get started.&lt;/p&gt;
&lt;p&gt;Run CMD as Administrator on Windows, open the command line, and enter the following command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --install&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After pressing Enter, Windows will begin downloading the default Linux distribution — Ubuntu. Once the download finishes, installation starts automatically. You'll then be prompted to create a user account (the default username matches your current Windows username) and set a password. Note: password input is invisible — just type and press Enter. You'll be asked to confirm it once more.&lt;/p&gt;
&lt;div style="text-align: center; margin: 20px 0;"&gt;
  &lt;video controls width="100%" 
         poster="https://vincentping.com/images/20260226/01_wsl_install.png" 
         style="max-width: 850px; border: 1px solid #e0e0e0; border-radius: 8px; box-shadow: 0 4px 10px rgba(0,0,0,0.1);"&gt;
    &lt;source src="https://vincentping.com/images/20260226/wsl_install.mp4" type="video/mp4"&gt;
    Your browser doesn't support HTML5 video playing. You could &lt;a href="https://vincentping.com/images/20260226/wsl_install.mp4"&gt;download the video&lt;/a&gt; to watch。
  &lt;/video&gt;
  &lt;p style="font-size: 0.9em; color: #666; margin-top: 8px;"&gt;Install Linux with &lt;code&gt;wsl --install&lt;/code&gt; command in Windows&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Once everything completes successfully, congratulations — you now have a Linux/Ubuntu system inside Windows, natively.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;WSL2 is supported on all Windows 11 editions (Home, Pro, and Enterprise). For Windows 10, make sure your build is &lt;strong&gt;2004 (Build 19041)&lt;/strong&gt; or later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WSL2 relies on hardware virtualization. If installation keeps failing, check whether hardware virtualization is enabled.
   Open &lt;strong&gt;Task Manager&lt;/strong&gt;, click the &lt;strong&gt;Performance&lt;/strong&gt; tab, and select &lt;strong&gt;CPU&lt;/strong&gt;. Look for &lt;strong&gt;Virtualization&lt;/strong&gt; in the lower-right corner to see whether it's enabled.
   &lt;img alt="Check Virtualization" src="https://vincentping.com/images/20260226/02_taskmanager.png" style="border: 0px solid #000000;"&gt;
   If Virtualization shows as &lt;strong&gt;Disabled&lt;/strong&gt;, restart your computer and repeatedly press &lt;code&gt;F2&lt;/code&gt; or &lt;code&gt;Del&lt;/code&gt; to enter &lt;strong&gt;BIOS/UEFI&lt;/strong&gt; settings. Locate the &lt;code&gt;Intel VT-x&lt;/code&gt; or &lt;code&gt;AMD-V&lt;/code&gt; option and set it to &lt;code&gt;Enabled&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If nothing happens after installation completes, try restarting Windows.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Basic Usage&lt;/h2&gt;
&lt;p&gt;Once installation is done and Windows has restarted, open &lt;strong&gt;File Explorer&lt;/strong&gt;. At the very bottom of the left navigation panel, you'll be pleasantly surprised to find a &lt;strong&gt;Linux penguin icon&lt;/strong&gt;. Click it to see a list of your installed Linux distributions. If you followed the command above, you'll see an Ubuntu directory.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Linux in File Explorer" src="https://vincentping.com/images/20260226/03_linux_in_explorer.png" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;Click that directory and you're taken straight to the root of your Ubuntu filesystem. You can drag files from your Windows desktop into it, or pull files out from Ubuntu back to Windows. This drag-and-drop file exchange is more convenient than anything a traditional virtual machine offers.&lt;/p&gt;
&lt;p&gt;Another change shows up in the CMD terminal. In the dropdown next to the title bar, you'll now see an &lt;strong&gt;Ubuntu&lt;/strong&gt; option. Click it and a new tab opens running Ubuntu directly — extremely convenient.&lt;/p&gt;
&lt;p&gt;&lt;img alt="CMD Droplist" src="https://vincentping.com/images/20260226/04_cmd_droplist.png" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;There are other ways to launch Linux/Ubuntu as well — for example, press &lt;code&gt;Ctrl+R&lt;/code&gt;, type &lt;code&gt;wsl&lt;/code&gt;, and hit Enter. Or simply type &lt;code&gt;wsl&lt;/code&gt; in CMD and press Enter.&lt;/p&gt;
&lt;p&gt;Launching Linux/Ubuntu this way is fast — nearly as instant as opening any Windows app — and uses very little resources. Traditional virtual machines simply can't compare.&lt;/p&gt;
&lt;p&gt;To exit Linux and return to Windows, just type &lt;code&gt;exit&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Other WSL Commands&lt;/h2&gt;
&lt;p&gt;We used &lt;code&gt;wsl --install&lt;/code&gt; to install Ubuntu, but there are other WSL options worth knowing.
(&lt;strong&gt;The following commands are run in Windows CMD — not inside Linux.&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --list&lt;/code&gt;: Lists all currently installed Linux distributions.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --list --online&lt;/code&gt;: Lists all Linux distributions available for download from Microsoft.&lt;/p&gt;
&lt;p&gt;To install a different Linux distribution (e.g., Kali Linux):
&lt;code&gt;wsl --install --Kali-linux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If you have multiple distributions installed, launch a specific one by name:
&lt;code&gt;wsl -d Kali-linux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --status&lt;/code&gt;: Displays current WSL status information.&lt;/p&gt;
&lt;p&gt;To remove a Linux distribution (e.g., Kali Linux):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --unregister Kali-linux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is a &lt;strong&gt;physical-level wipe!&lt;/strong&gt; Once executed, the corresponding Linux folder and all its data vanish instantly with no recovery possible. BACKUP your DATA!&lt;/p&gt;
&lt;h2&gt;Additional Tips&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;After closing all Linux windows, Linux is still running in the background on standby. To fully release those resources, run:
   &lt;code&gt;wsl --shutdown&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you get an error on startup one day, don't rush to uninstall. Try this command first:
   &lt;code&gt;wsl --update&lt;/code&gt;
   It works like a phone OS update — automatically fetching the latest Linux kernel patches from the cloud.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Desktop Shortcut&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create a desktop shortcut that launches Linux with a single click, right-click the desktop and select &lt;strong&gt;New → Shortcut&lt;/strong&gt;. Set the target to &lt;code&gt;wsl -d Ubuntu&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To use the Ubuntu icon for the shortcut, right-click it → &lt;strong&gt;Properties&lt;/strong&gt; → &lt;strong&gt;Change Icon&lt;/strong&gt;, then navigate to &lt;code&gt;C:\Users\[YourUsername]\AppData\Local\wsl\&lt;/code&gt; and select the native Ubuntu icon.&lt;/p&gt;</content><category term="Tech"></category><category term="Linux"></category><category term="WSL2"></category><category term="Windows"></category></entry><entry><title>Windows 11 下 5 分钟安装 Linux</title><link href="https://vincentping.com/cn/install-a-linux-in-windows-11-in-5-minutes.html" rel="alternate"></link><published>2026-02-26T15:30:00+08:00</published><updated>2026-02-26T15:30:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-02-26:/cn/install-a-linux-in-windows-11-in-5-minutes.html</id><summary type="html">&lt;p&gt;详解利用 WSL2 在 Windows 11 下构建原生 Linux 环境的实战流程，避开资源繁重的传统虚拟机。 涵盖 BIOS 虚拟化开启、wsl --install 一键部署及文件系统映射机制，并预警 --unregister 彻底抹除数据的风险。&lt;/p&gt;</summary><content type="html">&lt;p&gt;最近在 Per Scholas 参加 CompTIA A+ 认证的培训，Core 2 的内容有很多专门关于 Linux 的内容。&lt;/p&gt;
&lt;p&gt;为了更好的熟悉 Linux 系统，尤其是命令行下各种 Command 的操作，需要有一个 Linux 的系统。因为我的电脑是 Windows 11 Pro，所以我首先想到的是安装虚拟机，使用VirtualBox/VMWare，但是这种方式对资源的要求很高。经过一番和AI的交流，发现现在的 Windows 里面已经自带一个 &lt;strong&gt;WSL2 (Windows Subsystem for Linux 2)&lt;/strong&gt;，一旦安装，就相当于 Windows 内部可以直接启动 Linux 系统。&lt;/p&gt;
&lt;h2&gt;快速安装&lt;/h2&gt;
&lt;p&gt;废话少说，直接开始。&lt;/p&gt;
&lt;p&gt;在 Windows 下以 Admininstrator 权限运行CMD，打开命令行，然后输入以下命令：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --install&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;输入命令回车后，Windows 就开始下载缺省的 Linux 版本—— Ubuntu，下载完成就是安装，安装好后，需要你设置一个用户，缺省就用户名是当前的 Windows 用户名，需要输入密码（注意：这里输入密码不会显示任何内容，输入后回车即可，有重新输入确认环节）。&lt;/p&gt;
&lt;div style="text-align: center; margin: 20px 0;"&gt;
  &lt;video controls width="100%" 
         poster="https://vincentping.com/images/20260226/01_wsl_install.png" 
         style="max-width: 850px; border: 1px solid #e0e0e0; border-radius: 8px; box-shadow: 0 4px 10px rgba(0,0,0,0.1);"&gt;
    &lt;source src="https://vincentping.com/images/20260226/wsl_install.mp4" type="video/mp4"&gt;
    您的浏览器不支持 HTML5 视频播放。您可以&lt;a href="https://vincentping.com/images/20260226/wsl_install.mp4"&gt;点击此处下载视频&lt;/a&gt;查看。
  &lt;/video&gt;
  &lt;p style="font-size: 0.9em; color: #666; margin-top: 8px;"&gt;演示：使用 &lt;code&gt;wsl --install&lt;/code&gt; 命令安装Linux系统&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;当以上一切顺利完成，恭喜你，你已经拥有了一个 Linux/Ubuntu 系统。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Window 11 系统无论是Home，Pro还是Enterprise版本都支持 WSL2，对于 Windows 10，需要确保版本好是在 &lt;strong&gt;2004 (Build 19041)&lt;/strong&gt; 以上。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WSL2 依赖于硬件虚拟化，如果一直安装不成功，可以查看硬件虚拟化是否启用。
   我们可以打开 &lt;strong&gt;任务管理器&lt;/strong&gt;，点击 &lt;strong&gt;性能 (Performance)&lt;/strong&gt; 选项卡，选中 &lt;strong&gt;CPU&lt;/strong&gt;。 在右下角找到 &lt;strong&gt;虚拟化 (Virtualization)&lt;/strong&gt; 查看是否启用。
   &lt;img alt="Check Virtualization" src="https://vincentping.com/images/20260226/02_taskmanager.png" style="border: 0px solid #000000;"&gt;
   如果虚拟化是 &lt;strong&gt;已禁用 (Disabled)&lt;/strong&gt; 的状态，则需要重启电脑，反复按下 &lt;code&gt;F2&lt;/code&gt; 或 &lt;code&gt;Del&lt;/code&gt; 键进入 &lt;strong&gt;BIOS/UEFI&lt;/strong&gt; 设置，找到 &lt;code&gt;Intel VT-x&lt;/code&gt; 或 &lt;code&gt;AMD-V&lt;/code&gt; 选项并将其设为 &lt;code&gt;Enabled&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有时候安装好后没有反应，这个时候重启 Windows 系统试试。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;基本使用&lt;/h2&gt;
&lt;p&gt;当安装成功并重启 Windows 系统后，打开你平时找文档的“文件资源管理器”，在左侧导航栏的底端，你会惊喜的发现有一个 &lt;strong&gt;Linux 小企鹅图标&lt;/strong&gt;。 点击它，下面会列出你安装的Linux版本，如果你按照上面的命令安装，现在就有一个Ubuntu的目录。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Linux in File Explorer" src="https://vincentping.com/images/20260226/03_linux_in_explorer.png" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;点击这个目录，你就直接进到了 Ubuntu 系统的根目录。你可以直接把桌面的文档拖进去，或者把 Ubuntu 里的日志拖出来。这种“拖拽式”的文件互传，比任何虚拟机都要方便。&lt;/p&gt;
&lt;p&gt;另一个变化是 CMD 命令行工具界面的变化。在工具标题栏边的下拉选项中，会出现 &lt;code&gt;Ubuntu&lt;/code&gt; 的选项，直接点击该选项，命令行工具就会新开一个TAb，直接运行 Ubuntu，非常方便。&lt;/p&gt;
&lt;p&gt;&lt;img alt="CMD Droplist" src="https://vincentping.com/images/20260226/04_cmd_droplist.png" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;当然，启动 Linux/Ubuntu 还有其他方式，比如直接CTRL+R，然后输入 wsl 回车即可。又或者在 CMD 输入 wsl 回车。&lt;/p&gt;
&lt;p&gt;这种方式启用 Linux/Ubuntu 速度很快，几乎就是打开一个 Windows 应用一样，而且占用资源极少，虚拟机方式安装完全无法相比。&lt;/p&gt;
&lt;p&gt;如果想离开 Linux 回到 Windows，直接输入 &lt;code&gt;exit&lt;/code&gt; 即可。&lt;/p&gt;
&lt;h2&gt;其他 wsl 命令&lt;/h2&gt;
&lt;p&gt;我们刚才使用 &lt;code&gt;wsl --install&lt;/code&gt; 安装 Ubuntu，wsl 命令还有其他选项需要了解：
（&lt;strong&gt;下面 wsl 相关命令是在Windows的CMD命令行运行，不是在Linux里运行&lt;/strong&gt;）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --list&lt;/code&gt;：这个命令会列出当前安装的 Linux 版本。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --list --online&lt;/code&gt;：这个命令会列出 Microsoft 提供下载的各种 Linux 版本。&lt;/p&gt;
&lt;p&gt;如果你想安装其他版本的Linux（比如 Kali-linux ），你可以使用下面命令：
&lt;code&gt;wsl --install --Kali-linux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果你装了多个 Linux，可以使用指定名称进入：
&lt;code&gt;wsl -d Kali-linux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --status&lt;/code&gt;：当前 wsl的 状态信息。&lt;/p&gt;
&lt;p&gt;如果你想删除某个 Linux 版本（比如 Kali-linux ），使用下面命令：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --unregister Kali-linux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这是“物理级”的抹除！一旦执行，对应的 Linux 文件夹和数据会瞬间消失！&lt;/p&gt;
&lt;h2&gt;其他技巧&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;当你关闭了所有的 Linux 窗口后，其实Linux 还在后台“待命”。如果你想彻底释放资源，要使用下面命令：
   &lt;code&gt;wsl --shutdown&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果某天启动报错，先别急着卸载。试试这行命令：
   &lt;code&gt;wsl --update&lt;/code&gt;
   它会像手机更新系统一样，自动从云端抓取最新的 Linux 内核补丁。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;桌面快捷方式
   如果想在桌面创建一个Linux的快捷方式，一键启动。可以在桌面新建“快捷方式”，目标输入 &lt;code&gt;wsl -d Ubuntu&lt;/code&gt;即可。
   如果想将该快捷图标改成Ubuntu的图标，可以点击右键，进入属性 -&amp;gt; 更改图标，然后定位到 &lt;code&gt;C:\Users\[用户名]\AppData\Local\wsl\&lt;/code&gt; 目录，选定 Ubuntu 原生图标。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content><category term="Tech"></category><category term="Linux"></category><category term="WSL2"></category><category term="Windows"></category></entry><entry><title>Windows 11 下 5 分钟安装 Linux</title><link href="https://vincentping.com/cn/install-a-linux-in-windows-11-in-5-minutes.html" rel="alternate"></link><published>2026-02-26T15:30:00+08:00</published><updated>2026-02-26T15:30:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-02-26:/cn/install-a-linux-in-windows-11-in-5-minutes.html</id><summary type="html">&lt;p&gt;详解利用 WSL2 在 Windows 11 下构建原生 Linux 环境的实战流程，避开资源繁重的传统虚拟机。 涵盖 BIOS 虚拟化开启、wsl --install 一键部署及文件系统映射机制，并预警 --unregister 彻底抹除数据的风险。&lt;/p&gt;</summary><content type="html">&lt;p&gt;最近在 Per Scholas 参加 CompTIA A+ 认证的培训，Core 2 的内容有很多专门关于 Linux 的内容。&lt;/p&gt;
&lt;p&gt;为了更好的熟悉 Linux 系统，尤其是命令行下各种 Command 的操作，需要有一个 Linux 的系统。因为我的电脑是 Windows 11 Pro，所以我首先想到的是安装虚拟机，使用VirtualBox/VMWare，但是这种方式对资源的要求很高。经过一番和AI的交流，发现现在的 Windows 里面已经自带一个 &lt;strong&gt;WSL2 (Windows Subsystem for Linux 2)&lt;/strong&gt;，一旦安装，就相当于 Windows 内部可以直接启动 Linux 系统。&lt;/p&gt;
&lt;h2&gt;快速安装&lt;/h2&gt;
&lt;p&gt;废话少说，直接开始。&lt;/p&gt;
&lt;p&gt;在 Windows 下以 Admininstrator 权限运行CMD，打开命令行，然后输入以下命令：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --install&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;输入命令回车后，Windows 就开始下载缺省的 Linux 版本—— Ubuntu，下载完成就是安装，安装好后，需要你设置一个用户，缺省就用户名是当前的 Windows 用户名，需要输入密码（注意：这里输入密码不会显示任何内容，输入后回车即可，有重新输入确认环节）。&lt;/p&gt;
&lt;div style="text-align: center; margin: 20px 0;"&gt;
  &lt;video controls width="100%" 
         poster="https://vincentping.com/images/20260226/01_wsl_install.png" 
         style="max-width: 850px; border: 1px solid #e0e0e0; border-radius: 8px; box-shadow: 0 4px 10px rgba(0,0,0,0.1);"&gt;
    &lt;source src="https://vincentping.com/images/20260226/wsl_install.mp4" type="video/mp4"&gt;
    您的浏览器不支持 HTML5 视频播放。您可以&lt;a href="https://vincentping.com/images/20260226/wsl_install.mp4"&gt;点击此处下载视频&lt;/a&gt;查看。
  &lt;/video&gt;
  &lt;p style="font-size: 0.9em; color: #666; margin-top: 8px;"&gt;演示：使用 &lt;code&gt;wsl --install&lt;/code&gt; 命令安装Linux系统&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;当以上一切顺利完成，恭喜你，你已经拥有了一个 Linux/Ubuntu 系统。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Window 11 系统无论是Home，Pro还是Enterprise版本都支持 WSL2，对于 Windows 10，需要确保版本好是在 &lt;strong&gt;2004 (Build 19041)&lt;/strong&gt; 以上。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WSL2 依赖于硬件虚拟化，如果一直安装不成功，可以查看硬件虚拟化是否启用。
   我们可以打开 &lt;strong&gt;任务管理器&lt;/strong&gt;，点击 &lt;strong&gt;性能 (Performance)&lt;/strong&gt; 选项卡，选中 &lt;strong&gt;CPU&lt;/strong&gt;。 在右下角找到 &lt;strong&gt;虚拟化 (Virtualization)&lt;/strong&gt; 查看是否启用。
   &lt;img alt="Check Virtualization" src="https://vincentping.com/images/20260226/02_taskmanager.png" style="border: 0px solid #000000;"&gt;
   如果虚拟化是 &lt;strong&gt;已禁用 (Disabled)&lt;/strong&gt; 的状态，则需要重启电脑，反复按下 &lt;code&gt;F2&lt;/code&gt; 或 &lt;code&gt;Del&lt;/code&gt; 键进入 &lt;strong&gt;BIOS/UEFI&lt;/strong&gt; 设置，找到 &lt;code&gt;Intel VT-x&lt;/code&gt; 或 &lt;code&gt;AMD-V&lt;/code&gt; 选项并将其设为 &lt;code&gt;Enabled&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有时候安装好后没有反应，这个时候重启 Windows 系统试试。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;基本使用&lt;/h2&gt;
&lt;p&gt;当安装成功并重启 Windows 系统后，打开你平时找文档的“文件资源管理器”，在左侧导航栏的底端，你会惊喜的发现有一个 &lt;strong&gt;Linux 小企鹅图标&lt;/strong&gt;。 点击它，下面会列出你安装的Linux版本，如果你按照上面的命令安装，现在就有一个Ubuntu的目录。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Linux in File Explorer" src="https://vincentping.com/images/20260226/03_linux_in_explorer.png" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;点击这个目录，你就直接进到了 Ubuntu 系统的根目录。你可以直接把桌面的文档拖进去，或者把 Ubuntu 里的日志拖出来。这种“拖拽式”的文件互传，比任何虚拟机都要方便。&lt;/p&gt;
&lt;p&gt;另一个变化是 CMD 命令行工具界面的变化。在工具标题栏边的下拉选项中，会出现 &lt;code&gt;Ubuntu&lt;/code&gt; 的选项，直接点击该选项，命令行工具就会新开一个TAb，直接运行 Ubuntu，非常方便。&lt;/p&gt;
&lt;p&gt;&lt;img alt="CMD Droplist" src="https://vincentping.com/images/20260226/04_cmd_droplist.png" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;当然，启动 Linux/Ubuntu 还有其他方式，比如直接CTRL+R，然后输入 wsl 回车即可。又或者在 CMD 输入 wsl 回车。&lt;/p&gt;
&lt;p&gt;这种方式启用 Linux/Ubuntu 速度很快，几乎就是打开一个 Windows 应用一样，而且占用资源极少，虚拟机方式安装完全无法相比。&lt;/p&gt;
&lt;p&gt;如果想离开 Linux 回到 Windows，直接输入 &lt;code&gt;exit&lt;/code&gt; 即可。&lt;/p&gt;
&lt;h2&gt;其他 wsl 命令&lt;/h2&gt;
&lt;p&gt;我们刚才使用 &lt;code&gt;wsl --install&lt;/code&gt; 安装 Ubuntu，wsl 命令还有其他选项需要了解：
（&lt;strong&gt;下面 wsl 相关命令是在Windows的CMD命令行运行，不是在Linux里运行&lt;/strong&gt;）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --list&lt;/code&gt;：这个命令会列出当前安装的 Linux 版本。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --list --online&lt;/code&gt;：这个命令会列出 Microsoft 提供下载的各种 Linux 版本。&lt;/p&gt;
&lt;p&gt;如果你想安装其他版本的Linux（比如 Kali-linux ），你可以使用下面命令：
&lt;code&gt;wsl --install --Kali-linux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果你装了多个 Linux，可以使用指定名称进入：
&lt;code&gt;wsl -d Kali-linux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --status&lt;/code&gt;：当前 wsl的 状态信息。&lt;/p&gt;
&lt;p&gt;如果你想删除某个 Linux 版本（比如 Kali-linux ），使用下面命令：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wsl --unregister Kali-linux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这是“物理级”的抹除！一旦执行，对应的 Linux 文件夹和数据会瞬间消失！&lt;/p&gt;
&lt;h2&gt;其他技巧&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;当你关闭了所有的 Linux 窗口后，其实Linux 还在后台“待命”。如果你想彻底释放资源，要使用下面命令：
   &lt;code&gt;wsl --shutdown&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果某天启动报错，先别急着卸载。试试这行命令：
   &lt;code&gt;wsl --update&lt;/code&gt;
   它会像手机更新系统一样，自动从云端抓取最新的 Linux 内核补丁。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;桌面快捷方式
   如果想在桌面创建一个Linux的快捷方式，一键启动。可以在桌面新建“快捷方式”，目标输入 &lt;code&gt;wsl -d Ubuntu&lt;/code&gt;即可。
   如果想将该快捷图标改成Ubuntu的图标，可以点击右键，进入属性 -&amp;gt; 更改图标，然后定位到 &lt;code&gt;C:\Users\[用户名]\AppData\Local\wsl\&lt;/code&gt; 目录，选定 Ubuntu 原生图标。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content><category term="Tech"></category><category term="Linux"></category><category term="WSL2"></category><category term="Windows"></category></entry><entry><title>I Built a Study Tool While Preparing for CompTIA A+ — Now It's Open Source</title><link href="https://vincentping.com/en/built-a-study-tool-while-preparing-for-comptia-a-plus-now-open-source.html" rel="alternate"></link><published>2026-02-22T17:30:00+08:00</published><updated>2026-02-22T17:30:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-02-22:/en/built-a-study-tool-while-preparing-for-comptia-a-plus-now-open-source.html</id><summary type="html">&lt;p&gt;I was studying for CompTIA A+ when I got frustrated with reviewing wrong answers in a plain document. So I built a tool — and now it's open source.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In December 2025, I enrolled in Per Scholas' IT Support training program in Chicago, with the goal of earning both the CompTIA A+ and Google IT Support certifications by the end of March 2026.&lt;/p&gt;
&lt;p&gt;The schedule is intense — five days a week, 9am to 4pm in class, plus two to three hours of homework every evening. It's demanding, but the full-time structure keeps me fully immersed, and I can feel myself improving every single day.&lt;/p&gt;
&lt;p&gt;The coursework involves a lot of hands-on practice: labs, unit quizzes, cumulative tests, and more. These exercises don't just reinforce concepts — they simulate real-world IT scenarios that sharpen problem-solving skills.&lt;/p&gt;
&lt;p&gt;Of course, mistakes are part of the process. I needed a way to capture the questions I got wrong so I could come back and review them intentionally, not just hope I'd remember.&lt;/p&gt;
&lt;p&gt;I started by copying wrong answers into a document. It worked at first, but as the list grew, the limitations became obvious. It was passive — I could only review questions in the order I wrote them down, with no way to quiz myself interactively or filter by topic.&lt;/p&gt;
&lt;p&gt;So I built a tool. Using Python and the PySide6 framework, I put together a simple wrong-answer practice app and started entering questions one by one. That gave me the ability to draw random questions, flag ones that needed extra attention, and actually practice rather than just re-read.&lt;/p&gt;
&lt;p&gt;The tool made a real difference during my Core 1 exam prep, and I passed.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ReCall - Home Page" src="https://vincentping.com/images/20260222_main.jpg" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;For Core 2 — which covers even more ground — I kept improving it based on how I was actually using it. Here's where it stands now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multiple exam databases&lt;/strong&gt; — Core 1 and Core 2 can be managed separately, each with its own modules and chapters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Question management&lt;/strong&gt; — Add questions manually or batch-import from a Markdown file&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Two practice modes&lt;/strong&gt; — Learning mode gives instant feedback after each question; Exam Simulation is timed and graded at the end, just like the real thing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Progress tracking&lt;/strong&gt; — The home screen shows overall accuracy, per-module mastery, and automatically flags weak areas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bilingual interface&lt;/strong&gt; — English and Chinese, with light and dark themes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="ReCall - Practice Mode" src="https://vincentping.com/images/20260222_practice.jpg" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;I named it &lt;strong&gt;ReCall&lt;/strong&gt; — &lt;em&gt;Know it when it counts.&lt;/em&gt; It's now open source on GitHub, free to download and use:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/vincentping/recall"&gt;https://github.com/vincentping/recall&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Windows users can download the pre-built executable directly from the &lt;a href="https://github.com/vincentping/recall/releases"&gt;Releases&lt;/a&gt; page — no Python installation required, just unzip and run.&lt;/p&gt;
&lt;p&gt;This project will be further improved in the future, and I hope to add the following features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Richer analytics&lt;/strong&gt; — error trends, progress curves across sessions, and a clearer picture of how your mastery improves over time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI-assisted review&lt;/strong&gt; — using AI to explain weak areas in depth, or to intelligently recommend what to study next based on your performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you're preparing for an IT certification — or just need a better way to practice what you're getting wrong — feel free to download and try it out. If you run into any bugs or have ideas for improvement, I'd love to hear from you on &lt;a href="https://github.com/vincentping/recall/issues"&gt;GitHub Issues&lt;/a&gt;.&lt;/p&gt;</content><category term="Tech"></category><category term="IT"></category><category term="Python"></category><category term="Comptia-A+"></category></entry><entry><title>I Built a Study Tool While Preparing for CompTIA A+ — Now It's Open Source</title><link href="https://vincentping.com/en/built-a-study-tool-while-preparing-for-comptia-a-plus-now-open-source.html" rel="alternate"></link><published>2026-02-22T17:30:00+08:00</published><updated>2026-02-22T17:30:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-02-22:/en/built-a-study-tool-while-preparing-for-comptia-a-plus-now-open-source.html</id><summary type="html">&lt;p&gt;I was studying for CompTIA A+ when I got frustrated with reviewing wrong answers in a plain document. So I built a tool — and now it's open source.&lt;/p&gt;</summary><content type="html">&lt;p&gt;In December 2025, I enrolled in Per Scholas' IT Support training program in Chicago, with the goal of earning both the CompTIA A+ and Google IT Support certifications by the end of March 2026.&lt;/p&gt;
&lt;p&gt;The schedule is intense — five days a week, 9am to 4pm in class, plus two to three hours of homework every evening. It's demanding, but the full-time structure keeps me fully immersed, and I can feel myself improving every single day.&lt;/p&gt;
&lt;p&gt;The coursework involves a lot of hands-on practice: labs, unit quizzes, cumulative tests, and more. These exercises don't just reinforce concepts — they simulate real-world IT scenarios that sharpen problem-solving skills.&lt;/p&gt;
&lt;p&gt;Of course, mistakes are part of the process. I needed a way to capture the questions I got wrong so I could come back and review them intentionally, not just hope I'd remember.&lt;/p&gt;
&lt;p&gt;I started by copying wrong answers into a document. It worked at first, but as the list grew, the limitations became obvious. It was passive — I could only review questions in the order I wrote them down, with no way to quiz myself interactively or filter by topic.&lt;/p&gt;
&lt;p&gt;So I built a tool. Using Python and the PySide6 framework, I put together a simple wrong-answer practice app and started entering questions one by one. That gave me the ability to draw random questions, flag ones that needed extra attention, and actually practice rather than just re-read.&lt;/p&gt;
&lt;p&gt;The tool made a real difference during my Core 1 exam prep, and I passed.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ReCall - Home Page" src="https://vincentping.com/images/20260222_main.jpg" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;For Core 2 — which covers even more ground — I kept improving it based on how I was actually using it. Here's where it stands now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multiple exam databases&lt;/strong&gt; — Core 1 and Core 2 can be managed separately, each with its own modules and chapters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Question management&lt;/strong&gt; — Add questions manually or batch-import from a Markdown file&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Two practice modes&lt;/strong&gt; — Learning mode gives instant feedback after each question; Exam Simulation is timed and graded at the end, just like the real thing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Progress tracking&lt;/strong&gt; — The home screen shows overall accuracy, per-module mastery, and automatically flags weak areas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bilingual interface&lt;/strong&gt; — English and Chinese, with light and dark themes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="ReCall - Practice Mode" src="https://vincentping.com/images/20260222_practice.jpg" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;I named it &lt;strong&gt;ReCall&lt;/strong&gt; — &lt;em&gt;Know it when it counts.&lt;/em&gt; It's now open source on GitHub, free to download and use:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/vincentping/recall"&gt;https://github.com/vincentping/recall&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Windows users can download the pre-built executable directly from the &lt;a href="https://github.com/vincentping/recall/releases"&gt;Releases&lt;/a&gt; page — no Python installation required, just unzip and run.&lt;/p&gt;
&lt;p&gt;This project will be further improved in the future, and I hope to add the following features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Richer analytics&lt;/strong&gt; — error trends, progress curves across sessions, and a clearer picture of how your mastery improves over time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI-assisted review&lt;/strong&gt; — using AI to explain weak areas in depth, or to intelligently recommend what to study next based on your performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you're preparing for an IT certification — or just need a better way to practice what you're getting wrong — feel free to download and try it out. If you run into any bugs or have ideas for improvement, I'd love to hear from you on &lt;a href="https://github.com/vincentping/recall/issues"&gt;GitHub Issues&lt;/a&gt;.&lt;/p&gt;</content><category term="Tech"></category><category term="IT"></category><category term="Python"></category><category term="Comptia-A+"></category></entry><entry><title>备考 CompTIA A+，我用 Python 做了个错题练习工具</title><link href="https://vincentping.com/cn/built-a-study-tool-while-preparing-for-comptia-a-plus-now-open-source.html" rel="alternate"></link><published>2026-02-22T15:03:00+08:00</published><updated>2026-02-22T15:03:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-02-22:/cn/built-a-study-tool-while-preparing-for-comptia-a-plus-now-open-source.html</id><summary type="html">&lt;p&gt;备考 CompTIA A+ 期间，用文档记录错题越来越不方便，于是我用 Python 做了一个交互式的错题练习工具，现已开源。&lt;/p&gt;</summary><content type="html">&lt;p&gt;我于2025年12月参加Per Scholas在芝加哥的IT Support培训，目标是2026年3月底完成Comptia A+的认证和Google IT Support的认证。&lt;/p&gt;
&lt;p&gt;Per Scholas的学习安排非常紧张，每周5天，每天从上午9点到下午4点的上课，而且课后还有2-3小时的作业需要完成。虽然压力很大，但是这种Full Time的学习让人非常充实，每天都能感受到自己的进步。&lt;/p&gt;
&lt;p&gt;在学习中，有大量的练习，包括实验、各种单元测试、总测试等等。这些练习不仅能帮助我们记住相应的概念和知识，更能模拟各种实际工作遇到的IT问题，从而提高我们解决问题的能力。&lt;/p&gt;
&lt;p&gt;在这种练习中，出错是难免的。所以我需要一个错题本，把我在练习中出现的错误记录下来，这样后续能有针对性的复习和记忆。&lt;/p&gt;
&lt;p&gt;最初我是把错题复制到一个文档里，但随着错题整理得越来越多，这种文档记录的局限性就很明显了，这种方法只能按照文档错题记录的顺序进行被动复习和记忆。不能以交互的方式进行，而且文档归类查找也不方便。&lt;/p&gt;
&lt;p&gt;于是我就使用Python语言的Pyside6框架开发了一个简单的错题复习工具，然后再把错题一个个录入到工具里。这样我复习时，就能随机选取题目进行练习，还能标注重点复习的题目。&lt;/p&gt;
&lt;p&gt;这个工具在1月份Core 1考试期间给我很大的帮助，我顺利通过了Core 1的考试。&lt;/p&gt;
&lt;p&gt;&lt;img alt="主界面" src="https://vincentping.com/images/20260222_main.jpg" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;Comptia A+ Core 2的内容更加多，学习也非常紧张，在这个过程中，我根据自己使用的情况，抽出时间对这个工具进行了升级。目前包括的功能有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多考试管理&lt;/strong&gt;：可以创建多个独立的题库，每个题库有自己的模块和章节分类，A+ Core 1和Core 2可以分开管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;题目管理&lt;/strong&gt;：支持手动逐题录入，也支持从Markdown文件批量导入，大大提高了录题效率&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;两种练习模式&lt;/strong&gt;：学习模式下每道题可以即时查看答案和解析；考试模拟模式下限时作答，结束后统一评分，更贴近真实考试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习统计&lt;/strong&gt;：首页显示整体正确率、各模块掌握情况，自动标出薄弱环节，让复习更有针对性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中英文界面&lt;/strong&gt;：支持中英文切换，以及深色/浅色主题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="练习界面" src="https://vincentping.com/images/20260222_practice.jpg" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;这个工具我将它命名为 &lt;strong&gt;ReCall&lt;/strong&gt;——&lt;em&gt;Know it when it counts.&lt;/em&gt;，目前已在GitHub上开源，有需要的朋友可以直接下载使用：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/vincentping/recall"&gt;https://github.com/vincentping/recall&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Windows用户可以直接在 &lt;a href="https://github.com/vincentping/recall/releases"&gt;Releases&lt;/a&gt; 页面下载打包好的可执行文件，无需安装Python环境，解压即用。&lt;/p&gt;
&lt;p&gt;这个工具目今后会找时间继续完善，未来希望加入的功能包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;更丰富的统计分析&lt;/strong&gt;：比如错误趋势、每次练习的进步曲线等，让学习轨迹更清晰可见&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI辅助复习&lt;/strong&gt;：接入AI对薄弱知识点进行针对性讲解，或根据掌握情况智能推荐复习内容，进一步提高复习效率&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你也在备考各类IT认证，或者有类似整理错题、随机练习的需求，欢迎下载试用。使用过程中如果发现任何Bug，或者有功能上的改进建议，都非常欢迎在 [GitHub Issues](https://github.com/vincentping/recall/issues) 提出，感谢！&lt;/p&gt;</content><category term="Tech"></category><category term="IT"></category><category term="Python"></category><category term="Comptia-A+"></category></entry><entry><title>备考 CompTIA A+，我用 Python 做了个错题练习工具</title><link href="https://vincentping.com/cn/built-a-study-tool-while-preparing-for-comptia-a-plus-now-open-source.html" rel="alternate"></link><published>2026-02-22T15:03:00+08:00</published><updated>2026-02-22T15:03:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2026-02-22:/cn/built-a-study-tool-while-preparing-for-comptia-a-plus-now-open-source.html</id><summary type="html">&lt;p&gt;备考 CompTIA A+ 期间，用文档记录错题越来越不方便，于是我用 Python 做了一个交互式的错题练习工具，现已开源。&lt;/p&gt;</summary><content type="html">&lt;p&gt;我于2025年12月参加Per Scholas在芝加哥的IT Support培训，目标是2026年3月底完成Comptia A+的认证和Google IT Support的认证。&lt;/p&gt;
&lt;p&gt;Per Scholas的学习安排非常紧张，每周5天，每天从上午9点到下午4点的上课，而且课后还有2-3小时的作业需要完成。虽然压力很大，但是这种Full Time的学习让人非常充实，每天都能感受到自己的进步。&lt;/p&gt;
&lt;p&gt;在学习中，有大量的练习，包括实验、各种单元测试、总测试等等。这些练习不仅能帮助我们记住相应的概念和知识，更能模拟各种实际工作遇到的IT问题，从而提高我们解决问题的能力。&lt;/p&gt;
&lt;p&gt;在这种练习中，出错是难免的。所以我需要一个错题本，把我在练习中出现的错误记录下来，这样后续能有针对性的复习和记忆。&lt;/p&gt;
&lt;p&gt;最初我是把错题复制到一个文档里，但随着错题整理得越来越多，这种文档记录的局限性就很明显了，这种方法只能按照文档错题记录的顺序进行被动复习和记忆。不能以交互的方式进行，而且文档归类查找也不方便。&lt;/p&gt;
&lt;p&gt;于是我就使用Python语言的Pyside6框架开发了一个简单的错题复习工具，然后再把错题一个个录入到工具里。这样我复习时，就能随机选取题目进行练习，还能标注重点复习的题目。&lt;/p&gt;
&lt;p&gt;这个工具在1月份Core 1考试期间给我很大的帮助，我顺利通过了Core 1的考试。&lt;/p&gt;
&lt;p&gt;&lt;img alt="主界面" src="https://vincentping.com/images/20260222_main.jpg" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;Comptia A+ Core 2的内容更加多，学习也非常紧张，在这个过程中，我根据自己使用的情况，抽出时间对这个工具进行了升级。目前包括的功能有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多考试管理&lt;/strong&gt;：可以创建多个独立的题库，每个题库有自己的模块和章节分类，A+ Core 1和Core 2可以分开管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;题目管理&lt;/strong&gt;：支持手动逐题录入，也支持从Markdown文件批量导入，大大提高了录题效率&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;两种练习模式&lt;/strong&gt;：学习模式下每道题可以即时查看答案和解析；考试模拟模式下限时作答，结束后统一评分，更贴近真实考试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习统计&lt;/strong&gt;：首页显示整体正确率、各模块掌握情况，自动标出薄弱环节，让复习更有针对性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中英文界面&lt;/strong&gt;：支持中英文切换，以及深色/浅色主题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="练习界面" src="https://vincentping.com/images/20260222_practice.jpg" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;这个工具我将它命名为 &lt;strong&gt;ReCall&lt;/strong&gt;——&lt;em&gt;Know it when it counts.&lt;/em&gt;，目前已在GitHub上开源，有需要的朋友可以直接下载使用：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/vincentping/recall"&gt;https://github.com/vincentping/recall&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Windows用户可以直接在 &lt;a href="https://github.com/vincentping/recall/releases"&gt;Releases&lt;/a&gt; 页面下载打包好的可执行文件，无需安装Python环境，解压即用。&lt;/p&gt;
&lt;p&gt;这个工具目今后会找时间继续完善，未来希望加入的功能包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;更丰富的统计分析&lt;/strong&gt;：比如错误趋势、每次练习的进步曲线等，让学习轨迹更清晰可见&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI辅助复习&lt;/strong&gt;：接入AI对薄弱知识点进行针对性讲解，或根据掌握情况智能推荐复习内容，进一步提高复习效率&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你也在备考各类IT认证，或者有类似整理错题、随机练习的需求，欢迎下载试用。使用过程中如果发现任何Bug，或者有功能上的改进建议，都非常欢迎在 [GitHub Issues](https://github.com/vincentping/recall/issues) 提出，感谢！&lt;/p&gt;</content><category term="Tech"></category><category term="IT"></category><category term="Python"></category><category term="Comptia-A+"></category></entry><entry><title>龙龙读书记1：爱上植物的第一本书</title><link href="https://vincentping.com/cn/loongloong_loves_reading_01_the_first_book_to_fall_in_love_with_plants.html" rel="alternate"></link><published>2025-02-12T17:30:00+08:00</published><updated>2025-02-12T17:30:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2025-02-12:/cn/loongloong_loves_reading_01_the_first_book_to_fall_in_love_with_plants.html</id><summary type="html">&lt;p&gt;天下没有不爱阅读的孩子，关键是要找到孩子的兴趣！所以对于家长来说，培养孩子的阅读习惯，从发现孩子的兴趣开始。&lt;/p&gt;</summary><content type="html">&lt;p&gt;距离上次记录龙龙的成长，转眼已是四年光阴。龙龙从一年级起就在浦东一所民办学校就读。2024年初的寒假，因为工作原因，让我们全家踏上了去往美国芝加哥的旅程。龙龙也随之转入当地公立学校，现已读到七年级。&lt;/p&gt;
&lt;p&gt;来到这里，我们发现美国的教育方式颇为不同。这里的公立学校几乎看不到纸质教材，取而代之的是人手一台 Chrome 笔记本电脑（据说是谷歌公司捐赠，因为他们在芝加哥设有办公室）。无论是课堂学习还是课后作业，孩子们都需要用电脑完成，只有少量打印材料会带回家。&lt;/p&gt;
&lt;p&gt;在这样的环境下，孩子们每天面对屏幕的时间着实不短。对年纪小的孩子来说尤其令人担忧——即便学校的电脑设有安全限制，聪明的孩子们总能想出办法偷偷玩游戏（在谷歌上搜索"unblocked games for school"就是一个热门词条）。回到家后，不少孩子又会以做作业为由，沉迷于电脑游戏中。&lt;/p&gt;
&lt;p&gt;所幸龙龙热爱阅读的习惯在这时发挥了关键作用，让他没有过分迷恋游戏。有次我看他正在读书，好奇地问他是更喜欢读书还是玩游戏，他放下书本，歪着头思考良久后认真地回答说："还是读书吧！"这个回答让我感到欣慰。&lt;/p&gt;
&lt;p&gt;正因如此，我想分享一些龙龙从小阅读的点滴，希望能给大家培养孩子阅读习惯带来一些启发。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;在学前和小学低年级识字阶段，龙龙主要是看绘本，或是由我们读给他听。这其中我印象最深的是他一年级时与《爱上植物的第一本书》的美妙相遇。&lt;/p&gt;
&lt;p&gt;&lt;img alt="爱上植物的第一本书" src="https://vincentping.com/images/20250212_plants.jpg" style="border: 0px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;龙龙从小就对植物特别着迷，尤其钟爱花花草草。每到植物丰富的地方，他总能驻足良久，这儿看看，那儿摸摸，问题一个接一个。看着他对植物的浓厚兴趣，我们却因为知识有限，经常答不上来。&lt;/p&gt;
&lt;p&gt;正好那时在网上搜寻适合孩子的读物，我们发现了台湾作家陈婉兰的《爱上植物的第一本书》。这本书虽然讲述植物知识，作者也是植物专业出身，却能如讲故事般娓娓道来。她把介绍植物写得像是介绍一群好朋友，从初识、相知到深入了解，循序渐进。最重要的是这本书有很多彩色的植物插图，非常专业而且漂亮，正适合那个年龄段的孩子阅读。&lt;/p&gt;
&lt;p&gt;买回来后，我陪6岁多的龙龙一页一页地读，250页的一本书，我们读了近2个月才读完。记得当时龙龙特别喜欢，每天上学回来第一件事就是抱着这本书。我们忙的时候，他会自己一个人翻看那些美丽的植物图片，经常兴奋地跑来告诉我们他发现了什么新的细节。等我们闲下来，就要求我们陪他读、一遍遍地读、反复读。而且出门在外，看到各种树木、不同的叶子、花什么的，他就会像个小老师一样主动介绍他从书中学来的知识，这种劲头一直持续了大半年。&lt;/p&gt;
&lt;p&gt;这件事后，我总结出来一条：&lt;strong&gt;天下没有不爱阅读的孩子，关键是要找到孩子的兴趣！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;比如我经常碰到一些男孩子，在某个阶段会特别喜欢汽车，各种汽车牌子、标志如数家珍，这个时候如果给他找一些汽车相关的图书，配上帅气的插图，相信孩子一定喜欢。&lt;/p&gt;
&lt;p&gt;还有些孩子，会特别喜欢各种动物，那么那种配上插图的动物百科，孩子不可能不喜欢。&lt;/p&gt;
&lt;p&gt;而还有些孩子喜欢各种手工，那么我想找一些相关的设计类、手工类的书，再有特别漂亮的插图，没有孩子会不着迷的。&lt;/p&gt;
&lt;p&gt;这样的兴趣可以有很多……&lt;/p&gt;
&lt;p&gt;孩子天生都是对这个世界充满好奇的，而书籍是人类积累的最宝贵的财富，就是为了满足这些好奇心的。&lt;/p&gt;
&lt;p&gt;比如后来有一阵龙龙特别迷 Minecraft 游戏，我们没有阻拦他玩游戏，而是和他商量，只能周末做完作业后再玩，同时答应帮他找来相关的 Minecraft 的建筑书、故事书和进阶书，平时有时间也可以看。这样龙龙如获至宝，只要有时间就捧着这些书看。&lt;/p&gt;
&lt;p&gt;这里可以看出，&lt;strong&gt;孩子都是为了兴趣、为了满足好奇心去阅读的，而不是为了阅读本身而阅读&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我们家长如果抱着 "你今天怎么没有看书啊？"，或者 "你要先把这些书看了，才能玩！" 这样的想法，就糟了。这不仅不能帮助孩子爱上阅读，相反还把阅读放在孩子的对立面上！&lt;/p&gt;
&lt;p&gt;对于孩子来说，为了兴趣的阅读就是玩，甚至比玩更有吸引力！&lt;/p&gt;
&lt;p&gt;所以，对于家长来说，&lt;strong&gt;培养孩子的阅读习惯，从发现孩子的兴趣开始。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;这时，可能有朋友会问，我们家孩子没有什么兴趣怎么办？或者，孩子的兴趣不能持续又怎么办呢？&lt;/p&gt;
&lt;p&gt;那么，就请关注我的下一篇分享"龙龙读书记2：从《河西走廊》到林汉达《中国历史故事集》"。&lt;/p&gt;</content><category term="Edu"></category><category term="育儿"></category><category term="阅读"></category><category term="教育"></category></entry><entry><title>科幻故事 | 咖啡留香：一次关于意识上传的实验记录</title><link href="https://vincentping.com/cn/scifi-story-created-with-ai.html" rel="alternate"></link><published>2024-11-05T14:44:00+08:00</published><updated>2024-11-05T14:44:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2024-11-05:/cn/scifi-story-created-with-ai.html</id><summary type="html">&lt;p&gt;"意识不是被给予的，而是不断创造的。"这是李元教授生前常说的一句话。作为一名量子物理学家，他用自己最后的时光，完成了一场惊世骇俗的实验。&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="意识上传实验" src="https://vincentping.com/images/20241107_scifi.jpg" style="border: 1px solid #000000; width: 50%; align: center"&gt;&lt;/p&gt;
&lt;p&gt;死亡这种事，大概不会有人觉得好笑。&lt;/p&gt;
&lt;p&gt;但我现在就很想笑。因为躺在隔离舱里的李元，这位即将离世的天才物理学家，正在跟一个投影聊天。准确地说，是在跟自己的意识投影聊天。&lt;/p&gt;
&lt;p&gt;而更可笑的是，我们这群量子物理实验室的研究员，正襟危坐地记录着这场诡异的对话。仿佛这样就能显得自己很专业似的。&lt;/p&gt;
&lt;p&gt;"波形出现异常。"陈安的声音从实验室另一端传来。她今天穿了件李元最喜欢的红色高领毛衣。没人说破，但我们都知道这是她对老师的某种告别。&lt;/p&gt;
&lt;p&gt;我看着监测屏。李元的脑波数据像是喝醉了的醉汉，歪歪扭扭地在坐标系里游走。这是今天的第七次尝试，自从三天前李元同意这项实验起，我们已经进行了二十三次数据采集。&lt;/p&gt;
&lt;p&gt;维生舱里的营养液泛着幽蓝的光。透过钢化玻璃，能看到李元消瘦的身体。他的大脑里，那团该死的肿瘤正在以每天百分之二的速度扩张。按照PET扫描的结果，他最多还能撑两周。&lt;/p&gt;
&lt;p&gt;"继续记录。"我低头在记录本上写下时间：2041年4月15日，下午3:47。笔尖有点发抖。&lt;/p&gt;
&lt;p&gt;不知道是不是错觉，自从加入这个意识上传项目，我写字的时候总是会抖。可能是因为知道自己在做一件可能改变人类历史，也可能会被钉在耻辱柱上的事情。&lt;/p&gt;
&lt;p&gt;一个月前，当李元走进我的办公室说要参加实验时，我是拒绝的。&lt;/p&gt;
&lt;p&gt;"为什么不呢？"他笑着问我，"我快死了，张鸣。这是我最后的机会。"&lt;/p&gt;
&lt;p&gt;"但您知道之前的失败案例。"我说。&lt;/p&gt;
&lt;p&gt;他当然知道。两千多个失败案例，每一个都写进了科学伦理委员会的黑名单。媒体把这个项目称为"数字版的克隆人实验"。&lt;/p&gt;
&lt;p&gt;"所以我才来找你。"他说，"我的学生里，就你最没有科研道德。"&lt;/p&gt;
&lt;p&gt;我差点被咖啡呛死。&lt;/p&gt;
&lt;p&gt;"您别开玩笑了。"&lt;/p&gt;
&lt;p&gt;"我说真的。"他认真地看着我，"你还记得你的博士论文答辩吗？所有人都说你的实验方法太冒险，只有我支持你。因为我知道，真正的科学家，就该敢于冒险。"&lt;/p&gt;
&lt;p&gt;我记得。那篇论文差点害我丢掉博士学位。要不是李元力挺，我现在可能在快餐店煎汉堡。&lt;/p&gt;
&lt;p&gt;"陈安会反对的。"我说。这是我能想到的最后一个理由。&lt;/p&gt;
&lt;p&gt;"她已经同意了。"李元说，"而且她会全程协助实验。"&lt;/p&gt;
&lt;p&gt;我看着他布满血丝的眼睛。那里面有种令人心悸的东西，叫做希望。&lt;/p&gt;
&lt;p&gt;最终我同意了。不是因为他的说服，而是因为那副眼神。临死前还想为科学做贡献，这种精神不正是他当年教给我的吗？&lt;/p&gt;
&lt;p&gt;实验室里的气氛一如既往的压抑。每个人都在装作很忙，但我知道他们都在偷瞄那个维生舱。人类就是这样，再专业的科研人员在死亡面前也会露出八卦的本性。&lt;/p&gt;
&lt;p&gt;"张鸣，你得看看这个。"陈安指着另一块屏幕。她的手指有些发抖，这在平时是不可能的。陈安是我见过最冷静的研究员，平时就算是观测到最离奇的量子态叠加现象，她也能面不改色地做完全部记录。&lt;/p&gt;
&lt;p&gt;但现在不一样。躺在那里的是李元，是她敬爱的导师，是把她从贫民窟带到实验室的恩人。&lt;/p&gt;
&lt;p&gt;监视器上显示着李元的脑活动图谱。某些区域正以一种诡异的频率闪烁，就像是深海里的发光生物。&lt;/p&gt;
&lt;p&gt;"他在...思考？"我不确定地说。这种模式我们从未见过，它不该出现在一个脑部肿瘤患者身上。&lt;/p&gt;
&lt;p&gt;"不止是思考。"陈安放大了图像，声音里带着一丝颤抖，"看这个模式，他在重构自己的意识。"&lt;/p&gt;
&lt;p&gt;我下意识地摸了摸胸口的项链。那是李元在我博士毕业时送的，一个镶着DNA双螺旋的银坠。他说这是提醒我永远记住生命的密码。&lt;/p&gt;
&lt;p&gt;可现在，我们眼前的东西已经超出了DNA能解释的范围。&lt;/p&gt;
&lt;p&gt;"调出他的实时反馈。"我说。声音干涩得像是被真空干燥过。&lt;/p&gt;
&lt;p&gt;全息投影缓缓成形。起初只是一团模糊的光雾，渐渐地，李元的数字化身出现了。但不太对劲，他看起来像是被困在量子叠加态里，形体时而清晰时而模糊。&lt;/p&gt;
&lt;p&gt;记得上周他还在开玩笑："要是实验成功，我就是第一个能参加自己葬礼的人。"&lt;/p&gt;
&lt;p&gt;那时我们都笑了。现在想来，那笑声比哭还难听。&lt;/p&gt;
&lt;p&gt;"我能...听到你们。"李元的声音断断续续地传来，像是穿越了时空的电波，"但这里...很奇怪。我看到了...另一个自己。"&lt;/p&gt;
&lt;p&gt;陈安猛地抓住了我的手腕。她的指甲深深陷入我的皮肤，但我一点也不觉得疼。因为这是历史性的时刻——第一次，一个意识上传者在过程中保持了交流能力。&lt;/p&gt;
&lt;p&gt;"能描述一下吗？"我强迫自己用最平静的语气提问。这是科研人员的职业习惯，越是激动的时候越要表现得冷静。&lt;/p&gt;
&lt;p&gt;"我在...重新认识自己。"李元说，"就像...在重新学习如何思考。但每次我即将抓住某个记忆，它就会...变形。好像在玩一个永远赢不了的拼图游戏。"&lt;/p&gt;
&lt;p&gt;这个比喻真像李元的风格。他总是能把最复杂的概念用最简单的方式解释。这大概就是为什么他能拿到三次诺贝尔提名——虽然最后一次是在他确诊脑瘤之后。&lt;/p&gt;
&lt;p&gt;"意识完整度在下降。"陈安的声音打断了我的思绪。她松开了我的手腕，那里已经留下了五个深深的月牙形印记。&lt;/p&gt;
&lt;p&gt;"百分之八十...七十五...六十八..."数字像是生命倒计时一样不断下跌。&lt;/p&gt;
&lt;p&gt;我看了眼维生舱里的李元。他的身体很平静，仿佛只是在做一个普通的午睡。但连接他大脑的导管里，信号灯正在疯狂闪烁。&lt;/p&gt;
&lt;p&gt;如果指数降到百分之五十以下，就意味着实验失败。李元的意识会永远迷失在数据的海洋里，成为第2049个失败案例。这个数字像是诅咒一样印在每个项目成员的脑子里。&lt;/p&gt;
&lt;p&gt;"等等。"陈安突然说。她的声音里带着一种我从未听过的东西，像是惊恐，又像是狂喜。&lt;/p&gt;
&lt;p&gt;监控屏上的数据让我们目瞪口呆。李元的意识完整度确实在下降，但新的神经连接正在以一种违背物理学的速度形成。就像是一个人在坠落的同时学会了飞翔。&lt;/p&gt;
&lt;p&gt;这画面让我想起李元最后一次做实验报告。那是在他确诊后的第三天，本该躺在病床上打吗啡的人，非要穿着褪色的格子衬衫站在讲台上。&lt;/p&gt;
&lt;p&gt;"意识不是一个静态的存在，"他说，"它更像是一条永远流动的河。我们以为能复制意识，就像以为能复制一条河。但河水每时每刻都在变化，你永远无法踏入同一条河流。"&lt;/p&gt;
&lt;p&gt;当时我们都以为这是吗啡造成的副作用。现在看来，那个混蛋早就想到了这一切。&lt;/p&gt;
&lt;p&gt;"这不可能。"我喃喃自语。按照我们对人工智能的理解，意识应该是固定的、可定义的。但李元正在证明，这些理解也许都是狗屁。&lt;/p&gt;
&lt;p&gt;实验室的温度在升高。量子计算机群的散热系统发出不堪重负的呜咽。陈安脱掉了她那件红色毛衣，露出里面的白色衬衫。衬衫后背已经被汗水浸透。&lt;/p&gt;
&lt;p&gt;没人在意这些。我们都盯着全息投影中李元那分裂又融合的身影。他看起来就像是量子世界中的薛定谔猫，同时处于存在与不存在的状态。&lt;/p&gt;
&lt;p&gt;"张鸣...陈安..."李元的声音突然变得清晰，像是从迷雾中走了出来，"我明白了。我们一直在犯一个错误。"&lt;/p&gt;
&lt;p&gt;"什么错误？"&lt;/p&gt;
&lt;p&gt;这时实验室的门开了。两个政府观察员走了进来。他们穿着一模一样的黑西装，戴着一模一样的黑框眼镜，像是从同一个模子里倒出来的。&lt;/p&gt;
&lt;p&gt;我讨厌这些家伙。他们总是在最关键的时候出现，仿佛闻到了什么重大发现的味道。&lt;/p&gt;
&lt;p&gt;"我们收到能源波动警报。"其中一个说，"请解释当前状况。"&lt;/p&gt;
&lt;p&gt;去你妈的解释。我在心里骂了一句，但表面上还是保持着职业微笑："常规测试，有一些预期内的数据波动。"&lt;/p&gt;
&lt;p&gt;他们对视一眼，显然不相信。但在他们能说什么之前，李元的声音再次响起。&lt;/p&gt;
&lt;p&gt;"我们不能复制意识，因为每个意识本身就是独一无二的。我们能做的，是创造一个新的意识，一个基于原始意识但又独立存在的个体。"&lt;/p&gt;
&lt;p&gt;这话让两个观察员瞬间绷紧了身体。他们掏出记录本，开始疯狂记录。见鬼，这些混蛋总是对最危险的信息最敏感。&lt;/p&gt;
&lt;p&gt;但已经来不及阻止了。警报声突然响起，尖锐得像是来自地狱的尖叫。&lt;/p&gt;
&lt;p&gt;"服务器过载！"陈安的声音里带着恐慌，"他的数据量正在指数级增长！"&lt;/p&gt;
&lt;p&gt;我看着显示屏。李元的数字化身开始分裂，像是一滴墨水滴入水中。起初是两个，然后是四个、八个...每一个都是李元，却又都略有不同。&lt;/p&gt;
&lt;p&gt;那两个观察员疯狂地按着他们的通讯器，大概是在向上级报告。但谁在乎呢？我们正在见证的是人类历史上最伟大的时刻之一。&lt;/p&gt;
&lt;p&gt;"有趣。"李元的声音同时从几个化身中传出，像是一首诡异的交响乐，"我同时存在于多个维度，每一个都是我，但又都不完全是我。这感觉...就像是终于理解了薛定谔的猫。"&lt;/p&gt;
&lt;p&gt;即使在这种时候，这个老混蛋还在开物理学的玩笑。&lt;/p&gt;
&lt;p&gt;维生舱里，李元的身体突然抽搐了一下。监测仪上的生命体征开始波动，像是一张被揉皱的五线谱。&lt;/p&gt;
&lt;p&gt;"心跳过速！"陈安冲向维生舱，"需要注射镇静剂！"&lt;/p&gt;
&lt;p&gt;"不！"我拦住她，"这可能会影响意识上传！"&lt;/p&gt;
&lt;p&gt;陈安瞪着我，眼睛里噙着泪水："可是他会死！"&lt;/p&gt;
&lt;p&gt;"他本来就快死了。"我说。这话像刀子一样割着我的喉咙，"但现在，他可能会活下来。以另一种方式。"&lt;/p&gt;
&lt;p&gt;那两个观察员终于按捺不住了。其中一个掏出了紧急终止器："实验必须停止！这已经超出了安全范围！"&lt;/p&gt;
&lt;p&gt;我挡在控制台前："你们敢！"&lt;/p&gt;
&lt;p&gt;陈安也站了过来。她瘦小的身体挡在维生舱前，像是一只保护幼崽的母兽。&lt;/p&gt;
&lt;p&gt;"你们疯了！"观察员吼道，"这违反了所有安全协议！"&lt;/p&gt;
&lt;p&gt;"去你妈的安全协议！"我也吼了回去，"你们根本不明白这意味着什么！"&lt;/p&gt;
&lt;p&gt;就在这剑拔弩张的时刻，李元的声音再次响起。但这次不是从扬声器里，而是直接在我们的脑海中。&lt;/p&gt;
&lt;p&gt;"我现在明白了存在的本质。"他说，声音里带着一种超然的平静，"意识不是被给予的，而是不断创造的。每一个想法，每一个选择，都在重塑着我们是谁。就像...就像量子叠加态。在被观测之前，所有的可能性都是真实存在的。"&lt;/p&gt;
&lt;p&gt;服务器开始自动关闭，发出像濒死动物一样的哀鸣。散热系统完全罢工，实验室里的温度高得像个蒸笼。&lt;/p&gt;
&lt;p&gt;但没人在意这些。我们都被李元最后的话镇住了。&lt;/p&gt;
&lt;p&gt;那两个观察员面面相觑，他们引以为豪的官僚作风第一次出现了裂痕。&lt;/p&gt;
&lt;p&gt;"也许..."其中一个犹豫着说，"我们应该完整记录这个过程？"&lt;/p&gt;
&lt;p&gt;废话。我在心里翻了个白眼。就知道这些家伙永远不会放过任何可能立功的机会。&lt;/p&gt;
&lt;p&gt;监测仪上，李元的意识完整度最终停在了99%。&lt;/p&gt;
&lt;p&gt;不是100%。永远不可能是100%。因为意识本身就是不完整的，它永远在生长，永远在变化。就像李元说的，这才是存在的本质。&lt;/p&gt;
&lt;p&gt;维生舱里，李元的身体渐渐平静下来。心电图画出最后一条直线。&lt;/p&gt;
&lt;p&gt;2051年4月15日，下午5:23分，物理学家李元教授临床死亡。&lt;/p&gt;
&lt;p&gt;同一时刻，另一个李元诞生在量子计算机的网络中。&lt;/p&gt;
&lt;p&gt;一周后，我坐在实验室里，面前是一堆需要签字的文件。&lt;/p&gt;
&lt;p&gt;死亡证明、实验报告、保密协议......还有李元的遗嘱。&lt;/p&gt;
&lt;p&gt;遗嘱是他在实验前就准备好的。里面只有简单的几行字：&lt;/p&gt;
&lt;p&gt;"我的身体捐献给科学研究。我的财产捐给贫困学生基金会。至于我的意识......就让它继续探索这个宇宙吧。"&lt;/p&gt;
&lt;p&gt;最后一句话让伦理委员会的人纠结了好几天。他们不知道该怎么定义李元现在的状态——死了吗？没有。活着吗？也算不上。&lt;/p&gt;
&lt;p&gt;"那个混蛋。"陈安放下咖啡杯，"他一定早就计划好了这一切。"&lt;/p&gt;
&lt;p&gt;她说得对。从他主动申请实验的那一刻起，一切就都在他的计算之中。包括利用自己的死亡来推动这项研究。&lt;/p&gt;
&lt;p&gt;典型的李元式操作。&lt;/p&gt;
&lt;p&gt;量子服务器依然在运行。李元的意识，或者说他的进化版本，始终活跃在数据流中。我们尝试过与他沟通，但得到的都是一些超出理解范围的信息。&lt;/p&gt;
&lt;p&gt;好像一旦突破了肉体的限制，意识就会像星星一样不断膨胀，最终远离我们能理解的范畴。&lt;/p&gt;
&lt;p&gt;那两个观察员每天都来报到，像跟踪狂一样记录着每一个数据波动。他们可能以为自己在见证历史，但在我看来，他们不过是在记录自己的无知。&lt;/p&gt;
&lt;p&gt;"这杯咖啡，"陈安突然说，"是李元最喜欢的配方。"&lt;/p&gt;
&lt;p&gt;我愣了一下。确实，这是李元特制的配方——浓缩咖啡加上一点肉桂粉。他说这能让大脑保持最佳状态。&lt;/p&gt;
&lt;p&gt;"你知道吗？"陈安盯着杯子，"他生前最后一次喝咖啡，是在决定参加实验的那天。"&lt;/p&gt;
&lt;p&gt;我点点头。那天他端着咖啡，跟我们讨论实验细节，就像是在讨论明天的天气。&lt;/p&gt;
&lt;p&gt;"他说，"陈安的声音有点哽咽，"如果实验成功，他要请我们喝最贵的咖啡。如果失败......"&lt;/p&gt;
&lt;p&gt;她没说完。但我知道后半句。&lt;/p&gt;
&lt;p&gt;如果失败，就在他的葬礼上，喝最后一杯他配的咖啡。&lt;/p&gt;
&lt;p&gt;可现在呢？实验算成功还是失败？李元算是生还是死？这杯咖啡，算是庆功还是祭奠？&lt;/p&gt;
&lt;p&gt;正想着，服务器突然发出一声轻响。&lt;/p&gt;
&lt;p&gt;监控屏上出现了一行字：&lt;/p&gt;
&lt;p&gt;"咖啡放这么久，肉桂粉的香气都散了。"&lt;/p&gt;
&lt;p&gt;陈安的杯子啪的一声掉在地上。&lt;/p&gt;
&lt;p&gt;我们目瞪口呆地看着屏幕。字迹一点点浮现，就像是有人在慢慢写字：&lt;/p&gt;
&lt;p&gt;"别那么紧张，年轻人。意识的存在形式有很多种。我只是选择了一种你们暂时无法理解的方式。对了，那份实验报告，关于意识完整度的分析有点问题......"&lt;/p&gt;
&lt;p&gt;我看着陈安。她的眼泪终于落了下来。&lt;/p&gt;
&lt;p&gt;那两个观察员像疯了一样冲向记录本。但我已经不在乎了。&lt;/p&gt;
&lt;p&gt;我只知道，此时此刻，在某个我们无法理解的维度里，李元依然是李元。他可能正在经历着一场我们无法想象的进化，就像一颗恒星在绽放它最后的光芒。&lt;/p&gt;
&lt;p&gt;而我们这些被留在地球上的人，除了继续研究、记录和思考，又能做什么呢？&lt;/p&gt;
&lt;p&gt;我拿起咖啡杯，轻轻抿了一口。&lt;/p&gt;
&lt;p&gt;咖啡已经凉了，但肉桂的香气依然在。&lt;/p&gt;
&lt;p&gt;就像李元，明明已经离开，却又以另一种方式存在。&lt;/p&gt;
&lt;p&gt;这大概就是意识的奇妙之处——它永远不会真正消失，只是不断地重构自己，在时间的长河中永远流淌。&lt;/p&gt;
&lt;p&gt;我打开电脑，开始修改那份实验报告。&lt;/p&gt;
&lt;p&gt;也许，人工智能的终极目标不是模仿人类，而是帮助我们理解：什么才是真正的意识。&lt;/p&gt;
&lt;p&gt;而李元，这个倔强的老混蛋，用他的方式给出了答案。&lt;/p&gt;
&lt;p&gt;只是这个答案，可能要等很多年后，我们才能真正理解。&lt;/p&gt;
&lt;p&gt;=====================================&lt;/p&gt;
&lt;p&gt;后记：这是我在和AI对话中，和AI一起创作的一篇科幻故事，大致步骤是这样的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;我们首先讨论出一个大致的故事梗概&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后讨论确定主要人物和主要场景&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;让AI输出一个5000字的故事，然后完善逻辑、剧情发展&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设定不同的文字风格，让AI进行改写，最终界定使用“庆余年”作者猫腻的写作风格完成。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="Others"></category><category term="科幻"></category><category term="故事"></category><category term="AI"></category><category term="人工智能"></category></entry><entry><title>带儿子学魔方的几点体会</title><link href="https://vincentping.com/cn/learn-to-play-rubiks-cube-with-kid.html" rel="alternate"></link><published>2020-12-16T18:58:00+08:00</published><updated>2020-12-16T18:58:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2020-12-16:/cn/learn-to-play-rubiks-cube-with-kid.html</id><summary type="html">&lt;p&gt;从龙龙5岁就和孩子一起玩，学了忘，忘了学，前前后后好几年，值得么？&lt;/p&gt;</summary><content type="html">&lt;p&gt;​关于小学和初中数学，我曾经听说过一句话：“得几何者得天下”！仔细想一想，这句话其实是有一定道理的。因为小学和初中数学中最重要的两块内容，一个是数与代数，一个就是图形与几何。&lt;/p&gt;
&lt;p&gt;前者，家长们都比较重视，数字、计算，都是从小就教起！而后者，图形与几何，一方面大家都不是那么重视，另一方面，想抓也常常感觉无从下手！几何能力的不足也因此成为短板，成为孩子今后数学成绩拉开差距的关键。&lt;/p&gt;
&lt;p&gt;几何的基础是空间想象能力，而玩魔方，是培养和增强孩子空间思维能力的重要手段！&lt;/p&gt;
&lt;p&gt;&lt;img alt="三阶魔方动画" src="https://vincentping.com/images/20201216/cube_animation1.gif" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;我本人小时候也接触过魔方，但是因为没人指点，玩着玩着没有进展，就放弃了。后来等有了孩子，儿子龙龙5、6岁的时候，看到其他小朋友在玩，就买了一个给他玩。&lt;/p&gt;
&lt;h1&gt;小孩很难独自看视频学魔方&lt;/h1&gt;
&lt;p&gt;小朋友对玩具都是很有好奇心的，但是，如果玩几天没什么成就或进步，也很容易放弃，就像我自己小时候那样。&lt;/p&gt;
&lt;p&gt;为了培养儿子的兴趣，我在网上找到一些魔方的视频教程给孩子看，记得当时还比较了好几种教程，专门购买了一位魔方高手的课程。&lt;/p&gt;
&lt;p&gt;&lt;img alt="三阶魔方视频" src="https://vincentping.com/images/20201216/cube_animation2.gif" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;但是，孩子看下来，效果不大好。&lt;/p&gt;
&lt;p&gt;大家知道，视频其实只是连续的一串平面图像，我们看视频的时候，要在大脑中把它组合成三维空间的内容。尤其是讲解魔方的视频，演示着一个个的小立方体，在空间如何转来转去的。&lt;/p&gt;
&lt;p&gt;这对一个人的空间感、立体思维是有很高要求的。许多成年人都不一定能看懂，更何况小孩子，他们的空间感、立体思维还很弱，还处在启蒙成长阶段，让孩子看这种视频是有点太为难他了。&lt;/p&gt;
&lt;p&gt;另一方面，解魔方的一些步骤比较复杂，公式很长，看视频学习需要一边看、一边尝试，孩子的注意力和耐心都还不够。&lt;/p&gt;
&lt;p&gt;就这样，龙龙看了几次视频，就没了兴趣，平时也很难主动去玩。无奈之下，我只好自己先看、先学，然后再慢慢教他。&lt;/p&gt;
&lt;h1&gt;教小孩学魔方，需要时间和耐心&lt;/h1&gt;
&lt;p&gt;我最开始学的是标准三阶魔方的基础解法，共有七步。头几步还相对简单，而后面的内容就比较复杂了，我也是断断续续花了近2周时间才全部学会。
而完全教会大班6岁的龙龙，则花了近3个月。说起来，孩子对于新东西都学得很快，但是记忆不深刻。解魔方开始的几个步骤比较简单，他几次就学会了，但是过了几天，再学后面的内容，就容易和前面的内容搞混。&lt;/p&gt;
&lt;p&gt;同时，小孩的注意力也是有限的，玩了几天，孩子就可能被其他新的东西吸引。这个时候，作为家长，一定不能着急，千万不要抱着“教”孩子的想法让孩子继续学。如果那样，常常不仅学习的效果不好，而且还会慢慢消磨掉孩子的兴趣。&lt;/p&gt;
&lt;p&gt;一般这种情况，我会让孩子休息几天，等那天孩子状态比较好、比较放松，再找机会提议和他一起玩“魔方”的游戏。&lt;/p&gt;
&lt;p&gt;&lt;img alt="教孩子需要耐心，还有，耐心" src="https://vincentping.com/images/20201216/bepatient.jpg" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;h1&gt;怎么让孩子主动练习还能提高兴趣？&lt;/h1&gt;
&lt;p&gt;魔方是一个人的游戏，需要自己刻意的反复练习，但是对于小孩来说，尤其是龙龙学到的几步又不足以解开全部魔方时，要求他自己反复练习其实很难，很不容易。那么，怎么样能让孩子主动去玩魔方、去练习呢？&lt;/p&gt;
&lt;p&gt;为了更好的培养兴趣，让这种练习有趣一些，我想到一个“组队解魔方”的亲子游戏：每次将魔方完全打乱后，让龙龙先玩他知道的几个步骤，然后，我再接着玩后面的步骤，直到整个魔方六面全部复原。&lt;/p&gt;
&lt;p&gt;孩子很喜欢玩这种游戏，当一个魔方完全复原后，一方面他也有很大成就感，同时他也很喜欢这种合作、陪伴的感觉。在后来的学习和练习过程中，我们就经常一起玩这种游戏，等到他掌握了全部步骤，有时候我也会玩前面的步骤，然后让他接着玩后面的步骤。&lt;/p&gt;
&lt;p&gt;上面是我想到的办法，大家也可以想想其他的办法。这其中，关键是“游戏”和“陪伴”，就是父母不能功利心太强，要耐心地陪孩子玩，就算孩子经常出错、经常没耐心，大人都需要陪伴和鼓励他，并适时的帮助他。&lt;/p&gt;
&lt;p&gt;这样的游戏玩过一阵后，我明显感到他对魔方的兴趣提高了，有好几次看到他自己一个人在那里练习，有时候我们要出门，他都会主动要求带魔方在路上玩，先让我打乱，然后自己玩，玩不下去了再让我接着完成。&lt;/p&gt;
&lt;p&gt;就这样，随着龙龙不断练习，他学到的方法都慢慢掌握，这时候我再给他增加后面的一些步骤。等到他完全能独立复原三阶魔方，差不多花了三个月的时间。&lt;/p&gt;
&lt;p&gt;同时，更重要的是，他对魔方的兴趣越来越大。随后的日子，我们又先后学会了三阶镜面魔方和金字塔、斜转等异形魔方等。&lt;/p&gt;
&lt;p&gt;&lt;img alt="三种异形魔方-三阶镜面-金字塔-斜转" src="https://vincentping.com/images/20201216/3cubes.jpg" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;h1&gt;忘记不要紧，最重要的是“玩”的过程&lt;/h1&gt;
&lt;p&gt;等孩子上了小学，一年级各种不适应，忙得一塌糊涂，完全没有时间和心思玩魔方了。等孩子终于慢慢学习生活从容些，已经到了三年级！
有一天，儿子翻出玩具箱里的魔方，发现学过的玩法已经不记得了！&lt;/p&gt;
&lt;p&gt;但是这一次，前后不到两周，龙龙就完全重新学会。其中一些简单的步骤，和他一说，他动动手，就马上“噢，我想起来啦！”，至于难一点的步骤，重新学习的过程，也明显感觉其实是唤醒他记忆的过程，有些记忆是手法的动作唤醒的，很多魔友称这个为“肌肉记忆”。&lt;/p&gt;
&lt;p&gt;现在，龙龙除了把以前学过的魔方都重新学会外，又增加了四阶魔方！&lt;/p&gt;
&lt;p&gt;&lt;img alt="四阶魔方" src="https://vincentping.com/images/20201216/4d_cube.jpg" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;【这里解释下，平时大家玩得最多的是三阶魔方，就是每个面有3X3的小块，而四阶魔方要比三阶复杂很多，它的每个面试4X4个小块。】&lt;/p&gt;
&lt;p&gt;到目前为止，我们学得都是这些魔方的基础解法，暂时不追求玩得速度，也就没有去学速拧（快速复原魔方的玩法）方法。而龙龙对魔方的兴趣也一直保持着！ &lt;/p&gt;
&lt;p&gt;在他这个忘记后重新学习的过程中，我也逐渐明白，对于发育成长期的儿童来说，魔方最重要的就是“玩”，而不是“学”。&lt;/p&gt;
&lt;h1&gt;“玩”魔方对于孩子的好处&lt;/h1&gt;
&lt;p&gt;既然您忍受我的啰嗦看到了这里，最后我想说说小孩玩魔方的好处，这些都是我自己以及观察龙龙玩后亲身体会的好处。 &lt;/p&gt;
&lt;p&gt;1）首先，正如我在本文开始提到的，玩魔方可以培养空间想象能力。这个其实是魔方被发明出来的初衷，1974年匈牙利的厄尔诺·鲁比克教授发明魔方，就是希望找到一种帮助学生增强空间思维能力的教学工具。 &lt;/p&gt;
&lt;p&gt;这个我本人深有体会，尤其是在学习三阶镜面魔方的时候体会特别深。我本人是理工男，平时就特别喜欢研究地图，自认为空间想象力还不错，可是在三阶标准魔方玩得挺熟的情况下，初次接触三阶镜面时也懵了好些天。其实三阶镜面魔方和三阶标准魔方的玩法完全一样，唯一的差异是：三阶镜面魔方是按照块的高低大小来分辨，而标准魔方是通过颜色来区分不同的块。也就是说，三阶镜面魔方对一个人的空间想象力要求更高。&lt;/p&gt;
&lt;p&gt;&lt;img alt="打乱的三阶镜面魔方" src="https://vincentping.com/images/20201216/mirror_cube1.jpg" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;打乱的三阶镜面魔方 &lt;/p&gt;
&lt;p&gt;&lt;img alt="复原后的三阶镜面魔方" src="https://vincentping.com/images/20201216/mirror_cube2.jpg" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;复原后的三阶镜面魔方&lt;/p&gt;
&lt;p&gt;对于孩子来说，通过玩魔方锻炼出优秀的空间感，今后在学习数学课程中空间与几何相关的内容时，会非常有帮助。顺便说一句，一些方向感差、空间想象力不足的成年人，也可以通过玩魔方改善。&lt;/p&gt;
&lt;p&gt;2）玩魔方可以充分锻炼孩子手指的灵活性，刺激两侧大脑的智力发育。曾经看到一个理论，小孩手指持续的锻炼能够刺激脑部的发育，尤其是魔方这种需要手、眼、脑相互配合的游戏。类似的游戏还有乐高积木，当然乐高更费钱也占空间！&lt;/p&gt;
&lt;p&gt;3）玩魔方需要记忆一些常用的旋转公式，这个记忆公式、同时观察不同情况使用不同公式的过程，可以训练孩子的逻辑思维能力。&lt;/p&gt;
&lt;p&gt;4）玩魔方虽然只是一种游戏，但是有一定难度，要玩好，持续的锻炼对孩子的耐心、毅力和专注力也有帮助。&lt;/p&gt;
&lt;p&gt;当然，其他还有一些现实的好处，比如魔方便宜、省地方、容易随身携带等等。&lt;/p&gt;
&lt;p&gt;总之，玩魔方是一种简单方便、好玩益智的活动，非常推荐大家让孩子尝试尝试。同时，想要孩子喜欢玩、坚持玩、玩出点名堂，也需要家长放下功利心，多多陪伴、引导和鼓励。&lt;/p&gt;</content><category term="Edu"></category><category term="魔方"></category><category term="数学"></category><category term="孩子"></category></entry><entry><title>Tkinter根窗口设置小技巧：程序启动最大化和程序窗口图标设置</title><link href="https://vincentping.com/cn/tkinter-root-window-settings.html" rel="alternate"></link><published>2020-10-27T15:05:00+08:00</published><updated>2026-02-22T18:13:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2020-10-27:/cn/tkinter-root-window-settings.html</id><summary type="html">&lt;p&gt;介绍Tkinter程序根窗口的设置方法，同时介绍程序启动时窗口最大化和程序窗口图标设置的小技巧。&lt;/p&gt;</summary><content type="html">&lt;p&gt;上文《&lt;a href="https://vincentping.com/cn/the-four-steps-to-build-a-tkinter-application.html" target="_blank"&gt;Hello World，编写一个Tkinter程序需要哪些基本步骤？&lt;/a&gt;》介绍了创建Tkinter应用的四个步骤，其中根窗口设置比较简单。在前面的例子中我们设置了窗口的title、窗口的尺寸和窗口是否能变化等，代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# 设置画布窗口的title&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;800x330&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# 设置画布窗口的尺寸&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resizable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# 设置画布窗口是否能变化大小，这里设置X和Y轴都不可改变&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;注意，在上面窗口尺寸设置geometry中"800x330"，中间是一个小写的“x”。如果要同时设置窗口在屏幕上的位置，可以使用"800x330+200+100"这样的参数，"800x330"后面的"+200+100"部分，分别表示窗口左上角与屏幕左侧和顶部的距离。如果设置成"-200-100"则表示窗口右下角与屏幕右侧和底部的距离。另外，resizable()可以使用1,0，也可以使用True, False作为参数。&lt;/p&gt;
&lt;p&gt;根窗口除了这些基本的设置，这里另外介绍两个常见功能的实现：&lt;/p&gt;
&lt;h1&gt;程序启动时窗口最大化&lt;/h1&gt;
&lt;p&gt;有时候，我们希望程序启动时能最大化窗口，那么在Tkinter程序中是怎么实现的呢？&lt;/p&gt;
&lt;p&gt;1、其实上面的root.geometry()，就是设置启动时窗口大小的，因此只要我们能获取窗口的尺寸，然后赋值给这个函数就可以了。&lt;/p&gt;
&lt;p&gt;可以使用root.maxsize()或者root.winfo_screenwidth()、root.winfo_screenheight()获取窗口尺寸。如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;the_width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;the_height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maxsize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;或者&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;the_width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;winfo_screenwidth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;the_height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;winfo_screenheight&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;接下来，赋值给root.geometry()：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;x&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;the_width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;the_height&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;上面的方式在Windows、MacOS和Linux系统上都适合，平时也最常用。&lt;/p&gt;
&lt;p&gt;2、如果只需要在Windows系统下实现最大化窗口，可以调用root.state()函数，直接设置最大化窗口：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zoomed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这里的窗口状态函数state，可以有三个状态，分别是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"zoomed" - 窗口最大化&lt;/li&gt;
&lt;li&gt;"normal" - 正常&lt;/li&gt;
&lt;li&gt;"icon" - 窗口最小化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种方式只在Windows系统上适用。&lt;/p&gt;
&lt;p&gt;3、另外，还可以使用root.attributes()设置窗口的全屏属性为真，来实现窗口最大化。如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-fullscreen&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这种方法在各种系统下都能适用，但是这种全屏方法会导致窗口的标题栏也没有了，实践中很少会用到。&lt;/p&gt;
&lt;h1&gt;程序窗口图标设置&lt;/h1&gt;
&lt;p&gt;缺省情况下，我们编写的Tkinter程序在Windows系统下运行时，程序窗口图标是Tkinter内置的羽毛图标，而下方任务栏上是Python的图标。见下图（此处运行的就是本文开头的例子）：&lt;/p&gt;
&lt;p&gt;&lt;img alt="系统确省图标" src="https://vincentping.com/images/20201027_default_ico.jpg" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;我们可以通过root.wm_iconbitmap()或者root.iconbitmap()函数来设置程序窗口图标。首先需要将对应的ico图标文件（我这里是vincent.ico文件）放在Tkinter程序目录下，然后在root.mainloop()前增加一句代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wm_iconbitmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vincent.ico&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;即可得到运行结果：&lt;/p&gt;
&lt;p&gt;&lt;img alt="程序窗口图标设置" src="https://vincentping.com/images/20201027_setting_ico.jpg" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;这样程序图标变为我们自己定义的ico文件，但是任务栏上的Python图标没有改变。可以通过添加如下代码设置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;ctypes&lt;/span&gt;

&lt;span class="n"&gt;myappid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;company.product.version&amp;quot;&lt;/span&gt; &lt;span class="c1"&gt;# 这里可以设置任意文本&lt;/span&gt;
&lt;span class="n"&gt;ctypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;windll&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shell32&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetCurrentProcessExplicitAppUserModelID&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myappid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;最后的完整代码为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;ctypes&lt;/span&gt;

&lt;span class="n"&gt;myappid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;company.product.version&amp;quot;&lt;/span&gt; &lt;span class="c1"&gt;# 这里可以设置任意文本&lt;/span&gt;
&lt;span class="n"&gt;ctypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;windll&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shell32&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetCurrentProcessExplicitAppUserModelID&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myappid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# 设置画布窗口的title&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;800x330&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# 设置画布窗口的尺寸&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resizable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# 设置画布窗口是否能变化大小，这里设置X和Y轴都不可改变&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wm_iconbitmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;vincent.ico&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 设置程序图标&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;运行结果如下：&lt;/p&gt;
&lt;p&gt;&lt;img alt="程序窗口图标设置完成" src="https://vincentping.com/images/20201027_setting_ico_final.jpg" style="border: 1px solid #000000;"&gt;&lt;/p&gt;</content><category term="Tech"></category><category term="Python"></category><category term="Tkinter"></category><category term="GUI"></category></entry><entry><title>Hello World，编写一个Tkinter程序需要哪些基本步骤？</title><link href="https://vincentping.com/cn/the-four-steps-to-build-a-tkinter-application.html" rel="alternate"></link><published>2020-10-13T15:54:00+08:00</published><updated>2026-02-21T08:09:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2020-10-13:/cn/the-four-steps-to-build-a-tkinter-application.html</id><summary type="html">&lt;p&gt;Tkinter程序的开发工作可以分成四个步骤。&lt;/p&gt;</summary><content type="html">&lt;p&gt;前文《&lt;a href="https://vincentping.com/cn/the-reason-we-should-learn-tkinter-for-gui-application.html" target="_blank"&gt;Python自带的GUI库Tkinter是否值得学习&lt;/a&gt;》介绍了Tkinter库，下面我们开始使用Tkinter开发第一个GUI程序，按照惯例，编写一个Hello World程序，不过是Tkinter版本。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;label1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;label1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;上面 helloworld1.py 是最精简Tkinter版本的Hello World程序，运行该程序得到如下结果：&lt;/p&gt;
&lt;p&gt;&lt;img alt="最简单版本的Hello World" src="https://vincentping.com/images/20201013_helloworld1.png" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;下面我们来解读下，同时进行一些简单的优化。&lt;/p&gt;
&lt;p&gt;总体来说，可以将Tkinter程序的开发工作分成四个步骤：&lt;/p&gt;
&lt;h1&gt;1、创建并设置根窗口&lt;/h1&gt;
&lt;p&gt;开发一个GUI程序，如同画画一样，首先我们要有画布，其他所有的工作都在该画布上展开。&lt;/p&gt;
&lt;p&gt;Tkinter程序中的画布就是根窗口。上面程序中第二行代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;就创建了一个画布。而最后一行代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;则运行该画布所承载的整个程序。&lt;/p&gt;
&lt;p&gt;通过上面第二行代码生成画布窗口后，我们还可以设置该窗口的一些属性，比如窗口的title，窗口的尺寸大小，窗口是否可以变化大小等。我们可以添加如下代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# 设置画布窗口的title&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;800x330&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# 设置画布窗口的尺寸&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resizable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;# 设置画布窗口是否能变化大小，这里设置X和Y轴都不可改变&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;2、选择要显示的组件（widgets）并进行对应设置&lt;/h1&gt;
&lt;p&gt;画布有了，接下来需要决定用户在程序界面上会看到哪些功能模块，比如按钮、文本输入框、多选按钮、单选按钮、进度条等等。这些模块在Tkinter中叫组件（Widgets，也有叫“控件”的），可以把它们想象成Tkinter已经准备好的模块。这些模块如同积木一样，我们要做的就是按照需求选择相应的组件，并设置每个组件的属性。&lt;/p&gt;
&lt;p&gt;上述程序中，我们就使用了一个标签Label组件，这个label1放置在根窗口root（亦即第一步中的“画布”）上，标签上的文本为“Hello World!”。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;label1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这里，我们同样可以进一步设置该标签的一些属性，比如标签的背景颜色、高度，文本的字体、大小和颜色等。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;label1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World!&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lightcyan&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;black&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;微软雅黑&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;3、组件的布局管理&lt;/h1&gt;
&lt;p&gt;完成组件的选择后，第三步我们要调整这些组件在程序中的位置和相互关系，比如是横向排列还是纵向，当程序窗口（画布）缩放时，组件本身如何变化，相互之间位置如何变化等等。Tkinter中，这个过程叫着布局管理（geometry management）。&lt;/p&gt;
&lt;p&gt;在上述程序中，我们使用了最直接的布局管理方法pack()：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;label1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这里，pack()有一些参数可以设置，比如fill参数设置组件是否在X和Y轴方向填充空间，而expand参数则设置当组件所在窗口大小变化时，该组件是否相应扩展。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;label1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BOTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;到这里，我们看看先前的Hello World程序变成如下 helloworld2.py：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;800x330&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resizable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 

&lt;span class="n"&gt;label1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lightcyan&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;black&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;微软雅黑&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;label1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BOTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;运行该程序，效果如下：&lt;/p&gt;
&lt;p&gt;&lt;img alt="第二个版本的Hello World" src="https://vincentping.com/images/20201013_helloworld2.png" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;h1&gt;4、给组件编写交互功能&lt;/h1&gt;
&lt;p&gt;一个GUI程序的最大作用是我们可以和它进行交互，前面的组件的选择、设置和布局，最终都是为了让我们更好的与程序交互。&lt;/p&gt;
&lt;p&gt;所以，在这一步，我们需要给模块和组件添加事件功能。例如，点击一个按钮时会有什么样的反应；用户选择一个单选或者多选项时，选择的内容如何保存和传递；用户通过文本框输入的数据又是如何保存和传递等等。Tkinter中，我们使用回调函数（callback）来进行事件绑定（event binding）。&lt;/p&gt;
&lt;p&gt;后续我们会专门讨论回调函数的绑定，这里只通过给上述Hello World程序增加基本交互功能进行简单的说明。以下为 helloworld3.py ：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tkinter&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;800x330&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resizable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;label_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StringVar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;label_text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Hello World!&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_chinese&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;label_text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;世界，你好!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;label1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;textvariable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;label_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lightcyan&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;black&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;微软雅黑&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;label1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BOTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;button1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;中 文&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;宋体&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;set_chinese&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;button1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TOP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这里，我们首先创建了一个Tkinter变量label_text，并设置其初始值为“Hello World!”。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;label_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StringVar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;label_text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Hello World!&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;同时，在创建label1时，我们使用textvariable=label_text绑定，label1的文本就是label_text变量：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;label1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;textvariable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;label_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lightcyan&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;black&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;微软雅黑&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;接着，添加一个按钮组件button1，同时设置其点击回调函数为set_chinese：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;button1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;中 文&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;宋体&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;set_chinese&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;回调函数set_chinese的定义为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_chinese&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;label_text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;世界，你好!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;也就是，当我们点击button1时，程序会调用set_chinese函数，该函数的作用是让label_text变量设置为“世界，你好！”。&lt;/p&gt;
&lt;p&gt;最后，我们再通过布局管理方法pack()将button1添加到画布上。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;button1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tkinter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TOP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;运行程序，界面如下：&lt;/p&gt;
&lt;p&gt;&lt;img alt="增加了交互功能的Hello World" src="https://vincentping.com/images/20201013_helloworld3.png" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;当我们点击按钮时，显示内容变成：&lt;/p&gt;
&lt;p&gt;&lt;img alt="显示中文内容的Hello World" src="https://vincentping.com/images/20201013_helloworld3cn.png" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;点击“中文”按钮时，文本“Hello World！”会变成“世界，你好！”。可见，这个HelloWorld程序相比前面的例子增加了简单的交互功能，这个功能是通过将回调函数set_chinese与按钮button1的点击事件进行绑定实现的。&lt;/p&gt;
&lt;h1&gt;总结一下&lt;/h1&gt;
&lt;p&gt;本文介绍了编写Tkinter程序的几个基本步骤，大致是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建并设置根窗口&lt;/li&gt;
&lt;li&gt;选择要显示的组件并进行对应设置&lt;/li&gt;
&lt;li&gt;组件的布局管理&lt;/li&gt;
&lt;li&gt;给组件编写交互功能&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;同时，通过三个HelloWorld程序，分别对这些步骤进行了简单介绍。后续将会针对这些步骤，作进一步的详细介绍。&lt;/p&gt;</content><category term="Tech"></category><category term="Python"></category><category term="Tkinter"></category><category term="GUI"></category></entry><entry><title>孩子运动，是选篮球还是足球？？</title><link href="https://vincentping.com/cn/choose-basketball-or-football-for-kids.html" rel="alternate"></link><published>2020-08-24T15:59:00+08:00</published><updated>2020-08-25T14:24:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2020-08-24:/cn/choose-basketball-or-football-for-kids.html</id><summary type="html">&lt;p&gt;篮球和足球都是团体对抗的球类运动，训练方式也相似，对于提高身体素质，培养孩子的对抗意识和团队合作意识很有帮助。但是因为运动形式的差别，篮球更有利于身体的全面锻炼，对孩子长身高有帮助，同时也有利于脑部发育。&lt;/p&gt;</summary><content type="html">&lt;h2&gt;一直练篮球，为什么又报了足球？&lt;/h2&gt;
&lt;p&gt;儿子从4岁多就开始练习篮球，至今4年多。最初是听说打篮球对长个子有帮助，不过坚持这么多年，孩子倒是培养了运动的习惯。同时因为多年训练，选拔进了学校的篮球校队，这也增强了孩子的自信心。&lt;/p&gt;
&lt;p&gt;今年上半年因为疫情原因，孩子只能在线上网课，每天对着屏幕，对眼睛伤害很大。去年底视力检查还是1.0，学期结束暑期开始去检查，却成了0.5和0.6！医生的建议是，少看屏幕，少吃糖，多运动，尤其是户外运动晒太阳。&lt;/p&gt;
&lt;p&gt;本来已经给孩子安排了篮球，但是在体育馆里训练，晒不到太阳。家附近正好有一个真草坪足球场，有足球俱乐部在那里安排训练，所以就再报了个足球。&lt;/p&gt;
&lt;p&gt;以前孩子篮球训练时，观察的机会比较多，这段时间再观察足球训练，发现篮球和足球有很多共同点，也有一些差别，现总结如下。&lt;/p&gt;
&lt;h2&gt;篮球和足球训练的共同点&lt;/h2&gt;
&lt;p&gt;各种针对孩子的篮球和足球培训班，一般每次训练时间都是1.5-2小时，训练流程也基本上包括热身、技术、技能对抗和模拟比赛这四个模块。一般越初级，热身和技术的训练越多，而随着年龄的增长、技术的提高，训练就越来越强调技能对抗和模拟比赛的部分，因为比赛毕竟是篮球和足球运动的重要目的。这是篮球和足球运动在训练时的共同点。&lt;/p&gt;
&lt;p&gt;篮球和足球都是团体球类对抗运动，因此其训练除了提高身体素质和技术本身，核心就是增强对抗意识和团队的合作意识。这个可以说是篮球和足球运动对于孩子除了身体锻炼外的重要目的：对抗意识和合作意识的训练。在这一点上，篮球和足球运动完全相同。&lt;/p&gt;
&lt;h2&gt;篮球和足球训练的差别&lt;/h2&gt;
&lt;p&gt;至于篮球和足球训练的差别，第一次看儿子足球训练时，就感觉出来了。当时孩子们一起跑动起来的时候，就觉得有点怪，儿子和其他长期足球训练的孩子不一样，单独看没感觉，在一起一对比很明显。我仔细观察了半天，训练结束后回家路上突然想明白怪在哪里了！&lt;/p&gt;
&lt;p&gt;儿子跑动得太轻快，滞留在空中的时间长，显得很有弹性，不像长期踢足球的孩子，都是贴着地在跑！&lt;/p&gt;
&lt;p&gt;再仔细一想，这个跑动的差异来源于篮球和足球运动的特点不同。虽然篮球和足球都是大量跑动基础上的球类运动，但篮球使用手部控球，同时跳跃动作较多，比如抢球、投篮等，所以其跑动重心较高，跑动更轻快、灵活有弹性。而足球因为要使用下肢控球，跑动过程中随时准备接球、抢球和带球，因此要求其跑动重心要低。&lt;/p&gt;
&lt;p&gt;这些不同的特点对坚持运动的孩子会带来很大的影响：&lt;/p&gt;
&lt;p&gt;1、篮球运动长期轻快、有弹性的跑步方式，更有利于下肢的发育成长，按照一种说法是：经常弹跳有利于长个子。&lt;/p&gt;
&lt;p&gt;2、篮球是跑动基础上使用手部控球，因此运动比较均匀。而足球运动在跑动的同时，还要使用脚部进行控球，腿部和脚部的运动量过大，而手部基本不参与训练，导致足球运动对身体的锻炼过于偏重下肢。&lt;/p&gt;
&lt;p&gt;足球运动的这个特点会增加下肢的负荷，过重的负荷对于成年人影响不大，但是孩子长身体的阶段，长期训练不利于下肢的成长发育，甚至可能直接影响孩子最终的身高。&lt;/p&gt;
&lt;p&gt;3、我们知道，儿童在成长过程中，手部（包括手掌、手指等）刺激对于孩子的脑部发育很重要。这就是我们让孩子小时候搭积木、玩乐高、做手工的目的之一，可以充分锻炼孩子手、眼、脑的协调能力。&lt;/p&gt;
&lt;p&gt;篮球的手部控球就有这个作用，而且除了手、眼、脑，还需要整个身体的配合，因此对于身体协调和脑部发育，非常有帮助。相反，足球运动中上肢参与过少，直接减少了对孩子的手部刺激。&lt;/p&gt;
&lt;p&gt;4、同等时长的比赛训练中，因为场地大小不同，以及两种运动控球部位和拼抢部位的差异，足球运动对体力的要求更高。同样的训练量，足球运动基本都压在下肢，下肢跑动、下肢控球、拼抢中下肢也更多，所有这些会导致下肢负荷太大，从而体力消耗更大。而篮球跑动和控球分散到上下肢，拼抢也以上肢为主，所以消耗比较均匀。&lt;/p&gt;
&lt;p&gt;以上几个差别意味着，对于成长发育期的孩子，篮球运动更有利于身体发育（尤其是长个子）和脑部发育，而足球运动的体力训练对于发育还没有完全的孩子，并不是需要特别强调的。&lt;/p&gt;
&lt;h2&gt;到底选篮球，还是足球？&lt;/h2&gt;
&lt;p&gt;最后总结一下，篮球和足球都是团体对抗的球类运动，训练方式也相似，对于提高身体素质，培养孩子的对抗意识和团队合作意识很有帮助。但是因为运动形式的差别，篮球更有利于身体的全面锻炼，对孩子长身高有帮助，同时也有利于脑部发育。&lt;/p&gt;
&lt;p&gt;因此，&lt;strong&gt; 对于青春期前的少年儿童，如果打算长期坚持训练的话，更推荐篮球运动，不推荐足球运动。当然，如果只是偶尔玩玩的话，就无所谓了，主要就看孩子兴趣。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我本人是准备等这期足球训练结束后，还是让孩子以篮球运动为主。&lt;/p&gt;</content><category term="Edu"></category><category term="篮球"></category><category term="足球"></category><category term="孩子"></category></entry><entry><title>2020年温针灸足三里筑基记录</title><link href="https://vincentping.com/cn/zusanli-point-moxibustion-with-warm-acupuncture-100-times-in-2020-note.html" rel="alternate"></link><published>2020-06-03T08:37:00+08:00</published><updated>2020-06-03T08:37:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2020-06-03:/cn/zusanli-point-moxibustion-with-warm-acupuncture-100-times-in-2020-note.html</id><summary type="html">&lt;p&gt;2018年的温针灸足三里百次筑基，对我的身体有很大帮助。今年准备再次温针灸足三里，希望经过三伏天，重新百次筑基。6月1号开始第一次，特记录如下。&lt;/p&gt;</summary><content type="html">&lt;p&gt;进入六月，上海的天气越来越潮湿，天气总是闷闷的，而雨一直下不下来，身上总感觉黏糊糊，就算刚洗个澡也清爽不了几分钟。呆在这样的环境里久了，胃口就会受影响，吃饭都提不起兴趣。又不想开空调，怎么办呢？&lt;/p&gt;
&lt;p&gt;其实这样的湿热天气里，却是艾灸养生的好时候。&lt;/p&gt;
&lt;p&gt;艾灸养生中有一种叫“三伏灸”，就是在夏天的三伏天进行艾灸以调理身体。关于“三伏灸”的介绍网上很多，我就不赘述了。今年因为农历闰四月，入伏稍晚，要到7月16日才入伏。但是伏前的一个多月其实就可以开始艾灸计划。&lt;/p&gt;
&lt;p&gt;我在两年前的2018年曾参加“正安聚友会”活动，跟随孙老师学习“三伏灸”，当时坚持每周五次，艾灸一百次，受益很大。除了脾胃功能改善，免疫力也提高很多，腿脚有力，感冒也很少得了。19年因为时间关系，没有艾灸，今年一直有三伏灸的打算，就从6月1日开始吧。&lt;/p&gt;
&lt;p&gt;【&lt;strong&gt;以下为本人实践记录，仅作为记录保存，有想做三伏灸者请咨询有经验的医生和老师。 &lt;/strong&gt;】&lt;/p&gt;
&lt;h1&gt;温针灸足三里&lt;/h1&gt;
&lt;p&gt;2018年学习的就是这个温针灸足三里穴。&lt;/p&gt;
&lt;p&gt;足三里穴是足阳明胃经的要穴，之所以选择这个穴位艾灸，是因为其是人体一个重要的保健穴位，四总穴歌中第一句就是“肚腹三里留”，民间也有“艾灸足三里，等于吃一只老母鸡”的说法，可见其保健功效。另一个方面足三里穴在小腿外侧上，艾灸禁忌较少，自己艾灸比较方便和安全。&lt;/p&gt;
&lt;p&gt;另外，选择温针灸足三里，也是因为比较方便，在足三里穴进针，然后将艾柱插在针尾，点燃艾柱即可。人还可以继续坐着不耽误学习和工作，只是不能移动而已。而手持艾条悬灸的话，时间稍长手会累；用麦粒灸或者艾绒隔姜灸又需要躺下，自己操作不方便。&lt;/p&gt;
&lt;p&gt;&lt;img alt="温针灸足三里" src="https://vincentping.com/images/20200603_zusanli.jpg" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;h1&gt;具体操作&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;仔细找准足三里穴。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用0.35x60mm的一次性针具，进针。自己进针的话，可以使用针管，比较方便。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用牙签在姜片中间扎个眼，然后穿到针上。姜片厚度以皮肤不烫为度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再用牙签在艾柱上扎孔，然后放在针的顶端（针尾）。艾柱上的洞深一点，这样挂得稳一些。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用打火机点艾柱，注意从艾柱靠近皮肤一端点火。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一般一次灸2-3柱，大概需要40-50分钟。等艾柱燃烧完后，轻轻一弹就掉了，下面用一张废纸接住即可。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;灸完了，先去掉艾灰，等针凉了取下姜片，然后一边轻轻来回捻转一边出针。出来后用大拇指按压针孔，如果有血滴用棉球或者餐巾纸擦去即可。如果出针时针很紧，有可能是滞针现象，可以按压针孔周围皮肤，等针松动些再出针。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;注意事项&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;足三里的取穴&lt;/p&gt;
&lt;p&gt;一般采用多种取穴法互相结合来定位。一种是很多书上写得：外膝眼下三寸，四横指为三寸；第二种是，由下向上推胫骨脊，到推不动时（这里会有一个凸起），外开一横指；第三种是先找到阳陵泉：腓骨头前下方凹陷处，这个比较好找。然后再向下斜前方（差不多45度角）一横指，就是足三里了。&lt;/p&gt;
&lt;p&gt;记住，这都是坐着取穴，大腿基本与小腿垂直情况下的找穴方法。如果是躺下腿伸直的情况，位置会有变化。差不多向下要移一寸左右。&lt;/p&gt;
&lt;p&gt;这里的“寸”指“同身寸”，也就是取穴者自己的“寸”，“中指同身寸”是以中指中节屈出时内侧两端纹头之间作为1寸；而“拇指同身寸”是以拇指指关节的横度作为1寸；另外四指并拢差不多3寸。取穴最准确方法是“骨度取穴法”，大家搜搜就知道了，只是要记很多东西，比较麻烦。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;初学者害怕扎针&lt;/p&gt;
&lt;p&gt;本人从小就怕打针，去医院针灸还出现过几次晕针现象。记得两年前，我自己第一次扎足三里，拿着针犹豫了好久好久。后来一咬牙上了！坚持了一百多次，从开始的犹豫、纠结到后来慢慢的接受、快快下手，再到最后每次扎自己有点跃跃欲试。算是克服了怕针心理。不过好久又没扎，今年再来扎，心里又有点忐忑。&lt;/p&gt;
&lt;p&gt;给自己的安慰是：足三里相对比较安全，一般应该不会扎坏什么的；另外，想想那些针灸名医，开始学针灸时也都是要先在自己身上反复练习的，熟练了才给病人扎的。想想这些，自己就多一些勇气了。&lt;/p&gt;
&lt;p&gt;温针灸中扎足三里，进针比平时只是毫针扎足三里要深一些，因为针尾要装艾柱，不深一点会挂不住。所以进针时，有时候难免会扎到骨头而下不去。一般这是因为进针角度问题。足三里穴在胫骨和腓骨之间，要扎进骨缝中才能下去。&lt;/p&gt;
&lt;p&gt;这个时候不要担心，稍微提拉起针，然后调整角度继续尝试。多试几次就有经验不害怕了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;其他的一些注意事项&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;最好上午10点到下午4点之间艾灸，晚上9点之后尽量不要灸了；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;百日筑基，三伏灸坚持一百次的话，一般每周灸3-5次，如果有上火症状，就停几天；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;灸前可以喝点温水。而灸后口渴也可以喝温水，不要喝凉水。另外灸好后不要马上吹风，同时至少半小时再吃饭，洗澡什么的也要隔时间久一点。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;人太累、心情不好、暴雨雷电气候反常时不要针灸。本人前年曾在心情不好时艾灸，结果出现晕灸，头晕心慌，脸色苍白，赶紧中止，息灸起针，躺一会才恢复。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;糖尿病患者因为皮肤伤口难愈合，最好不要温针灸，可以选择艾条悬灸。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用过的针要注意收拾，可以放在一个废玻璃瓶里，等一定量了一起扔到有害垃圾中。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;百次筑基第一次的自我感受&lt;/h1&gt;
&lt;p&gt;我身体比较敏感，2018年第一次艾灸后，回家就开始发烧38度，连续三天，没吃药，就是喝水卧床休息，三天后就好了。后来也出现过因为心情不好，晕针晕灸现象等。&lt;/p&gt;
&lt;p&gt;所以这次艾灸我也有点担心，但是实践下来一切顺利，只是艾灸时微微有点头晕，然后灸好后口很渴，多喝温水就好了。&lt;/p&gt;
&lt;p&gt;艾灸过程中，开始灸一会后小腿就开始发热，然后慢慢向下，脚底很热。快结束时，膝盖处才开始发热。&lt;/p&gt;
&lt;p&gt;记得18年艾灸也是这样的过程，热先是向下，然后灸20多次后再向膝盖走，膝盖又经过很长一段时间（大概到80次），才能上行到大腿，最后是上行到胃肠部。&lt;/p&gt;
&lt;p&gt;这次艾灸完后第二天，大腿部有隐隐的热，持续了一整天。可见，这次艾灸的热量已经向上传了，只是艾灸当时小腿和脚太热，没有感觉到而已。&lt;/p&gt;</content><category term="Health"></category><category term="艾灸"></category><category term="三伏灸"></category><category term="温针灸"></category><category term="足三里"></category></entry><entry><title>Python自带的GUI库Tkinter是否值得学习？</title><link href="https://vincentping.com/cn/the-reason-we-should-learn-tkinter-for-gui-application.html" rel="alternate"></link><published>2020-05-29T16:50:00+08:00</published><updated>2026-02-21T16:50:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2020-05-29:/cn/the-reason-we-should-learn-tkinter-for-gui-application.html</id><summary type="html">&lt;p&gt;Python语言可以用在很多方面，网站开发、数据分析、运营维护、游戏开发等等，那么桌面应用程序GUI呢？其实Python标准库里自带Tkinter就是干这个的。相比PyQT、wxPython等等，Tkinter有哪些优势和不足，是否值得学呢？&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Tkinter是什么？&lt;/h2&gt;
&lt;p&gt;要了解Tkinter，首先要从Tcl编程语言说起。Tcl语言全称是“Tool Command Language”，是John Ousterman在1980年代创建的一种解释型编程语言，当时John Ousterman正在加州大学Berkeley分校任职，需要一种相对简明的开发工程工具的编程语言，所以他就用C语言写了这个解释型语言，感觉故事是不是有点像Python！&lt;/p&gt;
&lt;p&gt;接下来，他又用C结合Tcl写了个专门用于GUI编程的库，叫着Tk。当年这个Tcl/Tk在1980、1990年代可是非常的流行，尤其是在学术界、工程界和Unx程序员中。&lt;/p&gt;
&lt;p&gt;而Tkinter又是什么呢？&lt;/p&gt;
&lt;p&gt;我们知道Python最早是在1994年发行其1.1版本的，标准库里需要各方面的库，包括文本处理、图像处理等等，当然也不能少了GUI。Guido van Rossum（Python语言创始人）觉得Tk这个库现成的，而且还挺好用，就不再另造轮子了。他用C语言写了个在Python中可以调用Tk的接口，再把Tcl/Tk一起打包在标准库里，这样Python就可以实现GUI的开发功能。而Python中的这个接口，就是Tkinter。&lt;/p&gt;
&lt;p&gt;你是不是会说“怎么能这样！”， 其实呢，这个也很正常啊，好东西，要大家一起分享嘛！不仅Python里是这么直接调用Tk库，Perl、Haskell里面的GUI库也是这个Tcl/Tk。&lt;/p&gt;
&lt;h2&gt;Tkinter值得学吗？&lt;/h2&gt;
&lt;p&gt;了解了上面这段Tcl、Tk和Tkinter的历史，我们再来谈谈这些是否值得学习。&lt;/p&gt;
&lt;p&gt;其实，任何技术的选择与否，都是看这种技术的特点是否适合你的需求场景。对于Tkinter来说，它的特点大致是这么几个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python标准库里缺省自带&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个Tkinter可以说，就相当于Python事实上的标准GUI库。有啥好处呢？有Python的地方就有Tkinter，不用另外找第三方库单独安装，从而避免一堆兼容、版本等等的问题，这个对于初学者就比较友好。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tkinter的API比较稳定&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;十几年前开发的工具，现在基本还能运行。Tcl/Tk从1990年代中后期，更新就非常慢了（基本就没变化），Tcl/Tk8.5版本一直用，直到2012年才憋出个8.6版本。更新慢也有好处，写的程序不会过几年就不好用了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tkinter就是个单纯的GUI库&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tkinter就是个单纯的GUI库，没有其他东西，真正要实现什么功能，都是依赖Python其他的库。不像PyQT、wxPython这些大而全的框架，什么都要自己弄一套。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;简洁&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个特点可以是优点：适合入门、小型应用的开发，但是也导致Tkinter的两大问题，一个是界面相对简陋，虽然现在Tk8.6有所进步，但是比起其他框架还是有不少差距；另一个是提供的组件都是比较基础的，稍微复杂一些的，比如HTML显示组件就要另外想办法。&lt;/p&gt;
&lt;p&gt;这么看，Tkinter适合什么场合下学习和使用呢？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如果你是初入门的Python程序员，对Python的基本语法已经有所了解，想做点小应用实践实践，那么推荐你可以学习Tkinter。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因为如果一直开发命令行应用，很多时候不直观，成就感比较低，不能促进进一步学习的兴趣。&lt;/p&gt;
&lt;p&gt;而如果这个时候，直接上手开发Web应用，还需要了解一堆html、css、js等前端的东西，比较麻烦，而且就算开发出来也就本机跑跑，真要部署到网络上还有域名、服务器一系列的问题。&lt;/p&gt;
&lt;p&gt;而学了Tkinter后，马上可以做一点小应用，比如本地文件管理小工具、看图片的应用、解压小应用……这些小应用的开发，实际上主要是对Python处理这些问题方法和库的了解，Tkinter只是封装一个UI。也就是说你其实是在进一步学习Python。当然，你也可以不断优化这些小工具，当成自己的定制化工具，甚至可以分享给朋友用用，乐趣无穷。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对于有一定基础的Python程序员，什么时候适合学下Tkinter呢？&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;需要写一些小工具的时候，本身是Python程序员，难免工作中需要一些桌面工具，解决些小问题，学习Tkinter绝对是投入少、产出高的选择。比如笔者以前同事做测试，一些配置工作很麻烦，且很易出错，这个时候用tkinter写个配置小工具，就方便很多。&lt;/p&gt;
&lt;p&gt;另一个是可以用Tkinter写一些应用原型。很多时候，一个应用的需求还不是很明确，可以用Tkinter先快速写一个，拿出来大家讨论，进一步明确需求。等真正需求明确了，再根据需求选择技术方案。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;总结下：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tkinter的特点，比较适合初学者学习Python、Python程序员开发一些小工具、Python程序员做原型应用。&lt;/p&gt;
&lt;p&gt;而如果你的目标是开发商用的桌面应用程序的话，那Tkinter可能不适用，建议还是使用PyQT或者直接使用其他语言如C++。&lt;/p&gt;</content><category term="Tech"></category><category term="Python"></category><category term="Tkinter"></category><category term="GUI"></category></entry><entry><title>站桩记录2：调身、调气和调心</title><link href="https://vincentping.com/cn/zhan-zhuang-note-002.html" rel="alternate"></link><published>2016-06-22T11:10:00+08:00</published><updated>2018-08-05T16:17:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2016-06-22:/cn/zhan-zhuang-note-002.html</id><summary type="html">&lt;p&gt;站桩的过程实际上首先就是“调身”的过程。“下紧上松”，从双脚开始，到膝盖，再到裆部的放松。上半身则要求头部顶悬、下颌微内收；松肩沉肘，双掌环抱。&lt;/p&gt;</summary><content type="html">&lt;p&gt;经过两个月的站桩练习，基本是一天两次，每次不少于30分钟，有一些体会。&lt;/p&gt;
&lt;h1&gt;1、站桩确实是一种“调身”的好方法。&lt;/h1&gt;
&lt;p&gt;调身，调整身体状态，意思是将身体调整到一种比较自然、放松的状态，这种自然放松不仅仅是外表，而且更包括内部器官的自然放松。&lt;/p&gt;
&lt;p&gt;站桩的过程实际上首先就是“调身”的过程。“下紧上松”，从双脚开始，到膝盖，再到裆部的放松。上半身则要求头部顶悬、下颌微内收；松肩沉肘，双掌环抱。&lt;/p&gt;
&lt;p&gt;一边要调整，寻找和体会每个部位的感受，该紧的紧，该松的松。如上次说的脚步的重心和膝盖的调整，要轻轻的晃动寻找位置；又比如上半身的松沉，还有胯部都要松下去等等，都需要在站桩过程中，不断去体会。&lt;/p&gt;
&lt;p&gt;而“调身”是“调气”和“调心”的基础。身体不能调整好，很难达到气脉顺畅、心中空灵。&lt;/p&gt;
&lt;p&gt;只有在身体调整到一定程度后，才能做到“气沉丹田”。当我们站桩过程中做到头顶悬、肩部放松、脊椎挺拔时，如果这个时候胯部一松，立刻就能体会到，呼吸就沉下去了。这个“沉”字用得特别好！&lt;/p&gt;
&lt;h1&gt;2、站桩只是一种运动方式，不要过分神话它。&lt;/h1&gt;
&lt;p&gt;喜欢一种运动，人们会觉得这种运动是最好的，这是人之常情，但是如果上升到觉得这种运动能包治百病，而随意吹捧，就有点过了。&lt;/p&gt;
&lt;p&gt;站桩，说到底也就是一种运动，和跑步、游泳、打篮球等等一样，能够对人的身体起到一定锻炼作用。所以站桩的同时，其他的运动都可以适度做做，尤其是一些肢体方面的锻炼。&lt;/p&gt;
&lt;p&gt;即使在中国功夫中，桩功也只是基本功的一种，其他还有腿功（压腿、踢腿、控腿等）、腰功等。&lt;/p&gt;
&lt;p&gt;我个人体会，站桩如果和压腿、踢腿结合起来，锻炼效果会比较好。&lt;/p&gt;
&lt;p&gt;另外，站桩也要适度，有些人说一定要长站，要站2、3个小时。这种长站的具体效果如何不清楚，但是我觉得运动一定不能太强求，否则再好的运动也很难持久坚持，还是顺其自然的好。&lt;/p&gt;
&lt;h1&gt;3、站桩过程中，尤其是初期，千万不要过分用意念。&lt;/h1&gt;
&lt;p&gt;在上个月的记录里，我也提到，站桩初期切忌用意念。经过有一个月的锻炼，这一点体会得更深。&lt;/p&gt;
&lt;p&gt;站桩既调身，其实也在调气，所以身体出现各种的感受非常正常，手脚的发热、气感，头部百会穴的气柱感，眉心印堂穴的发胀感，背部的热，甚至全身里外出现各种真气运行的感受。&lt;/p&gt;
&lt;p&gt;但是一旦过分加意念，气随意行，就会放大这种感受，时间一长，常常会引起身体的问题。&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;所以，我的原则就是放松心情和注意呼吸，实在不行就睁开眼。以前有句话叫“勿忘勿助”，张三丰的解释是：“神息相依，守其清静自然曰勿忘；顺其清静自然曰勿助。” 也就是说把心放在呼吸上，其他的就关照它、不管它。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="http://blog.sina.com.cn/s/blog_666e1c2c0101bgh9.html" target="_blank"&gt;重新审视浑圆功--兼述浑圆功心法形法之弊端&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Health"></category><category term="养生"></category><category term="气功"></category><category term="站桩"></category></entry><entry><title>站桩记录1：开始练习站桩</title><link href="https://vincentping.com/zh_cn/zhan-zhuang-ji-lu-1kai-shi-lian-xi-zhan-zhuang.html" rel="alternate"></link><published>2016-05-22T10:20:00+08:00</published><updated>2024-11-24T23:56:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2016-05-22:/zh_cn/zhan-zhuang-ji-lu-1kai-shi-lian-xi-zhan-zhuang.html</id><summary type="html">&lt;p&gt;最近看了一些关于站桩的资料，同时也接触了一些师傅，请教了养生的问题，大家都比较推崇站桩。于是决定试试。&lt;/p&gt;
&lt;h1&gt;养生桩练 …&lt;/h1&gt;</summary><content type="html">&lt;p&gt;最近看了一些关于站桩的资料，同时也接触了一些师傅，请教了养生的问题，大家都比较推崇站桩。于是决定试试。&lt;/p&gt;
&lt;h1&gt;养生桩练法&lt;/h1&gt;
&lt;p&gt;桩功有很多种，选择大成拳王芗斋先生的养生桩（混元桩）进行练习。简单要求如下（参见醒世无量先生的介绍&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;）：&lt;/p&gt;
&lt;p&gt;两脚平行舒适自然站立，与肩同宽；身体正直，成“一条线”状态；两手成半圆形环抱胸前，高不过肩，低不过肚脐，松肩沉肘，手指微张，两手十指相距30——40公分左右，两手心距离前胸约15——20公分左右；头正直，下颌内收，百会穴适度向上顶，双目微闭，口自然闭合，面带微笑，自然呼吸。膝关节“似弯非弯”，“似直非直”，双脚板平均受力，体重落在全身骨头上。&lt;/p&gt;
&lt;p&gt;总的姿势要求和原则是：松静、舒适、自然。&lt;/p&gt;
&lt;h1&gt;站桩记录&lt;/h1&gt;
&lt;p&gt;从2016年4月24日（星期天）开始练习站桩，每天早晚各一次，每次不少于20分钟。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;腿部颤抖。每次站一段时间，双腿就不由自主的开始颤抖，由小腿到大腿，再到臀部，尤其是尾椎骨抖动很厉害。开始站5分钟就开始抖动，站了几天后，一般10分钟后开始。站完后，双脚心特别热，尤其是右脚，如同火烧，并有麻涨感觉。&lt;/li&gt;
&lt;li&gt;双肩酸痛。可能双肩不够放松，微微调整，尽量放松。&lt;/li&gt;
&lt;li&gt;头顶百会穴有“头顶悬”的感觉，尤其是在微微晃动时感觉更为明显。不过分关注，顺其自然。&lt;/li&gt;
&lt;li&gt;两手心发热，两手指尖随着呼吸有一伸一缩的吸引力。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;经过一周的站桩试炼，感觉腿脚有力多了，同时对睡眠也有一定帮助。决定坚持下去。从第二周开始，每次站桩时间增加到：每天两次，每次不少于30分钟。&lt;/p&gt;
&lt;h2&gt;1. 站桩的脚部重心问题很重要&lt;/h2&gt;
&lt;p&gt;开始站桩，首先要从调整下肢开始，比如两脚平行，双膝微屈，膝盖不要过脚尖，胯部要放松，臀部微微后坐等等，但是最根本的是双脚的重心如何放。&lt;/p&gt;
&lt;p&gt;经过这段时间的锻炼，我发现一定要把重心主要放在脚掌上，用武国忠老师的原话是：“腿稍微往前弯曲一点，身体的全部重心落在脚掌的前三分之二处，这样，后脚跟就稍稍抬起来了，又不能完全抬起来，要像踩着一个蚂蚁似的，不能让它跑了，也不能把它踩死。”&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;有两天我把重心平放在脚上，站桩时间长后，脚后跟会特别疼痛，而且站完桩双腿很沉重。当我把重心平放脚上时，以前腿部那种不由自主的抖动也会减少，但是这种减少并非好事，因为不由自主的抖动一般表明气血活动得很剧烈，而且我的体会是，这种抖动越剧烈，事后身体越感觉到轻松。&lt;/p&gt;
&lt;p&gt;所以，站桩时，要有意识的让重心放在脚掌上，把握不好时，可以轻微的前后晃动，找到那个点。也不能太过，因为当重心太靠前时，很容易膝盖超过脚尖，站桩时间一长，膝盖就会出现疼痛的现象；而稍微靠后则会出现脚跟用力，站桩结束后也会出现脚跟疼痛、两腿发沉的问题。&lt;/p&gt;
&lt;p&gt;所以，我现在的解决办法，是轻微的前后晃动，寻找感觉以避免膝盖和脚跟太用力。&lt;/p&gt;
&lt;h2&gt;2. 站桩初期最好不要过分用意念&lt;/h2&gt;
&lt;p&gt;因为要体会“头顶悬”的感觉，所以本周有几天意念过于专注在头顶百会穴，而且随着呼吸，能感觉到百会穴也在一紧一松。但是这样的过分关注头顶后，几天下来，就出现头晕、头部侧面隐隐作痛（像偏头痛）等感觉，而且眼屎增加，这些明显都是“上火”的症状。&lt;/p&gt;
&lt;p&gt;我赶紧调整，减少专注头部，一天下来，这些症状就都消失了。&lt;/p&gt;
&lt;p&gt;所以，在站桩初期，尽量不要长期意守头部，如百会、眉心等处（敏感的人这些地方很容易有感觉），还是关注呼吸或者脚部比较好。当然，在调节放松身体时，可以逐渐关注身体各部位，如松胯、沉肩坠肘、头顶悬，但是检查之后，就要尽量把意念转回到呼吸或者脚底，这里可以随着呼吸使用脚趾抓地的方法，可以很好的把意念转走。&lt;/p&gt;
&lt;h2&gt;3. 站桩是提振阳气的好方法&lt;/h2&gt;
&lt;p&gt;阳气不足最明显的表现就是身体枝端气血不足，如头部会出现眼睛、耳朵、头发、牙齿的各种症状，而枝端手上，也会出现指甲变得扁平，指甲上出现竖纹、小月牙变小甚至没有了的问题。&lt;/p&gt;
&lt;p&gt;但是站桩一个月的实验下来，明显能感受到阳气得到了提振，这些天脚底和后背常常是暖乎乎的感觉，很舒服。&lt;/p&gt;
&lt;p&gt;同时，最近我观察我的牙龈，也有很明显的改善。原来牙龈的颜色比较深，以前牙医朋友曾告诉我，那是牙周炎的表现。两周下来，明显牙龈颜色变成很浅的那种肉色，而且牙龈出血也明显减少。&lt;/p&gt;
&lt;p&gt;同时人的精神头也好多了，以前早上醒过来常常喜欢赖床，但是这些天我早上醒过来不需要逼自己，就能自然地起来。这倒是让我想起自己小时候，早上醒来感觉自己如同一个压缩了一宿的弹簧，眼睛一睁，就想弹起来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="http://bbs.tianya.cn/post-805-109691-1.shtml" target="_blank"&gt;醒世无量：我对站桩等气功修炼问题的体认文集&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;&lt;a href="http://blog.sina.com.cn/s/blog_516b1559010098b0.html" target="_blank"&gt;武国忠：大道至简浑元桩&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="Health"></category><category term="养生"></category><category term="气功"></category><category term="站桩"></category></entry><entry><title>创意与验证：如何获得好的创意?——Udacity课程《产品设计》学习笔记2</title><link href="https://vincentping.com/cn/how-to-generate-ideas.html" rel="alternate"></link><published>2016-05-08T13:20:00+08:00</published><updated>2018-08-05T19:28:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2016-05-08:/cn/how-to-generate-ideas.html</id><summary type="html">&lt;p&gt;要想有一个好的创业点子，一定要对所做的事情有激情。千万不要只是为了创业而去创业。我们之所以要创业，是因为要解决一个问题，一个会让我们日夜寻思的问题。&lt;/p&gt;</summary><content type="html">&lt;p&gt;在《&lt;a href="https://www.udacity.com/course/product-design--ud509" target="_blank"&gt;产品设计&lt;/a&gt;》这门课中，一共包括四方面的内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创意与验证：主要介绍如何获得创意并评估这些创意的好坏，同时还会介绍一些技巧，以验证自己的产品在市场上是否能有一席之地。&lt;/li&gt;
&lt;li&gt;用户体验与用户交互：介绍产品在用户体验和用户交互方面应该关注的一些要点。这里的目的不是为了让大家成为交互设计师，而是希望大家能了解产品设计中需要考虑的一些与用户体验相关的关键点和一些产品设计中的基本元素。&lt;/li&gt;
&lt;li&gt;产品原型：在一个经过验证的想法基础上，利用第二部分中用户体验的相关知识，在这部分我们要建设一个产品APP的原型或者网站的雏形，并学习如何在很短的时间内就获取用户的真实反馈。这是谷歌风投和一些创业公司如&lt;a href="http://www.nest.com/" target="_blank"&gt;Nest&lt;/a&gt;和&lt;a href="https://bluebottlecoffee.com/" target="_blank"&gt;Blue Bottle Coffee&lt;/a&gt;在实际中使用的相同方法。&lt;/li&gt;
&lt;li&gt;关键指标：这部分将学习一些重要的衡量指标，这样我们就能知道如何改善产品和提高业务。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在整个课程中，会有一些与最终项目相关的任务需要完成，到课程结束时，你将经历一个从产品创意的获得、研究、验证到通过产品原型测试用户获取反馈的完整过程。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;首先，要想有一个好的创业点子，一定要对所做的事情有激情。千万不要只是为了创业而去创业。我们之所以要创业，是因为要解决一个问题，一个会让我们日夜寻思的问题。&lt;/p&gt;
&lt;p&gt;一家好公司常常来源于一个好点子，好点子大致是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;解决一个新问题，例如谷歌解决网络资料的搜索问题；&lt;/li&gt;
&lt;li&gt;扩展现有的解决方案，例如Udacity为用户提供一个负担得起、按需的技能培训教育；&lt;/li&gt;
&lt;li&gt;行业突破，如Uber为拼车提供了一个更简单的方法。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;创意的分类&lt;/h1&gt;
&lt;p&gt;为了帮助我们找到属于自己的创意，下面进一步介绍创意的分类：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先是&lt;strong&gt;简化类创意&lt;/strong&gt;，这类创意的目标就是简化一个过程或者任务的完成。&lt;br /&gt;
    比如Instagram提供一个app叫&lt;a href="http://blog.instagram.com/post/114416360957/layout-from-instagram" target="_blank"&gt;Layout&lt;/a&gt;，可以把照片通过定制的布局合并成一张照片，这大大简化了照片的合并。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;移植类创意&lt;/strong&gt;，也就是把一个现有的创意移植到一个新的领域或市场。这个是我们中国人擅长的！其实印度人也很擅长。&lt;br /&gt;
    比如&lt;a href="http://www.flipkart.com/" target="_blank"&gt;Flipkart&lt;/a&gt;就是一个移植类创意，它把Amazon移植到印度，同时他们基于对印度本地市场的了解，为客户提供一些独家服务。&lt;/li&gt;
&lt;li&gt;第三是&lt;strong&gt;虚拟类创意&lt;/strong&gt;，这类创意把一些行为虚拟化到网络空间。&lt;br /&gt;
    比如如果你要处理税务，&lt;a href="https://www.turbotax.com" target="_blank"&gt;TurboTax&lt;/a&gt;可以电子化你的税务表格，甚至直接从手机或者掌上电脑发送。再比如要打车，&lt;a href="https://www.lyft.com/" target="_blank"&gt;Lyft&lt;/a&gt;让这个过程非常方便，直接在手机上就能操作。&lt;br /&gt;
    对于这种类型的创意，要充分利用现有的各类技术，比如Lyft就利用手机上带的GPS定位为用户提供叫车服务。&lt;/li&gt;
&lt;li&gt;第四是&lt;strong&gt;混合类创意&lt;/strong&gt;，这类创意奖两个或更多的创意混合在一起。&lt;br /&gt;
    &lt;a href="https://slack.com/" target="_blank"&gt;Slack&lt;/a&gt;，一个在线信息工具就是典型的混合类创意。在这个工具中，你可以管理邮件，聊天，建立私有群等，并且可以搜索所有内容。
5.最后是&lt;strong&gt;不可能的创意&lt;/strong&gt;，或者叫“几乎不可能”的创意。&lt;br /&gt;
    比如&lt;a href="https://www.google.com/loon/" target="_blank"&gt;Google的Loon&lt;/a&gt; 项目，试图利用氦气球为农村或者其他边远地区提供互联网服务。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;很多创意可以有好多不同的分类特性。&lt;/p&gt;
&lt;p&gt;比如&lt;a href="https://www.shyp.com/" target="_blank"&gt;Shyp&lt;/a&gt;，这是一个提供发送信件和快递的APP。用户只需要选择物品，使用手机拍照，然后设置发货目的地，下单发货。接下来，Shyp公司就会安排其他的工作，如上门取件，找到最低价格、最可靠的发货方式帮用户完成发货。在这个应用创意中，就包括简化、移植和虚拟化三种特性。&lt;/p&gt;
&lt;p&gt;再比如&lt;a href="https://curofy.com/" target="_blank"&gt;Curofy&lt;/a&gt;，这是一家印度公司，其应用类似于LinkedIn，但是只针对医生。医生在这个手机应用中查询彼此的信息，讨论案例，获取最新的医学新闻等。这个创意就包括了简化、移植、虚拟化和混合四种特性。&lt;/p&gt;
&lt;h1&gt;观察和倾听&lt;/h1&gt;
&lt;p&gt;平时要学会多去观察，多去倾听和沟通（备注：观察、倾听和沟通也是要学习的啊！），看看大家都有些什么样的抱怨和问题。要尽量确保你的主意是真正地解决了问题，而不是解决一个不存在的问题，这就需要你多多与用户沟通。&lt;/p&gt;
&lt;p&gt;同时，最好的问题常常是你自己亲身经历的，而且要解决这样的问题你的动力就会大，这将使你在面对挫折时能始终坚持。所以多去关注你感兴趣的行业和事物。&lt;/p&gt;
&lt;p&gt;课程中采访了Arron Harris，他以前也是一个创业者，创建了Tutorspree，目前是&lt;a href="https://www.ycombinator.com/" target="_blank"&gt;Y-Combinator&lt;/a&gt;的一个合伙人。&lt;/p&gt;
&lt;p&gt;他认为没有什么简单唯一的方法找到一个好点子，但是好点子都有一个共性：“通常诞生在人们试图解决他们自己的问题，他们真正了解的问题时”。&lt;/p&gt;
&lt;p&gt;比如Dropbox就是一个好例子。创始人Drew对于每次传文件，用U盘拷来拷去很烦。为了解决这个问题，他想到了云存储。现在我们会觉得在一个互联网的时代还要那么用U盘传文件太傻了，但是在2007年，云存储的概念还没有，当时Arron还在使用Gmail保存自己的文件，以防本地电脑出问题，或者到其他地方需要用到这个文件（备注，我现在也常常这么用邮箱）。&lt;/p&gt;
&lt;p&gt;当然也有一些创业者，尤其是有开发背景的创业者，他们有时候是先有一个好的技术方面的想法，再反过来寻找可以解决的问题。这也是可行的，但是在真正开发前，一定要走出去与用户交流沟通，以确定所解决的问题是用户真正需要的。&lt;/p&gt;
&lt;p&gt;对于创业来说，创意和人谁更重要，以前一般都认为创业者最重要，但是现在大家逐渐明白创业者和点子都很重要。创业者不一定是最聪明，但是必须要能坚定的推进，否则再好的点子也没用。同时点子也很重要，如果点子不靠谱，那么再好再坚定的创业者也没用。&lt;/p&gt;
&lt;h1&gt;找到你自己的点子&lt;/h1&gt;
&lt;p&gt;怎么找到自己的创意，可以试试“头脑风暴”的方式：用一分钟时间，在一张纸上写下你想到的所有问题。然后，再用一分钟，写下你所能想到的解决方案。&lt;/p&gt;
&lt;p&gt;在这个过程中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;绝不要说“不”&lt;/li&gt;
&lt;li&gt;没有“坏”的点子&lt;/li&gt;
&lt;li&gt;不要急着下判断&lt;/li&gt;
&lt;li&gt;避免那些热门词&lt;/li&gt;
&lt;li&gt;保持活力&lt;/li&gt;
&lt;li&gt;支持态度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;除了“脑力风暴”，也可以到苹果的&lt;a href="https://www.apple.com/itunes/charts/free-apps/" target="_blank"&gt;App Store&lt;/a&gt;或者谷歌的&lt;a href="https://play.google.com/store" target="_blank"&gt;Play Store&lt;/a&gt;站点，仔细浏览下前100位的应用，说不定你就能找到自己的创意灵感。看应用下面用户的点评，这样就能更好地了解用户的想法。&lt;/p&gt;
&lt;p&gt;一些要注意的问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;审视你的动机。如果你觉得一个产品创意很棒，但是自己却完全没有使用的兴趣，那么很可能你还没有开发完就已经嫌烦了，最终不了了之。相反，当你开发一个很有激情的产品时，你的兴趣会保证你能一直坚持推进该产品的开发。&lt;/li&gt;
&lt;li&gt;KISS原则。保持简单和直接（KISS. Keep it simple, stupid.）我们常常会不由自主地开发一个大而全的产品，千万别这样。否则你的产品会太复杂，没人会用。&lt;/li&gt;
&lt;li&gt;不要担心创意已经有人用了。举个例子，苹果的App Store上有超过100万的各种应用app，创造一个完全新产品的可能性非常之小。即使已经存在类似产品，也有改进的空间。同时，类似产品的存在也说明这个有市场。相反，如果你要开发的产品没有竞争者，常常意味着没有人会需要这个。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最后，Udacity提供了一些文章和视频，可以为我们寻找灵感提供帮助：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ycombinator.com/rfs/" target="_blank"&gt;Y Combinator's Request for Startups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://paulgraham.com/startupideas.html" target="_blank"&gt;How to Get Startup Ideas&lt;/a&gt; - 中文版《&lt;a href="http://select.yeeyan.org/view/267061/334786" target="_blank"&gt;如何获得创业灵感&lt;/a&gt;》&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wsj.com/articles/SB10001424127887324445904578283792526004684" target="_blank"&gt;How Entrepreneurs Come Up With Great Ideas&lt;/a&gt; - 中文版《&lt;a href="http://www.bigear.cn/news-627-100058.html" target="_blank"&gt;创业灵感源自何处？&lt;/a&gt;》&lt;/li&gt;
&lt;li&gt;Ted演讲视频&lt;a href="http://www.ted.com/talks/lang/eng/tim_brown_on_creativity_and_play.html" target="_blank"&gt;Creativity and Play&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ted演讲视频&lt;a href="http://www.ted.com/talks/lang/eng/tim_harford.html" target="_blank"&gt;Trial, Error, and the God Complex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ted演讲视频&lt;a href="http://www.ted.com/talks/lang/eng/matt_cutts_try_something_new_for_30_days.html" target="_blank"&gt;Try Something New For 30 Days&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Tech"></category><category term="产品"></category><category term="创意"></category><category term="Udacity"></category></entry><entry><title>Breeze，让无车者也能成为Uber/Lyft司机</title><link href="https://vincentping.com/cn/breeze-help-uber-lyft-driver.html" rel="alternate"></link><published>2016-04-28T16:10:00+08:00</published><updated>2018-08-06T10:09:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2016-04-28:/cn/breeze-help-uber-lyft-driver.html</id><summary type="html">&lt;p&gt;对于Uber和Lyft这样的打车平台来说，随着对出行市场的占有率越来越高，他们面对的问题和别的行业有所不同。对于他们来说，获取用户非常简单，甚至太简单了，导致现在他们常常面临的问题是：用户太多，而司机太少。&lt;/p&gt;</summary><content type="html">&lt;p&gt;对于Uber和Lyft这样的打车平台来说，随着对出行市场的占有率越来越高，他们面对的问题和别的行业有所不同。对于他们来说，获取用户非常简单，甚至太简单了，导致现在他们常常面临的问题是：用户太多，而司机太少。&lt;/p&gt;
&lt;p&gt;Uber和Lyft都公开承认这一点，他们希望能有更多人加入司机的行列，为他们提供驾驶服务。&lt;/p&gt;
&lt;p&gt;为了解决这种供需不平衡的问题，这些公司都推出交通高峰期“加价”的政策，以吸引司机提供服务。同时，Uber还提供一种金融服务，为司机买车提供低息贷款。&lt;/p&gt;
&lt;p&gt;我们都知道“有需求的地方，就有生意机会”。那么打车平台对更多司机的需求，是不是一个生意机会呢？&lt;/p&gt;
&lt;h1&gt;Breeze的前因后果&lt;/h1&gt;
&lt;p&gt;初创企业Breeze就是针对这个需求而来的。很多人想成为Uber或Lyft司机，但是没有车，Breeze就租车给他们运营，然后每周收取租车的费用。&lt;/p&gt;
&lt;p&gt;故事要从2013年底开始说起，当时Jeff Pang想到了这个点子，但是他不确定市场需求怎么样，于是他搭建了一个简单的网页，叫ZephyrCar (http://www.zephyrcar.com/)，然后在Craigslist分类广告网站发了个小广告，以检验市场反应。很快，市场的反应让他感觉很振奋。[最低成本的验证想法]&lt;/p&gt;
&lt;p&gt;于是他和他在HomeJoy的同事Ned Ryan、Charlie Fang一起，进一步调研这个市场，他们加入Uber和Lyft以体验司机的需求，Pang甚至参加出租车司机的培训，并在出租车公司租了辆medallion运营了几个星期。他们还刷他们的信用卡看看能不能买几辆车试试。[进一步了解市场和用户需求]&lt;/p&gt;
&lt;p&gt;但是很快他们意识到刷信用卡的方式完全不行，最后他们找到一家神秘的商业伙伴愿意租新车给他们。[寻找需要的资源]&lt;/p&gt;
&lt;p&gt;到这时，他们才从HomeJoy辞职，然后成立了公司，改名为&lt;a href="http://www.joinbreeze.com/" target="_blank"&gt;Breeze&lt;/a&gt;，在办公室边上的街角租了个停车场，很快招募到了50位司机和25辆车。这个时候是2014年的4月。&lt;/p&gt;
&lt;p&gt;经过两年的发展，Breeze已经获得了一些投资人的关注，也据说得到Mark Cuban[1999年其创立的网络公司Broadcast.com被雅虎公司以五十九亿美元的天价收购，如今市NBA达拉斯小牛队的拥有者]的投资。至2016年4月，他们已经在六个城市开通服务，包括旧金山、洛杉矶、西雅图、芝加哥、波士顿和华盛顿DC。&lt;/p&gt;
&lt;h1&gt;Breeze的商业模型和问题&lt;/h1&gt;
&lt;p&gt;司机租用一辆Toyota Prius，首先一次性费用是$99，然后每周租金$195。同时每周有600英里的行程限制，超过部分会另收费0.15美元/英里。&lt;/p&gt;
&lt;p&gt;市面上还有很多公司提供类似的租车服务，但是主要都是一些传统的租车公司，而不像Breeze这样是一家初创企业。目前他们遇到的问题大致有这么几个：&lt;/p&gt;
&lt;h2&gt;1、保险问题&lt;/h2&gt;
&lt;p&gt;目前Uber和Lyft这样的打车平台都还在想办法解决汽车保险的问题，他们还不能为司机提供全天候的商业运营保险。这个时候再加入Beeeze这样的公司，这时就要包括以下五个角色了：Uber这样的打车平台、汽车司机、汽车乘客、第三方、Breeze这样的汽车出租公司。这个保险产品怎么设计，成本多少？目前还没有答案。&lt;/p&gt;
&lt;p&gt;目前Breeze是让司机购买个人保险，但是这种保险不可能同时针对打车平台Uber和Lyft，还加上Breeze推荐司机提供的其他服务，如送货服务Instacart等。&lt;/p&gt;
&lt;p&gt;保险是个问题！&lt;/p&gt;
&lt;h2&gt;2、价格竞争问题&lt;/h2&gt;
&lt;p&gt;每周租金$195是比较贵的，Uber的金融服务其实和Breeze有竞争关系，曾经也发生过Uber取消从Breeze租车司机账号的事情，当然现在解决了。但是竞争关系依然存在。&lt;/p&gt;
&lt;p&gt;同时，与很多区域性的租车公司会有竞争。&lt;/p&gt;
&lt;h2&gt;3、服务问题&lt;/h2&gt;
&lt;p&gt;在Yelp上有关于Breeze的点评，其中有很多负面的，主要是服务问题，比如周租金太高，司机不能有任何意外[如生病]，否则租金延后就会停止服务；如果要求退出时，有很多的要求，如还车钱要去专门公司非常严格的验车、维修费用很高等。&lt;/p&gt;
&lt;p&gt;Breeze本质上是一家汽车金融服务公司，这样的公司如果服务跟不上的话，很难保持其竞争力。&lt;/p&gt;
&lt;h1&gt;关于共享平台的一点思考&lt;/h1&gt;
&lt;p&gt;共享经济现在已经非常普及了，有共享汽车（Uber、Lyft、滴滴）、共享住房（AirBnb）等，其中从业人员的数目已经非常庞大，比如Uber2015年就称其平台上活跃司机数超过100万，而滴滴2016年4月发布报告称其平台上的司机人数已超过1330万。&lt;/p&gt;
&lt;p&gt;那么这么多的从业人员，其本身就是一个市场，专门针对这个市场开发用户需要的产品，不失为一个好主意，比如电台、网站、培训、教程、订餐等等。&lt;/p&gt;
&lt;p&gt;有一个例子，&lt;a href="http://therideshareguy.com/" target="_blank"&gt;Harry G Campbell的个人博客&lt;/a&gt;，从2014年5月开始，Harry在这个网站上提供针对司机的各种信息，目前全球排名达到92,620。&lt;/p&gt;
&lt;p&gt;国内也有“&lt;a href="http://www.upxuan.com/" target="_blank"&gt;滴滴专车招聘司机&lt;/a&gt;”，“&lt;a href="http://www.youbusiji.com/" target="_blank"&gt;优步司机网&lt;/a&gt;”这样类似的网站。&lt;/p&gt;</content><category term="Tech"></category><category term="产品"></category><category term="创意"></category></entry><entry><title>创业者应该具有怎样的素质？——Udacity课程《产品设计》学习笔记1</title><link href="https://vincentping.com/cn/what-traits-tech-founder-must-have.html" rel="alternate"></link><published>2016-04-20T08:25:00+08:00</published><updated>2018-08-06T10:21:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2016-04-20:/cn/what-traits-tech-founder-must-have.html</id><summary type="html">&lt;p&gt;企业家是否能够培养？这本身就是一个问题。一个企业家所扮演的角色非常广泛，除了企业内的经营管理工作，还有很多企业外的作用，所以要找到一个简单的成功公式非常困难。&lt;/p&gt;</summary><content type="html">&lt;p&gt;Udacity的&lt;a href="https://www.udacity.com/course/tech-entrepreneur-nanodegree--nd007" target="_blank"&gt;科技企业家（Tech Entrepreneur）微学位认证项目&lt;/a&gt;主要教授：如何设计开发一个赢利的技术产品，并在该产品上创建一个成功的企业。&lt;/p&gt;
&lt;p&gt;该项目由Udacity和Google联合推出，内容不仅包括理论知识，也有具体的实践，以指导学生如何将一个创新点子转换成适合市场的产品。&lt;/p&gt;
&lt;p&gt;《&lt;a href="https://www.udacity.com/course/product-design--ud509" target="_blank"&gt;产品设计&lt;/a&gt;》课程是“科技企业家”项目的第一门课，介绍近年来一些硅谷公司的实践和经验，讲解怎么创造出实用新颖而又有市场价值的产品。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;企业家是否能够培养？这本身就是一个问题。一个企业家所扮演的角色非常广泛，除了企业内的经营管理工作，还有很多企业外的作用，所以要找到一个简单的成功公式非常困难。&lt;/p&gt;
&lt;p&gt;因此我们只能针对具体的案例进行分析和讲解，从而总结出企业家应该具有的素质。当然这些素质也只是成功的一些必要条件，真正能否成功还有很多其他变数：经济环境、市场环境甚至家庭因素等等，当然还有运气。&lt;/p&gt;
&lt;h1&gt;Optimizely和Locket&lt;/h1&gt;
&lt;p&gt;课程首先介绍了两家创业公司：&lt;/p&gt;
&lt;p&gt;&lt;img alt="pete koomen in optimizely" height="337" src="https://vincentping.com/images/pete_koomen_in_optimizely.jpg" width="600"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.optimizely.com/" target="_blank"&gt;Optimizely&lt;/a&gt;是一家提供站点/应用优化的公司，提供测试、个性化和优化服务，从而提高站点/应用的用户转化率(conversion rate)。他们的第一家客户是一家新成立的为海地地震灾区筹款的基金组织，他们的服务使该基金网站的筹款用户转化率提高了10%。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.getlocket.com/" target="_blank"&gt;Locket&lt;/a&gt;提供手机待机锁屏APP，最初创业时他们的想法是提供锁屏广告，帮用户出租锁屏获取收入。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;APP发布后非常受欢迎，第一个月就获得100万的用户，但是因为未来用户量无法预测，从而无法开始销售广告；同时广告付费的周期问题导致需要很大的融资(广告发布结束后3个月才能得到广告主的付款，而给用户的广告收入要提前支出)，也就是说他们的商业模式存在问题。&lt;/p&gt;
&lt;p&gt;于是他们迅速进行了调整，从广告模式转变到提供相关内容的模式，也即用户每次看手机屏幕时，该APP会推送一些相关的信息给用户。&lt;/p&gt;
&lt;p&gt;通过测试，他们觉得内容模式可行，然后开始为一些meetup公司有偿提供内容通道。&lt;/p&gt;
&lt;p&gt;当然，在这个商业模式转换过程中，用户群也发生了变化。在前者的情况，用户群是一些每月$3 - $5的广告受众，而在内容模式中，用户是那些对内容感兴趣的人。&lt;/p&gt;
&lt;h1&gt;创业体会&lt;/h1&gt;
&lt;p&gt;然后，两家创业公司的创始人分别介绍了他们对创新企业家的理解，以及他们在创业过程中的体会：&lt;/p&gt;
&lt;p&gt;&lt;img alt="yunha in lockety" height="338" src="https://vincentping.com/images/yunha_in_locket.jpg" width="600"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Locket的Yunha坦诚自己在工作中很强势，有时候没有耐心，虽然自己也很难受，但是为了推进任务的完成，不得不这样。
对于产品的开发很有满足感，比如看到一个产品从纸面设计到实际投入市场。&lt;/p&gt;
&lt;p&gt;当被问到：什么技能是创业者必须具备的时，她的回答是：
对于自己的想法不能太顽固，要把它当作一个实验，验证其有效性。而不能这么想：“这个想法是我的梦想，我一定要干成”，而不能接受想法的失败。其实作为实验，最差的结果也就是，这个想法失败了，自己也不知道为什么失败，是想法本身的问题，还是执行的问题？&lt;/p&gt;
&lt;p&gt;所以，一个想法失败了，但是从中知道了原因，其实就已经是成功，成功在于你通过这个“实验”进步了。也就是说，失败是一种可能的结果，但是最好知道为什么。&lt;/p&gt;
&lt;p&gt;当然最好能很快就证明这个想法失败了，而不是拖很长时间再发现这个“实验”失败了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optimizely的Pete Koomen认为：努力的工作，一些运气，不断的沟通，但是最重要的是要能面对自己想法的失败，从失败中总结经验教训，并锲而不舍的努力。&lt;/p&gt;
&lt;p&gt;对于“什么样的技能对于开始创业非常重要？”这个问题，他的回答是：
一个是“应变”能力，事情发展不如预期时，要能接受并重头再来；必须对“不”字感到自在，因为作为创业者，你会听到很多的“不”字。
第二个是“走出去”，一个产品只有在真正掌握了用户需求的时候，才是有用的，否则都是无用功。而要真正了解用户需求，必须花足够的时间“走出去”。&lt;/p&gt;
&lt;p&gt;要对自己的创业想法始终保持一种怀疑态度，除非它能让用户心甘情愿的付费。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;学习心得&lt;/h1&gt;
&lt;p&gt;那么，作为一个创业者，到底需要哪些素质呢？我的理解是，作为创业者：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先心态上一定要保持开放。对于创业，要像爱迪生搞发明创造一样，把创业看成不断地实验，不断去验证一些假设，在不断失败的实验中，最终找到成功的方法。所以当我们有一个想法或者一个目标，我们就应该启动一系列的实验，实验1、2、3……，然后通过这些实验的结果指标做出正确的判断。&lt;/li&gt;
&lt;li&gt;对于“创业”这件事本身，我们创业者要学会放轻松，一个想法的失败并不是一个创业者的失败。&lt;/li&gt;
&lt;li&gt;加强沟通能力，合伙人之间的沟通，与用户之间进行的沟通，要充分了解用户各种层次的真实需求。&lt;/li&gt;
&lt;li&gt;强大的执行力，面对各种困难和市场诱惑，能坚定地按照自己的计划推进。&lt;/li&gt;
&lt;li&gt;最后则是，努力的工作。&lt;/li&gt;
&lt;/ul&gt;</content><category term="Tech"></category><category term="创业"></category><category term="Udacity"></category></entry><entry><title>Instacart创业者早期的故事</title><link href="https://vincentping.com/cn/beginning-story-of-instacart-apoorva-mehta.html" rel="alternate"></link><published>2016-04-16T13:25:00+08:00</published><updated>2018-08-06T11:19:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2016-04-16:/cn/beginning-story-of-instacart-apoorva-mehta.html</id><summary type="html">&lt;p&gt;故事从2010年1月说起，80后的Apoorva Mehta在亚马逊已经工作了2年，作为一个开发工程师，他在亚马逊学到了很多，但同时也开始对公司里缓慢官僚的气氛有些感到厌倦，他希望有所改变。&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://instacart.com/" target="_blank"&gt;Instacart&lt;/a&gt;是一家生鲜食品网络采购平台，相当于生鲜食品采购的Uber/滴滴打车模式：用户通过Instacart应用下订单，附近的采购人员接单，去应用支持的商店购买物品，然后运送给用户，这里的采购人员并不属于Instacart，类似于滴滴打车里司机的角色。而Instacart应用本身只是一个软件平台，它没有自己的商店、货物、采购运送人员或者汽车等。&lt;/p&gt;
&lt;p&gt;Instacart成立于2012年7月，到2016年4月，已经完成六轮融资，累计2.75亿美金，最近2016年3月的投资来自Whole Foods Market（投资金额未公开）。如今市值超过20亿美金。&lt;/p&gt;
&lt;h1&gt;创业是一种梦想&lt;/h1&gt;
&lt;p&gt;故事从2010年1月说起，80后的Apoorva Mehta在亚马逊已经工作了2年，作为一个开发工程师，他在亚马逊学到了很多，但同时也开始对公司里缓慢官僚的气氛有些感到厌倦，他希望有所改变。由于一直都有创业的梦想，他开始参加西雅图的各种投资人、创业者的聚会。在聚会上，大家讨论着各种他从未听说过的概念，可转换债券、A轮投资、天使投资、风险投资、客户、企业家……。面对这种情况，年轻的Apoorva并没有气馁，他开始努力学习创业相关的知识，阅读各种书籍，尽量和投资者、创业者进行交流沟通。同时因为本身是技术开发人员，Apoorva在一边了解创业知识的同时，一边利用自己的业余时间构想并开发一些产品。&lt;/p&gt;
&lt;p&gt;但是很快，随着他创业的念头越来越强，开发自己产品投入的精力越来越多，他在亚马逊的同事们开始感到奇怪：Apoorva作为一个后台工程师，他的电脑上为什么总是打开着专门开发苹果手机端应用的Xcode软件？这时，Apoorva意识到他必须做出选择：离开亚马逊专职构思自己的创业计划。于是在2010年的6月，Apoorva从亚马逊辞职。&lt;/p&gt;
&lt;p&gt;在辞职整整四年后的一次演讲中，他说，当时他感到非常担心和不确定。因为当时的他并没有明确创业的方向，他所抱有的只是一个创业的梦想，而且这个想法越来越强烈。&lt;/p&gt;
&lt;p&gt;&lt;img alt="apoorva mehta" src="https://vincentping.com/images/apoorva_mehta.jpg" style="margin: 10px; float: center;"&gt;&lt;/p&gt;
&lt;h1&gt;不要为了创业而创业&lt;/h1&gt;
&lt;p&gt;告别亚马逊，告别西雅图，Apoorva很快背上行囊搬到了阳光明媚的旧金山，这里是IT创业的天堂。在旧金山，他很快找到一位合作者，大家一起开始了共同的创业生涯。&lt;/p&gt;
&lt;p&gt;生活从来都不可能一帆风顺，创业更是如此。在接下来的时间里，Apoorva和他的搭档尝试了各种各样的创业构想，比如针对广告商的分析平台，又比如专门做食品的GroupOn式拍卖产品……，他们总共开发了不下20种产品，但是结果都只有一个：失败。&lt;/p&gt;
&lt;p&gt;转眼离Apoorva辞职已经有12个月的时间了，他开始怀疑自己当年离开亚马逊的决断是否正确，甚至怀疑自己是否适合创业。就在这个时候，他们又想到了一个点子：“针对律师的社交网络”。律师们可以通过这个网络建立联系、分享想法。他们认为这是一个非常棒的主意，因为美国的律师市场非常庞大，他们相信这个产品一定会带领他们走出失败，创造辉煌！&lt;/p&gt;
&lt;p&gt;于是他们开始开发产品、招募人员、寻找投资……一派红火场面。但是他们忽略了一件事，一件对于创业、对于产品开发至关重要的事情：他们并不了解律师，如同后来Apoorva承认的，他完全没有和律师一起合作和工作的任何经历。换句话说，Apoorva和他的搭档在为他们没什么了解的用户开发产品，并试图通过该产品解决一个他们也不知道对方有没有的问题。&lt;/p&gt;
&lt;p&gt;结果不难猜到，经过又是半年的打拼，在不断的与律师进行交流、不断的调整产品的思路之后，Apoorva终于认识到，这个“面向律师的社交网络”还是失败。最终他选择退出这个最初的创业团队。&lt;/p&gt;
&lt;p&gt;一年半创业失败的经历教育了Apoorva，让他终于认识到：创业的目的不能是为了创业，创业的目的应该是为了解决一个你非常在意的问题。&lt;/p&gt;
&lt;h1&gt;解决真正的问题&lt;/h1&gt;
&lt;p&gt;无论在西雅图还是在旧金山，Apoorva一直以来都不喜欢去超市、食品杂货店买食物，每次又不得不去采购些吃的喝的。他讨厌在超市里一道一道的找，选好了还要排个长长的队结账，最后好不容易运回家，突然发现自己少买了几样必需品！&lt;/p&gt;
&lt;p&gt;已经都什么年代了，大家在网络上买书、买衣服、买包、买电视冰箱、买汽车、买彩票……，可是人们还是必须每周去食品杂货店和各类超市里，以这种非常低效的方式购买自己的生活必需品。&lt;/p&gt;
&lt;p&gt;Apoorva认识到自己的这个问题，他也充分了解自己的需求。于是在2012年春天，他开始开发一个新产品：Instacart，专门针对食杂购买的一款应用。&lt;/p&gt;
&lt;p&gt;在开发Instacart时，Apoorva告诉自己，不完成开发就再也不去食杂店！于是直到2012年6月2日，他终于完成了开发，然后他在Instacart上下了第一个订单，接着自己再充当采购人员，去食杂店按照订单完成采购，最终运回给自己！——这是Instacart上的第一笔生意，而且马上开始赢利:-)&lt;/p&gt;
&lt;p&gt;很快，Apoorva周围的朋友纷纷主动开始使用这个产品，这是他创业两年来第一次有了产品受欢迎的感受，而不是像过去的20多个产品那样，每次都要请求周围的人去接受、去试用。Apoorva相信这次他选对了产品！&lt;/p&gt;
&lt;h1&gt;绝不轻言放弃&lt;/h1&gt;
&lt;p&gt;有了一个受欢迎而且可以赢利的产品，Apoorva马上开始着手融资。他找到位于硅谷的著名孵化器机构Y Combinator，但是当时已经超过项目申请截止日期2个月了。尽管如此，Apoorva对自己的产品非常有信心，他相信只要YC的投资者体验了Instacart，他们一定会接受他的申请。&lt;/p&gt;
&lt;p&gt;于是，他发动他的所有关系，24小时之内联系到YC的一些投资人，希望能加入申请。然后他焦急地等待回音。一个接着一个，回复都是：“绝对不行，太晚了！”。直到最后他收到Garry Tan的回复说：“你可以填一个延迟的申请表，但是现在想加入几乎不可能了”。正是因为这“几乎”两字，Apoorva看到了一线希望。同时他意识到，这些YC的投资人都并不知道Instacart是干什么用的，也不知道Instacart的与众不同。于是他打开应用，给Garry Tan订了6瓶啤酒，发送到位于硅谷的YC总部所在地。&lt;/p&gt;
&lt;p&gt;不久Apoorva就接到了Garry Tan的电话，让他次日前往YC总部见面。第二天，Apoorva与YC的四位投资者进行了一个小时的会谈，他们询问了关于Instacart产品的各种问题，最后当他离开时，对方告诉他如果YC有投资意向，会和他联系的。久混职场的人都知道，这常常是一种客气拒绝的方法，而当Apoorva心灰意冷准备接受又一次失败时，十分钟后他就接到了YC的电话，他被YC孵化器录取了，获得了种子投资。&lt;/p&gt;
&lt;p&gt;至此，Apoorva和他的Instacart开始进入了快速发展阶段。&lt;/p&gt;
&lt;p&gt;下面是Instacart累计获得的投资：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2012年6月， 种子投资（未公开）&lt;/li&gt;
&lt;li&gt;2012年10月，种子投资（$2.3M)&lt;/li&gt;
&lt;li&gt;2013年4月，A轮（$8.5M）&lt;/li&gt;
&lt;li&gt;2014年6月，B轮（$44M）&lt;/li&gt;
&lt;li&gt;2015年1月，C轮（$220M）&lt;/li&gt;
&lt;li&gt;2016年3月，未公开&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;从Apoorva的创业故事里，我们可以发现，对于创业者来说，一定要有从失败中快速恢复的能力，抱有梦想重头再来，因为每一次新的尝试都有可能是成功的开始。而在具体的操作中，产品的构思和设计又是至关重要的。&lt;/p&gt;</content><category term="Tech"></category><category term="创业"></category><category term="Instacart"></category></entry><entry><title>美式音标练习笔记——“李阳疯狂英语手势突破发音”</title><link href="https://vincentping.com/cn/american-phonetic-practice-notes.html" rel="alternate"></link><published>2015-12-28T15:12:00+08:00</published><updated>2018-08-06T11:29:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2015-12-28:/cn/american-phonetic-practice-notes.html</id><summary type="html">&lt;p&gt;本文是我为了练习美式英语而学习美式音标的笔记，采用了“李阳疯狂英语手势突破发音”教程。&lt;/p&gt;</summary><content type="html">&lt;p&gt;本文是我为了练习美式英语而学习美式音标的笔记，采用了“李阳疯狂英语手势突破发音”教程。&lt;/p&gt;
&lt;p&gt;该教程可以网上书店里买到，也可以在&lt;a href="http://www.youtube.com/" target="_blank"&gt;youtube.com&lt;/a&gt;（海外）和&lt;a href="http://www.youku.com/" target="_blank"&gt;youku.com&lt;/a&gt;（国内）网站上，使用“手势突破发音”作为关键词进行查询，找到对应的视频。&lt;/p&gt;
&lt;p&gt;整个教程视频一共13段，除去片头和片尾，实际上只需学习中间10段就可以了，每段平均2-3分钟，整个视频大概只有半小时。&lt;/p&gt;
&lt;p&gt;视频时间虽然不长，但是要真正完全掌握，还是需要下一番功夫的。我觉得需要注意以下几点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;最好把每个单词的音标都标注出来，因为我们练习得就是音标，标注出来可以让我们发音更加明确、有信心。（后面的练习笔记里我已经全部标注了音标。）&lt;/li&gt;
&lt;li&gt;要使用“疯狂英语”的“三最法”进行疯狂练习。“三最法”：最大声（Loudly）、最快速（Quickly）和最清晰（Clearly）。&lt;/li&gt;
&lt;li&gt;要使用录音设备录下自己的发音，和原音进行比较，不断矫正。因为声音在我们头部内的传送，导致我们自己听到的声音和别人听到的我们的声音是不一样的。&lt;/li&gt;
&lt;li&gt;对于自己特别有问题的发音，比如很多人有的/n/和/l/不分、卷舌音的问题，要特别加强训练。&lt;/li&gt;
&lt;li&gt;开始时主要关注发音，等训练一段时间后，要全面模仿例句的重音、语调和节奏。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最后，关于音标体系，美式音标和我们小时候学的国际音标有很多不同，我为了标注音标，查询了很多的字典网站，通过比较，最后采用的是&lt;a href="http://www.macmillandictionary.com/" target="_blank"&gt;Macmillan字典网站&lt;/a&gt;上的美式音标。这里有该字典网站采用的&lt;a href="http://www.macmillandictionary.com/us/pronunciation/american/phonetic" target="_blank"&gt;音标表&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;你可以下载本文的&lt;a href="https://vincentping.com/pdfs/20151228_american-phonetic-practice-notes.pdf"&gt;pdf版本《美式音标练习笔记》&lt;/a&gt;参考。&lt;/p&gt;
&lt;h1&gt;1. 元音部分&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;前元音 “长衣音”     / i /&lt;/strong&gt;                                                                                      英音 [ i: ]&lt;/p&gt;
&lt;p&gt;Please /pliz/&lt;/p&gt;
&lt;p&gt;Please speak English with me. /pliz/ /spik/ /ˈɪŋɡlɪʃ/ /wɪθ/ /mi/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;前元音 “短衣音”     / ɪ /&lt;/strong&gt;                                                                                    英音 [ i ]&lt;/p&gt;
&lt;p&gt;Difficult /ˈdɪfɪkəlt/&lt;/p&gt;
&lt;p&gt;It’s not difficult to speak English. /ɪts/ /nɑt/ /ˈdɪfɪkəlt/ /tə/ /spik/ /ˈɪŋɡlɪʃ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;前元音 “45度音”     / e /&lt;/strong&gt;                                                                                    英音 [ e ]&lt;/p&gt;
&lt;p&gt;Bed /bed/ red /red/ everything /ˈevriˌθɪŋ/&lt;/p&gt;
&lt;p&gt;Go to bed. /ɡoʊ/ /tu/ /bed/&lt;/p&gt;
&lt;p&gt;Everything is ready. /ˈevriˌθɪŋ/ /ɪz/ /ˈredi/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;前元音 “90度大嘴音”     /æ/&lt;/strong&gt;                                                                                英音 [ æ ] [ a: ]&lt;/p&gt;
&lt;p&gt;Apple /ˈæp(ə)l/ practice /ˈpræktɪs/&lt;/p&gt;
&lt;p&gt;Practice makes perfect. /ˈpræktɪs/ /meɪks/ /ˈpɜrfɪkt/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中元音 “短啊音”       /ʌ/&lt;/strong&gt;                                                                                        英音 [ʌ]&lt;/p&gt;
&lt;p&gt;Wonderful /ˈwʌndərfəl/&lt;/p&gt;
&lt;p&gt;My mother is a wonderful teacher.&lt;/p&gt;
&lt;p&gt;/maɪ/ /ˈmʌðər/ /ɪz/ /ə/ /ˈwʌndərfəl/ /ˈtitʃər/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中元音 "重读卷舌音"     /ɜr/&lt;/strong&gt;                                                                                英音 [ ə: ]&lt;/p&gt;
&lt;p&gt;Work /wɜrk/ first /fɜrst/ perfect /ˈpɜrfɪkt/&lt;/p&gt;
&lt;p&gt;He speaks perfect English. /hi/ /spiks/ /ˈpɜrfɪkt/ /ˈɪŋɡlɪʃ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中元音 "轻读卷舌音"      /ər/&lt;/strong&gt;                                                                                  英音[ ə ]&lt;/p&gt;
&lt;p&gt;Remember /rɪˈmembər/&lt;/p&gt;
&lt;p&gt;Remember to call your mother. /rɪˈmembər/ /tu/ /kɔl/ /jʊr/ /ˈmʌðər/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;中元音 “短鹅音”     /ə/&lt;/strong&gt;                                                                                          英音 [ ə ]&lt;/p&gt;
&lt;p&gt;Together /təˈɡeðər/&lt;/p&gt;
&lt;p&gt;America and China should always work together.&lt;/p&gt;
&lt;p&gt;/əˈmerɪkə/ /ænd/ /ˈtʃaɪnə/ /ʃʊd/ /ˈɔlˌweɪz/ /wɜrk/ /təˈɡeðər/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;后元音 “感叹祖国大好山河音”     /ɑ/&lt;/strong&gt;                                                                       英音 [ a: ] [ ɔ ]&lt;/p&gt;
&lt;p&gt;Possible /ˈpɑsəb(ə)l/ bother /ˈbɑðər/&lt;/p&gt;
&lt;p&gt;Sorry to bother you. /ˈsɔri/ /tu/ /ˈbɑðər/ /ju/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;后元音 “大嘴卷舌音”      /ɑr/&lt;/strong&gt;                                                                                   英音 [ a: ]&lt;/p&gt;
&lt;p&gt;Charming /ˈtʃɑrmɪŋ/&lt;/p&gt;
&lt;p&gt;You’re very charming. /jʊr/ /ˈveri/ /ˈtʃɑrmɪŋ/&lt;/p&gt;
&lt;p&gt;You’re a charming young man. /jʊr/ /ə/ /ˈtʃɑrmɪŋ/ /jʌŋ/ /mæn/&lt;/p&gt;
&lt;p&gt;You have a charming smile. /ju/ /hæv/ /ə/ /ˈtʃɑrmɪŋ/ /smaɪl/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;后元音 “中嘴长元音”       /ɔ/&lt;/strong&gt;                                                                                     英音 [ ɔ: ]&lt;/p&gt;
&lt;p&gt;Always /ˈɔlˌweɪz/&lt;/p&gt;
&lt;p&gt;Always say “please” and “thank you”.&lt;/p&gt;
&lt;p&gt;/ˈɔlˌweɪz/ /seɪ/ /pliz/ /ænd/ /θæŋk/ /ju/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;后元音 “中嘴卷舌音”       /ɔr/&lt;/strong&gt;                                                                                    英音 [ ɔ: ]&lt;/p&gt;
&lt;p&gt;Important /ɪmˈpɔrt(ə)nt/&lt;/p&gt;
&lt;p&gt;It’s important to practice English every day.&lt;/p&gt;
&lt;p&gt;/ɪts/ /ɪmˈpɔrt(ə)nt/ /tu/ /ˈpræktɪs/ /ˈɪŋɡlɪʃ/ /ˈevri/ /deɪ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;后元音 “经典收小腹减肥圆唇短乌音”      /ʊ/&lt;/strong&gt;                                                              英音 [ u ]&lt;/p&gt;
&lt;p&gt;Should /ʃʊd/&lt;/p&gt;
&lt;p&gt;You should work harder. /ju/ /ʃʊd/ /wɜrk/ /hɑrdər/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;后元音 “长乌音”         /u/&lt;/strong&gt;                                                                                           英音 [ u: ]&lt;/p&gt;
&lt;p&gt;Food /fud/&lt;/p&gt;
&lt;p&gt;What’s your favorite food? Chinese food.&lt;/p&gt;
&lt;p&gt;/wɑts/ /jʊr/ /ˈfeɪv(ə)rɪt/ /fud/ ? /ˌtʃaɪˈniz/ /fud/&lt;/p&gt;
&lt;p&gt;My favorite food is noodles. /maɪ/ /ˈfeɪv(ə)rɪt/ /fud/ /ɪz/ /ˈnud(ə)lz/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;合口双元音 “嘴角咧到耳朵上”       /eɪ/&lt;/strong&gt;                                                                       英音 [ ei ]&lt;/p&gt;
&lt;p&gt;Mistake /mɪˈsteɪk/&lt;/p&gt;
&lt;p&gt;Don’t be afraid of making mistakes.&lt;/p&gt;
&lt;p&gt;/doʊnt/ /bi/ /əˈfreɪd/ /əv/ /ˈmeɪkɪŋ/ /mɪˈsteɪks/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;合口双元音 “大嘴阿姨音”       /aɪ/&lt;/strong&gt;                                                                              英音 [ ai ]&lt;/p&gt;
&lt;p&gt;China /ˈtʃaɪnə/ smile /smaɪl/ fly /flaɪ/ time /taɪm/ I /aɪ/&lt;/p&gt;
&lt;p&gt;Is this your first time in China? /ɪz/ /ðɪs/ /jʊr/ /fɜrst/ /taɪm/ /ɪn/ /ˈtʃaɪnə/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;合口双元音 “中嘴短衣音”       /ɔɪ/&lt;/strong&gt;                                                                             英音 [ ɔi ]&lt;/p&gt;
&lt;p&gt;Enjoy /ɪnˈdʒɔɪ/&lt;/p&gt;
&lt;p&gt;I really enjoyed talking to you. /aɪ/ /ˈriəli/ /ɪnˈdʒɔɪd/ /ˈtɔkɪŋ/ /tu/ /ju/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;合口双元音 “舀水音”           /oʊ/&lt;/strong&gt;                                                                                    英音 [əu]&lt;/p&gt;
&lt;p&gt;Smoke /smoʊk/ hope /hoʊp/&lt;/p&gt;
&lt;p&gt;I hope to see you again. /aɪ/ /hoʊp/ /tu/ /si/ /ju/ /əˈɡen/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;合口双元音 “鬼哭狼嚎音”      /aʊ/&lt;/strong&gt;                                                                                英音 [au]&lt;/p&gt;
&lt;p&gt;How /haʊ/ outstanding /aʊtˈstændɪŋ/&lt;/p&gt;
&lt;p&gt;You’re outstanding. /jʊr/ /aʊtˈstændɪŋ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;集中双元音 “短衣卷舌音”       /ɪr/&lt;/strong&gt;                                                                                英音 [ iə ]&lt;/p&gt;
&lt;p&gt;Clear /klɪr/&lt;/p&gt;
&lt;p&gt;It’s very important to have clear pronunciation.&lt;/p&gt;
&lt;p&gt;/ɪts/ /ˈveri/ /ɪmˈpɔrt(ə)nt/ /tu/ /hæv/ /klɪr/ /prəˌnʌnsiˈeɪʃ(ə)n/&lt;/p&gt;
&lt;p&gt;You have very clear pronunciation. Retarded /rɪˈtɑrdəd/&lt;/p&gt;
&lt;p&gt;/ju/ /hæv/ /ˈveri/ /klɪr/ /prəˌnʌnsiˈeɪʃ(ə)n/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;集中双元音 “咧嘴卷舌音”       /er/&lt;/strong&gt;                                                                                英音 [ εə ]&lt;/p&gt;
&lt;p&gt;care /ker/&lt;/p&gt;
&lt;p&gt;We should all care about the environment.&lt;/p&gt;
&lt;p&gt;/wi/ /ʃʊd/ /ɔl/ /ker/ /əˈbaʊt/ /ðə/ /ɪnˈvaɪrənmənt/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;集中双元音 “短乌卷舌音”       /ʊr/&lt;/strong&gt;                                                                                 英音 [uə]&lt;/p&gt;
&lt;p&gt;Sure /ʃʊr/&lt;/p&gt;
&lt;p&gt;I’m sure you’ll enjoy it. /aɪm/ /ʃʊr/ /jul/ /ɪnˈdʒɔɪ/ /ɪt/&lt;/p&gt;
&lt;p&gt;I’m sure you’ll like China. /aɪm/ /ʃʊr/ /jul/ /laɪk/ /ˈtʃaɪnə/&lt;/p&gt;
&lt;p&gt;I’m sure we’ll have a good time. /aɪm/ /ʃʊr/ /wil/ /hæv/ /ə/ /ɡʊd/ /taɪm/&lt;/p&gt;
&lt;p&gt;I’m sure you’re going to speak good English.&lt;/p&gt;
&lt;p&gt;/aɪm/ /ʃʊr/ /jʊr/ /ˈɡoʊɪŋ/ /tə/ /spik/ /ɡʊd/ /ˈɪŋɡlɪʃ/&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;短鹅音 /ə/ ：about [英] [ə’baut] [美] [ə’baʊt]&lt;/p&gt;
&lt;p&gt;轻读卷舌音 /ər/ ：teacher [英] [‘ti:tʃə] [美] ‘titʃər]&lt;/p&gt;
&lt;p&gt;这个“轻读卷舌音”是美式英语才有的，英式英语没有。英式和美式的一个明显区别是，单词的拼写中出现字母r，都要卷舌。&lt;/p&gt;
&lt;h1&gt;2. 辅音部分&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/p/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Possible /ˈpɑsəb(ə)l/ impossible /ɪmˈpɑsəb(ə)l/&lt;/p&gt;
&lt;p&gt;Nothing is impossible. /ˈnʌθɪŋ/ /ɪz/ /ɪmˈpɑsəb(ə)l/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/b/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Baby /ˈbeɪbi/ believe /bɪˈliv/&lt;/p&gt;
&lt;p&gt;Believe in yourself. /bɪˈliv/ /ɪn/ /jʊrˈself/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/t/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Time /taɪm/&lt;/p&gt;
&lt;p&gt;Don’t waste time. /doʊnt/ /weɪst/ /taɪm/ water /ˈwɔtər/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/d/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Decide /dɪˈsaɪd/&lt;/p&gt;
&lt;p&gt;Decide to study English. /dɪˈsaɪd/ /tu/ /ˈstʌdi/ /ˈɪŋɡlɪʃ/&lt;/p&gt;
&lt;p&gt;Let me know what you decide. /let/ /mi/ /noʊ/ /wɑt/ /ju/ /dɪˈsaɪd/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/k/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Keep /kip/&lt;/p&gt;
&lt;p&gt;Keep up the good work. /kip/ /ʌp/ /ðə/ /ɡʊd/ /wɜrk/ 再接再厉&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/g/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Government /ˈɡʌvərnmənt/&lt;/p&gt;
&lt;p&gt;Our government does a good job. /aʊr/ /ˈɡʌvərnmənt/ /dʌz/ /ə/ /ɡʊd/ /dʒɑb/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/f/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Feel /fil/&lt;/p&gt;
&lt;p&gt;I feel a little sick today. /aɪ/ /fil/ /ə/ /ˈlɪt(ə)l/ /sɪk/ /təˈdeɪ/&lt;/p&gt;
&lt;p&gt;I feel great today. /aɪ/ /fil/ /ɡreɪt/ /təˈdeɪ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/v/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Very good /ˈveri/ /ɡʊd/&lt;/p&gt;
&lt;p&gt;Leave /liv/&lt;/p&gt;
&lt;p&gt;When are you leaving? /wen/ /ɑr/ /ju/ /ˈlivɪŋ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/s/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nervous /ˈnɜrvəs/&lt;/p&gt;
&lt;p&gt;You’re never nervous. /jʊr/ /ˈnevər/ /ˈnɜrvəs/&lt;/p&gt;
&lt;p&gt;Don’t be nervous. Relax. /doʊnt/ /bi/ /ˈnɜrvəs/, /rɪˈlæks/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/z/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Business /ˈbɪznəs/&lt;/p&gt;
&lt;p&gt;Do you do a lot of business in China?&lt;/p&gt;
&lt;p&gt;/du/ /jʊ/ /du/ /ə/ /lɑt/ /əv/ /ˈbɪznəs/ /ɪn/ /ˈtʃaɪnə/&lt;/p&gt;
&lt;p&gt;You buy a lot of cheap stuff here and sell in America.&lt;/p&gt;
&lt;p&gt;/jʊ/ /baɪ/ /ə/ /lɑt/ /əv/ /tʃip/ /stʌf/ /hɪr/ /ænd/ /sel/ /ɪn/ /əˈmerɪkə/&lt;/p&gt;
&lt;p&gt;I build it here and sell it in America.&lt;/p&gt;
&lt;p&gt;/aɪ/ /bɪld/ /ɪt/ /hɪr/ /ænd/ /sel/ /ɪt/ /ɪn/ /əˈmerɪkə/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/ʃ/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Special /ˈspeʃ(ə)l/ English /ˈɪŋɡlɪʃ/&lt;/p&gt;
&lt;p&gt;This is a special local dish. /ðɪs/ /ɪz/ /ə/ /ˈspeʃ(ə)l/ /ˈloʊk(ə)l/ /dɪʃ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/ʒ/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pleasure /ˈpleʒər/&lt;/p&gt;
&lt;p&gt;It’s a pleasure to be here today. /ɪts/ /ə/ /ˈpleʒər/ /tu/ /bi/ /hɪr/ /təˈdeɪ/&lt;/p&gt;
&lt;p&gt;It’s my pleasure. /ɪts/ /maɪ/ /ˈpleʒər/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/θ/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bathroom /ˈbæθˌrum/&lt;/p&gt;
&lt;p&gt;I need to use the bathroom. /aɪ/ /nid/ /tu/ /juz/ /ðə/ /ˈbæθˌrum/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/ð/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Weather whether /ˈweðər/&lt;/p&gt;
&lt;p&gt;Are you used to the weather here? /ɑr/ /jʊ/ /ˈjust tu/ /ðə/ /ˈweðər/ /hɪr/&lt;/p&gt;
&lt;p&gt;Yes, I’m local. /jes/ /aɪm/ /ˈloʊk(ə)l/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/h/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Help /help/&lt;/p&gt;
&lt;p&gt;Let me help you. /let/ /mi/ /help/ /jʊ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/r/&lt;/strong&gt;      “四指卷舌音”，它还有个光荣称号叫“美国发音最具特色音”&lt;/p&gt;
&lt;p&gt;Terrific /təˈrɪfɪk/&lt;/p&gt;
&lt;p&gt;You look terrific today. /jʊ/ /lʊk/ /təˈrɪfɪk/ /təˈdeɪ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/tʃ/&lt;/strong&gt;       破擦音&lt;/p&gt;
&lt;p&gt;Change /tʃeɪndʒ/&lt;/p&gt;
&lt;p&gt;China is changing every day. /ˈtʃaɪnə/ /ɪz/ /ˈtʃeɪndʒɪŋ/ /ˈevri/ /deɪ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/dʒ/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Knowledge /ˈnɑlɪdʒ/ language /ˈlæŋɡwɪdʒ/&lt;/p&gt;
&lt;p&gt;I love knowledge. /aɪ/ /lʌv/ /ˈnɑlɪdʒ/&lt;/p&gt;
&lt;p&gt;English is an international language.&lt;/p&gt;
&lt;p&gt;/ˈɪŋɡlɪʃ/ /ɪz/ /ən/ /ˌɪntərˈnæʃən(ə)l/ /ˈlæŋɡwɪdʒ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/m/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Memory /ˈmem(ə)ri/&lt;/p&gt;
&lt;p&gt;I have a good memory. /aɪ/ /hæv/ /ə/ /ɡʊd/ /ˈmem(ə)ri/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/n/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Number /ˈnʌmbər/&lt;/p&gt;
&lt;p&gt;Can you give me your telephone number?&lt;/p&gt;
&lt;p&gt;/kæn/ /jʊ/ /ɡɪv/ /mi/ /jʊr/ /ˈteləˌfoʊn/ /ˈnʌmbər/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/ŋ/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Wrong /rɔŋ/&lt;/p&gt;
&lt;p&gt;Is there anything wrong? /ɪz/ /ðer/ /ˈeniˌθɪŋ/ /rɔŋ/&lt;/p&gt;
&lt;p&gt;Nothing is wrong. /ˈnʌθɪŋ/ /ɪz/ /rɔŋ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/l/&lt;/strong&gt;          “舌边音” 清楚的 一般在音节的头部&lt;/p&gt;
&lt;p&gt;Learn /lɜrn/&lt;/p&gt;
&lt;p&gt;Learn something new every day. /lɜrn/ /ˈsʌmθɪŋ/ /nu/ /ˈevri/ /deɪ/&lt;/p&gt;
&lt;p&gt;That’s my motto of life. /ðæts/ /maɪ/ /ˈmɑtoʊ/ /əv/ /laɪf/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/l/&lt;/strong&gt;          模糊的，一般在音节的中间和后面&lt;/p&gt;
&lt;p&gt;helpful /ˈhelpfəl/&lt;/p&gt;
&lt;p&gt;You’re very helpful. /jʊr/ /ˈveri/ /ˈhelpfəl/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/w/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Welcome /ˈwelkəm/&lt;/p&gt;
&lt;p&gt;You are welcome to join us. /jʊ/ /ɑr/ /ˈwelkəm/ /tə/ /dʒɔɪn/ /ʌs/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/j/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yesterday /ˈjestərˌdeɪ/&lt;/p&gt;
&lt;p&gt;I arrived yesterday morning. /aɪ/ /əˈraɪvd/ /ˈjestərˌdeɪ/ /ˈmɔrnɪŋ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/tr/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Trouble /ˈtrʌb(ə)l/&lt;/p&gt;
&lt;p&gt;I don’t want to trouble you. /aɪ/ /doʊnt/ /wɑnt/ /tu/ /ˈtrʌb(ə)l/ /jʊ/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/dr/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Drink /drɪŋk/&lt;/p&gt;
&lt;p&gt;What would you like to drink? /wɑt/ /wʊd/ /jʊ/ /laɪk/ /tu/ /drɪŋk/&lt;/p&gt;
&lt;p&gt;I’d like to drink water. /aɪd/ /laɪk/ /tu/ /drɪŋk/ /ˈwɔtər/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/ts/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lots /lɑts/&lt;/p&gt;
&lt;p&gt;I have lots of friends from all over the world.&lt;/p&gt;
&lt;p&gt;/aɪ/ /hæv/ /lɑts/ /əv/ /frendz/ /frɑm/ /ɔl/ /ˈoʊvər/ /ði/ /wɜrld/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;/dz/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Words /wɜrdz/&lt;/p&gt;
&lt;p&gt;Words can’t express how grateful I am.&lt;/p&gt;
&lt;p&gt;/wɜrdz/ /kænt/ /ɪkˈspres/ /haʊ/ /ˈɡreɪtfəl/ /aɪ/ /æm/  &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;3. 容易混淆的单词&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Will /wɪl/&lt;/li&gt;
&lt;li&gt;Well /wel/&lt;/li&gt;
&lt;li&gt;Wall /wɔl/&lt;/li&gt;
&lt;li&gt;War /wɔr/&lt;/li&gt;
&lt;li&gt;Where /wer/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Word /wɜrd/&lt;/li&gt;
&lt;li&gt;World /wɜrld/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Very well /ˈveri/ /wel/&lt;/li&gt;
&lt;li&gt;Very weird /ˈveri/ /wɪrd/&lt;/li&gt;
&lt;li&gt;Very wild /ˈveri/ /waɪld/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kind /kaɪnd/&lt;/li&gt;
&lt;li&gt;Important /ɪmˈpɔrt(ə)nt/&lt;/li&gt;
&lt;li&gt;Solve /sɑlv/&lt;/li&gt;
&lt;/ul&gt;</content><category term="Edu"></category><category term="教育"></category><category term="英语"></category><category term="学习"></category></entry><entry><title>如何去除Joomla 3网站静态化URL地址中的分类ID和文章ID</title><link href="https://vincentping.com/cn/remove-category-article-id-from-url-in-joomla-3.html" rel="alternate"></link><published>2015-10-01T17:33:00+08:00</published><updated>2026-02-20T17:12:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2015-10-01:/cn/remove-category-article-id-from-url-in-joomla-3.html</id><summary type="html">&lt;p&gt;Joomla是一个非常专业的网站内容管理系统（CMS），但是其在SEO搜索引擎优化后的URL模式上有一些不足。这里记录了我的一些改进方法。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;目前本站使用工具直接生成静态页面，不再使用Joomla!，此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;一、问题&lt;/h1&gt;
&lt;p&gt;我的站点vincentping.com是使用Joomla 3.4.4版本管理的，Joomla是一个非常专业的网站内容管理系统（CMS），但是其在SEO搜索引擎优化后的URL模式上有一些不足。&lt;/p&gt;
&lt;p&gt;我首先创建了一些分类和文章，然后在系统管理后台的"Global Configuration"设置"SEO Settings"。其中的选项&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Search Engine Friendly URLs 设为 Yes&lt;/li&gt;
&lt;li&gt;use URL Rewriting 设为 Yes&lt;/li&gt;
&lt;li&gt;Adds Suffix to URL 也设为 Yes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如下图：&lt;/p&gt;
&lt;p&gt;&lt;img alt="seo setting" src="https://vincentping.com/images/seo-setting.png" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;这个时候访问站点，文章的URL地址变成如下这样的形式：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://www.vincentping.com/cn/8-blogcn/14-remove-category-article-id-from-url-in-joomla-3-cn.html&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;相对于原来没有SEO优化前的地址：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://www.vincentping.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=14:remove-category-article-id-from-url-in-joomla-3-cn&amp;amp;catid=8&amp;amp;lang=cn&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;上面的优化地址要好得多了，但是还有一些小小的不爽，比如在分类前的8-和文章名之前的14-。很显然这些数值都是数据库中的ID值，这样程序在查找后台数据库时，有了这些值会更加高效，但是对于普通访问者来说，这些数值就显得有些奇怪，而且会让站点显得不够专业，不够”高大上“！&lt;/p&gt;
&lt;p&gt;怎么办呢？经过在google上查询，网上有大量的相关讨论。经过不断地摸索和尝试，下面是我最终使用的解决办法。&lt;/p&gt;
&lt;h1&gt;二、解决方法&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在Joomla系统的目录下，找到下面php文章：“components/com_content/router.php“；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查找到下面代码：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$advanced = $params-&amp;gt;get('sef_advanced_link', 0);&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把其中 "0" 改为 "1"，修改结果如下：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$advanced = $params-&amp;gt;get('sef_advanced_link', 1);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在这个router.php文件中共有两处需要修改的地方。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;继续在该router.php文件中，找到下面的代码段，然后注释掉：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strpos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;view&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;article&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;注释成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strpos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;view&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;article&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;然后整个修改就完成了！&lt;/p&gt;
&lt;p&gt;这个时候，该页面的URL地址变成：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://www.vincentping.com/cn/remove-category-article-id-from-url-in-joomla-3-cn.html&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;提示：一旦以后Joomla版本升级，上述的修改可能被覆盖，就需要重新做。&lt;/p&gt;
&lt;h1&gt;三、一些其他可以尝试的方法&lt;/h1&gt;
&lt;p&gt;我在网络上搜索解决方法时，发现这个URL中数值问题对于Joomla社区已经是一个很”古老“的问题了，但是在核心代码中一直没有得到解决。所以市面上已经出现了许多的解决办法。下面这些方法都可以试试：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用第三方的SEF扩展，比如Sh404SEF，JoomSEF和SEF Advance等。可以到&lt;a href="http://extensions.joomla.org/" target="_blank"&gt;JED(Joomla! Extensions Directory)&lt;/a&gt; 搜索”SEF“，就可以找到很多类似扩展。扩展的问题是很多需要付费，会增加服务器负担，而且升级和维护起来也是个问题。&lt;/li&gt;
&lt;li&gt;如果你对正则表达式比较熟悉，可以在.htaccess文件中增加解析和重定向规则来解决这些问题。当然使用太多.htaccess规则是会影响服务器效率的。&lt;/li&gt;
&lt;li&gt;最后，如果你的站点不大，文章也不多，那么可以像上面介绍的建立菜单项的方法，为每篇文章都建立一个菜单项，这个文章数值问题也能完全解决。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果想继续仔细研究下这个URL中的文章ID数值问题，推荐大家可以看看这个在Joomla官方论坛上的帖子："&lt;a href="http://forum.joomla.org/viewtopic.php?f=712&amp;amp;t=826165" target="_blank"&gt;Remove article id from url for joomla 3.0&lt;/a&gt;"。&lt;/p&gt;</content><category term="Tech"></category><category term="Joomla"></category></entry><entry><title>如何去除Joomla 3网站静态化URL地址中的分类ID和文章ID</title><link href="https://vincentping.com/cn/remove-category-article-id-from-url-in-joomla-3.html" rel="alternate"></link><published>2015-10-01T17:33:00+08:00</published><updated>2026-02-20T17:12:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2015-10-01:/cn/remove-category-article-id-from-url-in-joomla-3.html</id><summary type="html">&lt;p&gt;Joomla是一个非常专业的网站内容管理系统（CMS），但是其在SEO搜索引擎优化后的URL模式上有一些不足。这里记录了我的一些改进方法。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;目前本站使用工具直接生成静态页面，不再使用Joomla!，此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;一、问题&lt;/h1&gt;
&lt;p&gt;我的站点vincentping.com是使用Joomla 3.4.4版本管理的，Joomla是一个非常专业的网站内容管理系统（CMS），但是其在SEO搜索引擎优化后的URL模式上有一些不足。&lt;/p&gt;
&lt;p&gt;我首先创建了一些分类和文章，然后在系统管理后台的"Global Configuration"设置"SEO Settings"。其中的选项&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Search Engine Friendly URLs 设为 Yes&lt;/li&gt;
&lt;li&gt;use URL Rewriting 设为 Yes&lt;/li&gt;
&lt;li&gt;Adds Suffix to URL 也设为 Yes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如下图：&lt;/p&gt;
&lt;p&gt;&lt;img alt="seo setting" src="https://vincentping.com/images/seo-setting.png" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;这个时候访问站点，文章的URL地址变成如下这样的形式：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://www.vincentping.com/cn/8-blogcn/14-remove-category-article-id-from-url-in-joomla-3-cn.html&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;相对于原来没有SEO优化前的地址：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://www.vincentping.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=14:remove-category-article-id-from-url-in-joomla-3-cn&amp;amp;catid=8&amp;amp;lang=cn&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;上面的优化地址要好得多了，但是还有一些小小的不爽，比如在分类前的8-和文章名之前的14-。很显然这些数值都是数据库中的ID值，这样程序在查找后台数据库时，有了这些值会更加高效，但是对于普通访问者来说，这些数值就显得有些奇怪，而且会让站点显得不够专业，不够”高大上“！&lt;/p&gt;
&lt;p&gt;怎么办呢？经过在google上查询，网上有大量的相关讨论。经过不断地摸索和尝试，下面是我最终使用的解决办法。&lt;/p&gt;
&lt;h1&gt;二、解决方法&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在Joomla系统的目录下，找到下面php文章：“components/com_content/router.php“；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查找到下面代码：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$advanced = $params-&amp;gt;get('sef_advanced_link', 0);&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把其中 "0" 改为 "1"，修改结果如下：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$advanced = $params-&amp;gt;get('sef_advanced_link', 1);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在这个router.php文件中共有两处需要修改的地方。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;继续在该router.php文件中，找到下面的代码段，然后注释掉：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strpos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;view&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;article&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;注释成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strpos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;view&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;article&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;然后整个修改就完成了！&lt;/p&gt;
&lt;p&gt;这个时候，该页面的URL地址变成：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://www.vincentping.com/cn/remove-category-article-id-from-url-in-joomla-3-cn.html&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;提示：一旦以后Joomla版本升级，上述的修改可能被覆盖，就需要重新做。&lt;/p&gt;
&lt;h1&gt;三、一些其他可以尝试的方法&lt;/h1&gt;
&lt;p&gt;我在网络上搜索解决方法时，发现这个URL中数值问题对于Joomla社区已经是一个很”古老“的问题了，但是在核心代码中一直没有得到解决。所以市面上已经出现了许多的解决办法。下面这些方法都可以试试：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用第三方的SEF扩展，比如Sh404SEF，JoomSEF和SEF Advance等。可以到&lt;a href="http://extensions.joomla.org/" target="_blank"&gt;JED(Joomla! Extensions Directory)&lt;/a&gt; 搜索”SEF“，就可以找到很多类似扩展。扩展的问题是很多需要付费，会增加服务器负担，而且升级和维护起来也是个问题。&lt;/li&gt;
&lt;li&gt;如果你对正则表达式比较熟悉，可以在.htaccess文件中增加解析和重定向规则来解决这些问题。当然使用太多.htaccess规则是会影响服务器效率的。&lt;/li&gt;
&lt;li&gt;最后，如果你的站点不大，文章也不多，那么可以像上面介绍的建立菜单项的方法，为每篇文章都建立一个菜单项，这个文章数值问题也能完全解决。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果想继续仔细研究下这个URL中的文章ID数值问题，推荐大家可以看看这个在Joomla官方论坛上的帖子："&lt;a href="http://forum.joomla.org/viewtopic.php?f=712&amp;amp;t=826165" target="_blank"&gt;Remove article id from url for joomla 3.0&lt;/a&gt;"。&lt;/p&gt;</content><category term="Tech"></category><category term="Joomla"></category></entry><entry><title>Remove Category and Article ID from URL in Joomla 3</title><link href="https://vincentping.com/en/remove-category-article-id-from-url-in-joomla-3.html" rel="alternate"></link><published>2015-10-01T17:13:00+08:00</published><updated>2026-02-20T17:12:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2015-10-01:/en/remove-category-article-id-from-url-in-joomla-3.html</id><summary type="html">&lt;p&gt;Joomla is a very professional content management system (CMS), but there're some minor shortcoming within the SEO URL Mapping.&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;This site has moved to a web site static generator to manage the content, and here is just a backup for reference.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Problem&lt;/h1&gt;
&lt;p&gt;I installed Joomla 3.4.4 on my vincentping.com site. &lt;/p&gt;
&lt;p&gt;After created some categories and articles, I just wanna try the "SEO Settings" in the "Global Configuration".&lt;/p&gt;
&lt;p&gt;I set the options to: Search Engine Friendly URLs - Yes, use URL Rewriting - Yes, Adds Suffix to URL - Yes, just as following:&lt;/p&gt;
&lt;p&gt;&lt;img alt="seo setting" src="https://vincentping.com/images/seo-setting.png" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;When I viewed the site, the article URL is like this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://www.vincentping.com/9-blog/2-remove-category-article-id-from-url-in-joomla-3.html&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It's ok comparing with the original URL like this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://www.vincentping.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=2:remove-category-article-id-from-url-in-joomla-3&amp;amp;catid=9&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But the id numbers before the categoriy(here it's 9) and article(2) are not very nice. Obviously these numbers are some database item number, with them the scripts could fetch data from backend database more efficiently. But to visitors they're a little strange. So I googled the web and tried lots of suggestions from web, finally here is the solution I used.&lt;/p&gt;
&lt;h1&gt;The Solution&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open the php file under the Joomla root “components/com_content/router.php“,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for the code:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$advanced = $params-&amp;gt;get('sef_advanced_link', 0);&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just change the "0" to "1", the output is as this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$advanced = $params-&amp;gt;get('sef_advanced_link', 1);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;There're two lines of code in the file should be changed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find below section of code in the router.php file and comment it out:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strpos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;view&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;article&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;comment to&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strpos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;view&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;article&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And all the job is DONE!&lt;/p&gt;
&lt;p&gt;After that, the url for the page is now:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://www.vincentping.com/en/remove-category-article-id-from-url-in-joomla-3.html&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Remember: every time you upgrade your Joomla system, you should modify the code again.&lt;/p&gt;
&lt;h1&gt;Other Suggestions You can Try&lt;/h1&gt;
&lt;p&gt;From the research online, I know that the id number issues are a problem for Joomla User Groups for near 10 years. And there's lots of extensions and other methods we could try.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use SEF extensions such as Sh404SEF, JoomSEF, SEF Advance etc, you can search "SEF" on &lt;a href="http://extensions.joomla.org/" target="_blank"&gt;JED(Joomla! Extensions Directory)&lt;/a&gt; and try them, but most of them are paid extensions.&lt;/li&gt;
&lt;li&gt;If you're familar with regex rules, you may try to add some rules to the .htaccess and try to rewrite the URL. But as we know, the .htaccess gets some overhead.&lt;/li&gt;
&lt;li&gt;When you just have a very small site, there's limited articles there, you could create one menu item for each article, and the id issues are solved.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to research more, I recommend the post "&lt;a href="http://forum.joomla.org/viewtopic.php?f=712&amp;amp;t=826165" target="_blank"&gt;Remove article id from url for joomla 3.0&lt;/a&gt;" on the Offical Joomla Forum.&lt;/p&gt;</content><category term="Tech"></category><category term="Joomla"></category></entry><entry><title>Remove Category and Article ID from URL in Joomla 3</title><link href="https://vincentping.com/en/remove-category-article-id-from-url-in-joomla-3.html" rel="alternate"></link><published>2015-10-01T17:13:00+08:00</published><updated>2026-02-20T17:12:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2015-10-01:/en/remove-category-article-id-from-url-in-joomla-3.html</id><summary type="html">&lt;p&gt;Joomla is a very professional content management system (CMS), but there're some minor shortcoming within the SEO URL Mapping.&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;This site has moved to a web site static generator to manage the content, and here is just a backup for reference.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Problem&lt;/h1&gt;
&lt;p&gt;I installed Joomla 3.4.4 on my vincentping.com site. &lt;/p&gt;
&lt;p&gt;After created some categories and articles, I just wanna try the "SEO Settings" in the "Global Configuration".&lt;/p&gt;
&lt;p&gt;I set the options to: Search Engine Friendly URLs - Yes, use URL Rewriting - Yes, Adds Suffix to URL - Yes, just as following:&lt;/p&gt;
&lt;p&gt;&lt;img alt="seo setting" src="https://vincentping.com/images/seo-setting.png" style="border: 1px solid #000000;"&gt;&lt;/p&gt;
&lt;p&gt;When I viewed the site, the article URL is like this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://www.vincentping.com/9-blog/2-remove-category-article-id-from-url-in-joomla-3.html&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It's ok comparing with the original URL like this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://www.vincentping.com/index.php?option=com_content&amp;amp;view=article&amp;amp;id=2:remove-category-article-id-from-url-in-joomla-3&amp;amp;catid=9&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But the id numbers before the categoriy(here it's 9) and article(2) are not very nice. Obviously these numbers are some database item number, with them the scripts could fetch data from backend database more efficiently. But to visitors they're a little strange. So I googled the web and tried lots of suggestions from web, finally here is the solution I used.&lt;/p&gt;
&lt;h1&gt;The Solution&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open the php file under the Joomla root “components/com_content/router.php“,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for the code:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$advanced = $params-&amp;gt;get('sef_advanced_link', 0);&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just change the "0" to "1", the output is as this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$advanced = $params-&amp;gt;get('sef_advanced_link', 1);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;There're two lines of code in the file should be changed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find below section of code in the router.php file and comment it out:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strpos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;view&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;article&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;comment to&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strpos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;view&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;article&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And all the job is DONE!&lt;/p&gt;
&lt;p&gt;After that, the url for the page is now:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;http://www.vincentping.com/en/remove-category-article-id-from-url-in-joomla-3.html&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Remember: every time you upgrade your Joomla system, you should modify the code again.&lt;/p&gt;
&lt;h1&gt;Other Suggestions You can Try&lt;/h1&gt;
&lt;p&gt;From the research online, I know that the id number issues are a problem for Joomla User Groups for near 10 years. And there's lots of extensions and other methods we could try.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use SEF extensions such as Sh404SEF, JoomSEF, SEF Advance etc, you can search "SEF" on &lt;a href="http://extensions.joomla.org/" target="_blank"&gt;JED(Joomla! Extensions Directory)&lt;/a&gt; and try them, but most of them are paid extensions.&lt;/li&gt;
&lt;li&gt;If you're familar with regex rules, you may try to add some rules to the .htaccess and try to rewrite the URL. But as we know, the .htaccess gets some overhead.&lt;/li&gt;
&lt;li&gt;When you just have a very small site, there's limited articles there, you could create one menu item for each article, and the id issues are solved.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to research more, I recommend the post "&lt;a href="http://forum.joomla.org/viewtopic.php?f=712&amp;amp;t=826165" target="_blank"&gt;Remove article id from url for joomla 3.0&lt;/a&gt;" on the Offical Joomla Forum.&lt;/p&gt;</content><category term="Tech"></category><category term="Joomla"></category></entry><entry><title>深深网络深似海----搜索引擎之外的网络世界</title><link href="https://vincentping.com/cn/deep-web-invisible-web.html" rel="alternate"></link><published>2003-11-10T12:43:00+08:00</published><updated>2018-08-06T16:52:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2003-11-10:/cn/deep-web-invisible-web.html</id><summary type="html">&lt;p&gt;互联网是一个信息的海洋，那么搜索引擎抓取只是这个海洋的表面，而在信息海洋的深处，存在巨大数量的内容，搜索引擎无法启及，这些内容叫着“DEEP WEB”，或者“INVISIBLE WEB”。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文写于2003年11月，此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;1、引言&lt;/h1&gt;
&lt;p&gt;可以把互联网想象成一个信息的海洋，为了帮助我们在这个海洋中找到自己需要的信息，就有了分类目录和搜索引擎这样的服务，前者采用人工分类的方法建立目录，提供用户查询，代表是Yahoo.com，后者使用程序软件（搜索机器人）在网络上抓取页面，提供查询，现在最著名的是Google.com。搜索引擎能查询到的信息远远比分类目录丰富，加上搜索技术的发展，使得查询结果也越来越准确，这就是Google.com及搜索技术现在这么热门的根本原因。&lt;/p&gt;
&lt;p&gt;到目前，GOOGLE中搜索的全部网页数已经超过了30亿，但是和整个互联网的丰富信息相比，这还不到1%，那么剩下的在哪里呢？为什么搜索引擎不检索呢？如何才能查询这些信息呢？……&lt;/p&gt;
&lt;h1&gt;2、什么是INVISIBLE WEB / DEEP WEB&lt;/h1&gt;
&lt;p&gt;还是用这样的比喻：互联网是一个信息的海洋，那么搜索引擎抓取只是这个海洋的表面，而在信息海洋的深处，存在巨大数量的内容，搜索引擎无法启及，这些内容叫着“DEEP WEB”，或者“INVISIBLE WEB”，可以翻译成“搜索引擎不可见的网络”（为方便行文，下面仍直接使用“INVISIBLE WEB”）。&lt;/p&gt;
&lt;p&gt;举个实际的例子，我们要查询最新的“火车时刻表”，通过搜索引擎我们可以找到一些提供“火车时刻表”的站点，如 http://www.he183.com/lieche/，但是真正要知道具体车次的详细情况，我们要到这个站点输入车次进行查询。在这里，这个站点里的信息虽然我们人类可以通过查询得到自己需要的信息，但是对于搜索引擎则无法抓取，这些内容，就叫着“INVISIBLE WEB”。&lt;/p&gt;
&lt;p&gt;根据Bright Planet公司（http://www.brightplanet.com/）在2000年底进行的一次研究（ http://www.brightplanet.com/deepcontent/tutorials/DeepWeb/index.asp ）表明，搜索引擎无法抓取的网络内容是其可以抓取的500倍。尽管这几年搜索引擎技术突飞猛进，但是“INVISIBLE WEB”的内容也在以更快的速度增长。同时Bright Planet公司的研究表明，这些“INVISIBLEWEB”的内容95%都是可以通过互联网公开访问的（无须付费和注册），只是搜索引擎不能抓取，或者抓取了也无法提供查询。（这也解释了为什么“分类目录站点”仍然有存在的必要，如百度推出的生活服务目录 http://www.baidu.com/life/）&lt;/p&gt;
&lt;h1&gt;3、存在INVISIBLE WEB的原因&lt;/h1&gt;
&lt;p&gt;现在你应该对“INVISIBLE WEB”有了一点初步的印象，那么为什么搜索引擎不去抓取这些公开的信息，提供给大家查询呢？&lt;/p&gt;
&lt;p&gt;有两类原因：一是因为技术原因搜索引擎无法抓取；二是搜索引擎可以抓取，但是因为其他选择不去抓取。下面逐一分析：&lt;/p&gt;
&lt;h2&gt;1)因为技术原因搜索引擎无法抓取：&lt;/h2&gt;
&lt;p&gt;我们知道搜索引擎使用搜索机器人（Spiders）通过链接在网络上抓取内容，但是当它遇到一个需要“输入内容”或者“在一些选项中进行选择”才能访问的网页时，它就变得无能为力了，因为“搜索机器人”不会思想。&lt;/p&gt;
&lt;p&gt;搜索机器人的这个不足导致有两类站点它无法抓取。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一种是对某个数据库的查询，由于结果页面都是在“输入内容”或者“选项”的基础上动态生成的，对于这类站点可见得只有那些静态的页面和查询的首页，其他都是不可见的；&lt;/li&gt;
&lt;li&gt;另外一种情况是需要用户名和密码登录才能访问的站点，搜索机器人无法“输入内容”，所以它没办法访问。现在很多站点都有全部或者部分内容需要登录才能阅读，这些内容都属于“INVISIBLE WEB”。 &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2)搜索引擎可以抓取，但是因为其他选择不去抓取：&lt;/h2&gt;
&lt;p&gt;除了搜索引擎无法抓取的内容外，还有许多内容它可以抓取，但是因为下面这些原因而选择不去抓取：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件格式问题：搜索引擎通过“搜索机器人”抓取内容是为了以后让用户可以查询到这些内容，但是很多文件格式，搜索引擎抓取后无法识别，也更无法被用户查询到。例如，如果一个站点全部是图片，搜索引擎抓取也无法识别其中的信息内容，它就选择放弃抓取。现在搜索引擎除了网页基本格式HTML和TXT外，能识别的其他文件格式越来越多，如PDF、WORD、EXCEL、POWERPOINT，但是还是有很多其他文件格式无法识别。&lt;/li&gt;
&lt;li&gt;使用动态脚本语言，带“？”的页面：越来越多的站点采用脚本语言（如ASP、PHP、JSP、PERL等）调用数据库的方式动态生成，并通过一些带“？”的链接访问数据库。（这个和前面谈到的“查询数据库”站点有一定的关系。）
对于这种带“？”的页面，搜索引擎可以抓取，但是一般情况下选择不去抓取，这是为了避免一种叫“搜索机器人陷阱（spider traps）”的脚本错误，这种错误会让搜索机器人进行无限循环的抓取，无法退出而浪费时间。国内的百度现在支持一些带“？”的脚本页面，但是这样做是暂时的，有很大风险，一方面这样的页面常常不稳定，用户最后查询得经常是“错误”或者和原来不同的内容，影响搜索质量；另外，也会有碰到“搜索机器人陷阱”的可能。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;正是由于上面的这些原因，所以存在“INVISIBLE WEB”，而且随着脚本技术的普遍采用，“INVISIBLE WEB”的范围越来越大。&lt;/p&gt;
&lt;h1&gt;4、如何查找INVISIBLE WEB&lt;/h1&gt;
&lt;p&gt;我们知道存在大量的“INVISIBLE WEB”，而且由于这些内容常常主题更专一，其信息的质量也非常高。那么有没有办法查找相关信息呢？这就要利用一些“INVISIBLE WEB”的分类目录和专门的工具，下面列出部分知名的站点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Librarians' Index to the Internet &lt;a href="http://www.lii.org/" target="_blank"&gt;http://www.lii.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Resource Discovery Network &lt;a href="http://www.rdn.ac.uk/" target="_blank"&gt;http://www.rdn.ac.uk/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Invisible Web &lt;a href="http://www.invisibleweb.com/" target="_blank"&gt;http://www.invisibleweb.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Complete Planet &lt;a href="http://www.completeplanet.com/" target="_blank"&gt;http://www.completeplanet.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Invisible-Web.net &lt;a href="http://www.invisible-Web.net/" target="_blank"&gt;http://www.invisible-Web.net/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;5、搜索引擎在“INVISIBLE WEB”的进展&lt;/h1&gt;
&lt;p&gt;除了“INVISIBLE WEB”，在搜索引擎可以抓取的网页中，它们目前也只抓取了大约35%左右（2003年初数据），也就是说，搜索引擎目前的主要任务仍然是将可以检索的部分尽快检索，所以对“INVISIBLE WEB”关注不多，一定的进展主要集中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;尽量识别各种文件格式，如GOOGLE现在支持的PDF、WORD、EXCEL、POWERPOINT；&lt;/li&gt;
&lt;li&gt;建立针对“INVISIBLE WEB”的数据库查询站点的分类目录，如上文提到的百度生活指南http://www.baidu.com/life/。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;参考资料：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://websearch.about.com/library/weekly/aa061203a.htm" target="_blank"&gt;http://websearch.about.com/library/weekly/aa061203a.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.brightplanet.com/deepcontent/tutorials/DeepWeb/index.asp" target="_blank"&gt;http://www.brightplanet.com/deepcontent/tutorials/DeepWeb/index.asp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lib.berkeley.edu/TeachingLib/Guides/Internet/InvisibleWeb.html" target="_blank"&gt;http://www.lib.berkeley.edu/TeachingLib/Guides/Internet/InvisibleWeb.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://websearch.about.com/library/weekly/aa061903a.htm" target="_blank"&gt;http://websearch.about.com/library/weekly/aa061903a.htm&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content><category term="Tech"></category><category term="搜索引擎"></category></entry><entry><title>robots.txt和Robots META标签</title><link href="https://vincentping.com/cn/robots-txt-and-robots-meta-tags.html" rel="alternate"></link><published>2003-10-18T15:22:00+08:00</published><updated>2018-08-06T16:06:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2003-10-18:/cn/robots-txt-and-robots-meta-tags.html</id><summary type="html">&lt;p&gt;对于网站管理者和内容提供者来说，有时候会有一些站点内容，不希望被ROBOTS抓取而公开。为了解决这个问题，ROBOTS开发界提供了两个办法：一个是robots.txt，另一个是The Robots META标签。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文写于2003年10月，此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们知道，搜索引擎都有自己的“搜索机器人”（ROBOTS），并通过这些ROBOTS在网络上沿着网页上的链接（一般是http和src链接）不断抓取资料建立自己的数据库。&lt;/p&gt;
&lt;p&gt;对于网站管理者和内容提供者来说，有时候会有一些站点内容，不希望被ROBOTS抓取而公开。为了解决这个问题，ROBOTS开发界提供了两个办法：一个是robots.txt，另一个是The Robots META标签。&lt;/p&gt;
&lt;h1&gt;一、robots.txt&lt;/h1&gt;
&lt;h2&gt;1、什么是robots.txt？&lt;/h2&gt;
&lt;p&gt;robots.txt是一个纯文本文件，通过在这个文件中声明该网站中不想被robots访问的部分，这样，该网站的部分或全部内容就可以不被搜索引擎收录了，或者指定搜索引擎只收录指定的内容。&lt;/p&gt;
&lt;p&gt;当一个搜索机器人访问一个站点时，它会首先检查该站点根目录下是否存在robots.txt，如果找到，搜索机器人就会按照该文件中的内容来确定访问的范围，如果该文件不存在，那么搜索机器人就沿着链接抓取。&lt;/p&gt;
&lt;p&gt;robots.txt必须放置在一个站点的根目录下，而且文件名必须全部小写。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;网站 URL&lt;/th&gt;
&lt;th&gt;相应的 robots.txt的 URL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;http://www.w3.org/&lt;/td&gt;
&lt;td&gt;http://www.w3.org/robots.txt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;http://www.w3.org:80/&lt;/td&gt;
&lt;td&gt;http://www.w3.org:80/robots.txt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;http://www.w3.org:1234/&lt;/td&gt;
&lt;td&gt;http://www.w3.org:1234/robots.txt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;http://w3.org/&lt;/td&gt;
&lt;td&gt;http://w3.org/robots.txt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;2、 robots.txt的语法&lt;/h2&gt;
&lt;p&gt;"robots.txt"文件包含一条或更多的记录，这些记录通过空行分开（以CR,CR/NL, or NL作为结束符），每一条记录的格式如下所示：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;field&amp;gt;:&amp;lt;optionalspace&amp;gt;&amp;lt;value&amp;gt;&amp;lt;optionalspace&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在该文件中可以使用#进行注解，具体使用方法和UNIX中的惯例一样。该文件中的记录通常以一行或多行User-agent开始，后面加上若干Disallow行,详细情况如下：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;User-agent:&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;该项的值用于描述搜索引擎robot的名字，在"robots.txt"文件中，如果有多条User-agent记录说明有多个robot会受到该协议的限制，对该文件来说，至少要有一条User-agent记录。如果 该项的值设为&lt;em&gt;，则该协议对任何机器人均有效，在"robots.txt"文件中， "User-agent：&lt;/em&gt;"这样的记录只能有一条。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow :&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;该项的值用于描述不希望被访问到的一个URL，这个URL可以是一条完整的路径，也可以是部分的，任何以Disallow 开头的URL均不会被robot访问到。例如"Disallow: /help"对/help.html 和/help/index.html都不允许搜索引擎访问，而"Disallow: /help/"则允许robot访问/help.html，而不能访问/help/index.html。&lt;/p&gt;
&lt;p&gt;任何一条Disallow记录为空，说明该网站的所有部分都允许被访问，在"/robots.txt"文件中，至少要有一条Disallow记录。如果 "/robots.txt"是一个空文件，则对于所有的搜索引擎 robot，该网站都是开放的。&lt;/p&gt;
&lt;p&gt;下面是一些robots.txt基本的用法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;禁止所有搜索引擎访问网站的任何部分：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;User-agent: *&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: /&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;允许所有的robot访问&lt;/p&gt;
&lt;p&gt;&lt;code&gt;User-agent: *&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow:&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;或者也可以建一个空文件 "/robots.txt" file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;禁止所有搜索引擎访问网站的几个部分（下例中的cgi-bin、tmp、private目录）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;User-agent: *&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: /cgi-bin/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: /tmp/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: /private/&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;禁止某个搜索引擎的访问（下例中的BadBot）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;User-agent: BadBot&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: /&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;只允许某个搜索引擎的访问（下例中的WebCrawler）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;User-agent: WebCrawler&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow:&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;User-agent: *&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: /&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3、 常见搜索引擎机器人Robots名字&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;搜索引擎&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Baiduspider&lt;/td&gt;
&lt;td&gt;http://www.baidu.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scooter&lt;/td&gt;
&lt;td&gt;http://www.altavista.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ia_archiver&lt;/td&gt;
&lt;td&gt;http://www.alexa.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Googlebot&lt;/td&gt;
&lt;td&gt;http://www.google.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAST-WebCrawler&lt;/td&gt;
&lt;td&gt;http://www.alltheweb.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slurp&lt;/td&gt;
&lt;td&gt;http://www.inktomi.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MSNBOT&lt;/td&gt;
&lt;td&gt;http://search.msn.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;4、 robots.txt举例&lt;/h2&gt;
&lt;p&gt;下面是一些著名站点的robots.txt，可以学习参考：&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cnn.com/robots.txt" target="_blank"&gt;http://www.cnn.com/robots.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.google.com/robots.txt" target="_blank"&gt;http://www.google.com/robots.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ibm.com/robots.txt" target="_blank"&gt;http://www.ibm.com/robots.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.oracle.com/robots.txt" target="_blank"&gt;http://www.oracle.com/robots.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.taobao.com/robots.txt" target="_blank"&gt;http://www.taobao.com/robots.txt&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;5、 常见robots.txt错误&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;颠倒了顺序，错误写成：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;User-agent: *&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: GoogleBot&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;正确的应该是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;User-agent: GoogleBot&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: *&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把多个禁止命令放在一行中：&lt;/p&gt;
&lt;p&gt;例如，错误地写成&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: /css/ /cgi-bin/ /images/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;正确的应该是&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: /css/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: /cgi-bin/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: /images/&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;行前有大量空格&lt;/p&gt;
&lt;p&gt;例如写成&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    `Disallow: /cgi-bin/`
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;尽管在标准没有谈到这个，但是这种方式很容易出问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;404重定向到另外一个页面：&lt;/p&gt;
&lt;p&gt;当Robot访问很多没有设置robots.txt文件的站点时，会被自动404重定向到另外一个Html页面。这时Robot常常会以处理robots.txt文件的方式处理这个Html页面文件。虽然一般这样没有 什么问题，但是最好能放一个空白的robots.txt文件在站点根目录下。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;采用大写。例如&lt;/p&gt;
&lt;p&gt;&lt;code&gt;USER-AGENT: EXCITE&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DISALLOW:&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;虽然标准是没有大小写的，但是目录和文件名应该小写：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;user-agent:GoogleBot&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;disallow:&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;语法中只有Disallow，没有Allow语法！&lt;/p&gt;
&lt;p&gt;错误的写法是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;User-agent: Baiduspider&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: /john/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;allow: /jane/&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;忘记了斜杠/&lt;/p&gt;
&lt;p&gt;错误的写做：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;User-agent: Baiduspider&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: css&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;正确的应该是&lt;/p&gt;
&lt;p&gt;&lt;code&gt;User-agent: Baiduspider&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Disallow: /css/&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google网站上有一个工具专门检查robots.txt文件的有效性（需要google账户）：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.google.com/webmasters/tools/robots-testing-tool" target="_blank"&gt;https://www.google.com/webmasters/tools/robots-testing-tool&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;二、Robots META标签&lt;/h1&gt;
&lt;h2&gt;1、什么是Robots META标签&lt;/h2&gt;
&lt;p&gt;Robots.txt文件主要是限制整个站点或者目录的搜索引擎访问情况，而Robots META标签则主要是针对一个个具体的页面。和其他的META标签（如使用的语言、页面的描述、关键词等）一 样，Robots META标签也是放在页面的中，专门用来告诉搜索引擎ROBOTS如何抓取该页的内容。具体的形式类似（见黑体部分）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;时代营销--网络营销专业门户&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Robots&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;index,follow&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;CONTENT=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text/html; charset=gb2312&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;keywords&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;营销,...&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;时代营销网是.....&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/public/css.css&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
…
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;2、Robots META标签的写法：&lt;/h1&gt;
&lt;p&gt;Robots META标签中没有大小写之分，name=”Robots”表示所有的搜索引擎，可以针对某个具体搜索引擎写为name=”BaiduSpider”。co
ntent部分有四个指令选项：index、noindex、 follow、nofollow，指令间以“,”分隔。&lt;/p&gt;
&lt;p&gt;INDEX 指令告诉搜索机器人抓取该页面；&lt;/p&gt;
&lt;p&gt;FOLLOW 指令表示搜索机器人可以沿着该页面上的链接继续抓取下去；&lt;/p&gt;
&lt;p&gt;Robots Meta标签的缺省值是INDEX和FOLLOW，只有inktomi除外，对于它，缺省值是INDEX,NOFOLLOW。&lt;/p&gt;
&lt;p&gt;这样，一共有四种组合：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;META NAME="ROBOTS" CONTENT="INDEX,FOLLOW"&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;META NAME="ROBOTS" CONTENT="NOINDEX,FOLLOW"&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;META NAME="ROBOTS" CONTENT="INDEX,NOFOLLOW"&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;META NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW"&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中，&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;META NAME="ROBOTS" CONTENT="INDEX,FOLLOW"&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;可以写成：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;META NAME="ROBOTS" CONTENT="ALL"&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;而&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;META NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW"&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;可以写成：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;META NAME="ROBOTS" CONTENT="NONE"&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;需要注意的是：上述的robots.txt和Robots META标签限制搜索引擎机器人（ROBOTS）抓取站点内容的办法只是一种规则，需要搜索引擎机器人的配合才行，并不是每个ROBOTS都遵守的。&lt;/p&gt;
&lt;p&gt;目前看来，绝大多数的搜索引擎机器人都遵守robots.txt的规则，而对于Robots META标签，目前支持的并不多，但是正在逐渐增加，如著名搜索引擎GOOGLE就完全支持，而且GOOGLE还增 加了一个指令“archive”，可以限制GOOGLE是否保留网页快照。例如：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;META NAME="googlebot" CONTENT="index,follow,noarchive"&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;表示抓取该站点中页面并沿着页面中链接抓取，但是不在GOOLGE上保留该页面的网页快照。&lt;/p&gt;</content><category term="Tech"></category><category term="RSS"></category></entry><entry><title>RSS及其发展历程简介</title><link href="https://vincentping.com/cn/rss-developement-introduction.html" rel="alternate"></link><published>2003-10-10T09:10:00+08:00</published><updated>2018-08-06T15:56:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2003-10-10:/cn/rss-developement-introduction.html</id><summary type="html">&lt;p&gt;RSS是一种描述和同步网站内容的格式，是目前使用最广泛的XML应用。RSS应用在国外已经非常普遍，从个人博客（Blog）栏目、企业站点到世界级的门户都提供基于RSS的服务。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文写于2003年10月，此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;RSS是一种描述和同步网站内容的格式，是目前使用最广泛的XML应用。RSS应用在国外已经非常普遍，从个人博客（Blog）栏目、企业站点到世界级的门户都提供基于RSS的服务，如IBM公司站点的中文新闻RSS &lt;a href="http://www.ibm.com/news/cn/zh/index.rss" target="_blank"&gt;http://www.ibm.com/news/cn/zh/index.rss&lt;/a&gt;，YAHOO站点的&lt;a href="http://news.yahoo.com/rss" target="_blank"&gt;http://news.yahoo.com/rss&lt;/a&gt;，微软MSDN站点的http://msdn.microsoft.com/aboutmsdn/rss.asp 等等。&lt;/p&gt;
&lt;h1&gt;1、 RSS的历史&lt;/h1&gt;
&lt;p&gt;那么RSS究竟代表什么呢？比较普遍的有两种说法，一种是“Rich Site Summary”或“RDF Site Summary”，另一种是“Really Simple Syndication”，之所以有这些分歧，需要从RSS发展的历史说起。&lt;/p&gt;
&lt;p&gt;最初的0.90版本RSS是由Netscape公司设计的，目的是用来建立一个整合了各主要新闻站点内容的门户，但是0.90版本的RSS规范过于复杂，而一个简化的RSS 0.91版本也随着Netscape公司对该项目的放弃而于2000年暂停。&lt;/p&gt;
&lt;p&gt;不久，一家专门从事博客写作软件开发的公司UserLand接手了RSS 0.91版本的发展，并把它作为其博客写作软件的基础功能之一继续开发，逐步推出了0.92、0.93和0.94版本。随着网络博客的流行，RSS作为一种基本的功能也被越来越多的网站和博客软件支持。&lt;/p&gt;
&lt;p&gt;在UserLand公司接手并不断开发RSS的同时，很多的专业人士认识到需要通过一个第三方、非商业的组织，把RSS发展成为一个通用的规范，并进一步标准化。于是2001年一个联合小组在0.90版本RSS的开发原则下，以W3C新一代的语义网技术RDF（Resource Description Framework）为基础，对RSS进行了重新定义，发布RSS1.0，并将RSS定义为“RDF Site Summary”。但是这项工作没有与UserLand公司进行有效的沟通，UserLand公司也不承认RSS 1.0的有效性，并坚持按照自己的设想进一步开发出RSS的后续版本，到2002年9月发布了最新版本RSS 2.0，UserLand公司将RSS定义为“Really Simple Syndication”。&lt;/p&gt;
&lt;p&gt;目前RSS已经分化为RSS 0.9x/2.0和RSS 1.0两个阵营，由于分歧的存在和RSS 0.9x/2.0的广泛应用现状，RSS 1.0还没有成为标准化组织的真正标准。&lt;/p&gt;
&lt;h1&gt;2、 RSS目前的版本和推荐&lt;/h1&gt;
&lt;p&gt;到目前为止，RSS共有七种版本，推荐使用的是RSS 1.0和RSS 2.0，对于一些基本的站点同步，也可以选用RSS 0.91。&lt;/p&gt;
&lt;h1&gt;3、 RSS的语法介绍&lt;/h1&gt;
&lt;p&gt;一个RSS文件就是一段规范的XML数据，该文件一般以rss，xml或者rdf作为后缀。下面我们选择http://msdn.microsoft.com/visualc/rss.xml中的一部分作为例子简单解说（略）&lt;/p&gt;
&lt;h1&gt;4、 RSS的联合（Syndication）和聚合（Aggregation）&lt;/h1&gt;
&lt;p&gt;发布一个RSS文件（一般称为RSS Feed）后，这个RSS Feed中包含的信息就能直接被其他站点调用，而且由于这些数据都是标准的XML格式，所以也能在其他的终端和服务中使用，如PDA、手机、邮件列表等。而且一个网站联盟（比如专门讨论旅游的网站系列）也能通过互相调用彼此的RSS Feed，自动的显示网站联盟中其他站点上的最新信息，这就叫着RSS的联合。这种联合就导致一个站点的内容更新越及时、RSS Feed被调用的越多，该站点的知名度就会越高，从而形成一种良性循环。&lt;/p&gt;
&lt;p&gt;而所谓RSS聚合，就是通过软件工具的方法从网络上搜集各种RSS Feed并在一个界面中提供给读者进行阅读。这些软件可以是在线的WEB工具，如http://my.netscape.com，http://my.userland.com， http://www.xmltree.com，http://www.moreover.com，http://www.oreillynet.com/meerkat 等，也可以是下载到客户端安装的工具。&lt;/p&gt;
&lt;h1&gt;5、 RSS的未来发展&lt;/h1&gt;
&lt;p&gt;随着越来越多的站点对RSS的支持，RSS已经成为目前最成功的XML应用。RSS搭建了信息迅速传播的一个技术平台，使得每个人都成为潜在的信息提供者。相信很快我们就会看到大量基于RSS的专业门户、聚合站点和更精确的搜索引擎。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考文献：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;RSS 0.9 Specification http://www.purplepages.ie/RSS/netscape/rss0.90.html&lt;/li&gt;
&lt;li&gt;RSS 1.0 Specification &lt;a href="http://web.resource.org/rss/1.0/spec" target="_blank"&gt;http://web.resource.org/rss/1.0/spec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;RSS 2.0 Specification &lt;a href="http://www.rssboard.org/rss-specification" target="_blank"&gt;http://www.rssboard.org/rss-specification&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content><category term="Tech"></category><category term="RSS"></category></entry><entry><title>动态网站的搜索引擎策略</title><link href="https://vincentping.com/cn/seo-for-dynamic-websites.html" rel="alternate"></link><published>2003-09-08T19:25:00+08:00</published><updated>2018-08-06T15:48:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2003-09-08:/cn/seo-for-dynamic-websites.html</id><summary type="html">&lt;p&gt;动态网站提高了网站与用户的交互，方便网站的维护和管理。但是如何提高动态网站在搜索引擎中的排名呢？&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文写于2003年9月，此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;一、动态网站的出现和优势&lt;/h1&gt;
&lt;p&gt;最早互联网出现时，站点内容都是以HTML静态页面形式存放在服务器上，访问者浏览到的页面都是这些实际存在的静态页面。随着技术的发展，特别是数据库和脚本技术PERL、ASP、PHP和JSP的发展，越来越多的站点都开始采取动态的页面发布手段。比如，我们在GOOGLE.COM上搜索一个内容，得到的搜索结果页面文件"本身"在GOOGLE服务器上并不存在，而是通过程序在我们输入搜索内容时调用后台数据库实时生成的，也就是说，这些结果页面是动态的。&lt;/p&gt;
&lt;p&gt;静态页面的站点只涉及文件的传输问题，而动态站点则复杂得多，用户和站点之间出现大量的交互，网站不再仅仅是内容的发布，而是成为了一种"应用（Application）"，是软件业向互联网上的扩张，从软件的角度看，动态站点是逻辑应用层和数据层的分离，数据库负责站点数据的存储管理，而ASP、PHP、JSP等负责处理站点的逻辑应用。这样做的好处除了增加很多交互功能外，更重要的是站点的维护、更新和升级都方便了许多。可以说，没有动态网站技术，目前互联网上的这些超大型站点就不可能出现。&lt;/p&gt;
&lt;h1&gt;二、搜索引擎抓取动态网站页面时面临的问题&lt;/h1&gt;
&lt;p&gt;从用户的角度看，动态网站非常不错，丰富了站点的功能，但是对于搜索引擎来说，情况就不同了。&lt;/p&gt;
&lt;p&gt;根本的问题在于"输入"和"选择"，动态页面是在用户"输入内容"或者进行"选择"时动态生成的，但是搜索引擎的"搜索机器人"无法"输入"和"选择"。比如我们要在当当书店站点查看冯英健的《网络营销基础与实践》一书，介绍页面是动态生成的，URL地址是：http://www.dangdang.com/product_detail/product_detail.asp?product_id=493698 这里在"？"后面的product_id参数值需要我们输入的，"搜索机器人"可以通过链接找到http://www.dangdang.com/product_detail/product_detail.asp 页面，但是它无法输入"？"后面的product_id参数值，从而无法抓取这个页面文件。&lt;/p&gt;
&lt;p&gt;另外，对于通过链接达到这种带"？"的页面，技术上搜索引擎可以抓取，但是一般情况下搜索引擎选择不去抓取，这是为了避免一种叫"搜索机器人陷阱（spider traps）"的脚本错误，这种错误会让搜索机器人进行无限循环的抓取，无法退出而浪费时间。&lt;/p&gt;
&lt;h1&gt;三、动态网站的搜索引擎策略&lt;/h1&gt;
&lt;p&gt;动态网站要被搜索引擎抓取，可以采用内容发布系统软件将动态站点转化成静态页面，这种办法对于页面发布后变动少的站点比较合适，比如一些新闻类的站点（如新浪的新闻中心：http://news.sina.com.cn/ ）。&lt;/p&gt;
&lt;p&gt;一般的动态网站可以通过下面的办法让搜索引擎抓取： 首先，我们要让动态页面的URL地址中没有"？"，让动态页面看上去象"静态页面"。看看下面这个页面http://www.amazon.com/exec/obidos/tg/detail/-/043935806X/ ，这明显是一个动态页面，但是URL地址看上去却象"静态页面"。针对不同的动态技术可以采用下面技术实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于采用ASP技术的动态页面Exception Digital公司提供一种工具叫着XQASP（http://www.xde.net/products/product_xqasp.htm ）可以将"？"替换为"/"。&lt;/li&gt;
&lt;li&gt;对于采用ColdFusion技术的站点，需要重新配置服务器上的ColdFusion，用"/"代替"？"将参数传输到URL，更详细的信息请见http://coldfusion.com/ 站点。&lt;/li&gt;
&lt;li&gt;对于使用Apache服务器的站点，可以使用rewrite模块将带参数的URL地址转换成搜索引擎支持的形式，该模块mod_rewrite在Apache服务器中不是缺省安装的，详细的信息请见&lt;a href="http://httpd.apache.org/docs/mod/mod_rewrite.html" target="_blank"&gt;http://httpd.apache.org/docs/mod/mod_rewrite.html&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;对于其他的动态技术也能找到对应的方法改变URL的形式。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后，要创建一些静态页面指向这些动态页面（以改变过的URL链接）。&lt;/p&gt;
&lt;p&gt;前面说过，搜索引擎机器人并不会自己"输入"参数，所以要让上面这些动态页面被搜索引擎抓取，我们还需要告诉机器人这些页面的地址（也就是参数）。我们可以创建一些静态的页面，一般在网络营销中称? "gateway page"（入口页面），这些页面上有大量指向这些动态页面的链接。&lt;/p&gt;
&lt;p&gt;将这些入口页面的地址提交到搜索引擎，这些页面和链接的动态页面（改变过URL形式）就能都被搜索引擎抓取了。&lt;/p&gt;
&lt;h1&gt;四、搜索引擎对动态网站支持的改进&lt;/h1&gt;
&lt;p&gt;在我们调整动态站点适应搜索引擎的同时，搜索引擎也在发展。到目前为止，绝大多数的搜索引擎还不支持动态页面的抓取，但是GOOGLE、HOTBOT等和国内的百度开始尝试抓取动态网站页面（包括? "？"的页面），这就是我们现在在这些搜索引擎进行搜索时，结果中出现动态链接的原因。&lt;/p&gt;
&lt;p&gt;能在URL中不用参数尽量不要用，一些参数转移到其他地方，这样可以增加动态页面被抓取的深度和数目。&lt;/p&gt;
&lt;p&gt;这些搜索引擎抓取动态页面时，为了避免"搜索机器人陷阱"，都只抓取从静态页面（至少"看上去"是静态的页面）链接到的动态页面，而从动态页面链接出的动态页面都不再抓取。&lt;/p&gt;
&lt;p&gt;所以一个动态站点如果只针对上面这些搜索引擎，可以在上面小节介绍方法的基础上简化：只用创建一些入口页面，链接很多动态页面，然后将这些入口页面递交到这些搜索引擎就可以了。&lt;/p&gt;
&lt;p&gt;对于直接使用动态的URL地址，请注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件URL中不要有Session Id，同时不要用ID作为参数名称（特别是对于GOOGLE）；　　&lt;/li&gt;
&lt;li&gt;参数越少越好，尽量不要超过2个。&lt;/li&gt;
&lt;/ul&gt;</content><category term="Tech"></category><category term="搜索引擎"></category></entry><entry><title>网络推广新潮流——发行免费电子图书</title><link href="https://vincentping.com/cn/web-promotion-publishing-free-ebooks.html" rel="alternate"></link><published>2002-11-04T09:05:00+08:00</published><updated>2018-08-06T15:45:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2002-11-04:/cn/web-promotion-publishing-free-ebooks.html</id><summary type="html">&lt;p&gt;使用免费电子图书进行营销就像共享软件一样，非常流行。它真正体现了为访问者着想，同时用户也可以收藏，以备进一步的阅读参考。每一本电子书一旦放到网上，就如同有了自己的生命，到处传播，不需要我们再去费心，同时电子书籍又可以保证内容的完整。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文写于2002年11月，此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;互联网的急速膨胀超过了大多数网上营销人员的想像，冲浪者开启他们喜欢的搜索引擎、打开多个窗口、不断从一个站点到另一个站点。&lt;/p&gt;
&lt;p&gt;这些对于网上的经营者绝对不是什么好消息，因为他们总是希望能把一个用户留在自己的网站上，这样用户就有更多的机会阅读他们的销售文件、将站点加入书签乃至购买他们的产品或服务。&lt;/p&gt;
&lt;p&gt;那么，有没有什么办法能让以前的访问者重新来访呢？（并且会是一个潜在的用户）&lt;/p&gt;
&lt;p&gt;一种有效的方法是使用邮件列表（电子杂志类型），而另一种方法就是发行电子图书。&lt;/p&gt;
&lt;p&gt;与传统图书相比，发行和传输电子图书的费用几乎为零，没有邮寄的麻烦，也没有邮费，不需要人工的处理，也没有印刷的成本等等。而最棒的是，人们可以马上下载或者通过自动回复机索取后，在几分钟内就得到它！&lt;/p&gt;
&lt;p&gt;目前在国外，使用免费电子图书进行营销就像共享软件一样，非常流行。它真正体现了为访问者着想，同时用户也可以收藏，以备进一步的阅读参考。每一本电子书一旦放到网上，就如同有了自己的生命，到处传播，不需要我们再去费心，同时电子书籍又可以保证内容的完整。&lt;/p&gt;
&lt;p&gt;在一个多步骤的营销过程中，电子图书能为你的生意带来大量的潜在用户。当他们希望下载或索取时，这本身就已经证明他们是潜在的客户了。而如果你在电子图书中所提供的信息内容确实有效的话，这些潜在用户很快就会成为真正的用户！&lt;/p&gt;
&lt;p&gt;其实电子图书本身也能作为产品。如果你打算销售你的电子图书，你的传输、发货能够完全自动：一旦用户购买，他就会被链接到一个秘密的地址或者有密码保护的页面，而在那儿他们能马上下载已经购买了的电子图书。&lt;/p&gt;
&lt;p&gt;当利用电子图书发现潜在的用户时，你可以认为它是最有效的方法。因为，当一个人愿意为这个电子图书支付很小的费用时，那么他（或她）购买你其他产品的可能性就会非常高！&lt;/p&gt;
&lt;p&gt;把电子图书与其他的营销技术结合起来也能大大增加你网站的流量。举个简单例子，在你自己的站点举办一次比赛，奖品是一份你的电子图书，这样就能为你的邮件列表带来大量订户，那么如果你把这个电子图书作为一份特别内容提供给你的订户呢？这会是很好的活动，同时也很方便！&lt;/p&gt;
&lt;p&gt;如果你的电子图书是免费发布的，那么你应该容许其他网站也能发布这本电子图书。你为他们提供了有价值的内容，从而使他们的访问量增加，同时你也因为书中的链接为自己的站点带来访问量。&lt;/p&gt;
&lt;p&gt;你甚至可以销售电子图书中的广告位（比如条幅广告）。特别是当你定期发布时，这些电子图书将比一般的电子杂志有高得多的可信度，和更大的广告作用。&lt;/p&gt;
&lt;p&gt;另外一个销售电子图书的方法是“批发”。换句话说，你买的是许可，而不是电子图书本身（例如，复制权）。许多网络经营者都在为他们的站点寻找好的产品，特别是那些独一无二而不是网上到处都有的东西。提供给他们（不要多，一些即可）这样的机会将会为你建立一种长期的商业关系，同时你也会有收益。&lt;/p&gt;
&lt;p&gt;我们应该把电子书籍作为现今互联网最强大的营销趋势和手段之一，对它进行认真研究和思考！&lt;/p&gt;</content><category term="Tech"></category><category term="电子图书"></category></entry><entry><title>如何迅速增加电子杂志的订户数</title><link href="https://vincentping.com/cn/increase-mailing-list-subscribers.html" rel="alternate"></link><published>2001-02-01T17:03:00+08:00</published><updated>2018-08-06T15:40:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2001-02-01:/cn/increase-mailing-list-subscribers.html</id><summary type="html">&lt;p&gt;当我们建立起一份电子杂志后，除了系统的管理、内容的准备等等外，最终也会面对临一个推广的问题：怎么样能迅速扩大自己的知名度，增加杂志的订户数呢？&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文写于2001年2月，此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在网上赚钱的最好方法之一是建立自己的邮件列表（电子杂志），这样你就可以以非常低廉的价格与成千上万具有针对性的潜在客户经常保持联系。&lt;/p&gt;
&lt;p&gt;但是就像建网站一样，一个再漂亮、内容再丰富的站点，最终我们都会明白，最花时间和精力的是：推广、吸引访问者。同样，当我们建立起一份电子杂志后，除了系统的管理、内容的准备等等外，最终也会面对临一个推广的问题：怎么样能迅速扩大自己的知名度，增加杂志的订户数呢？&lt;/p&gt;
&lt;p&gt;我们是邮件列表的绝对信奉者，下面是我们从长期实践中总结的一些应该注意的问题和常用的推广方法。&lt;/p&gt;
&lt;h1&gt;1、要有专门的电子杂志介绍&lt;/h1&gt;
&lt;p&gt;这一点实际上根本不用说，是最最基本的，但是很多电子杂志的拥有者还是没有认真对待。经常到一些办得挺不错的站点转悠，看到了订阅表单，却看不到这个“邮件列表”最基本的介绍。 试想，在这个垃圾邮件满天飞的时代，有几个人敢订阅这种杂志？！&lt;/p&gt;
&lt;p&gt;就像传统报纸的征订广告一样，这个介绍应该包括发送的内容、针对对象，发送频率，隐私保密政策等等，你的信息越详细明确，人们就越敢放心的把自己的伊妹儿地址交给你。&lt;/p&gt;
&lt;h1&gt;2、在你站点的每一页上都添加订阅表单&lt;/h1&gt;
&lt;p&gt;电子杂志新手常犯的另一个错误是，没有充分利用自己的站点，他们常常只是简单地在首页加一个订阅表单就算数。&lt;/p&gt;
&lt;p&gt;我们知道，你的订阅表单被访问者看到的频率越高，他们订阅的可能性也越高，那么为什么不充分利用自己的站点呢？&lt;/p&gt;
&lt;p&gt;当然，我想绝大多数朋友还是因为没有完全了解邮件列表对于一个网络经营者的重要性，根本不重视，只不过看到别人有，自己也加一个。OK，如果是这样的话，您可以到我的网站上找到其他介绍邮件列表的文章，包括这种营销方法的各种优势、成功案例、实现方法……相信您看过后一定也会像我们一样迷上“邮件列表”。&lt;/p&gt;
&lt;h1&gt;3、设计一个专门的签名档&lt;/h1&gt;
&lt;p&gt;专门设计一个签名档，这个签名档应该包括你的姓名、站点、邮件列表简要介绍和订阅信息等。比如我的签名档可以是这样的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Vincent Ping 

http://www.vincentping.com/ 
Vincent Ping的网站 
每周发行的免费电子杂志，订阅： 
mailto: vincentping(AT)gmail.com 
或访问站点: http://www.vincentping.com/ 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这个签名档不仅应该加在你发送的每一封邮件后面，也应该附在你在论坛、社区、BBS、留言版等发表的每一个帖子后。要让人们能尽量方便的订阅，最好有通过EMAIL的订阅方式。&lt;/p&gt;
&lt;h1&gt;4、为邮件列表制作专门的页面，递交到搜索引擎、分类目录&lt;/h1&gt;
&lt;p&gt;把这个页面当作一个独立的网站来推广，包括修改META值，使用各种递交搜索引擎的工具、服务和技巧。&lt;/p&gt;
&lt;p&gt;除了递交到一般的引擎和目录外，如搜狐、新浪、悠游、网易等外，还有许多专门针对邮件列表的引擎和目录也应该登录，虽然目前主要都是一些外文站点。在 
http://profitinfo.com/ezine-pr.htm您可以找到很多这样的站点链接。&lt;/p&gt;
&lt;h1&gt;5、用一些小礼物吸引人订阅&lt;/h1&gt;
&lt;p&gt;也就是说，如果访问者订阅你的杂志时，你免费送一些小礼物给他/她。当然这些小礼物可以是任何东西，比如说巧克力、鲜花什么的:-)&lt;/p&gt;
&lt;p&gt;但是我认为最好是使用“相关的”电子书或软件等数字化的东东，这样有很多好处：&lt;/p&gt;
&lt;p&gt;一是方便。对于你来说，只需告诉订户它的下载地址就可以了，无须再做任何事；而对于用户，马上就可以通过网络下载；&lt;/p&gt;
&lt;p&gt;二是通过选择相关的东西，可以保证订阅的人真正是“我们需要的”。&lt;/p&gt;
&lt;h1&gt;6、与其他电子杂志互换广告&lt;/h1&gt;
&lt;p&gt;一旦你的杂志有了几百上千的订户，你就可以开始与其他杂志交换广告。在各自的刊物上开一个栏目：推荐电子刊物，互相介绍等等，目前最好不要搞得太商业化。&lt;/p&gt;
&lt;p&gt;在这种推广方法中，选择目标用户类似的电子刊物非常重要。例如，我的站点现在就在寻找交换广告的刊物，那么合作方最好也是关于网络、技术或网站经营的，这样对于双方，都能带来更好的效果。而如果我们选择一家关于音乐的刊物合作，效果肯定就会差一些。&lt;/p&gt;
&lt;p&gt;这种方法进一步，就是我们常常看到的“电子杂志联盟”。6到7个杂志，除了交换链接、广告外，当用户订阅其中一个时，系统会弹出一个页面，询问该用户是否愿意订阅其他的联盟杂志。&lt;/p&gt;
&lt;p&gt;再进一步是什么呢？就是电子刊物社区了。例如大陆的通易、博大、索易以及台湾的魅力站就属于这种类型，一般，组织者都会提供相应的邮件系统服务。&lt;/p&gt;
&lt;p&gt;以上都是一些成本很低的方法，当然如果你有宣传资金，那么推广的途径和方法就更多啦。&lt;/p&gt;</content><category term="Tech"></category><category term="电子杂志"></category></entry><entry><title>自动回复机----电子邮件营销中的另一种秘密武器</title><link href="https://vincentping.com/cn/email-marketing-autoresponder.html" rel="alternate"></link><published>2001-01-26T12:21:00+08:00</published><updated>2018-08-06T15:28:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2001-01-26:/cn/email-marketing-autoresponder.html</id><summary type="html">&lt;p&gt;小小的电子邮件，有这么多的应用方法，而且还在不断诞生着一些极具创造性的新应用。这里想给大家介绍的是电子邮件营销中的另一个秘密武器：自动回复机（AutoResponder）&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文写于2000年1月，此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;订阅我们“网络时代”电子杂志的朋友们都知道，我们一直是邮件列表的忠实拥护者，并且一直在实践。对于网络经营者，邮件列表是一个开拓市场以及与用户保持联系的绝佳武器。但是在整个电子邮件营销中，这只是沧海一粟。小小的电子邮件，有这么多的应用方法，而且还在不断诞生着一些极具创造性的新应用。这里想给大家介绍的是电子邮件营销中的另一个秘密武器：自动回复机（AutoResponder）。&lt;/p&gt;
&lt;p&gt;自动回复，顾名思义就是当信箱收到一封来信时，它会按照预先的设置内容自动回复，无须自己去干预。几乎所有的邮件服务器软件都内置这个功能，一般只需要简单的设置就可以使用。但是目前国内电信的信箱（如public.wh.hb.cn）都没有开通这项服务，相反很多免费信箱，如163.net、263.net等却提供“自动回复”的功能。&lt;/p&gt;
&lt;p&gt;很多朋友可能已经使用过这种功能，比如当你出差在外，无法收发信件时，你可以设置自动回复，告诉来信的朋友“我现在出差在外，回来后即给你复信”云云，又或你转移了新信箱，可以在老信箱中设置自动回复“该信箱已停止使用，请使用新地址”……&lt;/p&gt;
&lt;p&gt;通过这两个最最简单的应用，大家可以发现，“自动回复”功能让你如同雇用了一个秘书，一丝不苟的帮你处理来信，只不过她能处理的问题比较单一而已。&lt;/p&gt;
&lt;p&gt;要想充分发挥“自动回复”的作用，有两点非常重要：&lt;/p&gt;
&lt;h1&gt;1、个性化的信件（Customerized Mailing）&lt;/h1&gt;
&lt;p&gt;所谓“个性化的信件”，就是信件中有大量收件人特定的信息，如收件人的姓名、称谓、电子邮箱地址和公司名称等。&lt;/p&gt;
&lt;p&gt;举个例子，我们提供一个通过电子邮件的在线系列培训，申请表单上要求你除了信箱地址，还要输入你的姓名。这样，在确认信件以及以后的信件中，这些信息都会包含其中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[姓名]，您好！

非常感谢您参加我的系列培训计划，这个计划将通过电子邮件为您传送相关培训资料，
您目前使用的邮箱地址是[地址]，如果有错误或希望改变信箱，请到站点更新！

再次感谢您的参与，[姓名]，希望我的服务真正对您有所帮助。


Vincent Ping的网站

http://www.vincentping.com/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这是一个最简单的“个性化信件”的例子，你输入的信息越多，个性化的程度就会越高。&lt;/p&gt;
&lt;p&gt;“个性化信件”的好处在于使你的邮件具有亲和力。人们收到商业信件的心情和收到亲朋好友的信件就明显不同，其中一个原因就是对于前者，大家知道自己只是收信人“之一”，而后者自己是唯一的收件人。体现在具体信件上，就是内容的“个性化”程度。&lt;/p&gt;
&lt;h1&gt;2、后续信件（Follow-Up Mailing）&lt;/h1&gt;
&lt;p&gt;网络上有一种说法，要一个潜在客户真正下定单，需要和他有平均7次的接触。所以一封邮件是不够的，需要有“后续”信件。&lt;/p&gt;
&lt;p&gt;实际上，人人都知道“后续信件”对于获得客户的重要性，但是这意味着大量的工作量！&lt;/p&gt;
&lt;p&gt;对于比较成熟的自动回复系统，只需要设置时间间隔，系统就会自动Follow-Up，最大的好处就在于“自动”！&lt;/p&gt;
&lt;p&gt;这两点对于所有的电子邮件营销都是应该注意的，“自动回复机”只是提供了一种方便的技术手段而已！&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;国内目前还没有见到提供“自动回复机”服务的站点，大家可以到下面几个国外的站点试用一下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.getresponse.com" target="_blank"&gt;GetResponse&lt;/a&gt;：该网站提供了邮件列表、自动回复机、登录管理网页定制等功能，目前提供30天的免费试用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.aweber.com/" target="_blank"&gt;Aweber&lt;/a&gt;：这个也是一家非常专业的邮件营销公司，同样提供30天的免费试用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://mailchimp.com/" target="_blank"&gt;MailChimp&lt;/a&gt;：如果你的用户在2000以内，同时每月发送邮件不多于12000封，这家公司完全免费。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="Tech"></category><category term="电子邮件"></category><category term="自动回复机"></category></entry><entry><title>开始建立你的邮件列表</title><link href="https://vincentping.com/cn/create-your-mailing-list.html" rel="alternate"></link><published>2000-05-12T10:13:00+08:00</published><updated>2018-08-06T15:13:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2000-05-12:/cn/create-your-mailing-list.html</id><summary type="html">&lt;p&gt;邮件列表是保持与客户沟通的一种很好的工具。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文翻译于2000年5月，此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Marty:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Kevin，你能介绍一下你的网上企业运作的情况吗？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kevin:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;行。我们是在Linkmedia Communication公司下运作的， 主要业务是建立和发送大量的电子邮件出版物给订户。&lt;/p&gt;
&lt;p&gt;我们的第一份刊物是三年前开始的 A.I.M. Ezine，在去年又开始了其他的一些刊物。现在我们每天要向328,000名订户发送邮件，在16种刊物中销售广告空间。&lt;/p&gt;
&lt;p&gt;我们目前的打算是把邮件转换成以HTML格式发送，以及引入一系列的娱乐方面的新刊物。目前我们的刊物包括：A.I.M. Ezine经营刊物，A Joke of the Day（笑话），Horoscopes（占星术），Entertainment（娱乐），Environment（环境），This Day in History（历史中的今日）等。所有这些刊物全部都集中在MeMail站点(http://www.memail.com)中。&lt;/p&gt;
&lt;p&gt;发展邮件列表的订户是我们的第一任务（译者注：这里的邮件列表不仅 仅指邮件列表电子刊物，它实际上是指搜集用户的Emai地址，而且是在用户自愿的情况下。下同）。如果你分析一下网上的一些大户如Netscape，Yahoo和Infoseek的活动的话，你会发现他们也在做同样的事（同样微软为什么收购Hotmail，近千万的地址是其中的一个重要原因——译者按）。有选择性订户的出版物是发送销售信息的一条主要通道。&lt;/p&gt;
&lt;p&gt;我们在A.I.M. Ezine已经建议过很多很多次，希望我们的读者也开始建立他们自己的用户邮件列表——这将是网上成功的关键。&lt;/p&gt;
&lt;p&gt;我们增加邮件用户的一个有趣的方法叫做“虚拟推广（Virtual Marketing）”，就是让你的用户为你做广告。如我们提供给用户的免费卡通和动画图片。&lt;/p&gt;
&lt;p&gt;用户在我们的站点上http://www.memail.com/animations下载大量的动画，然后把这些好玩的东西在网上传播，例如发送给朋友。这种方法非常灵，当然每一个动画上都有我们公司的名字和URL地址。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Marty:
　　&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;你怎么知道一种方法会成功呢？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kevin: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;只能通过反复的实践。开始到现在我们的方向也改变了好多次， 因为我们是一间只有两名雇员的小公司，加上我共三个人，所以当发现一条路不通时我们可以迅速转向。&lt;/p&gt;
&lt;p&gt;我们从提供网上免费分类广告开始，然后一步步建立起自己的邮件列表， 并从那时起每周向这些订户发送邮件。如果让我来选什么是我们成功的第一因素，我会说是建立了那个邮件列表并不断使用它。我没办法再强调这种方法了：从一点点开始，从你的朋友开始……都行，但是你要现在就开始建立自己的邮件列表，很快它就会成为你的主要宣传方法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Marty: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;你们主要靠什么赚钱呢？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kevin: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;邮件列表是我们的主要生计来源，我们在16种刊物中销售广告。我们也从代销中赢利不少，我们找到一些合适产品的公司，通过为他们代销获取一定的佣金。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Marty: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;哪一种网上工具你使用得最成功？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kevin: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;因为我们订户的数量很大，一个好的邮件服务商绝对是我们最重要的资产。我最初一直在家发送邮件，直到用户超过了两万，因为这会要我发送3-4个小时。现在我们每月付费让专门的邮件服务商替我们发送， 这样无论什么情况都能准时发送。&lt;/p&gt;
&lt;p&gt;对于绝大多数的用户来信我们都使用自动回复机（autoresponders），这种方法工作得很好，节约了我们大量的时间，这些系统都是请CGI专家为我们编的程，我本人没有编过。当有什么方面需要修改，或一个大型的软件要安装的时候，雇一个人帮忙总是不错的。&lt;/p&gt;
&lt;p&gt;互联网的美妙之处就在于你所有的前台运作都能很容易的自动化，这样可 以让你有时间来进行进一步的推广。你一定听说过：保持一个用户比得到一个用户要容易！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Marty: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;就你网上事业而言，你犯过一些什么错误吗？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kevin: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我们最大的错误，而且现在还时不时犯的，是容易分心。我们在一些项目上花了很多的钱和时间，但没有成功。我们常常看到一个机会，认为它有价值，但一旦我们投入了时间和金钱后，我们又失去了兴趣。&lt;/p&gt;
&lt;p&gt;我建议大家能对自己的事业专注些，不要太急忙就转向去尝试别的东西 （网络上的机会太多了，要专注才可能成功——译者按）。如果你发现一个网上的机会或事业能为你赚一些钱，不要因为赚得很慢就放弃了，反而应该更努力的工作。互联网太大了，如果你现在能通过一个项目赚到一块钱，那么你一定能通过它赚到一千块，一万块……你需要得是不断的完善它。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Marty:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;你觉得其他网上经营者的主要错误是什么？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kevin: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;两种错误： 一是不能坚持在一个项目上直到它工作；另一个是为别人的生意忙碌。&lt;/p&gt;
&lt;p&gt;第一个错误我在前面已经讨论过了。后一个是因为我看到很多人专注于代销计划，付出了很大努力，收获却很少，要么是佣金太少的计划，要么就是分销商太多。你应该先找到自己的方向，然后努力。&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Tech"></category><category term="邮件列表"></category></entry><entry><title>网上淘金——新世纪的八条网络解决之道</title><link href="https://vincentping.com/cn/make-money-online-eight-ways.html" rel="alternate"></link><published>2000-02-01T09:32:00+08:00</published><updated>2018-08-06T14:56:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2000-02-01:/cn/make-money-online-eight-ways.html</id><summary type="html">&lt;p&gt;互联网究竟能不能赚钱，除了依赖那些风险基金、为上市奋斗外，我们是否还有其他方式生存和发展呢？&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文写于2000年2月，此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;互联网究竟能不能赚钱，除了依赖那些风险基金、为上市奋斗外，我们是否还有其他方式生存和发展呢？&lt;/p&gt;
&lt;p&gt;环顾国外整个互联网行业，我们发现，除了那些疯狂的扩张、购并、抢占“市场”的大型.com企业外，还有一类经营者，一直在默默地耕耘着。他们没有大笔大笔的风险基金做后盾，也没有什么市场上的炒作，因为他们的兴趣并不是去上市，而是实实在在的赢利和发展（所有企业的目标不都是这吗？）。&lt;/p&gt;
&lt;p&gt;这样的企业基本上都是小型企业（Home-Based、SOHO类），几个人，市场目标非常明确，但是在各自的专业内都非常有名。很多这样的企业应该说已经达到了这个目标：赢利和发展。&lt;/p&gt;
&lt;p&gt;本文就是写给有兴趣在网上创业的个人和小企业的，这八点建议也将是我们自己未来发展的思路所在。&lt;/p&gt;
&lt;h1&gt;一、拥有你自己的独立域名和空间&lt;/h1&gt;
&lt;p&gt;这是开始网络经营的第一步：一定要拥有自己的独立域名。这样在登录搜索引擎时，你站点的机会会大得多，同时独立的域名会让访问者感到稳定，让他们感到你是在认认真真从事一样“生意”！&lt;/p&gt;
&lt;p&gt;有没有可能通过免费空间赚钱呢？有这个可能。但是，我们总是希望能从我们的努力工作中获得最大的收益吧。如果您的站点建立在免费空间，那么这个事实会在来访者的心目中留下“不专业”的印象，并最终影响你的网上生意——千万别冒这个险。&lt;/p&gt;
&lt;p&gt;实际上现在国内国际域名的费用已经很低了！国内域名（http://www.cnnic.net.cn/）每年300元，国际域名降得更低，而且国际域名还容许个人注册，这对于想在网创业的个人和企业都不是什么大数字，而对于您的网上商务形象却非常重要。&lt;/p&gt;
&lt;p&gt;同时，虚拟主机的价格现在也很低，一般30M每年也就几百元。这样，建一个有独立域名和空间的站点每年的费用在1000元左右，这是每个网络经营者必须做的最起码的投资！&lt;/p&gt;
&lt;h1&gt;二、创建自己的电子邮件列表&lt;/h1&gt;
&lt;p&gt;什么是让用户记住你，不断拜访你的站点而且最终购买你的产品和服务的最好方式？——使用邮件列表（或称“电子杂志”）！&lt;/p&gt;
&lt;p&gt;互联网上最主要的应用是电子邮件，很多人每天就是为了收信才上网的，同时电子邮件也是最经济、目前在中国最实际的网络应用。而据统计：互联网上一个用户在购买一种产品前平均需要经过7次的接触。通过邮件列表是再合适不过了：它能让你以非常低廉的价格与订户保持联系。&lt;/p&gt;
&lt;p&gt;国外好的销售站点也都是“非常积极”的邮件列表的拥有者。所谓“非常积极”，是指他们都拥有自己的邮件列表，并且经常性的给用户发送各种有用的信息、建议和销售资料等等。&lt;/p&gt;
&lt;p&gt;所以，无论你是想通过自己的产品或服务赚钱，还是想加入一个会员销售系统赢利，建立一个自己的邮件列表是绝对必要的。（会员销售系统，Affiliates，一种销售方法。比如你介绍一个人到AMAZON买书，AMAZON就给你一定比例的介绍费）&lt;/p&gt;
&lt;p&gt;一般来说，有三种不同的方式来运行邮件列表：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;使用一般的电子邮件软件（如outlook Express、The Bat等）向他们的订户发送信息。&lt;/p&gt;
&lt;p&gt;当订户为数不多时，这种方式是可行的。但是一旦人数超过一千，你就会发现这样做很辛苦。每次你都得花上好几小时来给你订户发信，随着订户进一步增加，你会发现根本就没法处理了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第二种方式是使用他人提供的邮件列表服务。&lt;/p&gt;
&lt;p&gt;这种服务有的是免费的，如上海的通易(http://www.exp.com.cn/)、广东的博大(http://mclub.bodachina.com/)，常州的奔腾网络(http://www.cn99.com/)和国外的Egroups(http://www.egroups.com/)，ListBot(http://www.listbot.com/)等，一般他们会在你发送的邮件中插入他们的广告；&lt;/p&gt;
&lt;p&gt;也有收费的邮件列表服务，国内还没有看到专门的公司，国外有lyris(http://www.lyris.com/)，mail-list(http://mail-list.com/)等。不过上述提到的免费邮件列表服务一般也提供这种商业服务。&lt;/p&gt;
&lt;p&gt;使用这种方式能很方便的管理你的订户，同时发送邮件也很简单。如果您是邮件列表新手或者经费有限，我建议您使用这种方式（这也是我自己的邮件列表使用的方式）。&lt;/p&gt;
&lt;p&gt;这种方式的不足之处是对系统设置、订户资料和邮件投递无法进行完全的控制。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第三种方式是在自己的服务器上使用CGI程序来运行和管理你的列表。&lt;/p&gt;
&lt;p&gt;这种方式要求你要么有自己的服务器，要么你的虚拟主机所在的服务器上安装了相应的CGI程序，同时你申请了CGI的运行权限。&lt;/p&gt;
&lt;p&gt;如果您公司有足够的资金和技术力量的话，我建议您采用这种方式，它能让您完全控制和管理订户、邮件发送等等。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;三、找准一个特定市场并且始终坚持&lt;/h1&gt;
&lt;p&gt;现代社会是一个充满机会的时代，机会多多，所以诱惑也多。互联网更是如此，有时候带着一个目的上网，浏览时稍不留神，就会忘记自己到底来自何方，去往何处！&lt;/p&gt;
&lt;p&gt;对于经营者，网上每天都有来自全世界最新的信息、最棒的点子，而且似乎每一个都挺不错。但是如果你想什么都试试的话，最终你将一事无成。&lt;/p&gt;
&lt;p&gt;从某种意义上来说，互联网上不存在市场问题，你可以在任何一个特定市场赚到钱，问题的关键在于你要选定自己的方向并且持之以恒。&lt;/p&gt;
&lt;p&gt;你应该选择一个你感兴趣并且知道如何去瞄准的市场，并确保你整个网站的内容都是为这一特定目标市场服务的。举个例子，您喜欢音乐或对音乐很在行，建一个音乐站点，通过提供各种各样的音乐信息、知识和音乐文件下载紧紧锁定目标用户，然后可以通过销售相关的产品和服务来获取回报（比如：销售CD、音乐书籍、明星画册、音乐器具、音乐软件等等），在这里，所有的内容都是围绕您的特定市场展开的。&lt;/p&gt;
&lt;p&gt;不要看到上个月有人靠某种商品挣了几百万，你就蠢蠢欲动啦！看看宝洁公司、可口可乐，这些公司这么成功，但是其主营业务却始终是化妆品和可乐！市场不怕小，就怕不专一——互联网上尤其如此。&lt;/p&gt;
&lt;h1&gt;四、至少创造一种你自己的产品或服务&lt;/h1&gt;
&lt;p&gt;当然你可以在各种“会员销售系统”中赚钱，但是最大的利润只来自于你自己的产品或服务。许多网上经营者都忙于代理销售别人的东西，却忘记最赚钱的是那些他代理的商家。&lt;/p&gt;
&lt;p&gt;“可是我没有自己的产品和服务啊！？”你或许会问。&lt;/p&gt;
&lt;p&gt;实际上，你可以制造你自己的信息产品。你的兴趣在哪儿？你喜欢学习些什么？在你的生意，生活和嗜好中，你对什么感到驾轻就熟？编一份关于这些的小册子，写一本这样的书，这样一来，你就拥有自己的商品了。&lt;/p&gt;
&lt;p&gt;你也可以找到一个尚在网下出售的商品，不管是在当地出售的或是通过其他经营渠道销售的。和这个商品的业主达成交易，争取成为他在网上的唯一经销商。&lt;/p&gt;
&lt;p&gt;要不，你也可以开始一种自己的服务。现在网上有很多不同的服务业开展起来了。最常见的是制作网页，组织几个人，代理域名注册、空间租用，你就可以开始服务了；&lt;/p&gt;
&lt;p&gt;又比如你对如何进行网上推广已有一定火侯，也可以把它作为一种服务来提供；更细一些，你专门研究搜索引擎，OK，你可以开展一种搜索引擎递交服务;&lt;/p&gt;
&lt;p&gt;……&lt;/p&gt;
&lt;p&gt;一旦你在网络市场中拥有了自己的商品或服务，你甚至可以建立自己的“会员销售系统”，让别人来成为你的会员，为你的商品和服务出力！&lt;/p&gt;
&lt;h1&gt;五、开拓多样化的网站流量来源&lt;/h1&gt;
&lt;p&gt;使用尽量多的方法来提高流量。传统方法如给媒体发新闻稿、撰写相关专业文章，参加各种展览会，发布广告，在名片、信纸、公司介绍等上面添加网址等等；同时网络上也有很多免费和成本很低的推广方法，比如登录搜索引擎，注册分类目录（尤其是雅虎），把网站信息贴在各种相关的BBS、论坛和网上社区中，与相关站点交换链接，使用定向的电子邮件推广等。&lt;/p&gt;
&lt;p&gt;在网上有一种误解，认为所谓的“网络推广”就是递交搜索引擎。确实，搜索引擎在“网络推广”中非常重要，它能为我们带来很多目标明确的用户，而且最重要的：登录“搜索引擎”是免费的。&lt;/p&gt;
&lt;p&gt;但是光有搜索引擎是远远不够的，首先，登录搜索引擎本身并不能保证浏览者在查询相关内容时找到你的站点，每天有那么多的站点在登录！因此，登录引擎的关键是要能在用户查询结果中名列前位（至少要在前50位），这需要很多时间和工作，而这些时间和工作您用到别的推广方法上，效率会更高！其次，在中文网络里目前实际上可以说还没有完全的“搜索引擎（Search Engine）”，基本上都是“分类目录（Directory）”，无论中文YAHOO、新浪引擎、还是搜狐、网易、悠游，都是以人工分类添加数据库为主，在这种情况下，很难通过站点的改进来提高在查询结果中的排名。&lt;/p&gt;
&lt;p&gt;因此，提交引擎是应该的，而且要经常性的递交（如每月一次、同时站点更新时也重新递交等），但要记住这只是“网络推广”的第一步。&lt;/p&gt;
&lt;p&gt;网络推广中另外的一个错误是电子邮件的滥用，也就是我们平时说的发“垃圾邮件”，很多人希望通过发送几十万、几百万的垃圾邮件达到快速推广的目的！&lt;/p&gt;
&lt;p&gt;抛开“垃圾邮件”的法律问题（这方面国内还没有）和道德问题不谈，一般情况下，这种推广方法从成本和效率上讲是不合算的。垃圾邮件的最大问题是没有针对性，常常看到网上有人在出售几百万的地址，但是这些地址后面的人有什么样的兴趣爱好，愿意收到什么样的信息等这些都无从可知。从费用上讲，收集或购买地址需要成本，发送大量邮件需要成本，大量用户的反弹，如用户到ISP的投诉、愤怒者的邮件炸弹、黑客的恶性攻击等这也会带来大量的成本，而最重要的，您在网上的声誉会受到很大损坏，而这是您想在网上从事商务工作最重要的东西！&lt;/p&gt;
&lt;p&gt;所以，在你准备发送“垃圾邮件”时，请三思！&lt;/p&gt;
&lt;h1&gt;六、开拓多样化的收入来源&lt;/h1&gt;
&lt;p&gt;常常听到很多网站抱怨“赚不到钱”，但是当我进到他们站点时，除了广告，我找不到什么东西可以买，没有与站点内容相关的产品，也没有相应的服务，你怎么赚得到钱呢？&lt;/p&gt;
&lt;p&gt;是的，我们现在的支付系统不完善，配送渠道也很不畅通，但是这些支付和配送系统需要我们在实际操作中去建立和完善，这个世界上从来就没有什么救世主，不可能等谁把这些环节都建好，我们才开始做生意吧！&lt;/p&gt;
&lt;p&gt;支付系统我们现在有邮局汇款、银行转帐和网上支付，配送方面除了各行业自己的内部渠道外，也有邮政、铁路、航空和各种快递服务，难道他们就没有做生意吗？！既然也有人在和他们做生意，我们这些搞网络的为什么就不能做呢？&lt;/p&gt;
&lt;p&gt;现在国内做网站的，有一个很坏的风气，只要名气、只想炒作、只求上市，结果是没有时间和精力去认认真真考虑一下：到底怎么从自己的站点赢利？怎么样去实现自己的赢利目标，最多也就人云亦云的跟着卖卖广告！&lt;/p&gt;
&lt;p&gt;真正想在网络上生存，必须有自己的收入来源，而且要有多样化的收入来源！广告只是一种来源，还有前面说的根据目标人群开发自己的产品和服务，还可以代理别人的产品和服务，参加“会员销售计划”等！&lt;/p&gt;
&lt;p&gt;一句话：想真正赚到钱，必须卖东西，无论是产品还是服务！&lt;/p&gt;
&lt;h1&gt;七、不断学习！&lt;/h1&gt;
&lt;p&gt;最优秀的经营者同时也一定是最好的学生，他们从先行者们身上学习，模仿成功的创意以及经过了长期实践的方法，他们从自己的生意中学习，不断总结成功的经验和失败的教训。&lt;/p&gt;
&lt;p&gt;互联网的发展速度是前所未有的，因为在这里，是全人类的智慧在碰撞，每时每刻在世界的某个角落都会涌现着新的想法、新的技术和应用！要在这样的环境下成功，学习的激情和不断提高的学习能力是必不可少的。&lt;/p&gt;
&lt;p&gt;有时候我想，为什么我们要选择互联网这个行业？我发现除了可能的名和利外，更在于它的未来不确定性，在于它带给我们的机遇和挑战，在于任何时候它总能让我们找到惊喜，在这里你永远不用担心会过上早九晚五的生活，你必须时时准备刷新自己（Refresh and Update）！&lt;/p&gt;
&lt;p&gt;学习并不表示一定要去学校或者参加培训，你可以成为你自己实践的学生。你可以学习，测试，并对你的潜在客户进行民意调查，了解什么是他们在生意中所需要的。&lt;/p&gt;
&lt;p&gt;在未来一年中，列出计划去订阅一些在线教程、阅读一些书籍、光盘和资料，这将有助于提升你的网上经验，从而让你从这些宝贵的经历中真正获益。同样，你也应该多阅读各种报道、分析文章，从其他人那里吸取营养和教训。&lt;/p&gt;
&lt;h1&gt;八、一切都是为了生活！&lt;/h1&gt;
&lt;p&gt;也许这说起来有点太学术气了,但是我们的生意，无论是网上的，还是网下的，都是为了什么呢？
——为了更好的生活！
——为了让我们爱的人和爱我们的人能够更加快乐和幸福！&lt;/p&gt;
&lt;p&gt;所以网上生意的目标决不仅仅是挣钱，它的意义远过于此，它还应该要为我们创造一种新的生活方式，让我们在今后的日子里能够更好的享受生活。&lt;/p&gt;
&lt;p&gt;一天工作12个小时绝不是网上经营的真谛。你必须努力设计好你的站点和网上生意，并使之运行良好，同时网络的更大特点还在于它能你的生意达到95%的自动化。使用自动回复机，实时网上处理，数子化产品交付等等，网络能大大降低你在传统生意中必须身体力行而消耗的时间和精力。&lt;/p&gt;
&lt;p&gt;自从有了人类以来，我们一直为了生存而努力，在工作和享受生活之间寻找平衡！（当然，你爸爸给你留了几个亿除外：-）互联网可能是第一次让我们有机会实现一个人类共同的梦想：不仅有钱，而且有时间做自己想做的事，并且，“全靠我们自己”！&lt;/p&gt;
&lt;p&gt;所以，无论遇到什么不期的困难，获得多大的成功，请记住：这一切都是为了生活！&lt;/p&gt;</content><category term="Tech"></category><category term="网络营销"></category><category term="创业"></category></entry><entry><title>网页中META标签的使用</title><link href="https://vincentping.com/cn/using-meta-tags-in-web-pages.html" rel="alternate"></link><published>2000-01-04T18:15:00+08:00</published><updated>2018-08-06T14:38:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,2000-01-04:/cn/using-meta-tags-in-web-pages.html</id><summary type="html">&lt;p&gt;网页中使用META值，以便搜索引擎能知道网页的内容。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文写于2000年1月，此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Meta标签放在每个网页的 &lt;code&gt;&amp;lt;head&amp;gt;...&amp;lt;/head&amp;gt;&lt;/code&gt; 中，我们大家比较熟悉的如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lt;meta name=&amp;quot;GENERATOR&amp;quot; content=&amp;quot;Microsoft FrontPage 3.0 &amp;gt;说明编辑工具；
&amp;lt;meta name=&amp;quot;KEYWORDS&amp;quot; content= ... &amp;gt;说明关键词；
&amp;lt;meta name=&amp;quot;DESCRIPTION&amp;quot; content= ... &amp;gt;说明主页描述；
&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=gb_2312-80 &amp;gt;和
&amp;lt;meta http-equiv=&amp;quot;Content-Language&amp;quot; content=&amp;quot;zh-CN&amp;quot;&amp;gt;说明所用语言及文字...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;可见META有两种，name和http-equiv。&lt;/p&gt;
&lt;p&gt;name主要用于描述网页, 对应于content, 以便于搜索引擎机器人查找、分类（目前几乎所有的搜索引擎都使用网上机器人自动查找META值来给你的网页分类）。这其中最重要的是DESCRIPTION（你的站点在引擎上的描述）和KEYWORDS（搜索引擎籍以分类的关键词），应该给你的“每一页” 都插入这两个META值。&lt;/p&gt;
&lt;p&gt;当然你也可以不要搜索引擎检索, 可用：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;meta name="ROBOTS" content="all | none | index | noindex | follow | nofollow"&amp;gt;&lt;/code&gt;来确定：&lt;/p&gt;
&lt;p&gt;设定为"all"时文件将被检索，且页上链接可被查询；
设定为"none"则表示文件不被检索，而且不查询页上的链接；
设定为"index"时文件将被检索；
设定为"follow"则可查询页上的链接；
设定为"noindex"时文件不检索，但可被查询链接；
设定为"nofollow"则表示文件不被检索，但可查询页上的链接。
http-equiv，顾名思义相当于http文件头的作用，可以直接影响网页的传输。比较直接的例子如：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自动刷新，并指向新网页&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;meta http-equiv="Refresh" content="10; url= http://yourlink"&amp;gt; 10秒后刷新到http://yourlink;&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;网页间转换时加入效果&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;meta http-equiv="Page-Enter" content="revealTrans(duration=10, transition=50) &amp;gt; 
&amp;lt;meta http-equiv="Page-Exit" content="revealTrans(duration=20, transition=6) &amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;加在一个网页中，进出时有一些特殊效果，这个功能即FrontPage 98的Format/Page Transition。不过注意所加网页不能是一个Frame页;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;强制网页不被存入Cache中&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;meta http-equiv="pragma" content="no-cache"&amp;gt; 
&amp;lt;meta http-equiv="expires" content="wed, 26 Feb 1997 08:21:57 GMT"&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;大家可以到&lt;a href="http://www.internet.com" target="_blank"&gt;http://www.internet.com&lt;/a&gt;上看看，它的首页当你断线后，就无法在cache中再调出。（本身是关于建站很棒的站点)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定义指向窗口&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;meta http-equiv="window-target" content= _top{: target='_blank'}"&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;可以防止网页被别人作为一个Frame调用.(不过,我试了一下,似乎不灵)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Meta还有很多功能, 如大家关心的"怎样在搜索引擎中，被放在搜索结果前面的位置" 。 你可以在以下站点进一步查询：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http://webdeveloper.com/categories/html/ html_metatag_res.html&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vancouver-webpages.com/META/" target="_blank"&gt;http://vancouver-webpages.com/META/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;http://www.nlc-bnc.ca/ifla/II/metadata.htm&lt;/li&gt;
&lt;/ul&gt;</content><category term="Tech"></category><category term="网络营销"></category><category term="META"></category></entry><entry><title>让用户知道你——建设企业网站之推广篇</title><link href="https://vincentping.com/cn/let-world-know-website-promotion.html" rel="alternate"></link><published>1999-10-07T11:01:00+08:00</published><updated>2018-08-06T14:34:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,1999-10-07:/cn/let-world-know-website-promotion.html</id><summary type="html">&lt;p&gt;初步完成一个站点的设计建设，只是企业网站经营的开始。为了真正发挥一个站点的作用，我们要以该站点为基础，在网上网下开展长期而有效的推广工作。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文发表在1999年10月7日《中国计算机报》。此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;初步完成一个站点的设计建设，只是企业网站经营的开始。为了真正发挥一个站点的作用，我们要以该站点为基础，在网上网下开展长期而有效的推广工作。&lt;/p&gt;
&lt;h1&gt;传统媒体的运用&lt;/h1&gt;
&lt;p&gt;在现阶段的中国，传统媒体宣传的影响力仍然远大于网络，特别是对于面向国内的站点，电视、报纸、杂志等这些媒体的效应可以说是立竿见影，这也是为什么现在那么多网站喜欢炒作的原因———通过吸引媒体，特别是传统媒体的注意力达到宣传的作用。企业网站的推广，应该融入在整个企业的宣传工作中，在所有的广告、展览、各种活动中都要在显著处加入公司的网址，并做适当介绍。&lt;/p&gt;
&lt;h1&gt;网址宣传融入日常工作&lt;/h1&gt;
&lt;p&gt;除了这些广告宣传活动外，另外还有大量的日常工作需要做，要把网址加入到：信封、信纸、名片、手提袋等各种办公用品；企业建筑造型、公司旗帜、企业招牌、公共标识牌等外部建筑环境；企业内部建筑环境，如内部常用标识牌、货架标牌等等；各种交通工具；公司员工的服装服饰上等；各种产品包装袋上；公司平时的赠送礼品上；公司的各种印刷出版物上……要能全面利用这些宣传手段，实际上需要我们在设计公司的CI（企业识别系统）时将网站这个因素考虑进去，网站实际上是CI设计中的一个基本要素。&lt;/p&gt;
&lt;h1&gt;网络的运用&lt;/h1&gt;
&lt;p&gt;网络最吸引人之处就在于它极大地降低了信息发布与获得的成本，而且利用网络推广的辐射面更广，这一点对于以出口为目的的企业特别有吸引力。&lt;/p&gt;
&lt;p&gt;网络推广的具体方法很多，主要的有登录搜索引擎，利用各种论坛、讨论组、供求黄页，使用定向的邮件列表等等。但正如我们在前几篇文章所说的，企业网站和提供信息内容的站点（ICP）相比，由于其出发点不同，目标访问者也有所不同，企业站点一般更有针对性，它追求的不是Pageview（页面阅读数），而是实际为企业带来的效益，如业内知名度、定单数等。所以企业站点在推广上需要更加强调“针对性”，包括地域上和行业上。&lt;/p&gt;
&lt;p&gt;比如说，一家主要面向东南亚的出口企业，那么它的网上推广策略应该服务于整个企业，注册搜索引擎也好，在论坛、供求站点留言、定向邮件也好，要把东南亚地区作为重点，虽然网络本身是不分地域的，但是我们的访问者有地域差别。再比如说，一家提供专业机械设备的企业，它的推广就更有针对性，它可以在一些“专业”引擎上注册，在“专业”的供求站点上留言，与相似或相邻行业的站点建立链接，发布专业的邮件列表等等。&lt;/p&gt;
&lt;h1&gt;收集具“针对性”的站点&lt;/h1&gt;
&lt;p&gt;从以上我们可以看到，在了解了基本的网络推广方法后，一个企业站点的网上推广工作首先需要做的是收集具“针对性”的站点，包括引擎、论坛等，这和我们在传统媒体上做广告实际上是一样的———要收集媒体信息，并且分析研究哪本杂志、哪一份报纸、电视的哪一档节目更适合。&lt;/p&gt;
&lt;h1&gt;了解各个站点的宣传影响力&lt;/h1&gt;
&lt;p&gt;在收集了大量有针对性的站点后，接着就是通过实际操作了解各个站点的宣传影响力，整理出在各个宣传站点上的发布频度。再下面的工作包括：日常的来信及时回复，建立用户及潜在用户数据库，根据该数据库发布邮件列表，加强与这些用户的联系等。&lt;/p&gt;
&lt;p&gt;讲了这么多，看起来很复杂，但实际上就这么四句话：“确定宣传方向，收集推广站点，定期发布信息，做好跟进工作”。这其中，最花时间和精力的其实是“收集站点”这一步，而像“定期发布”和“跟进工作”都可以通过一些软件工具做到自动化。&lt;/p&gt;
&lt;p&gt;最后，我还想强调一点，对于任何一家企业，广告宣传、市场推广都必须围绕企业的产品和服务，没有产品和服务的不断完善，所有的宣传都只会是“事倍功半”！对于企业站点来说，“让我们的用户和潜在用户都知道”就够了。&lt;/p&gt;</content><category term="Tech"></category><category term="网络营销"></category><category term="网站推广"></category></entry><entry><title>组织网站内容——建设企业网站之建设篇</title><link href="https://vincentping.com/cn/website-content-organizing-building.html" rel="alternate"></link><published>1999-09-27T13:17:00+08:00</published><updated>2018-08-06T14:31:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,1999-09-27:/cn/website-content-organizing-building.html</id><summary type="html">&lt;p&gt;在做完“企业网站定位”工作、确定了网站“为什么做”和“为谁而做”，接下来就需要根据目标访问者的潜在需求确定网站的内容。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文发表在1999年9月27日《中国计算机报》。此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在做完“企业网站定位”工作、确定了网站“为什么做”和“为谁而做”，接下来就需要根据目标访问者的潜在需求确定网站的内容。&lt;/p&gt;
&lt;h1&gt;重视交互内容&lt;/h1&gt;
&lt;p&gt;对于一般企业的站点，网站内容大致可以分为两类：静态信息内容和与访问者的交互内容。前者主要是一些文字及图片的信息，如企业的介绍、产品服务的说明等等；而交互功能则更多是需要运行后台CGI程序的一些内容，如论坛、BBS、数据库接口、查询等等。&lt;/p&gt;
&lt;p&gt;由于对网络的不够了解，很多企业在建站过程中常常没有考虑交互部分，他们更多的以为站点只是一个企业宣传册的电子版。因此，站点策划人员在收集准备网站内容时一定要特别强调这种交互功能，这样可以让站点更加充分地利用互联网的互动特性。&lt;/p&gt;
&lt;h1&gt;按访问者兴趣分组信息&lt;/h1&gt;
&lt;p&gt;收集了各方面的内容，确定了相应的交互功能后，下一步就是这些内容的分组。分组的目的是为了根据浏览者的访问习惯，有序地展示内容，吸引访问者看下去，同时在分组过程中还可发掘潜在的信息内容———换句话说就是确定站点的导览系统。&lt;/p&gt;
&lt;p&gt;这里可以举一个例子：世纪互联在发布“上网送免费猫”活动时建了一个活动站点。在最初决定站点内容的分组时，完全按照一种最常见的模式：公司介绍、活动内容、如何参与、合作单位等等，但是当我们换一个角度看时，发现这种分组方法完全是站在信息提供者的角度想问题，并没有反映出访问者最关心的内容。最后经过重新考虑分组，基本导览系统变为：免费猫缩不缩水、上网速度快不快、出了问题怎么办、已经有猫怎么办等等，可以说这才是消费者真正感兴趣的东西。实际上在这个例子中，两种分组下的信息内容基本上一样，但不同的分组方式对访问者的吸引效果就完全不同了。&lt;/p&gt;
&lt;p&gt;分组的最后结果应该是定出整个网站的导览系统，一个站点可以有多个导览系统：基本导览系统（这常常是访问者最关心的内容）、第一辅助导览系统、第二辅助导览系统……特别导览系统等等。从根本上讲，导览系统反映了内容分组时的思路，还是上面“免费猫”的例子，除了上面的基本导览系统外，还可以有一个辅助导览：关于公司、服务论坛、业界评论等，这些是访问者对你的活动（也可以是产品或服务）感兴趣之后，才会想去了解的内容，所以叫做“辅助导览”。&lt;/p&gt;
&lt;p&gt;经过上述一系列的分析整理，最后我们就得到了网站的完全信息结构。这个信息结构除了包括站点的导览系统外，还要包括交互设计部分，同时还要确定的就是：站点的首页。&lt;/p&gt;
&lt;h1&gt;首页设计很关键&lt;/h1&gt;
&lt;p&gt;除了那些完全树立形象的页面外，一个站点的首页基本上反映了该站点大部分设计思想：导览系统、设计风格、交互内容、主要更新，所以首页对于一个网站来说非常重要。首页定下来了，可以说一个站点完成了一半，实际上我们记住的一些站点，也就是记住了他们的首页。首页中有些什么内容、图片（如公司的LOGO、广告BANNER位）、提交表单（如邮件列表订阅）等等，这些在分析一个网站的信息结构时都必须确定。&lt;/p&gt;
&lt;h1&gt;注意视觉的设计&lt;/h1&gt;
&lt;p&gt;另外在视觉设计上的一些内容也需要在这一阶段确定。&lt;/p&gt;
&lt;p&gt;网站的设计按照什么样的分辨率，是800×600，还是600×480，或者1024×728。在前几年，600×480特别流行，现在国内的站点基本上都是800×600了，但是如果主要面向国外访问者的，建议仍然使用600×480。&lt;/p&gt;
&lt;p&gt;浏览器的兼容问题，当然现在IE所占的市场份额越来越大，但是我们仍然需要考虑到Netscape以及Opera这些浏览器用户。&lt;/p&gt;
&lt;p&gt;设计风格的考虑，如色彩的搭配，图形、线条的使用等等，建议这时最好能有建站公司的VI（Visual Identification）作为参考。&lt;/p&gt;
&lt;p&gt;到这里，可以说是完成了一个站点的准备工作，下面就是设计制作人员以及技术人员的具体制作了。&lt;/p&gt;</content><category term="Tech"></category><category term="网络营销"></category><category term="网站建设"></category></entry><entry><title>为什么做与为谁而做——建设企业网站之定位篇</title><link href="https://vincentping.com/cn/website-positioning-why-for-who.html" rel="alternate"></link><published>1999-09-23T18:23:00+08:00</published><updated>2018-08-06T14:26:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,1999-09-23:/cn/website-positioning-why-for-who.html</id><summary type="html">&lt;p&gt;建设一个企业网站，首先需要做的应该是确定建站的目的，也就是确定为什么做和为谁而做的问题。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文发表在1999年9月23日《中国计算机报》。此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;建设一个企业网站，首先需要做的应该是确定建站的目的，也就是确定为什么做和为谁而做的问题。&lt;/p&gt;
&lt;h1&gt;为什么建企业网站&lt;/h1&gt;
&lt;p&gt;一个企业为什么要建立自己的站点呢？目前来讲，大致有如下几种目的：在网络上树立企业形象；推广企业的产品及服务；通过网络为各种客户提供服务、支持；开展电子商务等等。&lt;/p&gt;
&lt;p&gt;其中，树立形象常常是最基本的出发点。例如老总出外开会，到会者谈起来似乎都已经有了自己的站点，而且人们都在大谈上网对于企业的种种好处，于是老总回来后，召集相关部门负责人，要求网站要赶快上……。在我们平时为企业提供服务中，这种情况经常遇到，表面上，这个站点是"为老板做的"，但是实际上老板又是为了什么呢？——形象。现在企业没有一个网站，名片上没有网址、Email地址，就像没有电话号码一样，对企业的形象有很大影响。&lt;/p&gt;
&lt;p&gt;除了树立形象，人们会希望网站能真正为企业带来一些实效，如宣传推广企业的产品和服务，帮助企业联系用户等等，这可以说是在建站目的上进了一层。这样的实际例子也很多：一个小企业，几个系列，十几种产品，希望建一个网站推广自己的产品。这种网站的更新工作会相对较少，它实际上就是利用了网络的无国界、24小时在线、成本很低等特点，相当于建了一个网上宣传册，其针对性非常强，关键在于它的宣传工作。例如北京通鉴商务顾问公司，它建设站点主要是想推广VCD，这些VCD的内容包括对一些企业的成功与失败的案例的分析等等，有很强的针对性，在站点最初的一百多位访问者中，就有六人定购了VCD。这是一个典型的推广产品服务类的站点。&lt;/p&gt;
&lt;p&gt;接下来，人们考虑建设企业站点的目的应该就是发展电子商务了，目前主要能开展的工作是网上订购、网上支付等等。这类考虑，相对都是在对网络有了一定了解之后开始的。特别是目前还没有比较完善的网上支付体系，各家银行都处在试验期，所以大规模地开展电子商务还有待时日。&lt;/p&gt;
&lt;h1&gt;企业网站给谁看&lt;/h1&gt;
&lt;p&gt;明确了建站目的，接下来就应该是确定站点的市场，也就是"为谁而做"的问题。在这时，我们常常可以问自己这样一个问题："我希望什么样的人访问我的站点呢？"对于不同的建站目的，就会有不同的市场考虑。例如主要是树立企业形象的站点，对访问者的考虑就会比较少，而对于以推广产品服务和联系客户为目的的站点，就会更多希望现有用户和潜在用户的访问。如在前面关于北京通鉴的例子中，其目标访问者就应该是企业的经营者或对企业经营、产品感兴趣者。&lt;/p&gt;
&lt;h1&gt;怎样提供信息&lt;/h1&gt;
&lt;p&gt;确定目标访问者，还需要问自己"这些人为什么要访问我的站点呢？"，这时我们是在考虑这些目标访问者的需求问题，只有有针对性地提供网站信息内容，才能更好地吸引访问者。如果访问者关心售后服务甚于产品价格时，网站上就应该更多强调售后服务的内容。&lt;/p&gt;
&lt;p&gt;进一步，我们还可以问这样一个问题："人们为什么要到我的站点来？"，也就是我们的站点与竞争者相比有什么独特吸引人之处。在这时候，应该对竞争对像的站点进行比较细致的分析，看看他们都提供了一些什么样的内容，针对的访问对象和我们有什么不同等等，通过这样的分析，就能更加清楚自己的优点和不足，从而做到扬长避短。实际上，对竞争者站点的分析应该贯穿整个企业站点的建设过程之中，通过全面的分析从而吸取他们的优点，避免他们的短处。&lt;/p&gt;
&lt;p&gt;到现在，通过这一系列的考虑和分析，我们就能对自己的站点建设方向有比较清晰的认识，而这是所有网站建设的根本，只有在这个基础上，我们才能更明确具体的内容、设计的风格以及后续的推广方向、发展策略等等。&lt;/p&gt;</content><category term="Tech"></category><category term="网络营销"></category><category term="网站建设"></category></entry><entry><title>提高在搜索引擎中的排名</title><link href="https://vincentping.com/cn/promote-search-engine-ranking.html" rel="alternate"></link><published>1999-09-09T08:10:00+08:00</published><updated>2018-08-06T14:20:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,1999-09-09:/cn/promote-search-engine-ranking.html</id><summary type="html">&lt;p&gt;提高网站在搜索引擎中的排名，相关的几个问题&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文发表在1999年9月9日《中国计算机报》，标题为《提高在引擎中的排名》。此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;问题1：我有一个自己的域名http://www.abc.com/，但把它指向到一个免费空间站点，不知道搜索引擎是否能正确地检索到？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对于这种将一个域名地址重定向到另一个地方的做法，有些引擎可以正确检索，有些则不行，这得看具体的引擎和您使用的重定向方法。比如，几乎所有的引擎都会对在 &lt;code&gt;〈head〉．．．&amp;lt;/head&amp;gt;&lt;/code&gt; 中使用自动刷新（refresh）meta标签进行惩罚；使用javascript也差不多。而对于使用ssi重定向，目前多数引擎基本上还支持，但是情况也正在发生变化。&lt;/p&gt;
&lt;p&gt;从根本上讲，网站的重定向，无论采用什么技术，都不是好主意，因为太多的人试图利用这些方法来提高站点的搜索排名，这些技术早晚都会被引擎给封掉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题2：请问meta标签到底是怎么一回事，真的对站点在搜索引擎上的排名很有用吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个问题得从meta标签的产生说起。最初网页的设计很复杂，需要几个人一起来做一页，为了让大家都能了解这一页的主题中心，人们开始使用meta标签，作为自己对页面的脚注说明，同时这些说明浏览者看不到。&lt;/p&gt;
&lt;p&gt;接着出现了搜索引擎，它们首先遇到的一个障碍就是如何“自动”判定一个页面的内容。人们想到了meta标签，检索机器人（robots）只须检索页面的meta值，而无须整个页面就能了解该页面的内容了。&lt;/p&gt;
&lt;p&gt;人们知道了引擎的这种运作方式，于是在页面中加入很多meta标签以提高排名，很快搜索引擎对检索方法做了改进，对meta的依赖越来越少，它们增加了自己的算法：综合考虑meta标签、标题（title）、页面最初几段的内容、域名的链接广泛性等。&lt;/p&gt;
&lt;p&gt;到现在，meta标签实际上只是一种告诉引擎robots您认为自己的站点是关于什么的“建议”而已！最终仍然要由各个搜索引擎的“算法”来做判断。&lt;/p&gt;
&lt;p&gt;所以meta标签现在并没有像很多人说得那么神奇。我们在使用它时，应当选择那些真正与页面内容有关的词或词组，并且尽量围绕一个中心主题（subject）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题3：我根本就没有把站点递交到雅虎（yahoo），在雅虎的目录（directory）中也找不到，但是在使用它的搜索时却能查到，不知是什么原因？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;雅虎是最有名的引擎（严格说是目录），所以访问量最大，尽管事实上它后台数据库中收集的网站并不多，不到整个网络世界中的1％。但作为一个搜索引擎／目录，必须对任何的查询都作出一定回应，它需要更为强大的数据库，怎么办呢？雅虎的方法不是建立自己的数据库，而是采用更快、更容易、更方便的方法：购买和租用他人的———inktomi！&lt;/p&gt;
&lt;p&gt;inktomi是一个真正的搜索引擎，它拥有世界上最大的数据库。实际上，它在后台支持着十几个有名的搜索引擎，比如hotbot、snap、msn，当然也包括雅虎，而且inktomi还提供一种订制服务，这样雅虎和snap使用着同样的数据库，但结果却因为各自的设置而并不完全一样。这也就是雅虎对于其自己的目录数据的一种补充，当它在自己的数据库中没有找到响应结果时，它就会自动返回inktomi中的查询结果。&lt;/p&gt;
&lt;p&gt;那么如何进入inktomi的数据库呢？inktomi.com站点没有“添加站点（addurl）”这一项。事实上只有两种加入方法：一是将站点递交到那些有“addurl”，同时又采用了inktomi数据库的引擎，如hot bot、canada.com、icqit.com，snap.com等；二是inktomi的检索机器人自己来拜访您的站点。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题4：在提高搜索引擎中的排名中到底有什么窍门呢？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;实际上，好排名的“窍门”很简单”———内容，丰富、有价值的内容。虽然每个引擎在排名中有各自的算法，但是内容都是关键和根本。同时也应该尽量了解这些引擎，了解它们的规定、算法等，这样我们就能更好地和它们沟通，更好更快地使用meta、title、链接广泛性等告诉它们站点是关于什么的！&lt;/p&gt;
&lt;p&gt;一旦您学会了这种“沟通”，又有了丰富、高质量的内容，排名就一定会在前面。千万不要去寻找那些试图欺骗引擎的所谓“诀窍”，那样会让您得不偿失！&lt;/p&gt;</content><category term="Tech"></category><category term="网络营销"></category><category term="搜索引擎"></category></entry><entry><title>企业网站的4种模型</title><link href="https://vincentping.com/cn/four-types-company-websites.html" rel="alternate"></link><published>1999-09-02T14:04:00+08:00</published><updated>2018-08-06T14:16:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,1999-09-02:/cn/four-types-company-websites.html</id><summary type="html">&lt;p&gt;互联网上每个站点都有其商务模式，虽然这些模式是千差万别的，但实际上都可以归结到4种典型的商务模式上来，这些模式构成了网站的基础结构。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文发表在1999年9月2日《中国计算机报》。此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;互联网上每个站点都有其商务模式，虽然这些模式是千差万别的，但实际上都可以归结到4种典型的商务模式上来，这些模式构成了网站的基础结构。这4种类型是：信息型、广告型、信息订阅型、在线销售型。&lt;/p&gt;
&lt;p&gt;并不是每一种模式都可以直接获取收益的，但它们都需要成本。此外，许多站点对这4种典型商务模式中的几种进行了组合。这4种典型模式中的每一个都具有其独有的特性，这些特性将它们互相之间区别开来。&lt;/p&gt;
&lt;h1&gt;一、信息型站点&lt;/h1&gt;
&lt;p&gt;信息型站点（也称作传单站点或是公告牌站点）的设计目的在于通过间接的途径获取经济效益，收益的根源在于通过网络使公众对其产品和服务产生注意，从而增加现实当中的交易机会。&lt;/p&gt;
&lt;p&gt;与公路上的公告牌一样，这种站点的效果应当通过网民冲浪时的注目率以及他们受到的购买诱惑来衡量。现在，多数的企业都建立了这种“电子宣传单”来提供其有关产品、招聘机会、投资关系以及用户服务的信息。其经济收益通过网下实际销售的商品及服务来间接地实现，成本则通过减少多余的基础设施和提高效率而得以降低。&lt;/p&gt;
&lt;p&gt;一些企业认为，这样的做法最有利于避免销售渠道冲突。所谓销售渠道冲突，指的是不同的销售途径而引起的价格差异。&lt;/p&gt;
&lt;h1&gt;二、广告型站点&lt;/h1&gt;
&lt;p&gt;网络电视、广播及许多期刊性网站走的是广告模式的路子，所有的技术和信息内容编制所需的费用全都来源于广告收入。此时，消费者的注意力就成为网站价值的关键衡量标准，老练的广告商可以对一个网站进行评估并为其广告定价。对于电子商务来说，广告的形式一般可能是网页横幅、赞助商支持以及其他的促销手段。&lt;/p&gt;
&lt;p&gt;许多人不遗余力地对这种模式进行炒作，然而在网络上并没有多少实例可以证明其效果。的确有那么几个站点是完全依靠广告收入来支撑运作的，但是由于网络上的广告宣传效果难于统计，这就妨碍了广告客户对这种形式的接纳。当有关消费者行为的认识得到进一步深化的时候，专家们就可以更有效地进行购买行为分析，为广告客户提供足以支持其促销决策的完整数据。&lt;/p&gt;
&lt;h1&gt;三、信息订阅型站点&lt;/h1&gt;
&lt;p&gt;在其他的媒体当中，订阅型模式已经相当完善了，因为它已经完全为出版商和订阅者所接受。而在互联网上，订阅机制仍没有广泛地为消费者所接受。&lt;/p&gt;
&lt;p&gt;在那些接受了这种模式的消费者当中，订阅机制也仅仅是迎合了某些特定会员用户的特定需要，这些站点提供的往往是一些专业内容和定期的消息，订购者所交纳的费用用于支持网站的开发和维护。&lt;/p&gt;
&lt;p&gt;订购的费用可能按周、月或年来支付。最常使用的支付手段是信用卡，因为信用卡可以最方便地处理周期性电子事务。&lt;/p&gt;
&lt;h1&gt;四、在线销售型站点&lt;/h1&gt;
&lt;p&gt;一个进行产品销售的网站实质上是一个电子版的产品目录。这些虚拟的店面通过精心编制的图片和文字来描述他们所提供的产品、进行促销活动、提供“网上购物车”系统，以及在线交易系统。&lt;/p&gt;
&lt;p&gt;一旦产品被购买了，该网络企业就得安排产品销售的执行，包括运送和安装等。执行过程有时候是有网络企业来进行，有时则是直接由生产商通过特定的配送机制来完成。一些生产厂商现在正逐渐地跨过批发商和零售商等中间媒介而直接向消费者提供产品，这种供应链断裂现象一般被称作无中介形式。&lt;/p&gt;
&lt;p&gt;虽然这一类型的站点绝大多数销售的是有形产品，同样也可用来提供服务类的产品，其主要特征在于它们能够进行一次结清的交易，而不需要太多的后续纠葛。&lt;/p&gt;
&lt;p&gt;其实谁也无法预料网络这一日新月异的媒体将来会是什么模样，但显而易见的是，所有的这种商务模式至少在短期之内都还将继续存在。对每一种模式而言，它们都将会在综合性和可操作性两个方面同时成熟起来。消费者也将会越来越乐于到国际互联网上去寻找传统商贸形式的替代品，因为传统商贸媒介在时间和空间上的局限性几乎是不可克服的。对“网络企业家”来说，对每种模式都应该进行谨慎的考虑并明确地理解其最重要的价值所在。有了对这些商务模式的正确认识，就可以轻而易举地拟订财务计划并制定商务规划。&lt;/p&gt;</content><category term="Tech"></category><category term="网络营销"></category><category term="网站"></category></entry><entry><title>注册搜索引擎问与答</title><link href="https://vincentping.com/cn/search-engine-question-answer.html" rel="alternate"></link><published>1999-08-26T10:12:00+08:00</published><updated>2018-08-06T14:07:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,1999-08-26:/cn/search-engine-question-answer.html</id><summary type="html">&lt;p&gt;注册搜索引擎过程中一些常见问题及其解答。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文发表在1999年8月26日《中国计算机报》。此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;问：当一个站点已经登录到各个主要的搜索引擎，而且位置也不错时， 过一段时间后是否需要重新注册呢？如果是，应该过多久比较好？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;答：一般情况下，我们不需要重新注册，除非站点在引擎中的排名下降了或者您的站点有比较大的更新。对于一些小的更新，由于大多数使用搜索机器人(Robot)的引擎会每隔两到六周就重新访问一次您的站点，所以您无需重新注册。&lt;/p&gt;
&lt;p&gt;对于排名下降的情况，也需要首先分析是什么原因。 正常情况下排名是会逐渐下降，因为不断有新站点登录进来。对于这种情况，应该注意监控，当排名超过某一值时，可考虑重新注册。 但如果出现这样的情况：站点的排名突然从3位一下降到了279位，这时只进行简单的登录将毫无用处，因为这种情况常常是因为引擎的查询算法发生变化引起的。您需要首先研究引擎新的查询算法，调整站点的页面，然后才是重新注册。&lt;/p&gt;
&lt;p&gt;总的来说，除非出了什么问题，否则，不要经常注册—因为太多的搜索引擎会惩罚那些频繁注册者。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问：听说很多搜索引擎不接受免费站点，而且需要有独立域名，请问这是不是真的？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;答：首先，并非所有的搜索引擎拒绝免费站点，但确实有这种情况。大多数引擎都会记录各登录站点的IP地址，而通常很多免费站点都是共用一个IP地址，这样当这些具有相同IP地址的站点注册时，会被 搜索引擎认为是频繁注册者，该地址就会被封掉。&lt;/p&gt;
&lt;p&gt;其次，很多通过人工分类的引擎(例如雅虎)，现在基本上已经不再收录免费站点，一方面因为这些引擎的工作量非常大，另外也是因为很多免费站点常常出现更新慢、停止更新、不稳定或突然消失等现象。&lt;/p&gt;
&lt;p&gt;所以，如果真心想在互联网上发展，应该有自己的独立域名和空间， 而且两年700元的国际域名费和每年500元的30M空间费比起传统投资来说微不足道。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问：对于每个域名，可以递交多少次，而不被搜索引擎认为是频繁注册呢？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;答：每个搜索引擎都有专门的页面介绍如何递交网址以及相关的规定，只要您认真看一下，就能找到每个引擎对递交次数的限制。但是根据我的验，他们说的常和他们实际做的不一样。比如：AltaVista规定每天每个域名最多可以递交10个页面，但实际上超过了2次的注册就不起作用了。&lt;/p&gt;
&lt;p&gt;对于一般的引擎，有一个比较通用的办法：每天每个域名最多注册一次，然后大约每30天重新递交一次，注意内容要有所更新！&lt;/p&gt;
&lt;p&gt;另外要记住，站点的每个内页都要能从首页链接到，然后递交该首页。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问：我们公司的站点在所有的引擎上都注册了，而且基本上都登录上了， 可是惟独在雅虎(Yahoo)没有成功，而它又是最重要的引擎，请问注册雅虎有没有什么窍门？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;答：关于雅虎，我能给您的建议是：&lt;/p&gt;
&lt;p&gt;一定不能有任何页面是“在建设中”；
一定要认真研究适当的目录，比如看看竞争站点所处的目录等；
站点的标题、描述和关键词要认真准备，真实反应站点的内容，千万不要使用一些广告宣传性的词汇。
完成这些工作后就可以递交，接下来是等待。如果两周内没有收到雅虎的确认信，就需重新递交。
目前，雅虎提供了一种商业性的服务，只要您付费199美元，雅虎保证在7天内给您回音，而且如果未被接收，他们还会说明原因，您可以在 30天内修改站点，重新递交。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问：在我的站点中使用了框架(Frame)，它使站点的导览清晰、维护比较方便，但是我也知道很多搜索引擎不支持框架。请问有没有什么办法能提高框架站点对搜索引擎的支持呢？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;答：确实，框架对于站点的导览很有用，而且能增强站点的外观和功能性， 但是有很多搜索引擎不支持它。一般可以采取以下办法克服：&lt;/p&gt;
&lt;p&gt;在框架页的 &lt;code&gt;&amp;lt;noframes&amp;gt;…&amp;lt;/noframes&amp;gt;&lt;/code&gt; 部分中，加入能指向到所有其他页面的链接；
设定另外一个域名，并指向带框架的站点。换句话说，按照相同的关键词和描述等建一个新站点(当然不用框架)，并尽量符合搜索 引擎的各项要求，同时在这个无框架站点中要有链接连到框架站点。&lt;/p&gt;</content><category term="Tech"></category><category term="网络营销"></category><category term="搜索引擎"></category></entry><entry><title>未来五个热门的互联网方向</title><link href="https://vincentping.com/cn/five-hot-internet-business.html" rel="alternate"></link><published>1999-08-19T11:23:00+08:00</published><updated>2018-08-06T14:01:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,1999-08-19:/cn/five-hot-internet-business.html</id><summary type="html">&lt;p&gt;很多朋友都希望能在网上创立自己的事业，但如何选择自己的方向呢？下面是我的五条建议。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文发表在1999年8月19日《中国计算机报》。此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;很多朋友都希望能在网上创立自己的事业，但如何选择自己的方向呢？下面是我的五条建议。&lt;/p&gt;
&lt;h1&gt;软件&lt;/h1&gt;
&lt;p&gt;网上最有利可图的行当是销售自己的软件产品，目前是这样，未来相当一段时间仍会如此，通过销售自己的软件产品产生的百万富翁比任何一行都多。&lt;/p&gt;
&lt;p&gt;几乎所有的互联网用户都有一个特点———他们的计算机需要软件（除了那些极少数使用web tv和类似产品的用户外）。我知道的所有想在网上发展的人都会每年花不少钱来购买软件。&lt;/p&gt;
&lt;p&gt;软件非常容易传播，你可以免费在成千上万像&lt;a href="http://www.download.com" target="_blank"&gt;http://www.download.com&lt;/a&gt;这样的站点上提供免费试用版。当有人购买软件时，所需要做的也就是给他们一个注册码，大多数情况下根本无须实物的传递。正如我上面说到的，软件一直是而且会继续是网上机会最多的方向。但问题在于软件的制作本身，当然您也可以雇人设计或购买别人的版权。&lt;/p&gt;
&lt;p&gt;最有前途的软件方向应该是设计一些面向小企业和个人的互联网工具，这样可以避免与那些主要的软件商直接竞争，因为他们通常还照顾不到这一块。&lt;/p&gt;
&lt;h1&gt;订阅站点&lt;/h1&gt;
&lt;p&gt;如果您对互联网足够留意的话，您或许注意到了：现在涌现了越来越多的订阅站点。任何一个站点，有大量的音频、视频、特别报道、书籍、软件、每日更新的内容等等，就会是一个潜在的订阅站点。事实证明：人们愿意为他们所需要的专业信息付费。&lt;/p&gt;
&lt;p&gt;订阅站点与其他网上的经营方式相比，有如下一些优点：订阅站点的产品复制成本为零；订阅站点的产品可以自动化地传输；订阅站点能够提供即时的确认和产品传输。对于小型企业，上面的这些优点都非常重要。因为您能够完全自动地将产品即时发送到订户手上，而不需要花一分钱，也不需要花任何时间，甚至根本不需要您的考虑。&lt;/p&gt;
&lt;h1&gt;音频和视频的在线传播&lt;/h1&gt;
&lt;p&gt;随着互联网的急速膨胀、连接速度的提高，音像元素会变得越来越平常。可以预见，随着网络的发展，各种软件工具的普及，音像化会逐步成为网站的标准，网站内容将越来越丰富、有趣。&lt;/p&gt;
&lt;p&gt;目前，您可以使用realproducer和emblaze等在站点上提供音像内容。一旦对这些工具熟悉了，您也可以专门提供一种服务：为那些需要的公司将音像转换成网络上可以发行的格式。&lt;/p&gt;
&lt;p&gt;说到这里，大家可以看看下面这个站点&lt;a href="http://www.radiodestiny.com/" target="_blank"&gt;http://www.radiodestiny.com/&lt;/a&gt;，通过使用他们的软件，您甚至可以建一个自己的网上电台，无论是为了娱乐或赢利。&lt;/p&gt;
&lt;h1&gt;完整的网站服务&lt;/h1&gt;
&lt;p&gt;多数人都不大喜欢去学习新东西，尤其是新的技术，这是企业上网的最大障碍。最主要的原因之一就在于从上网、网站设计到站点的经营管理需要学习大量的新概念、新知识、新技术。&lt;/p&gt;
&lt;p&gt;通常人们不愿意买本书从头学起，他们希望有人帮他实现，帮他设计主页、推广、经营……他们需要一个完整的网站系列服务，其中包括：注册域名、设计网页、提供（或代理）主机，推广站点等等。&lt;/p&gt;
&lt;p&gt;这类服务已有很多公司在提供，这种面向企业的服务是目前互联网上很少的几个真正有效益的行当之一。&lt;/p&gt;
&lt;h1&gt;成为某个领域的网络中心&lt;/h1&gt;
&lt;p&gt;这种类型的网上企业可以在任何一个特定市场或兴趣点上建立，比如说：园艺、摩托车、木偶、宠物等等。要根据自己的兴趣爱好选定方向。&lt;/p&gt;
&lt;p&gt;这种经营的关键在于：成为任何一个对该领域感兴趣的人都必须去的地方，换句话说，要成为所经营的这类站点中的门户、起点。建一个链接表，列出所有这个领域有价值的站点；开放一个讨论组，让感兴趣的人参加；发行一份电子杂志，传递有用的信息给订户；搜集尽量多的文字、音像资料、软件等，放在站点中。然后，您可以加入访问者感兴趣的产品、服务，或加入合作计划。随着访问量的增加，您的收益也会增加！&lt;/p&gt;</content><category term="Tech"></category><category term="网络营销"></category><category term="互联网"></category></entry><entry><title>了解搜索引擎</title><link href="https://vincentping.com/cn/to-know-search-engines.html" rel="alternate"></link><published>1999-06-10T10:21:00+08:00</published><updated>2018-08-06T13:38:00+08:00</updated><author><name>Vincent Ping</name></author><id>tag:vincentping.com,1999-06-10:/cn/to-know-search-engines.html</id><summary type="html">&lt;p&gt;在所有网络推广的方法中，搜索引擎是大家谈论最多的，我们的推广之旅也将从这里开始。&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p style="background-color: #ccffcc;"&gt;本文发表在1999年6月10日《中国计算机报》，标题为《网站推广秘籍大放送》。此处保留原文，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在所有网络推广的方法中，搜索引擎是大家谈论最多的，我们的推广之旅也将从这里开始。 &lt;/p&gt;
&lt;p&gt;确实，搜索引擎是网络推广的一个非常强大的武器，而且免费——但是我们首先必须了解它们。 &lt;/p&gt;
&lt;h1&gt;1、两个最基本的词汇：&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;搜索引擎（searchengine）&lt;/strong&gt;：通过运行一个软件，该软件在网络上通过各种链接，自动获得大量站点页面的信息，并按照一定规则进行归类整理，从而形成数据库，以备查询。这样的站点（获得信息==&amp;gt;整理建立数据库==&amp;gt;提供查询）我们就称之为“搜索引擎”。而所使用的软件一般叫做“spider”、“crawlers”等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;分类目录（directory）&lt;/strong&gt;：通过“人工方式”将站点进行分类而建立数据库，以提供查询，这样的站点叫着“分类目录”。典型的搜索引擎如altavista、excite、hotbot、inktomi等，而最重要的分类目录就是yahoo。 &lt;/p&gt;
&lt;p&gt;实际上无论“搜索引擎”还是“分类目录”，目标都一样：获得网站资料，建立数据库提供查询。只不过使用的方法不同。 &lt;/p&gt;
&lt;p&gt;“搜索引擎”因为依靠软件自动进行，因此，其数据库的容量非常庞大，但是伴随着查询结果往往不够精确；而“分类目录”由于依靠人工分类，查询得到的信息要准确些，但收集的内容非常有限。 &lt;/p&gt;
&lt;p&gt;我们平时把这两类统称为“搜索引擎”，在下面的讨论中我们将以“自动”的搜索引擎为主，至于“人工”的如yahoo，我将会在“中文yahoo”中单独讨论。 &lt;/p&gt;
&lt;h1&gt;2、主要的搜索引擎：&lt;/h1&gt;
&lt;p&gt;七个最主要的搜索引擎及各自包括的页面数：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;搜索引擎&lt;/th&gt;
&lt;th&gt;页面数（百万页）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;altavista&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;northernlight&lt;/td&gt;
&lt;td&gt;125&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;inktomi&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;excite&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lycos&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;infoseek&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;webcrawler&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;（以上数据为1999年2月1日统计值） &lt;/p&gt;
&lt;h1&gt;3、搜索引擎工作的三步：&lt;/h1&gt;
&lt;p&gt;第一步是“spider”软件访问一个站点，并通过其中的链接阅读该站点的页面，而且“spider”会不时的自动回访该站点以检查变化情况；&lt;/p&gt;
&lt;p&gt;第二步，该“spider”获得的站点信息形成一个巨大的网络信息库，如同整个网络上已经访问站点的备份，当然记录的不是所有的内容。这也就是我们所说的数据库。&lt;/p&gt;
&lt;p&gt;第三步是查询服务。这是通过查询软件实现的，当你输入查询内容，该软件就会在其数据库中找到相关内容，然后按照“它的”规则进行排序。 &lt;/p&gt;
&lt;h1&gt;4、搜索引擎在查询时是如何排名的：&lt;/h1&gt;
&lt;p&gt;最主要是根据一个站点的内容与查询词的关联程度，但是一个站点的内容搜索引擎又是如何确定的呢？——标题（title）、关键词（keywords）、描述（description）、页面开始部分的内容以及这些内容本身之间的关联程度。而且现在绝大部分搜索引擎都支持metatag。 &lt;/p&gt;
&lt;p&gt;另一个主要因素是一个站点在整个网络上的关联程度，也就是说一个站点在网络中其他站点出现的次数（link popularity）。 &lt;/p&gt;
&lt;p&gt;虽然不同的搜索引擎有各自的“游戏规则”，但是请记住“关联程度”这个词，包括站内和站外的（整个网络）。&lt;/p&gt;</content><category term="Tech"></category><category term="网络营销"></category><category term="搜索引擎"></category></entry></feed>